|
@@ -112,24 +112,12 @@ static inline void platform_finish(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void finish(void)
|
|
|
-{
|
|
|
- device_resume();
|
|
|
- platform_finish();
|
|
|
- thaw_processes();
|
|
|
- enable_nonboot_cpus();
|
|
|
- pm_restore_console();
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
static int prepare_processes(void)
|
|
|
{
|
|
|
int error;
|
|
|
|
|
|
pm_prepare_console();
|
|
|
-
|
|
|
sys_sync();
|
|
|
-
|
|
|
disable_nonboot_cpus();
|
|
|
|
|
|
if (freeze_processes()) {
|
|
@@ -162,15 +150,6 @@ static void unprepare_processes(void)
|
|
|
pm_restore_console();
|
|
|
}
|
|
|
|
|
|
-static int prepare_devices(void)
|
|
|
-{
|
|
|
- int error;
|
|
|
-
|
|
|
- if ((error = device_suspend(PMSG_FREEZE)))
|
|
|
- printk("Some devices failed to suspend\n");
|
|
|
- return error;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* pm_suspend_disk - The granpappy of power management.
|
|
|
*
|
|
@@ -187,17 +166,14 @@ int pm_suspend_disk(void)
|
|
|
error = prepare_processes();
|
|
|
if (error)
|
|
|
return error;
|
|
|
- error = prepare_devices();
|
|
|
|
|
|
+ error = device_suspend(PMSG_FREEZE);
|
|
|
if (error) {
|
|
|
+ printk("Some devices failed to suspend\n");
|
|
|
unprepare_processes();
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
- pr_debug("PM: Attempting to suspend to disk.\n");
|
|
|
- if (pm_disk_mode == PM_DISK_FIRMWARE)
|
|
|
- return pm_ops->enter(PM_SUSPEND_DISK);
|
|
|
-
|
|
|
pr_debug("PM: snapshotting memory.\n");
|
|
|
in_suspend = 1;
|
|
|
if ((error = swsusp_suspend()))
|
|
@@ -208,11 +184,20 @@ int pm_suspend_disk(void)
|
|
|
error = swsusp_write();
|
|
|
if (!error)
|
|
|
power_down(pm_disk_mode);
|
|
|
+ else {
|
|
|
+ /* swsusp_write can not fail in device_resume,
|
|
|
+ no need to do second device_resume */
|
|
|
+ swsusp_free();
|
|
|
+ unprepare_processes();
|
|
|
+ return error;
|
|
|
+ }
|
|
|
} else
|
|
|
pr_debug("PM: Image restored successfully.\n");
|
|
|
+
|
|
|
swsusp_free();
|
|
|
Done:
|
|
|
- finish();
|
|
|
+ device_resume();
|
|
|
+ unprepare_processes();
|
|
|
return error;
|
|
|
}
|
|
|
|
|
@@ -274,15 +259,17 @@ static int software_resume(void)
|
|
|
|
|
|
pr_debug("PM: Preparing devices for restore.\n");
|
|
|
|
|
|
- if ((error = prepare_devices()))
|
|
|
+ if ((error = device_suspend(PMSG_FREEZE))) {
|
|
|
+ printk("Some devices failed to suspend\n");
|
|
|
goto Free;
|
|
|
+ }
|
|
|
|
|
|
mb();
|
|
|
|
|
|
pr_debug("PM: Restoring saved image.\n");
|
|
|
swsusp_resume();
|
|
|
pr_debug("PM: Restore failed, recovering.n");
|
|
|
- finish();
|
|
|
+ device_resume();
|
|
|
Free:
|
|
|
swsusp_free();
|
|
|
Cleanup:
|