Merge remote-tracking branch 'spi/fix/core' into spi-linus
[firefly-linux-kernel-4.4.55.git] / drivers / hid / hid-lg.c
index 5332fb7d072a2e2086ba445686a09a9f8dc7d525..c690fae02cf823d16b6d985d944b6bda143b6282 100644 (file)
@@ -620,6 +620,7 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
                        usage->code == ABS_Y || usage->code == ABS_Z ||
                        usage->code == ABS_RZ)) {
                switch (hdev->product) {
+               case USB_DEVICE_ID_LOGITECH_G29_WHEEL:
                case USB_DEVICE_ID_LOGITECH_WHEEL:
                case USB_DEVICE_ID_LOGITECH_MOMO_WHEEL:
                case USB_DEVICE_ID_LOGITECH_DFP_WHEEL:
@@ -658,10 +659,19 @@ static int lg_event(struct hid_device *hdev, struct hid_field *field,
 
 static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
+       struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
+       __u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
        unsigned int connect_mask = HID_CONNECT_DEFAULT;
        struct lg_drv_data *drv_data;
        int ret;
 
+       /* G29 only work with the 1st interface */
+       if ((hdev->product == USB_DEVICE_ID_LOGITECH_G29_WHEEL) &&
+           (iface_num != 0)) {
+               dbg_hid("%s: ignoring ifnum %d\n", __func__, iface_num);
+               return -ENODEV;
+       }
+
        drv_data = kzalloc(sizeof(struct lg_drv_data), GFP_KERNEL);
        if (!drv_data) {
                hid_err(hdev, "Insufficient memory, cannot allocate driver data\n");