|
@@ -1945,6 +1945,15 @@ enum { /* hot key scan codes (derived from ACPI DSDT) */
|
|
TP_ACPI_HOTKEYSCAN_CAMERA_MODE,
|
|
TP_ACPI_HOTKEYSCAN_CAMERA_MODE,
|
|
TP_ACPI_HOTKEYSCAN_ROTATE_DISPLAY,
|
|
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 */
|
|
/* Hotkey keymap size */
|
|
TPACPI_HOTKEY_MAP_LEN
|
|
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, 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 */
|
|
/* 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, /* Microphone cancellation */
|
|
KEY_RESERVED, /* Camera mode */
|
|
KEY_RESERVED, /* Camera mode */
|
|
KEY_RESERVED, /* Rotate display, 0x116 */
|
|
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:
|
|
default:
|
|
if (scancode < FIRST_ADAPTIVE_KEY ||
|
|
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",
|
|
pr_info("Unhandled adaptive keyboard key: 0x%x\n",
|
|
scancode);
|
|
scancode);
|
|
return false;
|
|
return false;
|
|
@@ -3779,19 +3821,44 @@ static bool hotkey_notify_hotkey(const u32 hkey,
|
|
*send_acpi_ev = true;
|
|
*send_acpi_ev = true;
|
|
*ignore_acpi_ev = false;
|
|
*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);
|
|
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;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|