summaryrefslogtreecommitdiff
path: root/sys/dev/acpi
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2015-12-14 18:48:51 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2015-12-14 18:48:51 +0000
commita0eb48f7dcc28b2d469f7d6ebb05cb488b1e6219 (patch)
treea9bd6cd37b4ca1743e60f9f73c017da04a6e76bc /sys/dev/acpi
parentc2f5b6946d888389bea952156191c19a4646e8c3 (diff)
Handle the keyboard backlight found on newer Thinkpads. Doesn't handle the
machines that have both the keyboard backlight and the thinklight (x230, t430) quite right yet. ok jung@ (for a slightly different version of this diff)
Diffstat (limited to 'sys/dev/acpi')
-rw-r--r--sys/dev/acpi/acpithinkpad.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/sys/dev/acpi/acpithinkpad.c b/sys/dev/acpi/acpithinkpad.c
index 7a7c0aab56e..687f7cc5a24 100644
--- a/sys/dev/acpi/acpithinkpad.c
+++ b/sys/dev/acpi/acpithinkpad.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpithinkpad.c,v 1.47 2015/12/13 23:12:11 kettenis Exp $ */
+/* $OpenBSD: acpithinkpad.c,v 1.48 2015/12/14 18:48:50 kettenis Exp $ */
/*
* Copyright (c) 2008 joshua stein <jcs@openbsd.org>
*
@@ -120,6 +120,8 @@ struct acpithinkpad_softc {
struct ksensordev sc_sensdev;
uint64_t sc_thinklight;
+ const char *sc_thinklight_get;
+ const char *sc_thinklight_set;
};
extern void acpiec_read(struct acpiec_softc *, u_int8_t, int, u_int8_t *);
@@ -250,8 +252,17 @@ thinkpad_attach(struct device *parent, struct device *self, void *aux)
thinkpad_enable_events(sc);
thinkpad_sensor_attach(sc);
+ /* Check for ThinkLight or keyboard backlight */
if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "KLCG",
0, NULL, &sc->sc_thinklight) == 0) {
+ sc->sc_thinklight_get = "KLCG";
+ sc->sc_thinklight_set = "KLCS";
+ wskbd_get_backlight = thinkpad_get_backlight;
+ wskbd_set_backlight = thinkpad_set_backlight;
+ } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MLCG",
+ 0, NULL, &sc->sc_thinklight) == 0) {
+ sc->sc_thinklight_get = "MLCG";
+ sc->sc_thinklight_set = "MLCS";
wskbd_get_backlight = thinkpad_get_backlight;
wskbd_set_backlight = thinkpad_set_backlight;
}
@@ -572,8 +583,8 @@ thinkpad_activate(struct device *self, int act)
void
thinkpad_get_thinklight(struct acpithinkpad_softc *sc)
{
- aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "KLCG",
- 0, NULL, &sc->sc_thinklight);
+ aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
+ sc->sc_thinklight_get, 0, NULL, &sc->sc_thinklight);
}
void
@@ -584,8 +595,9 @@ thinkpad_set_thinklight(void *arg0, int arg1)
memset(&arg, 0, sizeof(arg));
arg.type = AML_OBJTYPE_INTEGER;
- arg.v_integer = sc->sc_thinklight;
- aml_evalname(sc->sc_acpi, sc->sc_devnode, "KLCS", 1, &arg, NULL);
+ arg.v_integer = sc->sc_thinklight & 0x0f;
+ aml_evalname(sc->sc_acpi, sc->sc_devnode,
+ sc->sc_thinklight_set, 1, &arg, NULL);
}
int
@@ -596,8 +608,8 @@ thinkpad_get_backlight(struct wskbd_backlight *kbl)
KASSERT(sc != NULL);
kbl->min = 0;
- kbl->max = (sc->sc_thinklight >> 8) & 0xff;
- kbl->curval = sc->sc_thinklight & 0xff;
+ kbl->max = (sc->sc_thinklight >> 8) & 0x0f;
+ kbl->curval = sc->sc_thinklight & 0x0f;
return 0;
}
@@ -605,7 +617,7 @@ int
thinkpad_set_backlight(struct wskbd_backlight *kbl)
{
struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
- int maxval = (sc->sc_thinklight >> 8) & 0xff;
+ int maxval = (sc->sc_thinklight >> 8) & 0x0f;
KASSERT(sc != NULL);