Commit 3612b27c authored by Charles Keepax's avatar Charles Keepax Committed by Lee Jones

mfd: arizona: Use suspend_noirq inplace of suspend_late

As runtime PM doesn't function whilst processing system suspend/resume
operations and the Arizona IRQ handlers need runtime PM to function
we must disable IRQs during these operations. Whilst this is
already done in the driver we are using suspend/suspend_late and
resume/resume_noirq to do so which has two problems. Firstly, as
suspend_late is before suspend_noirq that means we still have a
small window where an IRQ can cause issues.  Secondly, if another
suspend_late handler fails after ours has run then (as resume_noirq
will not run) we will make unbalanced calls to enable_irq.

This is all simply fixed by using the suspend_noirq callback rather
than suspend_late. Whilst we are doing this tidy the code up a little,
and use the appropriate helper macros.
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 7235711a
...@@ -750,7 +750,7 @@ static int arizona_suspend(struct device *dev) ...@@ -750,7 +750,7 @@ static int arizona_suspend(struct device *dev)
return 0; return 0;
} }
static int arizona_suspend_late(struct device *dev) static int arizona_suspend_noirq(struct device *dev)
{ {
struct arizona *arizona = dev_get_drvdata(dev); struct arizona *arizona = dev_get_drvdata(dev);
...@@ -774,7 +774,7 @@ static int arizona_resume(struct device *dev) ...@@ -774,7 +774,7 @@ static int arizona_resume(struct device *dev)
{ {
struct arizona *arizona = dev_get_drvdata(dev); struct arizona *arizona = dev_get_drvdata(dev);
dev_dbg(arizona->dev, "Late resume, reenabling IRQ\n"); dev_dbg(arizona->dev, "Resume, reenabling IRQ\n");
enable_irq(arizona->irq); enable_irq(arizona->irq);
return 0; return 0;
...@@ -786,10 +786,8 @@ const struct dev_pm_ops arizona_pm_ops = { ...@@ -786,10 +786,8 @@ const struct dev_pm_ops arizona_pm_ops = {
arizona_runtime_resume, arizona_runtime_resume,
NULL) NULL)
SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume) SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume)
#ifdef CONFIG_PM_SLEEP SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(arizona_suspend_noirq,
.suspend_late = arizona_suspend_late, arizona_resume_noirq)
.resume_noirq = arizona_resume_noirq,
#endif
}; };
EXPORT_SYMBOL_GPL(arizona_pm_ops); EXPORT_SYMBOL_GPL(arizona_pm_ops);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment