summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHanumath Prasad <hpprasad@codeaurora.org>2015-07-07 17:48:58 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2015-07-28 02:15:48 -0700
commitbb30045a606e371c2538b337e4ce5f2249562986 (patch)
treeded08182b7e0770f1fe72f6d796a655d022ca52d
parent237e938665b1a8f70f52d42a313673b2da794e83 (diff)
downloadqcom-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.c12
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;
}