* 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();
  * 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();
  * 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;
  * 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;
 
 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);
 
 
        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;
 
  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);