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
32 static struct clk_bit_info exynos5_bit_info[] = {
33 /* periph id s_mask d_mask p_mask s_bit d_bit p_bit */
34 {PERIPH_ID_UART0, 0xf, 0xf, -1, 0, 0, -1},
35 {PERIPH_ID_UART1, 0xf, 0xf, -1, 4, 4, -1},
36 {PERIPH_ID_UART2, 0xf, 0xf, -1, 8, 8, -1},
37 {PERIPH_ID_UART3, 0xf, 0xf, -1, 12, 12, -1},
38 {PERIPH_ID_I2C0, -1, 0x7, 0x7, -1, 24, 0},
39 {PERIPH_ID_I2C1, -1, 0x7, 0x7, -1, 24, 0},
40 {PERIPH_ID_I2C2, -1, 0x7, 0x7, -1, 24, 0},
41 {PERIPH_ID_I2C3, -1, 0x7, 0x7, -1, 24, 0},
42 {PERIPH_ID_I2C4, -1, 0x7, 0x7, -1, 24, 0},
43 {PERIPH_ID_I2C5, -1, 0x7, 0x7, -1, 24, 0},
44 {PERIPH_ID_I2C6, -1, 0x7, 0x7, -1, 24, 0},
45 {PERIPH_ID_I2C7, -1, 0x7, 0x7, -1, 24, 0},
46 {PERIPH_ID_SPI0, 0xf, 0xf, 0xff, 16, 0, 8},
47 {PERIPH_ID_SPI1, 0xf, 0xf, 0xff, 20, 16, 24},
48 {PERIPH_ID_SPI2, 0xf, 0xf, 0xff, 24, 0, 8},
49 {PERIPH_ID_SDMMC0, 0xf, 0xf, 0xff, 0, 0, 8},
50 {PERIPH_ID_SDMMC1, 0xf, 0xf, 0xff, 4, 16, 24},
51 {PERIPH_ID_SDMMC2, 0xf, 0xf, 0xff, 8, 0, 8},
52 {PERIPH_ID_SDMMC3, 0xf, 0xf, 0xff, 12, 16, 24},
53 {PERIPH_ID_I2S0, 0xf, 0xf, 0xff, 0, 0, 4},
54 {PERIPH_ID_I2S1, 0xf, 0xf, 0xff, 4, 12, 16},
55 {PERIPH_ID_SPI3, 0xf, 0xf, 0xff, 0, 0, 4},
56 {PERIPH_ID_SPI4, 0xf, 0xf, 0xff, 4, 12, 16},
57 {PERIPH_ID_SDMMC4, 0xf, 0xf, 0xff, 16, 0, 8},
58 {PERIPH_ID_PWM0, 0xf, 0xf, -1, 24, 0, -1},
59 {PERIPH_ID_PWM1, 0xf, 0xf, -1, 24, 0, -1},
60 {PERIPH_ID_PWM2, 0xf, 0xf, -1, 24, 0, -1},
61 {PERIPH_ID_PWM3, 0xf, 0xf, -1, 24, 0, -1},
62 {PERIPH_ID_PWM4, 0xf, 0xf, -1, 24, 0, -1},
64 {PERIPH_ID_NONE, -1, -1, -1, -1, -1, -1},
67 static struct clk_bit_info exynos542x_bit_info[] = {
68 /* periph id s_mask d_mask p_mask s_bit d_bit p_bit */
69 {PERIPH_ID_UART0, 0xf, 0xf, -1, 4, 8, -1},
70 {PERIPH_ID_UART1, 0xf, 0xf, -1, 8, 12, -1},
71 {PERIPH_ID_UART2, 0xf, 0xf, -1, 12, 16, -1},
72 {PERIPH_ID_UART3, 0xf, 0xf, -1, 16, 20, -1},
73 {PERIPH_ID_I2C0, -1, 0x3f, -1, -1, 8, -1},
74 {PERIPH_ID_I2C1, -1, 0x3f, -1, -1, 8, -1},
75 {PERIPH_ID_I2C2, -1, 0x3f, -1, -1, 8, -1},
76 {PERIPH_ID_I2C3, -1, 0x3f, -1, -1, 8, -1},
77 {PERIPH_ID_I2C4, -1, 0x3f, -1, -1, 8, -1},
78 {PERIPH_ID_I2C5, -1, 0x3f, -1, -1, 8, -1},
79 {PERIPH_ID_I2C6, -1, 0x3f, -1, -1, 8, -1},
80 {PERIPH_ID_I2C7, -1, 0x3f, -1, -1, 8, -1},
81 {PERIPH_ID_SPI0, 0xf, 0xf, 0xff, 20, 20, 8},
82 {PERIPH_ID_SPI1, 0xf, 0xf, 0xff, 24, 24, 16},
83 {PERIPH_ID_SPI2, 0xf, 0xf, 0xff, 28, 28, 24},
84 {PERIPH_ID_SDMMC0, 0x7, 0x3ff, -1, 8, 0, -1},
85 {PERIPH_ID_SDMMC1, 0x7, 0x3ff, -1, 12, 10, -1},
86 {PERIPH_ID_SDMMC2, 0x7, 0x3ff, -1, 16, 20, -1},
87 {PERIPH_ID_I2C8, -1, 0x3f, -1, -1, 8, -1},
88 {PERIPH_ID_I2C9, -1, 0x3f, -1, -1, 8, -1},
89 {PERIPH_ID_I2S0, 0xf, 0xf, 0xff, 0, 0, 4},
90 {PERIPH_ID_I2S1, 0xf, 0xf, 0xff, 4, 12, 16},
91 {PERIPH_ID_SPI3, 0xf, 0xf, 0xff, 12, 16, 0},
92 {PERIPH_ID_SPI4, 0xf, 0xf, 0xff, 16, 20, 8},
93 {PERIPH_ID_PWM0, 0xf, 0xf, -1, 24, 28, -1},
94 {PERIPH_ID_PWM1, 0xf, 0xf, -1, 24, 28, -1},
95 {PERIPH_ID_PWM2, 0xf, 0xf, -1, 24, 28, -1},
96 {PERIPH_ID_PWM3, 0xf, 0xf, -1, 24, 28, -1},
97 {PERIPH_ID_PWM4, 0xf, 0xf, -1, 24, 28, -1},
98 {PERIPH_ID_I2C10, -1, 0x3f, -1, -1, 8, -1},
100 {PERIPH_ID_NONE, -1, -1, -1, -1, -1, -1},
103 /* Epll Clock division values to achive different frequency output */
104 static struct set_epll_con_val exynos5_epll_div[] = {
105 { 192000000, 0, 48, 3, 1, 0 },
106 { 180000000, 0, 45, 3, 1, 0 },
107 { 73728000, 1, 73, 3, 3, 47710 },
108 { 67737600, 1, 90, 4, 3, 20762 },
109 { 49152000, 0, 49, 3, 3, 9961 },
110 { 45158400, 0, 45, 3, 3, 10381 },
111 { 180633600, 0, 45, 3, 1, 10381 }
114 /* exynos: return pll clock frequency */
115 static int exynos_get_pll_clk(int pllreg, unsigned int r, unsigned int k)
117 unsigned long m, p, s = 0, mask, fout;
121 * APLL_CON: MIDV [25:16]
122 * MPLL_CON: MIDV [25:16]
123 * EPLL_CON: MIDV [24:16]
124 * VPLL_CON: MIDV [24:16]
125 * BPLL_CON: MIDV [25:16]: Exynos5
127 if (pllreg == APLL || pllreg == MPLL || pllreg == BPLL ||
133 m = (r >> 16) & mask;
140 freq = CONFIG_SYS_CLK_FREQ;
142 if (pllreg == EPLL || pllreg == RPLL) {
144 /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */
145 fout = (m + k / PLL_DIV_65536) * (freq / (p * (1 << s)));
146 } else if (pllreg == VPLL) {
151 * FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV)
154 * FOUT = (MDIV + K / 65535) * FIN / (PDIV * 2^SDIV)
157 * FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV)
159 if (proid_is_exynos4210())
161 else if (proid_is_exynos4412())
163 else if (proid_is_exynos5250() || proid_is_exynos5420()
164 || proid_is_exynos5800())
169 fout = (m + k / div) * (freq / (p * (1 << s)));
172 * Exynos4412 / Exynos5250
173 * FOUT = MDIV * FIN / (PDIV * 2^SDIV)
176 * FOUT = MDIV * FIN / (PDIV * 2^(SDIV-1))
178 if (proid_is_exynos4210())
179 fout = m * (freq / (p * (1 << (s - 1))));
181 fout = m * (freq / (p * (1 << s)));
186 /* exynos4: return pll clock frequency */
187 static unsigned long exynos4_get_pll_clk(int pllreg)
189 struct exynos4_clock *clk =
190 (struct exynos4_clock *)samsung_get_base_clock();
191 unsigned long r, k = 0;
195 r = readl(&clk->apll_con0);
198 r = readl(&clk->mpll_con0);
201 r = readl(&clk->epll_con0);
202 k = readl(&clk->epll_con1);
205 r = readl(&clk->vpll_con0);
206 k = readl(&clk->vpll_con1);
209 printf("Unsupported PLL (%d)\n", pllreg);
213 return exynos_get_pll_clk(pllreg, r, k);
216 /* exynos4x12: return pll clock frequency */
217 static unsigned long exynos4x12_get_pll_clk(int pllreg)
219 struct exynos4x12_clock *clk =
220 (struct exynos4x12_clock *)samsung_get_base_clock();
221 unsigned long r, k = 0;
225 r = readl(&clk->apll_con0);
228 r = readl(&clk->mpll_con0);
231 r = readl(&clk->epll_con0);
232 k = readl(&clk->epll_con1);
235 r = readl(&clk->vpll_con0);
236 k = readl(&clk->vpll_con1);
239 printf("Unsupported PLL (%d)\n", pllreg);
243 return exynos_get_pll_clk(pllreg, r, k);
246 /* exynos5: return pll clock frequency */
247 static unsigned long exynos5_get_pll_clk(int pllreg)
249 struct exynos5_clock *clk =
250 (struct exynos5_clock *)samsung_get_base_clock();
251 unsigned long r, k = 0, fout;
252 unsigned int pll_div2_sel, fout_sel;
256 r = readl(&clk->apll_con0);
259 r = readl(&clk->mpll_con0);
262 r = readl(&clk->epll_con0);
263 k = readl(&clk->epll_con1);
266 r = readl(&clk->vpll_con0);
267 k = readl(&clk->vpll_con1);
270 r = readl(&clk->bpll_con0);
273 printf("Unsupported PLL (%d)\n", pllreg);
277 fout = exynos_get_pll_clk(pllreg, r, k);
279 /* According to the user manual, in EVT1 MPLL and BPLL always gives
280 * 1.6GHz clock, so divide by 2 to get 800MHz MPLL clock.*/
281 if (pllreg == MPLL || pllreg == BPLL) {
282 pll_div2_sel = readl(&clk->pll_div2_sel);
286 fout_sel = (pll_div2_sel >> MPLL_FOUT_SEL_SHIFT)
287 & MPLL_FOUT_SEL_MASK;
290 fout_sel = (pll_div2_sel >> BPLL_FOUT_SEL_SHIFT)
291 & BPLL_FOUT_SEL_MASK;
305 /* exynos542x: return pll clock frequency */
306 static unsigned long exynos542x_get_pll_clk(int pllreg)
308 struct exynos5420_clock *clk =
309 (struct exynos5420_clock *)samsung_get_base_clock();
310 unsigned long r, k = 0;
314 r = readl(&clk->apll_con0);
317 r = readl(&clk->mpll_con0);
320 r = readl(&clk->epll_con0);
321 k = readl(&clk->epll_con1);
324 r = readl(&clk->vpll_con0);
325 k = readl(&clk->vpll_con1);
328 r = readl(&clk->bpll_con0);
331 r = readl(&clk->rpll_con0);
332 k = readl(&clk->rpll_con1);
335 r = readl(&clk->spll_con0);
338 printf("Unsupported PLL (%d)\n", pllreg);
342 return exynos_get_pll_clk(pllreg, r, k);
345 static struct clk_bit_info *get_clk_bit_info(int peripheral)
348 struct clk_bit_info *info;
350 if (proid_is_exynos5420() || proid_is_exynos5800())
351 info = exynos542x_bit_info;
353 info = exynos5_bit_info;
355 for (i = 0; info[i].id != PERIPH_ID_NONE; i++) {
356 if (info[i].id == peripheral)
360 if (info[i].id == PERIPH_ID_NONE)
361 debug("ERROR: Peripheral ID %d not found\n", peripheral);
366 static unsigned long exynos5_get_periph_rate(int peripheral)
368 struct clk_bit_info *bit_info = get_clk_bit_info(peripheral);
369 unsigned long sclk, sub_clk = 0;
370 unsigned int src, div, sub_div = 0;
371 struct exynos5_clock *clk =
372 (struct exynos5_clock *)samsung_get_base_clock();
374 switch (peripheral) {
375 case PERIPH_ID_UART0:
376 case PERIPH_ID_UART1:
377 case PERIPH_ID_UART2:
378 case PERIPH_ID_UART3:
379 src = readl(&clk->src_peric0);
380 div = readl(&clk->div_peric0);
387 src = readl(&clk->src_peric0);
388 div = readl(&clk->div_peric3);
391 src = readl(&clk->src_mau);
392 div = readl(&clk->div_mau);
395 src = readl(&clk->src_peric1);
396 div = readl(&clk->div_peric1);
399 src = readl(&clk->src_peric1);
400 div = readl(&clk->div_peric2);
404 src = readl(&clk->sclk_src_isp);
405 div = readl(&clk->sclk_div_isp);
407 case PERIPH_ID_SDMMC0:
408 case PERIPH_ID_SDMMC1:
409 src = readl(&clk->src_fsys);
410 div = readl(&clk->div_fsys1);
412 case PERIPH_ID_SDMMC2:
413 case PERIPH_ID_SDMMC3:
414 src = readl(&clk->src_fsys);
415 div = readl(&clk->div_fsys2);
425 sclk = exynos5_get_pll_clk(MPLL);
426 sub_div = ((readl(&clk->div_top1) >> bit_info->div_bit)
427 & bit_info->div_mask) + 1;
428 div = ((readl(&clk->div_top0) >> bit_info->prediv_bit)
429 & bit_info->prediv_mask) + 1;
430 return (sclk / sub_div) / div;
432 debug("%s: invalid peripheral %d", __func__, peripheral);
436 if (bit_info->src_bit >= 0)
437 src = (src >> bit_info->src_bit) & bit_info->src_mask;
440 case EXYNOS_SRC_MPLL:
441 sclk = exynos5_get_pll_clk(MPLL);
443 case EXYNOS_SRC_EPLL:
444 sclk = exynos5_get_pll_clk(EPLL);
446 case EXYNOS_SRC_VPLL:
447 sclk = exynos5_get_pll_clk(VPLL);
453 /* Ratio clock division for this peripheral */
454 if (bit_info->div_bit >= 0) {
455 sub_div = (div >> bit_info->div_bit) & bit_info->div_mask;
456 sub_clk = sclk / (sub_div + 1);
459 if (bit_info->prediv_bit >= 0) {
460 div = (div >> bit_info->prediv_bit) & bit_info->prediv_mask;
461 return sub_clk / (div + 1);
467 static unsigned long exynos542x_get_periph_rate(int peripheral)
469 struct clk_bit_info *bit_info = get_clk_bit_info(peripheral);
470 unsigned long sclk, sub_clk = 0;
471 unsigned int src, div, sub_div = 0;
472 struct exynos5420_clock *clk =
473 (struct exynos5420_clock *)samsung_get_base_clock();
475 switch (peripheral) {
476 case PERIPH_ID_UART0:
477 case PERIPH_ID_UART1:
478 case PERIPH_ID_UART2:
479 case PERIPH_ID_UART3:
485 src = readl(&clk->src_peric0);
486 div = readl(&clk->div_peric0);
491 src = readl(&clk->src_peric1);
492 div = readl(&clk->div_peric1);
493 sub_div = readl(&clk->div_peric4);
497 src = readl(&clk->src_isp);
498 div = readl(&clk->div_isp1);
499 sub_div = readl(&clk->div_isp1);
501 case PERIPH_ID_SDMMC0:
502 case PERIPH_ID_SDMMC1:
503 case PERIPH_ID_SDMMC2:
504 case PERIPH_ID_SDMMC3:
505 src = readl(&clk->src_fsys);
506 div = readl(&clk->div_fsys1);
518 case PERIPH_ID_I2C10:
519 sclk = exynos542x_get_pll_clk(MPLL);
520 sub_div = ((readl(&clk->div_top1) >> bit_info->div_bit)
521 & bit_info->div_mask) + 1;
522 return sclk / sub_div;
524 debug("%s: invalid peripheral %d", __func__, peripheral);
528 if (bit_info->src_bit >= 0)
529 src = (src >> bit_info->src_bit) & bit_info->src_mask;
532 case EXYNOS542X_SRC_MPLL:
533 sclk = exynos542x_get_pll_clk(MPLL);
535 case EXYNOS542X_SRC_SPLL:
536 sclk = exynos542x_get_pll_clk(SPLL);
538 case EXYNOS542X_SRC_EPLL:
539 sclk = exynos542x_get_pll_clk(EPLL);
541 case EXYNOS542X_SRC_RPLL:
542 sclk = exynos542x_get_pll_clk(RPLL);
548 /* Ratio clock division for this peripheral */
549 if (bit_info->div_bit >= 0) {
550 div = (div >> bit_info->div_bit) & bit_info->div_mask;
551 sub_clk = sclk / (div + 1);
554 if (bit_info->prediv_bit >= 0) {
555 sub_div = (sub_div >> bit_info->prediv_bit)
556 & bit_info->prediv_mask;
557 return sub_clk / (sub_div + 1);
563 unsigned long clock_get_periph_rate(int peripheral)
565 if (cpu_is_exynos5()) {
566 if (proid_is_exynos5420() || proid_is_exynos5800())
567 return exynos542x_get_periph_rate(peripheral);
568 return exynos5_get_periph_rate(peripheral);
574 /* exynos4: return ARM clock frequency */
575 static unsigned long exynos4_get_arm_clk(void)
577 struct exynos4_clock *clk =
578 (struct exynos4_clock *)samsung_get_base_clock();
580 unsigned long armclk;
581 unsigned int core_ratio;
582 unsigned int core2_ratio;
584 div = readl(&clk->div_cpu0);
586 /* CORE_RATIO: [2:0], CORE2_RATIO: [30:28] */
587 core_ratio = (div >> 0) & 0x7;
588 core2_ratio = (div >> 28) & 0x7;
590 armclk = get_pll_clk(APLL) / (core_ratio + 1);
591 armclk /= (core2_ratio + 1);
596 /* exynos4x12: return ARM clock frequency */
597 static unsigned long exynos4x12_get_arm_clk(void)
599 struct exynos4x12_clock *clk =
600 (struct exynos4x12_clock *)samsung_get_base_clock();
602 unsigned long armclk;
603 unsigned int core_ratio;
604 unsigned int core2_ratio;
606 div = readl(&clk->div_cpu0);
608 /* CORE_RATIO: [2:0], CORE2_RATIO: [30:28] */
609 core_ratio = (div >> 0) & 0x7;
610 core2_ratio = (div >> 28) & 0x7;
612 armclk = get_pll_clk(APLL) / (core_ratio + 1);
613 armclk /= (core2_ratio + 1);
618 /* exynos5: return ARM clock frequency */
619 static unsigned long exynos5_get_arm_clk(void)
621 struct exynos5_clock *clk =
622 (struct exynos5_clock *)samsung_get_base_clock();
624 unsigned long armclk;
625 unsigned int arm_ratio;
626 unsigned int arm2_ratio;
628 div = readl(&clk->div_cpu0);
630 /* ARM_RATIO: [2:0], ARM2_RATIO: [30:28] */
631 arm_ratio = (div >> 0) & 0x7;
632 arm2_ratio = (div >> 28) & 0x7;
634 armclk = get_pll_clk(APLL) / (arm_ratio + 1);
635 armclk /= (arm2_ratio + 1);
640 /* exynos4: return pwm clock frequency */
641 static unsigned long exynos4_get_pwm_clk(void)
643 struct exynos4_clock *clk =
644 (struct exynos4_clock *)samsung_get_base_clock();
645 unsigned long pclk, sclk;
649 if (s5p_get_cpu_rev() == 0) {
654 sel = readl(&clk->src_peril0);
655 sel = (sel >> 24) & 0xf;
658 sclk = get_pll_clk(MPLL);
660 sclk = get_pll_clk(EPLL);
662 sclk = get_pll_clk(VPLL);
670 ratio = readl(&clk->div_peril3);
672 } else if (s5p_get_cpu_rev() == 1) {
673 sclk = get_pll_clk(MPLL);
678 pclk = sclk / (ratio + 1);
683 /* exynos4x12: return pwm clock frequency */
684 static unsigned long exynos4x12_get_pwm_clk(void)
686 unsigned long pclk, sclk;
689 sclk = get_pll_clk(MPLL);
692 pclk = sclk / (ratio + 1);
697 /* exynos4: return uart clock frequency */
698 static unsigned long exynos4_get_uart_clk(int dev_index)
700 struct exynos4_clock *clk =
701 (struct exynos4_clock *)samsung_get_base_clock();
702 unsigned long uclk, sclk;
715 sel = readl(&clk->src_peril0);
716 sel = (sel >> (dev_index << 2)) & 0xf;
719 sclk = get_pll_clk(MPLL);
721 sclk = get_pll_clk(EPLL);
723 sclk = get_pll_clk(VPLL);
732 * UART3_RATIO [12:15]
733 * UART4_RATIO [16:19]
734 * UART5_RATIO [23:20]
736 ratio = readl(&clk->div_peril0);
737 ratio = (ratio >> (dev_index << 2)) & 0xf;
739 uclk = sclk / (ratio + 1);
744 /* exynos4x12: return uart clock frequency */
745 static unsigned long exynos4x12_get_uart_clk(int dev_index)
747 struct exynos4x12_clock *clk =
748 (struct exynos4x12_clock *)samsung_get_base_clock();
749 unsigned long uclk, sclk;
761 sel = readl(&clk->src_peril0);
762 sel = (sel >> (dev_index << 2)) & 0xf;
765 sclk = get_pll_clk(MPLL);
767 sclk = get_pll_clk(EPLL);
769 sclk = get_pll_clk(VPLL);
778 * UART3_RATIO [12:15]
779 * UART4_RATIO [16:19]
781 ratio = readl(&clk->div_peril0);
782 ratio = (ratio >> (dev_index << 2)) & 0xf;
784 uclk = sclk / (ratio + 1);
789 static unsigned long exynos4_get_mmc_clk(int dev_index)
791 struct exynos4_clock *clk =
792 (struct exynos4_clock *)samsung_get_base_clock();
793 unsigned long uclk, sclk;
794 unsigned int sel, ratio, pre_ratio;
797 sel = readl(&clk->src_fsys);
798 sel = (sel >> (dev_index << 2)) & 0xf;
801 sclk = get_pll_clk(MPLL);
803 sclk = get_pll_clk(EPLL);
805 sclk = get_pll_clk(VPLL);
812 ratio = readl(&clk->div_fsys1);
813 pre_ratio = readl(&clk->div_fsys1);
817 ratio = readl(&clk->div_fsys2);
818 pre_ratio = readl(&clk->div_fsys2);
821 ratio = readl(&clk->div_fsys3);
822 pre_ratio = readl(&clk->div_fsys3);
828 if (dev_index == 1 || dev_index == 3)
831 ratio = (ratio >> shift) & 0xf;
832 pre_ratio = (pre_ratio >> (shift + 8)) & 0xff;
833 uclk = (sclk / (ratio + 1)) / (pre_ratio + 1);
838 /* exynos4: set the mmc clock */
839 static void exynos4_set_mmc_clk(int dev_index, unsigned int div)
841 struct exynos4_clock *clk =
842 (struct exynos4_clock *)samsung_get_base_clock();
843 unsigned int addr, clear_bit, set_bit;
847 * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
849 * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
854 addr = (unsigned int)&clk->div_fsys1;
855 clear_bit = MASK_PRE_RATIO(dev_index);
856 set_bit = SET_PRE_RATIO(dev_index, div);
857 } else if (dev_index == 4) {
858 addr = (unsigned int)&clk->div_fsys3;
860 /* MMC4 is controlled with the MMC4_RATIO value */
861 clear_bit = MASK_RATIO(dev_index);
862 set_bit = SET_RATIO(dev_index, div);
864 addr = (unsigned int)&clk->div_fsys2;
866 clear_bit = MASK_PRE_RATIO(dev_index);
867 set_bit = SET_PRE_RATIO(dev_index, div);
870 clrsetbits_le32(addr, clear_bit, set_bit);
873 /* exynos5: set the mmc clock */
874 static void exynos5_set_mmc_clk(int dev_index, unsigned int div)
876 struct exynos5_clock *clk =
877 (struct exynos5_clock *)samsung_get_base_clock();
882 * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
884 * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
887 addr = (unsigned int)&clk->div_fsys1;
889 addr = (unsigned int)&clk->div_fsys2;
893 clrsetbits_le32(addr, 0xff << ((dev_index << 4) + 8),
894 (div & 0xff) << ((dev_index << 4) + 8));
897 /* exynos5: set the mmc clock */
898 static void exynos5420_set_mmc_clk(int dev_index, unsigned int div)
900 struct exynos5420_clock *clk =
901 (struct exynos5420_clock *)samsung_get_base_clock();
911 addr = (unsigned int)&clk->div_fsys1;
912 shift = dev_index * 10;
914 clrsetbits_le32(addr, 0x3ff << shift, (div & 0x3ff) << shift);
917 /* get_lcd_clk: return lcd clock frequency */
918 static unsigned long exynos4_get_lcd_clk(void)
920 struct exynos4_clock *clk =
921 (struct exynos4_clock *)samsung_get_base_clock();
922 unsigned long pclk, sclk;
930 sel = readl(&clk->src_lcd0);
939 sclk = get_pll_clk(MPLL);
941 sclk = get_pll_clk(EPLL);
943 sclk = get_pll_clk(VPLL);
951 ratio = readl(&clk->div_lcd0);
954 pclk = sclk / (ratio + 1);
959 /* get_lcd_clk: return lcd clock frequency */
960 static unsigned long exynos5_get_lcd_clk(void)
962 struct exynos5_clock *clk =
963 (struct exynos5_clock *)samsung_get_base_clock();
964 unsigned long pclk, sclk;
972 sel = readl(&clk->src_disp1_0);
981 sclk = get_pll_clk(MPLL);
983 sclk = get_pll_clk(EPLL);
985 sclk = get_pll_clk(VPLL);
993 ratio = readl(&clk->div_disp1_0);
996 pclk = sclk / (ratio + 1);
1001 static unsigned long exynos5420_get_lcd_clk(void)
1003 struct exynos5420_clock *clk =
1004 (struct exynos5420_clock *)samsung_get_base_clock();
1005 unsigned long pclk, sclk;
1015 sel = readl(&clk->src_disp10);
1019 sclk = get_pll_clk(SPLL);
1021 sclk = get_pll_clk(RPLL);
1027 ratio = readl(&clk->div_disp10);
1028 ratio = ratio & 0xf;
1030 pclk = sclk / (ratio + 1);
1035 void exynos4_set_lcd_clk(void)
1037 struct exynos4_clock *clk =
1038 (struct exynos4_clock *)samsung_get_base_clock();
1050 setbits_le32(&clk->gate_block, 1 << 4);
1056 * MDNIE_PWM0_SEL [8:11]
1058 * set lcd0 src clock 0x6: SCLK_MPLL
1060 clrsetbits_le32(&clk->src_lcd0, 0xf, 0x6);
1070 * Gating all clocks for FIMD0
1072 setbits_le32(&clk->gate_ip_lcd0, 1 << 0);
1077 * MDNIE0_RATIO [7:4]
1078 * MDNIE_PWM0_RATIO [11:8]
1079 * MDNIE_PWM_PRE_RATIO [15:12]
1080 * MIPI0_RATIO [19:16]
1081 * MIPI0_PRE_RATIO [23:20]
1084 clrsetbits_le32(&clk->div_lcd0, 0xf, 0x1);
1087 void exynos5_set_lcd_clk(void)
1089 struct exynos5_clock *clk =
1090 (struct exynos5_clock *)samsung_get_base_clock();
1102 setbits_le32(&clk->gate_block, 1 << 4);
1108 * MDNIE_PWM0_SEL [8:11]
1110 * set lcd0 src clock 0x6: SCLK_MPLL
1112 clrsetbits_le32(&clk->src_disp1_0, 0xf, 0x6);
1122 * Gating all clocks for FIMD0
1124 setbits_le32(&clk->gate_ip_disp1, 1 << 0);
1129 * MDNIE0_RATIO [7:4]
1130 * MDNIE_PWM0_RATIO [11:8]
1131 * MDNIE_PWM_PRE_RATIO [15:12]
1132 * MIPI0_RATIO [19:16]
1133 * MIPI0_PRE_RATIO [23:20]
1136 clrsetbits_le32(&clk->div_disp1_0, 0xf, 0x0);
1139 void exynos5420_set_lcd_clk(void)
1141 struct exynos5420_clock *clk =
1142 (struct exynos5420_clock *)samsung_get_base_clock();
1151 cfg = readl(&clk->src_disp10);
1154 writel(cfg, &clk->src_disp10);
1160 cfg = readl(&clk->div_disp10);
1163 writel(cfg, &clk->div_disp10);
1166 void exynos4_set_mipi_clk(void)
1168 struct exynos4_clock *clk =
1169 (struct exynos4_clock *)samsung_get_base_clock();
1175 * MDNIE_PWM0_SEL [8:11]
1177 * set mipi0 src clock 0x6: SCLK_MPLL
1179 clrsetbits_le32(&clk->src_lcd0, 0xf << 12, 0x6 << 12);
1185 * MDNIE_PWM0_MASK [8]
1187 * set src mask mipi0 0x1: Unmask
1189 setbits_le32(&clk->src_mask_lcd0, 0x1 << 12);
1199 * Gating all clocks for MIPI0
1201 setbits_le32(&clk->gate_ip_lcd0, 1 << 3);
1206 * MDNIE0_RATIO [7:4]
1207 * MDNIE_PWM0_RATIO [11:8]
1208 * MDNIE_PWM_PRE_RATIO [15:12]
1209 * MIPI0_RATIO [19:16]
1210 * MIPI0_PRE_RATIO [23:20]
1213 clrsetbits_le32(&clk->div_lcd0, 0xf << 16, 0x1 << 16);
1216 int exynos5_set_epll_clk(unsigned long rate)
1218 unsigned int epll_con, epll_con_k;
1220 unsigned int lockcnt;
1222 struct exynos5_clock *clk =
1223 (struct exynos5_clock *)samsung_get_base_clock();
1225 epll_con = readl(&clk->epll_con0);
1226 epll_con &= ~((EPLL_CON0_LOCK_DET_EN_MASK <<
1227 EPLL_CON0_LOCK_DET_EN_SHIFT) |
1228 EPLL_CON0_MDIV_MASK << EPLL_CON0_MDIV_SHIFT |
1229 EPLL_CON0_PDIV_MASK << EPLL_CON0_PDIV_SHIFT |
1230 EPLL_CON0_SDIV_MASK << EPLL_CON0_SDIV_SHIFT);
1232 for (i = 0; i < ARRAY_SIZE(exynos5_epll_div); i++) {
1233 if (exynos5_epll_div[i].freq_out == rate)
1237 if (i == ARRAY_SIZE(exynos5_epll_div))
1240 epll_con_k = exynos5_epll_div[i].k_dsm << 0;
1241 epll_con |= exynos5_epll_div[i].en_lock_det <<
1242 EPLL_CON0_LOCK_DET_EN_SHIFT;
1243 epll_con |= exynos5_epll_div[i].m_div << EPLL_CON0_MDIV_SHIFT;
1244 epll_con |= exynos5_epll_div[i].p_div << EPLL_CON0_PDIV_SHIFT;
1245 epll_con |= exynos5_epll_div[i].s_div << EPLL_CON0_SDIV_SHIFT;
1248 * Required period ( in cycles) to genarate a stable clock output.
1249 * The maximum clock time can be up to 3000 * PDIV cycles of PLLs
1250 * frequency input (as per spec)
1252 lockcnt = 3000 * exynos5_epll_div[i].p_div;
1254 writel(lockcnt, &clk->epll_lock);
1255 writel(epll_con, &clk->epll_con0);
1256 writel(epll_con_k, &clk->epll_con1);
1258 start = get_timer(0);
1260 while (!(readl(&clk->epll_con0) &
1261 (0x1 << EXYNOS5_EPLLCON0_LOCKED_SHIFT))) {
1262 if (get_timer(start) > TIMEOUT_EPLL_LOCK) {
1263 debug("%s: Timeout waiting for EPLL lock\n", __func__);
1270 int exynos5_set_i2s_clk_source(unsigned int i2s_id)
1272 struct exynos5_clock *clk =
1273 (struct exynos5_clock *)samsung_get_base_clock();
1274 unsigned int *audio_ass = (unsigned int *)samsung_get_base_audio_ass();
1277 setbits_le32(&clk->src_top2, CLK_SRC_MOUT_EPLL);
1278 clrsetbits_le32(&clk->src_mau, AUDIO0_SEL_MASK,
1279 (CLK_SRC_SCLK_EPLL));
1280 setbits_le32(audio_ass, AUDIO_CLKMUX_ASS);
1281 } else if (i2s_id == 1) {
1282 clrsetbits_le32(&clk->src_peric1, AUDIO1_SEL_MASK,
1283 (CLK_SRC_SCLK_EPLL));
1290 int exynos5_set_i2s_clk_prescaler(unsigned int src_frq,
1291 unsigned int dst_frq,
1292 unsigned int i2s_id)
1294 struct exynos5_clock *clk =
1295 (struct exynos5_clock *)samsung_get_base_clock();
1298 if ((dst_frq == 0) || (src_frq == 0)) {
1299 debug("%s: Invalid requency input for prescaler\n", __func__);
1300 debug("src frq = %d des frq = %d ", src_frq, dst_frq);
1304 div = (src_frq / dst_frq);
1306 if (div > AUDIO_0_RATIO_MASK) {
1307 debug("%s: Frequency ratio is out of range\n",
1309 debug("src frq = %d des frq = %d ", src_frq, dst_frq);
1312 clrsetbits_le32(&clk->div_mau, AUDIO_0_RATIO_MASK,
1313 (div & AUDIO_0_RATIO_MASK));
1314 } else if(i2s_id == 1) {
1315 if (div > AUDIO_1_RATIO_MASK) {
1316 debug("%s: Frequency ratio is out of range\n",
1318 debug("src frq = %d des frq = %d ", src_frq, dst_frq);
1321 clrsetbits_le32(&clk->div_peric4, AUDIO_1_RATIO_MASK,
1322 (div & AUDIO_1_RATIO_MASK));
1330 * Linearly searches for the most accurate main and fine stage clock scalars
1331 * (divisors) for a specified target frequency and scalar bit sizes by checking
1332 * all multiples of main_scalar_bits values. Will always return scalars up to or
1333 * slower than target.
1335 * @param main_scalar_bits Number of main scalar bits, must be > 0 and < 32
1336 * @param fine_scalar_bits Number of fine scalar bits, must be > 0 and < 32
1337 * @param input_freq Clock frequency to be scaled in Hz
1338 * @param target_freq Desired clock frequency in Hz
1339 * @param best_fine_scalar Pointer to store the fine stage divisor
1341 * @return best_main_scalar Main scalar for desired frequency or -1 if none
1344 static int clock_calc_best_scalar(unsigned int main_scaler_bits,
1345 unsigned int fine_scalar_bits, unsigned int input_rate,
1346 unsigned int target_rate, unsigned int *best_fine_scalar)
1349 int best_main_scalar = -1;
1350 unsigned int best_error = target_rate;
1351 const unsigned int cap = (1 << fine_scalar_bits) - 1;
1352 const unsigned int loops = 1 << main_scaler_bits;
1354 debug("Input Rate is %u, Target is %u, Cap is %u\n", input_rate,
1357 assert(best_fine_scalar != NULL);
1358 assert(main_scaler_bits <= fine_scalar_bits);
1360 *best_fine_scalar = 1;
1362 if (input_rate == 0 || target_rate == 0)
1365 if (target_rate >= input_rate)
1368 for (i = 1; i <= loops; i++) {
1369 const unsigned int effective_div =
1370 max(min(input_rate / i / target_rate, cap), 1U);
1371 const unsigned int effective_rate = input_rate / i /
1373 const int error = target_rate - effective_rate;
1375 debug("%d|effdiv:%u, effrate:%u, error:%d\n", i, effective_div,
1376 effective_rate, error);
1378 if (error >= 0 && error <= best_error) {
1380 best_main_scalar = i;
1381 *best_fine_scalar = effective_div;
1385 return best_main_scalar;
1388 static int exynos5_set_spi_clk(enum periph_id periph_id,
1391 struct exynos5_clock *clk =
1392 (struct exynos5_clock *)samsung_get_base_clock();
1395 unsigned shift, pre_shift;
1396 unsigned mask = 0xff;
1399 main = clock_calc_best_scalar(4, 8, 400000000, rate, &fine);
1401 debug("%s: Cannot set clock rate for periph %d",
1402 __func__, periph_id);
1408 switch (periph_id) {
1409 case PERIPH_ID_SPI0:
1410 reg = &clk->div_peric1;
1414 case PERIPH_ID_SPI1:
1415 reg = &clk->div_peric1;
1419 case PERIPH_ID_SPI2:
1420 reg = &clk->div_peric2;
1424 case PERIPH_ID_SPI3:
1425 reg = &clk->sclk_div_isp;
1429 case PERIPH_ID_SPI4:
1430 reg = &clk->sclk_div_isp;
1435 debug("%s: Unsupported peripheral ID %d\n", __func__,
1439 clrsetbits_le32(reg, mask << shift, (main & mask) << shift);
1440 clrsetbits_le32(reg, mask << pre_shift, (fine & mask) << pre_shift);
1445 static int exynos5420_set_spi_clk(enum periph_id periph_id,
1448 struct exynos5420_clock *clk =
1449 (struct exynos5420_clock *)samsung_get_base_clock();
1452 unsigned shift, pre_shift;
1453 unsigned div_mask = 0xf, pre_div_mask = 0xff;
1457 main = clock_calc_best_scalar(4, 8, 400000000, rate, &fine);
1459 debug("%s: Cannot set clock rate for periph %d",
1460 __func__, periph_id);
1466 switch (periph_id) {
1467 case PERIPH_ID_SPI0:
1468 reg = &clk->div_peric1;
1470 pre_reg = &clk->div_peric4;
1473 case PERIPH_ID_SPI1:
1474 reg = &clk->div_peric1;
1476 pre_reg = &clk->div_peric4;
1479 case PERIPH_ID_SPI2:
1480 reg = &clk->div_peric1;
1482 pre_reg = &clk->div_peric4;
1485 case PERIPH_ID_SPI3:
1486 reg = &clk->div_isp1;
1488 pre_reg = &clk->div_isp1;
1491 case PERIPH_ID_SPI4:
1492 reg = &clk->div_isp1;
1494 pre_reg = &clk->div_isp1;
1498 debug("%s: Unsupported peripheral ID %d\n", __func__,
1503 clrsetbits_le32(reg, div_mask << shift, (main & div_mask) << shift);
1504 clrsetbits_le32(pre_reg, pre_div_mask << pre_shift,
1505 (fine & pre_div_mask) << pre_shift);
1510 static unsigned long exynos4_get_i2c_clk(void)
1512 struct exynos4_clock *clk =
1513 (struct exynos4_clock *)samsung_get_base_clock();
1514 unsigned long sclk, aclk_100;
1517 sclk = get_pll_clk(APLL);
1519 ratio = (readl(&clk->div_top)) >> 4;
1521 aclk_100 = sclk / (ratio + 1);
1525 unsigned long get_pll_clk(int pllreg)
1527 if (cpu_is_exynos5()) {
1528 if (proid_is_exynos5420() || proid_is_exynos5800())
1529 return exynos542x_get_pll_clk(pllreg);
1530 return exynos5_get_pll_clk(pllreg);
1532 if (proid_is_exynos4412())
1533 return exynos4x12_get_pll_clk(pllreg);
1534 return exynos4_get_pll_clk(pllreg);
1538 unsigned long get_arm_clk(void)
1540 if (cpu_is_exynos5())
1541 return exynos5_get_arm_clk();
1543 if (proid_is_exynos4412())
1544 return exynos4x12_get_arm_clk();
1545 return exynos4_get_arm_clk();
1549 unsigned long get_i2c_clk(void)
1551 if (cpu_is_exynos5()) {
1552 return clock_get_periph_rate(PERIPH_ID_I2C0);
1553 } else if (cpu_is_exynos4()) {
1554 return exynos4_get_i2c_clk();
1556 debug("I2C clock is not set for this CPU\n");
1561 unsigned long get_pwm_clk(void)
1563 if (cpu_is_exynos5()) {
1564 return clock_get_periph_rate(PERIPH_ID_PWM0);
1566 if (proid_is_exynos4412())
1567 return exynos4x12_get_pwm_clk();
1568 return exynos4_get_pwm_clk();
1572 unsigned long get_uart_clk(int dev_index)
1576 switch (dev_index) {
1578 id = PERIPH_ID_UART0;
1581 id = PERIPH_ID_UART1;
1584 id = PERIPH_ID_UART2;
1587 id = PERIPH_ID_UART3;
1590 debug("%s: invalid UART index %d", __func__, dev_index);
1594 if (cpu_is_exynos5()) {
1595 return clock_get_periph_rate(id);
1597 if (proid_is_exynos4412())
1598 return exynos4x12_get_uart_clk(dev_index);
1599 return exynos4_get_uart_clk(dev_index);
1603 unsigned long get_mmc_clk(int dev_index)
1607 switch (dev_index) {
1609 id = PERIPH_ID_SDMMC0;
1612 id = PERIPH_ID_SDMMC1;
1615 id = PERIPH_ID_SDMMC2;
1618 id = PERIPH_ID_SDMMC3;
1621 debug("%s: invalid MMC index %d", __func__, dev_index);
1625 if (cpu_is_exynos5()) {
1626 return clock_get_periph_rate(id);
1628 return exynos4_get_mmc_clk(dev_index);
1632 void set_mmc_clk(int dev_index, unsigned int div)
1634 /* If want to set correct value, it needs to substract one from div.*/
1638 if (cpu_is_exynos5()) {
1639 if (proid_is_exynos5420() || proid_is_exynos5800())
1640 exynos5420_set_mmc_clk(dev_index, div);
1642 exynos5_set_mmc_clk(dev_index, div);
1644 exynos4_set_mmc_clk(dev_index, div);
1648 unsigned long get_lcd_clk(void)
1650 if (cpu_is_exynos4())
1651 return exynos4_get_lcd_clk();
1653 if (proid_is_exynos5420() || proid_is_exynos5800())
1654 return exynos5420_get_lcd_clk();
1656 return exynos5_get_lcd_clk();
1660 void set_lcd_clk(void)
1662 if (cpu_is_exynos4())
1663 exynos4_set_lcd_clk();
1665 if (proid_is_exynos5250())
1666 exynos5_set_lcd_clk();
1667 else if (proid_is_exynos5420() || proid_is_exynos5800())
1668 exynos5420_set_lcd_clk();
1672 void set_mipi_clk(void)
1674 if (cpu_is_exynos4())
1675 exynos4_set_mipi_clk();
1678 int set_spi_clk(int periph_id, unsigned int rate)
1680 if (cpu_is_exynos5()) {
1681 if (proid_is_exynos5420() || proid_is_exynos5800())
1682 return exynos5420_set_spi_clk(periph_id, rate);
1683 return exynos5_set_spi_clk(periph_id, rate);
1689 int set_i2s_clk_prescaler(unsigned int src_frq, unsigned int dst_frq,
1690 unsigned int i2s_id)
1692 if (cpu_is_exynos5())
1693 return exynos5_set_i2s_clk_prescaler(src_frq, dst_frq, i2s_id);
1698 int set_i2s_clk_source(unsigned int i2s_id)
1700 if (cpu_is_exynos5())
1701 return exynos5_set_i2s_clk_source(i2s_id);
1706 int set_epll_clk(unsigned long rate)
1708 if (cpu_is_exynos5())
1709 return exynos5_set_epll_clk(rate);