> Date: Wed, 6 Jan 2016 10:05:48 +0100 > From: Martin Pieuchot <m...@openbsd.org> > > My x220 never generates an event when the LID opens. So after > suspending by closing the lid the corresponding sensors will always > report a closed lid: > > $ sysctl hw.sensors.acpibtn0 > hw.sensors.acpibtn0.indicator0=Off (lid open) > > This confuses programs like upowerd(8) used at least by GNOME which then > decides to deactivate my screen when an external monitor is plugged in. > > Diff below fixes that by adding a resume hook to acpibtn(4) in order to > re-evaluate the "_LID" status of the node.
I think we're supposed to see a notification, but it doesn't surprise me at all that we don't get one. so ok kettenis@ > Index: acpibtn.c > =================================================================== > RCS file: /cvs/src/sys/dev/acpi/acpibtn.c,v > retrieving revision 1.41 > diff -u -p -r1.41 acpibtn.c > --- acpibtn.c 27 Jan 2015 19:40:14 -0000 1.41 > +++ acpibtn.c 6 Jan 2016 08:55:15 -0000 > @@ -35,6 +35,7 @@ > int acpibtn_match(struct device *, void *, void *); > void acpibtn_attach(struct device *, struct device *, void *); > int acpibtn_notify(struct aml_node *, int, void *); > +int acpibtn_activate(struct device *, int); > > struct acpibtn_softc { > struct device sc_dev; > @@ -65,7 +66,8 @@ SLIST_HEAD(acpi_lid_head, acpi_lid) acpi > SLIST_HEAD_INITIALIZER(acpibtn_lids); > > struct cfattach acpibtn_ca = { > - sizeof(struct acpibtn_softc), acpibtn_match, acpibtn_attach > + sizeof(struct acpibtn_softc), acpibtn_match, acpibtn_attach, NULL, > + acpibtn_activate > }; > > struct cfdriver acpibtn_cd = { > @@ -155,7 +157,7 @@ acpibtn_attach(struct device *parent, st > struct acpibtn_softc *sc = (struct acpibtn_softc *)self; > struct acpi_attach_args *aa = aux; > struct acpi_lid *lid; > - int64_t lid_open; > + int64_t lid_open = 1; > int64_t st; > > sc->sc_acpi = (struct acpi_softc *)parent; > @@ -258,5 +260,25 @@ sleep: > break; > } > > + return (0); > +} > + > +int > +acpibtn_activate(struct device *self, int act) > +{ > + struct acpibtn_softc *sc = (struct acpibtn_softc *)self; > + int64_t lid_open = 1; > + > + switch (act) { > + case DVACT_WAKEUP: > + switch (sc->sc_btn_type) { > + case ACPIBTN_LID: > + aml_evalinteger(sc->sc_acpi, sc->sc_devnode, > + "_LID", 0, NULL, &lid_open); > + sc->sc_sens.value = lid_open; > + break; > + } > + break; > + } > return (0); > } > >