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