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: