]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/media/dvb/dvb-usb/dvb-usb-init.c
DVB (2420): Makes integration of future devices easier
[mv-sheeva.git] / drivers / media / dvb / dvb-usb / dvb-usb-init.c
index 3aadec974cf17b57d0a4c2b420532cd002c77545..2f9c3638adcf58b9d627156291a2ab208d4fa412 100644 (file)
@@ -18,8 +18,12 @@ int dvb_usb_debug;
 module_param_named(debug,dvb_usb_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64 (or-able))." DVB_USB_DEBUG_STATUS);
 
+int dvb_usb_disable_rc_polling;
+module_param_named(disable_rc_polling, dvb_usb_disable_rc_polling, int, 0644);
+MODULE_PARM_DESC(disable_rc_polling, "disable remote control polling (default: 0).");
+
 /* general initialization functions */
-int dvb_usb_exit(struct dvb_usb_device *d)
+static int dvb_usb_exit(struct dvb_usb_device *d)
 {
        deb_info("state before exiting everything: %x\n",d->state);
        dvb_usb_remote_exit(d);
@@ -47,17 +51,17 @@ static int dvb_usb_init(struct dvb_usb_device *d)
 
 /* speed - when running at FULL speed we need a HW PID filter */
        if (d->udev->speed == USB_SPEED_FULL && !(d->props.caps & DVB_USB_HAS_PID_FILTER)) {
-               err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a HW PID filter)");
+               err("This USB2.0 device cannot be run on a USB1.1 port. (it lacks a hardware PID filter)");
                return -ENODEV;
        }
 
        if ((d->udev->speed == USB_SPEED_FULL && d->props.caps & DVB_USB_HAS_PID_FILTER) ||
                (d->props.caps & DVB_USB_NEED_PID_FILTERING)) {
-               info("will use the device's hw PID filter.");
+               info("will use the device's hardware PID filter (table count: %d).",d->props.pid_filter_count);
                d->pid_filtering = 1;
                d->max_feed_count = d->props.pid_filter_count;
        } else {
-               info("will pass the complete MPEG2 transport stream to the demuxer.");
+               info("will pass the complete MPEG2 transport stream to the software demuxer.");
                d->pid_filtering = 0;
                d->max_feed_count = 255;
        }
@@ -124,7 +128,9 @@ static struct dvb_usb_device_description * dvb_usb_find_device(struct usb_device
 /*
  * USB
  */
-int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_properties *props, struct module *owner)
+
+int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_properties
+               *props, struct module *owner,struct dvb_usb_device **du)
 {
        struct usb_device *udev = interface_to_usbdev(intf);
        struct dvb_usb_device *d = NULL;
@@ -139,35 +145,40 @@ int dvb_usb_device_init(struct usb_interface *intf, struct dvb_usb_properties *p
 
        if (cold) {
                info("found a '%s' in cold state, will try to load a firmware",desc->name);
-               ret = usb_cypress_load_firmware(udev,props->firmware,props->usb_ctrl);
-       } else {
-               info("found a '%s' in warm state.",desc->name);
-               d = kmalloc(sizeof(struct dvb_usb_device),GFP_KERNEL);
-               if (d == NULL) {
-                       err("no memory for 'struct dvb_usb_device'");
+               ret = dvb_usb_download_firmware(udev,props);
+               if (!props->no_reconnect)
                        return ret;
+       }
+
+       info("found a '%s' in warm state.",desc->name);
+       d = kmalloc(sizeof(struct dvb_usb_device),GFP_KERNEL);
+       if (d == NULL) {
+               err("no memory for 'struct dvb_usb_device'");
+               return ret;
+       }
+       memset(d,0,sizeof(struct dvb_usb_device));
+
+       d->udev = udev;
+       memcpy(&d->props,props,sizeof(struct dvb_usb_properties));
+       d->desc = desc;
+       d->owner = owner;
+
+       if (d->props.size_of_priv > 0) {
+               d->priv = kmalloc(d->props.size_of_priv,GFP_KERNEL);
+               if (d->priv == NULL) {
+                       err("no memory for priv in 'struct dvb_usb_device'");
+                       kfree(d);
+                       return -ENOMEM;
                }
-               memset(d,0,sizeof(struct dvb_usb_device));
-
-               d->udev = udev;
-               memcpy(&d->props,props,sizeof(struct dvb_usb_properties));
-               d->desc = desc;
-               d->owner = owner;
-
-               if (d->props.size_of_priv > 0) {
-                       d->priv = kmalloc(d->props.size_of_priv,GFP_KERNEL);
-                       if (d->priv == NULL) {
-                               err("no memory for priv in 'struct dvb_usb_device'");
-                               kfree(d);
-                               return -ENOMEM;
-                       }
-                       memset(d->priv,0,d->props.size_of_priv);
-               }
+               memset(d->priv,0,d->props.size_of_priv);
+       }
 
-               usb_set_intfdata(intf, d);
+       usb_set_intfdata(intf, d);
 
-               ret = dvb_usb_init(d);
-       }
+       if (du != NULL)
+               *du = d;
+
+       ret = dvb_usb_init(d);
 
        if (ret == 0)
                info("%s successfully initialized and connected.",desc->name);
@@ -192,19 +203,6 @@ void dvb_usb_device_exit(struct usb_interface *intf)
 }
 EXPORT_SYMBOL(dvb_usb_device_exit);
 
-/* module stuff */
-static int __init dvb_usb_module_init(void)
-{
-       return 0;
-}
-
-static void __exit dvb_usb_module_exit(void)
-{
-}
-
-module_init (dvb_usb_module_init);
-module_exit (dvb_usb_module_exit);
-
 MODULE_VERSION("0.3");
 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
 MODULE_DESCRIPTION("A library module containing commonly used USB and DVB function USB DVB devices");