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

Commit 6fab81df authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarMichael Krufky <mkrufky@kernellabs.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ddea427f
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -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.
+3 −6
Original line number Diff line number Diff line
@@ -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 */
+1 −1
Original line number Diff line number Diff line
@@ -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,