diff options
Diffstat (limited to 'kernel/power/disk.c')
| -rw-r--r-- | kernel/power/disk.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 02b6764034dc..fb8de63c2919 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
| @@ -117,8 +117,8 @@ static void finish(void) | |||
| 117 | { | 117 | { |
| 118 | device_resume(); | 118 | device_resume(); |
| 119 | platform_finish(); | 119 | platform_finish(); |
| 120 | enable_nonboot_cpus(); | ||
| 121 | thaw_processes(); | 120 | thaw_processes(); |
| 121 | enable_nonboot_cpus(); | ||
| 122 | pm_restore_console(); | 122 | pm_restore_console(); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| @@ -131,28 +131,35 @@ static int prepare_processes(void) | |||
| 131 | 131 | ||
| 132 | sys_sync(); | 132 | sys_sync(); |
| 133 | 133 | ||
| 134 | disable_nonboot_cpus(); | ||
| 135 | |||
| 134 | if (freeze_processes()) { | 136 | if (freeze_processes()) { |
| 135 | error = -EBUSY; | 137 | error = -EBUSY; |
| 136 | return error; | 138 | goto thaw; |
| 137 | } | 139 | } |
| 138 | 140 | ||
| 139 | if (pm_disk_mode == PM_DISK_PLATFORM) { | 141 | if (pm_disk_mode == PM_DISK_PLATFORM) { |
| 140 | if (pm_ops && pm_ops->prepare) { | 142 | if (pm_ops && pm_ops->prepare) { |
| 141 | if ((error = pm_ops->prepare(PM_SUSPEND_DISK))) | 143 | if ((error = pm_ops->prepare(PM_SUSPEND_DISK))) |
| 142 | return error; | 144 | goto thaw; |
| 143 | } | 145 | } |
| 144 | } | 146 | } |
| 145 | 147 | ||
| 146 | /* Free memory before shutting down devices. */ | 148 | /* Free memory before shutting down devices. */ |
| 147 | free_some_memory(); | 149 | free_some_memory(); |
| 148 | |||
| 149 | return 0; | 150 | return 0; |
| 151 | thaw: | ||
| 152 | thaw_processes(); | ||
| 153 | enable_nonboot_cpus(); | ||
| 154 | pm_restore_console(); | ||
| 155 | return error; | ||
| 150 | } | 156 | } |
| 151 | 157 | ||
| 152 | static void unprepare_processes(void) | 158 | static void unprepare_processes(void) |
| 153 | { | 159 | { |
| 154 | enable_nonboot_cpus(); | 160 | platform_finish(); |
| 155 | thaw_processes(); | 161 | thaw_processes(); |
| 162 | enable_nonboot_cpus(); | ||
| 156 | pm_restore_console(); | 163 | pm_restore_console(); |
| 157 | } | 164 | } |
| 158 | 165 | ||
| @@ -160,15 +167,9 @@ static int prepare_devices(void) | |||
| 160 | { | 167 | { |
| 161 | int error; | 168 | int error; |
| 162 | 169 | ||
| 163 | disable_nonboot_cpus(); | 170 | if ((error = device_suspend(PMSG_FREEZE))) |
| 164 | if ((error = device_suspend(PMSG_FREEZE))) { | ||
| 165 | printk("Some devices failed to suspend\n"); | 171 | printk("Some devices failed to suspend\n"); |
| 166 | platform_finish(); | 172 | return error; |
| 167 | enable_nonboot_cpus(); | ||
| 168 | return error; | ||
| 169 | } | ||
| 170 | |||
| 171 | return 0; | ||
| 172 | } | 173 | } |
| 173 | 174 | ||
| 174 | /** | 175 | /** |
| @@ -185,9 +186,9 @@ int pm_suspend_disk(void) | |||
| 185 | int error; | 186 | int error; |
| 186 | 187 | ||
| 187 | error = prepare_processes(); | 188 | error = prepare_processes(); |
| 188 | if (!error) { | 189 | if (error) |
| 189 | error = prepare_devices(); | 190 | return error; |
| 190 | } | 191 | error = prepare_devices(); |
| 191 | 192 | ||
| 192 | if (error) { | 193 | if (error) { |
| 193 | unprepare_processes(); | 194 | unprepare_processes(); |
| @@ -250,7 +251,7 @@ static int software_resume(void) | |||
| 250 | 251 | ||
| 251 | if ((error = prepare_processes())) { | 252 | if ((error = prepare_processes())) { |
| 252 | swsusp_close(); | 253 | swsusp_close(); |
| 253 | goto Cleanup; | 254 | goto Done; |
| 254 | } | 255 | } |
| 255 | 256 | ||
| 256 | pr_debug("PM: Reading swsusp image.\n"); | 257 | pr_debug("PM: Reading swsusp image.\n"); |
