aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/evgpeinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/acpica/evgpeinit.c')
-rw-r--r--drivers/acpi/acpica/evgpeinit.c61
1 files changed, 26 insertions, 35 deletions
diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c
index 3084c5de1bba..ce9aa9f9a972 100644
--- a/drivers/acpi/acpica/evgpeinit.c
+++ b/drivers/acpi/acpica/evgpeinit.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2010, Intel Corp. 8 * Copyright (C) 2000 - 2011, Intel Corp.
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -45,11 +45,27 @@
45#include "accommon.h" 45#include "accommon.h"
46#include "acevents.h" 46#include "acevents.h"
47#include "acnamesp.h" 47#include "acnamesp.h"
48#include "acinterp.h"
49 48
50#define _COMPONENT ACPI_EVENTS 49#define _COMPONENT ACPI_EVENTS
51ACPI_MODULE_NAME("evgpeinit") 50ACPI_MODULE_NAME("evgpeinit")
52 51
52/*
53 * Note: History of _PRW support in ACPICA
54 *
55 * Originally (2000 - 2010), the GPE initialization code performed a walk of
56 * the entire namespace to execute the _PRW methods and detect all GPEs
57 * capable of waking the system.
58 *
59 * As of 10/2010, the _PRW method execution has been removed since it is
60 * actually unnecessary. The host OS must in fact execute all _PRW methods
61 * in order to identify the device/power-resource dependencies. We now put
62 * the onus on the host OS to identify the wake GPEs as part of this process
63 * and to inform ACPICA of these GPEs via the acpi_setup_gpe_for_wake interface. This
64 * not only reduces the complexity of the ACPICA initialization code, but in
65 * some cases (on systems with very large namespaces) it should reduce the
66 * kernel boot time as well.
67 */
68
53/******************************************************************************* 69/*******************************************************************************
54 * 70 *
55 * FUNCTION: acpi_ev_gpe_initialize 71 * FUNCTION: acpi_ev_gpe_initialize
@@ -210,8 +226,7 @@ acpi_status acpi_ev_gpe_initialize(void)
210 * 226 *
211 * DESCRIPTION: Check for new GPE methods (_Lxx/_Exx) made available as a 227 * DESCRIPTION: Check for new GPE methods (_Lxx/_Exx) made available as a
212 * result of a Load() or load_table() operation. If new GPE 228 * result of a Load() or load_table() operation. If new GPE
213 * methods have been installed, register the new methods and 229 * methods have been installed, register the new methods.
214 * enable and runtime GPEs that are associated with them.
215 * 230 *
216 ******************************************************************************/ 231 ******************************************************************************/
217 232
@@ -223,7 +238,7 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
223 acpi_status status = AE_OK; 238 acpi_status status = AE_OK;
224 239
225 /* 240 /*
226 * 2) Find any _Lxx/_Exx GPE methods that have just been loaded. 241 * Find any _Lxx/_Exx GPE methods that have just been loaded.
227 * 242 *
228 * Any GPEs that correspond to new _Lxx/_Exx methods are immediately 243 * Any GPEs that correspond to new _Lxx/_Exx methods are immediately
229 * enabled. 244 * enabled.
@@ -236,10 +251,9 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
236 return; 251 return;
237 } 252 }
238 253
254 walk_info.count = 0;
239 walk_info.owner_id = table_owner_id; 255 walk_info.owner_id = table_owner_id;
240 walk_info.execute_by_owner_id = TRUE; 256 walk_info.execute_by_owner_id = TRUE;
241 walk_info.count = 0;
242 walk_info.enable_this_gpe = TRUE;
243 257
244 /* Walk the interrupt level descriptor list */ 258 /* Walk the interrupt level descriptor list */
245 259
@@ -300,9 +314,7 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
300 * xx - is the GPE number [in HEX] 314 * xx - is the GPE number [in HEX]
301 * 315 *
302 * If walk_info->execute_by_owner_id is TRUE, we only execute examine GPE methods 316 * If walk_info->execute_by_owner_id is TRUE, we only execute examine GPE methods
303 * with that owner. 317 * with that owner.
304 * If walk_info->enable_this_gpe is TRUE, the GPE that is referred to by a GPE
305 * method is immediately enabled (Used for Load/load_table operators)
306 * 318 *
307 ******************************************************************************/ 319 ******************************************************************************/
308 320
@@ -315,8 +327,6 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
315 struct acpi_gpe_walk_info *walk_info = 327 struct acpi_gpe_walk_info *walk_info =
316 ACPI_CAST_PTR(struct acpi_gpe_walk_info, context); 328 ACPI_CAST_PTR(struct acpi_gpe_walk_info, context);
317 struct acpi_gpe_event_info *gpe_event_info; 329 struct acpi_gpe_event_info *gpe_event_info;
318 struct acpi_namespace_node *gpe_device;
319 acpi_status status;
320 u32 gpe_number; 330 u32 gpe_number;
321 char name[ACPI_NAME_SIZE + 1]; 331 char name[ACPI_NAME_SIZE + 1];
322 u8 type; 332 u8 type;
@@ -414,36 +424,17 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
414 return_ACPI_STATUS(AE_OK); 424 return_ACPI_STATUS(AE_OK);
415 } 425 }
416 426
427 /* Disable the GPE in case it's been enabled already. */
428 (void)acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE);
429
417 /* 430 /*
418 * Add the GPE information from above to the gpe_event_info block for 431 * Add the GPE information from above to the gpe_event_info block for
419 * use during dispatch of this GPE. 432 * use during dispatch of this GPE.
420 */ 433 */
434 gpe_event_info->flags &= ~(ACPI_GPE_DISPATCH_MASK);
421 gpe_event_info->flags |= (u8)(type | ACPI_GPE_DISPATCH_METHOD); 435 gpe_event_info->flags |= (u8)(type | ACPI_GPE_DISPATCH_METHOD);
422 gpe_event_info->dispatch.method_node = method_node; 436 gpe_event_info->dispatch.method_node = method_node;
423 437
424 /*
425 * Enable this GPE if requested. This only happens when during the
426 * execution of a Load or load_table operator. We have found a new
427 * GPE method and want to immediately enable the GPE if it is a
428 * runtime GPE.
429 */
430 if (walk_info->enable_this_gpe) {
431
432 walk_info->count++;
433 gpe_device = walk_info->gpe_device;
434
435 if (gpe_device == acpi_gbl_fadt_gpe_device) {
436 gpe_device = NULL;
437 }
438
439 status = acpi_enable_gpe(gpe_device, gpe_number);
440 if (ACPI_FAILURE(status)) {
441 ACPI_EXCEPTION((AE_INFO, status,
442 "Could not enable GPE 0x%02X",
443 gpe_number));
444 }
445 }
446
447 ACPI_DEBUG_PRINT((ACPI_DB_LOAD, 438 ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
448 "Registered GPE method %s as GPE number 0x%.2X\n", 439 "Registered GPE method %s as GPE number 0x%.2X\n",
449 name, gpe_number)); 440 name, gpe_number));