Commit bab53301 authored by Haojian Zhuang's avatar Haojian Zhuang Committed by Mike Turquette
Browse files

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: default avatarHaojian Zhuang <haojian.zhuang@gmail.com>
Signed-off-by: default avatarMike Turquette <mturquette@linaro.org>
[mturquette@linaro.org: improved $SUBJECT]
parent 4895084c
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -28,8 +28,11 @@ static unsigned long clk_factor_recalc_rate(struct clk_hw *hw,
		unsigned long parent_rate)
{
	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,