Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/acpi thinkpad(4): Fix evaluation of MHKA on version ...
details: https://anonhg.NetBSD.org/src/rev/4b37e077299d
branches: trunk
changeset: 379407:4b37e077299d
user: riastradh <riastradh%NetBSD.org@localhost>
date: Sun May 30 11:24:10 2021 +0000
description:
thinkpad(4): Fix evaluation of MHKA on version 2 devices.
Need to pass an argument.
diffstat:
sys/dev/acpi/thinkpad_acpi.c | 56 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 51 insertions(+), 5 deletions(-)
diffs (88 lines):
diff -r 0b44d801cfd5 -r 4b37e077299d sys/dev/acpi/thinkpad_acpi.c
--- a/sys/dev/acpi/thinkpad_acpi.c Sun May 30 11:24:02 2021 +0000
+++ b/sys/dev/acpi/thinkpad_acpi.c Sun May 30 11:24:10 2021 +0000
@@ -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@localhost>
@@ -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_
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);
Home |
Main Index |
Thread Index |
Old Index