Merge branches 'for-3.18/upstream-fixes' and 'for-3.19/upstream' into for-linus
[cascardo/linux.git] / drivers / hid / hid-core.c
index 3402033..bae74af 100644 (file)
@@ -779,16 +779,6 @@ static int hid_scan_report(struct hid_device *hid)
            (hid->group == HID_GROUP_MULTITOUCH))
                hid->group = HID_GROUP_MULTITOUCH_WIN_8;
 
-       /*
-       * Vendor specific handlings
-       */
-       if ((hid->vendor == USB_VENDOR_ID_SYNAPTICS) &&
-           (hid->group == HID_GROUP_GENERIC) &&
-           /* only bind to the mouse interface of composite USB devices */
-           (hid->bus != BUS_USB || hid->type == HID_TYPE_USBMOUSE))
-               /* hid-rmi should take care of them, not hid-generic */
-               hid->group = HID_GROUP_RMI;
-
        /*
         * Vendor specific handlings
         */
@@ -796,6 +786,13 @@ static int hid_scan_report(struct hid_device *hid)
        case USB_VENDOR_ID_WACOM:
                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;
+               break;
        }
 
        vfree(parser);
@@ -1910,6 +1907,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RAT7) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_MMO7) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9) },
 #endif
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
@@ -2539,7 +2537,8 @@ int hid_add_device(struct hid_device *hdev)
         * Scan generic devices for group information
         */
        if (hid_ignore_special_drivers ||
-           !hid_match_id(hdev, hid_have_special_driver)) {
+           (!hdev->group &&
+            !hid_match_id(hdev, hid_have_special_driver))) {
                ret = hid_scan_report(hdev);
                if (ret)
                        hid_warn(hdev, "bad device descriptor (%d)\n", ret);