[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>
This commit is contained in:
Matthias Schwarzott 2016-07-26 03:53:40 -03:00 committed by Mauro Carvalho Chehab
parent c0bf09d047
commit 2df9dda07f
1 changed files with 6 additions and 0 deletions

View File

@ -751,6 +751,9 @@ static int si2165_set_oversamp(struct si2165_state *state, u32 dvb_rate)
u64 oversamp; u64 oversamp;
u32 reg_value; u32 reg_value;
if (!dvb_rate)
return -EINVAL;
oversamp = si2165_get_fe_clk(state); oversamp = si2165_get_fe_clk(state);
oversamp <<= 23; oversamp <<= 23;
do_div(oversamp, dvb_rate); do_div(oversamp, dvb_rate);
@ -775,6 +778,9 @@ static int si2165_set_if_freq_shift(struct si2165_state *state)
return -EINVAL; return -EINVAL;
} }
if (!fe_clk)
return -EINVAL;
fe->ops.tuner_ops.get_if_frequency(fe, &IF); fe->ops.tuner_ops.get_if_frequency(fe, &IF);
if_freq_shift = IF; if_freq_shift = IF;
if_freq_shift <<= 29; if_freq_shift <<= 29;