summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpi/thinkpad_acpi.c56
1 files changed, 51 insertions, 5 deletions
diff --git a/sys/dev/acpi/thinkpad_acpi.c b/sys/dev/acpi/thinkpad_acpi.c
index 2d64f55fc5d..12826a1676e 100644
--- a/sys/dev/acpi/thinkpad_acpi.c
+++ b/sys/dev/acpi/thinkpad_acpi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: thinkpad_acpi.c,v 1.52 2021/05/29 16:49:57 riastradh Exp $ */
+/* $NetBSD: thinkpad_acpi.c,v 1.53 2021/05/30 11:24:10 riastradh Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <jmcneill@invisible.ca>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: thinkpad_acpi.c,v 1.52 2021/05/29 16:49:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: thinkpad_acpi.c,v 1.53 2021/05/30 11:24:10 riastradh Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -55,6 +55,7 @@ typedef struct thinkpad_softc {
struct acpi_devnode *sc_node;
ACPI_HANDLE sc_powhdl;
ACPI_HANDLE sc_cmoshdl;
+ ACPI_INTEGER sc_ver;
#define TP_PSW_SLEEP 0 /* FnF4 */
#define TP_PSW_HIBERNATE 1 /* FnF12 */
@@ -241,13 +242,58 @@ thinkpad_attach(device_t parent, device_t self, void *opaque)
aprint_debug_dev(self, "using EC at %s\n",
device_xname(sc->sc_ecdev));
- /* Get the supported event mask */
- rv = acpi_eval_integer(sc->sc_node->ad_handle, "MHKA", &val);
+ /* Query the version number */
+ rv = acpi_eval_integer(aa->aa_node->ad_handle, "MHKV", &sc->sc_ver);
if (ACPI_FAILURE(rv)) {
- aprint_error_dev(self, "couldn't evaluate MHKA: %s\n",
+ aprint_error_dev(self, "couldn't evaluate MHKV: %s\n",
AcpiFormatException(rv));
goto fail;
}
+ aprint_normal_dev(self, "version %04x\n", (unsigned)sc->sc_ver);
+
+ /* Get the supported event mask */
+ switch (sc->sc_ver) {
+ case THINKPAD_HKEY_VERSION_1:
+ rv = acpi_eval_integer(sc->sc_node->ad_handle, "MHKA", &val);
+ if (ACPI_FAILURE(rv)) {
+ aprint_error_dev(self, "couldn't evaluate MHKA: %s\n",
+ AcpiFormatException(rv));
+ goto fail;
+ }
+ break;
+ case THINKPAD_HKEY_VERSION_2: {
+ ACPI_OBJECT args[1] = {
+ [0] = { .Integer = {
+ .Type = ACPI_TYPE_INTEGER,
+ .Value = 1, /* hotkey events */
+ } },
+ };
+ ACPI_OBJECT_LIST arglist = {
+ .Count = __arraycount(args),
+ .Pointer = args,
+ };
+ ACPI_OBJECT ret;
+ ACPI_BUFFER buf = { .Pointer = &ret, .Length = sizeof(ret) };
+
+ rv = AcpiEvaluateObject(sc->sc_node->ad_handle, "MHKA",
+ &arglist, &buf);
+ if (ACPI_FAILURE(rv)) {
+ aprint_error_dev(self, "couldn't evaluate MHKA(1):"
+ " %s\n",
+ AcpiFormatException(rv));
+ goto fail;
+ }
+ if (buf.Length == 0 || ret.Type != ACPI_TYPE_INTEGER) {
+ aprint_error_dev(self, "failed to evaluate MHKA(1)\n");
+ goto fail;
+ }
+ val = ret.Integer.Value;
+ break;
+ }
+ default:
+ panic("%s: invalid version %jd", device_xname(self),
+ (intmax_t)sc->sc_ver);
+ }
/* Enable all supported events */
rv = thinkpad_mask_init(sc, val);