diff options
-rw-r--r-- | drivers/acpi/sleep/poweroff.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/acpi/sleep/poweroff.c b/drivers/acpi/sleep/poweroff.c index 3d41d93a3db8..186b182c5825 100644 --- a/drivers/acpi/sleep/poweroff.c +++ b/drivers/acpi/sleep/poweroff.c | |||
@@ -19,8 +19,6 @@ | |||
19 | 19 | ||
20 | int acpi_sleep_prepare(u32 acpi_state) | 20 | int acpi_sleep_prepare(u32 acpi_state) |
21 | { | 21 | { |
22 | /* Flag to do not allow second time invocation for S5 state */ | ||
23 | static int shutdown_prepared = 0; | ||
24 | #ifdef CONFIG_ACPI_SLEEP | 22 | #ifdef CONFIG_ACPI_SLEEP |
25 | /* do we have a wakeup address for S2 and S3? */ | 23 | /* do we have a wakeup address for S2 and S3? */ |
26 | /* Here, we support only S4BIOS, those we set the wakeup address */ | 24 | /* Here, we support only S4BIOS, those we set the wakeup address */ |
@@ -38,27 +36,23 @@ int acpi_sleep_prepare(u32 acpi_state) | |||
38 | acpi_enable_wakeup_device_prep(acpi_state); | 36 | acpi_enable_wakeup_device_prep(acpi_state); |
39 | #endif | 37 | #endif |
40 | if (acpi_state == ACPI_STATE_S5) { | 38 | if (acpi_state == ACPI_STATE_S5) { |
41 | /* Check if we were already called */ | ||
42 | if (shutdown_prepared) | ||
43 | return 0; | ||
44 | acpi_wakeup_gpe_poweroff_prepare(); | 39 | acpi_wakeup_gpe_poweroff_prepare(); |
45 | shutdown_prepared = 1; | ||
46 | } | 40 | } |
47 | acpi_enter_sleep_state_prep(acpi_state); | 41 | acpi_enter_sleep_state_prep(acpi_state); |
48 | return 0; | 42 | return 0; |
49 | } | 43 | } |
50 | 44 | ||
45 | #ifdef CONFIG_PM | ||
46 | |||
51 | void acpi_power_off(void) | 47 | void acpi_power_off(void) |
52 | { | 48 | { |
49 | /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ | ||
53 | printk("%s called\n", __FUNCTION__); | 50 | printk("%s called\n", __FUNCTION__); |
54 | acpi_sleep_prepare(ACPI_STATE_S5); | ||
55 | local_irq_disable(); | 51 | local_irq_disable(); |
56 | /* Some SMP machines only can poweroff in boot CPU */ | 52 | /* Some SMP machines only can poweroff in boot CPU */ |
57 | acpi_enter_sleep_state(ACPI_STATE_S5); | 53 | acpi_enter_sleep_state(ACPI_STATE_S5); |
58 | } | 54 | } |
59 | 55 | ||
60 | #ifdef CONFIG_PM | ||
61 | |||
62 | static int acpi_shutdown(struct sys_device *x) | 56 | static int acpi_shutdown(struct sys_device *x) |
63 | { | 57 | { |
64 | return acpi_sleep_prepare(ACPI_STATE_S5); | 58 | return acpi_sleep_prepare(ACPI_STATE_S5); |
@@ -74,8 +68,6 @@ static struct sys_device device_acpi = { | |||
74 | .cls = &acpi_sysclass, | 68 | .cls = &acpi_sysclass, |
75 | }; | 69 | }; |
76 | 70 | ||
77 | #endif | ||
78 | |||
79 | static int acpi_poweroff_init(void) | 71 | static int acpi_poweroff_init(void) |
80 | { | 72 | { |
81 | if (!acpi_disabled) { | 73 | if (!acpi_disabled) { |
@@ -85,19 +77,18 @@ static int acpi_poweroff_init(void) | |||
85 | status = | 77 | status = |
86 | acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); | 78 | acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); |
87 | if (ACPI_SUCCESS(status)) { | 79 | if (ACPI_SUCCESS(status)) { |
88 | pm_power_off = acpi_power_off; | 80 | int error; |
89 | #ifdef CONFIG_PM | 81 | error = sysdev_class_register(&acpi_sysclass); |
90 | { | 82 | if (!error) |
91 | int error; | 83 | error = sysdev_register(&device_acpi); |
92 | error = sysdev_class_register(&acpi_sysclass); | 84 | if (!error) |
93 | if (!error) | 85 | pm_power_off = acpi_power_off; |
94 | error = sysdev_register(&device_acpi); | 86 | return error; |
95 | return error; | ||
96 | } | ||
97 | #endif | ||
98 | } | 87 | } |
99 | } | 88 | } |
100 | return 0; | 89 | return 0; |
101 | } | 90 | } |
102 | 91 | ||
103 | late_initcall(acpi_poweroff_init); | 92 | late_initcall(acpi_poweroff_init); |
93 | |||
94 | #endif /* CONFIG_PM */ | ||