diff options
Diffstat (limited to 'drivers/acpi/sleep/poweroff.c')
-rw-r--r-- | drivers/acpi/sleep/poweroff.c | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/drivers/acpi/sleep/poweroff.c b/drivers/acpi/sleep/poweroff.c index 1fc86e6..186b182 100644 --- a/drivers/acpi/sleep/poweroff.c +++ b/drivers/acpi/sleep/poweroff.c @@ -19,8 +19,6 @@ int acpi_sleep_prepare(u32 acpi_state) { - /* Flag to do not allow second time invocation for S5 state */ - static int shutdown_prepared = 0; #ifdef CONFIG_ACPI_SLEEP /* do we have a wakeup address for S2 and S3? */ /* Here, we support only S4BIOS, those we set the wakeup address */ @@ -38,28 +36,23 @@ int acpi_sleep_prepare(u32 acpi_state) acpi_enable_wakeup_device_prep(acpi_state); #endif if (acpi_state == ACPI_STATE_S5) { - /* Check if we were already called */ - if (shutdown_prepared) - return 0; acpi_wakeup_gpe_poweroff_prepare(); - shutdown_prepared = 1; } acpi_enter_sleep_state_prep(acpi_state); return 0; } +#ifdef CONFIG_PM + void acpi_power_off(void) { + /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ printk("%s called\n", __FUNCTION__); - acpi_sleep_prepare(ACPI_STATE_S5); local_irq_disable(); /* Some SMP machines only can poweroff in boot CPU */ - set_cpus_allowed(current, cpumask_of_cpu(0)); acpi_enter_sleep_state(ACPI_STATE_S5); } -#ifdef CONFIG_PM - static int acpi_shutdown(struct sys_device *x) { return acpi_sleep_prepare(ACPI_STATE_S5); @@ -75,8 +68,6 @@ static struct sys_device device_acpi = { .cls = &acpi_sysclass, }; -#endif - static int acpi_poweroff_init(void) { if (!acpi_disabled) { @@ -86,19 +77,18 @@ static int acpi_poweroff_init(void) status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); if (ACPI_SUCCESS(status)) { - pm_power_off = acpi_power_off; -#ifdef CONFIG_PM - { - int error; - error = sysdev_class_register(&acpi_sysclass); - if (!error) - error = sysdev_register(&device_acpi); - return error; - } -#endif + int error; + error = sysdev_class_register(&acpi_sysclass); + if (!error) + error = sysdev_register(&device_acpi); + if (!error) + pm_power_off = acpi_power_off; + return error; } } return 0; } late_initcall(acpi_poweroff_init); + +#endif /* CONFIG_PM */ |