summaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-asus.c
diff options
context:
space:
mode:
authorChris Chiu <chiu@endlessm.com>2017-03-01 22:48:51 +0100
committerJiri Kosina <jkosina@suse.cz>2017-03-30 11:16:53 +0200
commit1caccc2565a83b79dd6e4af15bea35995487a379 (patch)
tree13033e50d41924c7418c49b391f5cf02fa188e61 /drivers/hid/hid-asus.c
parentHID: asus: drop dependency on I2C_HID (diff)
downloadlinux-1caccc2565a83b79dd6e4af15bea35995487a379.tar.xz
linux-1caccc2565a83b79dd6e4af15bea35995487a379.zip
HID: asus: support Republic of Gamers special keys
Add support for the special keys found on the internal keyboard of the Asus Republic of Gamers (ROG) laptop models GL553VD, GL553VE, GL753VD and GL753VE. Signed-off-by: Chris Chiu <chiu@endlessm.com> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-asus.c')
-rw-r--r--drivers/hid/hid-asus.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
index 70b12f89a193..5bae6ffcae94 100644
--- a/drivers/hid/hid-asus.c
+++ b/drivers/hid/hid-asus.c
@@ -199,6 +199,8 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi)
return 0;
}
+#define rog_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, \
+ max, EV_KEY, (c))
static int asus_input_mapping(struct hid_device *hdev,
struct hid_input *hi, struct hid_field *field,
struct hid_usage *usage, unsigned long **bit,
@@ -213,6 +215,38 @@ static int asus_input_mapping(struct hid_device *hdev,
return -1;
}
+ /* ASUS Republic of Gamers laptop keyboard hotkeys */
+ if ((usage->hid & HID_USAGE_PAGE) == 0xff310000) {
+ set_bit(EV_REP, hi->input->evbit);
+ switch (usage->hid & HID_USAGE) {
+ case 0x10: rog_map_key_clear(KEY_BRIGHTNESSDOWN); break;
+ case 0x20: rog_map_key_clear(KEY_BRIGHTNESSUP); break;
+ case 0x35: rog_map_key_clear(KEY_DISPLAY_OFF); break;
+ case 0x6c: rog_map_key_clear(KEY_SLEEP); break;
+ case 0x82: rog_map_key_clear(KEY_CAMERA); break;
+ case 0x88: rog_map_key_clear(KEY_WLAN); break;
+ case 0xb5: rog_map_key_clear(KEY_CALC); break;
+ case 0xc4: rog_map_key_clear(KEY_KBDILLUMUP); break;
+ case 0xc5: rog_map_key_clear(KEY_KBDILLUMDOWN); break;
+
+ /* ASUS touchpad toggle */
+ case 0x6b: rog_map_key_clear(KEY_F21); break;
+
+ /* ROG key */
+ case 0x38: rog_map_key_clear(KEY_PROG1); break;
+
+ /* Fn+C ASUS Splendid */
+ case 0xba: rog_map_key_clear(KEY_PROG2); break;
+
+ /* Fn+Space Power4Gear Hybrid */
+ case 0x5c: rog_map_key_clear(KEY_PROG3); break;
+
+ default:
+ return 0;
+ }
+ return 1;
+ }
+
return 0;
}
@@ -323,6 +357,10 @@ static const struct hid_device_id asus_devices[] = {
USB_DEVICE_ID_ASUSTEK_NOTEBOOK_KEYBOARD), KEYBOARD_QUIRKS},
{ HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK,
USB_DEVICE_ID_ASUSTEK_TOUCHPAD), TOUCHPAD_QUIRKS },
+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
+ USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
+ USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2) },
{ }
};
MODULE_DEVICE_TABLE(hid, asus_devices);