diff options
Diffstat (limited to 'kernel/power/main.c')
-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 | ||