diff options
author | Bastien Nocera <hadess@hadess.net> | 2015-03-02 08:45:31 -0500 |
---|---|---|
committer | Darren Hart <dvhart@linux.intel.com> | 2015-03-03 12:00:25 -0500 |
commit | 6a68d855708497c542d57a82a5f8e3a513a65a82 (patch) | |
tree | c27b934eae937e73d984dda81b496643050f3d7c /drivers/platform | |
parent | b790ceeb0fd94725150219abd8c13b08a17a32e3 (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.c | 80 |
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 | ||