summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorIstvan Varga <istvan_v@mailbox.hu>2011-06-04 19:04:51 +0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-07-28 00:52:36 +0400
commit027fd361860e40736c0ad093a8f4194d727afb63 (patch)
tree4183af8c26bf70bbaf70a642f2d4912defcc4846 /drivers
parent5272f6b1f423d4ce636dc90f190e245897bdb045 (diff)
downloadlinux-027fd361860e40736c0ad093a8f4194d727afb63.tar.xz
[media] xc4000: firmware initialization
This patch fixes/cleans up the loading of the firmware file when the driver is loaded and initialized. Signed-off-by: Istvan Varga <istvan_v@mailbox.hu> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/common/tuners/xc4000.c36
1 files changed, 16 insertions, 20 deletions
diff --git a/drivers/media/common/tuners/xc4000.c b/drivers/media/common/tuners/xc4000.c
index c373f4b36f5a..ec5f1f1b3f3c 100644
--- a/drivers/media/common/tuners/xc4000.c
+++ b/drivers/media/common/tuners/xc4000.c
@@ -1400,21 +1400,8 @@ static int xc4000_sleep(struct dvb_frontend *fe)
static int xc4000_init(struct dvb_frontend *fe)
{
- struct xc4000_priv *priv = fe->tuner_priv;
- int ret;
dprintk(1, "%s()\n", __func__);
- mutex_lock(&priv->lock);
- ret = check_firmware(fe, DTV8, 0, priv->if_khz);
- mutex_unlock(&priv->lock);
- if (ret != XC_RESULT_SUCCESS) {
- printk(KERN_ERR "xc4000: Unable to initialise tuner\n");
- return -EREMOTEIO;
- }
-
- if (debug)
- xc_debug_dump(priv);
-
return 0;
}
@@ -1511,8 +1498,14 @@ struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe,
instance of the driver has loaded the firmware.
*/
- if (xc4000_readreg(priv, XREG_PRODUCT_ID, &id) != XC_RESULT_SUCCESS)
+ if (instance == 1) {
+ if (xc4000_readreg(priv, XREG_PRODUCT_ID, &id)
+ != XC_RESULT_SUCCESS)
goto fail;
+ } else {
+ id = ((priv->cur_fw.type & BASE) != 0 ?
+ priv->hwmodel : XC_PRODUCT_ID_FW_NOT_LOADED);
+ }
switch (id) {
case XC_PRODUCT_ID_FW_LOADED:
@@ -1541,16 +1534,19 @@ struct dvb_frontend *xc4000_attach(struct dvb_frontend *fe,
memcpy(&fe->ops.tuner_ops, &xc4000_tuner_ops,
sizeof(struct dvb_tuner_ops));
- /* FIXME: For now, load the firmware at startup. We will remove this
- before the code goes to production... */
- mutex_lock(&priv->lock);
- check_firmware(fe, DTV8, 0, priv->if_khz);
- mutex_unlock(&priv->lock);
+ if (instance == 1) {
+ int ret;
+ mutex_lock(&priv->lock);
+ ret = xc4000_fwupload(fe);
+ mutex_unlock(&priv->lock);
+ if (ret != XC_RESULT_SUCCESS)
+ goto fail2;
+ }
return fe;
fail:
mutex_unlock(&xc4000_list_mutex);
-
+fail2:
xc4000_release(fe);
return NULL;
}