Root/
1 | /* |
2 | * wakeup.c - support wakeup devices |
3 | * Copyright (C) 2004 Li Shaohua <shaohua.li@intel.com> |
4 | */ |
5 | |
6 | #include <linux/init.h> |
7 | #include <linux/acpi.h> |
8 | #include <acpi/acpi_drivers.h> |
9 | #include <linux/kernel.h> |
10 | #include <linux/types.h> |
11 | |
12 | #include "internal.h" |
13 | #include "sleep.h" |
14 | |
15 | /* |
16 | * We didn't lock acpi_device_lock in the file, because it invokes oops in |
17 | * suspend/resume and isn't really required as this is called in S-state. At |
18 | * that time, there is no device hotplug |
19 | **/ |
20 | #define _COMPONENT ACPI_SYSTEM_COMPONENT |
21 | ACPI_MODULE_NAME("wakeup_devices") |
22 | |
23 | /** |
24 | * acpi_enable_wakeup_devices - Enable wake-up device GPEs. |
25 | * @sleep_state: ACPI system sleep state. |
26 | * |
27 | * Enable wakeup device power of devices with the state.enable flag set and set |
28 | * the wakeup enable mask bits in the GPE registers that correspond to wakeup |
29 | * devices. |
30 | */ |
31 | void acpi_enable_wakeup_devices(u8 sleep_state) |
32 | { |
33 | struct list_head *node, *next; |
34 | |
35 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { |
36 | struct acpi_device *dev = |
37 | container_of(node, struct acpi_device, wakeup_list); |
38 | |
39 | if (!dev->wakeup.flags.valid |
40 | || sleep_state > (u32) dev->wakeup.sleep_state |
41 | || !(device_may_wakeup(&dev->dev) |
42 | || dev->wakeup.prepare_count)) |
43 | continue; |
44 | |
45 | if (device_may_wakeup(&dev->dev)) |
46 | acpi_enable_wakeup_device_power(dev, sleep_state); |
47 | |
48 | /* The wake-up power should have been enabled already. */ |
49 | acpi_set_gpe_wake_mask(dev->wakeup.gpe_device, dev->wakeup.gpe_number, |
50 | ACPI_GPE_ENABLE); |
51 | } |
52 | } |
53 | |
54 | /** |
55 | * acpi_disable_wakeup_devices - Disable devices' wakeup capability. |
56 | * @sleep_state: ACPI system sleep state. |
57 | */ |
58 | void acpi_disable_wakeup_devices(u8 sleep_state) |
59 | { |
60 | struct list_head *node, *next; |
61 | |
62 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { |
63 | struct acpi_device *dev = |
64 | container_of(node, struct acpi_device, wakeup_list); |
65 | |
66 | if (!dev->wakeup.flags.valid |
67 | || sleep_state > (u32) dev->wakeup.sleep_state |
68 | || !(device_may_wakeup(&dev->dev) |
69 | || dev->wakeup.prepare_count)) |
70 | continue; |
71 | |
72 | acpi_set_gpe_wake_mask(dev->wakeup.gpe_device, dev->wakeup.gpe_number, |
73 | ACPI_GPE_DISABLE); |
74 | |
75 | if (device_may_wakeup(&dev->dev)) |
76 | acpi_disable_wakeup_device_power(dev); |
77 | } |
78 | } |
79 | |
80 | int __init acpi_wakeup_device_init(void) |
81 | { |
82 | struct list_head *node, *next; |
83 | |
84 | mutex_lock(&acpi_device_lock); |
85 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { |
86 | struct acpi_device *dev = container_of(node, |
87 | struct acpi_device, |
88 | wakeup_list); |
89 | if (device_can_wakeup(&dev->dev)) { |
90 | /* Button GPEs are supposed to be always enabled. */ |
91 | acpi_enable_gpe(dev->wakeup.gpe_device, |
92 | dev->wakeup.gpe_number); |
93 | device_set_wakeup_enable(&dev->dev, true); |
94 | } |
95 | } |
96 | mutex_unlock(&acpi_device_lock); |
97 | return 0; |
98 | } |
99 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9