summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBulbul Dabi <bdabi@codeaurora.org>2017-10-07 23:53:49 +0530
committerMichael Bestas <mkbestas@lineageos.org>2019-12-23 23:43:34 +0200
commitc5afd1e79e809d9feea7318bab97f1cc3896b7bb (patch)
treee68dae9985614e654ae70c54cf7f5eddb31d03c1
parent17af297b4afccee935656851714b4b63369ae303 (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.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)