PM / sleep: Export dpm_suspend_late/noirq() and dpm_resume_early/noirq()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 30 Sep 2014 00:21:34 +0000 (02:21 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 30 Sep 2014 19:05:59 +0000 (21:05 +0200)
Subsequent change sets will add platform-related operations between
dpm_suspend_late() and dpm_suspend_noirq() as well as between
dpm_resume_noirq() and dpm_resume_early() in suspend_enter(), so
export these functions for suspend_enter() to be able to call them
separately and split the invocations of dpm_suspend_end() and
dpm_resume_start() in there accordingly.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/main.c
include/linux/pm.h
kernel/power/suspend.c

index b67d9aef9fe431d58ad2da42e7a7328c87208aa4..44973196d3fd76d1b3a4b91bc728cf6cf87c2653 100644 (file)
@@ -540,7 +540,7 @@ static void async_resume_noirq(void *data, async_cookie_t cookie)
  * Call the "noirq" resume handlers for all devices in dpm_noirq_list and
  * enable device drivers to receive interrupts.
  */
-static void dpm_resume_noirq(pm_message_t state)
+void dpm_resume_noirq(pm_message_t state)
 {
        struct device *dev;
        ktime_t starttime = ktime_get();
@@ -662,7 +662,7 @@ static void async_resume_early(void *data, async_cookie_t cookie)
  * dpm_resume_early - Execute "early resume" callbacks for all devices.
  * @state: PM transition of the system being carried out.
  */
-static void dpm_resume_early(pm_message_t state)
+void dpm_resume_early(pm_message_t state)
 {
        struct device *dev;
        ktime_t starttime = ktime_get();
@@ -1093,7 +1093,7 @@ static int device_suspend_noirq(struct device *dev)
  * Prevent device drivers from receiving interrupts and call the "noirq" suspend
  * handlers for all non-sysdev devices.
  */
-static int dpm_suspend_noirq(pm_message_t state)
+int dpm_suspend_noirq(pm_message_t state)
 {
        ktime_t starttime = ktime_get();
        int error = 0;
@@ -1232,7 +1232,7 @@ static int device_suspend_late(struct device *dev)
  * dpm_suspend_late - Execute "late suspend" callbacks for all devices.
  * @state: PM transition of the system being carried out.
  */
-static int dpm_suspend_late(pm_message_t state)
+int dpm_suspend_late(pm_message_t state)
 {
        ktime_t starttime = ktime_get();
        int error = 0;
index 72c0fe098a27871aa1ea44ea0076d45ab696ea2e..e1c00b7ee91305aa30eca198a4350247f9e34030 100644 (file)
@@ -679,12 +679,16 @@ struct dev_pm_domain {
 extern void device_pm_lock(void);
 extern void dpm_resume_start(pm_message_t state);
 extern void dpm_resume_end(pm_message_t state);
+extern void dpm_resume_noirq(pm_message_t state);
+extern void dpm_resume_early(pm_message_t state);
 extern void dpm_resume(pm_message_t state);
 extern void dpm_complete(pm_message_t state);
 
 extern void device_pm_unlock(void);
 extern int dpm_suspend_end(pm_message_t state);
 extern int dpm_suspend_start(pm_message_t state);
+extern int dpm_suspend_noirq(pm_message_t state);
+extern int dpm_suspend_late(pm_message_t state);
 extern int dpm_suspend(pm_message_t state);
 extern int dpm_prepare(pm_message_t state);
 
index e837dd6783c629c0645a81efa324d211c96b34c8..58ae98b7dc2b911582e9de8804900cfa240f9f0f 100644 (file)
@@ -265,11 +265,16 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
        if (error)
                goto Platform_finish;
 
-       error = dpm_suspend_end(PMSG_SUSPEND);
+       error = dpm_suspend_late(PMSG_SUSPEND);
        if (error) {
-               printk(KERN_ERR "PM: Some devices failed to power down\n");
+               printk(KERN_ERR "PM: late suspend of devices failed\n");
                goto Platform_finish;
        }
+       error = dpm_suspend_noirq(PMSG_SUSPEND);
+       if (error) {
+               printk(KERN_ERR "PM: noirq suspend of devices failed\n");
+               goto Devices_early_resume;
+       }
        error = platform_suspend_prepare_late(state);
        if (error)
                goto Platform_wake;
@@ -319,7 +324,10 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
 
  Platform_wake:
        platform_suspend_wake(state);
-       dpm_resume_start(PMSG_RESUME);
+       dpm_resume_noirq(PMSG_RESUME);
+
+ Devices_early_resume:
+       dpm_resume_early(PMSG_RESUME);
 
  Platform_finish:
        platform_suspend_finish(state);