acpi: sync GPE with FreeBSD 8.0 (and according the acpi api)
authorMagliano Andrea <masterblaster@tiscali.it>
Thu, 24 Feb 2011 16:37:44 +0000 (17:37 +0100)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 27 Mar 2011 10:34:00 +0000 (18:34 +0800)
* use AcpiSetGpeWakeMask(), as AcpiEnableGpe() is already done in
  embedded controller initialization code. AcpiSetGpeWakeMask()
  is needed anyway to mark the gpe as wakable.
  (AcpiEnableGpe() enableas automatically only runtime GPEs now)

* using AcpiFinishGpe() in EcGpeQueryHandler() (as fbsd does) seems
  to make the system reactive as it should (was sensibly slowly
  without that)

sys/dev/acpica5/acpi.c
sys/dev/acpica5/acpi_button.c
sys/dev/acpica5/acpi_ec.c
sys/dev/acpica5/acpi_lid.c
sys/dev/acpica5/acpivar.h

index 2f5530e..223d296 100644 (file)
@@ -1592,6 +1592,7 @@ acpi_probe_order(ACPI_HANDLE handle, int *order)
 static ACPI_STATUS
 acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
 {
+    struct acpi_prw_data prw;
     ACPI_OBJECT_TYPE type;
     ACPI_HANDLE h;
     device_t bus, child;
@@ -1601,25 +1602,25 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
+    if (acpi_disabled("children"))
+        return_ACPI_STATUS (AE_OK);
+
     /* Skip this device if we think we'll have trouble with it. */
     if (acpi_avoid(handle))
        return_ACPI_STATUS (AE_OK);
 
     bus = (device_t)context;
     if (ACPI_SUCCESS(AcpiGetType(handle, &type))) {
+        handle_str = acpi_name(handle);
        switch (type) {
        case ACPI_TYPE_DEVICE:
        case ACPI_TYPE_PROCESSOR:
        case ACPI_TYPE_THERMAL:
        case ACPI_TYPE_POWER:
-           if (acpi_disabled("children"))
-               break;
-
            /*
             * Since we scan from \, be sure to skip system scope objects.
             * At least \_SB and \_TZ are detected as devices (ACPI-CA bug?)
             */
-           handle_str = acpi_name(handle);
            for (search = scopes; *search != NULL; search++) {
                if (strcmp(handle_str, *search) == 0)
                    break;
@@ -1627,6 +1628,9 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
            if (*search != NULL)
                break;
 
+        if (type == ACPI_TYPE_DEVICE && acpi_parse_prw(handle, &prw) == 0)
+            AcpiSetupGpeForWake(handle, prw.gpe_handle, prw.gpe_bit);
+
            /* 
             * Create a placeholder device for this node.  Sort the
             * placeholder so that the probe/attach passes will run
@@ -2468,26 +2472,7 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state)
     return_ACPI_STATUS (status);
 }
 
-/* Initialize a device's wake GPE. */
-int
-acpi_wake_init(device_t dev)
-{
-    struct acpi_prw_data prw;
-
-    /* Evaluate _PRW to find the GPE. */
-    if (acpi_parse_prw(acpi_get_handle(dev), &prw) != 0)
-       return (ENXIO);
-
-    /* Set ACPI_GPE_CAN_WAKE on the GPE */
-    if (ACPI_FAILURE(AcpiSetupGpeForWake(prw.gpe_handle, NULL, prw.gpe_bit))) {
-       device_printf(dev, "enable GPE failed\n");
-       return (ENXIO);
-    }
-
-    return (0);
-}
-
-/* Enable or disable the device's wake GPE. */
+/* Enable or disable the device's GPE. */
 int
 acpi_wake_set_enable(device_t dev, int enable)
 {
@@ -2501,14 +2486,16 @@ acpi_wake_set_enable(device_t dev, int enable)
 
     flags = acpi_get_flags(dev);
     if (enable) {
-       status = AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit);
+        status = AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit,
+                                    ACPI_GPE_ENABLE);
        if (ACPI_FAILURE(status)) {
            device_printf(dev, "enable wake failed\n");
            return (ENXIO);
        }
        acpi_set_flags(dev, flags | ACPI_FLAG_WAKE_ENABLED);
     } else {
-       status = AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit);
+        status = AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit,
+                                    ACPI_GPE_DISABLE);
        if (ACPI_FAILURE(status)) {
            device_printf(dev, "disable wake failed\n");
            return (ENXIO);
@@ -2538,7 +2525,7 @@ acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate)
      * and set _PSW.
      */
     if (sstate > prw.lowest_wake) {
-       AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit);
+        AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, ACPI_GPE_DISABLE);
        if (bootverbose)
            device_printf(dev, "wake_prep disabled wake for %s (S%d)\n",
                acpi_name(handle), sstate);
@@ -2575,7 +2562,7 @@ acpi_wake_run_prep(ACPI_HANDLE handle, int sstate)
      * clear _PSW and turn off any power resources it used.
      */
     if (sstate > prw.lowest_wake) {
-       AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit);
+        AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, ACPI_GPE_ENABLE);
        if (bootverbose)
            device_printf(dev, "run_prep re-enabled %s\n", acpi_name(handle));
     } else {
index 44f582a..974e29b 100644 (file)
@@ -162,8 +162,7 @@ acpi_button_attach(device_t dev)
        return_VALUE (ENXIO);
     }
 
-    /* Enable the GPE for wake/runtime. */
-    acpi_wake_init(dev);
+    /* Enable the GPE for wake */
     acpi_wake_set_enable(dev, 1);
     
     return_VALUE (0);
index 432cb5a..7d4f02e 100644 (file)
@@ -658,6 +658,14 @@ EcGpeQueryHandler(void *Context)
        device_printf(sc->ec_dev, "evaluation of query method %s failed: %s\n",
            qxx, AcpiFormatException(Status));
     }
+
+    /* Reenable runtime GPE if its execution was deferred. */
+    if (sc->ec_sci_pend) {
+        Status = AcpiFinishGpe(sc->ec_gpehandle, sc->ec_gpebit);
+        if (ACPI_FAILURE(Status))
+            device_printf(sc->ec_dev, "reenabling runtime GPE failed: %s\n",
+                          AcpiFormatException(Status));
+    }
 }
 
 /*
index 3ad94f1..fb74cae 100644 (file)
@@ -117,8 +117,7 @@ acpi_lid_attach(device_t dev)
     AcpiInstallNotifyHandler(sc->lid_handle, ACPI_DEVICE_NOTIFY,
                             acpi_lid_notify_handler, sc);
 
-    /* Enable the GPE for wake/runtime. */
-    acpi_wake_init(dev);
+    /* Enable the GPE for wake */
     acpi_wake_set_enable(dev, 1);
 
     return (0);
index 63c614d..7afffd8 100644 (file)
@@ -337,7 +337,6 @@ ACPI_STATUS acpi_SetIntrModel(int model);
 int            acpi_ReqSleepState(struct acpi_softc *sc, int state);
 int            acpi_AckSleepState(struct apm_clone_data *clone, int error);
 ACPI_STATUS    acpi_SetSleepState(struct acpi_softc *sc, int state);
-int            acpi_wake_init(device_t dev);
 int            acpi_wake_set_enable(device_t dev, int enable);
 int            acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
 ACPI_STATUS    acpi_Startup(void);