[media] rtl28xxu: dynamic USB ID support
authorAntti Palosaari <crope@iki.fi>
Mon, 19 Mar 2012 19:27:47 +0000 (16:27 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 15 May 2012 12:35:28 +0000 (09:35 -0300)
DVB USB core refuses to load driver when current USB ID
does not match IDs on driver table. Due to that dynamic
IDs does not work. Replace reference design ID by dynamic
ID in .probe() in order to get it working.

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

index 8f4736a10fc85a2ba3e86e37c0973ca4db2c721b..4e69e9db849ee5d8f9a01b518ca265d32a15797c 100644 (file)
@@ -909,6 +909,8 @@ static int rtl28xxu_probe(struct usb_interface *intf,
        int ret, i;
        int properties_count = ARRAY_SIZE(rtl28xxu_properties);
        struct dvb_usb_device *d;
+       struct usb_device *udev;
+       bool found;
 
        deb_info("%s: interface=%d\n", __func__,
                intf->cur_altsetting->desc.bInterfaceNumber);
@@ -916,6 +918,29 @@ static int rtl28xxu_probe(struct usb_interface *intf,
        if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
                return 0;
 
+       /* Dynamic USB ID support. Replaces first device ID with current one .*/
+       udev = interface_to_usbdev(intf);
+
+       for (i = 0, found = false; i < ARRAY_SIZE(rtl28xxu_table) - 1; i++) {
+               if (rtl28xxu_table[i].idVendor ==
+                               le16_to_cpu(udev->descriptor.idVendor) &&
+                               rtl28xxu_table[i].idProduct ==
+                               le16_to_cpu(udev->descriptor.idProduct)) {
+                       found = true;
+                       break;
+               }
+       }
+
+       if (!found) {
+               deb_info("%s: using dynamic ID %04x:%04x\n", __func__,
+                               le16_to_cpu(udev->descriptor.idVendor),
+                               le16_to_cpu(udev->descriptor.idProduct));
+               rtl28xxu_properties[0].devices[0].warm_ids[0]->idVendor =
+                               le16_to_cpu(udev->descriptor.idVendor);
+               rtl28xxu_properties[0].devices[0].warm_ids[0]->idProduct =
+                               le16_to_cpu(udev->descriptor.idProduct);
+       }
+
        for (i = 0; i < properties_count; i++) {
                ret = dvb_usb_device_init(intf, &rtl28xxu_properties[i],
                                THIS_MODULE, &d, adapter_nr);