[media] xc5000: drivers should specify chip revision rather than firmware
authorMichael Krufky <mkrufky@kernellabs.com>
Wed, 8 Feb 2012 17:57:39 +0000 (14:57 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 14 Feb 2012 19:22:32 +0000 (17:22 -0200)
Specify chip revision at attach time rather than a firmware image.
This is a better way to ensure that the correct firmware is loaded
for the correct revision of the chip.

Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/tuners/xc5000.c
drivers/media/common/tuners/xc5000.h
drivers/media/video/tuner-core.c

index 2c71ee7..07fd80f 100644 (file)
@@ -60,7 +60,7 @@ struct xc5000_priv {
        u8  rf_mode;
        u8  radio_input;
 
-       struct xc5000_fw_cfg *fw;
+       int chip_id;
 };
 
 /* Misc Defines */
@@ -219,13 +219,13 @@ static struct xc5000_fw_cfg xc5000c_41_024_5_31875 = {
        .size = 16503,
 };
 
-static inline struct xc5000_fw_cfg *xc5000_assign_firmware(int fw)
+static inline struct xc5000_fw_cfg *xc5000_assign_firmware(int chip_id)
 {
-       switch (fw) {
+       switch (chip_id) {
        default:
-       case XC5000_FW_A_1_6_114:
+       case XC5000A:
                return &xc5000a_1_6_114;
-       case XC5000_FW_C_41_024_5_31875:
+       case XC5000C:
                return &xc5000c_41_024_5_31875;
        }
 }
@@ -578,12 +578,13 @@ static int xc5000_fwupload(struct dvb_frontend *fe)
        struct xc5000_priv *priv = fe->tuner_priv;
        const struct firmware *fw;
        int ret;
+       struct xc5000_fw_cfg *desired_fw = xc5000_assign_firmware(priv->chip_id);
 
        /* request the firmware, this will block and timeout */
        printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n",
-               priv->fw->name);
+               desired_fw->name);
 
-       ret = request_firmware(&fw, priv->fw->name,
+       ret = request_firmware(&fw, desired_fw->name,
                priv->i2c_props.adap->dev.parent);
        if (ret) {
                printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n");
@@ -595,7 +596,7 @@ static int xc5000_fwupload(struct dvb_frontend *fe)
                ret = XC_RESULT_SUCCESS;
        }
 
-       if (fw->size != priv->fw->size) {
+       if (fw->size != desired_fw->size) {
                printk(KERN_ERR "xc5000: firmware incorrect size\n");
                ret = XC_RESULT_RESET_FAILURE;
        } else {
@@ -1165,12 +1166,12 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
        if (priv->radio_input == 0)
                priv->radio_input = cfg->radio_input;
 
-       /* don't override firmware filename if it's already been set
+       /* don't override chip id if it's already been set
           unless explicitly specified */
-       if ((priv->fw == NULL) || (cfg->fw))
-               /* use default firmware if none specified */
-               priv->fw = xc5000_assign_firmware((cfg->fw) ?
-                       cfg->fw : XC5000_DEFAULT_FIRMWARE);
+       if ((priv->chip_id == 0) || (cfg->chip_id))
+               /* use default chip id if none specified, set to 0 so
+                  it can be overridden if this is a hybrid driver */
+               priv->chip_id = (cfg->chip_id) ? cfg->chip_id : 0;
 
        /* Check if firmware has been loaded. It is possible that another
           instance of the driver has loaded the firmware.
index c003af5..3396f8e 100644 (file)
 struct dvb_frontend;
 struct i2c_adapter;
 
-#define XC5000_FW_A_1_6_114            1
-#define XC5000_FW_C_41_024_5_31875     2
-
-#define XC5000_DEFAULT_FIRMWARE  XC5000_FW_A_1_6_114
-#define XC5000C_DEFAULT_FIRMWARE XC5000_FW_C_41_024_5_31875
+#define XC5000A 1
+#define XC5000C 2
 
 struct xc5000_config {
        u8   i2c_address;
        u32  if_khz;
        u8   radio_input;
 
-       int fw;
+       int chip_id;
 };
 
 /* xc5000 callback command */
index 0628a0a..89a123d 100644 (file)
@@ -386,7 +386,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
                        .i2c_address = t->i2c->addr,
                        /* if_khz will be set at dvb_attach() */
                        .if_khz   = 0,
-                       .fw = XC5000C_DEFAULT_FIRMWARE,
+                       .chip_id  = XC5000C,
                };
 
                if (!dvb_attach(xc5000_attach,