diff options
| -rw-r--r-- | drivers/tty/serial/msm_serial_hs.c | 14 |
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) |
