aboutsummaryrefslogtreecommitdiff
path: root/drivers/serial
diff options
context:
space:
mode:
authorDick Hollenbeck <dick@softplc.com>2009-09-02 17:07:29 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-09-02 17:22:44 +0100
commitc47a830c08a26a7c210ae16a0ffe3f56ba86ea69 (patch)
tree2ee4d96aa3a8ca83125ddca0dcad4aea40448eb1 /drivers/serial
parent13f96d8f4c5a3f6a6b5e578d08869d79d690e0b2 (diff)
ARM: 5688/1: ks8695_serial: disable_irq() lockup
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>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/serial_ks8695.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/serial/serial_ks8695.c b/drivers/serial/serial_ks8695.c
index e0665630e4d..52db5cc3f90 100644
--- a/drivers/serial/serial_ks8695.c
+++ b/drivers/serial/serial_ks8695.c
@@ -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);
}
}