diff options
| -rw-r--r-- | sys/dev/acpi/acpi.c | 15 | ||||
| -rw-r--r-- | sys/dev/acpi/acpiac.c | 26 | ||||
| -rw-r--r-- | sys/dev/acpi/acpibat.c | 37 | ||||
| -rw-r--r-- | sys/dev/acpi/acpisbs.c | 20 |
4 files changed, 78 insertions, 20 deletions
diff --git a/sys/dev/acpi/acpi.c b/sys/dev/acpi/acpi.c index 7c103347980..99babcb5e4f 100644 --- a/sys/dev/acpi/acpi.c +++ b/sys/dev/acpi/acpi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpi.c,v 1.386 2020/05/29 04:42:24 deraadt Exp $ */ +/* $OpenBSD: acpi.c,v 1.387 2020/06/10 22:26:40 jca Exp $ */ /* * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com> * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org> @@ -1941,20 +1941,11 @@ void acpi_sleep_task(void *arg0, int sleepmode) { struct acpi_softc *sc = arg0; - struct acpi_ac *ac; - struct acpi_bat *bat; - struct acpi_sbs *sbs; /* System goes to sleep here.. */ acpi_sleep_state(sc, sleepmode); - - /* AC and battery information needs refreshing */ - SLIST_FOREACH(ac, &sc->sc_ac, aac_link) - aml_notify(ac->aac_softc->sc_devnode, 0x80); - SLIST_FOREACH(bat, &sc->sc_bat, aba_link) - aml_notify(bat->aba_softc->sc_devnode, 0x80); - SLIST_FOREACH(sbs, &sc->sc_sbs, asbs_link) - aml_notify(sbs->asbs_softc->sc_devnode, 0x80); + /* Tell userland to recheck A/C and battery status */ + acpi_record_event(sc, APM_POWER_CHANGE); } #endif /* SMALL_KERNEL */ diff --git a/sys/dev/acpi/acpiac.c b/sys/dev/acpi/acpiac.c index 43d67dd64da..e2943ea4504 100644 --- a/sys/dev/acpi/acpiac.c +++ b/sys/dev/acpi/acpiac.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpiac.c,v 1.32 2020/05/09 00:40:48 jca Exp $ */ +/* $OpenBSD: acpiac.c,v 1.33 2020/06/10 22:26:40 jca Exp $ */ /* * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> * @@ -33,13 +33,18 @@ int acpiac_match(struct device *, void *, void *); void acpiac_attach(struct device *, struct device *, void *); +int acpiac_activate(struct device *, int); int acpiac_notify(struct aml_node *, int, void *); void acpiac_refresh(void *); int acpiac_getpsr(struct acpiac_softc *); struct cfattach acpiac_ca = { - sizeof(struct acpiac_softc), acpiac_match, acpiac_attach + sizeof(struct acpiac_softc), + acpiac_match, + acpiac_attach, + NULL, + acpiac_activate, }; struct cfdriver acpiac_cd = { @@ -92,6 +97,21 @@ acpiac_attach(struct device *parent, struct device *self, void *aux) acpiac_notify, sc, ACPIDEV_NOPOLL); } +int +acpiac_activate(struct device *self, int act) +{ + struct acpiac_softc *sc = (struct acpiac_softc *)self; + + switch (act) { + case DVACT_WAKEUP: + acpiac_refresh(sc); + dnprintf(10, "A/C status: %d\n", sc->sc_ac_stat); + break; + } + + return (0); +} + void acpiac_refresh(void *arg) { @@ -99,7 +119,6 @@ acpiac_refresh(void *arg) acpiac_getpsr(sc); sc->sc_sens[0].value = sc->sc_ac_stat; - acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE); } int @@ -136,6 +155,7 @@ acpiac_notify(struct aml_node *node, int notify_type, void *arg) /* FALLTHROUGH */ case 0x80: acpiac_refresh(sc); + acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE); dnprintf(10, "A/C status: %d\n", sc->sc_ac_stat); break; } diff --git a/sys/dev/acpi/acpibat.c b/sys/dev/acpi/acpibat.c index 6c669f05235..9075aa39722 100644 --- a/sys/dev/acpi/acpibat.c +++ b/sys/dev/acpi/acpibat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpibat.c,v 1.67 2018/07/01 19:40:49 mlarkin Exp $ */ +/* $OpenBSD: acpibat.c,v 1.68 2020/06/10 22:26:40 jca Exp $ */ /* * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> * @@ -31,9 +31,14 @@ int acpibat_match(struct device *, void *, void *); void acpibat_attach(struct device *, struct device *, void *); +int acpibat_activate(struct device *, int); struct cfattach acpibat_ca = { - sizeof(struct acpibat_softc), acpibat_match, acpibat_attach + sizeof(struct acpibat_softc), + acpibat_match, + acpibat_attach, + NULL, + acpibat_activate, }; struct cfdriver acpibat_cd = { @@ -110,6 +115,31 @@ acpibat_attach(struct device *parent, struct device *self, void *aux) acpibat_notify, sc, ACPIDEV_POLL); } +int +acpibat_activate(struct device *self, int act) +{ + struct acpibat_softc *sc = (struct acpibat_softc *)self; + int64_t sta; + + switch (act) { + case DVACT_WAKEUP: + /* Check if installed state of battery has changed */ + if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "_STA", 0, + NULL, &sta) == 0) { + if (sta & STA_BATTERY) + sc->sc_bat_present = 1; + else + sc->sc_bat_present = 0; + } + acpibat_getbix(sc); + acpibat_getbst(sc); + acpibat_refresh(sc); + break; + } + + return (0); +} + void acpibat_monitor(struct acpibat_softc *sc) { @@ -315,8 +345,6 @@ acpibat_refresh(void *arg) sc->sc_sens[9].flags = 0; } } - - acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE); } int @@ -505,6 +533,7 @@ acpibat_notify(struct aml_node *node, int notify_type, void *arg) } acpibat_refresh(sc); + acpi_record_event(sc->sc_acpi, APM_POWER_CHANGE); return (0); } diff --git a/sys/dev/acpi/acpisbs.c b/sys/dev/acpi/acpisbs.c index bb2eb85a927..7fd85860f79 100644 --- a/sys/dev/acpi/acpisbs.c +++ b/sys/dev/acpi/acpisbs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpisbs.c,v 1.9 2020/01/27 11:04:18 jca Exp $ */ +/* $OpenBSD: acpisbs.c,v 1.10 2020/06/10 22:26:40 jca Exp $ */ /* * Smart Battery subsystem device driver * ACPI 5.0 spec section 10 @@ -128,6 +128,7 @@ extern void acpiec_write(struct acpiec_softc *, uint8_t, int, uint8_t *); int acpisbs_match(struct device *, void *, void *); void acpisbs_attach(struct device *, struct device *, void *); +int acpisbs_activate(struct device *, int); void acpisbs_setup_sensors(struct acpisbs_softc *); void acpisbs_refresh_sensors(struct acpisbs_softc *); void acpisbs_read(struct acpisbs_softc *); @@ -139,6 +140,8 @@ const struct cfattach acpisbs_ca = { sizeof(struct acpisbs_softc), acpisbs_match, acpisbs_attach, + NULL, + acpisbs_activate, }; struct cfdriver acpisbs_cd = { @@ -358,6 +361,21 @@ acpisbs_refresh_sensors(struct acpisbs_softc *sc) } int +acpisbs_activate(struct device *self, int act) +{ + struct acpisbs_softc *sc = (struct acpisbs_softc *)self; + + switch (act) { + case DVACT_WAKEUP: + acpisbs_read(sc); + acpisbs_refresh_sensors(sc); + break; + } + + return 0; +} + +int acpisbs_notify(struct aml_node *node, int notify_type, void *arg) { struct acpisbs_softc *sc = arg; |
