On 2019/03/06 20:55, joshua stein wrote:
> sthen found that the HKEY version metric failed on the x260 where it 
> reports version 1 but requires the new ACPI method of changing 
> backlight.
> 
> This diff tries to do the ACPI method on all machines and falls back 
> to the CMOS method if that fails.
> 
> Can all those that tried the previous diff (which has been 
> committed) try this one and make sure nothing broke?
> 
> This also unmasks the microphone mute event which helps mixerctl 
> stay in sync on the x260 (it has no effect on my x1c6, but probably 
> can't hurt).
> 
> 
> Index: sys/dev/acpi/acpithinkpad.c

The patch in the mail doesn't apply cleanly for me due to some
whitespace issues, if anyone else is having problems with that here's
a regenerated version:


Index: acpithinkpad.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
retrieving revision 1.63
diff -u -p -r1.63 acpithinkpad.c
--- acpithinkpad.c      6 Mar 2019 15:36:30 -0000       1.63
+++ acpithinkpad.c      7 Mar 2019 13:29:46 -0000
@@ -124,6 +124,7 @@
 #define        THINKPAD_ADAPTIVE_MODE_HOME     1
 #define        THINKPAD_ADAPTIVE_MODE_FUNCTION 3
 
+#define THINKPAD_MASK_MIC_MUTE         (1 << 14)
 #define THINKPAD_MASK_BRIGHTNESS_UP    (1 << 15)
 #define THINKPAD_MASK_BRIGHTNESS_DOWN  (1 << 16)
 #define THINKPAD_MASK_KBD_BACKLIGHT    (1 << 17)
@@ -171,8 +172,8 @@ int thinkpad_get_kbd_backlight(struct ws
 int    thinkpad_set_kbd_backlight(struct wskbd_backlight *);
 extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
 extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
-void   thinkpad_get_brightness(struct acpithinkpad_softc *);
-void   thinkpad_set_brightness(void *, int);
+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 *);
 extern int (*ws_get_param)(struct wsdisplay_param *);
@@ -345,7 +346,9 @@ thinkpad_enable_events(struct acpithinkp
        }
 
        /* Enable events we need to know about */
-       mask |= (THINKPAD_MASK_BRIGHTNESS_UP | THINKPAD_MASK_BRIGHTNESS_DOWN |
+       mask |= (THINKPAD_MASK_MIC_MUTE |
+           THINKPAD_MASK_BRIGHTNESS_UP |
+           THINKPAD_MASK_BRIGHTNESS_DOWN |
            THINKPAD_MASK_KBD_BACKLIGHT);
 
        DPRINTF(("%s: setting event mask to 0x%llx\n", DEVNAME(sc), mask));
@@ -555,8 +558,7 @@ thinkpad_brightness_up(struct acpithinkp
 {
        int b;
 
-       if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
-               thinkpad_get_brightness(sc);
+       if (thinkpad_get_brightness(sc) == 0) {
                b = sc->sc_brightness & 0xff;
                if (b < ((sc->sc_brightness >> 8) & 0xff)) {
                        sc->sc_brightness = b + 1;
@@ -573,8 +575,7 @@ thinkpad_brightness_down(struct acpithin
 {
        int b;
 
-       if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
-               thinkpad_get_brightness(sc);
+       if (thinkpad_get_brightness(sc) == 0) {
                b = sc->sc_brightness & 0xff;
                if (b > 0) {
                        sc->sc_brightness = b - 1;
@@ -701,30 +702,39 @@ thinkpad_set_kbd_backlight(struct wskbd_
        return 0;
 }
 
-void
+int
 thinkpad_get_brightness(struct acpithinkpad_softc *sc)
 {
-       aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
-           "PBLG", 0, NULL, &sc->sc_brightness);
+       int ret;
+
+       ret = aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG", 0, NULL,
+           &sc->sc_brightness);
 
        DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
+
+       return ret;
 }
 
-void
+int
 thinkpad_set_brightness(void *arg0, int arg1)
 {
        struct acpithinkpad_softc *sc = arg0;
        struct aml_value arg;
+       int ret;
 
        DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
 
        memset(&arg, 0, sizeof(arg));
        arg.type = AML_OBJTYPE_INTEGER;
        arg.v_integer = sc->sc_brightness & 0xff;
-       aml_evalname(sc->sc_acpi, sc->sc_devnode,
-           "PBLS", 1, &arg, NULL);
+       ret = aml_evalname(sc->sc_acpi, sc->sc_devnode, "PBLS", 1, &arg, NULL);
+
+       if (ret)
+               return ret;
 
        thinkpad_get_brightness(sc);
+
+       return 0;
 }
 
 int
@@ -765,7 +775,8 @@ thinkpad_set_param(struct wsdisplay_para
                        dp->curval = maxval;
                sc->sc_brightness &= ~0xff;
                sc->sc_brightness |= dp->curval;
-               acpi_addtask(sc->sc_acpi, thinkpad_set_brightness, sc, 0);
+               acpi_addtask(sc->sc_acpi, (void *)thinkpad_set_brightness, sc,
+                   0);
                acpi_wakeup(sc->sc_acpi);
                return 0;
        default:

Reply via email to