diff options
| author | Bulbul Dabi <bdabi@codeaurora.org> | 2017-10-07 23:53:49 +0530 |
|---|---|---|
| committer | Michael Bestas <mkbestas@lineageos.org> | 2019-12-23 23:43:34 +0200 |
| commit | c5afd1e79e809d9feea7318bab97f1cc3896b7bb (patch) | |
| tree | e68dae9985614e654ae70c54cf7f5eddb31d03c1 | |
| parent | 17af297b4afccee935656851714b4b63369ae303 (diff) | |
serial: msm_serial_hs: Protect spurious irqs after wakeup irq enablement
This patch protects against unknown spurious signals generated on Rx
line.
The possible sources of spurious signals are unknown as of now.
Yes, 1 msec delay after enabling wakeup interrupt to suppress false call
to ISR handlers which we do not expect.
In case of shutdown, we do not expect wake up irq to get fired as irq
gets disabled in the start.
Change-Id: I3cb34e5c39bff715cad1618c2eeefbf9bc95c87c
Signed-off-by: Mukesh Kumar Savaliya <msavaliy@codeaurora.org>
| -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) |
