summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/tty/serial/msm_serial_hs.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c
index fd191761bfa1..abf5bf8978d3 100644
--- a/drivers/tty/serial/msm_serial_hs.c
+++ b/drivers/tty/serial/msm_serial_hs.c
@@ -2272,10 +2272,18 @@ void enable_wakeup_interrupt(struct msm_hs_port *msm_uport)
if (!(msm_uport->wakeup.enabled)) {
spin_lock_irqsave(&uport->lock, flags);
msm_uport->wakeup.ignore = 1;
- msm_uport->wakeup.enabled = true;
+ /* Keep this disabled for 1 msec */
+ msm_uport->wakeup.enabled = false;
spin_unlock_irqrestore(&uport->lock, flags);
disable_irq(uport->irq);
enable_irq(msm_uport->wakeup.irq);
+
+ /* Add delay before enabling wakeup irq */
+ udelay(1000);
+ spin_lock_irqsave(&uport->lock, flags);
+ if (msm_uport->wakeup.ignore == 1)
+ msm_uport->wakeup.enabled = true;
+ spin_unlock_irqrestore(&uport->lock, flags);
} else {
MSM_HS_WARN("%s:Wake up IRQ already enabled", __func__);
}
@@ -2462,6 +2470,10 @@ static irqreturn_t msm_hs_wakeup_isr(int irq, void *dev)
struct uart_port *uport = &msm_uport->uport;
struct tty_struct *tty = NULL;
+ /* Do not serve ISR if this flag is false */
+ if (!msm_uport->wakeup.enabled)
+ return IRQ_HANDLED;
+
spin_lock_irqsave(&uport->lock, flags);
if (msm_uport->wakeup.ignore)