diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2010-06-30 23:01:12 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2010-07-06 22:34:27 -0400 |
commit | 3bd741bd0dfcc1845ae6892baa5192c91addc84c (patch) | |
tree | 3effbfaefa7dfee2c7d7223772847236ea53f718 | |
parent | 3784730b02b9f147a55b0e4623fcad671273e6e6 (diff) |
ACPICA: Use low-level GPE enable during GPE block initialization
The GPE block initialization code in acpi_ev_initialize_gpe_block()
uses acpi_set_gpe() to make sure that the GPEs with nonzero
runtime counter will remain enabled, but since it already has
a struct acpi_gpe_event_info object for each GPE, it might use
the low-level GPE enabling function, acpi_clear_and_enable_gpe(),
for this purpose.
To make that happen, move acpi_clear_and_enable_gpe() to
drivers/acpi/acpica/evgpe.c and rename it to acpi_ev_enable_gpe(),
modify the two existing users of it accordingly and modify
acpi_ev_initialize_gpe_block() to use it instead of acpi_set_gpe()
and to check its return value.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r-- | drivers/acpi/acpica/acevents.h | 2 | ||||
-rw-r--r-- | drivers/acpi/acpica/evgpe.c | 40 | ||||
-rw-r--r-- | drivers/acpi/acpica/evgpeblk.c | 7 | ||||
-rw-r--r-- | drivers/acpi/acpica/evxfevnt.c | 42 |
4 files changed, 47 insertions, 44 deletions
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h index a561944fbaf9..e0e6affb0d80 100644 --- a/drivers/acpi/acpica/acevents.h +++ b/drivers/acpi/acpica/acevents.h | |||
@@ -80,6 +80,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list); | |||
80 | acpi_status | 80 | acpi_status |
81 | acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info); | 81 | acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info); |
82 | 82 | ||
83 | acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
84 | |||
83 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, | 85 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, |
84 | u32 gpe_number); | 86 | u32 gpe_number); |
85 | 87 | ||
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index 9413ac61e440..56de460570d6 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
@@ -94,6 +94,46 @@ acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info) | |||
94 | return_ACPI_STATUS(AE_OK); | 94 | return_ACPI_STATUS(AE_OK); |
95 | } | 95 | } |
96 | 96 | ||
97 | /******************************************************************************* | ||
98 | * | ||
99 | * FUNCTION: acpi_ev_enable_gpe | ||
100 | * | ||
101 | * PARAMETERS: gpe_event_info - GPE to enable | ||
102 | * | ||
103 | * RETURN: Status | ||
104 | * | ||
105 | * DESCRIPTION: Clear the given GPE from stale events and enable it. | ||
106 | * | ||
107 | ******************************************************************************/ | ||
108 | acpi_status | ||
109 | acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
110 | { | ||
111 | acpi_status status; | ||
112 | |||
113 | ACPI_FUNCTION_TRACE(ev_enable_gpe); | ||
114 | |||
115 | /* | ||
116 | * We will only allow a GPE to be enabled if it has either an | ||
117 | * associated method (_Lxx/_Exx) or a handler. Otherwise, the | ||
118 | * GPE will be immediately disabled by acpi_ev_gpe_dispatch the | ||
119 | * first time it fires. | ||
120 | */ | ||
121 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { | ||
122 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
123 | } | ||
124 | |||
125 | /* Clear the GPE (of stale events) */ | ||
126 | status = acpi_hw_clear_gpe(gpe_event_info); | ||
127 | if (ACPI_FAILURE(status)) { | ||
128 | return_ACPI_STATUS(status); | ||
129 | } | ||
130 | |||
131 | /* Enable the requested GPE */ | ||
132 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE); | ||
133 | |||
134 | return_ACPI_STATUS(status); | ||
135 | } | ||
136 | |||
97 | 137 | ||
98 | /******************************************************************************* | 138 | /******************************************************************************* |
99 | * | 139 | * |
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c index 77e8630043f8..0c6f3f878eb5 100644 --- a/drivers/acpi/acpica/evgpeblk.c +++ b/drivers/acpi/acpica/evgpeblk.c | |||
@@ -508,10 +508,8 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | |||
508 | * increment its reference counter. | 508 | * increment its reference counter. |
509 | */ | 509 | */ |
510 | if (gpe_event_info->runtime_count) { | 510 | if (gpe_event_info->runtime_count) { |
511 | acpi_set_gpe(gpe_device, gpe_number, | 511 | status = acpi_ev_enable_gpe(gpe_event_info); |
512 | ACPI_GPE_ENABLE); | 512 | goto enabled; |
513 | gpe_enabled_count++; | ||
514 | continue; | ||
515 | } | 513 | } |
516 | 514 | ||
517 | if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) { | 515 | if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) { |
@@ -530,6 +528,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | |||
530 | /* Enable this GPE */ | 528 | /* Enable this GPE */ |
531 | 529 | ||
532 | status = acpi_enable_gpe(gpe_device, gpe_number); | 530 | status = acpi_enable_gpe(gpe_device, gpe_number); |
531 | enabled: | ||
533 | if (ACPI_FAILURE(status)) { | 532 | if (ACPI_FAILURE(status)) { |
534 | ACPI_EXCEPTION((AE_INFO, status, | 533 | ACPI_EXCEPTION((AE_INFO, status, |
535 | "Could not enable GPE 0x%02X", | 534 | "Could not enable GPE 0x%02X", |
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c index 467fde961aef..b094cc0183d7 100644 --- a/drivers/acpi/acpica/evxfevnt.c +++ b/drivers/acpi/acpica/evxfevnt.c | |||
@@ -210,44 +210,6 @@ ACPI_EXPORT_SYMBOL(acpi_enable_event) | |||
210 | 210 | ||
211 | /******************************************************************************* | 211 | /******************************************************************************* |
212 | * | 212 | * |
213 | * FUNCTION: acpi_clear_and_enable_gpe | ||
214 | * | ||
215 | * PARAMETERS: gpe_event_info - GPE to enable | ||
216 | * | ||
217 | * RETURN: Status | ||
218 | * | ||
219 | * DESCRIPTION: Clear the given GPE from stale events and enable it. | ||
220 | * | ||
221 | ******************************************************************************/ | ||
222 | static acpi_status | ||
223 | acpi_clear_and_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
224 | { | ||
225 | acpi_status status; | ||
226 | |||
227 | /* | ||
228 | * We will only allow a GPE to be enabled if it has either an | ||
229 | * associated method (_Lxx/_Exx) or a handler. Otherwise, the | ||
230 | * GPE will be immediately disabled by acpi_ev_gpe_dispatch the | ||
231 | * first time it fires. | ||
232 | */ | ||
233 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { | ||
234 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
235 | } | ||
236 | |||
237 | /* Clear the GPE (of stale events) */ | ||
238 | status = acpi_hw_clear_gpe(gpe_event_info); | ||
239 | if (ACPI_FAILURE(status)) { | ||
240 | return_ACPI_STATUS(status); | ||
241 | } | ||
242 | |||
243 | /* Enable the requested GPE */ | ||
244 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE); | ||
245 | |||
246 | return_ACPI_STATUS(status); | ||
247 | } | ||
248 | |||
249 | /******************************************************************************* | ||
250 | * | ||
251 | * FUNCTION: acpi_set_gpe | 213 | * FUNCTION: acpi_set_gpe |
252 | * | 214 | * |
253 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 | 215 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
@@ -287,7 +249,7 @@ acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) | |||
287 | 249 | ||
288 | switch (action) { | 250 | switch (action) { |
289 | case ACPI_GPE_ENABLE: | 251 | case ACPI_GPE_ENABLE: |
290 | status = acpi_clear_and_enable_gpe(gpe_event_info); | 252 | status = acpi_ev_enable_gpe(gpe_event_info); |
291 | break; | 253 | break; |
292 | 254 | ||
293 | case ACPI_GPE_DISABLE: | 255 | case ACPI_GPE_DISABLE: |
@@ -414,7 +376,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) | |||
414 | if (gpe_event_info->runtime_count == 1) { | 376 | if (gpe_event_info->runtime_count == 1) { |
415 | status = acpi_ev_update_gpe_enable_mask(gpe_event_info); | 377 | status = acpi_ev_update_gpe_enable_mask(gpe_event_info); |
416 | if (ACPI_SUCCESS(status)) { | 378 | if (ACPI_SUCCESS(status)) { |
417 | status = acpi_clear_and_enable_gpe(gpe_event_info); | 379 | status = acpi_ev_enable_gpe(gpe_event_info); |
418 | } | 380 | } |
419 | if (ACPI_FAILURE(status)) { | 381 | if (ACPI_FAILURE(status)) { |
420 | gpe_event_info->runtime_count--; | 382 | gpe_event_info->runtime_count--; |