diff options
| author | Abel Vesa <abel.vesa@nxp.com> | 2019-01-18 07:54:13 -0500 |
|---|---|---|
| committer | Stephen Boyd <sboyd@kernel.org> | 2019-01-24 14:17:28 -0500 |
| commit | a64a9c088b75cba5840320d57e0bbfb36739c3b5 (patch) | |
| tree | 6f249b3a8683a3a74a72b32a9bceb18f17109fa1 /drivers | |
| parent | ede77858473ae4cab6f8f147efcaa76989761535 (diff) | |
clk: imx: Fix fractional clock set rate computation
Before multiplying by PLL_FRAC_DENOM, the temp64 needs to be
temp64 = rate * 2 - divfi * parent_rate * 8, instead of:
temp64 = (rate * 2 - divfi) * parent_rate
Fixes: 6209624b9a5c1e ("clk: imx: Add fractional PLL output clock")
Signed-off-by: Abel Vesa <abel.vesa@nxp.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/clk/imx/clk-frac-pll.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/clk/imx/clk-frac-pll.c b/drivers/clk/imx/clk-frac-pll.c index 0026c3969b1e..76b9eb15604e 100644 --- a/drivers/clk/imx/clk-frac-pll.c +++ b/drivers/clk/imx/clk-frac-pll.c | |||
| @@ -155,13 +155,14 @@ static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
| 155 | { | 155 | { |
| 156 | struct clk_frac_pll *pll = to_clk_frac_pll(hw); | 156 | struct clk_frac_pll *pll = to_clk_frac_pll(hw); |
| 157 | u32 val, divfi, divff; | 157 | u32 val, divfi, divff; |
| 158 | u64 temp64 = parent_rate; | 158 | u64 temp64; |
| 159 | int ret; | 159 | int ret; |
| 160 | 160 | ||
| 161 | parent_rate *= 8; | 161 | parent_rate *= 8; |
| 162 | rate *= 2; | 162 | rate *= 2; |
| 163 | divfi = rate / parent_rate; | 163 | divfi = rate / parent_rate; |
| 164 | temp64 *= rate - divfi; | 164 | temp64 = parent_rate * divfi; |
| 165 | temp64 = rate - temp64; | ||
| 165 | temp64 *= PLL_FRAC_DENOM; | 166 | temp64 *= PLL_FRAC_DENOM; |
| 166 | do_div(temp64, parent_rate); | 167 | do_div(temp64, parent_rate); |
| 167 | divff = temp64; | 168 | divff = temp64; |
