diff options
author | Alexey Starikovskiy <astarikovskiy@suse.de> | 2007-09-20 13:32:35 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-09-20 20:46:55 -0400 |
commit | f216cc3748a3a22c2b99390fddcdafa0583791a2 (patch) | |
tree | 6670df286af51dc1d5d6276eba0ba67c6368795b /drivers/acpi/sleep/main.c | |
parent | 335fb8fc71692830aca0a5a5fe7f60016ee0d0aa (diff) |
ACPI: suspend: consolidate handling of Sx states.
Recent changes to sleep initialization in ACPI dropped reporting of supported Sx
states above S3. Fix that and also move S5 init into same file as other Sx.
The only functional change is adding printk() for S4 and S5 cases.
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/sleep/main.c')
-rw-r--r-- | drivers/acpi/sleep/main.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index c52ade816fb4..638172fe6825 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
@@ -15,6 +15,9 @@ | |||
15 | #include <linux/dmi.h> | 15 | #include <linux/dmi.h> |
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/suspend.h> | 17 | #include <linux/suspend.h> |
18 | |||
19 | #include <asm/io.h> | ||
20 | |||
18 | #include <acpi/acpi_bus.h> | 21 | #include <acpi/acpi_bus.h> |
19 | #include <acpi/acpi_drivers.h> | 22 | #include <acpi/acpi_drivers.h> |
20 | #include "sleep.h" | 23 | #include "sleep.h" |
@@ -57,6 +60,27 @@ static int acpi_pm_set_target(suspend_state_t pm_state) | |||
57 | return error; | 60 | return error; |
58 | } | 61 | } |
59 | 62 | ||
63 | int acpi_sleep_prepare(u32 acpi_state) | ||
64 | { | ||
65 | #ifdef CONFIG_ACPI_SLEEP | ||
66 | /* do we have a wakeup address for S2 and S3? */ | ||
67 | if (acpi_state == ACPI_STATE_S3) { | ||
68 | if (!acpi_wakeup_address) { | ||
69 | return -EFAULT; | ||
70 | } | ||
71 | acpi_set_firmware_waking_vector((acpi_physical_address) | ||
72 | virt_to_phys((void *) | ||
73 | acpi_wakeup_address)); | ||
74 | |||
75 | } | ||
76 | ACPI_FLUSH_CPU_CACHE(); | ||
77 | acpi_enable_wakeup_device_prep(acpi_state); | ||
78 | #endif | ||
79 | acpi_gpe_sleep_prepare(acpi_state); | ||
80 | acpi_enter_sleep_state_prep(acpi_state); | ||
81 | return 0; | ||
82 | } | ||
83 | |||
60 | /** | 84 | /** |
61 | * acpi_pm_prepare - Do preliminary suspend work. | 85 | * acpi_pm_prepare - Do preliminary suspend work. |
62 | * @pm_state: ignored | 86 | * @pm_state: ignored |
@@ -350,6 +374,20 @@ int acpi_pm_device_sleep_state(struct device *dev, int wake, int *d_min_p) | |||
350 | return d_max; | 374 | return d_max; |
351 | } | 375 | } |
352 | 376 | ||
377 | static void acpi_power_off_prepare(void) | ||
378 | { | ||
379 | /* Prepare to power off the system */ | ||
380 | acpi_sleep_prepare(ACPI_STATE_S5); | ||
381 | } | ||
382 | |||
383 | static void acpi_power_off(void) | ||
384 | { | ||
385 | /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ | ||
386 | printk("%s called\n", __FUNCTION__); | ||
387 | local_irq_disable(); | ||
388 | acpi_enter_sleep_state(ACPI_STATE_S5); | ||
389 | } | ||
390 | |||
353 | int __init acpi_sleep_init(void) | 391 | int __init acpi_sleep_init(void) |
354 | { | 392 | { |
355 | acpi_status status; | 393 | acpi_status status; |
@@ -363,8 +401,8 @@ int __init acpi_sleep_init(void) | |||
363 | if (acpi_disabled) | 401 | if (acpi_disabled) |
364 | return 0; | 402 | return 0; |
365 | 403 | ||
404 | printk(KERN_INFO PREFIX "(supports"); | ||
366 | #ifdef CONFIG_SUSPEND | 405 | #ifdef CONFIG_SUSPEND |
367 | printk(KERN_INFO PREFIX "(supports"); | ||
368 | for (i = ACPI_STATE_S0; i < ACPI_STATE_S4; i++) { | 406 | for (i = ACPI_STATE_S0; i < ACPI_STATE_S4; i++) { |
369 | status = acpi_get_sleep_type_data(i, &type_a, &type_b); | 407 | status = acpi_get_sleep_type_data(i, &type_a, &type_b); |
370 | if (ACPI_SUCCESS(status)) { | 408 | if (ACPI_SUCCESS(status)) { |
@@ -372,7 +410,6 @@ int __init acpi_sleep_init(void) | |||
372 | printk(" S%d", i); | 410 | printk(" S%d", i); |
373 | } | 411 | } |
374 | } | 412 | } |
375 | printk(")\n"); | ||
376 | 413 | ||
377 | pm_set_ops(&acpi_pm_ops); | 414 | pm_set_ops(&acpi_pm_ops); |
378 | #endif | 415 | #endif |
@@ -382,10 +419,16 @@ int __init acpi_sleep_init(void) | |||
382 | if (ACPI_SUCCESS(status)) { | 419 | if (ACPI_SUCCESS(status)) { |
383 | hibernation_set_ops(&acpi_hibernation_ops); | 420 | hibernation_set_ops(&acpi_hibernation_ops); |
384 | sleep_states[ACPI_STATE_S4] = 1; | 421 | sleep_states[ACPI_STATE_S4] = 1; |
422 | printk(" S4"); | ||
385 | } | 423 | } |
386 | #else | ||
387 | sleep_states[ACPI_STATE_S4] = 0; | ||
388 | #endif | 424 | #endif |
389 | 425 | status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); | |
426 | if (ACPI_SUCCESS(status)) { | ||
427 | sleep_states[ACPI_STATE_S5] = 1; | ||
428 | printk(" S5"); | ||
429 | pm_power_off_prepare = acpi_power_off_prepare; | ||
430 | pm_power_off = acpi_power_off; | ||
431 | } | ||
432 | printk(")\n"); | ||
390 | return 0; | 433 | return 0; |
391 | } | 434 | } |