Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/acpi Simplify and clean:



details:   https://anonhg.NetBSD.org/src/rev/cd8a7e2882c0
branches:  trunk
changeset: 751298:cd8a7e2882c0
user:      jruoho <jruoho%NetBSD.org@localhost>
date:      Sun Jan 31 11:16:18 2010 +0000

description:
Simplify and clean:

        * Semantics.
        * Remove ACPI_ACAD_DEBUG.
        * Reduce the amount of error reporting.
        * Remove the internal bookkeeping flags and variables;
          instead operate only with a single state variable.
        * Trust that the notify handler is doing its job;
          remove the refresh routine from the sensor.
        * Queue a status check upon resume; we want to know
          if the status has changed when in suspend (and it
          is unclear if a notify is sent to us).

diffstat:

 sys/dev/acpi/acpi_acad.c |  205 +++++++++++++++++-----------------------------
 1 files changed, 75 insertions(+), 130 deletions(-)

diffs (truncated from 331 to 300 lines):

diff -r 03bf61d32d37 -r cd8a7e2882c0 sys/dev/acpi/acpi_acad.c
--- a/sys/dev/acpi/acpi_acad.c  Sun Jan 31 10:54:10 2010 +0000
+++ b/sys/dev/acpi/acpi_acad.c  Sun Jan 31 11:16:18 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: acpi_acad.c,v 1.38 2010/01/31 07:34:10 jruoho Exp $    */
+/*     $NetBSD: acpi_acad.c,v 1.39 2010/01/31 11:16:18 jruoho Exp $    */
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -35,16 +35,12 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#if 0
-#define ACPI_ACAD_DEBUG
-#endif
-
 /*
  * ACPI AC Adapter driver.
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_acad.c,v 1.38 2010/01/31 07:34:10 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_acad.c,v 1.39 2010/01/31 11:16:18 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -57,20 +53,16 @@
 
 #include <dev/sysmon/sysmonvar.h>
 
-#define _COMPONENT     ACPI_ACAD_COMPONENT
-ACPI_MODULE_NAME       ("acpi_acad")
+#define _COMPONENT              ACPI_ACAD_COMPONENT
+ACPI_MODULE_NAME                ("acpi_acad")
 
 struct acpiacad_softc {
-       struct acpi_devnode *sc_node;   /* our ACPI devnode */
-       int sc_flags;                   /* see below */
-       int sc_status;                  /* status changed/not changed */
-       int sc_notifysent;              /* notify message sent */
-
-       struct sysmon_envsys *sc_sme;
-       struct sysmon_pswitch sc_smpsw; /* our sysmon glue */
-       envsys_data_t sc_sensor;
-
-       kmutex_t sc_mtx;
+       struct acpi_devnode     *sc_node;
+       struct sysmon_envsys    *sc_sme;
+       struct sysmon_pswitch    sc_smpsw;
+       envsys_data_t            sc_sensor;
+       kmutex_t                 sc_mutex;
+       int                      sc_status;
 };
 
 static const char * const acad_hid[] = {
@@ -78,23 +70,13 @@
        NULL
 };
 
-#define        AACAD_F_VERBOSE         0x01    /* verbose events */
-#define AACAD_F_AVAILABLE      0x02    /* information is available */
-#define AACAD_F_STCHANGED      0x04    /* status changed */
-
-#define AACAD_SET(sc, f)       (void)((sc)->sc_flags |= (f))
-#define AACAD_CLEAR(sc, f)     (void)((sc)->sc_flags &= ~(f))
-#define AACAD_ISSET(sc, f)     ((sc)->sc_flags & (f))
-
-static int  acpiacad_match(device_t, cfdata_t, void *);
-static void acpiacad_attach(device_t, device_t, void *);
-static int  acpiacad_detach(device_t, int);
-static void acpiacad_get_status(void *);
-static void acpiacad_clear_status(struct acpiacad_softc *);
-static void acpiacad_notify_handler(ACPI_HANDLE, UINT32, void *);
-static void acpiacad_init_envsys(device_t);
-static void acpiacad_refresh(struct sysmon_envsys *, envsys_data_t *);
-static bool acpiacad_resume(device_t, pmf_qual_t);
+static int     acpiacad_match(device_t, cfdata_t, void *);
+static void    acpiacad_attach(device_t, device_t, void *);
+static int     acpiacad_detach(device_t, int);
+static bool    acpiacad_resume(device_t, pmf_qual_t);
+static void    acpiacad_get_status(void *);
+static void    acpiacad_notify_handler(ACPI_HANDLE, uint32_t, void *);
+static void    acpiacad_init_envsys(device_t);
 
 CFATTACH_DECL_NEW(acpiacad, sizeof(struct acpiacad_softc),
     acpiacad_match, acpiacad_attach, acpiacad_detach, NULL);
@@ -130,36 +112,23 @@
        aprint_naive(": ACPI AC Adapter\n");
        aprint_normal(": ACPI AC Adapter\n");
 
+       sc->sc_sme = NULL;
+       sc->sc_status = -1;
        sc->sc_node = aa->aa_node;
-       mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE);
+
+       mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE);
 
        sc->sc_smpsw.smpsw_name = device_xname(self);
        sc->sc_smpsw.smpsw_type = PSWITCH_TYPE_ACADAPTER;
-       if (sysmon_pswitch_register(&sc->sc_smpsw) != 0) {
-               aprint_error_dev(self, "unable to register with sysmon\n");
-               return;
-       }
 
-       sc->sc_sme = NULL;
-       sc->sc_status = -1;
+       (void)sysmon_pswitch_register(&sc->sc_smpsw);
+       (void)pmf_device_register(self, NULL, acpiacad_resume);
 
        rv = AcpiInstallNotifyHandler(sc->sc_node->ad_handle,
            ACPI_ALL_NOTIFY, acpiacad_notify_handler, self);
-       if (ACPI_FAILURE(rv)) {
-               aprint_error_dev(self, "unable to register DEVICE and SYSTEM "
-                   "NOTIFY handler: %s\n", AcpiFormatException(rv));
-               return;
-       }
 
-#ifdef ACPI_ACAD_DEBUG
-       /* Display the current state. */
-       sc->sc_flags = AACAD_F_VERBOSE;
-#endif
-
-       if (!pmf_device_register(self, NULL, acpiacad_resume))
-               aprint_error_dev(self, "couldn't establish power handler\n");
-
-       acpiacad_init_envsys(self);
+       if (ACPI_SUCCESS(rv))
+               acpiacad_init_envsys(self);
 }
 
 /*
@@ -179,7 +148,7 @@
        if (ACPI_FAILURE(rv))
                return EBUSY;
 
-       mutex_destroy(&sc->sc_mtx);
+       mutex_destroy(&sc->sc_mutex);
 
        if (sc->sc_sme != NULL)
                sysmon_envsys_unregister(sc->sc_sme);
@@ -193,14 +162,14 @@
 /*
  * acpiacad_resume:
  *
- *     Clear status after resuming to fetch new status.
+ *     Queue a new status check.
  */
 static bool
 acpiacad_resume(device_t dv, pmf_qual_t qual)
 {
-       struct acpiacad_softc *sc = device_private(dv);
 
-       acpiacad_clear_status(sc);
+       (void)AcpiOsExecute(OSL_NOTIFY_HANDLER, acpiacad_get_status, dv);
+
        return true;
 }
 
@@ -217,48 +186,49 @@
        ACPI_INTEGER status;
        ACPI_STATUS rv;
 
+       mutex_enter(&sc->sc_mutex);
+
        rv = acpi_eval_integer(sc->sc_node->ad_handle, "_PSR", &status);
-       if (ACPI_FAILURE(rv))
-               return;
 
-       mutex_enter(&sc->sc_mtx);
-       sc->sc_notifysent = 0;
-       if (sc->sc_status != status) {
-               sc->sc_status = status;
-               if (status)
-                       sc->sc_sensor.value_cur = 1;
-               else
-                       sc->sc_sensor.value_cur = 0;
-               AACAD_SET(sc, AACAD_F_STCHANGED);
+       if (ACPI_FAILURE(rv))
+               goto fail;
+
+       if (status != 0 && status != 1) {
+               rv = AE_BAD_VALUE;
+               goto fail;
        }
 
-       sc->sc_sensor.state = ENVSYS_SVALID;
-       AACAD_SET(sc, AACAD_F_AVAILABLE);
-       /*
-        * If status has changed, send the event.
-        *
-        * PSWITCH_EVENT_RELEASED : AC offline
-        * PSWITCH_EVENT_PRESSED  : AC online
-        */
-       if (AACAD_ISSET(sc, AACAD_F_STCHANGED)) {
-               sysmon_pswitch_event(&sc->sc_smpsw, status ?
+       if (sc->sc_status != status) {
+
+               /*
+                * If status has changed, send the event:
+                *
+                * PSWITCH_EVENT_PRESSED  : _PSR = 1 : AC online.
+                * PSWITCH_EVENT_RELEASED : _PSR = 0 : AC offline.
+                */
+               sysmon_pswitch_event(&sc->sc_smpsw, (status != 0) ?
                    PSWITCH_EVENT_PRESSED : PSWITCH_EVENT_RELEASED);
-               if (AACAD_ISSET(sc, AACAD_F_VERBOSE))
-                       aprint_verbose_dev(dv, "AC adapter %sconnected\n",
-                           status == 0 ? "not " : "");
+
+               aprint_debug_dev(dv, "AC adapter %sconnected\n",
+                   status == 0 ? "not " : "");
        }
-       mutex_exit(&sc->sc_mtx);
-}
+
+       sc->sc_status = status;
+       sc->sc_sensor.state = ENVSYS_SVALID;
+       sc->sc_sensor.value_cur = sc->sc_status;
+
+       mutex_exit(&sc->sc_mutex);
 
-/*
- * Clear status
- */
-static void
-acpiacad_clear_status(struct acpiacad_softc *sc)
-{
+       return;
+
+fail:
+       sc->sc_status = -1;
        sc->sc_sensor.state = ENVSYS_SINVALID;
-       AACAD_CLEAR(sc, AACAD_F_AVAILABLE);
-       AACAD_CLEAR(sc, AACAD_F_STCHANGED);
+
+       aprint_debug_dev(dv, "failed to evaluate _PSR: %s\n",
+           AcpiFormatException(rv));
+
+       mutex_exit(&sc->sc_mutex);
 }
 
 /*
@@ -267,11 +237,10 @@
  *     Callback from ACPI interrupt handler to notify us of an event.
  */
 static void
-acpiacad_notify_handler(ACPI_HANDLE handle, UINT32 notify, void *context)
+acpiacad_notify_handler(ACPI_HANDLE handle, uint32_t notify, void *context)
 {
+       static const int handler = OSL_NOTIFY_HANDLER;
        device_t dv = context;
-       struct acpiacad_softc *sc = device_private(dv);
-       ACPI_STATUS rv;
 
        switch (notify) {
        /*
@@ -293,27 +262,11 @@
        case ACPI_NOTIFY_DeviceCheck:
        case ACPI_NOTIFY_PowerSourceStatusChanged:
        case ACPI_NOTIFY_BatteryInformationChanged:
-               mutex_enter(&sc->sc_mtx);
-               acpiacad_clear_status(sc);
-               mutex_exit(&sc->sc_mtx);
-               if (sc->sc_status == -1 || !sc->sc_notifysent) {
-                       rv = AcpiOsExecute(OSL_NOTIFY_HANDLER,
-                           acpiacad_get_status, dv);
-                       if (ACPI_FAILURE(rv))
-                               aprint_error_dev(dv,
-                                   "unable to queue status check: %s\n",
-                                   AcpiFormatException(rv));
-                       sc->sc_notifysent = 1;
-#ifdef ACPI_ACAD_DEBUG
-                       aprint_debug_dev(dv, "received notify message: 0x%x\n",
-                           notify);
-#endif
-               }
+               (void)AcpiOsExecute(handler, acpiacad_get_status, dv);
                break;
 
        default:
-               aprint_error_dev(dv, "received unknown notify message: 0x%x\n",
-                   notify);
+               aprint_error_dev(dv, "unknown notify 0x%02X\n", notify);
        }
 }
 
@@ -323,22 +276,24 @@
        struct acpiacad_softc *sc = device_private(dv);
 
        sc->sc_sme = sysmon_envsys_create();
-       sc->sc_sensor.state = ENVSYS_SVALID;
+
+       sc->sc_sensor.state = ENVSYS_SINVALID;
        sc->sc_sensor.units = ENVSYS_INDICATOR;
-       strlcpy(sc->sc_sensor.desc, "connected", sizeof(sc->sc_sensor.desc));
+
+       (void)strlcpy(sc->sc_sensor.desc, "connected", ENVSYS_DESCLEN);
 
        if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor) != 0)



Home | Main Index | Thread Index | Old Index