aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2015-03-02 08:45:31 -0500
committerDarren Hart <dvhart@linux.intel.com>2015-03-03 12:00:25 -0500
commit6a68d855708497c542d57a82a5f8e3a513a65a82 (patch)
treec27b934eae937e73d984dda81b496643050f3d7c /drivers/platform
parentb790ceeb0fd94725150219abd8c13b08a17a32e3 (diff)
thinkpad_acpi: Add support for more adaptive kbd buttons
This commit adds new elements to the ThinkPad keymaps, and will send key events for keys for which an input.h declaration exists. Signed-off-by: Bastien Nocera <hadess@hadess.net> Reviewed-by: Henrique de Moraes Holschuh <hmh@hyymh.eng.br> Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c80
1 files changed, 79 insertions, 1 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index ae528cf0b143..5d76f1812783 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -1912,6 +1912,27 @@ enum { /* hot key scan codes (derived from ACPI DSDT) */
1912 TP_ACPI_HOTKEYSCAN_UNK7, 1912 TP_ACPI_HOTKEYSCAN_UNK7,
1913 TP_ACPI_HOTKEYSCAN_UNK8, 1913 TP_ACPI_HOTKEYSCAN_UNK8,
1914 1914
1915 TP_ACPI_HOTKEYSCAN_MUTE2,
1916 TP_ACPI_HOTKEYSCAN_BRIGHTNESS_ZERO,
1917 TP_ACPI_HOTKEYSCAN_CLIPPING_TOOL,
1918 TP_ACPI_HOTKEYSCAN_CLOUD,
1919 TP_ACPI_HOTKEYSCAN_UNK9,
1920 TP_ACPI_HOTKEYSCAN_VOICE,
1921 TP_ACPI_HOTKEYSCAN_UNK10,
1922 TP_ACPI_HOTKEYSCAN_GESTURES,
1923 TP_ACPI_HOTKEYSCAN_UNK11,
1924 TP_ACPI_HOTKEYSCAN_UNK12,
1925 TP_ACPI_HOTKEYSCAN_UNK13,
1926 TP_ACPI_HOTKEYSCAN_CONFIG,
1927 TP_ACPI_HOTKEYSCAN_NEW_TAB,
1928 TP_ACPI_HOTKEYSCAN_RELOAD,
1929 TP_ACPI_HOTKEYSCAN_BACK,
1930 TP_ACPI_HOTKEYSCAN_MIC_DOWN,
1931 TP_ACPI_HOTKEYSCAN_MIC_UP,
1932 TP_ACPI_HOTKEYSCAN_MIC_CANCELLATION,
1933 TP_ACPI_HOTKEYSCAN_CAMERA_MODE,
1934 TP_ACPI_HOTKEYSCAN_ROTATE_DISPLAY,
1935
1915 /* Hotkey keymap size */ 1936 /* Hotkey keymap size */
1916 TPACPI_HOTKEY_MAP_LEN 1937 TPACPI_HOTKEY_MAP_LEN
1917}; 1938};
@@ -3170,6 +3191,13 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
3170 /* (assignments unknown, please report if found) */ 3191 /* (assignments unknown, please report if found) */
3171 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, 3192 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3172 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, 3193 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3194
3195 /* No assignments, only used for Adaptive keyboards. */
3196 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3197 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3198 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3199 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3200 KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
3173 }, 3201 },
3174 3202
3175 /* Generic keymap for Lenovo ThinkPads */ 3203 /* Generic keymap for Lenovo ThinkPads */
@@ -3226,6 +3254,35 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
3226 3254
3227 /* Extra keys in use since the X240 / T440 / T540 */ 3255 /* Extra keys in use since the X240 / T440 / T540 */
3228 KEY_CONFIG, KEY_SEARCH, KEY_SCALE, KEY_FILE, 3256 KEY_CONFIG, KEY_SEARCH, KEY_SCALE, KEY_FILE,
3257
3258 /*
3259 * These are the adaptive keyboard keycodes for Carbon X1 2014.
3260 * The first item in this list is the Mute button which is
3261 * emitted with 0x103 through
3262 * adaptive_keyboard_hotkey_notify_hotkey() when the sound
3263 * symbol is held.
3264 * We'll need to offset those by 0x20.
3265 */
3266 KEY_RESERVED, /* Mute held, 0x103 */
3267 KEY_BRIGHTNESS_MIN, /* Backlight off */
3268 KEY_RESERVED, /* Clipping tool */
3269 KEY_RESERVED, /* Cloud */
3270 KEY_RESERVED,
3271 KEY_VOICECOMMAND, /* Voice */
3272 KEY_RESERVED,
3273 KEY_RESERVED, /* Gestures */
3274 KEY_RESERVED,
3275 KEY_RESERVED,
3276 KEY_RESERVED,
3277 KEY_CONFIG, /* Settings */
3278 KEY_RESERVED, /* New tab */
3279 KEY_REFRESH, /* Reload */
3280 KEY_BACK, /* Back */
3281 KEY_RESERVED, /* Microphone down */
3282 KEY_RESERVED, /* Microphone up */
3283 KEY_RESERVED, /* Microphone cancellation */
3284 KEY_RESERVED, /* Camera mode */
3285 KEY_RESERVED, /* Rotate display, 0x116 */
3229 }, 3286 },
3230 }; 3287 };
3231 3288
@@ -3527,6 +3584,8 @@ static const int adaptive_keyboard_modes[] = {
3527 3584
3528#define DFR_CHANGE_ROW 0x101 3585#define DFR_CHANGE_ROW 0x101
3529#define DFR_SHOW_QUICKVIEW_ROW 0x102 3586#define DFR_SHOW_QUICKVIEW_ROW 0x102
3587#define FIRST_ADAPTIVE_KEY 0x103
3588#define ADAPTIVE_KEY_OFFSET 0x020
3530 3589
3531/* press Fn key a while second, it will switch to Function Mode. Then 3590/* press Fn key a while second, it will switch to Function Mode. Then
3532 * release Fn key, previous mode be restored. 3591 * release Fn key, previous mode be restored.
@@ -3582,6 +3641,7 @@ static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode)
3582{ 3641{
3583 u32 current_mode = 0; 3642 u32 current_mode = 0;
3584 int new_mode = 0; 3643 int new_mode = 0;
3644 int keycode;
3585 3645
3586 switch (scancode) { 3646 switch (scancode) {
3587 case DFR_CHANGE_ROW: 3647 case DFR_CHANGE_ROW:
@@ -3614,7 +3674,25 @@ static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode)
3614 return true; 3674 return true;
3615 3675
3616 default: 3676 default:
3617 return false; 3677 if (scancode < FIRST_ADAPTIVE_KEY || scancode > FIRST_ADAPTIVE_KEY +
3678 TPACPI_HOTKEY_MAP_LEN - ADAPTIVE_KEY_OFFSET) {
3679 pr_info("Unhandled adaptive keyboard key: 0x%x\n",
3680 scancode);
3681 return false;
3682 }
3683 keycode = hotkey_keycode_map[scancode - FIRST_ADAPTIVE_KEY + ADAPTIVE_KEY_OFFSET];
3684 if (keycode != KEY_RESERVED) {
3685 mutex_lock(&tpacpi_inputdev_send_mutex);
3686
3687 input_report_key(tpacpi_inputdev, keycode, 1);
3688 input_sync(tpacpi_inputdev);
3689
3690 input_report_key(tpacpi_inputdev, keycode, 0);
3691 input_sync(tpacpi_inputdev);
3692
3693 mutex_unlock(&tpacpi_inputdev_send_mutex);
3694 }
3695 return true;
3618 } 3696 }
3619} 3697}
3620 3698