PM / hibernate: no kernel_power_off when pm_power_off NULL
authorSebastian Capella <sebastian.capella@linaro.org>
Tue, 22 Apr 2014 00:30:46 +0000 (17:30 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 30 Apr 2014 23:02:25 +0000 (01:02 +0200)
Reboot logic in kernel/reboot will avoid calling kernel_power_off
when pm_power_off is null, and instead uses kernel_halt.  Change
hibernate's power_down to follow the behavior in the reboot call.

Calling the notifier twice (once for SYS_POWER_OFF and again for
SYS_HALT) causes a panic during hibernation on Kirkwood
Openblocks A6 board.

Signed-off-by: Sebastian Capella <sebastian.capella@linaro.org>
Reported-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Reviewed-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
kernel/power/hibernate.c

index de4b989cc8fde6e05dadf766932719ef7113f07f..1f08ac7f55d818fbb301e87fd99707e93764aab1 100644 (file)
@@ -599,7 +599,8 @@ static void power_down(void)
        case HIBERNATION_PLATFORM:
                hibernation_platform_enter();
        case HIBERNATION_SHUTDOWN:
-               kernel_power_off();
+               if (pm_power_off)
+                       kernel_power_off();
                break;
 #ifdef CONFIG_SUSPEND
        case HIBERNATION_SUSPEND:
@@ -627,7 +628,8 @@ static void power_down(void)
         * corruption after resume.
         */
        printk(KERN_CRIT "PM: Please power down manually\n");
-       while(1);
+       while (1)
+               cpu_relax();
 }
 
 /**