Skip to content

Commit

Permalink
thinkpad_acpi: Add support for more adaptive kbd buttons
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bastien Nocera authored and Darren Hart committed Mar 3, 2015
1 parent b790cee commit 6a68d85
Showing 1 changed file with 79 additions and 1 deletion.
80 changes: 79 additions & 1 deletion drivers/platform/x86/thinkpad_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1912,6 +1912,27 @@ enum { /* hot key scan codes (derived from ACPI DSDT) */
TP_ACPI_HOTKEYSCAN_UNK7,
TP_ACPI_HOTKEYSCAN_UNK8,

TP_ACPI_HOTKEYSCAN_MUTE2,
TP_ACPI_HOTKEYSCAN_BRIGHTNESS_ZERO,
TP_ACPI_HOTKEYSCAN_CLIPPING_TOOL,
TP_ACPI_HOTKEYSCAN_CLOUD,
TP_ACPI_HOTKEYSCAN_UNK9,
TP_ACPI_HOTKEYSCAN_VOICE,
TP_ACPI_HOTKEYSCAN_UNK10,
TP_ACPI_HOTKEYSCAN_GESTURES,
TP_ACPI_HOTKEYSCAN_UNK11,
TP_ACPI_HOTKEYSCAN_UNK12,
TP_ACPI_HOTKEYSCAN_UNK13,
TP_ACPI_HOTKEYSCAN_CONFIG,
TP_ACPI_HOTKEYSCAN_NEW_TAB,
TP_ACPI_HOTKEYSCAN_RELOAD,
TP_ACPI_HOTKEYSCAN_BACK,
TP_ACPI_HOTKEYSCAN_MIC_DOWN,
TP_ACPI_HOTKEYSCAN_MIC_UP,
TP_ACPI_HOTKEYSCAN_MIC_CANCELLATION,
TP_ACPI_HOTKEYSCAN_CAMERA_MODE,
TP_ACPI_HOTKEYSCAN_ROTATE_DISPLAY,

/* Hotkey keymap size */
TPACPI_HOTKEY_MAP_LEN
};
Expand Down Expand Up @@ -3170,6 +3191,13 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
/* (assignments unknown, please report if found) */
KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,

/* No assignments, only used for Adaptive keyboards. */
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 */
Expand Down Expand Up @@ -3226,6 +3254,35 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)

/* Extra keys in use since the X240 / T440 / T540 */
KEY_CONFIG, KEY_SEARCH, KEY_SCALE, KEY_FILE,

/*
* These are the adaptive keyboard keycodes for Carbon X1 2014.
* The first item in this list is the Mute button which is
* emitted with 0x103 through
* adaptive_keyboard_hotkey_notify_hotkey() when the sound
* symbol is held.
* We'll need to offset those by 0x20.
*/
KEY_RESERVED, /* Mute held, 0x103 */
KEY_BRIGHTNESS_MIN, /* Backlight off */
KEY_RESERVED, /* Clipping tool */
KEY_RESERVED, /* Cloud */
KEY_RESERVED,
KEY_VOICECOMMAND, /* Voice */
KEY_RESERVED,
KEY_RESERVED, /* Gestures */
KEY_RESERVED,
KEY_RESERVED,
KEY_RESERVED,
KEY_CONFIG, /* Settings */
KEY_RESERVED, /* New tab */
KEY_REFRESH, /* Reload */
KEY_BACK, /* Back */
KEY_RESERVED, /* Microphone down */
KEY_RESERVED, /* Microphone up */
KEY_RESERVED, /* Microphone cancellation */
KEY_RESERVED, /* Camera mode */
KEY_RESERVED, /* Rotate display, 0x116 */
},
};

Expand Down Expand Up @@ -3527,6 +3584,8 @@ static const int adaptive_keyboard_modes[] = {

#define DFR_CHANGE_ROW 0x101
#define DFR_SHOW_QUICKVIEW_ROW 0x102
#define FIRST_ADAPTIVE_KEY 0x103
#define ADAPTIVE_KEY_OFFSET 0x020

/* press Fn key a while second, it will switch to Function Mode. Then
* release Fn key, previous mode be restored.
Expand Down Expand Up @@ -3582,6 +3641,7 @@ static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode)
{
u32 current_mode = 0;
int new_mode = 0;
int keycode;

switch (scancode) {
case DFR_CHANGE_ROW:
Expand Down Expand Up @@ -3614,7 +3674,25 @@ static bool adaptive_keyboard_hotkey_notify_hotkey(unsigned int scancode)
return true;

default:
return false;
if (scancode < FIRST_ADAPTIVE_KEY || scancode > FIRST_ADAPTIVE_KEY +
TPACPI_HOTKEY_MAP_LEN - ADAPTIVE_KEY_OFFSET) {
pr_info("Unhandled adaptive keyboard key: 0x%x\n",
scancode);
return false;
}
keycode = hotkey_keycode_map[scancode - FIRST_ADAPTIVE_KEY + ADAPTIVE_KEY_OFFSET];
if (keycode != KEY_RESERVED) {
mutex_lock(&tpacpi_inputdev_send_mutex);

input_report_key(tpacpi_inputdev, keycode, 1);
input_sync(tpacpi_inputdev);

input_report_key(tpacpi_inputdev, keycode, 0);
input_sync(tpacpi_inputdev);

mutex_unlock(&tpacpi_inputdev_send_mutex);
}
return true;
}
}

Expand Down

0 comments on commit 6a68d85

Please sign in to comment.