diff options
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/processor_core.c | 2 | ||||
-rw-r--r-- | drivers/acpi/processor_idle.c | 19 | ||||
-rw-r--r-- | drivers/acpi/sleep/Makefile | 4 | ||||
-rw-r--r-- | drivers/acpi/sleep/main.c | 61 | ||||
-rw-r--r-- | drivers/acpi/sleep/poweroff.c | 75 | ||||
-rw-r--r-- | drivers/acpi/video.c | 3 |
6 files changed, 78 insertions, 86 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 2afb3d2086b3..9f11dc296cdd 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -102,6 +102,8 @@ static struct acpi_driver acpi_processor_driver = { | |||
102 | .add = acpi_processor_add, | 102 | .add = acpi_processor_add, |
103 | .remove = acpi_processor_remove, | 103 | .remove = acpi_processor_remove, |
104 | .start = acpi_processor_start, | 104 | .start = acpi_processor_start, |
105 | .suspend = acpi_processor_suspend, | ||
106 | .resume = acpi_processor_resume, | ||
105 | }, | 107 | }, |
106 | }; | 108 | }; |
107 | 109 | ||
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index d9b8af763e1e..f18261368e76 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -325,6 +325,23 @@ static void acpi_state_timer_broadcast(struct acpi_processor *pr, | |||
325 | 325 | ||
326 | #endif | 326 | #endif |
327 | 327 | ||
328 | /* | ||
329 | * Suspend / resume control | ||
330 | */ | ||
331 | static int acpi_idle_suspend; | ||
332 | |||
333 | int acpi_processor_suspend(struct acpi_device * device, pm_message_t state) | ||
334 | { | ||
335 | acpi_idle_suspend = 1; | ||
336 | return 0; | ||
337 | } | ||
338 | |||
339 | int acpi_processor_resume(struct acpi_device * device) | ||
340 | { | ||
341 | acpi_idle_suspend = 0; | ||
342 | return 0; | ||
343 | } | ||
344 | |||
328 | static void acpi_processor_idle(void) | 345 | static void acpi_processor_idle(void) |
329 | { | 346 | { |
330 | struct acpi_processor *pr = NULL; | 347 | struct acpi_processor *pr = NULL; |
@@ -355,7 +372,7 @@ static void acpi_processor_idle(void) | |||
355 | } | 372 | } |
356 | 373 | ||
357 | cx = pr->power.state; | 374 | cx = pr->power.state; |
358 | if (!cx) { | 375 | if (!cx || acpi_idle_suspend) { |
359 | if (pm_idle_save) | 376 | if (pm_idle_save) |
360 | pm_idle_save(); | 377 | pm_idle_save(); |
361 | else | 378 | else |
diff --git a/drivers/acpi/sleep/Makefile b/drivers/acpi/sleep/Makefile index 195a4f69c0f7..f1fb888c2d29 100644 --- a/drivers/acpi/sleep/Makefile +++ b/drivers/acpi/sleep/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | obj-y := poweroff.o wakeup.o | 1 | obj-y := wakeup.o |
2 | obj-$(CONFIG_ACPI_SLEEP) += main.o | 2 | obj-y += main.o |
3 | obj-$(CONFIG_ACPI_SLEEP) += proc.o | 3 | obj-$(CONFIG_ACPI_SLEEP) += proc.o |
4 | 4 | ||
5 | EXTRA_CFLAGS += $(ACPI_CFLAGS) | 5 | EXTRA_CFLAGS += $(ACPI_CFLAGS) |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index c52ade816fb4..2cbb9aabd00e 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
@@ -15,13 +15,39 @@ | |||
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" |
21 | 24 | ||
22 | u8 sleep_states[ACPI_S_STATE_COUNT]; | 25 | u8 sleep_states[ACPI_S_STATE_COUNT]; |
23 | 26 | ||
27 | #ifdef CONFIG_PM_SLEEP | ||
24 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; | 28 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; |
29 | #endif | ||
30 | |||
31 | int acpi_sleep_prepare(u32 acpi_state) | ||
32 | { | ||
33 | #ifdef CONFIG_ACPI_SLEEP | ||
34 | /* do we have a wakeup address for S2 and S3? */ | ||
35 | if (acpi_state == ACPI_STATE_S3) { | ||
36 | if (!acpi_wakeup_address) { | ||
37 | return -EFAULT; | ||
38 | } | ||
39 | acpi_set_firmware_waking_vector((acpi_physical_address) | ||
40 | virt_to_phys((void *) | ||
41 | acpi_wakeup_address)); | ||
42 | |||
43 | } | ||
44 | ACPI_FLUSH_CPU_CACHE(); | ||
45 | acpi_enable_wakeup_device_prep(acpi_state); | ||
46 | #endif | ||
47 | acpi_gpe_sleep_prepare(acpi_state); | ||
48 | acpi_enter_sleep_state_prep(acpi_state); | ||
49 | return 0; | ||
50 | } | ||
25 | 51 | ||
26 | #ifdef CONFIG_SUSPEND | 52 | #ifdef CONFIG_SUSPEND |
27 | static struct pm_ops acpi_pm_ops; | 53 | static struct pm_ops acpi_pm_ops; |
@@ -275,6 +301,7 @@ int acpi_suspend(u32 acpi_state) | |||
275 | return -EINVAL; | 301 | return -EINVAL; |
276 | } | 302 | } |
277 | 303 | ||
304 | #ifdef CONFIG_PM_SLEEP | ||
278 | /** | 305 | /** |
279 | * acpi_pm_device_sleep_state - return preferred power state of ACPI device | 306 | * acpi_pm_device_sleep_state - return preferred power state of ACPI device |
280 | * in the system sleep state given by %acpi_target_sleep_state | 307 | * in the system sleep state given by %acpi_target_sleep_state |
@@ -349,6 +376,21 @@ int acpi_pm_device_sleep_state(struct device *dev, int wake, int *d_min_p) | |||
349 | *d_min_p = d_min; | 376 | *d_min_p = d_min; |
350 | return d_max; | 377 | return d_max; |
351 | } | 378 | } |
379 | #endif | ||
380 | |||
381 | static void acpi_power_off_prepare(void) | ||
382 | { | ||
383 | /* Prepare to power off the system */ | ||
384 | acpi_sleep_prepare(ACPI_STATE_S5); | ||
385 | } | ||
386 | |||
387 | static void acpi_power_off(void) | ||
388 | { | ||
389 | /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ | ||
390 | printk("%s called\n", __FUNCTION__); | ||
391 | local_irq_disable(); | ||
392 | acpi_enter_sleep_state(ACPI_STATE_S5); | ||
393 | } | ||
352 | 394 | ||
353 | int __init acpi_sleep_init(void) | 395 | int __init acpi_sleep_init(void) |
354 | { | 396 | { |
@@ -363,16 +405,17 @@ int __init acpi_sleep_init(void) | |||
363 | if (acpi_disabled) | 405 | if (acpi_disabled) |
364 | return 0; | 406 | return 0; |
365 | 407 | ||
408 | sleep_states[ACPI_STATE_S0] = 1; | ||
409 | printk(KERN_INFO PREFIX "(supports S0"); | ||
410 | |||
366 | #ifdef CONFIG_SUSPEND | 411 | #ifdef CONFIG_SUSPEND |
367 | printk(KERN_INFO PREFIX "(supports"); | 412 | for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++) { |
368 | for (i = ACPI_STATE_S0; i < ACPI_STATE_S4; i++) { | ||
369 | status = acpi_get_sleep_type_data(i, &type_a, &type_b); | 413 | status = acpi_get_sleep_type_data(i, &type_a, &type_b); |
370 | if (ACPI_SUCCESS(status)) { | 414 | if (ACPI_SUCCESS(status)) { |
371 | sleep_states[i] = 1; | 415 | sleep_states[i] = 1; |
372 | printk(" S%d", i); | 416 | printk(" S%d", i); |
373 | } | 417 | } |
374 | } | 418 | } |
375 | printk(")\n"); | ||
376 | 419 | ||
377 | pm_set_ops(&acpi_pm_ops); | 420 | pm_set_ops(&acpi_pm_ops); |
378 | #endif | 421 | #endif |
@@ -382,10 +425,16 @@ int __init acpi_sleep_init(void) | |||
382 | if (ACPI_SUCCESS(status)) { | 425 | if (ACPI_SUCCESS(status)) { |
383 | hibernation_set_ops(&acpi_hibernation_ops); | 426 | hibernation_set_ops(&acpi_hibernation_ops); |
384 | sleep_states[ACPI_STATE_S4] = 1; | 427 | sleep_states[ACPI_STATE_S4] = 1; |
428 | printk(" S4"); | ||
385 | } | 429 | } |
386 | #else | ||
387 | sleep_states[ACPI_STATE_S4] = 0; | ||
388 | #endif | 430 | #endif |
389 | 431 | status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); | |
432 | if (ACPI_SUCCESS(status)) { | ||
433 | sleep_states[ACPI_STATE_S5] = 1; | ||
434 | printk(" S5"); | ||
435 | pm_power_off_prepare = acpi_power_off_prepare; | ||
436 | pm_power_off = acpi_power_off; | ||
437 | } | ||
438 | printk(")\n"); | ||
390 | return 0; | 439 | return 0; |
391 | } | 440 | } |
diff --git a/drivers/acpi/sleep/poweroff.c b/drivers/acpi/sleep/poweroff.c deleted file mode 100644 index 39e40d56b034..000000000000 --- a/drivers/acpi/sleep/poweroff.c +++ /dev/null | |||
@@ -1,75 +0,0 @@ | |||
1 | /* | ||
2 | * poweroff.c - ACPI handler for powering off the system. | ||
3 | * | ||
4 | * AKA S5, but it is independent of whether or not the kernel supports | ||
5 | * any other sleep support in the system. | ||
6 | * | ||
7 | * Copyright (c) 2005 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> | ||
8 | * | ||
9 | * This file is released under the GPLv2. | ||
10 | */ | ||
11 | |||
12 | #include <linux/pm.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <acpi/acpi_bus.h> | ||
15 | #include <linux/sysdev.h> | ||
16 | #include <asm/io.h> | ||
17 | #include "sleep.h" | ||
18 | |||
19 | int acpi_sleep_prepare(u32 acpi_state) | ||
20 | { | ||
21 | #ifdef CONFIG_ACPI_SLEEP | ||
22 | /* do we have a wakeup address for S2 and S3? */ | ||
23 | if (acpi_state == ACPI_STATE_S3) { | ||
24 | if (!acpi_wakeup_address) { | ||
25 | return -EFAULT; | ||
26 | } | ||
27 | acpi_set_firmware_waking_vector((acpi_physical_address) | ||
28 | virt_to_phys((void *) | ||
29 | acpi_wakeup_address)); | ||
30 | |||
31 | } | ||
32 | ACPI_FLUSH_CPU_CACHE(); | ||
33 | acpi_enable_wakeup_device_prep(acpi_state); | ||
34 | #endif | ||
35 | acpi_gpe_sleep_prepare(acpi_state); | ||
36 | acpi_enter_sleep_state_prep(acpi_state); | ||
37 | return 0; | ||
38 | } | ||
39 | |||
40 | #ifdef CONFIG_PM | ||
41 | |||
42 | static void acpi_power_off_prepare(void) | ||
43 | { | ||
44 | /* Prepare to power off the system */ | ||
45 | acpi_sleep_prepare(ACPI_STATE_S5); | ||
46 | } | ||
47 | |||
48 | static void acpi_power_off(void) | ||
49 | { | ||
50 | /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ | ||
51 | printk("%s called\n", __FUNCTION__); | ||
52 | local_irq_disable(); | ||
53 | /* Some SMP machines only can poweroff in boot CPU */ | ||
54 | acpi_enter_sleep_state(ACPI_STATE_S5); | ||
55 | } | ||
56 | |||
57 | static int acpi_poweroff_init(void) | ||
58 | { | ||
59 | if (!acpi_disabled) { | ||
60 | u8 type_a, type_b; | ||
61 | acpi_status status; | ||
62 | |||
63 | status = | ||
64 | acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); | ||
65 | if (ACPI_SUCCESS(status)) { | ||
66 | pm_power_off_prepare = acpi_power_off_prepare; | ||
67 | pm_power_off = acpi_power_off; | ||
68 | } | ||
69 | } | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | late_initcall(acpi_poweroff_init); | ||
74 | |||
75 | #endif /* CONFIG_PM */ | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 3c9bb85a6a93..d05891f16282 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -417,7 +417,6 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level) | |||
417 | arg0.integer.value = level; | 417 | arg0.integer.value = level; |
418 | status = acpi_evaluate_object(device->dev->handle, "_BCM", &args, NULL); | 418 | status = acpi_evaluate_object(device->dev->handle, "_BCM", &args, NULL); |
419 | 419 | ||
420 | printk(KERN_DEBUG "set_level status: %x\n", status); | ||
421 | return status; | 420 | return status; |
422 | } | 421 | } |
423 | 422 | ||
@@ -1754,7 +1753,7 @@ static int acpi_video_bus_put_devices(struct acpi_video_bus *video) | |||
1754 | 1753 | ||
1755 | static int acpi_video_bus_start_devices(struct acpi_video_bus *video) | 1754 | static int acpi_video_bus_start_devices(struct acpi_video_bus *video) |
1756 | { | 1755 | { |
1757 | return acpi_video_bus_DOS(video, 1, 0); | 1756 | return acpi_video_bus_DOS(video, 0, 0); |
1758 | } | 1757 | } |
1759 | 1758 | ||
1760 | static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) | 1759 | static int acpi_video_bus_stop_devices(struct acpi_video_bus *video) |