ARM: 5688/1: ks8695_serial: disable_irq() lockup
authorDick Hollenbeck <dick@softplc.com>
Wed, 2 Sep 2009 16:07:29 +0000 (17:07 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 2 Sep 2009 16:22:44 +0000 (17:22 +0100)
disable_irq() cannot be called from interrupt context without self imposed deadlock. This was happening in ks8695uart_stop_tx().

Signed-off-by: Dick Hollenbeck <dick@softplc.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/serial/serial_ks8695.c

index e0665630e4dada82de5e3e816beaf0cb2c637b7c..52db5cc3f9005e2fb8ecf5e0c1ee7929f6ad1ac7 100644 (file)
@@ -110,7 +110,11 @@ static struct console ks8695_console;
 static void ks8695uart_stop_tx(struct uart_port *port)
 {
        if (tx_enabled(port)) {
-               disable_irq(KS8695_IRQ_UART_TX);
+               /* use disable_irq_nosync() and not disable_irq() to avoid self
+                * imposed deadlock by not waiting for irq handler to end,
+                * since this ks8695uart_stop_tx() is called from interrupt context.
+                */
+               disable_irq_nosync(KS8695_IRQ_UART_TX);
                tx_enable(port, 0);
        }
 }