aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk
diff options
context:
space:
mode:
authorChao Xie <chao.xie@marvell.com>2014-01-22 21:47:41 -0500
committerMike Turquette <mturquette@linaro.org>2014-03-26 23:59:27 -0400
commitc45693a6480cee906557a9fba533a9f3c224f91e (patch)
tree1f1566bfffe25d0de323f87c3d50e1bef3de8f20 /drivers/clk
parent7433ab43fa17094173f18a39f33c3a24d50b300f (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')
-rw-r--r--drivers/clk/mmp/clk-frac.c10
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 }