[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 <mkrufky@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c
index 2c71ee7..07fd80f 100644
--- a/drivers/media/common/tuners/xc5000.c
+++ b/drivers/media/common/tuners/xc5000.c
@@ -60,7 +60,7 @@
 	u8  rf_mode;
 	u8  radio_input;
 
-	struct xc5000_fw_cfg *fw;
+	int chip_id;
 };
 
 /* Misc Defines */
@@ -219,13 +219,13 @@
 	.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 @@
 	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 @@
 		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 @@
 	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 c003af5..3396f8e 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 0628a0a..89a123d 100644
--- a/drivers/media/video/tuner-core.c
+++ b/drivers/media/video/tuner-core.c
@@ -386,7 +386,7 @@
 			.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,