summaryrefslogtreecommitdiffstats
path: root/0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch
diff options
context:
space:
mode:
authorLaura Abbott <labbott@fedoraproject.org>2017-06-06 11:23:13 -0700
committerLaura Abbott <labbott@fedoraproject.org>2017-06-06 11:28:12 -0700
commit47956699a4d9cf596a658ae97d707df58138653d (patch)
treef44d1827e169680716e9ce39c4e88659538ec30c /0002-platform-x86-thinkpad_acpi-add-mapping-for-new-hotke.patch
parentb137873ba9512b8d620232a31f04275ee92c5b93 (diff)
downloadkernel-47956699a4d9cf596a658ae97d707df58138653d.tar.gz
kernel-47956699a4d9cf596a658ae97d707df58138653d.tar.xz
kernel-47956699a4d9cf596a658ae97d707df58138653d.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.patch158
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
+