[media] dvb_usb_v2: use identify_state() to resolve firmware name
authorAntti Palosaari <crope@iki.fi>
Tue, 19 Jun 2012 02:42:53 +0000 (23:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 4 Aug 2012 10:56:36 +0000 (07:56 -0300)
Merge get_firmware_name() to identify_state().

It is wise to resolve firmware name in that routine as it does
decision wether or not to load firmware at all. It is one very
rarely needed callback less.

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

index 101b399e76a121ac3daa90fa195b0cbac3f58637..6cecd755f1d98a083b0653c9725f3cfd34625a81 100644 (file)
@@ -324,7 +324,7 @@ static struct i2c_algorithm af9015_i2c_algo = {
        .functionality = af9015_i2c_func,
 };
 
-static int af9015_identify_state(struct dvb_usb_device *d)
+static int af9015_identify_state(struct dvb_usb_device *d, const char **name)
 {
        int ret;
        u8 reply;
index ba2a0c1a65a2415d58e2eb7c72825d7117eff6c7..b030055d14a31437fcbdf8d22c49e37751e6c674 100644 (file)
@@ -278,7 +278,7 @@ static struct i2c_algorithm af9035_i2c_algo = {
        .functionality = af9035_i2c_functionality,
 };
 
-static int af9035_identify_state(struct dvb_usb_device *d)
+static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 {
        int ret;
        u8 wbuf[1] = { 1 };
index 3a54fc3da702cf7522d2609e2c9497282efe7528..aecba307105e0f64bc137e4900b9e9c3c71d76dd 100644 (file)
@@ -197,12 +197,13 @@ struct dvb_usb_device_properties {
        struct module *owner;
        short *adapter_nr;
        u8 bInterfaceNumber;
-
        int size_of_priv;
 
+#define WARM                  0
+#define COLD                  1
+       int (*identify_state) (struct dvb_usb_device *, const char **);
        const char *firmware;
-       int (*get_firmware_name) (struct dvb_usb_device *, const char **);
-#define RECONNECTS_USB                  1
+#define RECONNECTS_USB        1
        int (*download_firmware) (struct dvb_usb_device *,
                        const struct firmware *);
 
@@ -219,10 +220,6 @@ struct dvb_usb_device_properties {
        int (*streaming_ctrl) (struct dvb_usb_adapter *, int);
        int (*fe_ioctl_override) (struct dvb_frontend *,
                        unsigned int, void *, unsigned int);
-
-#define WARM                  0
-#define COLD                  1
-       int (*identify_state) (struct dvb_usb_device *);
        int (*init) (struct dvb_usb_device *);
        void (*disconnect) (struct dvb_usb_device *);
        int (*get_rc_config) (struct dvb_usb_device *, struct dvb_usb_rc *);
index 2624daa94b4f6d415f95a12029c9ad8d56cbc4e1..24e1f2970d8eaa7ffac995d4ec2d266913d45713 100644 (file)
@@ -24,19 +24,10 @@ module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage,
 MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a" \
                " PID filter, if any (default: 0).");
 
-static int dvb_usbv2_download_firmware(struct dvb_usb_device *d)
+static int dvb_usbv2_download_firmware(struct dvb_usb_device *d, const char *name)
 {
        int ret;
-       const struct firmware *fw = NULL;
-       const char *name;
-
-       /* resolve firmware name */
-       name = d->props->firmware;
-       if (d->props->get_firmware_name) {
-               ret = d->props->get_firmware_name(d, &name);
-               if (ret < 0)
-                       goto err;
-       }
+       const struct firmware *fw;
 
        if (!d->props->download_firmware) {
                ret = -EINVAL;
@@ -395,7 +386,6 @@ static void dvb_usbv2_init_work(struct work_struct *work)
        int ret;
        struct dvb_usb_device *d =
                        container_of(work, struct dvb_usb_device, probe_work);
-       bool cold = false;
 
        d->work_pid = current->pid;
 
@@ -411,40 +401,42 @@ static void dvb_usbv2_init_work(struct work_struct *work)
        }
 
        if (d->props->identify_state) {
-               ret = d->props->identify_state(d);
+               const char *name = NULL;
+               ret = d->props->identify_state(d, &name);
                if (ret == 0) {
                        ;
                } else if (ret == COLD) {
-                       cold = true;
-                       ret = 0;
-               } else {
-                       goto err_usb_driver_release_interface;
-               }
-       }
-
-       if (cold) {
-               pr_info("%s: found a '%s' in cold state\n",
-                               KBUILD_MODNAME, d->name);
-               ret = dvb_usbv2_download_firmware(d);
-               if (ret == 0) {
-                       /* device is warm, continue initialization */
-                       ;
-               } else if (ret == RECONNECTS_USB) {
-                       /*
-                        * USB core will call disconnect() and then probe()
-                        * as device reconnects itself from the USB bus.
-                        * disconnect() will release all driver resources
-                        * and probe() is called for 'new' device. As 'new'
-                        * device is warm we should never go here again.
-                        */
-                       return;
+                       pr_info("%s: found a '%s' in cold state\n",
+                                       KBUILD_MODNAME, d->name);
+
+                       if (!name)
+                               name = d->props->firmware;
+
+                       ret = dvb_usbv2_download_firmware(d, name);
+                       if (ret == 0) {
+                               /* device is warm, continue initialization */
+                               ;
+                       } else if (ret == RECONNECTS_USB) {
+                               /*
+                                * USB core will call disconnect() and then
+                                * probe() as device reconnects itself from the
+                                * USB bus. disconnect() will release all driver
+                                * resources and probe() is called for 'new'
+                                * device. As 'new' device is warm we should
+                                * never go here again.
+                                */
+                               return;
+                       } else {
+                               /* Unexpected error. We must unregister driver
+                                * manually from the device, because device is
+                                * already register by returning from probe()
+                                * with success. usb_driver_release_interface()
+                                * finally calls disconnect() in order to free
+                                * resources.
+                                */
+                               goto err_usb_driver_release_interface;
+                       }
                } else {
-                       /* Unexpected fatal error. We must unregister driver
-                        * manually from the device, because device is already
-                        * register by returning from probe() with success.
-                        * usb_driver_release_interface() finally calls
-                        * disconnect() in order to free resources.
-                        */
                        goto err_usb_driver_release_interface;
                }
        }
index c05f09c529e3bdd7a2244a5d27612712f3b4d71f..1fb84728a27de96565e4f2589588a9f359722e4f 100644 (file)
@@ -182,7 +182,7 @@ static struct i2c_algorithm ec168_i2c_algo = {
 };
 
 /* Callbacks for DVB USB */
-static int ec168_identify_state(struct dvb_usb_device *d)
+static int ec168_identify_state(struct dvb_usb_device *d, const char **name)
 {
        int ret;
        u8 reply;