|
@@ -54,8 +54,8 @@ static struct platform_hibernation_ops *hibernation_ops;
|
|
|
|
|
|
void hibernation_set_ops(struct platform_hibernation_ops *ops)
|
|
void hibernation_set_ops(struct platform_hibernation_ops *ops)
|
|
{
|
|
{
|
|
- if (ops && !(ops->start && ops->pre_snapshot && ops->finish
|
|
|
|
- && ops->prepare && ops->enter && ops->pre_restore
|
|
|
|
|
|
+ if (ops && !(ops->begin && ops->end && ops->pre_snapshot
|
|
|
|
+ && ops->prepare && ops->finish && ops->enter && ops->pre_restore
|
|
&& ops->restore_cleanup)) {
|
|
&& ops->restore_cleanup)) {
|
|
WARN_ON(1);
|
|
WARN_ON(1);
|
|
return;
|
|
return;
|
|
@@ -100,14 +100,25 @@ static int hibernation_test(int level) { return 0; }
|
|
#endif /* !CONFIG_PM_DEBUG */
|
|
#endif /* !CONFIG_PM_DEBUG */
|
|
|
|
|
|
/**
|
|
/**
|
|
- * platform_start - tell the platform driver that we're starting
|
|
|
|
|
|
+ * platform_begin - tell the platform driver that we're starting
|
|
* hibernation
|
|
* hibernation
|
|
*/
|
|
*/
|
|
|
|
|
|
-static int platform_start(int platform_mode)
|
|
|
|
|
|
+static int platform_begin(int platform_mode)
|
|
{
|
|
{
|
|
return (platform_mode && hibernation_ops) ?
|
|
return (platform_mode && hibernation_ops) ?
|
|
- hibernation_ops->start() : 0;
|
|
|
|
|
|
+ hibernation_ops->begin() : 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * platform_end - tell the platform driver that we've entered the
|
|
|
|
+ * working state
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+static void platform_end(int platform_mode)
|
|
|
|
+{
|
|
|
|
+ if (platform_mode && hibernation_ops)
|
|
|
|
+ hibernation_ops->end();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -237,9 +248,9 @@ int hibernation_snapshot(int platform_mode)
|
|
if (error)
|
|
if (error)
|
|
return error;
|
|
return error;
|
|
|
|
|
|
- error = platform_start(platform_mode);
|
|
|
|
|
|
+ error = platform_begin(platform_mode);
|
|
if (error)
|
|
if (error)
|
|
- return error;
|
|
|
|
|
|
+ goto Close;
|
|
|
|
|
|
suspend_console();
|
|
suspend_console();
|
|
error = device_suspend(PMSG_FREEZE);
|
|
error = device_suspend(PMSG_FREEZE);
|
|
@@ -272,6 +283,8 @@ int hibernation_snapshot(int platform_mode)
|
|
device_resume();
|
|
device_resume();
|
|
Resume_console:
|
|
Resume_console:
|
|
resume_console();
|
|
resume_console();
|
|
|
|
+ Close:
|
|
|
|
+ platform_end(platform_mode);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -373,9 +386,9 @@ int hibernation_platform_enter(void)
|
|
* hibernation_ops->finish() before saving the image, so we should let
|
|
* hibernation_ops->finish() before saving the image, so we should let
|
|
* the firmware know that we're going to enter the sleep state after all
|
|
* the firmware know that we're going to enter the sleep state after all
|
|
*/
|
|
*/
|
|
- error = hibernation_ops->start();
|
|
|
|
|
|
+ error = hibernation_ops->begin();
|
|
if (error)
|
|
if (error)
|
|
- return error;
|
|
|
|
|
|
+ goto Close;
|
|
|
|
|
|
suspend_console();
|
|
suspend_console();
|
|
error = device_suspend(PMSG_SUSPEND);
|
|
error = device_suspend(PMSG_SUSPEND);
|
|
@@ -409,6 +422,8 @@ int hibernation_platform_enter(void)
|
|
device_resume();
|
|
device_resume();
|
|
Resume_console:
|
|
Resume_console:
|
|
resume_console();
|
|
resume_console();
|
|
|
|
+ Close:
|
|
|
|
+ hibernation_ops->end();
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|