]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/power/disk.c
Introduce new top level suspend and hibernation callbacks
[linux-2.6-omap-h63xx.git] / kernel / power / disk.c
index 14a656cdc6523bf64d9c5b64c3a628529b56bab5..d416be0efa8a37e9f5f3b5c7dd32110cb06c0f7a 100644 (file)
@@ -193,6 +193,7 @@ static int create_image(int platform_mode)
        if (error)
                return error;
 
+       device_pm_lock();
        local_irq_disable();
        /* At this point, device_suspend() has been called, but *not*
         * device_power_down(). We *must* call device_power_down() now.
@@ -224,9 +225,11 @@ static int create_image(int platform_mode)
        /* NOTE:  device_power_up() is just a resume() for devices
         * that suspended with irqs off ... no overall powerup.
         */
-       device_power_up();
+       device_power_up(in_suspend ?
+               (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
  Enable_irqs:
        local_irq_enable();
+       device_pm_unlock();
        return error;
 }
 
@@ -280,7 +283,8 @@ int hibernation_snapshot(int platform_mode)
  Finish:
        platform_finish(platform_mode);
  Resume_devices:
-       device_resume();
+       device_resume(in_suspend ?
+               (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
  Resume_console:
        resume_console();
  Close:
@@ -300,8 +304,9 @@ static int resume_target_kernel(void)
 {
        int error;
 
+       device_pm_lock();
        local_irq_disable();
-       error = device_power_down(PMSG_PRETHAW);
+       error = device_power_down(PMSG_QUIESCE);
        if (error) {
                printk(KERN_ERR "PM: Some devices failed to power down, "
                        "aborting resume\n");
@@ -329,9 +334,10 @@ static int resume_target_kernel(void)
        swsusp_free();
        restore_processor_state();
        touch_softlockup_watchdog();
-       device_power_up();
+       device_power_up(PMSG_RECOVER);
  Enable_irqs:
        local_irq_enable();
+       device_pm_unlock();
        return error;
 }
 
@@ -350,7 +356,7 @@ int hibernation_restore(int platform_mode)
 
        pm_prepare_console();
        suspend_console();
-       error = device_suspend(PMSG_PRETHAW);
+       error = device_suspend(PMSG_QUIESCE);
        if (error)
                goto Finish;
 
@@ -362,7 +368,7 @@ int hibernation_restore(int platform_mode)
                enable_nonboot_cpus();
        }
        platform_restore_cleanup(platform_mode);
-       device_resume();
+       device_resume(PMSG_RECOVER);
  Finish:
        resume_console();
        pm_restore_console();
@@ -403,6 +409,7 @@ int hibernation_platform_enter(void)
        if (error)
                goto Finish;
 
+       device_pm_lock();
        local_irq_disable();
        error = device_power_down(PMSG_HIBERNATE);
        if (!error) {
@@ -411,6 +418,7 @@ int hibernation_platform_enter(void)
                while (1);
        }
        local_irq_enable();
+       device_pm_unlock();
 
        /*
         * We don't need to reenable the nonboot CPUs or resume consoles, since
@@ -419,7 +427,7 @@ int hibernation_platform_enter(void)
  Finish:
        hibernation_ops->finish();
  Resume_devices:
-       device_resume();
+       device_resume(PMSG_RESTORE);
  Resume_console:
        resume_console();
  Close: