[media] dvb_usb_v2: implement .get_adapter_count()
authorAntti Palosaari <crope@iki.fi>
Fri, 25 May 2012 00:11:42 +0000 (21:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 4 Aug 2012 10:56:21 +0000 (07:56 -0300)
Callback to resolve adapter count of current device.
Old static .num_adapters field can be still used but
the new .get_adapter_count() has priority if both
offered by the driver.

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

index dc9d09bce107bb89bc3c7e46fbab2e76a9a6f594..a3cc557298b4cb6e43eb6d8b8350fac3974161e8 100644 (file)
@@ -271,6 +271,7 @@ struct dvb_usb_device_properties {
        int size_of_priv;
 
        int num_adapters;
+       int (*get_adapter_count) (struct dvb_usb_device *);
        struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
 
        int (*power_ctrl)       (struct dvb_usb_device *, int);
index 3314f36208ff06fb85ae9ee6ae1770abeacba893..11d5c96a460012f24cc76306d5d302eef0f72d65 100644 (file)
@@ -34,9 +34,19 @@ MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a" \
 static int dvb_usb_adapter_init(struct dvb_usb_device *d)
 {
        struct dvb_usb_adapter *adap;
-       int ret, n, o;
+       int ret, n, o, adapter_count;
 
-       for (n = 0; n < d->props.num_adapters; n++) {
+       /* resolve adapter count */
+       adapter_count = d->props.num_adapters;
+       if (d->props.get_adapter_count) {
+               ret = d->props.get_adapter_count(d);
+               if (ret < 0)
+                       goto err;
+
+               adapter_count = ret;
+       }
+
+       for (n = 0; n < adapter_count; n++) {
                adap = &d->adapter[n];
                adap->dev = d;
                adap->id  = n;
@@ -133,6 +143,9 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d)
        }
 
        return 0;
+err:
+       pr_debug("%s: failed=%d\n", __func__, ret);
+       return ret;
 }
 
 static int dvb_usb_adapter_exit(struct dvb_usb_device *d)
@@ -297,7 +310,7 @@ EXPORT_SYMBOL(dvb_usbv2_device_init);
 void dvb_usbv2_device_exit(struct usb_interface *intf)
 {
        struct dvb_usb_device *d = usb_get_intfdata(intf);
-       const char *name;
+       const char *name = NULL;
 
        usb_set_intfdata(intf, NULL);
        if (d) {