[media] af9035: [0ccd:0099] TerraTec Cinergy T Stick Dual RC (rev. 2)
authorAntti Palosaari <crope@iki.fi>
Fri, 11 Jan 2013 19:22:07 +0000 (16:22 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Mar 2013 21:49:20 +0000 (18:49 -0300)
That same USB ID is used both AF9015 and AF9035 driver.
iManufacturer is only thing we can select correct driver without a I/O.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/dvb-usb-v2/af9035.c

index 1a4aeefefb6a4a175c70fa1041b96ad6fa39758e..ad66ac4b39133ef5b8103c6295b7a6d5c6247879 100644 (file)
@@ -1328,6 +1328,43 @@ err:
        #define af9035_get_rc_config NULL
 #endif
 
+static int af9035_probe(struct usb_interface *intf,
+               const struct usb_device_id *id)
+{
+       struct usb_device *udev = interface_to_usbdev(intf);
+       char manufacturer[sizeof("Afatech")];
+
+       memset(manufacturer, 0, sizeof(manufacturer));
+       usb_string(udev, udev->descriptor.iManufacturer,
+                       manufacturer, sizeof(manufacturer));
+       /*
+        * There is two devices having same ID but different chipset. One uses
+        * AF9015 and the other IT9135 chipset. Only difference seen on lsusb
+        * is iManufacturer string.
+        *
+        * idVendor           0x0ccd TerraTec Electronic GmbH
+        * idProduct          0x0099
+        * bcdDevice            2.00
+        * iManufacturer           1 Afatech
+        * iProduct                2 DVB-T 2
+        *
+        * idVendor           0x0ccd TerraTec Electronic GmbH
+        * idProduct          0x0099
+        * bcdDevice            2.00
+        * iManufacturer           1 ITE Technologies, Inc.
+        * iProduct                2 DVB-T TV Stick
+        */
+       if ((le16_to_cpu(udev->descriptor.idVendor) == USB_VID_TERRATEC) &&
+                       (le16_to_cpu(udev->descriptor.idProduct) == 0x0099)) {
+               if (!strcmp("Afatech", manufacturer)) {
+                       dev_dbg(&udev->dev, "%s: rejecting device\n", __func__);
+                       return -ENODEV;
+               }
+       }
+
+       return dvb_usbv2_probe(intf, id);
+}
+
 /* interface 0 is used by DVB-T receiver and
    interface 1 is for remote controller (HID) */
 static const struct dvb_usb_device_properties af9035_props = {
@@ -1386,6 +1423,9 @@ static const struct usb_device_id af9035_id_table[] = {
                &af9035_props, "Asus U3100Mini Plus", NULL) },
         { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00aa,
                &af9035_props, "TerraTec Cinergy T Stick (rev. 2)", NULL) },
+       /* XXX: that same ID [0ccd:0099] is used by af9015 driver too */
+       { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x0099,
+               &af9035_props, "TerraTec Cinergy T Stick Dual RC (rev. 2)", NULL) },
        { }
 };
 MODULE_DEVICE_TABLE(usb, af9035_id_table);
@@ -1393,7 +1433,7 @@ MODULE_DEVICE_TABLE(usb, af9035_id_table);
 static struct usb_driver af9035_usb_driver = {
        .name = KBUILD_MODNAME,
        .id_table = af9035_id_table,
-       .probe = dvb_usbv2_probe,
+       .probe = af9035_probe,
        .disconnect = dvb_usbv2_disconnect,
        .suspend = dvb_usbv2_suspend,
        .resume = dvb_usbv2_resume,