diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2006-01-04 20:19:06 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-01-04 20:19:06 +0100 |
commit | 45e24601921fc1c4ca7932f7f7a475d3ad64ecad (patch) | |
tree | 21b64ad15abe3b051a0462096ee2474212274e20 /drivers/serial | |
parent | [SERIAL] Use uart_match_port() to find a matching port in find_port() (diff) | |
download | linux-45e24601921fc1c4ca7932f7f7a475d3ad64ecad.tar.xz linux-45e24601921fc1c4ca7932f7f7a475d3ad64ecad.zip |
[SERIAL] Move interrupt-time spinlocking inside serial8250_handle_port()
All call sites for serial8250_handle_port() acquired the port spinlock
and released it afterwards. This is a needless duplication of code.
Move the spinlocking inside serial8250_handle_port().
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/8250.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index ad20d2dd85d7..56dcfd93bdc4 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -1281,7 +1281,11 @@ static unsigned int check_modem_status(struct uart_8250_port *up) static inline void serial8250_handle_port(struct uart_8250_port *up, struct pt_regs *regs) { - unsigned int status = serial_inp(up, UART_LSR); + unsigned int status; + + spin_lock(&up->port.lock); + + status = serial_inp(up, UART_LSR); DEBUG_INTR("status = %x...", status); @@ -1290,6 +1294,8 @@ serial8250_handle_port(struct uart_8250_port *up, struct pt_regs *regs) check_modem_status(up); if (status & UART_LSR_THRE) transmit_chars(up); + + spin_unlock(&up->port.lock); } /* @@ -1325,9 +1331,7 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id, struct pt_regs *r iir = serial_in(up, UART_IIR); if (!(iir & UART_IIR_NO_INT)) { - spin_lock(&up->port.lock); serial8250_handle_port(up, regs); - spin_unlock(&up->port.lock); handled = 1; @@ -1426,11 +1430,8 @@ static void serial8250_timeout(unsigned long data) unsigned int iir; iir = serial_in(up, UART_IIR); - if (!(iir & UART_IIR_NO_INT)) { - spin_lock(&up->port.lock); + if (!(iir & UART_IIR_NO_INT)) serial8250_handle_port(up, NULL); - spin_unlock(&up->port.lock); - } timeout = up->port.timeout; timeout = timeout > 6 ? (timeout / 2 - 2) : 1; |