diff options
author | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2017-11-01 17:05:43 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2017-12-11 13:15:35 -0500 |
commit | 7621b8c4c06bd6414c438f9e50781af1cd88d063 (patch) | |
tree | ad72c4f6e4bbadc975cbf539fe50dfa533bf1b7d | |
parent | ad7b57d58d16666f607914bf9ff6950e1c5532a4 (diff) | |
download | linux-7621b8c4c06bd6414c438f9e50781af1cd88d063.tar.gz linux-7621b8c4c06bd6414c438f9e50781af1cd88d063.tar.bz2 linux-7621b8c4c06bd6414c438f9e50781af1cd88d063.zip |
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: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r-- | drivers/media/tuners/xc5000.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c index 0e7e4fdf9e50..98ba177dbc29 100644 --- a/drivers/media/tuners/xc5000.c +++ b/drivers/media/tuners/xc5000.c @@ -685,8 +685,8 @@ static void xc_debug_dump(struct xc5000_priv *priv) (totalgain % 256) * 100 / 256); if (priv->pll_register_no) { - xc5000_readreg(priv, priv->pll_register_no, ®val); - dprintk(1, "*** PLL lock status = 0x%04x\n", regval); + if (!xc5000_readreg(priv, priv->pll_register_no, ®val)) + dprintk(1, "*** PLL lock status = 0x%04x\n", regval); } } @@ -831,15 +831,16 @@ static int xc5000_is_firmware_loaded(struct dvb_frontend *fe) u16 id; ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id); - if (ret == 0) { + if (!ret) { if (id == XC_PRODUCT_ID_FW_NOT_LOADED) ret = -ENOENT; else 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; } @@ -935,7 +936,10 @@ tune_channel: if (priv->pll_register_no != 0) { 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) { /* PLL is unlocked, force reload of the firmware */ 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) } if (priv->pll_register_no) { - xc5000_readreg(priv, priv->pll_register_no, - &pll_lock_status); + ret = xc5000_readreg(priv, priv->pll_register_no, + &pll_lock_status); + if (ret) + continue; if (pll_lock_status > 63) { /* PLL is unlocked, force reload of the firmware */ printk(KERN_ERR |