diff options
author | Joshua Stein <jcs@cvs.openbsd.org> | 2023-04-09 17:50:03 +0000 |
---|---|---|
committer | Joshua Stein <jcs@cvs.openbsd.org> | 2023-04-09 17:50:03 +0000 |
commit | 3dc74850889fefc476f783686ae3a34cd2949619 (patch) | |
tree | 6b77f5a775f706bb4855e40c74bcaf175ed18938 /sys | |
parent | 62755eb8510f967ae0140c06b47f925110334075 (diff) |
don't attach temperature sensors for which there is no TMP# node in
the DSDT, and verify the result of the fetch when updating it later.
ok kn
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/acpi/acpithinkpad.c | 62 |
1 files changed, 43 insertions, 19 deletions
diff --git a/sys/dev/acpi/acpithinkpad.c b/sys/dev/acpi/acpithinkpad.c index f62f1d41833..76257e0cb3c 100644 --- a/sys/dev/acpi/acpithinkpad.c +++ b/sys/dev/acpi/acpithinkpad.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpithinkpad.c,v 1.70 2022/04/06 18:59:27 naddy Exp $ */ +/* $OpenBSD: acpithinkpad.c,v 1.71 2023/04/09 17:50:02 jcs Exp $ */ /* * Copyright (c) 2008 joshua stein <jcs@openbsd.org> * @@ -112,11 +112,10 @@ #define THINKPAD_TABLET_SCREEN_CHANGED 0x60c0 #define THINKPAD_SWITCH_WIRELESS 0x7000 -#define THINKPAD_NSENSORS 10 -#define THINKPAD_NTEMPSENSORS 8 - -#define THINKPAD_SENSOR_FANRPM THINKPAD_NTEMPSENSORS -#define THINKPAD_SENSOR_PORTREPL THINKPAD_NTEMPSENSORS + 1 +#define THINKPAD_SENSOR_FANRPM 0 +#define THINKPAD_SENSOR_PORTREPL 1 +#define THINKPAD_SENSOR_TMP0 2 +#define THINKPAD_NSENSORS 10 #define THINKPAD_ECOFFSET_VOLUME 0x30 #define THINKPAD_ECOFFSET_VOLUME_MUTE_MASK 0x40 @@ -140,6 +139,7 @@ struct acpithinkpad_softc { struct ksensor sc_sens[THINKPAD_NSENSORS]; struct ksensordev sc_sensdev; + int sc_ntempsens; uint64_t sc_hkey_version; @@ -178,6 +178,7 @@ int thinkpad_get_brightness(struct acpithinkpad_softc *); int thinkpad_set_brightness(void *, int); int thinkpad_get_param(struct wsdisplay_param *); int thinkpad_set_param(struct wsdisplay_param *); +int thinkpad_get_temp(struct acpithinkpad_softc *, int, int64_t *); void thinkpad_sensor_attach(struct acpithinkpad_softc *sc); void thinkpad_sensor_refresh(void *); @@ -228,6 +229,7 @@ thinkpad_match(struct device *parent, void *match, void *aux) void thinkpad_sensor_attach(struct acpithinkpad_softc *sc) { + int64_t tmp; int i; if (sc->sc_acpi->sc_ec == NULL) @@ -237,10 +239,16 @@ thinkpad_sensor_attach(struct acpithinkpad_softc *sc) /* Add temperature probes */ strlcpy(sc->sc_sensdev.xname, DEVNAME(sc), sizeof(sc->sc_sensdev.xname)); - for (i=0; i<THINKPAD_NTEMPSENSORS; i++) { - sc->sc_sens[i].type = SENSOR_TEMP; - sensor_attach(&sc->sc_sensdev, &sc->sc_sens[i]); - } + sc->sc_ntempsens = 0; + for (i = 0; i < THINKPAD_NSENSORS - THINKPAD_SENSOR_TMP0; i++) { + if (thinkpad_get_temp(sc, i, &tmp) != 0) + break; + + sc->sc_sens[THINKPAD_SENSOR_TMP0 + i].type = SENSOR_TEMP; + sensor_attach(&sc->sc_sensdev, + &sc->sc_sens[THINKPAD_SENSOR_TMP0 + i]); + sc->sc_ntempsens++; + } /* Add fan probe */ sc->sc_sens[THINKPAD_SENSOR_FANRPM].type = SENSOR_FANRPM; @@ -262,17 +270,19 @@ thinkpad_sensor_refresh(void *arg) struct acpithinkpad_softc *sc = arg; uint8_t lo, hi, i; int64_t tmp; - char sname[5]; /* Refresh sensor readings */ - for (i=0; i<THINKPAD_NTEMPSENSORS; i++) { - snprintf(sname, sizeof(sname), "TMP%d", i); - aml_evalinteger(sc->sc_acpi, sc->sc_ec->sc_devnode, - sname, 0, 0, &tmp); - sc->sc_sens[i].value = (tmp * 1000000) + 273150000; - if (tmp > 127 || tmp < -127) - sc->sc_sens[i].flags = SENSOR_FINVALID; - } + for (i = 0; i < sc->sc_ntempsens; i++) { + if (thinkpad_get_temp(sc, i, &tmp) != 0) { + sc->sc_sens[i].flags = SENSOR_FINVALID; + continue; + } + + sc->sc_sens[THINKPAD_SENSOR_TMP0 + i].value = + (tmp * 1000000) + 273150000; + sc->sc_sens[THINKPAD_SENSOR_TMP0 + i].flags = + (tmp > 127 || tmp < -127) ? SENSOR_FINVALID : 0; + } /* Read fan RPM */ acpiec_read(sc->sc_ec, THINKPAD_ECOFFSET_FANLO, 1, &lo); @@ -787,6 +797,20 @@ thinkpad_set_param(struct wsdisplay_param *dp) } } +int +thinkpad_get_temp(struct acpithinkpad_softc *sc, int idx, int64_t *temp) +{ + char sname[5]; + + snprintf(sname, sizeof(sname), "TMP%d", idx); + + if (aml_evalinteger(sc->sc_acpi, sc->sc_ec->sc_devnode, sname, 0, 0, + temp) != 0) + return (1); + + return (0); +} + #if NAUDIO > 0 && NWSKBD > 0 void thinkpad_attach_deferred(void *v __unused) |