1 /* linux/arch/arm/mach-s5pv310/clock.c
3 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com/
6 * S5PV310 - Clock support
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/kernel.h>
14 #include <linux/err.h>
17 #include <plat/cpu-freq.h>
18 #include <plat/clock.h>
21 #include <plat/devs.h>
22 #include <plat/s5p-clock.h>
23 #include <plat/clock-clksrc.h>
24 #include <plat/sysmmu.h>
27 #include <mach/regs-clock.h>
28 #include <mach/regs-audss.h>
30 static struct clk clk_sclk_hdmi27m = {
31 .name = "sclk_hdmi27m",
36 static struct clk clk_sclk_hdmiphy = {
37 .name = "sclk_hdmiphy",
41 static struct clk clk_sclk_usbphy0 = {
42 .name = "sclk_usbphy0",
47 static struct clk clk_sclk_usbphy1 = {
48 .name = "sclk_usbphy1",
52 static struct clk clk_audiocdclk0 = {
57 static struct clk clk_audiocdclk1 = {
62 static struct clk clk_audiocdclk2 = {
67 static struct clk clk_spdifcdclk = {
72 static int s5pv310_clk_ip_g3d_ctrl(struct clk *clk, int enable)
74 return s5p_gatectrl(S5P_CLKGATE_IP_G3D, clk, enable);
77 static int s5pv310_clksrc_mask_top_ctrl(struct clk *clk, int enable)
79 return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
82 static int s5pv310_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
84 return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable);
87 static int s5pv310_clk_ip_mfc_ctrl(struct clk *clk, int enable)
89 return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
92 static int s5pv310_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
94 return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
97 static int s5pv310_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
99 return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable);
102 static int s5pv310_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
104 return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
107 static int s5pv310_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
109 return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable);
112 static int s5pv310_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
114 return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable);
117 static int s5pv310_clksrc_mask_tv_ctrl(struct clk *clk, int enable)
119 return s5p_gatectrl(S5P_CLKSRC_MASK_TV, clk, enable);
122 static int s5pv310_clk_ip_cam_ctrl(struct clk *clk, int enable)
124 return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
127 static int s5pv310_clk_ip_tv_ctrl(struct clk *clk, int enable)
129 return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
132 static int s5pv310_clk_ip_image_ctrl(struct clk *clk, int enable)
134 return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
137 static int s5pv310_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
139 return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
142 static int s5pv310_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
144 return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
147 static int s5pv310_clk_ip_fsys_ctrl(struct clk *clk, int enable)
149 return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
152 static int s5pv310_clk_ip_gps_ctrl(struct clk *clk, int enable)
154 return s5p_gatectrl(S5P_CLKGATE_IP_GPS, clk, enable);
157 static int s5pv310_clk_ip_peril_ctrl(struct clk *clk, int enable)
159 return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
162 static int s5pv310_clk_ip_perir_ctrl(struct clk *clk, int enable)
164 return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
167 static int s5pv310_clk_ip_leftbus_ctrl(struct clk *clk, int enable)
169 return s5p_gatectrl(S5P_CLKGATE_IP_LEFTBUS, clk, enable);
172 static int s5pv310_clk_ip_rightbus_ctrl(struct clk *clk, int enable)
174 return s5p_gatectrl(S5P_CLKGATE_IP_RIGHTBUS, clk, enable);
177 static int s5pv310_clksrc_mask_maudio_ctrl(struct clk *clk, int enable)
179 return s5p_gatectrl(S5P_CLKSRC_MASK_MAUDIO, clk, enable);
182 static int s5pv310_clk_audss_ctrl(struct clk *clk, int enable)
184 return s5p_gatectrl(S5P_CLKGATE_AUDSS, clk, enable);
187 static int s5pv310_clk_epll_ctrl(struct clk *clk, int enable)
189 return s5p_gatectrl(S5P_EPLL_CON0, clk, enable);
192 static int s5pv310_clk_vpll_ctrl(struct clk *clk, int enable)
194 return s5p_gatectrl(S5P_VPLL_CON0, clk, enable);
198 /* Core list of CMU_CPU side */
200 static struct clksrc_clk clk_mout_apll = {
205 .sources = &clk_src_apll,
206 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
209 static struct clksrc_clk clk_sclk_apll = {
213 .parent = &clk_mout_apll.clk,
215 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
218 static struct clksrc_clk clk_mout_epll = {
222 .parent = &clk_fout_epll,
224 .sources = &clk_src_epll,
225 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
228 static struct clksrc_clk clk_mout_mpll = {
233 .sources = &clk_src_mpll,
234 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 8, .size = 1 },
237 static struct clk *clkset_moutcore_list[] = {
238 [0] = &clk_mout_apll.clk,
239 [1] = &clk_mout_mpll.clk,
242 static struct clksrc_sources clkset_moutcore = {
243 .sources = clkset_moutcore_list,
244 .nr_sources = ARRAY_SIZE(clkset_moutcore_list),
247 static struct clksrc_clk clk_moutcore = {
252 .sources = &clkset_moutcore,
253 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 16, .size = 1 },
256 static struct clksrc_clk clk_coreclk = {
260 .parent = &clk_moutcore.clk,
262 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 0, .size = 3 },
265 static struct clksrc_clk clk_armclk = {
269 .parent = &clk_coreclk.clk,
273 static struct clksrc_clk clk_aclk_corem0 = {
275 .name = "aclk_corem0",
277 .parent = &clk_coreclk.clk,
279 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
282 static struct clksrc_clk clk_aclk_cores = {
284 .name = "aclk_cores",
286 .parent = &clk_coreclk.clk,
288 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
291 static struct clksrc_clk clk_aclk_corem1 = {
293 .name = "aclk_corem1",
295 .parent = &clk_coreclk.clk,
297 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 8, .size = 3 },
300 static struct clksrc_clk clk_periphclk = {
304 .parent = &clk_coreclk.clk,
306 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 },
309 /* Core list of CMU_CORE side */
311 static struct clk *clkset_corebus_list[] = {
312 [0] = &clk_mout_mpll.clk,
313 [1] = &clk_sclk_apll.clk,
316 static struct clksrc_sources clkset_mout_corebus = {
317 .sources = clkset_corebus_list,
318 .nr_sources = ARRAY_SIZE(clkset_corebus_list),
321 static struct clksrc_clk clk_mout_corebus = {
323 .name = "mout_corebus",
326 .sources = &clkset_mout_corebus,
327 .reg_src = { .reg = S5P_CLKSRC_DMC, .shift = 4, .size = 1 },
330 static struct clksrc_clk clk_sclk_dmc = {
334 .parent = &clk_mout_corebus.clk,
336 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 12, .size = 3 },
339 static struct clksrc_clk clk_aclk_cored = {
341 .name = "aclk_cored",
343 .parent = &clk_sclk_dmc.clk,
345 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 16, .size = 3 },
348 static struct clksrc_clk clk_aclk_corep = {
350 .name = "aclk_corep",
352 .parent = &clk_aclk_cored.clk,
354 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 20, .size = 3 },
357 static struct clksrc_clk clk_aclk_acp = {
361 .parent = &clk_mout_corebus.clk,
363 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 0, .size = 3 },
366 static struct clksrc_clk clk_pclk_acp = {
370 .parent = &clk_aclk_acp.clk,
372 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 4, .size = 3 },
375 /* Core list of CMU_TOP side */
377 static struct clk *clkset_aclk_top_list[] = {
378 [0] = &clk_mout_mpll.clk,
379 [1] = &clk_sclk_apll.clk,
382 static struct clksrc_sources clkset_aclk = {
383 .sources = clkset_aclk_top_list,
384 .nr_sources = ARRAY_SIZE(clkset_aclk_top_list),
387 static struct clksrc_clk clk_aclk_200 = {
392 .sources = &clkset_aclk,
393 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 },
394 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 },
397 static struct clksrc_clk clk_aclk_100 = {
402 .sources = &clkset_aclk,
403 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 },
404 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 },
407 static struct clksrc_clk clk_aclk_160 = {
412 .sources = &clkset_aclk,
413 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 },
414 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
417 static struct clksrc_clk clk_aclk_133 = {
422 .sources = &clkset_aclk,
423 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 },
424 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 },
427 /* CMU_LEFT/RIGHTBUS side */
428 static struct clk *clkset_aclk_lrbus_list[] = {
429 [0] = &clk_mout_mpll.clk,
430 [1] = &clk_sclk_apll.clk,
433 static struct clksrc_sources clkset_aclk_lrbus = {
434 .sources = clkset_aclk_lrbus_list,
435 .nr_sources = ARRAY_SIZE(clkset_aclk_lrbus_list),
438 static struct clksrc_clk clk_aclk_gdl = {
443 .sources = &clkset_aclk_lrbus,
444 .reg_src = { .reg = S5P_CLKSRC_LEFTBUS, .shift = 0, .size = 1 },
445 .reg_div = { .reg = S5P_CLKDIV_LEFTBUS, .shift = 0, .size = 3 },
448 static struct clksrc_clk clk_aclk_gdr = {
453 .sources = &clkset_aclk_lrbus,
454 .reg_src = { .reg = S5P_CLKSRC_RIGHTBUS, .shift = 0, .size = 1 },
455 .reg_div = { .reg = S5P_CLKDIV_RIGHTBUS, .shift = 0, .size = 3 },
458 static struct clksrc_clk clk_aclk_gpl = {
462 .parent = &clk_aclk_gdl.clk,
464 .reg_div = { .reg = S5P_CLKDIV_LEFTBUS, .shift = 4, .size = 3 },
467 static struct clksrc_clk clk_aclk_gpr = {
471 .parent = &clk_aclk_gdr.clk,
473 .reg_div = { .reg = S5P_CLKDIV_RIGHTBUS, .shift = 4, .size = 3 },
476 static struct clk *clkset_vpllsrc_list[] = {
478 [1] = &clk_sclk_hdmi27m,
481 static struct clksrc_sources clkset_vpllsrc = {
482 .sources = clkset_vpllsrc_list,
483 .nr_sources = ARRAY_SIZE(clkset_vpllsrc_list),
486 static struct clksrc_clk clk_vpllsrc = {
490 .enable = s5pv310_clksrc_mask_top_ctrl,
493 .sources = &clkset_vpllsrc,
494 .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 },
497 static struct clk *clkset_sclk_vpll_list[] = {
498 [0] = &clk_vpllsrc.clk,
499 [1] = &clk_fout_vpll,
502 static struct clksrc_sources clkset_sclk_vpll = {
503 .sources = clkset_sclk_vpll_list,
504 .nr_sources = ARRAY_SIZE(clkset_sclk_vpll_list),
507 static struct clksrc_clk clk_sclk_vpll = {
512 .sources = &clkset_sclk_vpll,
513 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 8, .size = 1 },
516 /* --------------------------------------
517 * TV subsystem CLOCKS
518 * --------------------------------------
521 static struct clk *clkset_sclk_dac_list[] = {
522 [0] = &clk_sclk_vpll.clk,
523 [1] = &clk_sclk_hdmiphy,
526 static struct clksrc_sources clkset_sclk_dac = {
527 .sources = clkset_sclk_dac_list,
528 .nr_sources = ARRAY_SIZE(clkset_sclk_dac_list),
531 static struct clksrc_clk clk_sclk_dac = {
535 .enable = s5pv310_clksrc_mask_tv_ctrl,
538 .sources = &clkset_sclk_dac,
539 .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 8, .size = 1 },
542 static struct clksrc_clk clk_sclk_pixel = {
544 .name = "sclk_pixel",
546 .parent = &clk_sclk_vpll.clk,
548 .reg_div = { .reg = S5P_CLKDIV_TV, .shift = 0, .size = 4 },
551 static struct clk *clkset_sclk_hdmi_list[] = {
552 [0] = &clk_sclk_pixel.clk,
553 [1] = &clk_sclk_hdmiphy,
556 static struct clksrc_sources clkset_sclk_hdmi = {
557 .sources = clkset_sclk_hdmi_list,
558 .nr_sources = ARRAY_SIZE(clkset_sclk_hdmi_list),
561 static struct clksrc_clk clk_sclk_hdmi = {
565 .enable = s5pv310_clksrc_mask_tv_ctrl,
568 .sources = &clkset_sclk_hdmi,
569 .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 0, .size = 1 },
572 static struct clk *clkset_sclk_mixer_list[] = {
573 [0] = &clk_sclk_dac.clk,
574 [1] = &clk_sclk_hdmi.clk,
577 static struct clksrc_sources clkset_sclk_mixer = {
578 .sources = clkset_sclk_mixer_list,
579 .nr_sources = ARRAY_SIZE(clkset_sclk_mixer_list),
582 static struct clksrc_clk clk_sclk_mixer = {
584 .name = "sclk_mixer",
586 .enable = s5pv310_clksrc_mask_tv_ctrl,
589 .sources = &clkset_sclk_mixer,
590 .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 4, .size = 1 },
593 static struct clksrc_clk *sclk_tv[] = {
601 /* -------------------------------------------- */
603 static struct clk *clkset_mout_hpm_list[] = {
604 [0] = &clk_mout_apll.clk,
605 [1] = &clk_mout_mpll.clk,
608 static struct clksrc_sources clkset_sclk_hpm = {
609 .sources = clkset_mout_hpm_list,
610 .nr_sources = ARRAY_SIZE(clkset_mout_hpm_list),
613 static struct clksrc_clk clk_dout_copy = {
618 .sources = &clkset_sclk_hpm,
619 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 20, .size = 1 },
620 .reg_div = { .reg = S5P_CLKDIV_CPU1, .shift = 0, .size = 3 },
623 static struct clk *clkset_mout_g3d0_list[] = {
624 [0] = &clk_mout_mpll.clk,
625 [1] = &clk_sclk_apll.clk,
628 static struct clksrc_sources clkset_mout_g3d0 = {
629 .sources = clkset_mout_g3d0_list,
630 .nr_sources = ARRAY_SIZE(clkset_mout_g3d0_list),
633 static struct clksrc_clk clk_mout_g3d0 = {
638 .sources = &clkset_mout_g3d0,
639 .reg_src = { .reg = S5P_CLKSRC_G3D, .shift = 0, .size = 1 },
642 static struct clk *clkset_mout_g3d1_list[] = {
643 [0] = &clk_mout_epll.clk,
644 [1] = &clk_sclk_vpll.clk,
647 static struct clksrc_sources clkset_mout_g3d1 = {
648 .sources = clkset_mout_g3d1_list,
649 .nr_sources = ARRAY_SIZE(clkset_mout_g3d1_list),
652 static struct clksrc_clk clk_mout_g3d1 = {
657 .sources = &clkset_mout_g3d1,
658 .reg_src = { .reg = S5P_CLKSRC_G3D, .shift = 4, .size = 1 },
661 static struct clk *clkset_mout_g3d_list[] = {
662 [0] = &clk_mout_g3d0.clk,
663 [1] = &clk_mout_g3d1.clk,
666 static struct clksrc_sources clkset_mout_g3d = {
667 .sources = clkset_mout_g3d_list,
668 .nr_sources = ARRAY_SIZE(clkset_mout_g3d_list),
671 enum {CLK_SMMU_MDMA = 0};
672 static struct clk init_clocks_disable[] = {
676 .enable = s5pv310_clk_ip_image_ctrl,
681 .enable = s5pv310_clk_ip_leftbus_ctrl,
686 .enable = s5pv310_clk_ip_rightbus_ctrl,
691 .parent = &clk_aclk_160.clk,
692 .enable = s5pv310_clk_ip_cam_ctrl,
697 .parent = &clk_aclk_160.clk,
698 .enable = s5pv310_clk_ip_cam_ctrl,
703 .parent = &clk_aclk_160.clk,
704 .enable = s5pv310_clk_ip_cam_ctrl,
709 .parent = &clk_aclk_160.clk,
710 .enable = s5pv310_clk_ip_cam_ctrl,
715 .enable = s5pv310_clk_ip_cam_ctrl,
720 .enable = s5pv310_clk_ip_cam_ctrl,
725 .enable = s5pv310_clk_ip_cam_ctrl,
730 .enable = s5pv310_clk_ip_cam_ctrl,
735 .enable = s5pv310_clk_ip_cam_ctrl,
740 .enable = s5pv310_clk_ip_cam_ctrl,
745 .enable = s5pv310_clk_ip_cam_ctrl,
746 .ctrlbit = (1 << 10),
750 .enable = s5pv310_clk_ip_cam_ctrl,
751 .ctrlbit = (1 << 11),
755 .enable = s5pv310_clk_ip_cam_ctrl,
756 .ctrlbit = (1 << 12),
760 .enable = s5pv310_clk_ip_cam_ctrl,
761 .ctrlbit = (1 << 13),
765 .enable = s5pv310_clk_ip_cam_ctrl,
766 .ctrlbit = (1 << 14),
770 .enable = s5pv310_clk_ip_cam_ctrl,
771 .ctrlbit = (1 << 15),
775 .enable = s5pv310_clk_ip_cam_ctrl,
776 .ctrlbit = (1 << 16),
778 .name = "pixelasync_m0",
780 .enable = s5pv310_clk_ip_cam_ctrl,
781 .ctrlbit = (1 << 17),
783 .name = "pixelasync_m1",
785 .enable = s5pv310_clk_ip_cam_ctrl,
786 .ctrlbit = (1 << 18),
790 .enable = s5pv310_clk_ip_mfc_ctrl,
795 .enable = s5pv310_clk_ip_lcd1_ctrl,
800 .enable = s5pv310_clk_ip_lcd1_ctrl,
805 .enable = s5pv310_clk_ip_lcd1_ctrl,
810 .enable = s5pv310_clk_ip_lcd1_ctrl,
813 .name = "smmu_fimd1",
815 .enable = s5pv310_clk_ip_lcd1_ctrl,
818 .name = "ppmu_fimd1",
820 .enable = s5pv310_clk_ip_lcd1_ctrl,
825 .enable = s5pv310_clk_ip_peril_ctrl,
826 .ctrlbit = (1 << 20),
830 .enable = s5pv310_clk_ip_peril_ctrl,
831 .ctrlbit = (1 << 21),
835 .enable = s5pv310_clk_ip_peril_ctrl,
836 .ctrlbit = (1 << 22),
840 .enable = s5pv310_clk_ip_peril_ctrl,
841 .ctrlbit = (1 << 23),
845 .enable = s5pv310_clk_ip_fsys_ctrl,
850 .parent = &clk_aclk_133.clk,
851 .enable = s5pv310_clk_ip_fsys_ctrl,
856 .enable = s5pv310_clk_ip_fsys_ctrl,
861 .parent = &clk_aclk_133.clk,
862 .enable = s5pv310_clk_ip_fsys_ctrl,
867 .parent = &clk_aclk_133.clk,
868 .enable = s5pv310_clk_ip_fsys_ctrl,
873 .parent = &clk_aclk_133.clk,
874 .enable = s5pv310_clk_ip_fsys_ctrl,
879 .parent = &clk_aclk_133.clk,
880 .enable = s5pv310_clk_ip_fsys_ctrl,
885 .parent = &clk_aclk_133.clk,
886 .enable = s5pv310_clk_ip_fsys_ctrl,
891 .parent = &clk_aclk_133.clk,
892 .enable = s5pv310_clk_ip_fsys_ctrl,
893 .ctrlbit = (1 << 10),
897 .enable = s5pv310_clk_ip_fsys_ctrl ,
898 .ctrlbit = (1 << 11),
902 .enable = s5pv310_clk_ip_fsys_ctrl ,
903 .ctrlbit = (1 << 12),
907 .enable = s5pv310_clk_ip_fsys_ctrl,
908 .ctrlbit = (1 << 13),
912 .enable = s5pv310_clk_ip_fsys_ctrl,
913 .ctrlbit = (1 << 14),
917 .enable = s5pv310_clk_ip_fsys_ctrl,
918 .ctrlbit = (1 << 15),
922 .enable = s5pv310_clk_ip_fsys_ctrl,
923 .ctrlbit = (1 << 16),
927 .enable = s5pv310_clk_ip_fsys_ctrl,
928 .ctrlbit = (1 << 17),
932 .enable = s5pv310_clk_ip_fsys_ctrl,
933 .ctrlbit = (1 << 18),
937 .enable = s5pv310_clk_ip_perir_ctrl,
943 .enable = s5pv310_clk_ip_perir_ctrl,
948 .enable = s5pv310_clk_ip_perir_ctrl,
951 .name = "cmu_dmcpart",
953 .enable = s5pv310_clk_ip_perir_ctrl,
959 .enable = s5pv310_clk_ip_perir_ctrl,
964 .enable = s5pv310_clk_ip_perir_ctrl,
969 .enable = s5pv310_clk_ip_perir_ctrl,
974 .enable = s5pv310_clk_ip_perir_ctrl,
979 .enable = s5pv310_clk_ip_perir_ctrl,
984 .enable = s5pv310_clk_ip_perir_ctrl,
985 .ctrlbit = (1 << 10),
989 .enable = s5pv310_clk_ip_perir_ctrl,
990 .ctrlbit = (1 << 11),
994 .enable = s5pv310_clk_ip_perir_ctrl,
995 .ctrlbit = (1 << 12),
999 .parent = &clk_aclk_100.clk,
1000 .enable = s5pv310_clk_ip_perir_ctrl,
1001 .ctrlbit = (1 << 14),
1005 .enable = s5pv310_clk_ip_perir_ctrl,
1006 .ctrlbit = (1 << 15),
1010 .enable = s5pv310_clk_ip_perir_ctrl,
1011 .ctrlbit = (1 << 16),
1013 .name = "tmu_apbif",
1015 .enable = s5pv310_clk_ip_perir_ctrl,
1016 .ctrlbit = (1 << 17),
1020 .enable = s5pv310_clk_ip_peril_ctrl,
1021 .ctrlbit = (1 << 4),
1025 .enable = s5pv310_clk_ip_peril_ctrl,
1026 .ctrlbit = (1 << 5),
1030 .parent = &clk_aclk_100.clk,
1031 .enable = s5pv310_clk_ip_peril_ctrl,
1032 .ctrlbit = (1 << 6),
1036 .parent = &clk_aclk_100.clk,
1037 .enable = s5pv310_clk_ip_peril_ctrl,
1038 .ctrlbit = (1 << 7),
1042 .parent = &clk_aclk_100.clk,
1043 .enable = s5pv310_clk_ip_peril_ctrl,
1044 .ctrlbit = (1 << 8),
1048 .parent = &clk_aclk_100.clk,
1049 .enable = s5pv310_clk_ip_peril_ctrl,
1050 .ctrlbit = (1 << 9),
1054 .parent = &clk_aclk_100.clk,
1055 .enable = s5pv310_clk_ip_peril_ctrl,
1056 .ctrlbit = (1 << 10),
1060 .parent = &clk_aclk_100.clk,
1061 .enable = s5pv310_clk_ip_peril_ctrl,
1062 .ctrlbit = (1 << 11),
1066 .parent = &clk_aclk_100.clk,
1067 .enable = s5pv310_clk_ip_peril_ctrl,
1068 .ctrlbit = (1 << 12),
1072 .parent = &clk_aclk_100.clk,
1073 .enable = s5pv310_clk_ip_peril_ctrl,
1074 .ctrlbit = (1 << 13),
1078 .parent = &clk_aclk_100.clk,
1079 .enable = s5pv310_clk_ip_peril_ctrl,
1080 .ctrlbit = (1 << 14),
1084 .enable = s5pv310_clk_ip_peril_ctrl,
1085 .ctrlbit = (1 << 15),
1089 .enable = s5pv310_clk_ip_peril_ctrl,
1090 .ctrlbit = (1 << 16),
1094 .enable = s5pv310_clk_ip_peril_ctrl,
1095 .ctrlbit = (1 << 17),
1099 .enable = s5pv310_clk_ip_peril_ctrl,
1100 .ctrlbit = (1 << 18),
1104 .enable = s5pv310_clk_ip_peril_ctrl,
1105 .ctrlbit = (1 << 25),
1109 .enable = s5pv310_clk_ip_peril_ctrl,
1110 .ctrlbit = (1 << 26),
1114 .parent = &clk_aclk_100.clk,
1115 .enable = s5pv310_clk_ip_peril_ctrl,
1116 .ctrlbit = (1 << 27),
1120 .parent = &clk_aclk_100.clk,
1121 .enable = s5pv310_clk_ip_peril_ctrl,
1122 .ctrlbit = (1 << 28),
1126 .enable = s5pv310_clk_ip_gps_ctrl,
1127 .ctrlbit = (1 << 0),
1131 .enable = s5pv310_clk_audss_ctrl,
1132 .ctrlbit = (1 << 3) | (1 << 2),
1136 .enable = s5pv310_clk_audss_ctrl,
1137 .ctrlbit = (1 << 5) | (1 << 4),
1141 .enable = s5pv310_clk_audss_ctrl,
1142 .ctrlbit = (1 << 8) | (1 << 7) | (1 << 6) | (1 << 0),
1146 .enable = s5pv310_clk_ip_gps_ctrl,
1147 .ctrlbit = (1 << 1),
1151 .enable = s5pv310_clk_ip_g3d_ctrl,
1152 .ctrlbit = (1 << 0),
1156 .enable = s5pv310_clk_ip_g3d_ctrl,
1157 .ctrlbit = (1 << 1), /* No more exist in EVT1 ? */
1161 .enable = s5pv310_clk_ip_g3d_ctrl,
1162 .ctrlbit = (1 << 2),
1166 .enable = s5pv310_clk_ip_image_ctrl,
1167 .ctrlbit = (1 << 0),
1171 .enable = s5pv310_clk_ip_image_ctrl,
1172 .ctrlbit = (1 << 1),
1174 .name = "smmu_fimg2d",
1176 .enable = s5pv310_clk_ip_image_ctrl,
1177 .ctrlbit = (1 << 3),
1179 .name = "smmu_rotator",
1181 .enable = s5pv310_clk_ip_image_ctrl,
1182 .ctrlbit = (1 << 4),
1186 .enable = s5pv310_clk_ip_image_ctrl,
1187 .ctrlbit = (1 << 6),
1189 .name = "qe_rotator",
1191 .enable = s5pv310_clk_ip_image_ctrl,
1192 .ctrlbit = (1 << 7),
1194 #if 0 /* Controlled by dma:0 clock */
1197 .enable = s5pv310_clk_ip_image_ctrl,
1198 .ctrlbit = (1 << 8),
1201 .name = "ppmuimage",
1203 .enable = s5pv310_clk_ip_image_ctrl,
1204 .ctrlbit = (1 << 9),
1206 .name = "ppmu_fimd0",
1208 .enable = s5pv310_clk_ip_lcd0_ctrl,
1209 .ctrlbit = (1 << 5),
1213 .enable = s5pv310_clk_ip_cam_ctrl,
1214 .ctrlbit = (1 << 7),
1218 .enable = s5pv310_clk_ip_cam_ctrl,
1219 .ctrlbit = (1 << 8),
1223 .enable = s5pv310_clk_ip_cam_ctrl,
1224 .ctrlbit = (1 << 9),
1228 .enable = s5pv310_clk_ip_cam_ctrl,
1229 .ctrlbit = (1 << 10),
1233 .enable = s5pv310_clk_ip_cam_ctrl,
1234 .ctrlbit = (1 << 11),
1238 .enable = s5pv310_clk_ip_lcd0_ctrl,
1239 .ctrlbit = (1 << 4),
1243 .enable = s5pv310_clk_ip_lcd1_ctrl,
1244 .ctrlbit = (1 << 4),
1248 .enable = s5pv310_clk_ip_fsys_ctrl,
1249 .ctrlbit = (1 << 18),
1253 .enable = s5pv310_clk_ip_image_ctrl,
1254 .ctrlbit = (1 << 3),
1257 .id = SYSMMU_ROTATOR,
1258 .enable = s5pv310_clk_ip_image_ctrl,
1259 .ctrlbit = (1 << 4),
1263 .enable = s5pv310_clk_ip_tv_ctrl,
1264 .ctrlbit = (1 << 4),
1268 .enable = s5pv310_clk_ip_mfc_ctrl,
1269 .ctrlbit = (1 << 1),
1273 .enable = s5pv310_clk_ip_mfc_ctrl,
1274 .ctrlbit = (1 << 2),
1276 .name = "ppmumfc_l",
1278 .enable = s5pv310_clk_ip_mfc_ctrl,
1279 .ctrlbit = (1 << 3),
1281 .name = "ppmumfc_r",
1283 .enable = s5pv310_clk_ip_mfc_ctrl,
1284 .ctrlbit = (1 << 4),
1288 .enable = s5pv310_clk_ip_lcd0_ctrl,
1289 .ctrlbit = (1 << 3),
1291 .name = "fimd_lite0",
1293 .enable = s5pv310_clk_ip_lcd0_ctrl,
1294 .ctrlbit = (1 << 2),
1298 .enable = s5pv310_clk_ip_lcd0_ctrl,
1299 .ctrlbit = (1 << 1),
1303 .enable = s5pv310_clk_ip_tv_ctrl,
1304 .ctrlbit = (1 << 0),
1308 .enable = s5pv310_clk_ip_tv_ctrl,
1309 .ctrlbit = (1 << 1),
1313 .enable = s5pv310_clk_ip_tv_ctrl,
1314 .ctrlbit = (1 << 2),
1318 .enable = s5pv310_clk_ip_tv_ctrl,
1319 .ctrlbit = (1 << 3),
1323 .enable = s5pv310_clk_ip_tv_ctrl,
1324 .ctrlbit = (1 << 4),
1328 .enable = s5pv310_clk_ip_tv_ctrl,
1329 .ctrlbit = (1 << 5),
1333 static struct clk init_dmaclocks[] = {
1337 .enable = s5pv310_clk_ip_image_ctrl,
1338 .parent = &init_clocks_disable[CLK_SMMU_MDMA],
1339 .ctrlbit = ((1 << 8) | (1 << 2)),
1343 .enable = s5pv310_clk_ip_fsys_ctrl,
1344 .ctrlbit = (1 << 0),
1348 .parent = &init_dmaclocks[1],
1349 .enable = s5pv310_clk_ip_fsys_ctrl,
1350 .ctrlbit = (1 << 1),
1354 static struct clk *clkset_sclk_audio0_list[] = {
1355 [0] = &clk_audiocdclk0,
1357 [2] = &clk_sclk_hdmi27m,
1358 [3] = &clk_sclk_usbphy0,
1361 [6] = &clk_mout_mpll.clk,
1362 [7] = &clk_mout_epll.clk,
1363 [8] = &clk_sclk_vpll.clk,
1366 static struct clksrc_sources clkset_sclk_audio0 = {
1367 .sources = clkset_sclk_audio0_list,
1368 .nr_sources = ARRAY_SIZE(clkset_sclk_audio0_list),
1371 static struct clksrc_clk clk_sclk_audio0 = {
1373 .name = "audio-bus",
1375 .enable = s5pv310_clksrc_mask_maudio_ctrl,
1376 .ctrlbit = (1 << 0),
1378 .sources = &clkset_sclk_audio0,
1379 .reg_src = { .reg = S5P_CLKSRC_MAUDIO, .shift = 0, .size = 4 },
1380 .reg_div = { .reg = S5P_CLKDIV_MAUDIO, .shift = 0, .size = 4 },
1383 static struct clk *clkset_mout_audss_list[] = {
1388 static struct clksrc_sources clkset_mout_audss = {
1389 .sources = clkset_mout_audss_list,
1390 .nr_sources = ARRAY_SIZE(clkset_mout_audss_list),
1393 static struct clksrc_clk clk_mout_audss = {
1395 .name = "mout_audss",
1398 .sources = &clkset_mout_audss,
1399 .reg_src = { .reg = S5P_CLKSRC_AUDSS, .shift = 0, .size = 1 },
1402 static struct clk *clkset_sclk_audss_list[] = {
1403 &clk_mout_audss.clk,
1405 &clk_sclk_audio0.clk,
1408 static struct clksrc_sources clkset_sclk_audss = {
1409 .sources = clkset_sclk_audss_list,
1410 .nr_sources = ARRAY_SIZE(clkset_sclk_audss_list),
1413 static struct clksrc_clk clk_sclk_audss = {
1415 .name = "audio-bus",
1417 .enable = s5pv310_clk_audss_ctrl,
1418 .ctrlbit = S5P_AUDSS_CLKGATE_I2SBUS,
1420 .sources = &clkset_sclk_audss,
1421 .reg_src = { .reg = S5P_CLKSRC_AUDSS, .shift = 2, .size = 2 },
1422 .reg_div = { .reg = S5P_CLKDIV_AUDSS, .shift = 4, .size = 8 },
1425 static struct clk *clkset_sclk_audio1_list[] = {
1426 [0] = &clk_audiocdclk1,
1428 [2] = &clk_sclk_hdmi27m,
1429 [3] = &clk_sclk_usbphy0,
1432 [6] = &clk_mout_mpll.clk,
1433 [7] = &clk_mout_epll.clk,
1434 [8] = &clk_sclk_vpll.clk,
1437 static struct clksrc_sources clkset_sclk_audio1 = {
1438 .sources = clkset_sclk_audio1_list,
1439 .nr_sources = ARRAY_SIZE(clkset_sclk_audio1_list),
1442 static struct clksrc_clk clk_sclk_audio1 = {
1444 .name = "audio-bus",
1446 .enable = s5pv310_clksrc_mask_peril1_ctrl,
1447 .ctrlbit = (1 << 0),
1449 .sources = &clkset_sclk_audio1,
1450 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 0, .size = 4 },
1451 .reg_div = { .reg = S5P_CLKDIV_PERIL4, .shift = 4, .size = 8 },
1454 static struct clk *clkset_sclk_audio2_list[] = {
1455 [0] = &clk_audiocdclk2,
1457 [2] = &clk_sclk_hdmi27m,
1458 [3] = &clk_sclk_usbphy0,
1461 [6] = &clk_mout_mpll.clk,
1462 [7] = &clk_mout_epll.clk,
1463 [8] = &clk_sclk_vpll.clk,
1466 static struct clksrc_sources clkset_sclk_audio2 = {
1467 .sources = clkset_sclk_audio2_list,
1468 .nr_sources = ARRAY_SIZE(clkset_sclk_audio2_list),
1471 static struct clksrc_clk clk_sclk_audio2 = {
1473 .name = "audio-bus",
1475 .enable = s5pv310_clksrc_mask_peril1_ctrl,
1476 .ctrlbit = (1 << 4),
1478 .sources = &clkset_sclk_audio2,
1479 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 4, .size = 4 },
1480 .reg_div = { .reg = S5P_CLKDIV_PERIL4, .shift = 16, .size = 4 },
1483 static struct clk *clkset_sclk_spdif_list[] = {
1484 [0] = &clk_sclk_audio0.clk,
1485 [1] = &clk_sclk_audio1.clk,
1486 [2] = &clk_sclk_audio2.clk,
1487 [3] = &clk_spdifcdclk,
1490 static struct clksrc_sources clkset_sclk_spdif = {
1491 .sources = clkset_sclk_spdif_list,
1492 .nr_sources = ARRAY_SIZE(clkset_sclk_spdif_list),
1495 static struct clksrc_clk clk_sclk_spdif = {
1497 .name = "sclk_spdif",
1499 .enable = s5pv310_clksrc_mask_peril1_ctrl,
1500 .ctrlbit = (1 << 8),
1502 .sources = &clkset_sclk_spdif,
1503 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 8, .size = 2 },
1506 static struct clk init_clocks[] = {
1510 .enable = s5pv310_clk_ip_peril_ctrl,
1511 .ctrlbit = (1 << 0),
1515 .enable = s5pv310_clk_ip_peril_ctrl,
1516 .ctrlbit = (1 << 1),
1520 .enable = s5pv310_clk_ip_peril_ctrl,
1521 .ctrlbit = (1 << 2),
1525 .enable = s5pv310_clk_ip_peril_ctrl,
1526 .ctrlbit = (1 << 3),
1530 .enable = s5pv310_clk_ip_perir_ctrl,
1531 .ctrlbit = (1 << 13),
1535 .enable = s5pv310_clk_ip_lcd0_ctrl,
1536 .ctrlbit = (1 << 0),
1540 .parent = &clk_aclk_100.clk,
1541 .enable = s5pv310_clk_ip_peril_ctrl,
1542 .ctrlbit = (1 << 24),
1546 static struct clk *clkset_group_list[] = {
1549 [2] = &clk_sclk_hdmi27m,
1550 [3] = &clk_sclk_usbphy0,
1551 [4] = &clk_sclk_usbphy1,
1552 [5] = &clk_sclk_hdmiphy,
1553 [6] = &clk_mout_mpll.clk,
1554 [7] = &clk_mout_epll.clk,
1555 [8] = &clk_sclk_vpll.clk,
1558 static struct clksrc_sources clkset_group = {
1559 .sources = clkset_group_list,
1560 .nr_sources = ARRAY_SIZE(clkset_group_list),
1563 static struct clk *clkset_mout_mfc0_list[] = {
1564 [0] = &clk_mout_mpll.clk,
1565 [1] = &clk_sclk_apll.clk,
1568 static struct clksrc_sources clkset_mout_mfc0 = {
1569 .sources = clkset_mout_mfc0_list,
1570 .nr_sources = ARRAY_SIZE(clkset_mout_mfc0_list),
1573 static struct clksrc_clk clk_mout_mfc0 = {
1575 .name = "mout_mfc0",
1578 .sources = &clkset_mout_mfc0,
1579 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 0, .size = 1 },
1582 static struct clk *clkset_mout_mfc1_list[] = {
1583 [0] = &clk_mout_epll.clk,
1584 [1] = &clk_sclk_vpll.clk,
1587 static struct clksrc_sources clkset_mout_mfc1 = {
1588 .sources = clkset_mout_mfc1_list,
1589 .nr_sources = ARRAY_SIZE(clkset_mout_mfc1_list),
1592 static struct clksrc_clk clk_mout_mfc1 = {
1594 .name = "mout_mfc1",
1597 .sources = &clkset_mout_mfc1,
1598 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 4, .size = 1 },
1601 static struct clk *clkset_mout_mfc_list[] = {
1602 [0] = &clk_mout_mfc0.clk,
1603 [1] = &clk_mout_mfc1.clk,
1606 static struct clksrc_sources clkset_mout_mfc = {
1607 .sources = clkset_mout_mfc_list,
1608 .nr_sources = ARRAY_SIZE(clkset_mout_mfc_list),
1611 static struct clk *clkset_mout_g2d0_list[] = {
1612 [0] = &clk_mout_mpll.clk,
1613 [1] = &clk_sclk_apll.clk,
1616 static struct clksrc_sources clkset_mout_g2d0 = {
1617 .sources = clkset_mout_g2d0_list,
1618 .nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list),
1621 static struct clksrc_clk clk_mout_g2d0 = {
1623 .name = "mout_g2d0",
1626 .sources = &clkset_mout_g2d0,
1627 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 },
1630 static struct clk *clkset_mout_g2d1_list[] = {
1631 [0] = &clk_mout_epll.clk,
1632 [1] = &clk_sclk_vpll.clk,
1635 static struct clksrc_sources clkset_mout_g2d1 = {
1636 .sources = clkset_mout_g2d1_list,
1637 .nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list),
1640 static struct clksrc_clk clk_mout_g2d1 = {
1642 .name = "mout_g2d1",
1645 .sources = &clkset_mout_g2d1,
1646 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 },
1649 static struct clk *clkset_mout_g2d_list[] = {
1650 [0] = &clk_mout_g2d0.clk,
1651 [1] = &clk_mout_g2d1.clk,
1654 static struct clksrc_sources clkset_mout_g2d = {
1655 .sources = clkset_mout_g2d_list,
1656 .nr_sources = ARRAY_SIZE(clkset_mout_g2d_list),
1659 static struct clksrc_clk clk_dout_mmc0 = {
1661 .name = "dout_mmc0",
1664 .sources = &clkset_group,
1665 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 },
1666 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 },
1669 static struct clksrc_clk clk_dout_mmc1 = {
1671 .name = "dout_mmc1",
1674 .sources = &clkset_group,
1675 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 },
1676 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 },
1679 static struct clksrc_clk clk_dout_mmc2 = {
1681 .name = "dout_mmc2",
1684 .sources = &clkset_group,
1685 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 },
1686 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 },
1689 static struct clksrc_clk clk_dout_mmc3 = {
1691 .name = "dout_mmc3",
1694 .sources = &clkset_group,
1695 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 },
1696 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 },
1699 static struct clksrc_clk clk_dout_mmc4 = {
1701 .name = "dout_mmc4",
1704 .sources = &clkset_group,
1705 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 },
1706 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 },
1709 static struct clksrc_clk clk_sclk_mfc = {
1714 .sources = &clkset_mout_mfc,
1715 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 8, .size = 1 },
1716 .reg_div = { .reg = S5P_CLKDIV_MFC, .shift = 0, .size = 4 },
1719 static struct clksrc_clk clk_sclk_g3d = {
1724 .sources = &clkset_mout_g3d,
1725 .reg_src = { .reg = S5P_CLKSRC_G3D, .shift = 8, .size = 1 },
1726 .reg_div = { .reg = S5P_CLKDIV_G3D, .shift = 0, .size = 4 },
1729 static struct clksrc_clk clk_sclk_g2d = {
1731 .name = "sclk_fimg2d",
1734 .sources = &clkset_mout_g2d,
1735 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 },
1736 .reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 },
1739 static struct clksrc_clk clk_cam_a_clk = {
1743 .enable = s5pv310_clksrc_mask_cam_ctrl,
1744 .ctrlbit = (1 << 16),
1746 .sources = &clkset_group,
1747 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
1748 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
1751 static struct clksrc_clk clk_cam_b_clk = {
1755 .enable = s5pv310_clksrc_mask_cam_ctrl,
1756 .ctrlbit = (1 << 20),
1758 .sources = &clkset_group,
1759 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 },
1760 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 },
1765 static struct clk *clkset_cmu_dmc_list[] = {
1766 [0] = &clk_aclk_cored.clk,
1767 [1] = &clk_aclk_corep.clk,
1768 [2] = &clk_aclk_acp.clk,
1769 [3] = &clk_pclk_acp.clk,
1770 [4] = &clk_sclk_dmc.clk,
1771 [5] = NULL, /* SCLK_DPHY */
1772 [6] = NULL, /* SCLK_CORE_TIMERS */
1773 [7] = NULL, /* SCLK_PWI */
1775 static struct clksrc_sources clkset_cmu_dmc = {
1776 .sources = clkset_cmu_dmc_list,
1777 .nr_sources = ARRAY_SIZE(clkset_cmu_dmc_list),
1779 static struct clksrc_clk clk_cmu_dmc = {
1784 .sources = &clkset_cmu_dmc,
1785 .reg_src = { .reg = S5P_CLKOUT_CMU_DMC, .shift = 0, .size = 5 },
1786 .reg_div = { .reg = S5P_CLKOUT_CMU_DMC, .shift = 8, .size = 6 },
1789 static struct clk *clkset_cmu_top_list[] = {
1790 [0] = &clk_fout_epll,
1791 [1] = &clk_fout_vpll,
1792 [2] = &clk_sclk_hdmi27m,
1793 [3] = &clk_sclk_usbphy0,
1794 [4] = &clk_sclk_usbphy1,
1795 [5] = &clk_sclk_hdmiphy,
1796 [6] = &clk_audiocdclk0,
1797 [7] = &clk_audiocdclk1,
1798 [8] = &clk_audiocdclk2,
1799 [9] = &clk_spdifcdclk,
1800 [10] = &clk_aclk_160.clk,
1801 [11] = &clk_aclk_133.clk,
1802 [12] = &clk_aclk_200.clk,
1803 [13] = &clk_aclk_100.clk,
1804 [14] = &clk_sclk_mfc.clk,
1805 [15] = &clk_sclk_g3d.clk,
1806 [16] = &clk_sclk_g2d.clk,
1807 [17] = &clk_cam_a_clk.clk,
1808 [18] = &clk_cam_b_clk.clk,
1809 [19] = NULL, /* S_RXBYTECLKHS0_2L */
1810 [20] = NULL, /* S_RXBYTECLKHS0_4L */
1811 [21] = NULL, /* RX_HALF_BYTE_CLK_CSIS0 */
1812 [22] = NULL, /* RX_HALF_BYTE_CLK_CSIS1 */
1814 static struct clksrc_sources clkset_cmu_top = {
1815 .sources = clkset_cmu_top_list,
1816 .nr_sources = ARRAY_SIZE(clkset_cmu_top_list),
1818 static struct clksrc_clk clk_cmu_top = {
1823 .sources = &clkset_cmu_top,
1824 .reg_src = { .reg = S5P_CLKOUT_CMU_TOP, .shift = 0, .size = 5 },
1825 .reg_div = { .reg = S5P_CLKOUT_CMU_TOP, .shift = 8, .size = 6 },
1828 static struct clk *clkset_cmu_leftbus_list[] = {
1829 [0] = NULL, /* SCLK_MPLL/2 */
1830 [1] = NULL, /* SCLK_APLL/2 */
1831 [2] = &clk_aclk_gdl.clk,
1832 [3] = &clk_aclk_gpl.clk,
1834 static struct clksrc_sources clkset_cmu_leftbus = {
1835 .sources = clkset_cmu_leftbus_list,
1836 .nr_sources = ARRAY_SIZE(clkset_cmu_leftbus_list),
1838 static struct clksrc_clk clk_cmu_leftbus = {
1840 .name = "cmu_leftbus",
1843 .sources = &clkset_cmu_leftbus,
1844 .reg_src = { .reg = S5P_CLKOUT_CMU_LEFTBUS, .shift = 0, .size = 5 },
1845 .reg_div = { .reg = S5P_CLKOUT_CMU_LEFTBUS, .shift = 8, .size = 6 },
1848 static struct clk *clkset_cmu_rightbus_list[] = {
1849 [0] = NULL, /* SCLK_MPLL/2 */
1850 [1] = NULL, /* SCLK_APLL/2 */
1851 [2] = &clk_aclk_gdr.clk,
1852 [3] = &clk_aclk_gpr.clk,
1854 static struct clksrc_sources clkset_cmu_rightbus = {
1855 .sources = clkset_cmu_rightbus_list,
1856 .nr_sources = ARRAY_SIZE(clkset_cmu_rightbus_list),
1858 static struct clksrc_clk clk_cmu_rightbus = {
1860 .name = "cmu_rightbus",
1863 .sources = &clkset_cmu_rightbus,
1864 .reg_src = { .reg = S5P_CLKOUT_CMU_RIGHTBUS, .shift = 0, .size = 5 },
1865 .reg_div = { .reg = S5P_CLKOUT_CMU_RIGHTBUS, .shift = 8, .size = 6 },
1868 static struct clk *clkset_cmu_cpu_list[] = {
1869 [0] = NULL, /* APLL_FOUT/2 */
1870 [1] = NULL, /* APLL_VCOOUT/4 */
1871 [2] = NULL, /* MPLL_FOUT/2 */
1872 [3] = NULL, /* MPLL_VCOOUT/4 */
1873 [4] = NULL, /* ARMCLK/2 */
1874 [5] = &clk_aclk_corem0.clk,
1875 [6] = &clk_aclk_corem1.clk,
1876 [7] = &clk_aclk_cores.clk,
1877 [8] = NULL, /* ATCLK (ATB) (CLKDIV_CPU) */
1878 [9] = &clk_periphclk.clk,
1879 [10] = NULL, /* PCLK_DBG (CLKDIV_CPU) */
1880 [11] = NULL, /* SCLK_HPM (CLKDIV_CPU) */
1882 static struct clksrc_sources clkset_cmu_cpu = {
1883 .sources = clkset_cmu_cpu_list,
1884 .nr_sources = ARRAY_SIZE(clkset_cmu_cpu_list),
1886 static struct clksrc_clk clk_cmu_cpu = {
1891 .sources = &clkset_cmu_cpu,
1892 .reg_src = { .reg = S5P_CLKOUT_CMU_CPU, .shift = 0, .size = 5 },
1893 .reg_div = { .reg = S5P_CLKOUT_CMU_CPU, .shift = 8, .size = 6 },
1896 static struct clk *clkset_xclkout_list[] = {
1897 [0] = &clk_cmu_dmc.clk,
1898 [1] = &clk_cmu_top.clk,
1899 [2] = &clk_cmu_leftbus.clk,
1900 [3] = &clk_cmu_rightbus.clk,
1901 [4] = &clk_cmu_cpu.clk,
1902 [5] = NULL, /* N/A */
1903 [6] = NULL, /* N/A */
1904 [7] = NULL, /* N/A */
1905 [8] = NULL, /* XXTI */
1907 [10] = NULL, /* N/A */
1908 [11] = NULL, /* N/A */
1909 [12] = NULL, /* RTC_TICK_SRC */
1910 [13] = NULL, /* RTCCLK */
1912 static struct clksrc_sources clkset_xclkout = {
1913 .sources = clkset_xclkout_list,
1914 .nr_sources = ARRAY_SIZE(clkset_xclkout_list),
1916 static struct clksrc_clk clk_xclkout = {
1921 .sources = &clkset_xclkout,
1922 .reg_src = { .reg = S5P_PMU_DEBUG, .shift = 8, .size = 4 },
1925 static struct clksrc_clk clksrcs[] = {
1930 .enable = s5pv310_clksrc_mask_peril0_ctrl,
1931 .ctrlbit = (1 << 0),
1933 .sources = &clkset_group,
1934 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 },
1935 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 },
1940 .enable = s5pv310_clksrc_mask_peril0_ctrl,
1941 .ctrlbit = (1 << 4),
1943 .sources = &clkset_group,
1944 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 },
1945 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 },
1950 .enable = s5pv310_clksrc_mask_peril0_ctrl,
1951 .ctrlbit = (1 << 8),
1953 .sources = &clkset_group,
1954 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 },
1955 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 },
1960 .enable = s5pv310_clksrc_mask_peril0_ctrl,
1961 .ctrlbit = (1 << 12),
1963 .sources = &clkset_group,
1964 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 },
1965 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
1970 .enable = s5pv310_clksrc_mask_peril0_ctrl,
1971 .ctrlbit = (1 << 16),
1973 .sources = &clkset_group,
1974 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 16, .size = 4 },
1975 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 16, .size = 4 },
1980 .enable = s5pv310_clksrc_mask_peril0_ctrl,
1981 .ctrlbit = (1 << 24),
1982 /* All the three regs are not in the user manual. */
1984 .sources = &clkset_group,
1985 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 },
1986 .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 },
1989 .name = "sclk_csis",
1991 .enable = s5pv310_clksrc_mask_cam_ctrl,
1992 .ctrlbit = (1 << 24),
1994 .sources = &clkset_group,
1995 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 },
1996 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 },
1999 .name = "sclk_csis",
2001 .enable = s5pv310_clksrc_mask_cam_ctrl,
2002 .ctrlbit = (1 << 28),
2004 .sources = &clkset_group,
2005 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 },
2006 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
2009 .name = "sclk_cam0",
2011 .enable = s5pv310_clksrc_mask_cam_ctrl,
2012 .ctrlbit = (1 << 16),
2014 .sources = &clkset_group,
2015 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
2016 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
2019 .name = "sclk_fimc",
2021 .enable = s5pv310_clksrc_mask_cam_ctrl,
2022 .ctrlbit = (1 << 0),
2024 .sources = &clkset_group,
2025 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 },
2026 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 },
2029 .name = "sclk_fimc",
2031 .enable = s5pv310_clksrc_mask_cam_ctrl,
2032 .ctrlbit = (1 << 4),
2034 .sources = &clkset_group,
2035 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 },
2036 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 },
2039 .name = "sclk_fimc",
2041 .enable = s5pv310_clksrc_mask_cam_ctrl,
2042 .ctrlbit = (1 << 8),
2044 .sources = &clkset_group,
2045 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 },
2046 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 },
2049 .name = "sclk_fimc",
2051 .enable = s5pv310_clksrc_mask_cam_ctrl,
2052 .ctrlbit = (1 << 12),
2054 .sources = &clkset_group,
2055 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 },
2056 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 },
2059 .name = "sclk_fimd0",
2061 .enable = s5pv310_clksrc_mask_lcd0_ctrl,
2062 .ctrlbit = (1 << 0),
2064 .sources = &clkset_group,
2065 .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
2066 .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
2069 .name = "sclk_fimd1",
2071 .enable = s5pv310_clksrc_mask_lcd1_ctrl,
2072 .ctrlbit = (1 << 0),
2074 .sources = &clkset_group,
2075 .reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 },
2076 .reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 },
2079 .name = "sclk_mdnie0",
2081 .enable = s5pv310_clksrc_mask_lcd0_ctrl,
2082 .ctrlbit = (1 << 2),
2084 .sources = &clkset_group,
2085 .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 4, .size = 4 },
2086 .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 4, .size = 4 },
2089 .name = "sclk_sata",
2091 .enable = s5pv310_clksrc_mask_fsys_ctrl,
2092 .ctrlbit = (1 << 24),
2094 .sources = &clkset_mout_corebus,
2095 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 },
2096 .reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 },
2101 .enable = s5pv310_clksrc_mask_peril1_ctrl,
2102 .ctrlbit = (1 << 16),
2104 .sources = &clkset_group,
2105 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 },
2106 .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 8, .size = 8 },
2111 .enable = s5pv310_clksrc_mask_peril1_ctrl,
2112 .ctrlbit = (1 << 20),
2114 .sources = &clkset_group,
2115 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 },
2116 .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 24, .size = 8 },
2121 .enable = s5pv310_clksrc_mask_peril1_ctrl,
2122 .ctrlbit = (1 << 24),
2124 .sources = &clkset_group,
2125 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 },
2126 .reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 8, .size = 8 },
2131 .parent = &clk_dout_mmc0.clk,
2132 .enable = s5pv310_clksrc_mask_fsys_ctrl,
2133 .ctrlbit = (1 << 0),
2135 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
2140 .parent = &clk_dout_mmc1.clk,
2141 .enable = s5pv310_clksrc_mask_fsys_ctrl,
2142 .ctrlbit = (1 << 4),
2144 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
2149 .parent = &clk_dout_mmc2.clk,
2150 .enable = s5pv310_clksrc_mask_fsys_ctrl,
2151 .ctrlbit = (1 << 8),
2153 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
2158 .parent = &clk_dout_mmc3.clk,
2159 .enable = s5pv310_clksrc_mask_fsys_ctrl,
2160 .ctrlbit = (1 << 12),
2162 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
2165 .name = "sclk_dw_mmc",
2167 .parent = &clk_dout_mmc4.clk,
2168 .enable = s5pv310_clksrc_mask_fsys_ctrl,
2169 .ctrlbit = (1 << 16),
2171 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
2176 .parent = &clk_sclk_audio0.clk,
2178 .reg_div = { .reg = S5P_CLKDIV_MAUDIO, .shift = 4, .size = 8 },
2183 .parent = &clk_sclk_audio1.clk,
2185 .reg_div = { .reg = S5P_CLKDIV_PERIL4, .shift = 4, .size = 8 },
2190 .parent = &clk_sclk_audio2.clk,
2192 .reg_div = { .reg = S5P_CLKDIV_PERIL4, .shift = 20, .size = 8 },
2197 .parent = &clk_sclk_audio1.clk,
2199 .reg_div = { .reg = S5P_CLKDIV_PERIL5, .shift = 0, .size = 6 },
2204 .parent = &clk_sclk_audio2.clk,
2206 .reg_div = { .reg = S5P_CLKDIV_PERIL5, .shift = 8, .size = 6 },
2211 .parent = &clk_dout_copy.clk,
2213 .reg_div = { .reg = S5P_CLKDIV_CPU1, .shift = 4, .size = 3 },
2219 .sources = &clkset_group,
2220 .reg_src = { .reg = S5P_CLKSRC_DMC, .shift = 16, .size = 4 },
2221 .reg_div = { .reg = S5P_CLKDIV_DMC1, .shift = 8, .size = 4 },
2225 /* Clock initialization code */
2226 static struct clksrc_clk *sysclks[] = {
2285 static unsigned long s5pv310_epll_get_rate(struct clk *clk)
2290 static u32 epll_div[][6] = {
2291 { 48000000, 0, 48, 3, 3, 0 },
2292 { 96000000, 0, 48, 3, 2, 0 },
2293 { 144000000, 1, 72, 3, 2, 0 },
2294 { 192000000, 0, 48, 3, 1, 0 },
2295 { 288000000, 1, 72, 3, 1, 0 },
2296 { 84000000, 0, 42, 3, 2, 0 },
2297 { 50000000, 0, 50, 3, 3, 0 },
2298 { 80000000, 1, 80, 3, 3, 0 },
2299 { 32750000, 1, 65, 3, 4, 35127 },
2300 { 32768000, 1, 65, 3, 4, 35127 },
2301 { 49152000, 0, 49, 3, 3, 9961 },
2302 { 67737600, 1, 67, 3, 3, 48366 },
2303 { 73728000, 1, 73, 3, 3, 47710 },
2304 { 45158400, 0, 45, 3, 3, 10381 },
2305 { 45000000, 0, 45, 3, 3, 10355 },
2306 { 45158000, 0, 45, 3, 3, 10355 },
2307 { 49125000, 0, 49, 3, 3, 9961 },
2308 { 67738000, 1, 67, 3, 3, 48366 },
2309 { 73800000, 1, 73, 3, 3, 47710 },
2310 { 36000000, 1, 32, 3, 4, 0 },
2311 { 60000000, 1, 60, 3, 3, 0 },
2312 { 72000000, 1, 72, 3, 3, 0 },
2315 static int s5pv310_epll_set_rate(struct clk *clk, unsigned long rate)
2317 unsigned int epll_con, epll_con_k;
2320 /* Return if nothing changed */
2321 if (clk->rate == rate)
2324 epll_con = __raw_readl(S5P_EPLL_CON0);
2325 epll_con &= ~(0x1 << 27 | \
2326 PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT | \
2327 PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT | \
2328 PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);
2330 for (i = 0; i < ARRAY_SIZE(epll_div); i++) {
2331 if (epll_div[i][0] == rate) {
2332 epll_con_k = epll_div[i][5] << 0;
2333 epll_con |= epll_div[i][1] << 27;
2334 epll_con |= epll_div[i][2] << PLL46XX_MDIV_SHIFT;
2335 epll_con |= epll_div[i][3] << PLL46XX_PDIV_SHIFT;
2336 epll_con |= epll_div[i][4] << PLL46XX_SDIV_SHIFT;
2341 if (i == ARRAY_SIZE(epll_div)) {
2342 printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n",
2347 __raw_writel(epll_con, S5P_EPLL_CON0);
2348 __raw_writel(epll_con_k, S5P_EPLL_CON1);
2355 static struct clk_ops s5pv310_epll_ops = {
2356 .get_rate = s5pv310_epll_get_rate,
2357 .set_rate = s5pv310_epll_set_rate,
2361 struct vpll_div_data {
2373 static struct vpll_div_data vpll_div[] = {
2374 { 54000000, 3, 53, 3, 1024, 0, 17, 0 },
2375 { 108000000, 3, 53, 2, 1024, 0, 17, 0 },
2378 static unsigned long s5pv310_vpll_get_rate(struct clk *clk)
2383 static int s5pv310_vpll_set_rate(struct clk *clk, unsigned long rate)
2385 unsigned int vpll_con0, vpll_con1;
2388 /* Return if nothing changed */
2389 if (clk->rate == rate)
2392 vpll_con0 = __raw_readl(S5P_VPLL_CON0);
2393 vpll_con0 &= ~(0x1 << 27 | \
2394 PLL90XX_MDIV_MASK << PLL90XX_MDIV_SHIFT | \
2395 PLL90XX_PDIV_MASK << PLL90XX_PDIV_SHIFT | \
2396 PLL90XX_SDIV_MASK << PLL90XX_SDIV_SHIFT);
2398 vpll_con1 = __raw_readl(S5P_VPLL_CON1);
2399 vpll_con1 &= ~(0x1f << 24 | \
2403 for (i = 0; i < ARRAY_SIZE(vpll_div); i++) {
2404 if (vpll_div[i].rate == rate) {
2405 vpll_con0 |= vpll_div[i].vsel << 27;
2406 vpll_con0 |= vpll_div[i].pdiv << PLL90XX_PDIV_SHIFT;
2407 vpll_con0 |= vpll_div[i].mdiv << PLL90XX_MDIV_SHIFT;
2408 vpll_con0 |= vpll_div[i].sdiv << PLL90XX_SDIV_SHIFT;
2410 vpll_con1 |= vpll_div[i].mrr << 24;
2411 vpll_con1 |= vpll_div[i].mfr << 16;
2412 vpll_con1 |= vpll_div[i].k << 0;
2417 if (i == ARRAY_SIZE(vpll_div)) {
2418 printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
2423 __raw_writel(vpll_con0, S5P_VPLL_CON0);
2424 __raw_writel(vpll_con1, S5P_VPLL_CON1);
2431 static struct clk_ops s5pv310_vpll_ops = {
2432 .get_rate = s5pv310_vpll_get_rate,
2433 .set_rate = s5pv310_vpll_set_rate,
2436 static int xtal_rate;
2438 static unsigned long s5pv310_fout_apll_get_rate(struct clk *clk)
2440 return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
2443 static struct clk_ops s5pv310_fout_apll_ops = {
2444 .get_rate = s5pv310_fout_apll_get_rate,
2447 void __init_or_cpufreq s5pv310_setup_clocks(void)
2449 struct clk *xtal_clk;
2454 unsigned long vpllsrc;
2456 unsigned long armclk;
2457 unsigned long sclk_dmc;
2458 unsigned long aclk_200;
2459 unsigned long aclk_100;
2460 unsigned long aclk_160;
2461 unsigned long aclk_133;
2464 printk(KERN_DEBUG "%s: registering clocks\n", __func__);
2466 xtal_clk = clk_get(NULL, "xtal");
2467 BUG_ON(IS_ERR(xtal_clk));
2469 xtal = clk_get_rate(xtal_clk);
2475 printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
2477 apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0), pll_4508);
2478 mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0), pll_4508);
2479 epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
2480 __raw_readl(S5P_EPLL_CON1), pll_4600);
2482 vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
2483 vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
2484 __raw_readl(S5P_VPLL_CON1), pll_4650);
2486 clk_fout_apll.ops = &s5pv310_fout_apll_ops;
2487 clk_fout_mpll.rate = mpll;
2488 clk_fout_epll.rate = epll;
2489 clk_fout_vpll.rate = vpll;
2491 printk(KERN_INFO "S5PV310: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
2492 apll, mpll, epll, vpll);
2494 armclk = clk_get_rate(&clk_armclk.clk);
2495 sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk);
2496 aclk_200 = clk_get_rate(&clk_aclk_200.clk);
2497 aclk_100 = clk_get_rate(&clk_aclk_100.clk);
2498 aclk_160 = clk_get_rate(&clk_aclk_160.clk);
2499 aclk_133 = clk_get_rate(&clk_aclk_133.clk);
2501 printk(KERN_INFO "S5PV310: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
2502 "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
2503 armclk, sclk_dmc, aclk_200,
2504 aclk_100, aclk_160, aclk_133);
2506 clk_f.rate = armclk;
2507 clk_h.rate = sclk_dmc;
2508 clk_p.rate = aclk_100;
2510 clk_fout_epll.enable = s5pv310_clk_epll_ctrl;
2511 clk_fout_epll.ops = &s5pv310_epll_ops;
2513 clk_set_parent(&clk_sclk_audss.clk, &clk_mout_audss.clk);
2514 clk_set_parent(&clk_mout_audss.clk, &clk_fout_epll);
2515 clk_set_parent(&clk_sclk_audio0.clk, &clk_mout_epll.clk);
2516 clk_set_parent(&clk_sclk_audio1.clk, &clk_mout_epll.clk);
2517 clk_set_parent(&clk_sclk_audio2.clk, &clk_mout_epll.clk);
2518 clk_set_parent(&clk_mout_epll.clk, &clk_fout_epll);
2520 clk_fout_vpll.enable = s5pv310_clk_vpll_ctrl;
2521 clk_fout_vpll.ops = &s5pv310_vpll_ops;
2523 clk_set_parent(&clk_cmu_dmc.clk, &clk_sclk_dmc.clk);
2524 clk_set_parent(&clk_cmu_top.clk, &clk_aclk_200.clk);
2525 clk_set_parent(&clk_cmu_leftbus.clk, &clk_aclk_gdl.clk);
2526 clk_set_parent(&clk_cmu_rightbus.clk, &clk_aclk_gdr.clk);
2527 clk_set_parent(&clk_cmu_cpu.clk, &clk_aclk_corem0.clk);
2529 clk_set_parent(&clk_xclkout.clk, &clk_xusbxti);
2531 clk_set_rate(&clk_sclk_apll.clk, 100000000);
2533 for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
2534 s3c_set_clksrc(&clksrcs[ptr], true);
2537 static struct clk *clks[] __initdata = {
2542 void __init s5pv310_register_clocks(void)
2548 ret = s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
2550 printk(KERN_ERR "Failed to register %u clocks\n", ret);
2552 for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
2553 s3c_register_clksrc(sysclks[ptr], 1);
2555 /* register TV clocks */
2556 for (ptr = 0; sclk_tv[ptr]; ++ptr)
2557 s3c_register_clksrc(sclk_tv[ptr], 1);
2559 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
2560 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
2562 clkp = init_clocks_disable;
2563 for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) {
2564 ret = s3c24xx_register_clock(clkp);
2566 printk(KERN_ERR "Failed to register clock %s (%d)\n",
2569 (clkp->enable)(clkp, 0);
2572 /* Register DMA Clock */
2573 s3c_register_clocks(init_dmaclocks, ARRAY_SIZE(init_dmaclocks));