1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2016 Freescale Semiconductor, Inc.
10 #include <asm/arch/imx-regs.h>
11 #include <asm/arch/pcc.h>
12 #include <asm/arch/sys_proto.h>
14 scg_p scg1_regs = (scg_p)SCG1_RBASE;
16 static u32 scg_src_get_rate(enum scg_clk clksrc)
22 reg = readl(&scg1_regs->sosccsr);
23 if (!(reg & SCG_SOSC_CSR_SOSCVLD_MASK))
28 reg = readl(&scg1_regs->firccsr);
29 if (!(reg & SCG_FIRC_CSR_FIRCVLD_MASK))
34 reg = readl(&scg1_regs->sirccsr);
35 if (!(reg & SCG_SIRC_CSR_SIRCVLD_MASK))
40 reg = readl(&scg1_regs->rtccsr);
41 if (!(reg & SCG_ROSC_CSR_ROSCVLD_MASK))
52 static u32 scg_sircdiv_get_rate(enum scg_clk clk)
58 case SCG_SIRC_DIV1_CLK:
59 mask = SCG_SIRCDIV_DIV1_MASK;
60 shift = SCG_SIRCDIV_DIV1_SHIFT;
62 case SCG_SIRC_DIV2_CLK:
63 mask = SCG_SIRCDIV_DIV2_MASK;
64 shift = SCG_SIRCDIV_DIV2_SHIFT;
66 case SCG_SIRC_DIV3_CLK:
67 mask = SCG_SIRCDIV_DIV3_MASK;
68 shift = SCG_SIRCDIV_DIV3_SHIFT;
74 reg = readl(&scg1_regs->sirccsr);
75 if (!(reg & SCG_SIRC_CSR_SIRCVLD_MASK))
78 reg = readl(&scg1_regs->sircdiv);
79 val = (reg & mask) >> shift;
81 if (!val) /*clock disabled*/
84 rate = scg_src_get_rate(SCG_SIRC_CLK);
85 rate = rate / (1 << (val - 1));
90 static u32 scg_fircdiv_get_rate(enum scg_clk clk)
96 case SCG_FIRC_DIV1_CLK:
97 mask = SCG_FIRCDIV_DIV1_MASK;
98 shift = SCG_FIRCDIV_DIV1_SHIFT;
100 case SCG_FIRC_DIV2_CLK:
101 mask = SCG_FIRCDIV_DIV2_MASK;
102 shift = SCG_FIRCDIV_DIV2_SHIFT;
104 case SCG_FIRC_DIV3_CLK:
105 mask = SCG_FIRCDIV_DIV3_MASK;
106 shift = SCG_FIRCDIV_DIV3_SHIFT;
112 reg = readl(&scg1_regs->firccsr);
113 if (!(reg & SCG_FIRC_CSR_FIRCVLD_MASK))
116 reg = readl(&scg1_regs->fircdiv);
117 val = (reg & mask) >> shift;
119 if (!val) /*clock disabled*/
122 rate = scg_src_get_rate(SCG_FIRC_CLK);
123 rate = rate / (1 << (val - 1));
128 static u32 scg_soscdiv_get_rate(enum scg_clk clk)
134 case SCG_SOSC_DIV1_CLK:
135 mask = SCG_SOSCDIV_DIV1_MASK;
136 shift = SCG_SOSCDIV_DIV1_SHIFT;
138 case SCG_SOSC_DIV2_CLK:
139 mask = SCG_SOSCDIV_DIV2_MASK;
140 shift = SCG_SOSCDIV_DIV2_SHIFT;
142 case SCG_SOSC_DIV3_CLK:
143 mask = SCG_SOSCDIV_DIV3_MASK;
144 shift = SCG_SOSCDIV_DIV3_SHIFT;
150 reg = readl(&scg1_regs->sosccsr);
151 if (!(reg & SCG_SOSC_CSR_SOSCVLD_MASK))
154 reg = readl(&scg1_regs->soscdiv);
155 val = (reg & mask) >> shift;
157 if (!val) /*clock disabled*/
160 rate = scg_src_get_rate(SCG_SOSC_CLK);
161 rate = rate / (1 << (val - 1));
166 static u32 scg_apll_pfd_get_rate(enum scg_clk clk)
169 u32 shift, mask, gate, valid;
172 case SCG_APLL_PFD0_CLK:
173 gate = SCG_PLL_PFD0_GATE_MASK;
174 valid = SCG_PLL_PFD0_VALID_MASK;
175 mask = SCG_PLL_PFD0_FRAC_MASK;
176 shift = SCG_PLL_PFD0_FRAC_SHIFT;
178 case SCG_APLL_PFD1_CLK:
179 gate = SCG_PLL_PFD1_GATE_MASK;
180 valid = SCG_PLL_PFD1_VALID_MASK;
181 mask = SCG_PLL_PFD1_FRAC_MASK;
182 shift = SCG_PLL_PFD1_FRAC_SHIFT;
184 case SCG_APLL_PFD2_CLK:
185 gate = SCG_PLL_PFD2_GATE_MASK;
186 valid = SCG_PLL_PFD2_VALID_MASK;
187 mask = SCG_PLL_PFD2_FRAC_MASK;
188 shift = SCG_PLL_PFD2_FRAC_SHIFT;
190 case SCG_APLL_PFD3_CLK:
191 gate = SCG_PLL_PFD3_GATE_MASK;
192 valid = SCG_PLL_PFD3_VALID_MASK;
193 mask = SCG_PLL_PFD3_FRAC_MASK;
194 shift = SCG_PLL_PFD3_FRAC_SHIFT;
200 reg = readl(&scg1_regs->apllpfd);
201 if (reg & gate || !(reg & valid))
204 clk_debug("scg_apll_pfd_get_rate reg 0x%x\n", reg);
206 val = (reg & mask) >> shift;
207 rate = decode_pll(PLL_A7_APLL);
209 rate = rate / val * 18;
211 clk_debug("scg_apll_pfd_get_rate rate %u\n", rate);
216 static u32 scg_spll_pfd_get_rate(enum scg_clk clk)
219 u32 shift, mask, gate, valid;
222 case SCG_SPLL_PFD0_CLK:
223 gate = SCG_PLL_PFD0_GATE_MASK;
224 valid = SCG_PLL_PFD0_VALID_MASK;
225 mask = SCG_PLL_PFD0_FRAC_MASK;
226 shift = SCG_PLL_PFD0_FRAC_SHIFT;
228 case SCG_SPLL_PFD1_CLK:
229 gate = SCG_PLL_PFD1_GATE_MASK;
230 valid = SCG_PLL_PFD1_VALID_MASK;
231 mask = SCG_PLL_PFD1_FRAC_MASK;
232 shift = SCG_PLL_PFD1_FRAC_SHIFT;
234 case SCG_SPLL_PFD2_CLK:
235 gate = SCG_PLL_PFD2_GATE_MASK;
236 valid = SCG_PLL_PFD2_VALID_MASK;
237 mask = SCG_PLL_PFD2_FRAC_MASK;
238 shift = SCG_PLL_PFD2_FRAC_SHIFT;
240 case SCG_SPLL_PFD3_CLK:
241 gate = SCG_PLL_PFD3_GATE_MASK;
242 valid = SCG_PLL_PFD3_VALID_MASK;
243 mask = SCG_PLL_PFD3_FRAC_MASK;
244 shift = SCG_PLL_PFD3_FRAC_SHIFT;
250 reg = readl(&scg1_regs->spllpfd);
251 if (reg & gate || !(reg & valid))
254 clk_debug("scg_spll_pfd_get_rate reg 0x%x\n", reg);
256 val = (reg & mask) >> shift;
257 rate = decode_pll(PLL_A7_SPLL);
259 rate = rate / val * 18;
261 clk_debug("scg_spll_pfd_get_rate rate %u\n", rate);
266 static u32 scg_apll_get_rate(void)
270 reg = readl(&scg1_regs->apllcfg);
271 val = (reg & SCG_PLL_CFG_PLLSEL_MASK) >> SCG_PLL_CFG_PLLSEL_SHIFT;
274 /* APLL clock after two dividers */
275 rate = decode_pll(PLL_A7_APLL);
277 val = (reg & SCG_PLL_CFG_POSTDIV1_MASK) >>
278 SCG_PLL_CFG_POSTDIV1_SHIFT;
279 rate = rate / (val + 1);
281 val = (reg & SCG_PLL_CFG_POSTDIV2_MASK) >>
282 SCG_PLL_CFG_POSTDIV2_SHIFT;
283 rate = rate / (val + 1);
286 val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
287 SCG_PLL_CFG_PFDSEL_SHIFT;
288 rate = scg_apll_pfd_get_rate(SCG_APLL_PFD0_CLK + val);
294 static u32 scg_spll_get_rate(void)
298 reg = readl(&scg1_regs->spllcfg);
299 val = (reg & SCG_PLL_CFG_PLLSEL_MASK) >> SCG_PLL_CFG_PLLSEL_SHIFT;
301 clk_debug("scg_spll_get_rate reg 0x%x\n", reg);
304 /* APLL clock after two dividers */
305 rate = decode_pll(PLL_A7_SPLL);
307 val = (reg & SCG_PLL_CFG_POSTDIV1_MASK) >>
308 SCG_PLL_CFG_POSTDIV1_SHIFT;
309 rate = rate / (val + 1);
311 val = (reg & SCG_PLL_CFG_POSTDIV2_MASK) >>
312 SCG_PLL_CFG_POSTDIV2_SHIFT;
313 rate = rate / (val + 1);
315 clk_debug("scg_spll_get_rate SPLL %u\n", rate);
319 val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
320 SCG_PLL_CFG_PFDSEL_SHIFT;
321 rate = scg_spll_pfd_get_rate(SCG_SPLL_PFD0_CLK + val);
323 clk_debug("scg_spll_get_rate PFD %u\n", rate);
329 static u32 scg_ddr_get_rate(void)
331 u32 reg, val, rate, div;
333 reg = readl(&scg1_regs->ddrccr);
334 val = (reg & SCG_DDRCCR_DDRCS_MASK) >> SCG_DDRCCR_DDRCS_SHIFT;
335 div = (reg & SCG_DDRCCR_DDRDIV_MASK) >> SCG_DDRCCR_DDRDIV_SHIFT;
341 reg = readl(&scg1_regs->apllcfg);
342 val = (reg & SCG_PLL_CFG_PFDSEL_MASK) >>
343 SCG_PLL_CFG_PFDSEL_SHIFT;
344 rate = scg_apll_pfd_get_rate(SCG_APLL_PFD0_CLK + val);
346 rate = decode_pll(PLL_USB);
349 rate = rate / (1 << (div - 1));
353 static u32 scg_nic_get_rate(enum scg_clk clk)
355 u32 reg, val, rate, nic0_rate;
358 reg = readl(&scg1_regs->niccsr);
359 val = (reg & SCG_NICCSR_NICCS_MASK) >> SCG_NICCSR_NICCS_SHIFT;
361 clk_debug("scg_nic_get_rate niccsr 0x%x\n", reg);
364 rate = scg_src_get_rate(SCG_FIRC_CLK);
366 rate = scg_ddr_get_rate();
368 clk_debug("scg_nic_get_rate parent rate %u\n", rate);
370 val = (reg & SCG_NICCSR_NIC0DIV_MASK) >> SCG_NICCSR_NIC0DIV_SHIFT;
372 rate = rate / (val + 1);
375 clk_debug("scg_nic_get_rate NIC0 rate %u\n", rate);
381 mask = SCG_NICCSR_GPUDIV_MASK;
382 shift = SCG_NICCSR_GPUDIV_SHIFT;
384 case SCG_NIC1_EXT_CLK:
385 case SCG_NIC1_BUS_CLK:
387 mask = SCG_NICCSR_NIC1DIV_MASK;
388 shift = SCG_NICCSR_NIC1DIV_SHIFT;
394 val = (reg & mask) >> shift;
395 rate = rate / (val + 1);
397 clk_debug("scg_nic_get_rate NIC1 rate %u\n", rate);
403 case SCG_NIC1_EXT_CLK:
404 mask = SCG_NICCSR_NIC1EXTDIV_MASK;
405 shift = SCG_NICCSR_NIC1EXTDIV_SHIFT;
407 case SCG_NIC1_BUS_CLK:
408 mask = SCG_NICCSR_NIC1BUSDIV_MASK;
409 shift = SCG_NICCSR_NIC1BUSDIV_SHIFT;
416 * On RevB, the nic_bus and nic_ext dividers are parallel
417 * not chained with nic div
419 if (soc_rev() >= CHIP_REV_2_0)
422 val = (reg & mask) >> shift;
423 rate = rate / (val + 1);
425 clk_debug("scg_nic_get_rate NIC1 bus rate %u\n", rate);
430 static enum scg_clk scg_scs_array[4] = {
431 SCG_SOSC_CLK, SCG_SIRC_CLK, SCG_FIRC_CLK, SCG_ROSC_CLK,
434 static u32 scg_sys_get_rate(enum scg_clk clk)
438 if (clk != SCG_CORE_CLK && clk != SCG_BUS_CLK)
441 reg = readl(&scg1_regs->csr);
442 val = (reg & SCG_CCR_SCS_MASK) >> SCG_CCR_SCS_SHIFT;
444 clk_debug("scg_sys_get_rate reg 0x%x\n", reg);
447 case SCG_SCS_SYS_OSC:
448 case SCG_SCS_SLOW_IRC:
449 case SCG_SCS_FAST_IRC:
450 case SCG_SCS_RTC_OSC:
451 rate = scg_src_get_rate(scg_scs_array[val - 1]);
454 rate = scg_apll_get_rate();
457 rate = scg_spll_get_rate();
463 clk_debug("scg_sys_get_rate parent rate %u\n", rate);
465 val = (reg & SCG_CCR_DIVCORE_MASK) >> SCG_CCR_DIVCORE_SHIFT;
467 rate = rate / (val + 1);
469 if (clk == SCG_BUS_CLK) {
470 val = (reg & SCG_CCR_DIVBUS_MASK) >> SCG_CCR_DIVBUS_SHIFT;
471 rate = rate / (val + 1);
477 u32 decode_pll(enum pll_clocks pll)
479 u32 reg, pre_div, infreq, mult;
483 * Alought there are four choices for the bypass src,
484 * we choose OSC_24M which is the default set in ROM.
488 reg = readl(&scg1_regs->spllcsr);
490 if (!(reg & SCG_SPLL_CSR_SPLLVLD_MASK))
493 reg = readl(&scg1_regs->spllcfg);
495 pre_div = (reg & SCG_PLL_CFG_PREDIV_MASK) >>
496 SCG_PLL_CFG_PREDIV_SHIFT;
499 mult = (reg & SCG1_SPLL_CFG_MULT_MASK) >>
500 SCG_PLL_CFG_MULT_SHIFT;
502 infreq = (reg & SCG_PLL_CFG_CLKSRC_MASK) >>
503 SCG_PLL_CFG_CLKSRC_SHIFT;
505 infreq = scg_src_get_rate(SCG_SOSC_CLK);
507 infreq = scg_src_get_rate(SCG_FIRC_CLK);
509 num = readl(&scg1_regs->spllnum);
510 denom = readl(&scg1_regs->splldenom);
512 infreq = infreq / pre_div;
515 return infreq * mult + infreq * num / denom;
517 return infreq * mult;
520 reg = readl(&scg1_regs->apllcsr);
522 if (!(reg & SCG_APLL_CSR_APLLVLD_MASK))
525 reg = readl(&scg1_regs->apllcfg);
527 pre_div = (reg & SCG_PLL_CFG_PREDIV_MASK) >>
528 SCG_PLL_CFG_PREDIV_SHIFT;
531 mult = (reg & SCG_APLL_CFG_MULT_MASK) >>
532 SCG_PLL_CFG_MULT_SHIFT;
534 infreq = (reg & SCG_PLL_CFG_CLKSRC_MASK) >>
535 SCG_PLL_CFG_CLKSRC_SHIFT;
537 infreq = scg_src_get_rate(SCG_SOSC_CLK);
539 infreq = scg_src_get_rate(SCG_FIRC_CLK);
541 num = readl(&scg1_regs->apllnum);
542 denom = readl(&scg1_regs->aplldenom);
544 infreq = infreq / pre_div;
547 return infreq * mult + infreq * num / denom;
549 return infreq * mult;
552 reg = readl(&scg1_regs->upllcsr);
554 if (!(reg & SCG_UPLL_CSR_UPLLVLD_MASK))
562 printf("Unsupported pll clocks %d\n", pll);
569 u32 scg_clk_get_rate(enum scg_clk clk)
572 case SCG_SIRC_DIV1_CLK:
573 case SCG_SIRC_DIV2_CLK:
574 case SCG_SIRC_DIV3_CLK:
575 return scg_sircdiv_get_rate(clk);
577 case SCG_FIRC_DIV1_CLK:
578 case SCG_FIRC_DIV2_CLK:
579 case SCG_FIRC_DIV3_CLK:
580 return scg_fircdiv_get_rate(clk);
582 case SCG_SOSC_DIV1_CLK:
583 case SCG_SOSC_DIV2_CLK:
584 case SCG_SOSC_DIV3_CLK:
585 return scg_soscdiv_get_rate(clk);
589 return scg_sys_get_rate(clk);
591 case SCG_SPLL_PFD0_CLK:
592 case SCG_SPLL_PFD1_CLK:
593 case SCG_SPLL_PFD2_CLK:
594 case SCG_SPLL_PFD3_CLK:
595 return scg_spll_pfd_get_rate(clk);
597 case SCG_APLL_PFD0_CLK:
598 case SCG_APLL_PFD1_CLK:
599 case SCG_APLL_PFD2_CLK:
600 case SCG_APLL_PFD3_CLK:
601 return scg_apll_pfd_get_rate(clk);
604 return scg_ddr_get_rate();
609 case SCG_NIC1_BUS_CLK:
610 case SCG_NIC1_EXT_CLK:
611 return scg_nic_get_rate(clk);
614 return decode_pll(PLL_USB);
617 return decode_pll(PLL_MIPI);
623 return scg_src_get_rate(clk);
629 int scg_enable_pll_pfd(enum scg_clk clk, u32 frac)
632 u32 shift, mask, gate, valid;
635 if (frac < 12 || frac > 35)
639 case SCG_SPLL_PFD0_CLK:
640 case SCG_APLL_PFD0_CLK:
641 gate = SCG_PLL_PFD0_GATE_MASK;
642 valid = SCG_PLL_PFD0_VALID_MASK;
643 mask = SCG_PLL_PFD0_FRAC_MASK;
644 shift = SCG_PLL_PFD0_FRAC_SHIFT;
646 if (clk == SCG_SPLL_PFD0_CLK)
647 addr = (u32)(&scg1_regs->spllpfd);
649 addr = (u32)(&scg1_regs->apllpfd);
651 case SCG_SPLL_PFD1_CLK:
652 case SCG_APLL_PFD1_CLK:
653 gate = SCG_PLL_PFD1_GATE_MASK;
654 valid = SCG_PLL_PFD1_VALID_MASK;
655 mask = SCG_PLL_PFD1_FRAC_MASK;
656 shift = SCG_PLL_PFD1_FRAC_SHIFT;
658 if (clk == SCG_SPLL_PFD1_CLK)
659 addr = (u32)(&scg1_regs->spllpfd);
661 addr = (u32)(&scg1_regs->apllpfd);
663 case SCG_SPLL_PFD2_CLK:
664 case SCG_APLL_PFD2_CLK:
665 gate = SCG_PLL_PFD2_GATE_MASK;
666 valid = SCG_PLL_PFD2_VALID_MASK;
667 mask = SCG_PLL_PFD2_FRAC_MASK;
668 shift = SCG_PLL_PFD2_FRAC_SHIFT;
670 if (clk == SCG_SPLL_PFD2_CLK)
671 addr = (u32)(&scg1_regs->spllpfd);
673 addr = (u32)(&scg1_regs->apllpfd);
675 case SCG_SPLL_PFD3_CLK:
676 case SCG_APLL_PFD3_CLK:
677 gate = SCG_PLL_PFD3_GATE_MASK;
678 valid = SCG_PLL_PFD3_VALID_MASK;
679 mask = SCG_PLL_PFD3_FRAC_MASK;
680 shift = SCG_PLL_PFD3_FRAC_SHIFT;
682 if (clk == SCG_SPLL_PFD3_CLK)
683 addr = (u32)(&scg1_regs->spllpfd);
685 addr = (u32)(&scg1_regs->apllpfd);
696 /* Write Frac divider */
698 reg |= (frac << shift) & mask;
703 * (Need un-gate before checking valid, not align with RM)
708 /* Wait for PFD clock being valid */
711 } while (!(reg & valid));
716 #define SIM_MISC_CTRL0_USB_PLL_EN_MASK (0x1 << 2)
717 int scg_enable_usb_pll(bool usb_control)
720 s32 timeout = 1000000;
723 struct usbphy_regs *usbphy =
724 (struct usbphy_regs *)USBPHY_RBASE;
726 sosc_rate = scg_src_get_rate(SCG_SOSC_CLK);
730 reg = readl(SIM0_RBASE + 0x3C);
732 reg &= ~SIM_MISC_CTRL0_USB_PLL_EN_MASK;
734 reg |= SIM_MISC_CTRL0_USB_PLL_EN_MASK;
735 writel(reg, SIM0_RBASE + 0x3C);
737 if (!(readl(&usbphy->usb1_pll_480_ctrl) & PLL_USB_LOCK_MASK)) {
738 writel(0x1c00000, &usbphy->usb1_pll_480_ctrl_clr);
742 writel(0xc00000, &usbphy->usb1_pll_480_ctrl_set);
746 writel(0x800000, &usbphy->usb1_pll_480_ctrl_set);
750 writel(0x1400000, &usbphy->usb1_pll_480_ctrl_set);
754 writel(0xc00000, &usbphy->usb1_pll_480_ctrl_set);
758 /* Enable the regulator first */
759 writel(PLL_USB_REG_ENABLE_MASK,
760 &usbphy->usb1_pll_480_ctrl_set);
762 /* Wait at least 15us */
765 /* Enable the power */
766 writel(PLL_USB_PWR_MASK, &usbphy->usb1_pll_480_ctrl_set);
770 if (readl(&usbphy->usb1_pll_480_ctrl) &
776 /* If timeout, we power down the pll */
777 writel(PLL_USB_PWR_MASK,
778 &usbphy->usb1_pll_480_ctrl_clr);
783 /* Clear the bypass */
784 writel(PLL_USB_BYPASS_MASK, &usbphy->usb1_pll_480_ctrl_clr);
786 /* Enable the PLL clock out to USB */
787 writel((PLL_USB_EN_USB_CLKS_MASK | PLL_USB_ENABLE_MASK),
788 &usbphy->usb1_pll_480_ctrl_set);
792 if (readl(&scg1_regs->upllcsr) &
793 SCG_UPLL_CSR_UPLLVLD_MASK)
798 reg = readl(SIM0_RBASE + 0x3C);
799 reg &= ~SIM_MISC_CTRL0_USB_PLL_EN_MASK;
800 writel(reg, SIM0_RBASE + 0x3C);
809 /* A7 domain system clock source is SPLL */
810 #define SCG1_RCCR_SCS_NUM ((SCG_SCS_SYS_PLL) << SCG_CCR_SCS_SHIFT)
812 /* A7 Core clck = SPLL PFD0 / 1 = 500MHz / 1 = 500MHz */
813 #define SCG1_RCCR_DIVCORE_NUM ((0x0) << SCG_CCR_DIVCORE_SHIFT)
814 #define SCG1_RCCR_CFG_MASK (SCG_CCR_SCS_MASK | SCG_CCR_DIVBUS_MASK)
816 /* A7 Plat clck = A7 Core Clock / 2 = 250MHz / 1 = 250MHz */
817 #define SCG1_RCCR_DIVBUS_NUM ((0x1) << SCG_CCR_DIVBUS_SHIFT)
818 #define SCG1_RCCR_CFG_NUM (SCG1_RCCR_SCS_NUM | SCG1_RCCR_DIVBUS_NUM)
820 void scg_a7_rccr_init(void)
822 u32 rccr_reg_val = 0;
824 rccr_reg_val = readl(&scg1_regs->rccr);
826 rccr_reg_val &= (~SCG1_RCCR_CFG_MASK);
827 rccr_reg_val |= (SCG1_RCCR_CFG_NUM);
829 writel(rccr_reg_val, &scg1_regs->rccr);
833 #define SCG1_SPLL_CFG_POSTDIV2_NUM ((0x0) << SCG_PLL_CFG_POSTDIV2_SHIFT)
835 #define SCG1_SPLL_CFG_POSTDIV1_NUM ((0x0) << SCG_PLL_CFG_POSTDIV1_SHIFT)
838 #define SCG1_SPLL_CFG_MULT_NUM ((22) << SCG_PLL_CFG_MULT_SHIFT)
840 /* PFD0 output clock selected */
841 #define SCG1_SPLL_CFG_PFDSEL_NUM ((0) << SCG_PLL_CFG_PFDSEL_SHIFT)
843 #define SCG1_SPLL_CFG_PREDIV_NUM ((0x0) << SCG_PLL_CFG_PREDIV_SHIFT)
844 /* SPLL output clocks (including PFD outputs) selected */
845 #define SCG1_SPLL_CFG_BYPASS_NUM ((0x0) << SCG_PLL_CFG_BYPASS_SHIFT)
846 /* SPLL PFD output clock selected */
847 #define SCG1_SPLL_CFG_PLLSEL_NUM ((0x1) << SCG_PLL_CFG_PLLSEL_SHIFT)
848 /* Clock source is System OSC */
849 #define SCG1_SPLL_CFG_CLKSRC_NUM ((0x0) << SCG_PLL_CFG_CLKSRC_SHIFT)
850 #define SCG1_SPLL_CFG_NUM_24M_OSC (SCG1_SPLL_CFG_POSTDIV2_NUM | \
851 SCG1_SPLL_CFG_POSTDIV1_NUM | \
852 (22 << SCG_PLL_CFG_MULT_SHIFT) | \
853 SCG1_SPLL_CFG_PFDSEL_NUM | \
854 SCG1_SPLL_CFG_PREDIV_NUM | \
855 SCG1_SPLL_CFG_BYPASS_NUM | \
856 SCG1_SPLL_CFG_PLLSEL_NUM | \
857 SCG1_SPLL_CFG_CLKSRC_NUM)
858 /*413Mhz = A7 SPLL(528MHz) * 18/23 */
859 #define SCG1_SPLL_PFD0_FRAC_NUM ((23) << SCG_PLL_PFD0_FRAC_SHIFT)
861 void scg_a7_spll_init(void)
865 /* Disable A7 System PLL */
866 val = readl(&scg1_regs->spllcsr);
867 val &= ~SCG_SPLL_CSR_SPLLEN_MASK;
868 writel(val, &scg1_regs->spllcsr);
872 * "When changing PFD values, it is recommneded PFDx clock
873 * gets gated first by writing a value of 1 to PFDx_CLKGATE register,
874 * then program the new PFD value, then poll the PFDx_VALID
875 * flag to set before writing a value of 0 to PFDx_CLKGATE
876 * to ungate the PFDx clock and allow PFDx clock to run"
879 /* Gate off A7 SPLL PFD0 ~ PDF4 */
880 val = readl(&scg1_regs->spllpfd);
881 val |= (SCG_PLL_PFD3_GATE_MASK |
882 SCG_PLL_PFD2_GATE_MASK |
883 SCG_PLL_PFD1_GATE_MASK |
884 SCG_PLL_PFD0_GATE_MASK);
885 writel(val, &scg1_regs->spllpfd);
887 /* ================ A7 SPLL Configuration Start ============== */
889 /* Configure A7 System PLL */
890 writel(SCG1_SPLL_CFG_NUM_24M_OSC, &scg1_regs->spllcfg);
892 /* Enable A7 System PLL */
893 val = readl(&scg1_regs->spllcsr);
894 val |= SCG_SPLL_CSR_SPLLEN_MASK;
895 writel(val, &scg1_regs->spllcsr);
897 /* Wait for A7 SPLL clock ready */
898 while (!(readl(&scg1_regs->spllcsr) & SCG_SPLL_CSR_SPLLVLD_MASK))
901 /* Configure A7 SPLL PFD0 */
902 val = readl(&scg1_regs->spllpfd);
903 val &= ~SCG_PLL_PFD0_FRAC_MASK;
904 val |= SCG1_SPLL_PFD0_FRAC_NUM;
905 writel(val, &scg1_regs->spllpfd);
907 /* Un-gate A7 SPLL PFD0 */
908 val = readl(&scg1_regs->spllpfd);
909 val &= ~SCG_PLL_PFD0_GATE_MASK;
910 writel(val, &scg1_regs->spllpfd);
912 /* Wait for A7 SPLL PFD0 clock being valid */
913 while (!(readl(&scg1_regs->spllpfd) & SCG_PLL_PFD0_VALID_MASK))
916 /* ================ A7 SPLL Configuration End ============== */
919 /* DDR clock source is APLL PFD0 (396MHz) */
920 #define SCG1_DDRCCR_DDRCS_NUM ((0x0) << SCG_DDRCCR_DDRCS_SHIFT)
921 /* DDR clock = APLL PFD0 / 1 = 396MHz / 1 = 396MHz */
922 #define SCG1_DDRCCR_DDRDIV_NUM ((0x1) << SCG_DDRCCR_DDRDIV_SHIFT)
923 /* DDR clock = APLL PFD0 / 2 = 396MHz / 2 = 198MHz */
924 #define SCG1_DDRCCR_DDRDIV_LF_NUM ((0x2) << SCG_DDRCCR_DDRDIV_SHIFT)
925 #define SCG1_DDRCCR_CFG_NUM (SCG1_DDRCCR_DDRCS_NUM | \
926 SCG1_DDRCCR_DDRDIV_NUM)
927 #define SCG1_DDRCCR_CFG_LF_NUM (SCG1_DDRCCR_DDRCS_NUM | \
928 SCG1_DDRCCR_DDRDIV_LF_NUM)
929 void scg_a7_ddrclk_init(void)
931 writel(SCG1_DDRCCR_CFG_NUM, &scg1_regs->ddrccr);
934 /* SCG1(A7) APLLCFG configurations */
935 /* divide by 1 <<28 */
936 #define SCG1_APLL_CFG_POSTDIV2_NUM ((0x0) << SCG_PLL_CFG_POSTDIV2_SHIFT)
937 /* divide by 1 <<24 */
938 #define SCG1_APLL_CFG_POSTDIV1_NUM ((0x0) << SCG_PLL_CFG_POSTDIV1_SHIFT)
939 /* MULT is 22 <<16 */
940 #define SCG1_APLL_CFG_MULT_NUM ((22) << SCG_PLL_CFG_MULT_SHIFT)
941 /* PFD0 output clock selected <<14 */
942 #define SCG1_APLL_CFG_PFDSEL_NUM ((0) << SCG_PLL_CFG_PFDSEL_SHIFT)
944 #define SCG1_APLL_CFG_PREDIV_NUM ((0x0) << SCG_PLL_CFG_PREDIV_SHIFT)
945 /* APLL output clocks (including PFD outputs) selected <<2 */
946 #define SCG1_APLL_CFG_BYPASS_NUM ((0x0) << SCG_PLL_CFG_BYPASS_SHIFT)
947 /* APLL PFD output clock selected <<1 */
948 #define SCG1_APLL_CFG_PLLSEL_NUM ((0x0) << SCG_PLL_CFG_PLLSEL_SHIFT)
949 /* Clock source is System OSC <<0 */
950 #define SCG1_APLL_CFG_CLKSRC_NUM ((0x0) << SCG_PLL_CFG_CLKSRC_SHIFT)
952 /* SCG1(A7) FIRC DIV configurations */
953 /* Disable FIRC DIV3 */
954 #define SCG1_FIRCDIV_DIV3_NUM ((0x0) << SCG_FIRCDIV_DIV3_SHIFT)
955 /* FIRC DIV2 = 48MHz / 1 = 48MHz */
956 #define SCG1_FIRCDIV_DIV2_NUM ((0x1) << SCG_FIRCDIV_DIV2_SHIFT)
957 /* Disable FIRC DIV1 */
958 #define SCG1_FIRCDIV_DIV1_NUM ((0x0) << SCG_FIRCDIV_DIV1_SHIFT)
960 void scg_a7_firc_init(void)
962 /* Wait for FIRC clock ready */
963 while (!(readl(&scg1_regs->firccsr) & SCG_FIRC_CSR_FIRCVLD_MASK))
966 /* Configure A7 FIRC DIV1 ~ DIV3 */
967 writel((SCG1_FIRCDIV_DIV3_NUM |
968 SCG1_FIRCDIV_DIV2_NUM |
969 SCG1_FIRCDIV_DIV1_NUM), &scg1_regs->fircdiv);
972 /* SCG1(A7) NICCCR configurations */
973 /* NIC clock source is DDR clock (396/198MHz) */
974 #define SCG1_NICCCR_NICCS_NUM ((0x1) << SCG_NICCCR_NICCS_SHIFT)
976 /* NIC0 clock = DDR Clock / 2 = 396MHz / 2 = 198MHz */
977 #define SCG1_NICCCR_NIC0_DIV_NUM ((0x1) << SCG_NICCCR_NIC0_DIV_SHIFT)
978 /* NIC0 clock = DDR Clock / 1 = 198MHz / 1 = 198MHz */
979 #define SCG1_NICCCR_NIC0_DIV_LF_NUM ((0x0) << SCG_NICCCR_NIC0_DIV_SHIFT)
980 /* NIC1 clock = NIC0 Clock / 1 = 198MHz / 2 = 198MHz */
981 #define SCG1_NICCCR_NIC1_DIV_NUM ((0x0) << SCG_NICCCR_NIC1_DIV_SHIFT)
982 /* NIC1 bus clock = NIC1 Clock / 3 = 198MHz / 3 = 66MHz */
983 #define SCG1_NICCCR_NIC1_DIVBUS_NUM ((0x2) << SCG_NICCCR_NIC1_DIVBUS_SHIFT)
984 #define SCG1_NICCCR_CFG_NUM (SCG1_NICCCR_NICCS_NUM | \
985 SCG1_NICCCR_NIC0_DIV_NUM | \
986 SCG1_NICCCR_NIC1_DIV_NUM | \
987 SCG1_NICCCR_NIC1_DIVBUS_NUM)
989 void scg_a7_nicclk_init(void)
991 writel(SCG1_NICCCR_CFG_NUM, &scg1_regs->nicccr);
994 /* SCG1(A7) FIRC DIV configurations */
995 /* Enable FIRC DIV3 */
996 #define SCG1_SOSCDIV_DIV3_NUM ((0x1) << SCG_SOSCDIV_DIV3_SHIFT)
997 /* FIRC DIV2 = 48MHz / 1 = 48MHz */
998 #define SCG1_SOSCDIV_DIV2_NUM ((0x1) << SCG_SOSCDIV_DIV2_SHIFT)
999 /* Enable FIRC DIV1 */
1000 #define SCG1_SOSCDIV_DIV1_NUM ((0x1) << SCG_SOSCDIV_DIV1_SHIFT)
1002 void scg_a7_soscdiv_init(void)
1004 /* Wait for FIRC clock ready */
1005 while (!(readl(&scg1_regs->sosccsr) & SCG_SOSC_CSR_SOSCVLD_MASK))
1008 /* Configure A7 FIRC DIV1 ~ DIV3 */
1009 writel((SCG1_SOSCDIV_DIV3_NUM | SCG1_SOSCDIV_DIV2_NUM |
1010 SCG1_SOSCDIV_DIV1_NUM), &scg1_regs->soscdiv);
1013 void scg_a7_sys_clk_sel(enum scg_sys_src clk)
1015 u32 rccr_reg_val = 0;
1017 clk_debug("%s: system clock selected as %s\n", "[SCG]",
1018 clk == SCG_SCS_SYS_OSC ? "SYS_OSC" :
1019 clk == SCG_SCS_SLOW_IRC ? "SLOW_IRC" :
1020 clk == SCG_SCS_FAST_IRC ? "FAST_IRC" :
1021 clk == SCG_SCS_RTC_OSC ? "RTC_OSC" :
1022 clk == SCG_SCS_AUX_PLL ? "AUX_PLL" :
1023 clk == SCG_SCS_SYS_PLL ? "SYS_PLL" :
1024 clk == SCG_SCS_USBPHY_PLL ? "USBPHY_PLL" :
1028 rccr_reg_val = readl(&scg1_regs->rccr);
1029 rccr_reg_val &= ~SCG_CCR_SCS_MASK;
1030 rccr_reg_val |= (clk << SCG_CCR_SCS_SHIFT);
1031 writel(rccr_reg_val, &scg1_regs->rccr);
1034 void scg_a7_info(void)
1036 debug("SCG Version: 0x%x\n", readl(&scg1_regs->verid));
1037 debug("SCG Parameter: 0x%x\n", readl(&scg1_regs->param));
1038 debug("SCG RCCR Value: 0x%x\n", readl(&scg1_regs->rccr));
1039 debug("SCG Clock Status: 0x%x\n", readl(&scg1_regs->csr));
1042 void scg_a7_init_core_clk(void)
1047 * The normal target frequency for ULP B0 is 500Mhz,
1048 * but ROM set it to 413Mhz, need to change SPLL PFD0 FRAC
1050 if (soc_rev() >= CHIP_REV_2_0) {
1051 /* Switch RCCR SCG to SOSC, firstly check the SOSC is valid */
1052 if ((readl(&scg1_regs->sosccsr) & SCG_SOSC_CSR_SOSCVLD_MASK)) {
1053 val = readl(&scg1_regs->rccr);
1054 val &= (~SCG_CCR_SCS_MASK);
1055 val |= ((SCG_SCS_SYS_OSC) << SCG_CCR_SCS_SHIFT);
1056 writel(val, &scg1_regs->rccr);
1058 /* Switch the PLLS to SPLL clk */
1059 val = readl(&scg1_regs->spllcfg);
1060 val &= ~SCG_PLL_CFG_PLLSEL_MASK;
1061 writel(val, &scg1_regs->spllcfg);
1064 * Re-configure PFD0 to 19,
1065 * A7 SPLL(528MHz) * 18 / 19 = 500MHz
1067 scg_enable_pll_pfd(SCG_SPLL_PFD0_CLK, 19);
1069 /* Switch the PLLS to SPLL PFD0 */
1070 val = readl(&scg1_regs->spllcfg);
1071 val |= SCG_PLL_CFG_PLLSEL_MASK;
1072 writel(val, &scg1_regs->spllcfg);
1074 /* Set RCCR SCG to SPLL clk out */
1075 val = readl(&scg1_regs->rccr);
1076 val &= (~SCG_CCR_SCS_MASK);
1077 val |= ((SCG_SCS_SYS_PLL) << SCG_CCR_SCS_SHIFT);
1078 writel(val, &scg1_regs->rccr);