diff options
Diffstat (limited to 'kernel/power/disk.c')
-rw-r--r-- | kernel/power/disk.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 14a656cdc652..d416be0efa8a 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
@@ -193,6 +193,7 @@ static int create_image(int platform_mode) | |||
193 | if (error) | 193 | if (error) |
194 | return error; | 194 | return error; |
195 | 195 | ||
196 | device_pm_lock(); | ||
196 | local_irq_disable(); | 197 | local_irq_disable(); |
197 | /* At this point, device_suspend() has been called, but *not* | 198 | /* At this point, device_suspend() has been called, but *not* |
198 | * device_power_down(). We *must* call device_power_down() now. | 199 | * device_power_down(). We *must* call device_power_down() now. |
@@ -224,9 +225,11 @@ static int create_image(int platform_mode) | |||
224 | /* NOTE: device_power_up() is just a resume() for devices | 225 | /* NOTE: device_power_up() is just a resume() for devices |
225 | * that suspended with irqs off ... no overall powerup. | 226 | * that suspended with irqs off ... no overall powerup. |
226 | */ | 227 | */ |
227 | device_power_up(); | 228 | device_power_up(in_suspend ? |
229 | (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); | ||
228 | Enable_irqs: | 230 | Enable_irqs: |
229 | local_irq_enable(); | 231 | local_irq_enable(); |
232 | device_pm_unlock(); | ||
230 | return error; | 233 | return error; |
231 | } | 234 | } |
232 | 235 | ||
@@ -280,7 +283,8 @@ int hibernation_snapshot(int platform_mode) | |||
280 | Finish: | 283 | Finish: |
281 | platform_finish(platform_mode); | 284 | platform_finish(platform_mode); |
282 | Resume_devices: | 285 | Resume_devices: |
283 | device_resume(); | 286 | device_resume(in_suspend ? |
287 | (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); | ||
284 | Resume_console: | 288 | Resume_console: |
285 | resume_console(); | 289 | resume_console(); |
286 | Close: | 290 | Close: |
@@ -300,8 +304,9 @@ static int resume_target_kernel(void) | |||
300 | { | 304 | { |
301 | int error; | 305 | int error; |
302 | 306 | ||
307 | device_pm_lock(); | ||
303 | local_irq_disable(); | 308 | local_irq_disable(); |
304 | error = device_power_down(PMSG_PRETHAW); | 309 | error = device_power_down(PMSG_QUIESCE); |
305 | if (error) { | 310 | if (error) { |
306 | printk(KERN_ERR "PM: Some devices failed to power down, " | 311 | printk(KERN_ERR "PM: Some devices failed to power down, " |
307 | "aborting resume\n"); | 312 | "aborting resume\n"); |
@@ -329,9 +334,10 @@ static int resume_target_kernel(void) | |||
329 | swsusp_free(); | 334 | swsusp_free(); |
330 | restore_processor_state(); | 335 | restore_processor_state(); |
331 | touch_softlockup_watchdog(); | 336 | touch_softlockup_watchdog(); |
332 | device_power_up(); | 337 | device_power_up(PMSG_RECOVER); |
333 | Enable_irqs: | 338 | Enable_irqs: |
334 | local_irq_enable(); | 339 | local_irq_enable(); |
340 | device_pm_unlock(); | ||
335 | return error; | 341 | return error; |
336 | } | 342 | } |
337 | 343 | ||
@@ -350,7 +356,7 @@ int hibernation_restore(int platform_mode) | |||
350 | 356 | ||
351 | pm_prepare_console(); | 357 | pm_prepare_console(); |
352 | suspend_console(); | 358 | suspend_console(); |
353 | error = device_suspend(PMSG_PRETHAW); | 359 | error = device_suspend(PMSG_QUIESCE); |
354 | if (error) | 360 | if (error) |
355 | goto Finish; | 361 | goto Finish; |
356 | 362 | ||
@@ -362,7 +368,7 @@ int hibernation_restore(int platform_mode) | |||
362 | enable_nonboot_cpus(); | 368 | enable_nonboot_cpus(); |
363 | } | 369 | } |
364 | platform_restore_cleanup(platform_mode); | 370 | platform_restore_cleanup(platform_mode); |
365 | device_resume(); | 371 | device_resume(PMSG_RECOVER); |
366 | Finish: | 372 | Finish: |
367 | resume_console(); | 373 | resume_console(); |
368 | pm_restore_console(); | 374 | pm_restore_console(); |
@@ -403,6 +409,7 @@ int hibernation_platform_enter(void) | |||
403 | if (error) | 409 | if (error) |
404 | goto Finish; | 410 | goto Finish; |
405 | 411 | ||
412 | device_pm_lock(); | ||
406 | local_irq_disable(); | 413 | local_irq_disable(); |
407 | error = device_power_down(PMSG_HIBERNATE); | 414 | error = device_power_down(PMSG_HIBERNATE); |
408 | if (!error) { | 415 | if (!error) { |
@@ -411,6 +418,7 @@ int hibernation_platform_enter(void) | |||
411 | while (1); | 418 | while (1); |
412 | } | 419 | } |
413 | local_irq_enable(); | 420 | local_irq_enable(); |
421 | device_pm_unlock(); | ||
414 | 422 | ||
415 | /* | 423 | /* |
416 | * We don't need to reenable the nonboot CPUs or resume consoles, since | 424 | * We don't need to reenable the nonboot CPUs or resume consoles, since |
@@ -419,7 +427,7 @@ int hibernation_platform_enter(void) | |||
419 | Finish: | 427 | Finish: |
420 | hibernation_ops->finish(); | 428 | hibernation_ops->finish(); |
421 | Resume_devices: | 429 | Resume_devices: |
422 | device_resume(); | 430 | device_resume(PMSG_RESTORE); |
423 | Resume_console: | 431 | Resume_console: |
424 | resume_console(); | 432 | resume_console(); |
425 | Close: | 433 | Close: |