1 // SPDX-License-Identifier: GPL-2.0-only
3 * Atheros AR71XX/AR724X/AR913X common routines
5 * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com>
6 * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
8 * Parts of this file are based on Atheros' 2.6.15/2.6.31 BSP
11 #include <linux/kernel.h>
12 #include <linux/init.h>
14 #include <linux/err.h>
15 #include <linux/clk.h>
16 #include <linux/clkdev.h>
17 #include <linux/clk-provider.h>
19 #include <linux/of_address.h>
20 #include <dt-bindings/clock/ath79-clk.h>
22 #include <asm/div64.h>
24 #include <asm/mach-ath79/ath79.h>
25 #include <asm/mach-ath79/ar71xx_regs.h>
28 #define AR71XX_BASE_FREQ 40000000
29 #define AR724X_BASE_FREQ 40000000
31 static struct clk
*clks
[ATH79_CLK_END
];
32 static struct clk_onecell_data clk_data
= {
34 .clk_num
= ARRAY_SIZE(clks
),
37 static const char * const clk_names
[ATH79_CLK_END
] = {
38 [ATH79_CLK_CPU
] = "cpu",
39 [ATH79_CLK_DDR
] = "ddr",
40 [ATH79_CLK_AHB
] = "ahb",
41 [ATH79_CLK_REF
] = "ref",
42 [ATH79_CLK_MDIO
] = "mdio",
45 static const char * __init
ath79_clk_name(int type
)
47 BUG_ON(type
>= ARRAY_SIZE(clk_names
) || !clk_names
[type
]);
48 return clk_names
[type
];
51 static void __init
__ath79_set_clk(int type
, const char *name
, struct clk
*clk
)
54 panic("failed to allocate %s clock structure", clk_names
[type
]);
57 clk_register_clkdev(clk
, name
, NULL
);
60 static struct clk
* __init
ath79_set_clk(int type
, unsigned long rate
)
62 const char *name
= ath79_clk_name(type
);
65 clk
= clk_register_fixed_rate(NULL
, name
, NULL
, 0, rate
);
66 __ath79_set_clk(type
, name
, clk
);
70 static struct clk
* __init
ath79_set_ff_clk(int type
, const char *parent
,
71 unsigned int mult
, unsigned int div
)
73 const char *name
= ath79_clk_name(type
);
76 clk
= clk_register_fixed_factor(NULL
, name
, parent
, 0, mult
, div
);
77 __ath79_set_clk(type
, name
, clk
);
81 static unsigned long __init
ath79_setup_ref_clk(unsigned long rate
)
83 struct clk
*clk
= clks
[ATH79_CLK_REF
];
86 rate
= clk_get_rate(clk
);
88 clk
= ath79_set_clk(ATH79_CLK_REF
, rate
);
93 static void __init
ar71xx_clocks_init(void __iomem
*pll_base
)
95 unsigned long ref_rate
;
96 unsigned long cpu_rate
;
97 unsigned long ddr_rate
;
98 unsigned long ahb_rate
;
103 ref_rate
= ath79_setup_ref_clk(AR71XX_BASE_FREQ
);
105 pll
= __raw_readl(pll_base
+ AR71XX_PLL_REG_CPU_CONFIG
);
107 div
= ((pll
>> AR71XX_PLL_FB_SHIFT
) & AR71XX_PLL_FB_MASK
) + 1;
108 freq
= div
* ref_rate
;
110 div
= ((pll
>> AR71XX_CPU_DIV_SHIFT
) & AR71XX_CPU_DIV_MASK
) + 1;
111 cpu_rate
= freq
/ div
;
113 div
= ((pll
>> AR71XX_DDR_DIV_SHIFT
) & AR71XX_DDR_DIV_MASK
) + 1;
114 ddr_rate
= freq
/ div
;
116 div
= (((pll
>> AR71XX_AHB_DIV_SHIFT
) & AR71XX_AHB_DIV_MASK
) + 1) * 2;
117 ahb_rate
= cpu_rate
/ div
;
119 ath79_set_clk(ATH79_CLK_CPU
, cpu_rate
);
120 ath79_set_clk(ATH79_CLK_DDR
, ddr_rate
);
121 ath79_set_clk(ATH79_CLK_AHB
, ahb_rate
);
124 static void __init
ar724x_clocks_init(void __iomem
*pll_base
)
126 u32 mult
, div
, ddr_div
, ahb_div
;
129 ath79_setup_ref_clk(AR71XX_BASE_FREQ
);
131 pll
= __raw_readl(pll_base
+ AR724X_PLL_REG_CPU_CONFIG
);
133 mult
= ((pll
>> AR724X_PLL_FB_SHIFT
) & AR724X_PLL_FB_MASK
);
134 div
= ((pll
>> AR724X_PLL_REF_DIV_SHIFT
) & AR724X_PLL_REF_DIV_MASK
) * 2;
136 ddr_div
= ((pll
>> AR724X_DDR_DIV_SHIFT
) & AR724X_DDR_DIV_MASK
) + 1;
137 ahb_div
= (((pll
>> AR724X_AHB_DIV_SHIFT
) & AR724X_AHB_DIV_MASK
) + 1) * 2;
139 ath79_set_ff_clk(ATH79_CLK_CPU
, "ref", mult
, div
);
140 ath79_set_ff_clk(ATH79_CLK_DDR
, "ref", mult
, div
* ddr_div
);
141 ath79_set_ff_clk(ATH79_CLK_AHB
, "ref", mult
, div
* ahb_div
);
144 static void __init
ar933x_clocks_init(void __iomem
*pll_base
)
146 unsigned long ref_rate
;
157 t
= ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP
);
158 if (t
& AR933X_BOOTSTRAP_REF_CLK_40
)
159 ref_rate
= (40 * 1000 * 1000);
161 ref_rate
= (25 * 1000 * 1000);
163 ath79_setup_ref_clk(ref_rate
);
165 clock_ctrl
= __raw_readl(pll_base
+ AR933X_PLL_CLOCK_CTRL_REG
);
166 if (clock_ctrl
& AR933X_PLL_CLOCK_CTRL_BYPASS
) {
178 cpu_config
= __raw_readl(pll_base
+ AR933X_PLL_CPU_CONFIG_REG
);
180 t
= (cpu_config
>> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT
) &
181 AR933X_PLL_CPU_CONFIG_REFDIV_MASK
;
184 ninit_mul
= (cpu_config
>> AR933X_PLL_CPU_CONFIG_NINT_SHIFT
) &
185 AR933X_PLL_CPU_CONFIG_NINT_MASK
;
187 t
= (cpu_config
>> AR933X_PLL_CPU_CONFIG_OUTDIV_SHIFT
) &
188 AR933X_PLL_CPU_CONFIG_OUTDIV_MASK
;
194 cpu_div
= ((clock_ctrl
>> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT
) &
195 AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK
) + 1;
197 ddr_div
= ((clock_ctrl
>> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT
) &
198 AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK
) + 1;
200 ahb_div
= ((clock_ctrl
>> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT
) &
201 AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK
) + 1;
204 ath79_set_ff_clk(ATH79_CLK_CPU
, "ref", ninit_mul
,
205 ref_div
* out_div
* cpu_div
);
206 ath79_set_ff_clk(ATH79_CLK_DDR
, "ref", ninit_mul
,
207 ref_div
* out_div
* ddr_div
);
208 ath79_set_ff_clk(ATH79_CLK_AHB
, "ref", ninit_mul
,
209 ref_div
* out_div
* ahb_div
);
212 static u32 __init
ar934x_get_pll_freq(u32 ref
, u32 ref_div
, u32 nint
, u32 nfrac
,
213 u32 frac
, u32 out_div
)
225 do_div(t
, ref_div
* frac
);
228 ret
/= (1 << out_div
);
232 static void __init
ar934x_clocks_init(void __iomem
*pll_base
)
234 unsigned long ref_rate
;
235 unsigned long cpu_rate
;
236 unsigned long ddr_rate
;
237 unsigned long ahb_rate
;
238 u32 pll
, out_div
, ref_div
, nint
, nfrac
, frac
, clk_ctrl
, postdiv
;
239 u32 cpu_pll
, ddr_pll
;
241 void __iomem
*dpll_base
;
243 dpll_base
= ioremap(AR934X_SRIF_BASE
, AR934X_SRIF_SIZE
);
245 bootstrap
= ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP
);
246 if (bootstrap
& AR934X_BOOTSTRAP_REF_CLK_40
)
247 ref_rate
= 40 * 1000 * 1000;
249 ref_rate
= 25 * 1000 * 1000;
251 ref_rate
= ath79_setup_ref_clk(ref_rate
);
253 pll
= __raw_readl(dpll_base
+ AR934X_SRIF_CPU_DPLL2_REG
);
254 if (pll
& AR934X_SRIF_DPLL2_LOCAL_PLL
) {
255 out_div
= (pll
>> AR934X_SRIF_DPLL2_OUTDIV_SHIFT
) &
256 AR934X_SRIF_DPLL2_OUTDIV_MASK
;
257 pll
= __raw_readl(dpll_base
+ AR934X_SRIF_CPU_DPLL1_REG
);
258 nint
= (pll
>> AR934X_SRIF_DPLL1_NINT_SHIFT
) &
259 AR934X_SRIF_DPLL1_NINT_MASK
;
260 nfrac
= pll
& AR934X_SRIF_DPLL1_NFRAC_MASK
;
261 ref_div
= (pll
>> AR934X_SRIF_DPLL1_REFDIV_SHIFT
) &
262 AR934X_SRIF_DPLL1_REFDIV_MASK
;
265 pll
= __raw_readl(pll_base
+ AR934X_PLL_CPU_CONFIG_REG
);
266 out_div
= (pll
>> AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT
) &
267 AR934X_PLL_CPU_CONFIG_OUTDIV_MASK
;
268 ref_div
= (pll
>> AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT
) &
269 AR934X_PLL_CPU_CONFIG_REFDIV_MASK
;
270 nint
= (pll
>> AR934X_PLL_CPU_CONFIG_NINT_SHIFT
) &
271 AR934X_PLL_CPU_CONFIG_NINT_MASK
;
272 nfrac
= (pll
>> AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT
) &
273 AR934X_PLL_CPU_CONFIG_NFRAC_MASK
;
277 cpu_pll
= ar934x_get_pll_freq(ref_rate
, ref_div
, nint
,
278 nfrac
, frac
, out_div
);
280 pll
= __raw_readl(dpll_base
+ AR934X_SRIF_DDR_DPLL2_REG
);
281 if (pll
& AR934X_SRIF_DPLL2_LOCAL_PLL
) {
282 out_div
= (pll
>> AR934X_SRIF_DPLL2_OUTDIV_SHIFT
) &
283 AR934X_SRIF_DPLL2_OUTDIV_MASK
;
284 pll
= __raw_readl(dpll_base
+ AR934X_SRIF_DDR_DPLL1_REG
);
285 nint
= (pll
>> AR934X_SRIF_DPLL1_NINT_SHIFT
) &
286 AR934X_SRIF_DPLL1_NINT_MASK
;
287 nfrac
= pll
& AR934X_SRIF_DPLL1_NFRAC_MASK
;
288 ref_div
= (pll
>> AR934X_SRIF_DPLL1_REFDIV_SHIFT
) &
289 AR934X_SRIF_DPLL1_REFDIV_MASK
;
292 pll
= __raw_readl(pll_base
+ AR934X_PLL_DDR_CONFIG_REG
);
293 out_div
= (pll
>> AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT
) &
294 AR934X_PLL_DDR_CONFIG_OUTDIV_MASK
;
295 ref_div
= (pll
>> AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT
) &
296 AR934X_PLL_DDR_CONFIG_REFDIV_MASK
;
297 nint
= (pll
>> AR934X_PLL_DDR_CONFIG_NINT_SHIFT
) &
298 AR934X_PLL_DDR_CONFIG_NINT_MASK
;
299 nfrac
= (pll
>> AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT
) &
300 AR934X_PLL_DDR_CONFIG_NFRAC_MASK
;
304 ddr_pll
= ar934x_get_pll_freq(ref_rate
, ref_div
, nint
,
305 nfrac
, frac
, out_div
);
307 clk_ctrl
= __raw_readl(pll_base
+ AR934X_PLL_CPU_DDR_CLK_CTRL_REG
);
309 postdiv
= (clk_ctrl
>> AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT
) &
310 AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK
;
312 if (clk_ctrl
& AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS
)
314 else if (clk_ctrl
& AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL
)
315 cpu_rate
= cpu_pll
/ (postdiv
+ 1);
317 cpu_rate
= ddr_pll
/ (postdiv
+ 1);
319 postdiv
= (clk_ctrl
>> AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT
) &
320 AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK
;
322 if (clk_ctrl
& AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS
)
324 else if (clk_ctrl
& AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL
)
325 ddr_rate
= ddr_pll
/ (postdiv
+ 1);
327 ddr_rate
= cpu_pll
/ (postdiv
+ 1);
329 postdiv
= (clk_ctrl
>> AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT
) &
330 AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK
;
332 if (clk_ctrl
& AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS
)
334 else if (clk_ctrl
& AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL
)
335 ahb_rate
= ddr_pll
/ (postdiv
+ 1);
337 ahb_rate
= cpu_pll
/ (postdiv
+ 1);
339 ath79_set_clk(ATH79_CLK_CPU
, cpu_rate
);
340 ath79_set_clk(ATH79_CLK_DDR
, ddr_rate
);
341 ath79_set_clk(ATH79_CLK_AHB
, ahb_rate
);
343 clk_ctrl
= __raw_readl(pll_base
+ AR934X_PLL_SWITCH_CLOCK_CONTROL_REG
);
344 if (clk_ctrl
& AR934X_PLL_SWITCH_CLOCK_CONTROL_MDIO_CLK_SEL
)
345 ath79_set_clk(ATH79_CLK_MDIO
, 100 * 1000 * 1000);
350 static void __init
qca953x_clocks_init(void __iomem
*pll_base
)
352 unsigned long ref_rate
;
353 unsigned long cpu_rate
;
354 unsigned long ddr_rate
;
355 unsigned long ahb_rate
;
356 u32 pll
, out_div
, ref_div
, nint
, frac
, clk_ctrl
, postdiv
;
357 u32 cpu_pll
, ddr_pll
;
360 bootstrap
= ath79_reset_rr(QCA953X_RESET_REG_BOOTSTRAP
);
361 if (bootstrap
& QCA953X_BOOTSTRAP_REF_CLK_40
)
362 ref_rate
= 40 * 1000 * 1000;
364 ref_rate
= 25 * 1000 * 1000;
366 ref_rate
= ath79_setup_ref_clk(ref_rate
);
368 pll
= __raw_readl(pll_base
+ QCA953X_PLL_CPU_CONFIG_REG
);
369 out_div
= (pll
>> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT
) &
370 QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK
;
371 ref_div
= (pll
>> QCA953X_PLL_CPU_CONFIG_REFDIV_SHIFT
) &
372 QCA953X_PLL_CPU_CONFIG_REFDIV_MASK
;
373 nint
= (pll
>> QCA953X_PLL_CPU_CONFIG_NINT_SHIFT
) &
374 QCA953X_PLL_CPU_CONFIG_NINT_MASK
;
375 frac
= (pll
>> QCA953X_PLL_CPU_CONFIG_NFRAC_SHIFT
) &
376 QCA953X_PLL_CPU_CONFIG_NFRAC_MASK
;
378 cpu_pll
= nint
* ref_rate
/ ref_div
;
379 cpu_pll
+= frac
* (ref_rate
>> 6) / ref_div
;
380 cpu_pll
/= (1 << out_div
);
382 pll
= __raw_readl(pll_base
+ QCA953X_PLL_DDR_CONFIG_REG
);
383 out_div
= (pll
>> QCA953X_PLL_DDR_CONFIG_OUTDIV_SHIFT
) &
384 QCA953X_PLL_DDR_CONFIG_OUTDIV_MASK
;
385 ref_div
= (pll
>> QCA953X_PLL_DDR_CONFIG_REFDIV_SHIFT
) &
386 QCA953X_PLL_DDR_CONFIG_REFDIV_MASK
;
387 nint
= (pll
>> QCA953X_PLL_DDR_CONFIG_NINT_SHIFT
) &
388 QCA953X_PLL_DDR_CONFIG_NINT_MASK
;
389 frac
= (pll
>> QCA953X_PLL_DDR_CONFIG_NFRAC_SHIFT
) &
390 QCA953X_PLL_DDR_CONFIG_NFRAC_MASK
;
392 ddr_pll
= nint
* ref_rate
/ ref_div
;
393 ddr_pll
+= frac
* (ref_rate
>> 6) / (ref_div
<< 4);
394 ddr_pll
/= (1 << out_div
);
396 clk_ctrl
= __raw_readl(pll_base
+ QCA953X_PLL_CLK_CTRL_REG
);
398 postdiv
= (clk_ctrl
>> QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT
) &
399 QCA953X_PLL_CLK_CTRL_CPU_POST_DIV_MASK
;
401 if (clk_ctrl
& QCA953X_PLL_CLK_CTRL_CPU_PLL_BYPASS
)
403 else if (clk_ctrl
& QCA953X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL
)
404 cpu_rate
= cpu_pll
/ (postdiv
+ 1);
406 cpu_rate
= ddr_pll
/ (postdiv
+ 1);
408 postdiv
= (clk_ctrl
>> QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT
) &
409 QCA953X_PLL_CLK_CTRL_DDR_POST_DIV_MASK
;
411 if (clk_ctrl
& QCA953X_PLL_CLK_CTRL_DDR_PLL_BYPASS
)
413 else if (clk_ctrl
& QCA953X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL
)
414 ddr_rate
= ddr_pll
/ (postdiv
+ 1);
416 ddr_rate
= cpu_pll
/ (postdiv
+ 1);
418 postdiv
= (clk_ctrl
>> QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT
) &
419 QCA953X_PLL_CLK_CTRL_AHB_POST_DIV_MASK
;
421 if (clk_ctrl
& QCA953X_PLL_CLK_CTRL_AHB_PLL_BYPASS
)
423 else if (clk_ctrl
& QCA953X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL
)
424 ahb_rate
= ddr_pll
/ (postdiv
+ 1);
426 ahb_rate
= cpu_pll
/ (postdiv
+ 1);
428 ath79_set_clk(ATH79_CLK_CPU
, cpu_rate
);
429 ath79_set_clk(ATH79_CLK_DDR
, ddr_rate
);
430 ath79_set_clk(ATH79_CLK_AHB
, ahb_rate
);
433 static void __init
qca955x_clocks_init(void __iomem
*pll_base
)
435 unsigned long ref_rate
;
436 unsigned long cpu_rate
;
437 unsigned long ddr_rate
;
438 unsigned long ahb_rate
;
439 u32 pll
, out_div
, ref_div
, nint
, frac
, clk_ctrl
, postdiv
;
440 u32 cpu_pll
, ddr_pll
;
443 bootstrap
= ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP
);
444 if (bootstrap
& QCA955X_BOOTSTRAP_REF_CLK_40
)
445 ref_rate
= 40 * 1000 * 1000;
447 ref_rate
= 25 * 1000 * 1000;
449 ref_rate
= ath79_setup_ref_clk(ref_rate
);
451 pll
= __raw_readl(pll_base
+ QCA955X_PLL_CPU_CONFIG_REG
);
452 out_div
= (pll
>> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT
) &
453 QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK
;
454 ref_div
= (pll
>> QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT
) &
455 QCA955X_PLL_CPU_CONFIG_REFDIV_MASK
;
456 nint
= (pll
>> QCA955X_PLL_CPU_CONFIG_NINT_SHIFT
) &
457 QCA955X_PLL_CPU_CONFIG_NINT_MASK
;
458 frac
= (pll
>> QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT
) &
459 QCA955X_PLL_CPU_CONFIG_NFRAC_MASK
;
461 cpu_pll
= nint
* ref_rate
/ ref_div
;
462 cpu_pll
+= frac
* ref_rate
/ (ref_div
* (1 << 6));
463 cpu_pll
/= (1 << out_div
);
465 pll
= __raw_readl(pll_base
+ QCA955X_PLL_DDR_CONFIG_REG
);
466 out_div
= (pll
>> QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT
) &
467 QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK
;
468 ref_div
= (pll
>> QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT
) &
469 QCA955X_PLL_DDR_CONFIG_REFDIV_MASK
;
470 nint
= (pll
>> QCA955X_PLL_DDR_CONFIG_NINT_SHIFT
) &
471 QCA955X_PLL_DDR_CONFIG_NINT_MASK
;
472 frac
= (pll
>> QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT
) &
473 QCA955X_PLL_DDR_CONFIG_NFRAC_MASK
;
475 ddr_pll
= nint
* ref_rate
/ ref_div
;
476 ddr_pll
+= frac
* ref_rate
/ (ref_div
* (1 << 10));
477 ddr_pll
/= (1 << out_div
);
479 clk_ctrl
= __raw_readl(pll_base
+ QCA955X_PLL_CLK_CTRL_REG
);
481 postdiv
= (clk_ctrl
>> QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT
) &
482 QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK
;
484 if (clk_ctrl
& QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS
)
486 else if (clk_ctrl
& QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL
)
487 cpu_rate
= ddr_pll
/ (postdiv
+ 1);
489 cpu_rate
= cpu_pll
/ (postdiv
+ 1);
491 postdiv
= (clk_ctrl
>> QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT
) &
492 QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK
;
494 if (clk_ctrl
& QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS
)
496 else if (clk_ctrl
& QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL
)
497 ddr_rate
= cpu_pll
/ (postdiv
+ 1);
499 ddr_rate
= ddr_pll
/ (postdiv
+ 1);
501 postdiv
= (clk_ctrl
>> QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT
) &
502 QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK
;
504 if (clk_ctrl
& QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS
)
506 else if (clk_ctrl
& QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL
)
507 ahb_rate
= ddr_pll
/ (postdiv
+ 1);
509 ahb_rate
= cpu_pll
/ (postdiv
+ 1);
511 ath79_set_clk(ATH79_CLK_CPU
, cpu_rate
);
512 ath79_set_clk(ATH79_CLK_DDR
, ddr_rate
);
513 ath79_set_clk(ATH79_CLK_AHB
, ahb_rate
);
516 static void __init
qca956x_clocks_init(void __iomem
*pll_base
)
518 unsigned long ref_rate
;
519 unsigned long cpu_rate
;
520 unsigned long ddr_rate
;
521 unsigned long ahb_rate
;
522 u32 pll
, out_div
, ref_div
, nint
, hfrac
, lfrac
, clk_ctrl
, postdiv
;
523 u32 cpu_pll
, ddr_pll
;
527 * QCA956x timer init workaround has to be applied right before setting
528 * up the clock. Else, there will be no jiffies
532 misc
= ath79_reset_rr(AR71XX_RESET_REG_MISC_INT_ENABLE
);
533 misc
|= MISC_INT_MIPS_SI_TIMERINT_MASK
;
534 ath79_reset_wr(AR71XX_RESET_REG_MISC_INT_ENABLE
, misc
);
536 bootstrap
= ath79_reset_rr(QCA956X_RESET_REG_BOOTSTRAP
);
537 if (bootstrap
& QCA956X_BOOTSTRAP_REF_CLK_40
)
538 ref_rate
= 40 * 1000 * 1000;
540 ref_rate
= 25 * 1000 * 1000;
542 ref_rate
= ath79_setup_ref_clk(ref_rate
);
544 pll
= __raw_readl(pll_base
+ QCA956X_PLL_CPU_CONFIG_REG
);
545 out_div
= (pll
>> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT
) &
546 QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK
;
547 ref_div
= (pll
>> QCA956X_PLL_CPU_CONFIG_REFDIV_SHIFT
) &
548 QCA956X_PLL_CPU_CONFIG_REFDIV_MASK
;
550 pll
= __raw_readl(pll_base
+ QCA956X_PLL_CPU_CONFIG1_REG
);
551 nint
= (pll
>> QCA956X_PLL_CPU_CONFIG1_NINT_SHIFT
) &
552 QCA956X_PLL_CPU_CONFIG1_NINT_MASK
;
553 hfrac
= (pll
>> QCA956X_PLL_CPU_CONFIG1_NFRAC_H_SHIFT
) &
554 QCA956X_PLL_CPU_CONFIG1_NFRAC_H_MASK
;
555 lfrac
= (pll
>> QCA956X_PLL_CPU_CONFIG1_NFRAC_L_SHIFT
) &
556 QCA956X_PLL_CPU_CONFIG1_NFRAC_L_MASK
;
558 cpu_pll
= nint
* ref_rate
/ ref_div
;
559 cpu_pll
+= (lfrac
* ref_rate
) / ((ref_div
* 25) << 13);
560 cpu_pll
+= (hfrac
>> 13) * ref_rate
/ ref_div
;
561 cpu_pll
/= (1 << out_div
);
563 pll
= __raw_readl(pll_base
+ QCA956X_PLL_DDR_CONFIG_REG
);
564 out_div
= (pll
>> QCA956X_PLL_DDR_CONFIG_OUTDIV_SHIFT
) &
565 QCA956X_PLL_DDR_CONFIG_OUTDIV_MASK
;
566 ref_div
= (pll
>> QCA956X_PLL_DDR_CONFIG_REFDIV_SHIFT
) &
567 QCA956X_PLL_DDR_CONFIG_REFDIV_MASK
;
568 pll
= __raw_readl(pll_base
+ QCA956X_PLL_DDR_CONFIG1_REG
);
569 nint
= (pll
>> QCA956X_PLL_DDR_CONFIG1_NINT_SHIFT
) &
570 QCA956X_PLL_DDR_CONFIG1_NINT_MASK
;
571 hfrac
= (pll
>> QCA956X_PLL_DDR_CONFIG1_NFRAC_H_SHIFT
) &
572 QCA956X_PLL_DDR_CONFIG1_NFRAC_H_MASK
;
573 lfrac
= (pll
>> QCA956X_PLL_DDR_CONFIG1_NFRAC_L_SHIFT
) &
574 QCA956X_PLL_DDR_CONFIG1_NFRAC_L_MASK
;
576 ddr_pll
= nint
* ref_rate
/ ref_div
;
577 ddr_pll
+= (lfrac
* ref_rate
) / ((ref_div
* 25) << 13);
578 ddr_pll
+= (hfrac
>> 13) * ref_rate
/ ref_div
;
579 ddr_pll
/= (1 << out_div
);
581 clk_ctrl
= __raw_readl(pll_base
+ QCA956X_PLL_CLK_CTRL_REG
);
583 postdiv
= (clk_ctrl
>> QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT
) &
584 QCA956X_PLL_CLK_CTRL_CPU_POST_DIV_MASK
;
586 if (clk_ctrl
& QCA956X_PLL_CLK_CTRL_CPU_PLL_BYPASS
)
588 else if (clk_ctrl
& QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_CPUPLL
)
589 cpu_rate
= ddr_pll
/ (postdiv
+ 1);
591 cpu_rate
= cpu_pll
/ (postdiv
+ 1);
593 postdiv
= (clk_ctrl
>> QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT
) &
594 QCA956X_PLL_CLK_CTRL_DDR_POST_DIV_MASK
;
596 if (clk_ctrl
& QCA956X_PLL_CLK_CTRL_DDR_PLL_BYPASS
)
598 else if (clk_ctrl
& QCA956X_PLL_CLK_CTRL_CPU_DDRCLK_FROM_DDRPLL
)
599 ddr_rate
= cpu_pll
/ (postdiv
+ 1);
601 ddr_rate
= ddr_pll
/ (postdiv
+ 1);
603 postdiv
= (clk_ctrl
>> QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT
) &
604 QCA956X_PLL_CLK_CTRL_AHB_POST_DIV_MASK
;
606 if (clk_ctrl
& QCA956X_PLL_CLK_CTRL_AHB_PLL_BYPASS
)
608 else if (clk_ctrl
& QCA956X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL
)
609 ahb_rate
= ddr_pll
/ (postdiv
+ 1);
611 ahb_rate
= cpu_pll
/ (postdiv
+ 1);
613 ath79_set_clk(ATH79_CLK_CPU
, cpu_rate
);
614 ath79_set_clk(ATH79_CLK_DDR
, ddr_rate
);
615 ath79_set_clk(ATH79_CLK_AHB
, ahb_rate
);
618 static void __init
ath79_clocks_init_dt(struct device_node
*np
)
621 void __iomem
*pll_base
;
623 ref_clk
= of_clk_get(np
, 0);
624 if (!IS_ERR(ref_clk
))
625 clks
[ATH79_CLK_REF
] = ref_clk
;
627 pll_base
= of_iomap(np
, 0);
629 pr_err("%pOF: can't map pll registers\n", np
);
633 if (of_device_is_compatible(np
, "qca,ar7100-pll"))
634 ar71xx_clocks_init(pll_base
);
635 else if (of_device_is_compatible(np
, "qca,ar7240-pll") ||
636 of_device_is_compatible(np
, "qca,ar9130-pll"))
637 ar724x_clocks_init(pll_base
);
638 else if (of_device_is_compatible(np
, "qca,ar9330-pll"))
639 ar933x_clocks_init(pll_base
);
640 else if (of_device_is_compatible(np
, "qca,ar9340-pll"))
641 ar934x_clocks_init(pll_base
);
642 else if (of_device_is_compatible(np
, "qca,qca9530-pll"))
643 qca953x_clocks_init(pll_base
);
644 else if (of_device_is_compatible(np
, "qca,qca9550-pll"))
645 qca955x_clocks_init(pll_base
);
646 else if (of_device_is_compatible(np
, "qca,qca9560-pll"))
647 qca956x_clocks_init(pll_base
);
649 if (!clks
[ATH79_CLK_MDIO
])
650 clks
[ATH79_CLK_MDIO
] = clks
[ATH79_CLK_REF
];
652 if (of_clk_add_provider(np
, of_clk_src_onecell_get
, &clk_data
)) {
653 pr_err("%pOF: could not register clk provider\n", np
);
666 CLK_OF_DECLARE(ar7100_clk
, "qca,ar7100-pll", ath79_clocks_init_dt
);
667 CLK_OF_DECLARE(ar7240_clk
, "qca,ar7240-pll", ath79_clocks_init_dt
);
668 CLK_OF_DECLARE(ar9130_clk
, "qca,ar9130-pll", ath79_clocks_init_dt
);
669 CLK_OF_DECLARE(ar9330_clk
, "qca,ar9330-pll", ath79_clocks_init_dt
);
670 CLK_OF_DECLARE(ar9340_clk
, "qca,ar9340-pll", ath79_clocks_init_dt
);
671 CLK_OF_DECLARE(ar9530_clk
, "qca,qca9530-pll", ath79_clocks_init_dt
);
672 CLK_OF_DECLARE(ar9550_clk
, "qca,qca9550-pll", ath79_clocks_init_dt
);
673 CLK_OF_DECLARE(ar9560_clk
, "qca,qca9560-pll", ath79_clocks_init_dt
);