diff options
author | Antony Pavlov <antonynpavlov@gmail.com> | 2016-03-16 23:34:18 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2016-05-13 08:01:46 -0400 |
commit | 5ae5c452e3361612cd8182eb8bdfecf0ebf42288 (patch) | |
tree | 79d70d40052972b701739b797ca897a26a339f9c /arch/mips/ath79 | |
parent | 1e6a3492e7bb12aa8ee26050ff6829c39ebaa152 (diff) |
MIPS: ath79: update devicetree clock support for AR9331
Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
Cc: Gabor Juhos <juhosg@openwrt.org>
Cc: Alban Bedel <albeu@free.fr>
Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: linux-clk@vger.kernel.org
Cc: linux-mips@linux-mips.org
Cc: devicetree@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/12879/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/ath79')
-rw-r--r-- | arch/mips/ath79/clock.c | 96 |
1 files changed, 62 insertions, 34 deletions
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c index 79fb8b44ba09..3cfc5ecddddf 100644 --- a/arch/mips/ath79/clock.c +++ b/arch/mips/ath79/clock.c | |||
@@ -137,63 +137,84 @@ static void __init ar724x_clocks_init(void) | |||
137 | clk_add_alias("uart", NULL, "ahb", NULL); | 137 | clk_add_alias("uart", NULL, "ahb", NULL); |
138 | } | 138 | } |
139 | 139 | ||
140 | static void __init ar933x_clocks_init(void) | 140 | static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base) |
141 | { | 141 | { |
142 | unsigned long ref_rate; | ||
143 | unsigned long cpu_rate; | ||
144 | unsigned long ddr_rate; | ||
145 | unsigned long ahb_rate; | ||
146 | u32 clock_ctrl; | 142 | u32 clock_ctrl; |
147 | u32 cpu_config; | 143 | u32 ref_div; |
148 | u32 freq; | 144 | u32 ninit_mul; |
149 | u32 t; | 145 | u32 out_div; |
150 | 146 | ||
151 | t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP); | 147 | u32 cpu_div; |
152 | if (t & AR933X_BOOTSTRAP_REF_CLK_40) | 148 | u32 ddr_div; |
153 | ref_rate = (40 * 1000 * 1000); | 149 | u32 ahb_div; |
154 | else | ||
155 | ref_rate = (25 * 1000 * 1000); | ||
156 | 150 | ||
157 | clock_ctrl = ath79_pll_rr(AR933X_PLL_CLOCK_CTRL_REG); | 151 | clock_ctrl = __raw_readl(pll_base + AR933X_PLL_CLOCK_CTRL_REG); |
158 | if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) { | 152 | if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) { |
159 | cpu_rate = ref_rate; | 153 | ref_div = 1; |
160 | ahb_rate = ref_rate; | 154 | ninit_mul = 1; |
161 | ddr_rate = ref_rate; | 155 | out_div = 1; |
156 | |||
157 | cpu_div = 1; | ||
158 | ddr_div = 1; | ||
159 | ahb_div = 1; | ||
162 | } else { | 160 | } else { |
163 | cpu_config = ath79_pll_rr(AR933X_PLL_CPU_CONFIG_REG); | 161 | u32 cpu_config; |
162 | u32 t; | ||
163 | |||
164 | cpu_config = __raw_readl(pll_base + AR933X_PLL_CPU_CONFIG_REG); | ||
164 | 165 | ||
165 | t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) & | 166 | t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) & |
166 | AR933X_PLL_CPU_CONFIG_REFDIV_MASK; | 167 | AR933X_PLL_CPU_CONFIG_REFDIV_MASK; |
167 | freq = ref_rate / t; | 168 | ref_div = t; |
168 | 169 | ||
169 | t = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) & | 170 | ninit_mul = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) & |
170 | AR933X_PLL_CPU_CONFIG_NINT_MASK; | 171 | AR933X_PLL_CPU_CONFIG_NINT_MASK; |
171 | freq *= t; | ||
172 | 172 | ||
173 | t = (cpu_config >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & | 173 | t = (cpu_config >> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & |
174 | AR933X_PLL_CPU_CONFIG_OUTDIV_MASK; | 174 | AR933X_PLL_CPU_CONFIG_OUTDIV_MASK; |
175 | if (t == 0) | 175 | if (t == 0) |
176 | t = 1; | 176 | t = 1; |
177 | 177 | ||
178 | freq >>= t; | 178 | out_div = (1 << t); |
179 | 179 | ||
180 | t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) & | 180 | cpu_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) & |
181 | AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1; | 181 | AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1; |
182 | cpu_rate = freq / t; | ||
183 | 182 | ||
184 | t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) & | 183 | ddr_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) & |
185 | AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1; | 184 | AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1; |
186 | ddr_rate = freq / t; | ||
187 | 185 | ||
188 | t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) & | 186 | ahb_div = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) & |
189 | AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1; | 187 | AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1; |
190 | ahb_rate = freq / t; | ||
191 | } | 188 | } |
192 | 189 | ||
193 | ath79_add_sys_clkdev("ref", ref_rate); | 190 | clks[ATH79_CLK_CPU] = ath79_reg_ffclk("cpu", "ref", |
194 | clks[ATH79_CLK_CPU] = ath79_add_sys_clkdev("cpu", cpu_rate); | 191 | ninit_mul, ref_div * out_div * cpu_div); |
195 | clks[ATH79_CLK_DDR] = ath79_add_sys_clkdev("ddr", ddr_rate); | 192 | clks[ATH79_CLK_DDR] = ath79_reg_ffclk("ddr", "ref", |
196 | clks[ATH79_CLK_AHB] = ath79_add_sys_clkdev("ahb", ahb_rate); | 193 | ninit_mul, ref_div * out_div * ddr_div); |
194 | clks[ATH79_CLK_AHB] = ath79_reg_ffclk("ahb", "ref", | ||
195 | ninit_mul, ref_div * out_div * ahb_div); | ||
196 | } | ||
197 | |||
198 | static void __init ar933x_clocks_init(void) | ||
199 | { | ||
200 | struct clk *ref_clk; | ||
201 | unsigned long ref_rate; | ||
202 | u32 t; | ||
203 | |||
204 | t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP); | ||
205 | if (t & AR933X_BOOTSTRAP_REF_CLK_40) | ||
206 | ref_rate = (40 * 1000 * 1000); | ||
207 | else | ||
208 | ref_rate = (25 * 1000 * 1000); | ||
209 | |||
210 | ref_clk = ath79_add_sys_clkdev("ref", ref_rate); | ||
211 | |||
212 | ar9330_clk_init(ref_clk, ath79_pll_base); | ||
213 | |||
214 | /* just make happy plat_time_init() from arch/mips/ath79/setup.c */ | ||
215 | clk_register_clkdev(clks[ATH79_CLK_CPU], "cpu", NULL); | ||
216 | clk_register_clkdev(clks[ATH79_CLK_DDR], "ddr", NULL); | ||
217 | clk_register_clkdev(clks[ATH79_CLK_AHB], "ahb", NULL); | ||
197 | 218 | ||
198 | clk_add_alias("wdt", NULL, "ahb", NULL); | 219 | clk_add_alias("wdt", NULL, "ahb", NULL); |
199 | clk_add_alias("uart", NULL, "ref", NULL); | 220 | clk_add_alias("uart", NULL, "ref", NULL); |
@@ -460,7 +481,6 @@ static void __init ath79_clocks_init_dt(struct device_node *np) | |||
460 | 481 | ||
461 | CLK_OF_DECLARE(ar7100, "qca,ar7100-pll", ath79_clocks_init_dt); | 482 | CLK_OF_DECLARE(ar7100, "qca,ar7100-pll", ath79_clocks_init_dt); |
462 | CLK_OF_DECLARE(ar7240, "qca,ar7240-pll", ath79_clocks_init_dt); | 483 | CLK_OF_DECLARE(ar7240, "qca,ar7240-pll", ath79_clocks_init_dt); |
463 | CLK_OF_DECLARE(ar9330, "qca,ar9330-pll", ath79_clocks_init_dt); | ||
464 | CLK_OF_DECLARE(ar9340, "qca,ar9340-pll", ath79_clocks_init_dt); | 484 | CLK_OF_DECLARE(ar9340, "qca,ar9340-pll", ath79_clocks_init_dt); |
465 | CLK_OF_DECLARE(ar9550, "qca,qca9550-pll", ath79_clocks_init_dt); | 485 | CLK_OF_DECLARE(ar9550, "qca,qca9550-pll", ath79_clocks_init_dt); |
466 | 486 | ||
@@ -482,7 +502,14 @@ static void __init ath79_clocks_init_dt_ng(struct device_node *np) | |||
482 | goto err_clk; | 502 | goto err_clk; |
483 | } | 503 | } |
484 | 504 | ||
485 | ar724x_clk_init(ref_clk, pll_base); | 505 | if (of_device_is_compatible(np, "qca,ar9130-pll")) |
506 | ar724x_clk_init(ref_clk, pll_base); | ||
507 | else if (of_device_is_compatible(np, "qca,ar9330-pll")) | ||
508 | ar9330_clk_init(ref_clk, pll_base); | ||
509 | else { | ||
510 | pr_err("%s: could not find any appropriate clk_init()\n", dnfn); | ||
511 | goto err_clk; | ||
512 | } | ||
486 | 513 | ||
487 | if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) { | 514 | if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data)) { |
488 | pr_err("%s: could not register clk provider\n", dnfn); | 515 | pr_err("%s: could not register clk provider\n", dnfn); |
@@ -498,4 +525,5 @@ err: | |||
498 | return; | 525 | return; |
499 | } | 526 | } |
500 | CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt_ng); | 527 | CLK_OF_DECLARE(ar9130_clk, "qca,ar9130-pll", ath79_clocks_init_dt_ng); |
528 | CLK_OF_DECLARE(ar9330_clk, "qca,ar9330-pll", ath79_clocks_init_dt_ng); | ||
501 | #endif | 529 | #endif |