HID: lenovo: Rework how the tp10ubkbd code decides which USB interface to use
authorHans de Goede <hdegoede@redhat.com>
Sun, 4 Apr 2021 08:04:31 +0000 (10:04 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 7 Apr 2021 10:48:19 +0000 (12:48 +0200)
Instead of looking for a hdev with a type of HID_TYPE_USBMOUSE find
the interface for the mute/mic-mute/fn-lock LEDs by checking for the
output-report which is used to set them.

This is a preparation patch for adding support for the LEDs on the
X1 tablet thin keyboard which uses the same output-report, but has
a separate (third) USB interface for the touchpad/mouse functionality.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-lenovo.c

index 2287142..a33de50 100644 (file)
@@ -959,11 +959,24 @@ static const struct attribute_group lenovo_attr_group_tp10ubkbd = {
 
 static int lenovo_probe_tp10ubkbd(struct hid_device *hdev)
 {
+       struct hid_report_enum *rep_enum;
        struct lenovo_drvdata *data;
+       struct hid_report *rep;
+       bool found;
        int ret;
 
-       /* All the custom action happens on the USBMOUSE device for USB */
-       if (hdev->type != HID_TYPE_USBMOUSE)
+       /*
+        * The LEDs and the Fn-lock functionality use output report 9,
+        * with an application of 0xffa0001, add the LEDs on the interface
+        * with this output report.
+        */
+       found = false;
+       rep_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
+       list_for_each_entry(rep, &rep_enum->report_list, list) {
+               if (rep->application == 0xffa00001)
+                       found = true;
+       }
+       if (!found)
                return 0;
 
        data = devm_kzalloc(&hdev->dev, sizeof(*data), GFP_KERNEL);