|
@@ -43,6 +43,35 @@ struct lenovo_drvdata_cptkbd {
|
|
|
|
|
|
#define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
|
|
|
|
|
|
+static const __u8 lenovo_pro_dock_need_fixup_collection[] = {
|
|
|
+ 0x05, 0x88, /* Usage Page (Vendor Usage Page 0x88) */
|
|
|
+ 0x09, 0x01, /* Usage (Vendor Usage 0x01) */
|
|
|
+ 0xa1, 0x01, /* Collection (Application) */
|
|
|
+ 0x85, 0x04, /* Report ID (4) */
|
|
|
+ 0x19, 0x00, /* Usage Minimum (0) */
|
|
|
+ 0x2a, 0xff, 0xff, /* Usage Maximum (65535) */
|
|
|
+};
|
|
|
+
|
|
|
+static __u8 *lenovo_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
|
|
+ unsigned int *rsize)
|
|
|
+{
|
|
|
+ switch (hdev->product) {
|
|
|
+ case USB_DEVICE_ID_LENOVO_TPPRODOCK:
|
|
|
+ /* the fixups that need to be done:
|
|
|
+ * - get a reasonable usage max for the vendor collection
|
|
|
+ * 0x8801 from the report ID 4
|
|
|
+ */
|
|
|
+ if (*rsize >= 153 &&
|
|
|
+ memcmp(&rdesc[140], lenovo_pro_dock_need_fixup_collection,
|
|
|
+ sizeof(lenovo_pro_dock_need_fixup_collection)) == 0) {
|
|
|
+ rdesc[151] = 0x01;
|
|
|
+ rdesc[152] = 0x00;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return rdesc;
|
|
|
+}
|
|
|
+
|
|
|
static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
|
|
|
struct hid_input *hi, struct hid_field *field,
|
|
|
struct hid_usage *usage, unsigned long **bit, int *max)
|
|
@@ -784,6 +813,7 @@ static const struct hid_device_id lenovo_devices[] = {
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
|
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
|
|
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
|
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPPRODOCK) },
|
|
|
{ }
|
|
|
};
|
|
|
|
|
@@ -797,6 +827,7 @@ static struct hid_driver lenovo_driver = {
|
|
|
.probe = lenovo_probe,
|
|
|
.remove = lenovo_remove,
|
|
|
.raw_event = lenovo_raw_event,
|
|
|
+ .report_fixup = lenovo_report_fixup,
|
|
|
};
|
|
|
module_hid_driver(lenovo_driver);
|
|
|
|