ARM: PL011: Ensure IRQs are disabled in UART interrupt handler
authorRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 22 Dec 2010 17:16:09 +0000 (17:16 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 5 Jan 2011 16:58:47 +0000 (16:58 +0000)
As the DMA support introduces a separate interrupt-time callback, our
interrupt handler will not be the only handler which takes the port
lock, so we need to ensure that IRQs are disabled.  We must use the
_irqsave variant so we don't inadvertently enable interrupts.

Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/serial/amba-pl011.c

index f9b6b8213e77dde177917f8c505771ef028e885e..f741a8b51400a4da9bf88d0c9da666ed813b9761 100644 (file)
@@ -247,10 +247,11 @@ static void pl011_modem_status(struct uart_amba_port *uap)
 static irqreturn_t pl011_int(int irq, void *dev_id)
 {
        struct uart_amba_port *uap = dev_id;
+       unsigned long flags;
        unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
        int handled = 0;
 
-       spin_lock(&uap->port.lock);
+       spin_lock_irqsave(&uap->port.lock, flags);
 
        status = readw(uap->port.membase + UART011_MIS);
        if (status) {
@@ -275,7 +276,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
                handled = 1;
        }
 
-       spin_unlock(&uap->port.lock);
+       spin_unlock_irqrestore(&uap->port.lock, flags);
 
        return IRQ_RETVAL(handled);
 }