From 6fab81dfdc7b48c2e30ab05e9b30afb0c418bbbe Mon Sep 17 00:00:00 2001 From: Michael Krufky Date: Wed, 8 Feb 2012 14:57:39 -0300 Subject: [media] xc5000: drivers should specify chip revision rather than firmware 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 Signed-off-by: Mauro Carvalho Chehab --- drivers/media/common/tuners/xc5000.c | 27 ++++++++++++++------------- drivers/media/common/tuners/xc5000.h | 9 +++------ 2 files changed, 17 insertions(+), 19 deletions(-) (limited to 'drivers/media/common/tuners') diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index 2c71ee7dcb1e..07fd80f4508e 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/drivers/media/common/tuners/xc5000.c @@ -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. diff --git a/drivers/media/common/tuners/xc5000.h b/drivers/media/common/tuners/xc5000.h index c003af5322a0..3396f8e02b40 100644 --- a/drivers/media/common/tuners/xc5000.h +++ b/drivers/media/common/tuners/xc5000.h @@ -27,18 +27,15 @@ 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 */ -- cgit v1.2.2