aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2012-03-19 15:27:47 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-15 08:35:28 -0400
commit943a903459db81a07c3af703605d4eb6fb64b523 (patch)
tree28e68b109c2cbc943cec8a901db0e38949d73b78 /drivers/media/dvb
parent662f9602bdea183456c49260e3bd2edfad4be471 (diff)
[media] rtl28xxu: dynamic USB ID support
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>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/dvb-usb/rtl28xxu.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 8f4736a10fc..4e69e9db849 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -909,6 +909,8 @@ static int rtl28xxu_probe(struct usb_interface *intf,
909 int ret, i; 909 int ret, i;
910 int properties_count = ARRAY_SIZE(rtl28xxu_properties); 910 int properties_count = ARRAY_SIZE(rtl28xxu_properties);
911 struct dvb_usb_device *d; 911 struct dvb_usb_device *d;
912 struct usb_device *udev;
913 bool found;
912 914
913 deb_info("%s: interface=%d\n", __func__, 915 deb_info("%s: interface=%d\n", __func__,
914 intf->cur_altsetting->desc.bInterfaceNumber); 916 intf->cur_altsetting->desc.bInterfaceNumber);
@@ -916,6 +918,29 @@ static int rtl28xxu_probe(struct usb_interface *intf,
916 if (intf->cur_altsetting->desc.bInterfaceNumber != 0) 918 if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
917 return 0; 919 return 0;
918 920
921 /* Dynamic USB ID support. Replaces first device ID with current one .*/
922 udev = interface_to_usbdev(intf);
923
924 for (i = 0, found = false; i < ARRAY_SIZE(rtl28xxu_table) - 1; i++) {
925 if (rtl28xxu_table[i].idVendor ==
926 le16_to_cpu(udev->descriptor.idVendor) &&
927 rtl28xxu_table[i].idProduct ==
928 le16_to_cpu(udev->descriptor.idProduct)) {
929 found = true;
930 break;
931 }
932 }
933
934 if (!found) {
935 deb_info("%s: using dynamic ID %04x:%04x\n", __func__,
936 le16_to_cpu(udev->descriptor.idVendor),
937 le16_to_cpu(udev->descriptor.idProduct));
938 rtl28xxu_properties[0].devices[0].warm_ids[0]->idVendor =
939 le16_to_cpu(udev->descriptor.idVendor);
940 rtl28xxu_properties[0].devices[0].warm_ids[0]->idProduct =
941 le16_to_cpu(udev->descriptor.idProduct);
942 }
943
919 for (i = 0; i < properties_count; i++) { 944 for (i = 0; i < properties_count; i++) {
920 ret = dvb_usb_device_init(intf, &rtl28xxu_properties[i], 945 ret = dvb_usb_device_init(intf, &rtl28xxu_properties[i],
921 THIS_MODULE, &d, adapter_nr); 946 THIS_MODULE, &d, adapter_nr);