]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/hid/hid-core.c
HID: rmi: Scan the report descriptor to determine if the device is suitable for the...
[mirror_ubuntu-artful-kernel.git] / drivers / hid / hid-core.c
index c3d0ac1a0988096eaacbe8063b354399b6a85e14..81665b4f225827a78863dde889cc6b16e694783b 100644 (file)
@@ -698,6 +698,7 @@ static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)
 static void hid_scan_collection(struct hid_parser *parser, unsigned type)
 {
        struct hid_device *hid = parser->device;
+       int i;
 
        if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
            type == HID_COLLECTION_PHYSICAL)
@@ -707,6 +708,14 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type)
            hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3 &&
            hid->group == HID_GROUP_MULTITOUCH)
                hid->group = HID_GROUP_GENERIC;
+
+       if ((parser->global.usage_page << 16) == HID_UP_GENDESK)
+               for (i = 0; i < parser->local.usage_index; i++)
+                       if (parser->local.usage[i] == HID_GD_POINTER)
+                               parser->scan_flags |= HID_SCAN_FLAG_GD_POINTER;
+
+       if ((parser->global.usage_page << 16) >= HID_UP_MSVENDOR)
+               parser->scan_flags |= HID_SCAN_FLAG_VENDOR_SPECIFIC;
 }
 
 static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
@@ -792,11 +801,14 @@ static int hid_scan_report(struct hid_device *hid)
                hid->group = HID_GROUP_WACOM;
                break;
        case USB_VENDOR_ID_SYNAPTICS:
-               if ((hid->group == HID_GROUP_GENERIC) &&
-                   (hid->bus != BUS_USB || hid->type == HID_TYPE_USBMOUSE))
-                       /* hid-rmi should only bind to the mouse interface of
-                        * composite USB devices */
-                       hid->group = HID_GROUP_RMI;
+               if (hid->group == HID_GROUP_GENERIC)
+                       if ((parser->scan_flags & HID_SCAN_FLAG_VENDOR_SPECIFIC)
+                           && (parser->scan_flags & HID_SCAN_FLAG_GD_POINTER))
+                               /*
+                                * hid-rmi should take care of them,
+                                * not hid-generic
+                                */
+                               hid->group = HID_GROUP_RMI;
                break;
        }