Commit 7621b8c4 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: xc5000: better handle I2C error messages

As warned by smatch, there are several places where the I2C
transfer may fail, leading into inconsistent behavior:

	drivers/media/tuners/xc5000.c:689 xc_debug_dump() error: uninitialized symbol 'regval'.
	drivers/media/tuners/xc5000.c:841 xc5000_is_firmware_loaded() error: uninitialized symbol 'id'.
	drivers/media/tuners/xc5000.c:939 xc5000_set_tv_freq() error: uninitialized symbol 'pll_lock_status'.
	drivers/media/tuners/xc5000.c:1195 xc_load_fw_and_init_tuner() error: uninitialized symbol 'pll_lock_status'.

Handle the return codes from the I2C transfer, in order to
address those issues.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent ad7b57d5
...@@ -685,7 +685,7 @@ static void xc_debug_dump(struct xc5000_priv *priv) ...@@ -685,7 +685,7 @@ static void xc_debug_dump(struct xc5000_priv *priv)
(totalgain % 256) * 100 / 256); (totalgain % 256) * 100 / 256);
if (priv->pll_register_no) { if (priv->pll_register_no) {
xc5000_readreg(priv, priv->pll_register_no, &regval); if (!xc5000_readreg(priv, priv->pll_register_no, &regval))
dprintk(1, "*** PLL lock status = 0x%04x\n", regval); dprintk(1, "*** PLL lock status = 0x%04x\n", regval);
} }
} }
...@@ -831,15 +831,16 @@ static int xc5000_is_firmware_loaded(struct dvb_frontend *fe) ...@@ -831,15 +831,16 @@ static int xc5000_is_firmware_loaded(struct dvb_frontend *fe)
u16 id; u16 id;
ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id); ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id);
if (ret == 0) { if (!ret) {
if (id == XC_PRODUCT_ID_FW_NOT_LOADED) if (id == XC_PRODUCT_ID_FW_NOT_LOADED)
ret = -ENOENT; ret = -ENOENT;
else else
ret = 0; ret = 0;
dprintk(1, "%s() returns id = 0x%x\n", __func__, id);
} else {
dprintk(1, "%s() returns error %d\n", __func__, ret);
} }
dprintk(1, "%s() returns %s id = 0x%x\n", __func__,
ret == 0 ? "True" : "False", id);
return ret; return ret;
} }
...@@ -935,7 +936,10 @@ static int xc5000_set_tv_freq(struct dvb_frontend *fe) ...@@ -935,7 +936,10 @@ static int xc5000_set_tv_freq(struct dvb_frontend *fe)
if (priv->pll_register_no != 0) { if (priv->pll_register_no != 0) {
msleep(20); msleep(20);
xc5000_readreg(priv, priv->pll_register_no, &pll_lock_status); ret = xc5000_readreg(priv, priv->pll_register_no,
&pll_lock_status);
if (ret)
return ret;
if (pll_lock_status > 63) { if (pll_lock_status > 63) {
/* PLL is unlocked, force reload of the firmware */ /* PLL is unlocked, force reload of the firmware */
dprintk(1, "xc5000: PLL not locked (0x%x). Reloading...\n", dprintk(1, "xc5000: PLL not locked (0x%x). Reloading...\n",
...@@ -1190,8 +1194,10 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force) ...@@ -1190,8 +1194,10 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force)
} }
if (priv->pll_register_no) { if (priv->pll_register_no) {
xc5000_readreg(priv, priv->pll_register_no, ret = xc5000_readreg(priv, priv->pll_register_no,
&pll_lock_status); &pll_lock_status);
if (ret)
continue;
if (pll_lock_status > 63) { if (pll_lock_status > 63) {
/* PLL is unlocked, force reload of the firmware */ /* PLL is unlocked, force reload of the firmware */
printk(KERN_ERR printk(KERN_ERR
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment