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 **);
