|
@@ -145,18 +145,30 @@ static int platform_suspend_prepare(suspend_state_t state)
|
|
|
}
|
|
|
|
|
|
static int platform_suspend_prepare_late(suspend_state_t state)
|
|
|
+{
|
|
|
+ return state == PM_SUSPEND_FREEZE && freeze_ops->prepare ?
|
|
|
+ freeze_ops->prepare() : 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int platform_suspend_prepare_noirq(suspend_state_t state)
|
|
|
{
|
|
|
return state != PM_SUSPEND_FREEZE && suspend_ops->prepare_late ?
|
|
|
suspend_ops->prepare_late() : 0;
|
|
|
}
|
|
|
|
|
|
-static void platform_suspend_wake(suspend_state_t state)
|
|
|
+static void platform_resume_noirq(suspend_state_t state)
|
|
|
{
|
|
|
if (state != PM_SUSPEND_FREEZE && suspend_ops->wake)
|
|
|
suspend_ops->wake();
|
|
|
}
|
|
|
|
|
|
-static void platform_suspend_finish(suspend_state_t state)
|
|
|
+static void platform_resume_early(suspend_state_t state)
|
|
|
+{
|
|
|
+ if (state == PM_SUSPEND_FREEZE && freeze_ops->restore)
|
|
|
+ freeze_ops->restore();
|
|
|
+}
|
|
|
+
|
|
|
+static void platform_resume_finish(suspend_state_t state)
|
|
|
{
|
|
|
if (state != PM_SUSPEND_FREEZE && suspend_ops->finish)
|
|
|
suspend_ops->finish();
|
|
@@ -172,7 +184,7 @@ static int platform_suspend_begin(suspend_state_t state)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void platform_suspend_end(suspend_state_t state)
|
|
|
+static void platform_resume_end(suspend_state_t state)
|
|
|
{
|
|
|
if (state == PM_SUSPEND_FREEZE && freeze_ops && freeze_ops->end)
|
|
|
freeze_ops->end();
|
|
@@ -180,7 +192,7 @@ static void platform_suspend_end(suspend_state_t state)
|
|
|
suspend_ops->end();
|
|
|
}
|
|
|
|
|
|
-static void platform_suspend_recover(suspend_state_t state)
|
|
|
+static void platform_recover(suspend_state_t state)
|
|
|
{
|
|
|
if (state != PM_SUSPEND_FREEZE && suspend_ops->recover)
|
|
|
suspend_ops->recover();
|
|
@@ -265,12 +277,21 @@ 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 = platform_suspend_prepare_late(state);
|
|
|
+ if (error)
|
|
|
+ goto Devices_early_resume;
|
|
|
+
|
|
|
+ error = dpm_suspend_noirq(PMSG_SUSPEND);
|
|
|
+ if (error) {
|
|
|
+ printk(KERN_ERR "PM: noirq suspend of devices failed\n");
|
|
|
+ goto Platform_early_resume;
|
|
|
+ }
|
|
|
+ error = platform_suspend_prepare_noirq(state);
|
|
|
if (error)
|
|
|
goto Platform_wake;
|
|
|
|
|
@@ -318,11 +339,17 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
|
|
|
enable_nonboot_cpus();
|
|
|
|
|
|
Platform_wake:
|
|
|
- platform_suspend_wake(state);
|
|
|
- dpm_resume_start(PMSG_RESUME);
|
|
|
+ platform_resume_noirq(state);
|
|
|
+ dpm_resume_noirq(PMSG_RESUME);
|
|
|
+
|
|
|
+ Platform_early_resume:
|
|
|
+ platform_resume_early(state);
|
|
|
+
|
|
|
+ Devices_early_resume:
|
|
|
+ dpm_resume_early(PMSG_RESUME);
|
|
|
|
|
|
Platform_finish:
|
|
|
- platform_suspend_finish(state);
|
|
|
+ platform_resume_finish(state);
|
|
|
return error;
|
|
|
}
|
|
|
|
|
@@ -366,11 +393,11 @@ int suspend_devices_and_enter(suspend_state_t state)
|
|
|
trace_suspend_resume(TPS("resume_console"), state, false);
|
|
|
|
|
|
Close:
|
|
|
- platform_suspend_end(state);
|
|
|
+ platform_resume_end(state);
|
|
|
return error;
|
|
|
|
|
|
Recover_platform:
|
|
|
- platform_suspend_recover(state);
|
|
|
+ platform_recover(state);
|
|
|
goto Resume_devices;
|
|
|
}
|
|
|
|