|
@@ -44,6 +44,11 @@ void pm_set_ops(struct pm_ops * ops)
|
|
mutex_unlock(&pm_mutex);
|
|
mutex_unlock(&pm_mutex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline void pm_finish(suspend_state_t state)
|
|
|
|
+{
|
|
|
|
+ if (pm_ops->finish)
|
|
|
|
+ pm_ops->finish(state);
|
|
|
|
+}
|
|
|
|
|
|
/**
|
|
/**
|
|
* suspend_prepare - Do prep work before entering low-power state.
|
|
* suspend_prepare - Do prep work before entering low-power state.
|
|
@@ -64,10 +69,6 @@ static int suspend_prepare(suspend_state_t state)
|
|
|
|
|
|
pm_prepare_console();
|
|
pm_prepare_console();
|
|
|
|
|
|
- error = disable_nonboot_cpus();
|
|
|
|
- if (error)
|
|
|
|
- goto Enable_cpu;
|
|
|
|
-
|
|
|
|
if (freeze_processes()) {
|
|
if (freeze_processes()) {
|
|
error = -EAGAIN;
|
|
error = -EAGAIN;
|
|
goto Thaw;
|
|
goto Thaw;
|
|
@@ -90,18 +91,22 @@ static int suspend_prepare(suspend_state_t state)
|
|
}
|
|
}
|
|
|
|
|
|
suspend_console();
|
|
suspend_console();
|
|
- if ((error = device_suspend(PMSG_SUSPEND))) {
|
|
|
|
|
|
+ error = device_suspend(PMSG_SUSPEND);
|
|
|
|
+ if (error) {
|
|
printk(KERN_ERR "Some devices failed to suspend\n");
|
|
printk(KERN_ERR "Some devices failed to suspend\n");
|
|
- goto Finish;
|
|
|
|
|
|
+ goto Resume_devices;
|
|
}
|
|
}
|
|
- return 0;
|
|
|
|
- Finish:
|
|
|
|
- if (pm_ops->finish)
|
|
|
|
- pm_ops->finish(state);
|
|
|
|
|
|
+ error = disable_nonboot_cpus();
|
|
|
|
+ if (!error)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ enable_nonboot_cpus();
|
|
|
|
+ Resume_devices:
|
|
|
|
+ pm_finish(state);
|
|
|
|
+ device_resume();
|
|
|
|
+ resume_console();
|
|
Thaw:
|
|
Thaw:
|
|
thaw_processes();
|
|
thaw_processes();
|
|
- Enable_cpu:
|
|
|
|
- enable_nonboot_cpus();
|
|
|
|
pm_restore_console();
|
|
pm_restore_console();
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
@@ -136,12 +141,11 @@ int suspend_enter(suspend_state_t state)
|
|
|
|
|
|
static void suspend_finish(suspend_state_t state)
|
|
static void suspend_finish(suspend_state_t state)
|
|
{
|
|
{
|
|
|
|
+ enable_nonboot_cpus();
|
|
|
|
+ pm_finish(state);
|
|
device_resume();
|
|
device_resume();
|
|
resume_console();
|
|
resume_console();
|
|
thaw_processes();
|
|
thaw_processes();
|
|
- enable_nonboot_cpus();
|
|
|
|
- if (pm_ops && pm_ops->finish)
|
|
|
|
- pm_ops->finish(state);
|
|
|
|
pm_restore_console();
|
|
pm_restore_console();
|
|
}
|
|
}
|
|
|
|
|