aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-logitech-hidpp.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 17e27e98e442..361e97da1169 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -39,6 +39,7 @@ MODULE_AUTHOR("Nestor Lopez Casado <nlopezcasad@logitech.com>");
39/* bits 1..20 are reserved for classes */ 39/* bits 1..20 are reserved for classes */
40#define HIDPP_QUIRK_DELAYED_INIT BIT(21) 40#define HIDPP_QUIRK_DELAYED_INIT BIT(21)
41#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22) 41#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
42#define HIDPP_QUIRK_MULTI_INPUT BIT(23)
42 43
43/* 44/*
44 * There are two hidpp protocols in use, the first version hidpp10 is known 45 * There are two hidpp protocols in use, the first version hidpp10 is known
@@ -614,6 +615,12 @@ static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
614 struct hid_field *field, struct hid_usage *usage, 615 struct hid_field *field, struct hid_usage *usage,
615 unsigned long **bit, int *max) 616 unsigned long **bit, int *max)
616{ 617{
618 struct hidpp_device *hidpp = hid_get_drvdata(hdev);
619
620 if ((hidpp->quirks & HIDPP_QUIRK_MULTI_INPUT) &&
621 (field->application == HID_GD_KEYBOARD))
622 return 0;
623
617 return -1; 624 return -1;
618} 625}
619 626
@@ -622,6 +629,10 @@ static void wtp_populate_input(struct hidpp_device *hidpp,
622{ 629{
623 struct wtp_data *wd = hidpp->private_data; 630 struct wtp_data *wd = hidpp->private_data;
624 631
632 if ((hidpp->quirks & HIDPP_QUIRK_MULTI_INPUT) && origin_is_hid_core)
633 /* this is the generic hid-input call */
634 return;
635
625 __set_bit(EV_ABS, input_dev->evbit); 636 __set_bit(EV_ABS, input_dev->evbit);
626 __set_bit(EV_KEY, input_dev->evbit); 637 __set_bit(EV_KEY, input_dev->evbit);
627 __clear_bit(EV_REL, input_dev->evbit); 638 __clear_bit(EV_REL, input_dev->evbit);
@@ -1114,6 +1125,10 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
1114 if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT) 1125 if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
1115 connect_mask &= ~HID_CONNECT_HIDINPUT; 1126 connect_mask &= ~HID_CONNECT_HIDINPUT;
1116 1127
1128 /* Re-enable hidinput for multi-input devices */
1129 if (hidpp->quirks & HIDPP_QUIRK_MULTI_INPUT)
1130 connect_mask |= HID_CONNECT_HIDINPUT;
1131
1117 ret = hid_hw_start(hdev, connect_mask); 1132 ret = hid_hw_start(hdev, connect_mask);
1118 if (ret) { 1133 if (ret) {
1119 hid_err(hdev, "%s:hid_hw_start returned error\n", __func__); 1134 hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
@@ -1160,6 +1175,11 @@ static const struct hid_device_id hidpp_devices[] = {
1160 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 1175 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
1161 USB_DEVICE_ID_LOGITECH_T651), 1176 USB_DEVICE_ID_LOGITECH_T651),
1162 .driver_data = HIDPP_QUIRK_CLASS_WTP }, 1177 .driver_data = HIDPP_QUIRK_CLASS_WTP },
1178 { /* Keyboard TK820 */
1179 HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE,
1180 USB_VENDOR_ID_LOGITECH, 0x4102),
1181 .driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_MULTI_INPUT |
1182 HIDPP_QUIRK_CLASS_WTP },
1163 1183
1164 { HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE, 1184 { HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE,
1165 USB_VENDOR_ID_LOGITECH, HID_ANY_ID)}, 1185 USB_VENDOR_ID_LOGITECH, HID_ANY_ID)},