PM / devfreq: bimc-bwmon: Use free_irq during governor suspend/stop
Use free_irq to free the interrupt handler for a shared interrupt. Enable_irqs are not refcounted, whereas disable_irqs are. Depth variable in irq_desc is actually disable-depth, for nested irq_disable() calls. It can have value from 0 to N. 0 is when interrupt is enabled and N shows the irq_disable depth. Lets say, if disable_irq is called 4 times, driver need to call enable_irq 4 times to actually enable the interrupt back. But if enable_irq is called 4 times, only one disable_irq needed to actually disable the interrupt. Use request/free_irq instead of disable/enable_irq. Change-Id: Ie7fe866b403da9bf363f741b1693361b8e2f6a3d Signed-off-by: Arun KS <arunks@codeaurora.org>
This commit is contained in:
parent
86978185b6
commit
cd77a0069f
1 changed files with 11 additions and 4 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -252,7 +252,6 @@ static void stop_bw_hwmon(struct bw_hwmon *hw)
|
|||
{
|
||||
struct bwmon *m = to_bwmon(hw);
|
||||
|
||||
disable_irq(m->irq);
|
||||
free_irq(m->irq, m);
|
||||
mon_disable(m);
|
||||
mon_irq_disable(m);
|
||||
|
@ -264,7 +263,7 @@ static int suspend_bw_hwmon(struct bw_hwmon *hw)
|
|||
{
|
||||
struct bwmon *m = to_bwmon(hw);
|
||||
|
||||
disable_irq(m->irq);
|
||||
free_irq(m->irq, m);
|
||||
mon_disable(m);
|
||||
mon_irq_disable(m);
|
||||
mon_irq_clear(m);
|
||||
|
@ -275,11 +274,19 @@ static int suspend_bw_hwmon(struct bw_hwmon *hw)
|
|||
static int resume_bw_hwmon(struct bw_hwmon *hw)
|
||||
{
|
||||
struct bwmon *m = to_bwmon(hw);
|
||||
int ret;
|
||||
|
||||
mon_clear(m);
|
||||
mon_irq_enable(m);
|
||||
mon_enable(m);
|
||||
enable_irq(m->irq);
|
||||
ret = request_threaded_irq(m->irq, NULL, bwmon_intr_handler,
|
||||
IRQF_ONESHOT | IRQF_SHARED,
|
||||
dev_name(m->dev), m);
|
||||
if (ret) {
|
||||
dev_err(m->dev, "Unable to register interrupt handler! (%d)\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue