mirror of https://gitee.com/openkylin/linux.git
[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:
parent
c0bf09d047
commit
2df9dda07f
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue