clk: fixed-factor: round_rate should use do_div
clk->rate = parent->rate / div * mult The formula is OK. But it may overflow while we do operate with unsigned long. So use do_div instead. Signed-off-by: Haojian Zhuang <haojian.zhuang@gmail.com> Signed-off-by: Mike Turquette <mturquette@linaro.org> [mturquette@linaro.org: improved $SUBJECT]
This commit is contained in:
parent
4895084c87
commit
bab53301c3
|
@ -28,8 +28,11 @@ static unsigned long clk_factor_recalc_rate(struct clk_hw *hw,
|
||||||
unsigned long parent_rate)
|
unsigned long parent_rate)
|
||||||
{
|
{
|
||||||
struct clk_fixed_factor *fix = to_clk_fixed_factor(hw);
|
struct clk_fixed_factor *fix = to_clk_fixed_factor(hw);
|
||||||
|
unsigned long long int rate;
|
||||||
|
|
||||||
return parent_rate * fix->mult / fix->div;
|
rate = (unsigned long long int)parent_rate * fix->mult;
|
||||||
|
do_div(rate, fix->div);
|
||||||
|
return (unsigned long)rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long clk_factor_round_rate(struct clk_hw *hw, unsigned long rate,
|
static long clk_factor_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
|
|
Loading…
Reference in a new issue