2 * Copyright (C) 2010 Samsung Electronics
3 * Minkyu Kang <mk7.kang@samsung.com>
5 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/arch/clock.h>
11 #include <asm/arch/clk.h>
12 #include <asm/arch/periph.h>
14 #define PLL_DIV_1024 1024
15 #define PLL_DIV_65535 65535
16 #define PLL_DIV_65536 65536
19 * This structure is to store the src bit, div bit and prediv bit
20 * positions of the peripheral clocks of the src and div registers
29 /* periph_id src_bit div_bit prediv_bit */
30 static struct clk_bit_info exynos5_bit_info[] = {
31 {PERIPH_ID_UART0, 0, 0, -1},
32 {PERIPH_ID_UART1, 4, 4, -1},
33 {PERIPH_ID_UART2, 8, 8, -1},
34 {PERIPH_ID_UART3, 12, 12, -1},
35 {PERIPH_ID_I2C0, -1, 24, 0},
36 {PERIPH_ID_I2C1, -1, 24, 0},
37 {PERIPH_ID_I2C2, -1, 24, 0},
38 {PERIPH_ID_I2C3, -1, 24, 0},
39 {PERIPH_ID_I2C4, -1, 24, 0},
40 {PERIPH_ID_I2C5, -1, 24, 0},
41 {PERIPH_ID_I2C6, -1, 24, 0},
42 {PERIPH_ID_I2C7, -1, 24, 0},
43 {PERIPH_ID_SPI0, 16, 0, 8},
44 {PERIPH_ID_SPI1, 20, 16, 24},
45 {PERIPH_ID_SPI2, 24, 0, 8},
46 {PERIPH_ID_SDMMC0, 0, 0, 8},
47 {PERIPH_ID_SDMMC1, 4, 16, 24},
48 {PERIPH_ID_SDMMC2, 8, 0, 8},
49 {PERIPH_ID_SDMMC3, 12, 16, 24},
50 {PERIPH_ID_I2S0, 0, 0, 4},
51 {PERIPH_ID_I2S1, 4, 12, 16},
52 {PERIPH_ID_SPI3, 0, 0, 4},
53 {PERIPH_ID_SPI4, 4, 12, 16},
54 {PERIPH_ID_SDMMC4, 16, 0, 8},
55 {PERIPH_ID_PWM0, 24, 0, -1},
56 {PERIPH_ID_PWM1, 24, 0, -1},
57 {PERIPH_ID_PWM2, 24, 0, -1},
58 {PERIPH_ID_PWM3, 24, 0, -1},
59 {PERIPH_ID_PWM4, 24, 0, -1},
61 {PERIPH_ID_NONE, -1, -1, -1},
64 static struct clk_bit_info exynos542x_bit_info[] = {
65 {PERIPH_ID_UART0, 4, 8, -1},
66 {PERIPH_ID_UART1, 8, 12, -1},
67 {PERIPH_ID_UART2, 12, 16, -1},
68 {PERIPH_ID_UART3, 16, 20, -1},
69 {PERIPH_ID_I2C0, -1, 8, -1},
70 {PERIPH_ID_I2C1, -1, 8, -1},
71 {PERIPH_ID_I2C2, -1, 8, -1},
72 {PERIPH_ID_I2C3, -1, 8, -1},
73 {PERIPH_ID_I2C4, -1, 8, -1},
74 {PERIPH_ID_I2C5, -1, 8, -1},
75 {PERIPH_ID_I2C6, -1, 8, -1},
76 {PERIPH_ID_I2C7, -1, 8, -1},
77 {PERIPH_ID_SPI0, 20, 20, 8},
78 {PERIPH_ID_SPI1, 24, 24, 16},
79 {PERIPH_ID_SPI2, 28, 28, 24},
80 {PERIPH_ID_SDMMC0, 8, 0, -1},
81 {PERIPH_ID_SDMMC1, 12, 10, -1},
82 {PERIPH_ID_SDMMC2, 16, 20, -1},
83 {PERIPH_ID_I2C8, -1, 8, -1},
84 {PERIPH_ID_I2C9, -1, 8, -1},
85 {PERIPH_ID_I2S0, 0, 0, 4},
86 {PERIPH_ID_I2S1, 4, 12, 16},
87 {PERIPH_ID_SPI3, 12, 16, 0},
88 {PERIPH_ID_SPI4, 16, 20, 8},
89 {PERIPH_ID_PWM0, 24, 28, -1},
90 {PERIPH_ID_PWM1, 24, 28, -1},
91 {PERIPH_ID_PWM2, 24, 28, -1},
92 {PERIPH_ID_PWM3, 24, 28, -1},
93 {PERIPH_ID_PWM4, 24, 28, -1},
94 {PERIPH_ID_I2C10, -1, 8, -1},
96 {PERIPH_ID_NONE, -1, -1, -1},
99 /* Epll Clock division values to achive different frequency output */
100 static struct set_epll_con_val exynos5_epll_div[] = {
101 { 192000000, 0, 48, 3, 1, 0 },
102 { 180000000, 0, 45, 3, 1, 0 },
103 { 73728000, 1, 73, 3, 3, 47710 },
104 { 67737600, 1, 90, 4, 3, 20762 },
105 { 49152000, 0, 49, 3, 3, 9961 },
106 { 45158400, 0, 45, 3, 3, 10381 },
107 { 180633600, 0, 45, 3, 1, 10381 }
110 /* exynos: return pll clock frequency */
111 static int exynos_get_pll_clk(int pllreg, unsigned int r, unsigned int k)
113 unsigned long m, p, s = 0, mask, fout;
117 * APLL_CON: MIDV [25:16]
118 * MPLL_CON: MIDV [25:16]
119 * EPLL_CON: MIDV [24:16]
120 * VPLL_CON: MIDV [24:16]
121 * BPLL_CON: MIDV [25:16]: Exynos5
123 if (pllreg == APLL || pllreg == MPLL || pllreg == BPLL ||
129 m = (r >> 16) & mask;
136 freq = CONFIG_SYS_CLK_FREQ;
138 if (pllreg == EPLL || pllreg == RPLL) {
140 /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */
141 fout = (m + k / PLL_DIV_65536) * (freq / (p * (1 << s)));
142 } else if (pllreg == VPLL) {
147 * FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV)
150 * FOUT = (MDIV + K / 65535) * FIN / (PDIV * 2^SDIV)
153 * FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV)
155 if (proid_is_exynos4210())
157 else if (proid_is_exynos4412())
159 else if (proid_is_exynos5250() || proid_is_exynos5420()
160 || proid_is_exynos5800())
165 fout = (m + k / div) * (freq / (p * (1 << s)));
168 * Exynos4412 / Exynos5250
169 * FOUT = MDIV * FIN / (PDIV * 2^SDIV)
172 * FOUT = MDIV * FIN / (PDIV * 2^(SDIV-1))
174 if (proid_is_exynos4210())
175 fout = m * (freq / (p * (1 << (s - 1))));
177 fout = m * (freq / (p * (1 << s)));
182 /* exynos4: return pll clock frequency */
183 static unsigned long exynos4_get_pll_clk(int pllreg)
185 struct exynos4_clock *clk =
186 (struct exynos4_clock *)samsung_get_base_clock();
187 unsigned long r, k = 0;
191 r = readl(&clk->apll_con0);
194 r = readl(&clk->mpll_con0);
197 r = readl(&clk->epll_con0);
198 k = readl(&clk->epll_con1);
201 r = readl(&clk->vpll_con0);
202 k = readl(&clk->vpll_con1);
205 printf("Unsupported PLL (%d)\n", pllreg);
209 return exynos_get_pll_clk(pllreg, r, k);
212 /* exynos4x12: return pll clock frequency */
213 static unsigned long exynos4x12_get_pll_clk(int pllreg)
215 struct exynos4x12_clock *clk =
216 (struct exynos4x12_clock *)samsung_get_base_clock();
217 unsigned long r, k = 0;
221 r = readl(&clk->apll_con0);
224 r = readl(&clk->mpll_con0);
227 r = readl(&clk->epll_con0);
228 k = readl(&clk->epll_con1);
231 r = readl(&clk->vpll_con0);
232 k = readl(&clk->vpll_con1);
235 printf("Unsupported PLL (%d)\n", pllreg);
239 return exynos_get_pll_clk(pllreg, r, k);
242 /* exynos5: return pll clock frequency */
243 static unsigned long exynos5_get_pll_clk(int pllreg)
245 struct exynos5_clock *clk =
246 (struct exynos5_clock *)samsung_get_base_clock();
247 unsigned long r, k = 0, fout;
248 unsigned int pll_div2_sel, fout_sel;
252 r = readl(&clk->apll_con0);
255 r = readl(&clk->mpll_con0);
258 r = readl(&clk->epll_con0);
259 k = readl(&clk->epll_con1);
262 r = readl(&clk->vpll_con0);
263 k = readl(&clk->vpll_con1);
266 r = readl(&clk->bpll_con0);
269 printf("Unsupported PLL (%d)\n", pllreg);
273 fout = exynos_get_pll_clk(pllreg, r, k);
275 /* According to the user manual, in EVT1 MPLL and BPLL always gives
276 * 1.6GHz clock, so divide by 2 to get 800MHz MPLL clock.*/
277 if (pllreg == MPLL || pllreg == BPLL) {
278 pll_div2_sel = readl(&clk->pll_div2_sel);
282 fout_sel = (pll_div2_sel >> MPLL_FOUT_SEL_SHIFT)
283 & MPLL_FOUT_SEL_MASK;
286 fout_sel = (pll_div2_sel >> BPLL_FOUT_SEL_SHIFT)
287 & BPLL_FOUT_SEL_MASK;
301 /* exynos542x: return pll clock frequency */
302 static unsigned long exynos542x_get_pll_clk(int pllreg)
304 struct exynos5420_clock *clk =
305 (struct exynos5420_clock *)samsung_get_base_clock();
306 unsigned long r, k = 0;
310 r = readl(&clk->apll_con0);
313 r = readl(&clk->mpll_con0);
316 r = readl(&clk->epll_con0);
317 k = readl(&clk->epll_con1);
320 r = readl(&clk->vpll_con0);
321 k = readl(&clk->vpll_con1);
324 r = readl(&clk->bpll_con0);
327 r = readl(&clk->rpll_con0);
328 k = readl(&clk->rpll_con1);
331 r = readl(&clk->spll_con0);
334 printf("Unsupported PLL (%d)\n", pllreg);
338 return exynos_get_pll_clk(pllreg, r, k);
341 static struct clk_bit_info *get_clk_bit_info(int peripheral)
344 struct clk_bit_info *info;
346 if (proid_is_exynos5420() || proid_is_exynos5800())
347 info = exynos542x_bit_info;
349 info = exynos5_bit_info;
351 for (i = 0; info[i].id != PERIPH_ID_NONE; i++) {
352 if (info[i].id == peripheral)
356 if (info[i].id == PERIPH_ID_NONE)
357 debug("ERROR: Peripheral ID %d not found\n", peripheral);
362 static unsigned long exynos5_get_periph_rate(int peripheral)
364 struct clk_bit_info *bit_info = get_clk_bit_info(peripheral);
365 unsigned long sclk, sub_clk = 0;
366 unsigned int src, div, sub_div = 0;
367 struct exynos5_clock *clk =
368 (struct exynos5_clock *)samsung_get_base_clock();
370 switch (peripheral) {
371 case PERIPH_ID_UART0:
372 case PERIPH_ID_UART1:
373 case PERIPH_ID_UART2:
374 case PERIPH_ID_UART3:
375 src = readl(&clk->src_peric0);
376 div = readl(&clk->div_peric0);
383 src = readl(&clk->src_peric0);
384 div = readl(&clk->div_peric3);
387 src = readl(&clk->src_mau);
388 div = readl(&clk->div_mau);
391 src = readl(&clk->src_peric1);
392 div = readl(&clk->div_peric1);
395 src = readl(&clk->src_peric1);
396 div = readl(&clk->div_peric2);
400 src = readl(&clk->sclk_src_isp);
401 div = readl(&clk->sclk_div_isp);
403 case PERIPH_ID_SDMMC0:
404 case PERIPH_ID_SDMMC1:
405 src = readl(&clk->src_fsys);
406 div = readl(&clk->div_fsys1);
408 case PERIPH_ID_SDMMC2:
409 case PERIPH_ID_SDMMC3:
410 src = readl(&clk->src_fsys);
411 div = readl(&clk->div_fsys2);
421 sclk = exynos5_get_pll_clk(MPLL);
422 sub_div = ((readl(&clk->div_top1) >> bit_info->div_bit)
424 div = ((readl(&clk->div_top0) >> bit_info->prediv_bit)
426 return (sclk / sub_div) / div;
428 debug("%s: invalid peripheral %d", __func__, peripheral);
432 if (bit_info->src_bit >= 0)
433 src = (src >> bit_info->src_bit) & 0xf;
436 case EXYNOS_SRC_MPLL:
437 sclk = exynos5_get_pll_clk(MPLL);
439 case EXYNOS_SRC_EPLL:
440 sclk = exynos5_get_pll_clk(EPLL);
442 case EXYNOS_SRC_VPLL:
443 sclk = exynos5_get_pll_clk(VPLL);
449 /* Ratio clock division for this peripheral */
450 if (bit_info->div_bit >= 0) {
451 sub_div = (div >> bit_info->div_bit) & 0xf;
452 sub_clk = sclk / (sub_div + 1);
455 if (bit_info->prediv_bit >= 0) {
456 div = (div >> bit_info->prediv_bit) & 0xff;
457 return sub_clk / (div + 1);
463 static unsigned long exynos542x_get_periph_rate(int peripheral)
465 struct clk_bit_info *bit_info = get_clk_bit_info(peripheral);
466 unsigned long sclk, sub_clk = 0;
467 unsigned int src, div, sub_div = 0;
468 struct exynos5420_clock *clk =
469 (struct exynos5420_clock *)samsung_get_base_clock();
471 switch (peripheral) {
472 case PERIPH_ID_UART0:
473 case PERIPH_ID_UART1:
474 case PERIPH_ID_UART2:
475 case PERIPH_ID_UART3:
481 src = readl(&clk->src_peric0);
482 div = readl(&clk->div_peric0);
487 src = readl(&clk->src_peric1);
488 div = readl(&clk->div_peric1);
489 sub_div = readl(&clk->div_peric4);
493 src = readl(&clk->src_isp);
494 div = readl(&clk->div_isp1);
495 sub_div = readl(&clk->div_isp1);
497 case PERIPH_ID_SDMMC0:
498 case PERIPH_ID_SDMMC1:
499 case PERIPH_ID_SDMMC2:
500 case PERIPH_ID_SDMMC3:
501 src = readl(&clk->src_fsys);
502 div = readl(&clk->div_fsys1);
514 case PERIPH_ID_I2C10:
515 sclk = exynos542x_get_pll_clk(MPLL);
516 sub_div = ((readl(&clk->div_top1) >> bit_info->div_bit)
518 return sclk / sub_div;
520 debug("%s: invalid peripheral %d", __func__, peripheral);
524 if (bit_info->src_bit >= 0)
525 src = (src >> bit_info->src_bit) & 0xf;
528 case EXYNOS542X_SRC_MPLL:
529 sclk = exynos542x_get_pll_clk(MPLL);
531 case EXYNOS542X_SRC_SPLL:
532 sclk = exynos542x_get_pll_clk(SPLL);
534 case EXYNOS542X_SRC_EPLL:
535 sclk = exynos542x_get_pll_clk(EPLL);
537 case EXYNOS542X_SRC_RPLL:
538 sclk = exynos542x_get_pll_clk(RPLL);
544 /* Ratio clock division for this peripheral */
545 if (bit_info->div_bit >= 0) {
546 div = (div >> bit_info->div_bit) & 0xf;
547 sub_clk = sclk / (div + 1);
550 if (bit_info->prediv_bit >= 0) {
551 sub_div = (sub_div >> bit_info->prediv_bit) & 0xff;
552 return sub_clk / (sub_div + 1);
558 unsigned long clock_get_periph_rate(int peripheral)
560 if (cpu_is_exynos5()) {
561 if (proid_is_exynos5420() || proid_is_exynos5800())
562 return exynos542x_get_periph_rate(peripheral);
563 return exynos5_get_periph_rate(peripheral);
569 /* exynos4: return ARM clock frequency */
570 static unsigned long exynos4_get_arm_clk(void)
572 struct exynos4_clock *clk =
573 (struct exynos4_clock *)samsung_get_base_clock();
575 unsigned long armclk;
576 unsigned int core_ratio;
577 unsigned int core2_ratio;
579 div = readl(&clk->div_cpu0);
581 /* CORE_RATIO: [2:0], CORE2_RATIO: [30:28] */
582 core_ratio = (div >> 0) & 0x7;
583 core2_ratio = (div >> 28) & 0x7;
585 armclk = get_pll_clk(APLL) / (core_ratio + 1);
586 armclk /= (core2_ratio + 1);
591 /* exynos4x12: return ARM clock frequency */
592 static unsigned long exynos4x12_get_arm_clk(void)
594 struct exynos4x12_clock *clk =
595 (struct exynos4x12_clock *)samsung_get_base_clock();
597 unsigned long armclk;
598 unsigned int core_ratio;
599 unsigned int core2_ratio;
601 div = readl(&clk->div_cpu0);
603 /* CORE_RATIO: [2:0], CORE2_RATIO: [30:28] */
604 core_ratio = (div >> 0) & 0x7;
605 core2_ratio = (div >> 28) & 0x7;
607 armclk = get_pll_clk(APLL) / (core_ratio + 1);
608 armclk /= (core2_ratio + 1);
613 /* exynos5: return ARM clock frequency */
614 static unsigned long exynos5_get_arm_clk(void)
616 struct exynos5_clock *clk =
617 (struct exynos5_clock *)samsung_get_base_clock();
619 unsigned long armclk;
620 unsigned int arm_ratio;
621 unsigned int arm2_ratio;
623 div = readl(&clk->div_cpu0);
625 /* ARM_RATIO: [2:0], ARM2_RATIO: [30:28] */
626 arm_ratio = (div >> 0) & 0x7;
627 arm2_ratio = (div >> 28) & 0x7;
629 armclk = get_pll_clk(APLL) / (arm_ratio + 1);
630 armclk /= (arm2_ratio + 1);
635 /* exynos4: return pwm clock frequency */
636 static unsigned long exynos4_get_pwm_clk(void)
638 struct exynos4_clock *clk =
639 (struct exynos4_clock *)samsung_get_base_clock();
640 unsigned long pclk, sclk;
644 if (s5p_get_cpu_rev() == 0) {
649 sel = readl(&clk->src_peril0);
650 sel = (sel >> 24) & 0xf;
653 sclk = get_pll_clk(MPLL);
655 sclk = get_pll_clk(EPLL);
657 sclk = get_pll_clk(VPLL);
665 ratio = readl(&clk->div_peril3);
667 } else if (s5p_get_cpu_rev() == 1) {
668 sclk = get_pll_clk(MPLL);
673 pclk = sclk / (ratio + 1);
678 /* exynos4x12: return pwm clock frequency */
679 static unsigned long exynos4x12_get_pwm_clk(void)
681 unsigned long pclk, sclk;
684 sclk = get_pll_clk(MPLL);
687 pclk = sclk / (ratio + 1);
692 /* exynos5420: return pwm clock frequency */
693 static unsigned long exynos5420_get_pwm_clk(void)
695 struct exynos5420_clock *clk =
696 (struct exynos5420_clock *)samsung_get_base_clock();
697 unsigned long pclk, sclk;
704 ratio = readl(&clk->div_peric0);
705 ratio = (ratio >> 28) & 0xf;
706 sclk = get_pll_clk(MPLL);
708 pclk = sclk / (ratio + 1);
713 /* exynos4: return uart clock frequency */
714 static unsigned long exynos4_get_uart_clk(int dev_index)
716 struct exynos4_clock *clk =
717 (struct exynos4_clock *)samsung_get_base_clock();
718 unsigned long uclk, sclk;
731 sel = readl(&clk->src_peril0);
732 sel = (sel >> (dev_index << 2)) & 0xf;
735 sclk = get_pll_clk(MPLL);
737 sclk = get_pll_clk(EPLL);
739 sclk = get_pll_clk(VPLL);
748 * UART3_RATIO [12:15]
749 * UART4_RATIO [16:19]
750 * UART5_RATIO [23:20]
752 ratio = readl(&clk->div_peril0);
753 ratio = (ratio >> (dev_index << 2)) & 0xf;
755 uclk = sclk / (ratio + 1);
760 /* exynos4x12: return uart clock frequency */
761 static unsigned long exynos4x12_get_uart_clk(int dev_index)
763 struct exynos4x12_clock *clk =
764 (struct exynos4x12_clock *)samsung_get_base_clock();
765 unsigned long uclk, sclk;
777 sel = readl(&clk->src_peril0);
778 sel = (sel >> (dev_index << 2)) & 0xf;
781 sclk = get_pll_clk(MPLL);
783 sclk = get_pll_clk(EPLL);
785 sclk = get_pll_clk(VPLL);
794 * UART3_RATIO [12:15]
795 * UART4_RATIO [16:19]
797 ratio = readl(&clk->div_peril0);
798 ratio = (ratio >> (dev_index << 2)) & 0xf;
800 uclk = sclk / (ratio + 1);
805 /* exynos5: return uart clock frequency */
806 static unsigned long exynos5_get_uart_clk(int dev_index)
808 struct exynos5_clock *clk =
809 (struct exynos5_clock *)samsung_get_base_clock();
810 unsigned long uclk, sclk;
823 sel = readl(&clk->src_peric0);
824 sel = (sel >> (dev_index << 2)) & 0xf;
827 sclk = get_pll_clk(MPLL);
829 sclk = get_pll_clk(EPLL);
831 sclk = get_pll_clk(VPLL);
840 * UART3_RATIO [12:15]
841 * UART4_RATIO [16:19]
842 * UART5_RATIO [23:20]
844 ratio = readl(&clk->div_peric0);
845 ratio = (ratio >> (dev_index << 2)) & 0xf;
847 uclk = sclk / (ratio + 1);
852 /* exynos5420: return uart clock frequency */
853 static unsigned long exynos5420_get_uart_clk(int dev_index)
855 struct exynos5420_clock *clk =
856 (struct exynos5420_clock *)samsung_get_base_clock();
857 unsigned long uclk, sclk;
867 * generalised calculation as follows
868 * sel = (sel >> ((dev_index * 4) + 4)) & mask;
870 sel = readl(&clk->src_peric0);
871 sel = (sel >> ((dev_index * 4) + 4)) & 0x7;
874 sclk = get_pll_clk(MPLL);
876 sclk = get_pll_clk(EPLL);
878 sclk = get_pll_clk(RPLL);
885 * UART1_RATIO [15:12]
886 * UART2_RATIO [19:16]
887 * UART3_RATIO [23:20]
888 * generalised calculation as follows
889 * ratio = (ratio >> ((dev_index * 4) + 8)) & mask;
891 ratio = readl(&clk->div_peric0);
892 ratio = (ratio >> ((dev_index * 4) + 8)) & 0xf;
894 uclk = sclk / (ratio + 1);
899 static unsigned long exynos4_get_mmc_clk(int dev_index)
901 struct exynos4_clock *clk =
902 (struct exynos4_clock *)samsung_get_base_clock();
903 unsigned long uclk, sclk;
904 unsigned int sel, ratio, pre_ratio;
907 sel = readl(&clk->src_fsys);
908 sel = (sel >> (dev_index << 2)) & 0xf;
911 sclk = get_pll_clk(MPLL);
913 sclk = get_pll_clk(EPLL);
915 sclk = get_pll_clk(VPLL);
922 ratio = readl(&clk->div_fsys1);
923 pre_ratio = readl(&clk->div_fsys1);
927 ratio = readl(&clk->div_fsys2);
928 pre_ratio = readl(&clk->div_fsys2);
931 ratio = readl(&clk->div_fsys3);
932 pre_ratio = readl(&clk->div_fsys3);
938 if (dev_index == 1 || dev_index == 3)
941 ratio = (ratio >> shift) & 0xf;
942 pre_ratio = (pre_ratio >> (shift + 8)) & 0xff;
943 uclk = (sclk / (ratio + 1)) / (pre_ratio + 1);
948 static unsigned long exynos5_get_mmc_clk(int dev_index)
950 struct exynos5_clock *clk =
951 (struct exynos5_clock *)samsung_get_base_clock();
952 unsigned long uclk, sclk;
953 unsigned int sel, ratio, pre_ratio;
956 sel = readl(&clk->src_fsys);
957 sel = (sel >> (dev_index << 2)) & 0xf;
960 sclk = get_pll_clk(MPLL);
962 sclk = get_pll_clk(EPLL);
964 sclk = get_pll_clk(VPLL);
971 ratio = readl(&clk->div_fsys1);
972 pre_ratio = readl(&clk->div_fsys1);
976 ratio = readl(&clk->div_fsys2);
977 pre_ratio = readl(&clk->div_fsys2);
983 if (dev_index == 1 || dev_index == 3)
986 ratio = (ratio >> shift) & 0xf;
987 pre_ratio = (pre_ratio >> (shift + 8)) & 0xff;
988 uclk = (sclk / (ratio + 1)) / (pre_ratio + 1);
993 static unsigned long exynos5420_get_mmc_clk(int dev_index)
995 struct exynos5420_clock *clk =
996 (struct exynos5420_clock *)samsung_get_base_clock();
997 unsigned long uclk, sclk;
998 unsigned int sel, ratio;
1005 * generalised calculation as follows
1006 * sel = (sel >> ((dev_index * 4) + 8)) & mask
1008 sel = readl(&clk->src_fsys);
1009 sel = (sel >> ((dev_index * 4) + 8)) & 0x7;
1012 sclk = get_pll_clk(MPLL);
1013 else if (sel == 0x4)
1014 sclk = get_pll_clk(SPLL);
1015 else if (sel == 0x6)
1016 sclk = get_pll_clk(EPLL);
1023 * MMC1_RATIO [19:10]
1024 * MMC2_RATIO [29:20]
1025 * generalised calculation as follows
1026 * ratio = (ratio >> (dev_index * 10)) & mask
1028 ratio = readl(&clk->div_fsys1);
1029 ratio = (ratio >> (dev_index * 10)) & 0x3ff;
1031 uclk = (sclk / (ratio + 1));
1036 /* exynos4: set the mmc clock */
1037 static void exynos4_set_mmc_clk(int dev_index, unsigned int div)
1039 struct exynos4_clock *clk =
1040 (struct exynos4_clock *)samsung_get_base_clock();
1041 unsigned int addr, clear_bit, set_bit;
1045 * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
1047 * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
1051 if (dev_index < 2) {
1052 addr = (unsigned int)&clk->div_fsys1;
1053 clear_bit = MASK_PRE_RATIO(dev_index);
1054 set_bit = SET_PRE_RATIO(dev_index, div);
1055 } else if (dev_index == 4) {
1056 addr = (unsigned int)&clk->div_fsys3;
1058 /* MMC4 is controlled with the MMC4_RATIO value */
1059 clear_bit = MASK_RATIO(dev_index);
1060 set_bit = SET_RATIO(dev_index, div);
1062 addr = (unsigned int)&clk->div_fsys2;
1064 clear_bit = MASK_PRE_RATIO(dev_index);
1065 set_bit = SET_PRE_RATIO(dev_index, div);
1068 clrsetbits_le32(addr, clear_bit, set_bit);
1071 /* exynos5: set the mmc clock */
1072 static void exynos5_set_mmc_clk(int dev_index, unsigned int div)
1074 struct exynos5_clock *clk =
1075 (struct exynos5_clock *)samsung_get_base_clock();
1080 * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
1082 * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
1084 if (dev_index < 2) {
1085 addr = (unsigned int)&clk->div_fsys1;
1087 addr = (unsigned int)&clk->div_fsys2;
1091 clrsetbits_le32(addr, 0xff << ((dev_index << 4) + 8),
1092 (div & 0xff) << ((dev_index << 4) + 8));
1095 /* exynos5: set the mmc clock */
1096 static void exynos5420_set_mmc_clk(int dev_index, unsigned int div)
1098 struct exynos5420_clock *clk =
1099 (struct exynos5420_clock *)samsung_get_base_clock();
1106 * MMC1_RATIO [19:10]
1107 * MMC2_RATIO [29:20]
1109 addr = (unsigned int)&clk->div_fsys1;
1110 shift = dev_index * 10;
1112 clrsetbits_le32(addr, 0x3ff << shift, (div & 0x3ff) << shift);
1115 /* get_lcd_clk: return lcd clock frequency */
1116 static unsigned long exynos4_get_lcd_clk(void)
1118 struct exynos4_clock *clk =
1119 (struct exynos4_clock *)samsung_get_base_clock();
1120 unsigned long pclk, sclk;
1128 sel = readl(&clk->src_lcd0);
1137 sclk = get_pll_clk(MPLL);
1138 else if (sel == 0x7)
1139 sclk = get_pll_clk(EPLL);
1140 else if (sel == 0x8)
1141 sclk = get_pll_clk(VPLL);
1149 ratio = readl(&clk->div_lcd0);
1150 ratio = ratio & 0xf;
1152 pclk = sclk / (ratio + 1);
1157 /* get_lcd_clk: return lcd clock frequency */
1158 static unsigned long exynos5_get_lcd_clk(void)
1160 struct exynos5_clock *clk =
1161 (struct exynos5_clock *)samsung_get_base_clock();
1162 unsigned long pclk, sclk;
1170 sel = readl(&clk->src_disp1_0);
1179 sclk = get_pll_clk(MPLL);
1180 else if (sel == 0x7)
1181 sclk = get_pll_clk(EPLL);
1182 else if (sel == 0x8)
1183 sclk = get_pll_clk(VPLL);
1191 ratio = readl(&clk->div_disp1_0);
1192 ratio = ratio & 0xf;
1194 pclk = sclk / (ratio + 1);
1199 static unsigned long exynos5420_get_lcd_clk(void)
1201 struct exynos5420_clock *clk =
1202 (struct exynos5420_clock *)samsung_get_base_clock();
1203 unsigned long pclk, sclk;
1213 sel = readl(&clk->src_disp10);
1217 sclk = get_pll_clk(SPLL);
1219 sclk = get_pll_clk(RPLL);
1225 ratio = readl(&clk->div_disp10);
1226 ratio = ratio & 0xf;
1228 pclk = sclk / (ratio + 1);
1233 void exynos4_set_lcd_clk(void)
1235 struct exynos4_clock *clk =
1236 (struct exynos4_clock *)samsung_get_base_clock();
1248 setbits_le32(&clk->gate_block, 1 << 4);
1254 * MDNIE_PWM0_SEL [8:11]
1256 * set lcd0 src clock 0x6: SCLK_MPLL
1258 clrsetbits_le32(&clk->src_lcd0, 0xf, 0x6);
1268 * Gating all clocks for FIMD0
1270 setbits_le32(&clk->gate_ip_lcd0, 1 << 0);
1275 * MDNIE0_RATIO [7:4]
1276 * MDNIE_PWM0_RATIO [11:8]
1277 * MDNIE_PWM_PRE_RATIO [15:12]
1278 * MIPI0_RATIO [19:16]
1279 * MIPI0_PRE_RATIO [23:20]
1282 clrsetbits_le32(&clk->div_lcd0, 0xf, 0x1);
1285 void exynos5_set_lcd_clk(void)
1287 struct exynos5_clock *clk =
1288 (struct exynos5_clock *)samsung_get_base_clock();
1300 setbits_le32(&clk->gate_block, 1 << 4);
1306 * MDNIE_PWM0_SEL [8:11]
1308 * set lcd0 src clock 0x6: SCLK_MPLL
1310 clrsetbits_le32(&clk->src_disp1_0, 0xf, 0x6);
1320 * Gating all clocks for FIMD0
1322 setbits_le32(&clk->gate_ip_disp1, 1 << 0);
1327 * MDNIE0_RATIO [7:4]
1328 * MDNIE_PWM0_RATIO [11:8]
1329 * MDNIE_PWM_PRE_RATIO [15:12]
1330 * MIPI0_RATIO [19:16]
1331 * MIPI0_PRE_RATIO [23:20]
1334 clrsetbits_le32(&clk->div_disp1_0, 0xf, 0x0);
1337 void exynos5420_set_lcd_clk(void)
1339 struct exynos5420_clock *clk =
1340 (struct exynos5420_clock *)samsung_get_base_clock();
1349 cfg = readl(&clk->src_disp10);
1352 writel(cfg, &clk->src_disp10);
1358 cfg = readl(&clk->div_disp10);
1361 writel(cfg, &clk->div_disp10);
1364 void exynos4_set_mipi_clk(void)
1366 struct exynos4_clock *clk =
1367 (struct exynos4_clock *)samsung_get_base_clock();
1373 * MDNIE_PWM0_SEL [8:11]
1375 * set mipi0 src clock 0x6: SCLK_MPLL
1377 clrsetbits_le32(&clk->src_lcd0, 0xf << 12, 0x6 << 12);
1383 * MDNIE_PWM0_MASK [8]
1385 * set src mask mipi0 0x1: Unmask
1387 setbits_le32(&clk->src_mask_lcd0, 0x1 << 12);
1397 * Gating all clocks for MIPI0
1399 setbits_le32(&clk->gate_ip_lcd0, 1 << 3);
1404 * MDNIE0_RATIO [7:4]
1405 * MDNIE_PWM0_RATIO [11:8]
1406 * MDNIE_PWM_PRE_RATIO [15:12]
1407 * MIPI0_RATIO [19:16]
1408 * MIPI0_PRE_RATIO [23:20]
1411 clrsetbits_le32(&clk->div_lcd0, 0xf << 16, 0x1 << 16);
1417 * exynos5: obtaining the I2C clock
1419 static unsigned long exynos5_get_i2c_clk(void)
1421 struct exynos5_clock *clk =
1422 (struct exynos5_clock *)samsung_get_base_clock();
1423 unsigned long aclk_66, aclk_66_pre, sclk;
1426 sclk = get_pll_clk(MPLL);
1428 ratio = (readl(&clk->div_top1)) >> 24;
1430 aclk_66_pre = sclk / (ratio + 1);
1431 ratio = readl(&clk->div_top0);
1433 aclk_66 = aclk_66_pre / (ratio + 1);
1437 int exynos5_set_epll_clk(unsigned long rate)
1439 unsigned int epll_con, epll_con_k;
1441 unsigned int lockcnt;
1443 struct exynos5_clock *clk =
1444 (struct exynos5_clock *)samsung_get_base_clock();
1446 epll_con = readl(&clk->epll_con0);
1447 epll_con &= ~((EPLL_CON0_LOCK_DET_EN_MASK <<
1448 EPLL_CON0_LOCK_DET_EN_SHIFT) |
1449 EPLL_CON0_MDIV_MASK << EPLL_CON0_MDIV_SHIFT |
1450 EPLL_CON0_PDIV_MASK << EPLL_CON0_PDIV_SHIFT |
1451 EPLL_CON0_SDIV_MASK << EPLL_CON0_SDIV_SHIFT);
1453 for (i = 0; i < ARRAY_SIZE(exynos5_epll_div); i++) {
1454 if (exynos5_epll_div[i].freq_out == rate)
1458 if (i == ARRAY_SIZE(exynos5_epll_div))
1461 epll_con_k = exynos5_epll_div[i].k_dsm << 0;
1462 epll_con |= exynos5_epll_div[i].en_lock_det <<
1463 EPLL_CON0_LOCK_DET_EN_SHIFT;
1464 epll_con |= exynos5_epll_div[i].m_div << EPLL_CON0_MDIV_SHIFT;
1465 epll_con |= exynos5_epll_div[i].p_div << EPLL_CON0_PDIV_SHIFT;
1466 epll_con |= exynos5_epll_div[i].s_div << EPLL_CON0_SDIV_SHIFT;
1469 * Required period ( in cycles) to genarate a stable clock output.
1470 * The maximum clock time can be up to 3000 * PDIV cycles of PLLs
1471 * frequency input (as per spec)
1473 lockcnt = 3000 * exynos5_epll_div[i].p_div;
1475 writel(lockcnt, &clk->epll_lock);
1476 writel(epll_con, &clk->epll_con0);
1477 writel(epll_con_k, &clk->epll_con1);
1479 start = get_timer(0);
1481 while (!(readl(&clk->epll_con0) &
1482 (0x1 << EXYNOS5_EPLLCON0_LOCKED_SHIFT))) {
1483 if (get_timer(start) > TIMEOUT_EPLL_LOCK) {
1484 debug("%s: Timeout waiting for EPLL lock\n", __func__);
1491 int exynos5_set_i2s_clk_source(unsigned int i2s_id)
1493 struct exynos5_clock *clk =
1494 (struct exynos5_clock *)samsung_get_base_clock();
1495 unsigned int *audio_ass = (unsigned int *)samsung_get_base_audio_ass();
1498 setbits_le32(&clk->src_top2, CLK_SRC_MOUT_EPLL);
1499 clrsetbits_le32(&clk->src_mau, AUDIO0_SEL_MASK,
1500 (CLK_SRC_SCLK_EPLL));
1501 setbits_le32(audio_ass, AUDIO_CLKMUX_ASS);
1502 } else if (i2s_id == 1) {
1503 clrsetbits_le32(&clk->src_peric1, AUDIO1_SEL_MASK,
1504 (CLK_SRC_SCLK_EPLL));
1511 int exynos5_set_i2s_clk_prescaler(unsigned int src_frq,
1512 unsigned int dst_frq,
1513 unsigned int i2s_id)
1515 struct exynos5_clock *clk =
1516 (struct exynos5_clock *)samsung_get_base_clock();
1519 if ((dst_frq == 0) || (src_frq == 0)) {
1520 debug("%s: Invalid requency input for prescaler\n", __func__);
1521 debug("src frq = %d des frq = %d ", src_frq, dst_frq);
1525 div = (src_frq / dst_frq);
1527 if (div > AUDIO_0_RATIO_MASK) {
1528 debug("%s: Frequency ratio is out of range\n",
1530 debug("src frq = %d des frq = %d ", src_frq, dst_frq);
1533 clrsetbits_le32(&clk->div_mau, AUDIO_0_RATIO_MASK,
1534 (div & AUDIO_0_RATIO_MASK));
1535 } else if(i2s_id == 1) {
1536 if (div > AUDIO_1_RATIO_MASK) {
1537 debug("%s: Frequency ratio is out of range\n",
1539 debug("src frq = %d des frq = %d ", src_frq, dst_frq);
1542 clrsetbits_le32(&clk->div_peric4, AUDIO_1_RATIO_MASK,
1543 (div & AUDIO_1_RATIO_MASK));
1551 * Linearly searches for the most accurate main and fine stage clock scalars
1552 * (divisors) for a specified target frequency and scalar bit sizes by checking
1553 * all multiples of main_scalar_bits values. Will always return scalars up to or
1554 * slower than target.
1556 * @param main_scalar_bits Number of main scalar bits, must be > 0 and < 32
1557 * @param fine_scalar_bits Number of fine scalar bits, must be > 0 and < 32
1558 * @param input_freq Clock frequency to be scaled in Hz
1559 * @param target_freq Desired clock frequency in Hz
1560 * @param best_fine_scalar Pointer to store the fine stage divisor
1562 * @return best_main_scalar Main scalar for desired frequency or -1 if none
1565 static int clock_calc_best_scalar(unsigned int main_scaler_bits,
1566 unsigned int fine_scalar_bits, unsigned int input_rate,
1567 unsigned int target_rate, unsigned int *best_fine_scalar)
1570 int best_main_scalar = -1;
1571 unsigned int best_error = target_rate;
1572 const unsigned int cap = (1 << fine_scalar_bits) - 1;
1573 const unsigned int loops = 1 << main_scaler_bits;
1575 debug("Input Rate is %u, Target is %u, Cap is %u\n", input_rate,
1578 assert(best_fine_scalar != NULL);
1579 assert(main_scaler_bits <= fine_scalar_bits);
1581 *best_fine_scalar = 1;
1583 if (input_rate == 0 || target_rate == 0)
1586 if (target_rate >= input_rate)
1589 for (i = 1; i <= loops; i++) {
1590 const unsigned int effective_div =
1591 max(min(input_rate / i / target_rate, cap), 1U);
1592 const unsigned int effective_rate = input_rate / i /
1594 const int error = target_rate - effective_rate;
1596 debug("%d|effdiv:%u, effrate:%u, error:%d\n", i, effective_div,
1597 effective_rate, error);
1599 if (error >= 0 && error <= best_error) {
1601 best_main_scalar = i;
1602 *best_fine_scalar = effective_div;
1606 return best_main_scalar;
1609 static int exynos5_set_spi_clk(enum periph_id periph_id,
1612 struct exynos5_clock *clk =
1613 (struct exynos5_clock *)samsung_get_base_clock();
1616 unsigned shift, pre_shift;
1617 unsigned mask = 0xff;
1620 main = clock_calc_best_scalar(4, 8, 400000000, rate, &fine);
1622 debug("%s: Cannot set clock rate for periph %d",
1623 __func__, periph_id);
1629 switch (periph_id) {
1630 case PERIPH_ID_SPI0:
1631 reg = &clk->div_peric1;
1635 case PERIPH_ID_SPI1:
1636 reg = &clk->div_peric1;
1640 case PERIPH_ID_SPI2:
1641 reg = &clk->div_peric2;
1645 case PERIPH_ID_SPI3:
1646 reg = &clk->sclk_div_isp;
1650 case PERIPH_ID_SPI4:
1651 reg = &clk->sclk_div_isp;
1656 debug("%s: Unsupported peripheral ID %d\n", __func__,
1660 clrsetbits_le32(reg, mask << shift, (main & mask) << shift);
1661 clrsetbits_le32(reg, mask << pre_shift, (fine & mask) << pre_shift);
1666 static int exynos5420_set_spi_clk(enum periph_id periph_id,
1669 struct exynos5420_clock *clk =
1670 (struct exynos5420_clock *)samsung_get_base_clock();
1673 unsigned shift, pre_shift;
1674 unsigned div_mask = 0xf, pre_div_mask = 0xff;
1678 main = clock_calc_best_scalar(4, 8, 400000000, rate, &fine);
1680 debug("%s: Cannot set clock rate for periph %d",
1681 __func__, periph_id);
1687 switch (periph_id) {
1688 case PERIPH_ID_SPI0:
1689 reg = &clk->div_peric1;
1691 pre_reg = &clk->div_peric4;
1694 case PERIPH_ID_SPI1:
1695 reg = &clk->div_peric1;
1697 pre_reg = &clk->div_peric4;
1700 case PERIPH_ID_SPI2:
1701 reg = &clk->div_peric1;
1703 pre_reg = &clk->div_peric4;
1706 case PERIPH_ID_SPI3:
1707 reg = &clk->div_isp1;
1709 pre_reg = &clk->div_isp1;
1712 case PERIPH_ID_SPI4:
1713 reg = &clk->div_isp1;
1715 pre_reg = &clk->div_isp1;
1719 debug("%s: Unsupported peripheral ID %d\n", __func__,
1724 clrsetbits_le32(reg, div_mask << shift, (main & div_mask) << shift);
1725 clrsetbits_le32(pre_reg, pre_div_mask << pre_shift,
1726 (fine & pre_div_mask) << pre_shift);
1731 static unsigned long exynos4_get_i2c_clk(void)
1733 struct exynos4_clock *clk =
1734 (struct exynos4_clock *)samsung_get_base_clock();
1735 unsigned long sclk, aclk_100;
1738 sclk = get_pll_clk(APLL);
1740 ratio = (readl(&clk->div_top)) >> 4;
1742 aclk_100 = sclk / (ratio + 1);
1746 unsigned long get_pll_clk(int pllreg)
1748 if (cpu_is_exynos5()) {
1749 if (proid_is_exynos5420() || proid_is_exynos5800())
1750 return exynos542x_get_pll_clk(pllreg);
1751 return exynos5_get_pll_clk(pllreg);
1753 if (proid_is_exynos4412())
1754 return exynos4x12_get_pll_clk(pllreg);
1755 return exynos4_get_pll_clk(pllreg);
1759 unsigned long get_arm_clk(void)
1761 if (cpu_is_exynos5())
1762 return exynos5_get_arm_clk();
1764 if (proid_is_exynos4412())
1765 return exynos4x12_get_arm_clk();
1766 return exynos4_get_arm_clk();
1770 unsigned long get_i2c_clk(void)
1772 if (cpu_is_exynos5()) {
1773 return exynos5_get_i2c_clk();
1774 } else if (cpu_is_exynos4()) {
1775 return exynos4_get_i2c_clk();
1777 debug("I2C clock is not set for this CPU\n");
1782 unsigned long get_pwm_clk(void)
1784 if (cpu_is_exynos5()) {
1785 if (proid_is_exynos5420() || proid_is_exynos5800())
1786 return exynos5420_get_pwm_clk();
1787 return clock_get_periph_rate(PERIPH_ID_PWM0);
1789 if (proid_is_exynos4412())
1790 return exynos4x12_get_pwm_clk();
1791 return exynos4_get_pwm_clk();
1795 unsigned long get_uart_clk(int dev_index)
1797 if (cpu_is_exynos5()) {
1798 if (proid_is_exynos5420() || proid_is_exynos5800())
1799 return exynos5420_get_uart_clk(dev_index);
1800 return exynos5_get_uart_clk(dev_index);
1802 if (proid_is_exynos4412())
1803 return exynos4x12_get_uart_clk(dev_index);
1804 return exynos4_get_uart_clk(dev_index);
1808 unsigned long get_mmc_clk(int dev_index)
1810 if (cpu_is_exynos5()) {
1811 if (proid_is_exynos5420() || proid_is_exynos5800())
1812 return exynos5420_get_mmc_clk(dev_index);
1813 return exynos5_get_mmc_clk(dev_index);
1815 return exynos4_get_mmc_clk(dev_index);
1819 void set_mmc_clk(int dev_index, unsigned int div)
1821 /* If want to set correct value, it needs to substract one from div.*/
1825 if (cpu_is_exynos5()) {
1826 if (proid_is_exynos5420() || proid_is_exynos5800())
1827 exynos5420_set_mmc_clk(dev_index, div);
1829 exynos5_set_mmc_clk(dev_index, div);
1831 exynos4_set_mmc_clk(dev_index, div);
1835 unsigned long get_lcd_clk(void)
1837 if (cpu_is_exynos4())
1838 return exynos4_get_lcd_clk();
1840 if (proid_is_exynos5420() || proid_is_exynos5800())
1841 return exynos5420_get_lcd_clk();
1843 return exynos5_get_lcd_clk();
1847 void set_lcd_clk(void)
1849 if (cpu_is_exynos4())
1850 exynos4_set_lcd_clk();
1852 if (proid_is_exynos5250())
1853 exynos5_set_lcd_clk();
1854 else if (proid_is_exynos5420() || proid_is_exynos5800())
1855 exynos5420_set_lcd_clk();
1859 void set_mipi_clk(void)
1861 if (cpu_is_exynos4())
1862 exynos4_set_mipi_clk();
1865 int set_spi_clk(int periph_id, unsigned int rate)
1867 if (cpu_is_exynos5()) {
1868 if (proid_is_exynos5420() || proid_is_exynos5800())
1869 return exynos5420_set_spi_clk(periph_id, rate);
1870 return exynos5_set_spi_clk(periph_id, rate);
1876 int set_i2s_clk_prescaler(unsigned int src_frq, unsigned int dst_frq,
1877 unsigned int i2s_id)
1879 if (cpu_is_exynos5())
1880 return exynos5_set_i2s_clk_prescaler(src_frq, dst_frq, i2s_id);
1885 int set_i2s_clk_source(unsigned int i2s_id)
1887 if (cpu_is_exynos5())
1888 return exynos5_set_i2s_clk_source(i2s_id);
1893 int set_epll_clk(unsigned long rate)
1895 if (cpu_is_exynos5())
1896 return exynos5_set_epll_clk(rate);