Index: sys/dev/acpi/acpi.c =================================================================== RCS file: /cvsroot/src/sys/dev/acpi/acpi.c,v retrieving revision 1.64 diff -u -r1.64 acpi.c --- sys/dev/acpi/acpi.c 1 May 2004 12:03:48 -0000 1.64 +++ sys/dev/acpi/acpi.c 4 May 2004 15:58:07 -0000 @@ -908,6 +908,37 @@ return 0; } +/* + * acpi_set_wake_gpe + * + * Set GPE as both Runtime and Wake + */ +void +acpi_set_wake_gpe(ACPI_HANDLE handle) +{ + ACPI_BUFFER buf; + ACPI_STATUS rv; + ACPI_OBJECT *p, *elt; + + + rv = acpi_eval_struct(handle, METHOD_NAME__PRW, &buf); + if (ACPI_FAILURE(rv)) + return; /* just ignore */ + + p = buf.Pointer; + if (p->Type != ACPI_TYPE_PACKAGE || p->Package.Count < 2) + goto out; /* just ignore */ + + elt = p->Package.Elements; + + /* TBD: package support */ + AcpiSetGpeType(NULL, elt[0].Integer.Value, ACPI_GPE_TYPE_WAKE_RUN); + AcpiEnableGpe(NULL, elt[0].Integer.Value, ACPI_NOT_ISR); + + out: + AcpiOsFree(buf.Pointer); +} + /***************************************************************************** * ACPI sleep support. Index: sys/dev/acpi/acpi_button.c =================================================================== RCS file: /cvsroot/src/sys/dev/acpi/acpi_button.c,v retrieving revision 1.16 diff -u -r1.16 acpi_button.c --- sys/dev/acpi/acpi_button.c 1 May 2004 12:03:48 -0000 1.16 +++ sys/dev/acpi/acpi_button.c 4 May 2004 15:58:08 -0000 @@ -146,6 +146,8 @@ return; } + acpi_set_wake_gpe(sc->sc_node->ad_handle); + #ifdef ACPI_BUT_DEBUG /* Display the current state when it changes. */ sc->sc_flags = ACPIBUT_F_VERBOSE; Index: sys/dev/acpi/acpi_ec.c =================================================================== RCS file: /cvsroot/src/sys/dev/acpi/acpi_ec.c,v retrieving revision 1.31 diff -u -r1.31 acpi_ec.c --- sys/dev/acpi/acpi_ec.c 1 May 2004 12:03:48 -0000 1.31 +++ sys/dev/acpi/acpi_ec.c 4 May 2004 15:58:08 -0000 @@ -246,7 +246,7 @@ UINT8 Data; } EC_REQUEST; -static void EcGpeHandler(void *Context); +static UINT32 EcGpeHandler(void *Context); static ACPI_STATUS EcSpaceSetup(ACPI_HANDLE Region, UINT32 Function, void *Context, void **return_Context); static ACPI_STATUS EcSpaceHandler(UINT32 Function, @@ -426,14 +426,27 @@ ecdt_sc->sc_glk = 1; rv = AcpiInstallGpeHandler(NULL, ecdt_sc->sc_gpebit, - ACPI_EVENT_EDGE_TRIGGERED, EcGpeHandler, ecdt_sc); + (UINT32)ACPI_GPE_EDGE_TRIGGERED, EcGpeHandler, ecdt_sc); if (ACPI_FAILURE(rv)) { printf("%s: unable to install GPE handler: %s\n", - parent->dv_xname, - AcpiFormatException(rv)); + parent->dv_xname, AcpiFormatException(rv)); goto out3; } + rv = AcpiSetGpeType(NULL, ecdt_sc->sc_gpebit, ACPI_GPE_TYPE_RUNTIME); + if (ACPI_FAILURE(rv)) { + printf("%s: unable to set GPE type: %s\n", + parent->dv_xname, AcpiFormatException(rv)); + goto out4; + } + + rv = AcpiEnableGpe(NULL, ecdt_sc->sc_gpebit, ACPI_NOT_ISR); + if (ACPI_FAILURE(rv)) { + printf("%s: unable to enable GPE: %s\n", + parent->dv_xname, AcpiFormatException(rv)); + goto out4; + } + rv = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_EC, EcSpaceHandler, EcSpaceSetup, ecdt_sc); if (ACPI_FAILURE(rv)) { @@ -592,23 +605,41 @@ * cleared before re-enabling the GPE. */ rv = AcpiInstallGpeHandler(NULL, sc->sc_gpebit, - ACPI_EVENT_EDGE_TRIGGERED, EcGpeHandler, sc); + (UINT32)ACPI_GPE_EDGE_TRIGGERED, EcGpeHandler, sc); if (ACPI_FAILURE(rv)) { printf("%s: unable to install GPE handler: %s\n", sc->sc_dev.dv_xname, AcpiFormatException(rv)); goto out; } + rv = AcpiSetGpeType(NULL, sc->sc_gpebit, ACPI_GPE_TYPE_RUNTIME); + if (ACPI_FAILURE(rv)) { + printf("%s: unable to set GPE type: %s\n", + sc->sc_dev.dv_xname, AcpiFormatException(rv)); + goto out2; + } + + rv = AcpiEnableGpe(NULL, sc->sc_gpebit, ACPI_NOT_ISR); + if (ACPI_FAILURE(rv)) { + printf("%s: unable to enable GPE: %s\n", + sc->sc_dev.dv_xname, AcpiFormatException(rv)); + goto out2; + } + /* Install address space handler. */ rv = AcpiInstallAddressSpaceHandler(sc->sc_handle, ACPI_ADR_SPACE_EC, EcSpaceHandler, EcSpaceSetup, sc); if (ACPI_FAILURE(rv)) { printf("%s: unable to install address space handler: %s\n", sc->sc_dev.dv_xname, AcpiFormatException(rv)); - (void)AcpiRemoveGpeHandler(NULL, sc->sc_gpebit, - EcGpeHandler); + goto out2; } + return_VOID; + out2: + (void)AcpiRemoveGpeHandler(NULL, sc->sc_gpebit, + EcGpeHandler); + out: acpi_resource_cleanup(&res); return_VOID; @@ -685,7 +716,7 @@ return_VOID; } -static void +static UINT32 EcGpeHandler(void *Context) { struct acpi_ec_softc *sc = Context; @@ -716,6 +747,8 @@ printf("%s: failed to enqueue query handler: %s\n", sc->sc_dev.dv_xname, AcpiFormatException(rv)); } + + return 0; /* XXX not used in ACPI-CA */ } static ACPI_STATUS Index: sys/dev/acpi/acpi_lid.c =================================================================== RCS file: /cvsroot/src/sys/dev/acpi/acpi_lid.c,v retrieving revision 1.15 diff -u -r1.15 acpi_lid.c --- sys/dev/acpi/acpi_lid.c 1 May 2004 12:03:48 -0000 1.15 +++ sys/dev/acpi/acpi_lid.c 4 May 2004 15:58:08 -0000 @@ -119,6 +119,8 @@ sc->sc_dev.dv_xname, AcpiFormatException(rv)); return; } + + acpi_set_wake_gpe(sc->sc_node->ad_handle); } /* Index: sys/dev/acpi/acpivar.h =================================================================== RCS file: /cvsroot/src/sys/dev/acpi/acpivar.h,v retrieving revision 1.19 diff -u -r1.19 acpivar.h --- sys/dev/acpi/acpivar.h 11 Apr 2004 10:36:35 -0000 1.19 +++ sys/dev/acpi/acpivar.h 4 May 2004 15:58:08 -0000 @@ -260,6 +260,7 @@ int acpi_probe(void); int acpi_match_hid(ACPI_DEVICE_INFO *, const char * const *); +void acpi_set_wake_gpe(ACPI_HANDLE); ACPI_STATUS acpi_eval_integer(ACPI_HANDLE, char *, ACPI_INTEGER *); ACPI_STATUS acpi_eval_string(ACPI_HANDLE, char *, char **);