diff options
author | Chao Xie <chao.xie@marvell.com> | 2014-01-22 21:47:41 -0500 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-03-26 23:59:27 -0400 |
commit | c45693a6480cee906557a9fba533a9f3c224f91e (patch) | |
tree | 1f1566bfffe25d0de323f87c3d50e1bef3de8f20 /drivers/clk/mmp | |
parent | 7433ab43fa17094173f18a39f33c3a24d50b300f (diff) |
clk: mmp: fix the wrong calculation formula
The formula is numerator/denominator = Fin / (Fout * factor)
So
Fout = Fin * denominator / (numerator * factor).
Current clk_factor_round_rate and clk_factor_recalc_rate use
wrong formula. This patch will fix them.
Signed-off-by: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
Diffstat (limited to 'drivers/clk/mmp')
-rw-r--r-- | drivers/clk/mmp/clk-frac.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/clk/mmp/clk-frac.c b/drivers/clk/mmp/clk-frac.c index f6e7691c4efa..5863a37ec84d 100644 --- a/drivers/clk/mmp/clk-frac.c +++ b/drivers/clk/mmp/clk-frac.c | |||
@@ -40,12 +40,12 @@ static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate, | |||
40 | 40 | ||
41 | for (i = 0; i < factor->ftbl_cnt; i++) { | 41 | for (i = 0; i < factor->ftbl_cnt; i++) { |
42 | prev_rate = rate; | 42 | prev_rate = rate; |
43 | rate = (((*prate / 10000) * factor->ftbl[i].num) / | 43 | rate = (((*prate / 10000) * factor->ftbl[i].den) / |
44 | (factor->ftbl[i].den * factor->masks->factor)) * 10000; | 44 | (factor->ftbl[i].num * factor->masks->factor)) * 10000; |
45 | if (rate > drate) | 45 | if (rate > drate) |
46 | break; | 46 | break; |
47 | } | 47 | } |
48 | if (i == 0) | 48 | if ((i == 0) || (i == factor->ftbl_cnt)) |
49 | return rate; | 49 | return rate; |
50 | else | 50 | else |
51 | return prev_rate; | 51 | return prev_rate; |
@@ -85,8 +85,8 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate, | |||
85 | 85 | ||
86 | for (i = 0; i < factor->ftbl_cnt; i++) { | 86 | for (i = 0; i < factor->ftbl_cnt; i++) { |
87 | prev_rate = rate; | 87 | prev_rate = rate; |
88 | rate = (((prate / 10000) * factor->ftbl[i].num) / | 88 | rate = (((prate / 10000) * factor->ftbl[i].den) / |
89 | (factor->ftbl[i].den * factor->masks->factor)) * 10000; | 89 | (factor->ftbl[i].num * factor->masks->factor)) * 10000; |
90 | if (rate > drate) | 90 | if (rate > drate) |
91 | break; | 91 | break; |
92 | } | 92 | } |