From 76efb0ba2118c286231dd062bf02b2537cc8738f Mon Sep 17 00:00:00 2001 From: Michael Krufky Date: Mon, 6 Feb 2012 19:40:32 -0300 Subject: [PATCH] [media] xc5000: allow drivers to set desired firmware in xc5000_attach newer versions of the xc5000 silicon require newer firmware while remaining 100% driver compatible. original versions of the xc5000a continue to use the same firmware. Signed-off-by: Michael Krufky Signed-off-by: Mauro Carvalho Chehab --- drivers/media/common/tuners/xc5000.c | 22 ++++++++++++++++------ drivers/media/common/tuners/xc5000.h | 13 +++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index 296df05b8cd..16c3f75816c 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/drivers/media/common/tuners/xc5000.c @@ -49,9 +49,6 @@ static LIST_HEAD(hybrid_tuner_instance_list); #define dprintk(level, fmt, arg...) if (debug >= level) \ printk(KERN_INFO "%s: " fmt, "xc5000", ## arg) -#define XC5000_DEFAULT_FIRMWARE "dvb-fe-xc5000-1.6.114.fw" -#define XC5000_DEFAULT_FIRMWARE_SIZE 12401 - struct xc5000_priv { struct tuner_i2c_props i2c_props; struct list_head hybrid_tuner_instance_list; @@ -62,6 +59,8 @@ struct xc5000_priv { u8 video_standard; u8 rf_mode; u8 radio_input; + + struct xc5000_fw_cfg *fw; }; /* Misc Defines */ @@ -204,6 +203,11 @@ static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = { {"FM Radio-INPUT1_MONO", 0x0278, 0x9002} }; +struct xc5000_fw_cfg xc5000a_1_6_114 = { + .name = "dvb-fe-xc5000-1.6.114.fw", + .size = 12401, +}; + static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe); static int xc5000_is_firmware_loaded(struct dvb_frontend *fe); static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val); @@ -555,9 +559,9 @@ static int xc5000_fwupload(struct dvb_frontend *fe) /* request the firmware, this will block and timeout */ printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n", - XC5000_DEFAULT_FIRMWARE); + priv->fw->name); - ret = request_firmware(&fw, XC5000_DEFAULT_FIRMWARE, + ret = request_firmware(&fw, priv->fw->name, priv->i2c_props.adap->dev.parent); if (ret) { printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n"); @@ -569,7 +573,7 @@ static int xc5000_fwupload(struct dvb_frontend *fe) ret = XC_RESULT_SUCCESS; } - if (fw->size != XC5000_DEFAULT_FIRMWARE_SIZE) { + if (fw->size != priv->fw->size) { printk(KERN_ERR "xc5000: firmware incorrect size\n"); ret = XC_RESULT_RESET_FAILURE; } else { @@ -1139,6 +1143,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 + unless explicitly specified */ + if ((priv->fw == NULL) || (cfg->fw)) + /* use default firmware if none specified */ + priv->fw = (cfg->fw) ? cfg->fw : XC5000_DEFAULT_FIRMWARE; + /* 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 e2957451b53..06d116266d8 100644 --- a/drivers/media/common/tuners/xc5000.h +++ b/drivers/media/common/tuners/xc5000.h @@ -27,10 +27,23 @@ struct dvb_frontend; struct i2c_adapter; +struct xc5000_fw_cfg { + char *name; + u16 size; +}; + +extern struct xc5000_fw_cfg xc5000a_1_6_114; + +#define XC5000_FW_A_1_6_114 &xc5000a_1_6_114 + +#define XC5000_DEFAULT_FIRMWARE XC5000_FW_A_1_6_114 + struct xc5000_config { u8 i2c_address; u32 if_khz; u8 radio_input; + + struct xc5000_fw_cfg *fw; }; /* xc5000 callback command */ -- 2.39.5