On Wed, Mar 06 2019, 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
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
retrieving revision 1.63
diff -u -p -u -p -r1.63 acpithinkpad.c
--- sys/dev/acpi/acpithinkpad.c 6 Mar 2019 15:36:30 -0000 1.63
+++ sys/dev/acpi/acpithinkpad.c 7 Mar 2019 02:53:36 -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:

Hi Joshua,

I didn't notice any regression with the new patch on x230 or t470p.

Also, microphone mute event seems to have no effect on t470p.

Regards,

--
Renato Aguiar

Reply via email to