From 6fab81dfdc7b48c2e30ab05e9b30afb0c418bbbe Mon Sep 17 00:00:00 2001 From: Michael Krufky Date: Wed, 8 Feb 2012 14:57:39 -0300 Subject: [PATCH] [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 +++------ drivers/media/video/tuner-core.c | 2 +- 3 files changed, 18 insertions(+), 20 deletions(-) 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 */ diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 0628a0ae9da5..89a123dee14d 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c @@ -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, -- 2.20.1