diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/power/main.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 47ca5a2b653b..e1c413120469 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
| @@ -44,6 +44,11 @@ void pm_set_ops(struct pm_ops * ops) | |||
| 44 | mutex_unlock(&pm_mutex); | 44 | mutex_unlock(&pm_mutex); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline void pm_finish(suspend_state_t state) | ||
| 48 | { | ||
| 49 | if (pm_ops->finish) | ||
| 50 | pm_ops->finish(state); | ||
| 51 | } | ||
| 47 | 52 | ||
| 48 | /** | 53 | /** |
| 49 | * suspend_prepare - Do prep work before entering low-power state. | 54 | * suspend_prepare - Do prep work before entering low-power state. |
| @@ -64,10 +69,6 @@ static int suspend_prepare(suspend_state_t state) | |||
| 64 | 69 | ||
| 65 | pm_prepare_console(); | 70 | pm_prepare_console(); |
| 66 | 71 | ||
| 67 | error = disable_nonboot_cpus(); | ||
| 68 | if (error) | ||
| 69 | goto Enable_cpu; | ||
| 70 | |||
| 71 | if (freeze_processes()) { | 72 | if (freeze_processes()) { |
| 72 | error = -EAGAIN; | 73 | error = -EAGAIN; |
| 73 | goto Thaw; | 74 | goto Thaw; |
| @@ -90,18 +91,22 @@ static int suspend_prepare(suspend_state_t state) | |||
| 90 | } | 91 | } |
| 91 | 92 | ||
| 92 | suspend_console(); | 93 | suspend_console(); |
| 93 | if ((error = device_suspend(PMSG_SUSPEND))) { | 94 | error = device_suspend(PMSG_SUSPEND); |
| 95 | if (error) { | ||
| 94 | printk(KERN_ERR "Some devices failed to suspend\n"); | 96 | printk(KERN_ERR "Some devices failed to suspend\n"); |
| 95 | goto Finish; | 97 | goto Resume_devices; |
| 96 | } | 98 | } |
| 97 | return 0; | 99 | error = disable_nonboot_cpus(); |
| 98 | Finish: | 100 | if (!error) |
| 99 | if (pm_ops->finish) | 101 | return 0; |
| 100 | pm_ops->finish(state); | 102 | |
| 103 | enable_nonboot_cpus(); | ||
| 104 | Resume_devices: | ||
| 105 | pm_finish(state); | ||
| 106 | device_resume(); | ||
| 107 | resume_console(); | ||
| 101 | Thaw: | 108 | Thaw: |
| 102 | thaw_processes(); | 109 | thaw_processes(); |
| 103 | Enable_cpu: | ||
| 104 | enable_nonboot_cpus(); | ||
| 105 | pm_restore_console(); | 110 | pm_restore_console(); |
| 106 | return error; | 111 | return error; |
| 107 | } | 112 | } |
| @@ -136,12 +141,11 @@ int suspend_enter(suspend_state_t state) | |||
| 136 | 141 | ||
| 137 | static void suspend_finish(suspend_state_t state) | 142 | static void suspend_finish(suspend_state_t state) |
| 138 | { | 143 | { |
| 144 | enable_nonboot_cpus(); | ||
| 145 | pm_finish(state); | ||
| 139 | device_resume(); | 146 | device_resume(); |
| 140 | resume_console(); | 147 | resume_console(); |
| 141 | thaw_processes(); | 148 | thaw_processes(); |
| 142 | enable_nonboot_cpus(); | ||
| 143 | if (pm_ops && pm_ops->finish) | ||
| 144 | pm_ops->finish(state); | ||
| 145 | pm_restore_console(); | 149 | pm_restore_console(); |
| 146 | } | 150 | } |
| 147 | 151 | ||
