Skip to content

Commit

Permalink
platform/x86: dell-wmi: add new keymap type 0x0012
Browse files Browse the repository at this point in the history
These are events with extended data. The extended data is
currently ignored as userspace does not have a way to deal
it.

Ignore event with a type of 0x0012 and a code of 0xe035, as
the keyboard controller takes care of Fn lock events by itself.
This silences the following messages being logged when
pressing the Fn-lock key on a Dell Inspiron 5593:

dell_wmi: Unknown WMI event type 0x12
dell_wmi: Unknown key with type 0x0012 and code 0xe035 pressed

This is consistent with the behavior for the Fn-lock key
elsewhere in this file.

Signed-off-by: Y Paritcher <y.linux@paritcher.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Mario Limonciello <mario.limonciello@dell.com>
  • Loading branch information
Y Paritcher authored and Andy Shevchenko committed Jul 9, 2020
1 parent a633c47 commit 0c026c3
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions drivers/platform/x86/dell-wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,15 @@ static const struct key_entry dell_wmi_keymap_type_0011[] = {
{ KE_IGNORE, KBD_LED_AUTO_100_TOKEN, { KEY_RESERVED } },
};

/*
* Keymap for WMI events of type 0x0012
* They are events with extended data
*/
static const struct key_entry dell_wmi_keymap_type_0012[] = {
/* Fn-lock button pressed */
{ KE_IGNORE, 0xe035, { KEY_RESERVED } },
};

static void dell_wmi_process_key(struct wmi_device *wdev, int type, int code)
{
struct dell_wmi_priv *priv = dev_get_drvdata(&wdev->dev);
Expand Down Expand Up @@ -418,10 +427,11 @@ static void dell_wmi_notify(struct wmi_device *wdev,

switch (buffer_entry[1]) {
case 0x0000: /* One key pressed or event occurred */
case 0x0012: /* Event with extended data occurred */
if (len > 2)
dell_wmi_process_key(wdev, 0x0000,
dell_wmi_process_key(wdev, buffer_entry[1],
buffer_entry[2]);
/* Other entries could contain additional information */
/* Extended data is currently ignored */
break;
case 0x0010: /* Sequence of keys pressed */
case 0x0011: /* Sequence of events occurred */
Expand Down Expand Up @@ -556,6 +566,7 @@ static int dell_wmi_input_setup(struct wmi_device *wdev)
ARRAY_SIZE(dell_wmi_keymap_type_0000) +
ARRAY_SIZE(dell_wmi_keymap_type_0010) +
ARRAY_SIZE(dell_wmi_keymap_type_0011) +
ARRAY_SIZE(dell_wmi_keymap_type_0012) +
1,
sizeof(struct key_entry), GFP_KERNEL);
if (!keymap) {
Expand Down Expand Up @@ -600,6 +611,13 @@ static int dell_wmi_input_setup(struct wmi_device *wdev)
pos++;
}

/* Append table with events of type 0x0012 */
for (i = 0; i < ARRAY_SIZE(dell_wmi_keymap_type_0012); i++) {
keymap[pos] = dell_wmi_keymap_type_0012[i];
keymap[pos].code |= (0x0012 << 16);
pos++;
}

/*
* Now append also table with "legacy" events of type 0x0000. Some of
* them are reported also on laptops which have scancodes in DMI.
Expand Down

0 comments on commit 0c026c3

Please sign in to comment.