Skip to content

Commit 1307c5d

Browse files
gsomlogregkh
authored andcommitted
serial: altera_uart: fix locking in polling mode
Since altera_uart_interrupt() may also be called from a poll timer in "serving_softirq" context, use spin_[lock_irqsave|unlock_irqrestore] variants, which are appropriate for both softirq and hardware interrupt contexts. Fixes: 2f8b9c1 ("altera_uart: Add support for polling mode (IRQ-less)") Signed-off-by: Gabriel Somlo <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 8be3a7b commit 1307c5d

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/tty/serial/altera_uart.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,17 @@ static irqreturn_t altera_uart_interrupt(int irq, void *data)
259259
{
260260
struct uart_port *port = data;
261261
struct altera_uart *pp = container_of(port, struct altera_uart, port);
262+
unsigned long flags;
262263
unsigned int isr;
263264

264265
isr = altera_uart_readl(port, ALTERA_UART_STATUS_REG) & pp->imr;
265266

266-
spin_lock(&port->lock);
267+
spin_lock_irqsave(&port->lock, flags);
267268
if (isr & ALTERA_UART_STATUS_RRDY_MSK)
268269
altera_uart_rx_chars(port);
269270
if (isr & ALTERA_UART_STATUS_TRDY_MSK)
270271
altera_uart_tx_chars(port);
271-
spin_unlock(&port->lock);
272+
spin_unlock_irqrestore(&port->lock, flags);
272273

273274
return IRQ_RETVAL(isr);
274275
}

0 commit comments

Comments
 (0)