diff options
author | Hanumath Prasad <hpprasad@codeaurora.org> | 2015-07-07 17:48:58 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-07-28 02:15:48 -0700 |
commit | bb30045a606e371c2538b337e4ce5f2249562986 (patch) | |
tree | ded08182b7e0770f1fe72f6d796a655d022ca52d | |
parent | 237e938665b1a8f70f52d42a313673b2da794e83 (diff) | |
download | qcom-bb30045a606e371c2538b337e4ce5f2249562986.tar.gz |
PM / devfreq: bimc-bwmon: Update irq handling in suspend/resume
Change the sequence of registering and freeing the interrupt
handler in suspend/resume. Freeirq needs a guarantee that the
IRQ can't come anymore before we call it. So, we disable the IRQ
before calling freeirq.And register the handler before enabling
the irq to avoid the interrupt getting unhandled.
Change-Id: I3945202d049e16f64a16e456f914f7602b763c89
Signed-off-by: Hanumath Prasad <hpprasad@codeaurora.org>
Signed-off-by: Sridhar Gujje <sgujje@codeaurora.org>
-rw-r--r-- | drivers/devfreq/bimc-bwmon.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/devfreq/bimc-bwmon.c b/drivers/devfreq/bimc-bwmon.c index de01fc24a0c..8f0fe2cfe66 100644 --- a/drivers/devfreq/bimc-bwmon.c +++ b/drivers/devfreq/bimc-bwmon.c @@ -66,6 +66,7 @@ static void mon_enable(struct bwmon *m) static void mon_disable(struct bwmon *m) { writel_relaxed(0x0, MON_EN(m)); + mb(); } static void mon_clear(struct bwmon *m) @@ -86,6 +87,7 @@ static void mon_irq_enable(struct bwmon *m) val = readl_relaxed(MON_INT_EN(m)); val |= 0x1; writel_relaxed(val, MON_INT_EN(m)); + mb(); } static void mon_irq_disable(struct bwmon *m) @@ -101,6 +103,7 @@ static void mon_irq_disable(struct bwmon *m) val = readl_relaxed(MON_INT_EN(m)); val &= ~0x1; writel_relaxed(val, MON_INT_EN(m)); + mb(); } static unsigned int mon_irq_status(struct bwmon *m) @@ -252,9 +255,9 @@ static void stop_bw_hwmon(struct bw_hwmon *hw) { struct bwmon *m = to_bwmon(hw); + mon_irq_disable(m); free_irq(m->irq, m); mon_disable(m); - mon_irq_disable(m); mon_clear(m); mon_irq_clear(m); } @@ -263,9 +266,9 @@ static int suspend_bw_hwmon(struct bw_hwmon *hw) { struct bwmon *m = to_bwmon(hw); + mon_irq_disable(m); free_irq(m->irq, m); mon_disable(m); - mon_irq_disable(m); mon_irq_clear(m); return 0; @@ -277,8 +280,6 @@ static int resume_bw_hwmon(struct bw_hwmon *hw) int ret; mon_clear(m); - mon_irq_enable(m); - mon_enable(m); ret = request_threaded_irq(m->irq, NULL, bwmon_intr_handler, IRQF_ONESHOT | IRQF_SHARED, dev_name(m->dev), m); @@ -288,6 +289,9 @@ static int resume_bw_hwmon(struct bw_hwmon *hw) return ret; } + mon_irq_enable(m); + mon_enable(m); + return 0; } |