diff options
author | Laura Abbott <labbott@fedoraproject.org> | 2017-06-06 11:23:13 -0700 |
---|---|---|
committer | Laura Abbott <labbott@fedoraproject.org> | 2017-06-06 11:29:17 -0700 |
commit | ee81a40fa3186d75cbaad3a862d9ae5a02758817 (patch) | |
tree | d895af6f42fec12278f369f7795e32d972ec1067 /0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch | |
parent | d1ad9e9d9c55bab1942e8453f5c188cfa8b13e8d (diff) | |
download | kernel-ee81a40fa3186d75cbaad3a862d9ae5a02758817.tar.gz kernel-ee81a40fa3186d75cbaad3a862d9ae5a02758817.tar.xz kernel-ee81a40fa3186d75cbaad3a862d9ae5a02758817.zip |
Backport hotkey event support for 2017 thinkpad models (rhbz 1459272)
Diffstat (limited to '0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch')
-rw-r--r-- | 0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch b/0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch new file mode 100644 index 000000000..2c9bcbbeb --- /dev/null +++ b/0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch @@ -0,0 +1,158 @@ +From 82e71b57b1b4347126b1ffd7b2beed2bc8b795bd Mon Sep 17 00:00:00 2001 +From: Christian Kellner <christian@kellner.me> +Date: Tue, 28 Feb 2017 17:10:57 +0100 +Subject: [PATCH 2/2] platform/x86: thinkpad_acpi: add mapping for new hotkeys + +The T470, X270 emits new hkey events in the 0x1311 - 0x1315 range. +According to the user manual they should launch a user selected +favorite application (star icon, 0x1311), snipping tool (0x1312, +currently ignored), enable/disable bluetooth (0x1314) and open they +keyboard settings (0x1315). + +The third nibble (0xf00) is used to differentiate between the original +hotkeys, the adaptive keyboard codes and the new, additional ones. + +Signed-off-by: Christian Kellner <ckellner@redhat.com> +Reviewed-by: Hans de Goede <hdegoede@redhat.com> +Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +--- + drivers/platform/x86/thinkpad_acpi.c | 91 +++++++++++++++++++++++++++++++----- + 1 file changed, 79 insertions(+), 12 deletions(-) + +diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c +index e2b962f..7b6cb0c 100644 +--- a/drivers/platform/x86/thinkpad_acpi.c ++++ b/drivers/platform/x86/thinkpad_acpi.c +@@ -1945,6 +1945,15 @@ enum { /* hot key scan codes (derived from ACPI DSDT) */ + TP_ACPI_HOTKEYSCAN_CAMERA_MODE, + TP_ACPI_HOTKEYSCAN_ROTATE_DISPLAY, + ++ /* Lenovo extended keymap, starting at 0x1300 */ ++ TP_ACPI_HOTKEYSCAN_EXTENDED_START, ++ /* first new observed key (star, favorites) is 0x1311 */ ++ TP_ACPI_HOTKEYSCAN_STAR = 69, ++ TP_ACPI_HOTKEYSCAN_CLIPPING_TOOL2, ++ TP_ACPI_HOTKEYSCAN_UNK25, ++ TP_ACPI_HOTKEYSCAN_BLUETOOTH, ++ TP_ACPI_HOTKEYSCAN_KEYBOARD, ++ + /* Hotkey keymap size */ + TPACPI_HOTKEY_MAP_LEN + }; +@@ -3252,6 +3261,15 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) + KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, + KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, + KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ ++ /* No assignment, used for newer Lenovo models */ ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN ++ + }, + + /* Generic keymap for Lenovo ThinkPads */ +@@ -3337,6 +3355,29 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) + KEY_RESERVED, /* Microphone cancellation */ + KEY_RESERVED, /* Camera mode */ + KEY_RESERVED, /* Rotate display, 0x116 */ ++ ++ /* ++ * These are found in 2017 models (e.g. T470s, X270). ++ * The lowest known value is 0x311, which according to ++ * the manual should launch a user defined favorite ++ * application. ++ * ++ * The offset for these is TP_ACPI_HOTKEYSCAN_EXTENDED_START, ++ * corresponding to 0x34. ++ */ ++ ++ /* (assignments unknown, please report if found) */ ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, ++ KEY_UNKNOWN, ++ ++ KEY_FAVORITES, /* Favorite app, 0x311 */ ++ KEY_RESERVED, /* Clipping tool */ ++ KEY_RESERVED, ++ KEY_BLUETOOTH, /* Bluetooth */ ++ KEY_KEYBOARD /* Keyboard, 0x315 */ + }, + }; + +@@ -3747,8 +3788,9 @@ static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode) + + default: + if (scancode < FIRST_ADAPTIVE_KEY || +- scancode >= FIRST_ADAPTIVE_KEY + TPACPI_HOTKEY_MAP_LEN - +- TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) { ++ scancode >= FIRST_ADAPTIVE_KEY + ++ TP_ACPI_HOTKEYSCAN_EXTENDED_START - ++ TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) { + pr_info("Unhandled adaptive keyboard key: 0x%x\n", + scancode); + return false; +@@ -3779,19 +3821,44 @@ static bool hotkey_notify_hotkey(const u32 hkey, + *send_acpi_ev = true; + *ignore_acpi_ev = false; + +- /* HKEY event 0x1001 is scancode 0x00 */ +- if (scancode > 0 && scancode <= TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) { +- scancode--; +- if (!(hotkey_source_mask & (1 << scancode))) { +- tpacpi_input_send_key_masked(scancode); +- *send_acpi_ev = false; +- } else { +- *ignore_acpi_ev = true; ++ /* ++ * Original events are in the 0x10XX range, the adaptive keyboard ++ * found in 2014 X1 Carbon emits events are of 0x11XX. In 2017 ++ * models, additional keys are emitted through 0x13XX. ++ */ ++ switch ((hkey >> 8) & 0xf) { ++ case 0: ++ if (scancode > 0 && ++ scancode <= TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) { ++ /* HKEY event 0x1001 is scancode 0x00 */ ++ scancode--; ++ if (!(hotkey_source_mask & (1 << scancode))) { ++ tpacpi_input_send_key_masked(scancode); ++ *send_acpi_ev = false; ++ } else { ++ *ignore_acpi_ev = true; ++ } ++ return true; + } +- return true; +- } else { ++ break; ++ ++ case 1: + return adaptive_keyboard_hotkey_notify_hotkey(scancode); ++ ++ case 3: ++ /* Extended keycodes start at 0x300 and our offset into the map ++ * TP_ACPI_HOTKEYSCAN_EXTENDED_START. The calculated scancode ++ * will be positive, but might not be in the correct range. ++ */ ++ scancode -= (0x300 - TP_ACPI_HOTKEYSCAN_EXTENDED_START); ++ if (scancode >= TP_ACPI_HOTKEYSCAN_EXTENDED_START && ++ scancode < TPACPI_HOTKEY_MAP_LEN) { ++ tpacpi_input_send_key(scancode); ++ return true; ++ } ++ break; + } ++ + return false; + } + +-- +2.9.4 + |