summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/serial/driver4
-rw-r--r--drivers/serial/21285.c4
-rw-r--r--drivers/serial/8250.c3
-rw-r--r--drivers/serial/amba.c3
-rw-r--r--drivers/serial/anakin.c4
-rw-r--r--drivers/serial/core.c4
-rw-r--r--drivers/serial/sa1100.c3
7 files changed, 5 insertions, 20 deletions
diff --git a/Documentation/serial/driver b/Documentation/serial/driver
index 637c89effb5b..6e06d1d4995a 100644
--- a/Documentation/serial/driver
+++ b/Documentation/serial/driver
@@ -138,8 +138,8 @@ hardware.
Stop receiving characters; the port is in the process of
being closed.
- Locking: none.
- Interrupts: caller dependent.
+ Locking: port->lock taken.
+ Interrupts: locally disabled.
This call must not sleep
enable_ms(port)
diff --git a/drivers/serial/21285.c b/drivers/serial/21285.c
index cc0b6ef0f1d1..f8a5a012c990 100644
--- a/drivers/serial/21285.c
+++ b/drivers/serial/21285.c
@@ -85,14 +85,10 @@ serial21285_start_tx(struct uart_port *port, unsigned int tty_start)
static void serial21285_stop_rx(struct uart_port *port)
{
- unsigned long flags;
-
- spin_lock_irqsave(&port->lock, flags);
if (rx_enabled(port)) {
disable_irq(IRQ_CONRX);
rx_enabled(port) = 0;
}
- spin_unlock_irqrestore(&port->lock, flags);
}
static void serial21285_enable_ms(struct uart_port *port)
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 8a3f86d45abc..83a16437a593 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -724,13 +724,10 @@ static void serial8250_start_tx(struct uart_port *port, unsigned int tty_start)
static void serial8250_stop_rx(struct uart_port *port)
{
struct uart_8250_port *up = (struct uart_8250_port *)port;
- unsigned long flags;
- spin_lock_irqsave(&up->port.lock, flags);
up->ier &= ~UART_IER_RLSI;
up->port.read_status_mask &= ~UART_LSR_DR;
serial_out(up, UART_IER, up->ier);
- spin_unlock_irqrestore(&up->port.lock, flags);
}
static void serial8250_enable_ms(struct uart_port *port)
diff --git a/drivers/serial/amba.c b/drivers/serial/amba.c
index b350a5598663..fc4d964e55ef 100644
--- a/drivers/serial/amba.c
+++ b/drivers/serial/amba.c
@@ -138,14 +138,11 @@ static void ambauart_start_tx(struct uart_port *port, unsigned int tty_start)
static void ambauart_stop_rx(struct uart_port *port)
{
- unsigned long flags;
unsigned int cr;
- spin_lock_irqsave(&port->lock, flags);
cr = UART_GET_CR(port);
cr &= ~(AMBA_UARTCR_RIE | AMBA_UARTCR_RTIE);
UART_PUT_CR(port, cr);
- spin_unlock_irqrestore(&port->lock, flags);
}
static void ambauart_enable_ms(struct uart_port *port)
diff --git a/drivers/serial/anakin.c b/drivers/serial/anakin.c
index dcb19b6630c9..040d6f47f391 100644
--- a/drivers/serial/anakin.c
+++ b/drivers/serial/anakin.c
@@ -119,13 +119,9 @@ anakin_start_tx(struct uart_port *port, unsigned int tty_start)
static void
anakin_stop_rx(struct uart_port *port)
{
- unsigned long flags;
-
- spin_lock_irqsave(&port->lock, flags);
while (anakin_in(port, 0x10) & RXRELEASE)
anakin_in(port, 0x14);
anakin_out(port, 0x18, anakin_in(port, 0x18) | BLOCKRX);
- spin_unlock_irqrestore(&port->lock, flags);
}
static void
diff --git a/drivers/serial/core.c b/drivers/serial/core.c
index b5910ea9d868..7fe15c45de4b 100644
--- a/drivers/serial/core.c
+++ b/drivers/serial/core.c
@@ -1200,7 +1200,9 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
* disable the receive line status interrupts.
*/
if (info->flags & UIF_INITIALIZED) {
+ spin_lock_irqsave(&port->lock, flags);
port->ops->stop_rx(port);
+ spin_unlock_irqrestore(&port->lock, flags);
/*
* Before we drop DTR, make sure the UART transmitter
* has completely drained; this is especially
@@ -1948,8 +1950,8 @@ static int uart_pm_set_state(struct uart_state *state, int pm_state, int oldstat
spin_lock_irq(&port->lock);
ops->stop_tx(port, 0);
ops->set_mctrl(port, 0);
- spin_unlock_irq(&port->lock);
ops->stop_rx(port);
+ spin_unlock_irq(&port->lock);
ops->shutdown(port);
}
if (ops->pm)
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
index aced0fa1b70b..0549a5fe4cd8 100644
--- a/drivers/serial/sa1100.c
+++ b/drivers/serial/sa1100.c
@@ -190,13 +190,10 @@ static void sa1100_start_tx(struct uart_port *port, unsigned int tty_start)
static void sa1100_stop_rx(struct uart_port *port)
{
struct sa1100_port *sport = (struct sa1100_port *)port;
- unsigned long flags;
u32 utcr3;
- spin_lock_irqsave(&sport->port.lock, flags);
utcr3 = UART_GET_UTCR3(sport);
UART_PUT_UTCR3(sport, utcr3 & ~UTCR3_RIE);
- spin_unlock_irqrestore(&sport->port.lock, flags);
}
/*