platform/x86: hp-wmi: Add HP Envy special key support
authorJonathan Singer <jes965@nyu.edu>
Wed, 26 Apr 2023 18:48:54 +0000 (14:48 -0400)
committerHans de Goede <hdegoede@redhat.com>
Tue, 9 May 2023 09:54:42 +0000 (11:54 +0200)
Previously, some support for certain keys on the HP keyboard has been
added already in commit 3ee5447b2048 ("platform/x86: hp-wmi: Handle Omen
Key event"), however this as tested did not allow even the fn+esc key on
my HP Envy which uses the same keycode on my HP Envy x360 laptop to work
--the keycode rather than being passed in as a separate int from WMI, was
being passed in as the event_data for the HPWMI_OMEN_KEY event.

This patch, as tested was able to properly get the keycode for fn+esc,
and for fn+f12 which is supposed to be a programmable key according to
HP's keyboard diagram and is thus mapped to KEY_PROG2. The fn+f8 key
combination (mute microphone) was a standard HPWMI_BEZEL_BUTTON key,
however it did not previously have an entry in the sparse keymap. This
patch preserves the original HPWMI_OMEN_KEY behavior for laptops that
use it by only taking the keycode from the event_data only when the
event_data is nonzero.

Signed-off-by: Jonathan Singer <jes965@nyu.edu>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20230426184852.2100-2-jes965@nyu.edu
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/hp/hp-wmi.c

index c1b1229..2749433 100644 (file)
@@ -223,6 +223,7 @@ static const struct key_entry hp_wmi_keymap[] = {
        { KE_IGNORE, 0x121a4, }, /* Win Lock Off */
        { KE_KEY, 0x21a5,  { KEY_PROG2 } }, /* HP Omen Key */
        { KE_KEY, 0x21a7,  { KEY_FN_ESC } },
+       { KE_KEY, 0x21a8,  { KEY_PROG2 } }, /* HP Envy x360 programmable key */
        { KE_KEY, 0x21a9,  { KEY_TOUCHPAD_OFF } },
        { KE_KEY, 0x121a9, { KEY_TOUCHPAD_ON } },
        { KE_KEY, 0x231b,  { KEY_HELP } },
@@ -845,11 +846,20 @@ static void hp_wmi_notify(u32 value, void *context)
        case HPWMI_SMART_ADAPTER:
                break;
        case HPWMI_BEZEL_BUTTON:
-       case HPWMI_OMEN_KEY:
                key_code = hp_wmi_read_int(HPWMI_HOTKEY_QUERY);
                if (key_code < 0)
                        break;
 
+               if (!sparse_keymap_report_event(hp_wmi_input_dev,
+                                               key_code, 1, true))
+                       pr_info("Unknown key code - 0x%x\n", key_code);
+               break;
+       case HPWMI_OMEN_KEY:
+               if (event_data) /* Only should be true for HP Omen */
+                       key_code = event_data;
+               else
+                       key_code = hp_wmi_read_int(HPWMI_HOTKEY_QUERY);
+
                if (!sparse_keymap_report_event(hp_wmi_input_dev,
                                                key_code, 1, true))
                        pr_info("Unknown key code - 0x%x\n", key_code);