Hi @tech, i thought it would be a good idea to delegate the port-replicator docking event to the sysctl(2) hw.sensors substree so that if the thinkpad gets docked/undocked one could react to it by using sensorsd(8).
Here is my diff: Index: acpithinkpad.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v retrieving revision 1.58 diff -u -p -r1.58 acpithinkpad.c --- acpithinkpad.c 12 Aug 2017 17:33:51 -0000 1.58 +++ acpithinkpad.c 4 May 2018 18:20:43 -0000 @@ -110,8 +110,10 @@ #define THINKPAD_TABLET_SCREEN_CHANGED 0x60c0 #define THINKPAD_SWITCH_WIRELESS 0x7000 -#define THINKPAD_NSENSORS 9 +#define THINKPAD_NSENSORS 10 #define THINKPAD_NTEMPSENSORS 8 +#define THINKPAD_SENSOR_FANRPM THINKPAD_NTEMPSENSORS +#define THINKPAD_SENSOR_PORTREPL THINKPAD_NTEMPSENSORS + 1 #define THINKPAD_ECOFFSET_VOLUME 0x30 #define THINKPAD_ECOFFSET_VOLUME_MUTE_MASK 0x40 @@ -232,9 +234,18 @@ thinkpad_sensor_attach(struct acpithinkp sensor_attach(&sc->sc_sensdev, &sc->sc_sens[i]); } - /* Add fan probe */ - sc->sc_sens[i].type = SENSOR_FANRPM; - sensor_attach(&sc->sc_sensdev, &sc->sc_sens[i]); + /* Add fan probe */ + sc->sc_sens[THINKPAD_SENSOR_FANRPM].type = SENSOR_FANRPM; + sensor_attach(&sc->sc_sensdev, + &sc->sc_sens[THINKPAD_SENSOR_FANRPM]); + + /* Add port replicator indicator */ + sc->sc_sens[THINKPAD_SENSOR_PORTREPL].type = SENSOR_INDICATOR; + sc->sc_sens[THINKPAD_SENSOR_PORTREPL].status = SENSOR_S_UNKNOWN; + strlcpy(sc->sc_sens[THINKPAD_SENSOR_PORTREPL].desc, "port replicator", + sizeof(sc->sc_sens[THINKPAD_SENSOR_PORTREPL].desc)); + sensor_attach(&sc->sc_sensdev, + &sc->sc_sens[THINKPAD_SENSOR_PORTREPL]); sensordev_install(&sc->sc_sensdev); } @@ -260,7 +271,7 @@ thinkpad_sensor_refresh(void *arg) /* Read fan RPM */ acpiec_read(sc->sc_ec, THINKPAD_ECOFFSET_FANLO, 1, &lo); acpiec_read(sc->sc_ec, THINKPAD_ECOFFSET_FANHI, 1, &hi); - sc->sc_sens[i].value = ((hi << 8L) + lo); + sc->sc_sens[THINKPAD_SENSOR_FANRPM].value = ((hi << 8L) + lo); } void @@ -421,6 +432,14 @@ thinkpad_hotkey(struct aml_node *node, i case THINKPAD_BACKLIGHT_CHANGED: thinkpad_get_brightness(sc); break; + case THINKPAD_PORT_REPL_DOCKED: + sc->sc_sens[THINKPAD_SENSOR_PORTREPL].value = 1; + sc->sc_sens[THINKPAD_SENSOR_PORTREPL].status = SENSOR_S_OK; + break; + case THINKPAD_PORT_REPL_UNDOCKED: + sc->sc_sens[THINKPAD_SENSOR_PORTREPL].value = 0; + sc->sc_sens[THINKPAD_SENSOR_PORTREPL].status = SENSOR_S_OK; + break; default: /* unknown or boring event */ DPRINTF(("%s: unhandled event 0x%03llx\n", DEVNAME(sc), Greetings, Tobias