PM: runtime: Extend support for wakeirq for force_suspend|resume
authorUlf Hansson <ulf.hansson@linaro.org>
Wed, 8 Jun 2022 15:31:20 +0000 (17:31 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 8 Jul 2022 19:29:06 +0000 (21:29 +0200)
A driver that makes use of pm_runtime_force_suspend|resume() to support
system suspend/resume, currently needs to manage the wakeirq support
itself. To avoid the boilerplate code in the driver's system suspend/resume
callbacks in particular, let's extend pm_runtime_force_suspend|resume() to
deal with the wakeirq.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/runtime.c

index 949907e..997be3a 100644 (file)
@@ -1862,10 +1862,13 @@ int pm_runtime_force_suspend(struct device *dev)
 
        callback = RPM_GET_CALLBACK(dev, runtime_suspend);
 
+       dev_pm_enable_wake_irq_check(dev, true);
        ret = callback ? callback(dev) : 0;
        if (ret)
                goto err;
 
+       dev_pm_enable_wake_irq_complete(dev);
+
        /*
         * If the device can stay in suspend after the system-wide transition
         * to the working state that will follow, drop the children counter of
@@ -1882,6 +1885,7 @@ int pm_runtime_force_suspend(struct device *dev)
        return 0;
 
 err:
+       dev_pm_disable_wake_irq_check(dev, true);
        pm_runtime_enable(dev);
        return ret;
 }
@@ -1915,9 +1919,11 @@ int pm_runtime_force_resume(struct device *dev)
 
        callback = RPM_GET_CALLBACK(dev, runtime_resume);
 
+       dev_pm_disable_wake_irq_check(dev, false);
        ret = callback ? callback(dev) : 0;
        if (ret) {
                pm_runtime_set_suspended(dev);
+               dev_pm_enable_wake_irq_check(dev, false);
                goto out;
        }