From 0bc50ef412cda6b7a610754a9f2263a7f2527c78 Mon Sep 17 00:00:00 2001 From: Antti Palosaari Date: Mon, 19 Mar 2012 16:27:47 -0300 Subject: [PATCH] --- yaml --- r: 306441 b: refs/heads/master c: 943a903459db81a07c3af703605d4eb6fb64b523 h: refs/heads/master i: 306439: 75de08f0f07af26d676c60d15af4fc4e4aaea5a3 v: v3 --- [refs] | 2 +- trunk/drivers/media/dvb/dvb-usb/rtl28xxu.c | 25 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 95389f0794f4..2b7b7624056b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 662f9602bdea183456c49260e3bd2edfad4be471 +refs/heads/master: 943a903459db81a07c3af703605d4eb6fb64b523 diff --git a/trunk/drivers/media/dvb/dvb-usb/rtl28xxu.c b/trunk/drivers/media/dvb/dvb-usb/rtl28xxu.c index 8f4736a10fc8..4e69e9db849e 100644 --- a/trunk/drivers/media/dvb/dvb-usb/rtl28xxu.c +++ b/trunk/drivers/media/dvb/dvb-usb/rtl28xxu.c @@ -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);