1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2016 Freescale Semiconductor, Inc.
11 #include <asm/arch/imx-regs.h>
12 #include <asm/arch/pcc.h>
13 #include <asm/arch/sys_proto.h>
15 scg_p scg1_regs = (scg_p)SCG1_RBASE;
17 static u32 scg_src_get_rate(enum scg_clk clksrc)
23 reg = readl(&scg1_regs->sosccsr);
24 if (!(reg & SCG_SOSC_CSR_SOSCVLD_MASK))
29 reg = readl(&scg1_regs->firccsr);
30 if (!(reg & SCG_FIRC_CSR_FIRCVLD_MASK))
35 reg = readl(&scg1_regs->sirccsr);
36 if (!(reg & SCG_SIRC_CSR_SIRCVLD_MASK))
41 reg = readl(&scg1_regs->rtccsr);
42 if (!(reg & SCG_ROSC_CSR_ROSCVLD_MASK))
53 static u32 scg_sircdiv_get_rate(enum scg_clk clk)
59 case SCG_SIRC_DIV1_CLK:
60 mask = SCG_SIRCDIV_DIV1_MASK;
61 shift = SCG_SIRCDIV_DIV1_SHIFT;
63 case SCG_SIRC_DIV2_CLK:
64 mask = SCG_SIRCDIV_DIV2_MASK;
65 shift = SCG_SIRCDIV_DIV2_SHIFT;
67 case SCG_SIRC_DIV3_CLK:
68 mask = SCG_SIRCDIV_DIV3_MASK;
69 shift = SCG_SIRCDIV_DIV3_SHIFT;
75 reg = readl(&scg1_regs->sirccsr);
76 if (!(reg & SCG_SIRC_CSR_SIRCVLD_MASK))
79 reg = readl(&scg1_regs->sircdiv);
80 val = (reg & mask) >> shift;
82 if (!val) /*clock disabled*/
85 rate = scg_src_get_rate(SCG_SIRC_CLK);
86 rate = rate / (1 << (val - 1));
91 static u32 scg_fircdiv_get_rate(enum scg_clk clk)
97 case SCG_FIRC_DIV1_CLK:
98 mask = SCG_FIRCDIV_DIV1_MASK;
99 shift = SCG_FIRCDIV_DIV1_SHIFT;
101 case SCG_FIRC_DIV2_CLK:
102 mask = SCG_FIRCDIV_DIV2_MASK;
103 shift = SCG_FIRCDIV_DIV2_SHIFT;
105 case SCG_FIRC_DIV3_CLK:
106 mask = SCG_FIRCDIV_DIV3_MASK;
107 shift = SCG_FIRCDIV_DIV3_SHIFT;
113 reg = readl(&scg1_regs->firccsr);
114 if (!(reg & SCG_FIRC_CSR_FIRCVLD_MASK))
117 reg = readl(&scg1_regs->fircdiv);
118 val = (reg & mask) >> shift;
120 if (!val) /*clock disabled*/
123 rate = scg_src_get_rate(SCG_FIRC_CLK);
124 rate = rate / (1 << (val - 1));
129 static u32 scg_soscdiv_get_rate(enum scg_clk clk)
135 case SCG_SOSC_DIV1_CLK:
136 mask = SCG_SOSCDIV_DIV1_MASK;
137 shift = SCG_SOSCDIV_DIV1_SHIFT;
139 case SCG_SOSC_DIV2_CLK:
140 mask = SCG_SOSCDIV_DIV2_MASK;
141 shift = SCG_SOSCDIV_DIV2_SHIFT;
143 case SCG_SOSC_DIV3_CLK:
144 mask = SCG_SOSCDIV_DIV3_MASK;
145 shift = SCG_SOSCDIV_DIV3_SHIFT;
151 reg = readl(&scg1_regs->sosccsr);
152 if (!(reg & SCG_SOSC_CSR_SOSCVLD_MASK))
155 reg = readl(&scg1_regs->soscdiv);
156 val = (reg & mask) >> shift;
158 if (!val) /*clock disabled*/
161 rate = scg_src_get_rate(SCG_SOSC_CLK);
162 rate = rate / (1 << (val - 1));
167 static u32 scg_apll_pfd_get_rate(enum scg_clk clk)
170 u32 shift, mask, gate, valid;
173 case SCG_APLL_PFD0_CLK:
174 gate = SCG_PLL_PFD0_GATE_MASK;
175 valid = SCG_PLL_PFD0_VALID_MASK;
176 mask = SCG_PLL_PFD0_FRAC_MASK;
177 shift = SCG_PLL_PFD0_FRAC_SHIFT;
179 case SCG_APLL_PFD1_CLK:
180 gate = SCG_PLL_PFD1_GATE_MASK;
181 valid = SCG_PLL_PFD1_VALID_MASK;
182 mask = SCG_PLL_PFD1_FRAC_MASK;
183 shift = SCG_PLL_PFD1_FRAC_SHIFT;
185 case SCG_APLL_PFD2_CLK:
186 gate = SCG_PLL_PFD2_GATE_MASK;
187 valid = SCG_PLL_PFD2_VALID_MASK;
188 mask = SCG_PLL_PFD2_FRAC_MASK;
189 shift = SCG_PLL_PFD2_FRAC_SHIFT;
191 case SCG_APLL_PFD3_CLK:
192 gate = SCG_PLL_PFD3_GATE_MASK;
193 valid = SCG_PLL_PFD3_VALID_MASK;
194 mask = SCG_PLL_PFD3_FRAC_MASK;
195 shift = SCG_PLL_PFD3_FRAC_SHIFT;
201 reg = readl(&scg1_regs->apllpfd);
202 if (reg & gate || !(reg & valid))
205 clk_debug("scg_apll_pfd_get_rate reg 0x%x\n", reg);
207 val = (reg & mask) >> shift;
208 rate = decode_pll(PLL_A7_APLL);
210 rate = rate / val * 18;
212 clk_debug("scg_apll_pfd_get_rate rate %u\n", rate);
217 static u32 scg_spll_pfd_get_rate(enum scg_clk clk)
220 u32 shift, mask, gate, valid;
223 case SCG_SPLL_PFD0_CLK:
224 gate = SCG_PLL_PFD0_GATE_MASK;
225 valid = SCG_PLL_PFD0_VALID_MASK;
226 mask = SCG_PLL_PFD0_FRAC_MASK;
227 shift = SCG_PLL_PFD0_FRAC_SHIFT;
229 case SCG_SPLL_PFD1_CLK:
230 gate = SCG_PLL_PFD1_GATE_MASK;
231 valid = SCG_PLL_PFD1_VALID_MASK;
232 mask = SCG_PLL_PFD1_FRAC_MASK;
233 shift = SCG_PLL_PFD1_FRAC_SHIFT;
235 case SCG_SPLL_PFD2_CLK:
236 gate = SCG_PLL_PFD2_GATE_MASK;
237 valid = SCG_PLL_PFD2_VALID_MASK;
238 mask = SCG_PLL_PFD2_FRAC_MASK;
239 shift = SCG_PLL_PFD2_FRAC_SHIFT;
241 case SCG_SPLL_PFD3_CLK:
242 gate = SCG_PLL_PFD3_GATE_MASK;
243 valid = SCG_PLL_PFD3_VALID_MASK;
244 mask = SCG_PLL_PFD3_FRAC_MASK;
245 shift = SCG_PLL_PFD3_FRAC_SHIFT;
251 reg = readl(&scg1_regs->spllpfd);
252 if (reg & gate || !(reg & valid))
255 clk_debug("scg_spll_pfd_get_rate reg 0x%x\n", reg);
257 val = (reg & mask) >> shift;
258 rate = decode_pll(PLL_A7_SPLL);
260 rate = rate / val * 18;
262 clk_debug("scg_spll_pfd_get_rate rate %u\n", rate);
267 static u32 scg_apll_get_rate(void)
271 reg = readl(&scg1_regs->apllcfg);
272 val = (reg & SCG_PLL_CFG_PLLSEL_MASK) >> SCG_PLL_CFG_PLLSEL_SHIFT;
275 /* APLL clock after two dividers */
276 rate = decode_pll(PLL_A7_APLL);
278 val = (reg & SCG_PLL_CFG_POSTDIV1_MASK) >>
279 SCG_PLL_CFG_POSTDIV1_SHIFT;
280 rate = rate / (val + 1);
282 val = (reg & SCG_PLL_CFG_POSTDIV2_MASK) >>
283 SCG_PLL_CFG_POSTDIV2_SHIFT;
284 rate = rate / (val + 1);
287 val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
288 SCG_PLL_CFG_PFDSEL_SHIFT;
289 rate = scg_apll_pfd_get_rate(SCG_APLL_PFD0_CLK + val);
295 static u32 scg_spll_get_rate(void)
299 reg = readl(&scg1_regs->spllcfg);
300 val = (reg & SCG_PLL_CFG_PLLSEL_MASK) >> SCG_PLL_CFG_PLLSEL_SHIFT;
302 clk_debug("scg_spll_get_rate reg 0x%x\n", reg);
305 /* APLL clock after two dividers */
306 rate = decode_pll(PLL_A7_SPLL);
308 val = (reg & SCG_PLL_CFG_POSTDIV1_MASK) >>
309 SCG_PLL_CFG_POSTDIV1_SHIFT;
310 rate = rate / (val + 1);
312 val = (reg & SCG_PLL_CFG_POSTDIV2_MASK) >>
313 SCG_PLL_CFG_POSTDIV2_SHIFT;
314 rate = rate / (val + 1);
316 clk_debug("scg_spll_get_rate SPLL %u\n", rate);
320 val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
321 SCG_PLL_CFG_PFDSEL_SHIFT;
322 rate = scg_spll_pfd_get_rate(SCG_SPLL_PFD0_CLK + val);
324 clk_debug("scg_spll_get_rate PFD %u\n", rate);
330 static u32 scg_ddr_get_rate(void)
332 u32 reg, val, rate, div;
334 reg = readl(&scg1_regs->ddrccr);
335 val = (reg & SCG_DDRCCR_DDRCS_MASK) >> SCG_DDRCCR_DDRCS_SHIFT;
336 div = (reg & SCG_DDRCCR_DDRDIV_MASK) >> SCG_DDRCCR_DDRDIV_SHIFT;
342 reg = readl(&scg1_regs->apllcfg);
343 val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
344 SCG_PLL_CFG_PFDSEL_SHIFT;
345 rate = scg_apll_pfd_get_rate(SCG_APLL_PFD0_CLK + val);
347 rate = decode_pll(PLL_USB);
350 rate = rate / (1 << (div - 1));
354 static u32 scg_nic_get_rate(enum scg_clk clk)
356 u32 reg, val, rate, nic0_rate;
359 reg = readl(&scg1_regs->niccsr);
360 val = (reg & SCG_NICCSR_NICCS_MASK) >> SCG_NICCSR_NICCS_SHIFT;
362 clk_debug("scg_nic_get_rate niccsr 0x%x\n", reg);
365 rate = scg_src_get_rate(SCG_FIRC_CLK);
367 rate = scg_ddr_get_rate();
369 clk_debug("scg_nic_get_rate parent rate %u\n", rate);
371 val = (reg & SCG_NICCSR_NIC0DIV_MASK) >> SCG_NICCSR_NIC0DIV_SHIFT;
373 rate = rate / (val + 1);
376 clk_debug("scg_nic_get_rate NIC0 rate %u\n", rate);
382 mask = SCG_NICCSR_GPUDIV_MASK;
383 shift = SCG_NICCSR_GPUDIV_SHIFT;
385 case SCG_NIC1_EXT_CLK:
386 case SCG_NIC1_BUS_CLK:
388 mask = SCG_NICCSR_NIC1DIV_MASK;
389 shift = SCG_NICCSR_NIC1DIV_SHIFT;
395 val = (reg & mask) >> shift;
396 rate = rate / (val + 1);
398 clk_debug("scg_nic_get_rate NIC1 rate %u\n", rate);
404 case SCG_NIC1_EXT_CLK:
405 mask = SCG_NICCSR_NIC1EXTDIV_MASK;
406 shift = SCG_NICCSR_NIC1EXTDIV_SHIFT;
408 case SCG_NIC1_BUS_CLK:
409 mask = SCG_NICCSR_NIC1BUSDIV_MASK;
410 shift = SCG_NICCSR_NIC1BUSDIV_SHIFT;
417 * On RevB, the nic_bus and nic_ext dividers are parallel
418 * not chained with nic div
420 if (soc_rev() >= CHIP_REV_2_0)
423 val = (reg & mask) >> shift;
424 rate = rate / (val + 1);
426 clk_debug("scg_nic_get_rate NIC1 bus rate %u\n", rate);
431 static enum scg_clk scg_scs_array[4] = {
432 SCG_SOSC_CLK, SCG_SIRC_CLK, SCG_FIRC_CLK, SCG_ROSC_CLK,
435 static u32 scg_sys_get_rate(enum scg_clk clk)
439 if (clk != SCG_CORE_CLK && clk != SCG_BUS_CLK)
442 reg = readl(&scg1_regs->csr);
443 val = (reg & SCG_CCR_SCS_MASK) >> SCG_CCR_SCS_SHIFT;
445 clk_debug("scg_sys_get_rate reg 0x%x\n", reg);
448 case SCG_SCS_SYS_OSC:
449 case SCG_SCS_SLOW_IRC:
450 case SCG_SCS_FAST_IRC:
451 case SCG_SCS_RTC_OSC:
452 rate = scg_src_get_rate(scg_scs_array[val - 1]);
455 rate = scg_apll_get_rate();
458 rate = scg_spll_get_rate();
464 clk_debug("scg_sys_get_rate parent rate %u\n", rate);
466 val = (reg & SCG_CCR_DIVCORE_MASK) >> SCG_CCR_DIVCORE_SHIFT;
468 rate = rate / (val + 1);
470 if (clk == SCG_BUS_CLK) {
471 val = (reg & SCG_CCR_DIVBUS_MASK) >> SCG_CCR_DIVBUS_SHIFT;
472 rate = rate / (val + 1);
478 u32 decode_pll(enum pll_clocks pll)
480 u32 reg, pre_div, infreq, mult;
484 * Alought there are four choices for the bypass src,
485 * we choose OSC_24M which is the default set in ROM.
489 reg = readl(&scg1_regs->spllcsr);
491 if (!(reg & SCG_SPLL_CSR_SPLLVLD_MASK))
494 reg = readl(&scg1_regs->spllcfg);
496 pre_div = (reg & SCG_PLL_CFG_PREDIV_MASK) >>
497 SCG_PLL_CFG_PREDIV_SHIFT;
500 mult = (reg & SCG1_SPLL_CFG_MULT_MASK) >>
501 SCG_PLL_CFG_MULT_SHIFT;
503 infreq = (reg & SCG_PLL_CFG_CLKSRC_MASK) >>
504 SCG_PLL_CFG_CLKSRC_SHIFT;
506 infreq = scg_src_get_rate(SCG_SOSC_CLK);
508 infreq = scg_src_get_rate(SCG_FIRC_CLK);
510 num = readl(&scg1_regs->spllnum);
511 denom = readl(&scg1_regs->splldenom);
513 infreq = infreq / pre_div;
516 return infreq * mult + infreq * num / denom;
518 return infreq * mult;
521 reg = readl(&scg1_regs->apllcsr);
523 if (!(reg & SCG_APLL_CSR_APLLVLD_MASK))
526 reg = readl(&scg1_regs->apllcfg);
528 pre_div = (reg & SCG_PLL_CFG_PREDIV_MASK) >>
529 SCG_PLL_CFG_PREDIV_SHIFT;
532 mult = (reg & SCG_APLL_CFG_MULT_MASK) >>
533 SCG_PLL_CFG_MULT_SHIFT;
535 infreq = (reg & SCG_PLL_CFG_CLKSRC_MASK) >>
536 SCG_PLL_CFG_CLKSRC_SHIFT;
538 infreq = scg_src_get_rate(SCG_SOSC_CLK);
540 infreq = scg_src_get_rate(SCG_FIRC_CLK);
542 num = readl(&scg1_regs->apllnum);
543 denom = readl(&scg1_regs->aplldenom);
545 infreq = infreq / pre_div;
548 return infreq * mult + infreq * num / denom;
550 return infreq * mult;
553 reg = readl(&scg1_regs->upllcsr);
555 if (!(reg & SCG_UPLL_CSR_UPLLVLD_MASK))
563 printf("Unsupported pll clocks %d\n", pll);
570 u32 scg_clk_get_rate(enum scg_clk clk)
573 case SCG_SIRC_DIV1_CLK:
574 case SCG_SIRC_DIV2_CLK:
575 case SCG_SIRC_DIV3_CLK:
576 return scg_sircdiv_get_rate(clk);
578 case SCG_FIRC_DIV1_CLK:
579 case SCG_FIRC_DIV2_CLK:
580 case SCG_FIRC_DIV3_CLK:
581 return scg_fircdiv_get_rate(clk);
583 case SCG_SOSC_DIV1_CLK:
584 case SCG_SOSC_DIV2_CLK:
585 case SCG_SOSC_DIV3_CLK:
586 return scg_soscdiv_get_rate(clk);
590 return scg_sys_get_rate(clk);
592 case SCG_SPLL_PFD0_CLK:
593 case SCG_SPLL_PFD1_CLK:
594 case SCG_SPLL_PFD2_CLK:
595 case SCG_SPLL_PFD3_CLK:
596 return scg_spll_pfd_get_rate(clk);
598 case SCG_APLL_PFD0_CLK:
599 case SCG_APLL_PFD1_CLK:
600 case SCG_APLL_PFD2_CLK:
601 case SCG_APLL_PFD3_CLK:
602 return scg_apll_pfd_get_rate(clk);
605 return scg_ddr_get_rate();
610 case SCG_NIC1_BUS_CLK:
611 case SCG_NIC1_EXT_CLK:
612 return scg_nic_get_rate(clk);
615 return decode_pll(PLL_USB);
618 return decode_pll(PLL_MIPI);
624 return scg_src_get_rate(clk);
630 int scg_enable_pll_pfd(enum scg_clk clk, u32 frac)
633 u32 shift, mask, gate, valid;
636 if (frac < 12 || frac > 35)
640 case SCG_SPLL_PFD0_CLK:
641 case SCG_APLL_PFD0_CLK:
642 gate = SCG_PLL_PFD0_GATE_MASK;
643 valid = SCG_PLL_PFD0_VALID_MASK;
644 mask = SCG_PLL_PFD0_FRAC_MASK;
645 shift = SCG_PLL_PFD0_FRAC_SHIFT;
647 if (clk == SCG_SPLL_PFD0_CLK)
648 addr = (u32)(&scg1_regs->spllpfd);
650 addr = (u32)(&scg1_regs->apllpfd);
652 case SCG_SPLL_PFD1_CLK:
653 case SCG_APLL_PFD1_CLK:
654 gate = SCG_PLL_PFD1_GATE_MASK;
655 valid = SCG_PLL_PFD1_VALID_MASK;
656 mask = SCG_PLL_PFD1_FRAC_MASK;
657 shift = SCG_PLL_PFD1_FRAC_SHIFT;
659 if (clk == SCG_SPLL_PFD1_CLK)
660 addr = (u32)(&scg1_regs->spllpfd);
662 addr = (u32)(&scg1_regs->apllpfd);
664 case SCG_SPLL_PFD2_CLK:
665 case SCG_APLL_PFD2_CLK:
666 gate = SCG_PLL_PFD2_GATE_MASK;
667 valid = SCG_PLL_PFD2_VALID_MASK;
668 mask = SCG_PLL_PFD2_FRAC_MASK;
669 shift = SCG_PLL_PFD2_FRAC_SHIFT;
671 if (clk == SCG_SPLL_PFD2_CLK)
672 addr = (u32)(&scg1_regs->spllpfd);
674 addr = (u32)(&scg1_regs->apllpfd);
676 case SCG_SPLL_PFD3_CLK:
677 case SCG_APLL_PFD3_CLK:
678 gate = SCG_PLL_PFD3_GATE_MASK;
679 valid = SCG_PLL_PFD3_VALID_MASK;
680 mask = SCG_PLL_PFD3_FRAC_MASK;
681 shift = SCG_PLL_PFD3_FRAC_SHIFT;
683 if (clk == SCG_SPLL_PFD3_CLK)
684 addr = (u32)(&scg1_regs->spllpfd);
686 addr = (u32)(&scg1_regs->apllpfd);
697 /* Write Frac divider */
699 reg |= (frac << shift) & mask;
704 * (Need un-gate before checking valid, not align with RM)
709 /* Wait for PFD clock being valid */
712 } while (!(reg & valid));
717 #define SIM_MISC_CTRL0_USB_PLL_EN_MASK (0x1 << 2)
718 int scg_enable_usb_pll(bool usb_control)
721 s32 timeout = 1000000;
724 struct usbphy_regs *usbphy =
725 (struct usbphy_regs *)USBPHY_RBASE;
727 sosc_rate = scg_src_get_rate(SCG_SOSC_CLK);
731 reg = readl(SIM0_RBASE + 0x3C);
733 reg &= ~SIM_MISC_CTRL0_USB_PLL_EN_MASK;
735 reg |= SIM_MISC_CTRL0_USB_PLL_EN_MASK;
736 writel(reg, SIM0_RBASE + 0x3C);
738 if (!(readl(&usbphy->usb1_pll_480_ctrl) & PLL_USB_LOCK_MASK)) {
739 writel(0x1c00000, &usbphy->usb1_pll_480_ctrl_clr);
743 writel(0xc00000, &usbphy->usb1_pll_480_ctrl_set);
747 writel(0x800000, &usbphy->usb1_pll_480_ctrl_set);
751 writel(0x1400000, &usbphy->usb1_pll_480_ctrl_set);
755 writel(0xc00000, &usbphy->usb1_pll_480_ctrl_set);
759 /* Enable the regulator first */
760 writel(PLL_USB_REG_ENABLE_MASK,
761 &usbphy->usb1_pll_480_ctrl_set);
763 /* Wait at least 15us */
766 /* Enable the power */
767 writel(PLL_USB_PWR_MASK, &usbphy->usb1_pll_480_ctrl_set);
771 if (readl(&usbphy->usb1_pll_480_ctrl) &
777 /* If timeout, we power down the pll */
778 writel(PLL_USB_PWR_MASK,
779 &usbphy->usb1_pll_480_ctrl_clr);
784 /* Clear the bypass */
785 writel(PLL_USB_BYPASS_MASK, &usbphy->usb1_pll_480_ctrl_clr);
787 /* Enable the PLL clock out to USB */
788 writel((PLL_USB_EN_USB_CLKS_MASK | PLL_USB_ENABLE_MASK),
789 &usbphy->usb1_pll_480_ctrl_set);
793 if (readl(&scg1_regs->upllcsr) &
794 SCG_UPLL_CSR_UPLLVLD_MASK)
799 reg = readl(SIM0_RBASE + 0x3C);
800 reg &= ~SIM_MISC_CTRL0_USB_PLL_EN_MASK;
801 writel(reg, SIM0_RBASE + 0x3C);
810 /* A7 domain system clock source is SPLL */
811 #define SCG1_RCCR_SCS_NUM ((SCG_SCS_SYS_PLL) << SCG_CCR_SCS_SHIFT)
813 /* A7 Core clck = SPLL PFD0 / 1 = 500MHz / 1 = 500MHz */
814 #define SCG1_RCCR_DIVCORE_NUM ((0x0) << SCG_CCR_DIVCORE_SHIFT)
815 #define SCG1_RCCR_CFG_MASK (SCG_CCR_SCS_MASK | SCG_CCR_DIVBUS_MASK)
817 /* A7 Plat clck = A7 Core Clock / 2 = 250MHz / 1 = 250MHz */
818 #define SCG1_RCCR_DIVBUS_NUM ((0x1) << SCG_CCR_DIVBUS_SHIFT)
819 #define SCG1_RCCR_CFG_NUM (SCG1_RCCR_SCS_NUM | SCG1_RCCR_DIVBUS_NUM)
821 void scg_a7_rccr_init(void)
823 u32 rccr_reg_val = 0;
825 rccr_reg_val = readl(&scg1_regs->rccr);
827 rccr_reg_val &= (~SCG1_RCCR_CFG_MASK);
828 rccr_reg_val |= (SCG1_RCCR_CFG_NUM);
830 writel(rccr_reg_val, &scg1_regs->rccr);
834 #define SCG1_SPLL_CFG_POSTDIV2_NUM ((0x0) << SCG_PLL_CFG_POSTDIV2_SHIFT)
836 #define SCG1_SPLL_CFG_POSTDIV1_NUM ((0x0) << SCG_PLL_CFG_POSTDIV1_SHIFT)
839 #define SCG1_SPLL_CFG_MULT_NUM ((22) << SCG_PLL_CFG_MULT_SHIFT)
841 /* PFD0 output clock selected */
842 #define SCG1_SPLL_CFG_PFDSEL_NUM ((0) << SCG_PLL_CFG_PFDSEL_SHIFT)
844 #define SCG1_SPLL_CFG_PREDIV_NUM ((0x0) << SCG_PLL_CFG_PREDIV_SHIFT)
845 /* SPLL output clocks (including PFD outputs) selected */
846 #define SCG1_SPLL_CFG_BYPASS_NUM ((0x0) << SCG_PLL_CFG_BYPASS_SHIFT)
847 /* SPLL PFD output clock selected */
848 #define SCG1_SPLL_CFG_PLLSEL_NUM ((0x1) << SCG_PLL_CFG_PLLSEL_SHIFT)
849 /* Clock source is System OSC */
850 #define SCG1_SPLL_CFG_CLKSRC_NUM ((0x0) << SCG_PLL_CFG_CLKSRC_SHIFT)
851 #define SCG1_SPLL_CFG_NUM_24M_OSC (SCG1_SPLL_CFG_POSTDIV2_NUM | \
852 SCG1_SPLL_CFG_POSTDIV1_NUM | \
853 (22 << SCG_PLL_CFG_MULT_SHIFT) | \
854 SCG1_SPLL_CFG_PFDSEL_NUM | \
855 SCG1_SPLL_CFG_PREDIV_NUM | \
856 SCG1_SPLL_CFG_BYPASS_NUM | \
857 SCG1_SPLL_CFG_PLLSEL_NUM | \
858 SCG1_SPLL_CFG_CLKSRC_NUM)
859 /*413Mhz = A7 SPLL(528MHz) * 18/23 */
860 #define SCG1_SPLL_PFD0_FRAC_NUM ((23) << SCG_PLL_PFD0_FRAC_SHIFT)
862 void scg_a7_spll_init(void)
866 /* Disable A7 System PLL */
867 val = readl(&scg1_regs->spllcsr);
868 val &= ~SCG_SPLL_CSR_SPLLEN_MASK;
869 writel(val, &scg1_regs->spllcsr);
873 * "When changing PFD values, it is recommneded PFDx clock
874 * gets gated first by writing a value of 1 to PFDx_CLKGATE register,
875 * then program the new PFD value, then poll the PFDx_VALID
876 * flag to set before writing a value of 0 to PFDx_CLKGATE
877 * to ungate the PFDx clock and allow PFDx clock to run"
880 /* Gate off A7 SPLL PFD0 ~ PDF4 */
881 val = readl(&scg1_regs->spllpfd);
882 val |= (SCG_PLL_PFD3_GATE_MASK |
883 SCG_PLL_PFD2_GATE_MASK |
884 SCG_PLL_PFD1_GATE_MASK |
885 SCG_PLL_PFD0_GATE_MASK);
886 writel(val, &scg1_regs->spllpfd);
888 /* ================ A7 SPLL Configuration Start ============== */
890 /* Configure A7 System PLL */
891 writel(SCG1_SPLL_CFG_NUM_24M_OSC, &scg1_regs->spllcfg);
893 /* Enable A7 System PLL */
894 val = readl(&scg1_regs->spllcsr);
895 val |= SCG_SPLL_CSR_SPLLEN_MASK;
896 writel(val, &scg1_regs->spllcsr);
898 /* Wait for A7 SPLL clock ready */
899 while (!(readl(&scg1_regs->spllcsr) & SCG_SPLL_CSR_SPLLVLD_MASK))
902 /* Configure A7 SPLL PFD0 */
903 val = readl(&scg1_regs->spllpfd);
904 val &= ~SCG_PLL_PFD0_FRAC_MASK;
905 val |= SCG1_SPLL_PFD0_FRAC_NUM;
906 writel(val, &scg1_regs->spllpfd);
908 /* Un-gate A7 SPLL PFD0 */
909 val = readl(&scg1_regs->spllpfd);
910 val &= ~SCG_PLL_PFD0_GATE_MASK;
911 writel(val, &scg1_regs->spllpfd);
913 /* Wait for A7 SPLL PFD0 clock being valid */
914 while (!(readl(&scg1_regs->spllpfd) & SCG_PLL_PFD0_VALID_MASK))
917 /* ================ A7 SPLL Configuration End ============== */
920 /* DDR clock source is APLL PFD0 (396MHz) */
921 #define SCG1_DDRCCR_DDRCS_NUM ((0x0) << SCG_DDRCCR_DDRCS_SHIFT)
922 /* DDR clock = APLL PFD0 / 1 = 396MHz / 1 = 396MHz */
923 #define SCG1_DDRCCR_DDRDIV_NUM ((0x1) << SCG_DDRCCR_DDRDIV_SHIFT)
924 /* DDR clock = APLL PFD0 / 2 = 396MHz / 2 = 198MHz */
925 #define SCG1_DDRCCR_DDRDIV_LF_NUM ((0x2) << SCG_DDRCCR_DDRDIV_SHIFT)
926 #define SCG1_DDRCCR_CFG_NUM (SCG1_DDRCCR_DDRCS_NUM | \
927 SCG1_DDRCCR_DDRDIV_NUM)
928 #define SCG1_DDRCCR_CFG_LF_NUM (SCG1_DDRCCR_DDRCS_NUM | \
929 SCG1_DDRCCR_DDRDIV_LF_NUM)
930 void scg_a7_ddrclk_init(void)
932 writel(SCG1_DDRCCR_CFG_NUM, &scg1_regs->ddrccr);
935 /* SCG1(A7) APLLCFG configurations */
936 /* divide by 1 <<28 */
937 #define SCG1_APLL_CFG_POSTDIV2_NUM ((0x0) << SCG_PLL_CFG_POSTDIV2_SHIFT)
938 /* divide by 1 <<24 */
939 #define SCG1_APLL_CFG_POSTDIV1_NUM ((0x0) << SCG_PLL_CFG_POSTDIV1_SHIFT)
940 /* MULT is 22 <<16 */
941 #define SCG1_APLL_CFG_MULT_NUM ((22) << SCG_PLL_CFG_MULT_SHIFT)
942 /* PFD0 output clock selected <<14 */
943 #define SCG1_APLL_CFG_PFDSEL_NUM ((0) << SCG_PLL_CFG_PFDSEL_SHIFT)
945 #define SCG1_APLL_CFG_PREDIV_NUM ((0x0) << SCG_PLL_CFG_PREDIV_SHIFT)
946 /* APLL output clocks (including PFD outputs) selected <<2 */
947 #define SCG1_APLL_CFG_BYPASS_NUM ((0x0) << SCG_PLL_CFG_BYPASS_SHIFT)
948 /* APLL PFD output clock selected <<1 */
949 #define SCG1_APLL_CFG_PLLSEL_NUM ((0x0) << SCG_PLL_CFG_PLLSEL_SHIFT)
950 /* Clock source is System OSC <<0 */
951 #define SCG1_APLL_CFG_CLKSRC_NUM ((0x0) << SCG_PLL_CFG_CLKSRC_SHIFT)
953 /* SCG1(A7) FIRC DIV configurations */
954 /* Disable FIRC DIV3 */
955 #define SCG1_FIRCDIV_DIV3_NUM ((0x0) << SCG_FIRCDIV_DIV3_SHIFT)
956 /* FIRC DIV2 = 48MHz / 1 = 48MHz */
957 #define SCG1_FIRCDIV_DIV2_NUM ((0x1) << SCG_FIRCDIV_DIV2_SHIFT)
958 /* Disable FIRC DIV1 */
959 #define SCG1_FIRCDIV_DIV1_NUM ((0x0) << SCG_FIRCDIV_DIV1_SHIFT)
961 void scg_a7_firc_init(void)
963 /* Wait for FIRC clock ready */
964 while (!(readl(&scg1_regs->firccsr) & SCG_FIRC_CSR_FIRCVLD_MASK))
967 /* Configure A7 FIRC DIV1 ~ DIV3 */
968 writel((SCG1_FIRCDIV_DIV3_NUM |
969 SCG1_FIRCDIV_DIV2_NUM |
970 SCG1_FIRCDIV_DIV1_NUM), &scg1_regs->fircdiv);
973 /* SCG1(A7) NICCCR configurations */
974 /* NIC clock source is DDR clock (396/198MHz) */
975 #define SCG1_NICCCR_NICCS_NUM ((0x1) << SCG_NICCCR_NICCS_SHIFT)
977 /* NIC0 clock = DDR Clock / 2 = 396MHz / 2 = 198MHz */
978 #define SCG1_NICCCR_NIC0_DIV_NUM ((0x1) << SCG_NICCCR_NIC0_DIV_SHIFT)
979 /* NIC0 clock = DDR Clock / 1 = 198MHz / 1 = 198MHz */
980 #define SCG1_NICCCR_NIC0_DIV_LF_NUM ((0x0) << SCG_NICCCR_NIC0_DIV_SHIFT)
981 /* NIC1 clock = NIC0 Clock / 1 = 198MHz / 2 = 198MHz */
982 #define SCG1_NICCCR_NIC1_DIV_NUM ((0x0) << SCG_NICCCR_NIC1_DIV_SHIFT)
983 /* NIC1 bus clock = NIC1 Clock / 3 = 198MHz / 3 = 66MHz */
984 #define SCG1_NICCCR_NIC1_DIVBUS_NUM ((0x2) << SCG_NICCCR_NIC1_DIVBUS_SHIFT)
985 #define SCG1_NICCCR_CFG_NUM (SCG1_NICCCR_NICCS_NUM | \
986 SCG1_NICCCR_NIC0_DIV_NUM | \
987 SCG1_NICCCR_NIC1_DIV_NUM | \
988 SCG1_NICCCR_NIC1_DIVBUS_NUM)
990 void scg_a7_nicclk_init(void)
992 writel(SCG1_NICCCR_CFG_NUM, &scg1_regs->nicccr);
995 /* SCG1(A7) FIRC DIV configurations */
996 /* Enable FIRC DIV3 */
997 #define SCG1_SOSCDIV_DIV3_NUM ((0x1) << SCG_SOSCDIV_DIV3_SHIFT)
998 /* FIRC DIV2 = 48MHz / 1 = 48MHz */
999 #define SCG1_SOSCDIV_DIV2_NUM ((0x1) << SCG_SOSCDIV_DIV2_SHIFT)
1000 /* Enable FIRC DIV1 */
1001 #define SCG1_SOSCDIV_DIV1_NUM ((0x1) << SCG_SOSCDIV_DIV1_SHIFT)
1003 void scg_a7_soscdiv_init(void)
1005 /* Wait for FIRC clock ready */
1006 while (!(readl(&scg1_regs->sosccsr) & SCG_SOSC_CSR_SOSCVLD_MASK))
1009 /* Configure A7 FIRC DIV1 ~ DIV3 */
1010 writel((SCG1_SOSCDIV_DIV3_NUM | SCG1_SOSCDIV_DIV2_NUM |
1011 SCG1_SOSCDIV_DIV1_NUM), &scg1_regs->soscdiv);
1014 void scg_a7_sys_clk_sel(enum scg_sys_src clk)
1016 u32 rccr_reg_val = 0;
1018 clk_debug("%s: system clock selected as %s\n", "[SCG]",
1019 clk == SCG_SCS_SYS_OSC ? "SYS_OSC" :
1020 clk == SCG_SCS_SLOW_IRC ? "SLOW_IRC" :
1021 clk == SCG_SCS_FAST_IRC ? "FAST_IRC" :
1022 clk == SCG_SCS_RTC_OSC ? "RTC_OSC" :
1023 clk == SCG_SCS_AUX_PLL ? "AUX_PLL" :
1024 clk == SCG_SCS_SYS_PLL ? "SYS_PLL" :
1025 clk == SCG_SCS_USBPHY_PLL ? "USBPHY_PLL" :
1029 rccr_reg_val = readl(&scg1_regs->rccr);
1030 rccr_reg_val &= ~SCG_CCR_SCS_MASK;
1031 rccr_reg_val |= (clk << SCG_CCR_SCS_SHIFT);
1032 writel(rccr_reg_val, &scg1_regs->rccr);
1035 void scg_a7_info(void)
1037 debug("SCG Version: 0x%x\n", readl(&scg1_regs->verid));
1038 debug("SCG Parameter: 0x%x\n", readl(&scg1_regs->param));
1039 debug("SCG RCCR Value: 0x%x\n", readl(&scg1_regs->rccr));
1040 debug("SCG Clock Status: 0x%x\n", readl(&scg1_regs->csr));
1043 void scg_a7_init_core_clk(void)
1048 * The normal target frequency for ULP B0 is 500Mhz,
1049 * but ROM set it to 413Mhz, need to change SPLL PFD0 FRAC
1051 if (soc_rev() >= CHIP_REV_2_0) {
1052 /* Switch RCCR SCG to SOSC, firstly check the SOSC is valid */
1053 if ((readl(&scg1_regs->sosccsr) & SCG_SOSC_CSR_SOSCVLD_MASK)) {
1054 val = readl(&scg1_regs->rccr);
1055 val &= (~SCG_CCR_SCS_MASK);
1056 val |= ((SCG_SCS_SYS_OSC) << SCG_CCR_SCS_SHIFT);
1057 writel(val, &scg1_regs->rccr);
1059 /* Switch the PLLS to SPLL clk */
1060 val = readl(&scg1_regs->spllcfg);
1061 val &= ~SCG_PLL_CFG_PLLSEL_MASK;
1062 writel(val, &scg1_regs->spllcfg);
1065 * Re-configure PFD0 to 19,
1066 * A7 SPLL(528MHz) * 18 / 19 = 500MHz
1068 scg_enable_pll_pfd(SCG_SPLL_PFD0_CLK, 19);
1070 /* Switch the PLLS to SPLL PFD0 */
1071 val = readl(&scg1_regs->spllcfg);
1072 val |= SCG_PLL_CFG_PLLSEL_MASK;
1073 writel(val, &scg1_regs->spllcfg);
1075 /* Set RCCR SCG to SPLL clk out */
1076 val = readl(&scg1_regs->rccr);
1077 val &= (~SCG_CCR_SCS_MASK);
1078 val |= ((SCG_SCS_SYS_PLL) << SCG_CCR_SCS_SHIFT);
1079 writel(val, &scg1_regs->rccr);