Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 76efb0ba authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarMichael Krufky <mkrufky@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 88495030
Loading
Loading
Loading
Loading
+16 −6
Original line number Original line Diff line number Diff line
@@ -49,9 +49,6 @@ static LIST_HEAD(hybrid_tuner_instance_list);
#define dprintk(level, fmt, arg...) if (debug >= level) \
#define dprintk(level, fmt, arg...) if (debug >= level) \
	printk(KERN_INFO "%s: " fmt, "xc5000", ## arg)
	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 xc5000_priv {
	struct tuner_i2c_props i2c_props;
	struct tuner_i2c_props i2c_props;
	struct list_head hybrid_tuner_instance_list;
	struct list_head hybrid_tuner_instance_list;
@@ -62,6 +59,8 @@ struct xc5000_priv {
	u8  video_standard;
	u8  video_standard;
	u8  rf_mode;
	u8  rf_mode;
	u8  radio_input;
	u8  radio_input;

	struct xc5000_fw_cfg *fw;
};
};


/* Misc Defines */
/* Misc Defines */
@@ -204,6 +203,11 @@ static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
	{"FM Radio-INPUT1_MONO", 0x0278, 0x9002}
	{"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 xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
static int xc5000_is_firmware_loaded(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);
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 */
	/* request the firmware, this will block and timeout */
	printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n",
	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);
		priv->i2c_props.adap->dev.parent);
	if (ret) {
	if (ret) {
		printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n");
		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;
		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");
		printk(KERN_ERR "xc5000: firmware incorrect size\n");
		ret = XC_RESULT_RESET_FAILURE;
		ret = XC_RESULT_RESET_FAILURE;
	} else {
	} else {
@@ -1139,6 +1143,12 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
	if (priv->radio_input == 0)
	if (priv->radio_input == 0)
		priv->radio_input = cfg->radio_input;
		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
	/* Check if firmware has been loaded. It is possible that another
	   instance of the driver has loaded the firmware.
	   instance of the driver has loaded the firmware.
	 */
	 */
+13 −0
Original line number Original line Diff line number Diff line
@@ -27,10 +27,23 @@
struct dvb_frontend;
struct dvb_frontend;
struct i2c_adapter;
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 {
struct xc5000_config {
	u8   i2c_address;
	u8   i2c_address;
	u32  if_khz;
	u32  if_khz;
	u8   radio_input;
	u8   radio_input;

	struct xc5000_fw_cfg *fw;
};
};


/* xc5000 callback command */
/* xc5000 callback command */