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 <cr...@iki.fi>
---
 drivers/media/usb/dvb-usb-v2/af9015.c | 40 ++++++++++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/drivers/media/usb/dvb-usb-v2/af9015.c 
b/drivers/media/usb/dvb-usb-v2/af9015.c
index b86d0f2..2cf7ad2 100644
--- a/drivers/media/usb/dvb-usb-v2/af9015.c
+++ b/drivers/media/usb/dvb-usb-v2/af9015.c
@@ -1317,6 +1317,43 @@ static int af9015_get_rc_config(struct dvb_usb_device 
*d, struct dvb_usb_rc *rc)
        #define af9015_get_rc_config NULL
 #endif
 
+static int af9015_probe(struct usb_interface *intf,
+               const struct usb_device_id *id)
+{
+       struct usb_device *udev = interface_to_usbdev(intf);
+       char manufacturer[sizeof("ITE Technologies, Inc.")];
+
+       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("ITE Technologies, Inc.", 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 struct dvb_usb_device_properties af9015_props = {
@@ -1425,6 +1462,7 @@ static const struct usb_device_id af9015_id_table[] = {
                &af9015_props, "AverMedia AVerTV Volar M (A815Mac)", NULL) },
        { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_RC,
                &af9015_props, "TerraTec Cinergy T Stick RC", 
RC_MAP_TERRATEC_SLIM_2) },
+       /* XXX: that same ID [0ccd:0099] is used by af9035 driver too */
        { DVB_USB_DEVICE(USB_VID_TERRATEC, 
USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
                &af9015_props, "TerraTec Cinergy T Stick Dual RC", 
RC_MAP_TERRATEC_SLIM) },
        { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850T,
@@ -1441,7 +1479,7 @@ MODULE_DEVICE_TABLE(usb, af9015_id_table);
 static struct usb_driver af9015_usb_driver = {
        .name = KBUILD_MODNAME,
        .id_table = af9015_id_table,
-       .probe = dvb_usbv2_probe,
+       .probe = af9015_probe,
        .disconnect = dvb_usbv2_disconnect,
        .suspend = dvb_usbv2_suspend,
        .resume = dvb_usbv2_resume,
-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to