--- a/drivers/acpi/events/evgpeblk.c 2004-02-26 16:43:24.000000000 +0800 +++ b/drivers/acpi/events/evgpeblk.c 2004-02-26 17:53:45.000000000 +0800 @@ -48,7 +48,83 @@ #define _COMPONENT ACPI_EVENTS ACPI_MODULE_NAME ("evgpeblk") +#define MAX_WAKEUP_GPES 30 +static u32 wakeup_gpes[MAX_WAKEUP_GPES]; +static int wakeup_gpes_index = 0; +static acpi_status +acpi_ev_save_wakeup_gpes ( + acpi_handle obj_handle, + u32 level, + void *obj_desc, + void **return_value) +{ + acpi_status status; + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; + union acpi_object *package = NULL; + union acpi_object *element = NULL; + + ACPI_FUNCTION_TRACE("acpi_ev_save_wakeup_gpes"); + + /* _PRW */ + status = acpi_evaluate_object(obj_handle, "_PRW", NULL, &buffer); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS (AE_OK); + } + + package = (union acpi_object *) buffer.pointer; + if (package->package.count < 2) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Bad _PRW package\n")); + goto end; + } + + element = &(package->package.elements[0]); + if (element->type != ACPI_TYPE_INTEGER) { + /* TBD: support GPE devices */ + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Bad _PRW package\n")); + goto end; + } + wakeup_gpes[wakeup_gpes_index++] = element->integer.value; + +end: + acpi_os_free(buffer.pointer); + return_ACPI_STATUS (AE_OK); +} + +static acpi_status +acpi_ev_wakeup_gpes_initialize (void) +{ + acpi_status status; + int i = 0; + + ACPI_FUNCTION_TRACE("acpi_ev_wakeup_gpes_initialize"); +printk("hahah\n"); + status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, acpi_ev_save_wakeup_gpes, + NULL, NULL); + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wakeup GPEs: ")); + while (i < wakeup_gpes_index) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%8.8x ", wakeup_gpes[i])); + i ++; + } + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "\n")); + + return status; +} + +static int acpi_ev_is_wakeup_gpe(u32 gpe_number) +{ + int i = 0; + while (i < wakeup_gpes_index) + { + if (wakeup_gpes[i] == gpe_number) + return 1; + i ++; + } + + return 0; +} /******************************************************************************* * * FUNCTION: acpi_ev_valid_gpe_event @@ -225,6 +301,10 @@ acpi_ev_save_method_info ( /* Convert the last two characters of the name to the GPE Number */ gpe_number = ACPI_STRTOUL (&name[2], NULL, 16); + /* Skip wakeup GPEs */ + if (acpi_ev_is_wakeup_gpe(gpe_number)) + return_ACPI_STATUS (AE_OK); + if (gpe_number == ACPI_UINT32_MAX) { /* Conversion failed; invalid method, just ignore it */ @@ -793,7 +873,11 @@ acpi_ev_gpe_initialize (void) if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - + /* Find all wakeup GPEs */ + status = acpi_ev_wakeup_gpes_initialize(); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } /* * Initialize the GPE Blocks defined in the FADT *