Index: sys/dev/acpi/acpi.c
===================================================================
RCS file: /cvsroot/src/sys/dev/acpi/acpi.c,v
retrieving revision 1.66
diff -u -r1.66 acpi.c
--- sys/dev/acpi/acpi.c 7 Jun 2004 15:33:17 -0000 1.66
+++ sys/dev/acpi/acpi.c 17 Jun 2004 04:16:17 -0000
@@ -954,6 +954,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 17 Jun 2004 04:16:17 -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 17 Jun 2004 04:16:17 -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 17 Jun 2004 04:16:17 -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.20
diff -u -r1.20 acpivar.h
--- sys/dev/acpi/acpivar.h 26 May 2004 17:15:17 -0000 1.20
+++ sys/dev/acpi/acpivar.h 17 Jun 2004 04:16:17 -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 **);