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

Reply via email to