On Mon, Aug 12, 2013 at 06:01:25PM +0200, David Coppa wrote:
> On Mon, Aug 12, 2013 at 5:40 PM, Landry Breuil <lan...@rhaalovely.net> wrote:
> > Hi,
> >
> > this diff adds a sensor for acpibtn to show lid status. This allows
> > userland to monitor/react on lid close/open events, in case one is not
> > using machdep.lidsuspend. I know sysutils/upower can make use of this, i
> > just need to add the corresponding code there.
> >
> > comments ? I wonder if/how the case when aml_evalinteger() fails should
> > be handled in acpibtn_attach()..
> 
> Where's the diff?
> 
Err.. here it is.

Index: acpibtn.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpibtn.c,v
retrieving revision 1.34
diff -u -r1.34 acpibtn.c
--- acpibtn.c   2 Jan 2011 04:56:57 -0000       1.34
+++ acpibtn.c   12 Aug 2013 15:35:35 -0000
@@ -46,6 +46,9 @@
        struct acpi_softc       *sc_acpi;
        struct aml_node         *sc_devnode;
 
+       struct ksensor          sc_sens;
+       struct ksensordev       sc_sensdev;
+
        int                     sc_btn_type;
 #define        ACPIBTN_UNKNOWN 0
 #define ACPIBTN_LID    1
@@ -123,6 +126,7 @@
        struct acpibtn_softc    *sc = (struct acpibtn_softc *)self;
        struct acpi_attach_args *aa = aux;
        struct acpi_lid         *lid;
+       int64_t                 lid_open;
 
        sc->sc_acpi = (struct acpi_softc *)parent;
        sc->sc_devnode = aa->aaa_node;
@@ -143,6 +147,20 @@
 
        printf(": %s\n", sc->sc_devnode->name);
 
+       if (sc->sc_btn_type == ACPIBTN_LID) {
+               strlcpy(sc->sc_sensdev.xname, DEVNAME(sc),
+                   sizeof(sc->sc_sensdev.xname));
+               strlcpy(sc->sc_sens.desc, "lid open",
+                   sizeof(sc->sc_sens.desc));
+               sc->sc_sens.type = SENSOR_INDICATOR;
+               sensor_attach(&sc->sc_sensdev, &sc->sc_sens);
+               sensordev_install(&sc->sc_sensdev);
+
+               aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
+                   "_LID", 0, NULL, &lid_open);
+               sc->sc_sens.value = lid_open;
+       }
+
        aml_register_notify(sc->sc_devnode, aa->aaa_dev, acpibtn_notify,
            sc, ACPIDEV_NOPOLL);
 }
@@ -179,11 +197,12 @@
                 * _LID method.  0 means the lid is closed and we
                 * should go to sleep.
                 */
-               if (lid_suspend == 0)
-                       break;
                if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
                    "_LID", 0, NULL, &lid))
                        return (0);
+               sc->sc_sens.value = lid;
+               if (lid_suspend == 0)
+                       break;
                if (lid == 0)
                        goto sleep;
 #endif /* SMALL_KERNEL */

Reply via email to