summaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/si2165.c
diff options
context:
space:
mode:
authorMatthias Schwarzott <zzam@gentoo.org>2016-07-26 08:53:40 +0200
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-09-22 17:53:22 +0200
commit2df9dda07f56c285564ce97ca76a94e70a50df5e (patch)
treecffc4cff865a2217a5edf3ee06239fe3bb2b0f0c /drivers/media/dvb-frontends/si2165.c
parent[media] rcar-vin: add R-Car gen2 fallback compatibility string (diff)
downloadlinux-2df9dda07f56c285564ce97ca76a94e70a50df5e.tar.xz
linux-2df9dda07f56c285564ce97ca76a94e70a50df5e.zip
[media] si2165: avoid division by zero
When si2165_init fails, the clk values in state are still at zero. But the dvb-core ignores the return value of init will call tune afterwards. This will trigger a division by zero when tuning. At least check for the variables to be non-zero before dividing. This happened for a system with WinTV HVR-4400 PCIe-card after suspend-to-disk. Do suspend-to-disk without accessing the DVB device before. After wakeup try to tune. si2165_init fails at checking the chip_mode and aborts. Then si2165_set_if_freq_shift will fail with div-by-zero. Signed-off-by: Matthias Schwarzott <zzam@gentoo.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/dvb-frontends/si2165.c')
-rw-r--r--drivers/media/dvb-frontends/si2165.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/media/dvb-frontends/si2165.c b/drivers/media/dvb-frontends/si2165.c
index 8bf716a8ea58..849c3c421262 100644
--- a/drivers/media/dvb-frontends/si2165.c
+++ b/drivers/media/dvb-frontends/si2165.c
@@ -751,6 +751,9 @@ static int si2165_set_oversamp(struct si2165_state *state, u32 dvb_rate)
u64 oversamp;
u32 reg_value;
+ if (!dvb_rate)
+ return -EINVAL;
+
oversamp = si2165_get_fe_clk(state);
oversamp <<= 23;
do_div(oversamp, dvb_rate);
@@ -775,6 +778,9 @@ static int si2165_set_if_freq_shift(struct si2165_state *state)
return -EINVAL;
}
+ if (!fe_clk)
+ return -EINVAL;
+
fe->ops.tuner_ops.get_if_frequency(fe, &IF);
if_freq_shift = IF;
if_freq_shift <<= 29;