blob: a0424238ae52408c6d67f156a489be006292ffbd [file] [log] [blame]
Minkyu Kang008a3512011-01-24 15:22:23 +09001/*
2 * Copyright (C) 2010 Samsung Electronics
3 * Minkyu Kang <mk7.kang@samsung.com>
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24#include <common.h>
25#include <asm/io.h>
26#include <asm/arch/clock.h>
27#include <asm/arch/clk.h>
28
Minkyu Kangbb6527b2012-10-15 01:58:00 +000029/* exynos: return pll clock frequency */
30static int exynos_get_pll_clk(int pllreg, unsigned int r, unsigned int k)
Minkyu Kang008a3512011-01-24 15:22:23 +090031{
Minkyu Kangbb6527b2012-10-15 01:58:00 +000032 unsigned long m, p, s = 0, mask, fout;
Minkyu Kang008a3512011-01-24 15:22:23 +090033 unsigned int freq;
Minkyu Kang008a3512011-01-24 15:22:23 +090034 /*
35 * APLL_CON: MIDV [25:16]
36 * MPLL_CON: MIDV [25:16]
37 * EPLL_CON: MIDV [24:16]
38 * VPLL_CON: MIDV [24:16]
Minkyu Kangbb6527b2012-10-15 01:58:00 +000039 * BPLL_CON: MIDV [25:16]: Exynos5
Minkyu Kang008a3512011-01-24 15:22:23 +090040 */
Minkyu Kangbb6527b2012-10-15 01:58:00 +000041 if (pllreg == APLL || pllreg == MPLL || pllreg == BPLL)
Minkyu Kang008a3512011-01-24 15:22:23 +090042 mask = 0x3ff;
43 else
44 mask = 0x1ff;
45
46 m = (r >> 16) & mask;
47
48 /* PDIV [13:8] */
49 p = (r >> 8) & 0x3f;
50 /* SDIV [2:0] */
51 s = r & 0x7;
52
Chander Kashyap5e46f832012-02-05 23:01:45 +000053 freq = CONFIG_SYS_CLK_FREQ;
Minkyu Kang008a3512011-01-24 15:22:23 +090054
55 if (pllreg == EPLL) {
56 k = k & 0xffff;
57 /* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */
58 fout = (m + k / 65536) * (freq / (p * (1 << s)));
59 } else if (pllreg == VPLL) {
60 k = k & 0xfff;
61 /* FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV) */
62 fout = (m + k / 1024) * (freq / (p * (1 << s)));
63 } else {
64 if (s < 1)
65 s = 1;
66 /* FOUT = MDIV * FIN / (PDIV * 2^(SDIV - 1)) */
67 fout = m * (freq / (p * (1 << (s - 1))));
68 }
69
70 return fout;
71}
72
Minkyu Kangbb6527b2012-10-15 01:58:00 +000073/* exynos4: return pll clock frequency */
74static unsigned long exynos4_get_pll_clk(int pllreg)
75{
76 struct exynos4_clock *clk =
77 (struct exynos4_clock *)samsung_get_base_clock();
78 unsigned long r, k = 0;
79
80 switch (pllreg) {
81 case APLL:
82 r = readl(&clk->apll_con0);
83 break;
84 case MPLL:
85 r = readl(&clk->mpll_con0);
86 break;
87 case EPLL:
88 r = readl(&clk->epll_con0);
89 k = readl(&clk->epll_con1);
90 break;
91 case VPLL:
92 r = readl(&clk->vpll_con0);
93 k = readl(&clk->vpll_con1);
94 break;
95 default:
96 printf("Unsupported PLL (%d)\n", pllreg);
97 return 0;
98 }
99
100 return exynos_get_pll_clk(pllreg, r, k);
101}
102
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000103/* exynos5: return pll clock frequency */
104static unsigned long exynos5_get_pll_clk(int pllreg)
105{
106 struct exynos5_clock *clk =
107 (struct exynos5_clock *)samsung_get_base_clock();
Minkyu Kangbb6527b2012-10-15 01:58:00 +0000108 unsigned long r, k = 0, fout;
109 unsigned int pll_div2_sel, fout_sel;
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000110
111 switch (pllreg) {
112 case APLL:
113 r = readl(&clk->apll_con0);
114 break;
115 case MPLL:
116 r = readl(&clk->mpll_con0);
117 break;
118 case EPLL:
119 r = readl(&clk->epll_con0);
120 k = readl(&clk->epll_con1);
121 break;
122 case VPLL:
123 r = readl(&clk->vpll_con0);
124 k = readl(&clk->vpll_con1);
125 break;
Rajeshwari Shinde10bc1a72012-07-03 20:02:58 +0000126 case BPLL:
127 r = readl(&clk->bpll_con0);
128 break;
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000129 default:
130 printf("Unsupported PLL (%d)\n", pllreg);
131 return 0;
132 }
133
Minkyu Kangbb6527b2012-10-15 01:58:00 +0000134 fout = exynos_get_pll_clk(pllreg, r, k);
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000135
Rajeshwari Shinde10bc1a72012-07-03 20:02:58 +0000136 /* According to the user manual, in EVT1 MPLL and BPLL always gives
Rajeshwari Shinde6071bca2012-07-03 20:02:57 +0000137 * 1.6GHz clock, so divide by 2 to get 800MHz MPLL clock.*/
Rajeshwari Shinde10bc1a72012-07-03 20:02:58 +0000138 if (pllreg == MPLL || pllreg == BPLL) {
Rajeshwari Shinde6071bca2012-07-03 20:02:57 +0000139 pll_div2_sel = readl(&clk->pll_div2_sel);
Rajeshwari Shinde10bc1a72012-07-03 20:02:58 +0000140
141 switch (pllreg) {
142 case MPLL:
143 fout_sel = (pll_div2_sel >> MPLL_FOUT_SEL_SHIFT)
144 & MPLL_FOUT_SEL_MASK;
145 break;
146 case BPLL:
147 fout_sel = (pll_div2_sel >> BPLL_FOUT_SEL_SHIFT)
148 & BPLL_FOUT_SEL_MASK;
149 break;
Jaehoon Chungf8c5cfa2012-07-09 21:20:34 +0000150 default:
151 fout_sel = -1;
152 break;
Rajeshwari Shinde10bc1a72012-07-03 20:02:58 +0000153 }
154
155 if (fout_sel == 0)
Rajeshwari Shinde6071bca2012-07-03 20:02:57 +0000156 fout /= 2;
157 }
158
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000159 return fout;
160}
161
Chander Kashyap393cb362011-12-06 23:34:12 +0000162/* exynos4: return ARM clock frequency */
163static unsigned long exynos4_get_arm_clk(void)
Minkyu Kang008a3512011-01-24 15:22:23 +0900164{
Chander Kashyap393cb362011-12-06 23:34:12 +0000165 struct exynos4_clock *clk =
166 (struct exynos4_clock *)samsung_get_base_clock();
Minkyu Kang008a3512011-01-24 15:22:23 +0900167 unsigned long div;
Chander Kashyapdb68bc22011-12-18 22:56:44 +0000168 unsigned long armclk;
169 unsigned int core_ratio;
170 unsigned int core2_ratio;
Minkyu Kang008a3512011-01-24 15:22:23 +0900171
172 div = readl(&clk->div_cpu0);
173
Chander Kashyapdb68bc22011-12-18 22:56:44 +0000174 /* CORE_RATIO: [2:0], CORE2_RATIO: [30:28] */
175 core_ratio = (div >> 0) & 0x7;
176 core2_ratio = (div >> 28) & 0x7;
Minkyu Kang008a3512011-01-24 15:22:23 +0900177
Chander Kashyapdb68bc22011-12-18 22:56:44 +0000178 armclk = get_pll_clk(APLL) / (core_ratio + 1);
179 armclk /= (core2_ratio + 1);
Minkyu Kang008a3512011-01-24 15:22:23 +0900180
Chander Kashyapdb68bc22011-12-18 22:56:44 +0000181 return armclk;
Minkyu Kang008a3512011-01-24 15:22:23 +0900182}
183
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000184/* exynos5: return ARM clock frequency */
185static unsigned long exynos5_get_arm_clk(void)
186{
187 struct exynos5_clock *clk =
188 (struct exynos5_clock *)samsung_get_base_clock();
189 unsigned long div;
190 unsigned long armclk;
191 unsigned int arm_ratio;
192 unsigned int arm2_ratio;
193
194 div = readl(&clk->div_cpu0);
195
196 /* ARM_RATIO: [2:0], ARM2_RATIO: [30:28] */
197 arm_ratio = (div >> 0) & 0x7;
198 arm2_ratio = (div >> 28) & 0x7;
199
200 armclk = get_pll_clk(APLL) / (arm_ratio + 1);
201 armclk /= (arm2_ratio + 1);
202
203 return armclk;
204}
205
Chander Kashyap393cb362011-12-06 23:34:12 +0000206/* exynos4: return pwm clock frequency */
207static unsigned long exynos4_get_pwm_clk(void)
Minkyu Kang008a3512011-01-24 15:22:23 +0900208{
Chander Kashyap393cb362011-12-06 23:34:12 +0000209 struct exynos4_clock *clk =
210 (struct exynos4_clock *)samsung_get_base_clock();
Minkyu Kang008a3512011-01-24 15:22:23 +0900211 unsigned long pclk, sclk;
212 unsigned int sel;
213 unsigned int ratio;
214
Minkyu Kangb4f73912011-05-18 16:57:55 +0900215 if (s5p_get_cpu_rev() == 0) {
216 /*
217 * CLK_SRC_PERIL0
218 * PWM_SEL [27:24]
219 */
220 sel = readl(&clk->src_peril0);
221 sel = (sel >> 24) & 0xf;
Minkyu Kang008a3512011-01-24 15:22:23 +0900222
Minkyu Kangb4f73912011-05-18 16:57:55 +0900223 if (sel == 0x6)
224 sclk = get_pll_clk(MPLL);
225 else if (sel == 0x7)
226 sclk = get_pll_clk(EPLL);
227 else if (sel == 0x8)
228 sclk = get_pll_clk(VPLL);
229 else
230 return 0;
231
232 /*
233 * CLK_DIV_PERIL3
234 * PWM_RATIO [3:0]
235 */
236 ratio = readl(&clk->div_peril3);
237 ratio = ratio & 0xf;
238 } else if (s5p_get_cpu_rev() == 1) {
Minkyu Kang008a3512011-01-24 15:22:23 +0900239 sclk = get_pll_clk(MPLL);
Minkyu Kangb4f73912011-05-18 16:57:55 +0900240 ratio = 8;
241 } else
Minkyu Kang008a3512011-01-24 15:22:23 +0900242 return 0;
243
Minkyu Kang008a3512011-01-24 15:22:23 +0900244 pclk = sclk / (ratio + 1);
245
246 return pclk;
247}
248
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000249/* exynos5: return pwm clock frequency */
250static unsigned long exynos5_get_pwm_clk(void)
251{
252 struct exynos5_clock *clk =
253 (struct exynos5_clock *)samsung_get_base_clock();
254 unsigned long pclk, sclk;
255 unsigned int ratio;
256
257 /*
258 * CLK_DIV_PERIC3
259 * PWM_RATIO [3:0]
260 */
261 ratio = readl(&clk->div_peric3);
262 ratio = ratio & 0xf;
263 sclk = get_pll_clk(MPLL);
264
265 pclk = sclk / (ratio + 1);
266
267 return pclk;
268}
269
Chander Kashyap393cb362011-12-06 23:34:12 +0000270/* exynos4: return uart clock frequency */
271static unsigned long exynos4_get_uart_clk(int dev_index)
Minkyu Kang008a3512011-01-24 15:22:23 +0900272{
Chander Kashyap393cb362011-12-06 23:34:12 +0000273 struct exynos4_clock *clk =
274 (struct exynos4_clock *)samsung_get_base_clock();
Minkyu Kang008a3512011-01-24 15:22:23 +0900275 unsigned long uclk, sclk;
276 unsigned int sel;
277 unsigned int ratio;
278
279 /*
280 * CLK_SRC_PERIL0
281 * UART0_SEL [3:0]
282 * UART1_SEL [7:4]
283 * UART2_SEL [8:11]
284 * UART3_SEL [12:15]
285 * UART4_SEL [16:19]
286 * UART5_SEL [23:20]
287 */
288 sel = readl(&clk->src_peril0);
289 sel = (sel >> (dev_index << 2)) & 0xf;
290
291 if (sel == 0x6)
292 sclk = get_pll_clk(MPLL);
293 else if (sel == 0x7)
294 sclk = get_pll_clk(EPLL);
295 else if (sel == 0x8)
296 sclk = get_pll_clk(VPLL);
297 else
298 return 0;
299
300 /*
301 * CLK_DIV_PERIL0
302 * UART0_RATIO [3:0]
303 * UART1_RATIO [7:4]
304 * UART2_RATIO [8:11]
305 * UART3_RATIO [12:15]
306 * UART4_RATIO [16:19]
307 * UART5_RATIO [23:20]
308 */
309 ratio = readl(&clk->div_peril0);
310 ratio = (ratio >> (dev_index << 2)) & 0xf;
311
312 uclk = sclk / (ratio + 1);
313
314 return uclk;
315}
316
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000317/* exynos5: return uart clock frequency */
318static unsigned long exynos5_get_uart_clk(int dev_index)
319{
320 struct exynos5_clock *clk =
321 (struct exynos5_clock *)samsung_get_base_clock();
322 unsigned long uclk, sclk;
323 unsigned int sel;
324 unsigned int ratio;
325
326 /*
327 * CLK_SRC_PERIC0
328 * UART0_SEL [3:0]
329 * UART1_SEL [7:4]
330 * UART2_SEL [8:11]
331 * UART3_SEL [12:15]
332 * UART4_SEL [16:19]
333 * UART5_SEL [23:20]
334 */
335 sel = readl(&clk->src_peric0);
336 sel = (sel >> (dev_index << 2)) & 0xf;
337
338 if (sel == 0x6)
339 sclk = get_pll_clk(MPLL);
340 else if (sel == 0x7)
341 sclk = get_pll_clk(EPLL);
342 else if (sel == 0x8)
343 sclk = get_pll_clk(VPLL);
344 else
345 return 0;
346
347 /*
348 * CLK_DIV_PERIC0
349 * UART0_RATIO [3:0]
350 * UART1_RATIO [7:4]
351 * UART2_RATIO [8:11]
352 * UART3_RATIO [12:15]
353 * UART4_RATIO [16:19]
354 * UART5_RATIO [23:20]
355 */
356 ratio = readl(&clk->div_peric0);
357 ratio = (ratio >> (dev_index << 2)) & 0xf;
358
359 uclk = sclk / (ratio + 1);
360
361 return uclk;
362}
363
Chander Kashyap393cb362011-12-06 23:34:12 +0000364/* exynos4: set the mmc clock */
365static void exynos4_set_mmc_clk(int dev_index, unsigned int div)
Jaehoon Chung68a8cbf2011-05-17 21:19:17 +0000366{
Chander Kashyap393cb362011-12-06 23:34:12 +0000367 struct exynos4_clock *clk =
368 (struct exynos4_clock *)samsung_get_base_clock();
Jaehoon Chung68a8cbf2011-05-17 21:19:17 +0000369 unsigned int addr;
370 unsigned int val;
371
372 /*
373 * CLK_DIV_FSYS1
374 * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
375 * CLK_DIV_FSYS2
376 * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
377 */
378 if (dev_index < 2) {
379 addr = (unsigned int)&clk->div_fsys1;
380 } else {
381 addr = (unsigned int)&clk->div_fsys2;
382 dev_index -= 2;
383 }
384
385 val = readl(addr);
386 val &= ~(0xff << ((dev_index << 4) + 8));
387 val |= (div & 0xff) << ((dev_index << 4) + 8);
388 writel(val, addr);
389}
390
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000391/* exynos5: set the mmc clock */
392static void exynos5_set_mmc_clk(int dev_index, unsigned int div)
393{
394 struct exynos5_clock *clk =
395 (struct exynos5_clock *)samsung_get_base_clock();
396 unsigned int addr;
397 unsigned int val;
398
399 /*
400 * CLK_DIV_FSYS1
401 * MMC0_PRE_RATIO [15:8], MMC1_PRE_RATIO [31:24]
402 * CLK_DIV_FSYS2
403 * MMC2_PRE_RATIO [15:8], MMC3_PRE_RATIO [31:24]
404 */
405 if (dev_index < 2) {
406 addr = (unsigned int)&clk->div_fsys1;
407 } else {
408 addr = (unsigned int)&clk->div_fsys2;
409 dev_index -= 2;
410 }
411
412 val = readl(addr);
413 val &= ~(0xff << ((dev_index << 4) + 8));
414 val |= (div & 0xff) << ((dev_index << 4) + 8);
415 writel(val, addr);
416}
417
Donghwa Lee37835d42012-04-05 19:36:12 +0000418/* get_lcd_clk: return lcd clock frequency */
419static unsigned long exynos4_get_lcd_clk(void)
420{
421 struct exynos4_clock *clk =
422 (struct exynos4_clock *)samsung_get_base_clock();
423 unsigned long pclk, sclk;
424 unsigned int sel;
425 unsigned int ratio;
426
427 /*
428 * CLK_SRC_LCD0
429 * FIMD0_SEL [3:0]
430 */
431 sel = readl(&clk->src_lcd0);
432 sel = sel & 0xf;
433
434 /*
435 * 0x6: SCLK_MPLL
436 * 0x7: SCLK_EPLL
437 * 0x8: SCLK_VPLL
438 */
439 if (sel == 0x6)
440 sclk = get_pll_clk(MPLL);
441 else if (sel == 0x7)
442 sclk = get_pll_clk(EPLL);
443 else if (sel == 0x8)
444 sclk = get_pll_clk(VPLL);
445 else
446 return 0;
447
448 /*
449 * CLK_DIV_LCD0
450 * FIMD0_RATIO [3:0]
451 */
452 ratio = readl(&clk->div_lcd0);
453 ratio = ratio & 0xf;
454
455 pclk = sclk / (ratio + 1);
456
457 return pclk;
458}
459
Donghwa Lee2c5cd252012-07-02 01:15:49 +0000460/* get_lcd_clk: return lcd clock frequency */
461static unsigned long exynos5_get_lcd_clk(void)
462{
463 struct exynos5_clock *clk =
464 (struct exynos5_clock *)samsung_get_base_clock();
465 unsigned long pclk, sclk;
466 unsigned int sel;
467 unsigned int ratio;
468
469 /*
470 * CLK_SRC_LCD0
471 * FIMD0_SEL [3:0]
472 */
473 sel = readl(&clk->src_disp1_0);
474 sel = sel & 0xf;
475
476 /*
477 * 0x6: SCLK_MPLL
478 * 0x7: SCLK_EPLL
479 * 0x8: SCLK_VPLL
480 */
481 if (sel == 0x6)
482 sclk = get_pll_clk(MPLL);
483 else if (sel == 0x7)
484 sclk = get_pll_clk(EPLL);
485 else if (sel == 0x8)
486 sclk = get_pll_clk(VPLL);
487 else
488 return 0;
489
490 /*
491 * CLK_DIV_LCD0
492 * FIMD0_RATIO [3:0]
493 */
494 ratio = readl(&clk->div_disp1_0);
495 ratio = ratio & 0xf;
496
497 pclk = sclk / (ratio + 1);
498
499 return pclk;
500}
501
Donghwa Lee37835d42012-04-05 19:36:12 +0000502void exynos4_set_lcd_clk(void)
503{
504 struct exynos4_clock *clk =
505 (struct exynos4_clock *)samsung_get_base_clock();
506 unsigned int cfg = 0;
507
508 /*
509 * CLK_GATE_BLOCK
510 * CLK_CAM [0]
511 * CLK_TV [1]
512 * CLK_MFC [2]
513 * CLK_G3D [3]
514 * CLK_LCD0 [4]
515 * CLK_LCD1 [5]
516 * CLK_GPS [7]
517 */
518 cfg = readl(&clk->gate_block);
519 cfg |= 1 << 4;
520 writel(cfg, &clk->gate_block);
521
522 /*
523 * CLK_SRC_LCD0
524 * FIMD0_SEL [3:0]
525 * MDNIE0_SEL [7:4]
526 * MDNIE_PWM0_SEL [8:11]
527 * MIPI0_SEL [12:15]
528 * set lcd0 src clock 0x6: SCLK_MPLL
529 */
530 cfg = readl(&clk->src_lcd0);
531 cfg &= ~(0xf);
532 cfg |= 0x6;
533 writel(cfg, &clk->src_lcd0);
534
535 /*
536 * CLK_GATE_IP_LCD0
537 * CLK_FIMD0 [0]
538 * CLK_MIE0 [1]
539 * CLK_MDNIE0 [2]
540 * CLK_DSIM0 [3]
541 * CLK_SMMUFIMD0 [4]
542 * CLK_PPMULCD0 [5]
543 * Gating all clocks for FIMD0
544 */
545 cfg = readl(&clk->gate_ip_lcd0);
546 cfg |= 1 << 0;
547 writel(cfg, &clk->gate_ip_lcd0);
548
549 /*
550 * CLK_DIV_LCD0
551 * FIMD0_RATIO [3:0]
552 * MDNIE0_RATIO [7:4]
553 * MDNIE_PWM0_RATIO [11:8]
554 * MDNIE_PWM_PRE_RATIO [15:12]
555 * MIPI0_RATIO [19:16]
556 * MIPI0_PRE_RATIO [23:20]
557 * set fimd ratio
558 */
559 cfg &= ~(0xf);
560 cfg |= 0x1;
561 writel(cfg, &clk->div_lcd0);
562}
563
Donghwa Lee2c5cd252012-07-02 01:15:49 +0000564void exynos5_set_lcd_clk(void)
565{
566 struct exynos5_clock *clk =
567 (struct exynos5_clock *)samsung_get_base_clock();
568 unsigned int cfg = 0;
569
570 /*
571 * CLK_GATE_BLOCK
572 * CLK_CAM [0]
573 * CLK_TV [1]
574 * CLK_MFC [2]
575 * CLK_G3D [3]
576 * CLK_LCD0 [4]
577 * CLK_LCD1 [5]
578 * CLK_GPS [7]
579 */
580 cfg = readl(&clk->gate_block);
581 cfg |= 1 << 4;
582 writel(cfg, &clk->gate_block);
583
584 /*
585 * CLK_SRC_LCD0
586 * FIMD0_SEL [3:0]
587 * MDNIE0_SEL [7:4]
588 * MDNIE_PWM0_SEL [8:11]
589 * MIPI0_SEL [12:15]
590 * set lcd0 src clock 0x6: SCLK_MPLL
591 */
592 cfg = readl(&clk->src_disp1_0);
593 cfg &= ~(0xf);
594 cfg |= 0x8;
595 writel(cfg, &clk->src_disp1_0);
596
597 /*
598 * CLK_GATE_IP_LCD0
599 * CLK_FIMD0 [0]
600 * CLK_MIE0 [1]
601 * CLK_MDNIE0 [2]
602 * CLK_DSIM0 [3]
603 * CLK_SMMUFIMD0 [4]
604 * CLK_PPMULCD0 [5]
605 * Gating all clocks for FIMD0
606 */
607 cfg = readl(&clk->gate_ip_disp1);
608 cfg |= 1 << 0;
609 writel(cfg, &clk->gate_ip_disp1);
610
611 /*
612 * CLK_DIV_LCD0
613 * FIMD0_RATIO [3:0]
614 * MDNIE0_RATIO [7:4]
615 * MDNIE_PWM0_RATIO [11:8]
616 * MDNIE_PWM_PRE_RATIO [15:12]
617 * MIPI0_RATIO [19:16]
618 * MIPI0_PRE_RATIO [23:20]
619 * set fimd ratio
620 */
621 cfg &= ~(0xf);
622 cfg |= 0x0;
623 writel(cfg, &clk->div_disp1_0);
624}
625
Donghwa Lee37835d42012-04-05 19:36:12 +0000626void exynos4_set_mipi_clk(void)
627{
628 struct exynos4_clock *clk =
629 (struct exynos4_clock *)samsung_get_base_clock();
630 unsigned int cfg = 0;
631
632 /*
633 * CLK_SRC_LCD0
634 * FIMD0_SEL [3:0]
635 * MDNIE0_SEL [7:4]
636 * MDNIE_PWM0_SEL [8:11]
637 * MIPI0_SEL [12:15]
638 * set mipi0 src clock 0x6: SCLK_MPLL
639 */
640 cfg = readl(&clk->src_lcd0);
641 cfg &= ~(0xf << 12);
642 cfg |= (0x6 << 12);
643 writel(cfg, &clk->src_lcd0);
644
645 /*
646 * CLK_SRC_MASK_LCD0
647 * FIMD0_MASK [0]
648 * MDNIE0_MASK [4]
649 * MDNIE_PWM0_MASK [8]
650 * MIPI0_MASK [12]
651 * set src mask mipi0 0x1: Unmask
652 */
653 cfg = readl(&clk->src_mask_lcd0);
654 cfg |= (0x1 << 12);
655 writel(cfg, &clk->src_mask_lcd0);
656
657 /*
658 * CLK_GATE_IP_LCD0
659 * CLK_FIMD0 [0]
660 * CLK_MIE0 [1]
661 * CLK_MDNIE0 [2]
662 * CLK_DSIM0 [3]
663 * CLK_SMMUFIMD0 [4]
664 * CLK_PPMULCD0 [5]
665 * Gating all clocks for MIPI0
666 */
667 cfg = readl(&clk->gate_ip_lcd0);
668 cfg |= 1 << 3;
669 writel(cfg, &clk->gate_ip_lcd0);
670
671 /*
672 * CLK_DIV_LCD0
673 * FIMD0_RATIO [3:0]
674 * MDNIE0_RATIO [7:4]
675 * MDNIE_PWM0_RATIO [11:8]
676 * MDNIE_PWM_PRE_RATIO [15:12]
677 * MIPI0_RATIO [19:16]
678 * MIPI0_PRE_RATIO [23:20]
679 * set mipi ratio
680 */
681 cfg &= ~(0xf << 16);
682 cfg |= (0x1 << 16);
683 writel(cfg, &clk->div_lcd0);
684}
685
Rajeshwari Shinde989feb82012-07-23 21:23:48 +0000686/*
687 * I2C
688 *
689 * exynos5: obtaining the I2C clock
690 */
691static unsigned long exynos5_get_i2c_clk(void)
692{
693 struct exynos5_clock *clk =
694 (struct exynos5_clock *)samsung_get_base_clock();
695 unsigned long aclk_66, aclk_66_pre, sclk;
696 unsigned int ratio;
697
698 sclk = get_pll_clk(MPLL);
699
700 ratio = (readl(&clk->div_top1)) >> 24;
701 ratio &= 0x7;
702 aclk_66_pre = sclk / (ratio + 1);
703 ratio = readl(&clk->div_top0);
704 ratio &= 0x7;
705 aclk_66 = aclk_66_pre / (ratio + 1);
706 return aclk_66;
707}
708
Minkyu Kang008a3512011-01-24 15:22:23 +0900709unsigned long get_pll_clk(int pllreg)
710{
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000711 if (cpu_is_exynos5())
712 return exynos5_get_pll_clk(pllreg);
713 else
714 return exynos4_get_pll_clk(pllreg);
Minkyu Kang008a3512011-01-24 15:22:23 +0900715}
716
717unsigned long get_arm_clk(void)
718{
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000719 if (cpu_is_exynos5())
720 return exynos5_get_arm_clk();
721 else
722 return exynos4_get_arm_clk();
Minkyu Kang008a3512011-01-24 15:22:23 +0900723}
724
Rajeshwari Shinde989feb82012-07-23 21:23:48 +0000725unsigned long get_i2c_clk(void)
726{
727 if (cpu_is_exynos5()) {
728 return exynos5_get_i2c_clk();
729 } else {
730 debug("I2C clock is not set for this CPU\n");
731 return 0;
732 }
733}
734
Minkyu Kang008a3512011-01-24 15:22:23 +0900735unsigned long get_pwm_clk(void)
736{
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000737 if (cpu_is_exynos5())
738 return exynos5_get_pwm_clk();
739 else
740 return exynos4_get_pwm_clk();
Minkyu Kang008a3512011-01-24 15:22:23 +0900741}
742
743unsigned long get_uart_clk(int dev_index)
744{
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000745 if (cpu_is_exynos5())
746 return exynos5_get_uart_clk(dev_index);
747 else
748 return exynos4_get_uart_clk(dev_index);
Minkyu Kang008a3512011-01-24 15:22:23 +0900749}
Jaehoon Chung68a8cbf2011-05-17 21:19:17 +0000750
751void set_mmc_clk(int dev_index, unsigned int div)
752{
Chander Kashyap37bb6d82012-02-05 23:01:46 +0000753 if (cpu_is_exynos5())
754 exynos5_set_mmc_clk(dev_index, div);
755 else
756 exynos4_set_mmc_clk(dev_index, div);
Jaehoon Chung68a8cbf2011-05-17 21:19:17 +0000757}
Donghwa Lee37835d42012-04-05 19:36:12 +0000758
759unsigned long get_lcd_clk(void)
760{
761 if (cpu_is_exynos4())
762 return exynos4_get_lcd_clk();
763 else
Donghwa Lee2c5cd252012-07-02 01:15:49 +0000764 return exynos5_get_lcd_clk();
Donghwa Lee37835d42012-04-05 19:36:12 +0000765}
766
767void set_lcd_clk(void)
768{
769 if (cpu_is_exynos4())
770 exynos4_set_lcd_clk();
Donghwa Lee2c5cd252012-07-02 01:15:49 +0000771 else
772 exynos5_set_lcd_clk();
Donghwa Lee37835d42012-04-05 19:36:12 +0000773}
774
775void set_mipi_clk(void)
776{
777 if (cpu_is_exynos4())
778 exynos4_set_mipi_clk();
779}