mfd: arizona: Use suspend_noirq inplace of suspend_late
Subsystems (2)
PATCH 1/1 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.
--- drivers/mfd/arizona-core.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/mfd/arizona-core.c +4 -6
@@ -735,7 +735,7 @@ static int arizona_suspend(struct device *dev)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);
@@ -759,7 +759,7 @@ static int arizona_resume(struct device *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);return 0 ;
@@ -771,10 +771,8 @@ const struct dev_pm_ops arizona_pm_ops = { arizona_runtime_resume, NULL) SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume) -#ifdef CONFIG_PM_SLEEP - .suspend_late = arizona_suspend_late, - .resume_noirq = arizona_resume_noirq, -#endif + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(arizona_suspend_noirq, + arizona_resume_noirq) };EXPORT_SYMBOL_GPL (arizona_pm_ops);
Signature · 1 line
2.1.4
Lee Jones
AppliedQuoted 10 lines · Charles Keepax
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_lateis beforesuspend_noirqthat means we still have a small window where an IRQ can cause issues. Secondly, if anothersuspend_latehandler fails after ours has run then (asresume_noirqwill not run) we will make unbalanced calls toenable_irq.
Quoted 8 lines
This is all simply fixed by using the
suspend_noirqcallback rather thansuspend_late. Whilst we are doing this tidy the code up a little, and use the appropriate helper macros.Signed-off-by Charles Keepax <[email protected]>--- drivers/mfd/arizona-core.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
Applied, thanks.
Quoted 35 lines
drivers/mfd/arizona-core.c +4
-6@@ -735,7 +735,7 @@ static int arizona_suspend(struct device *dev)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);@@ -759,7 +759,7 @@ static int arizona_resume(struct device *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);return 0 ;@@ -771,10 +771,8 @@ const struct dev_pm_ops arizona_pm_ops = { arizona_runtime_resume, NULL) SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume) -#ifdef CONFIG_PM_SLEEP - .suspend_late = arizona_suspend_late, - .resume_noirq = arizona_resume_noirq, -#endif + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(arizona_suspend_noirq, + arizona_resume_noirq) };EXPORT_SYMBOL_GPL (arizona_pm_ops);
Signature · 4 lines
Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog