14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/list.h>
17 #include <linux/errno.h>
20 #include <linux/device.h>
26 #include <mach/regs-clock.h>
27 #include <plat/clock.h>
35 static unsigned long xtal;
42 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 0, .size = 1 },
50 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 8, .size = 1 },
58 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 4, .size = 1 },
61 static struct clk *clkset_armclk_list[] = {
62 [0] = &clk_mout_apll.
clk,
63 [1] = &clk_mout_mpll.
clk,
67 .sources = clkset_armclk_list,
75 .sources = &clkset_armclk,
76 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 16, .size = 1 },
77 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 0, .size = 3 },
83 .parent = &clk_armclk.
clk,
85 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 8, .size = 3 },
91 .parent = &clk_hclk_msys.
clk,
93 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 12, .size = 3 },
99 .parent = &clk_mout_apll.
clk,
101 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 4, .size = 3 },
104 static struct clk *clkset_hclk_sys_list[] = {
105 [0] = &clk_mout_mpll.
clk,
106 [1] = &clk_sclk_a2m.
clk,
110 .sources = clkset_hclk_sys_list,
111 .nr_sources =
ARRAY_SIZE(clkset_hclk_sys_list),
118 .sources = &clkset_hclk_sys,
119 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 20, .size = 1 },
120 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 16, .size = 4 },
126 .parent = &clk_hclk_dsys.
clk,
128 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 20, .size = 3 },
135 .sources = &clkset_hclk_sys,
136 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 24, .size = 1 },
137 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 24, .size = 4 },
143 .parent = &clk_hclk_psys.
clk,
145 .reg_div = { .reg =
S5P_CLK_DIV0, .shift = 28, .size = 3 },
148 static int s5pv210_clk_ip0_ctrl(
struct clk *
clk,
int enable)
153 static int s5pv210_clk_ip1_ctrl(
struct clk *
clk,
int enable)
158 static int s5pv210_clk_ip2_ctrl(
struct clk *
clk,
int enable)
163 static int s5pv210_clk_ip3_ctrl(
struct clk *
clk,
int enable)
168 static int s5pv210_clk_mask0_ctrl(
struct clk *
clk,
int enable)
173 static int s5pv210_clk_mask1_ctrl(
struct clk *
clk,
int enable)
178 static int s5pv210_clk_hdmiphy_ctrl(
struct clk *
clk,
int enable)
183 static int exynos4_clk_dac_ctrl(
struct clk *
clk,
int enable)
188 static struct clk clk_sclk_hdmi27m = {
189 .name =
"sclk_hdmi27m",
193 static struct clk clk_sclk_hdmiphy = {
194 .name =
"sclk_hdmiphy",
197 static struct clk clk_sclk_usbphy0 = {
198 .name =
"sclk_usbphy0",
201 static struct clk clk_sclk_usbphy1 = {
202 .name =
"sclk_usbphy1",
205 static struct clk clk_pcmcdclk0 = {
209 static struct clk clk_pcmcdclk1 = {
213 static struct clk clk_pcmcdclk2 = {
217 static struct clk dummy_apb_pclk = {
222 static struct clk *clkset_vpllsrc_list[] = {
224 [1] = &clk_sclk_hdmi27m,
228 .sources = clkset_vpllsrc_list,
229 .nr_sources =
ARRAY_SIZE(clkset_vpllsrc_list),
235 .enable = s5pv210_clk_mask0_ctrl,
242 static struct clk *clkset_sclk_vpll_list[] = {
243 [0] = &clk_vpllsrc.
clk,
248 .sources = clkset_sclk_vpll_list,
249 .nr_sources =
ARRAY_SIZE(clkset_sclk_vpll_list),
256 .sources = &clkset_sclk_vpll,
257 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 12, .size = 1 },
260 static struct clk *clkset_moutdmc0src_list[] = {
261 [0] = &clk_sclk_a2m.
clk,
262 [1] = &clk_mout_mpll.
clk,
268 .sources = clkset_moutdmc0src_list,
269 .nr_sources =
ARRAY_SIZE(clkset_moutdmc0src_list),
276 .sources = &clkset_moutdmc0src,
277 .reg_src = { .reg =
S5P_CLK_SRC6, .shift = 24, .size = 2 },
283 .parent = &clk_mout_dmc0.
clk,
285 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 28, .size = 4 },
288 static unsigned long s5pv210_clk_imem_get_rate(
struct clk *
clk)
293 static struct clk_ops clk_hclk_imem_ops = {
294 .get_rate = s5pv210_clk_imem_get_rate,
297 static unsigned long s5pv210_clk_fout_apll_get_rate(
struct clk *
clk)
302 static struct clk_ops clk_fout_apll_ops = {
303 .get_rate = s5pv210_clk_fout_apll_get_rate,
306 static struct clk init_clocks_off[] = {
309 .devname =
"dma-pl330.0",
310 .parent = &clk_hclk_psys.
clk,
311 .enable = s5pv210_clk_ip0_ctrl,
315 .devname =
"dma-pl330.1",
316 .parent = &clk_hclk_psys.
clk,
317 .enable = s5pv210_clk_ip0_ctrl,
321 .parent = &clk_hclk_dsys.
clk,
322 .enable = s5pv210_clk_ip0_ctrl,
326 .devname =
"s5pv210-fimc.0",
327 .parent = &clk_hclk_dsys.
clk,
328 .enable = s5pv210_clk_ip0_ctrl,
329 .ctrlbit = (1 << 24),
332 .devname =
"s5pv210-fimc.1",
333 .parent = &clk_hclk_dsys.
clk,
334 .enable = s5pv210_clk_ip0_ctrl,
335 .ctrlbit = (1 << 25),
338 .devname =
"s5pv210-fimc.2",
339 .parent = &clk_hclk_dsys.
clk,
340 .enable = s5pv210_clk_ip0_ctrl,
341 .ctrlbit = (1 << 26),
344 .parent = &clk_hclk_dsys.
clk,
345 .enable = s5pv210_clk_ip0_ctrl,
346 .ctrlbit = (1 << 28),
349 .devname =
"s5p-mfc",
350 .parent = &clk_pclk_psys.
clk,
351 .enable = s5pv210_clk_ip0_ctrl,
352 .ctrlbit = (1 << 16),
355 .devname =
"s5p-sdo",
356 .parent = &clk_hclk_dsys.
clk,
357 .enable = s5pv210_clk_ip1_ctrl,
358 .ctrlbit = (1 << 10),
361 .devname =
"s5p-mixer",
362 .parent = &clk_hclk_dsys.
clk,
363 .enable = s5pv210_clk_ip1_ctrl,
367 .devname =
"s5p-mixer",
368 .parent = &clk_hclk_dsys.
clk,
369 .enable = s5pv210_clk_ip1_ctrl,
373 .devname =
"s5pv210-hdmi",
374 .parent = &clk_hclk_dsys.
clk,
375 .enable = s5pv210_clk_ip1_ctrl,
376 .ctrlbit = (1 << 11),
379 .devname =
"s5pv210-hdmi",
380 .enable = s5pv210_clk_hdmiphy_ctrl,
384 .devname =
"s5p-sdo",
385 .enable = exynos4_clk_dac_ctrl,
389 .parent = &clk_hclk_psys.
clk,
390 .enable = s5pv210_clk_ip1_ctrl,
394 .parent = &clk_hclk_psys.
clk,
395 .enable = s5pv210_clk_ip1_ctrl,
399 .parent = &clk_hclk_dsys.
clk,
400 .enable = s5pv210_clk_ip1_ctrl,
404 .parent = &clk_hclk_psys.
clk,
405 .enable = s5pv210_clk_ip1_ctrl,
409 .parent = &clk_pclk_psys.
clk,
410 .enable = s5pv210_clk_ip3_ctrl,
414 .parent = &clk_pclk_psys.
clk,
415 .enable = s5pv210_clk_ip3_ctrl,
419 .parent = &clk_pclk_psys.
clk,
420 .enable = s5pv210_clk_ip3_ctrl,
424 .devname =
"s3c2440-i2c.0",
425 .parent = &clk_pclk_psys.
clk,
426 .enable = s5pv210_clk_ip3_ctrl,
430 .devname =
"s3c2440-i2c.1",
431 .parent = &clk_pclk_psys.
clk,
432 .enable = s5pv210_clk_ip3_ctrl,
433 .ctrlbit = (1 << 10),
436 .devname =
"s3c2440-i2c.2",
437 .parent = &clk_pclk_psys.
clk,
438 .enable = s5pv210_clk_ip3_ctrl,
442 .devname =
"s3c2440-hdmiphy-i2c",
443 .parent = &clk_pclk_psys.
clk,
444 .enable = s5pv210_clk_ip3_ctrl,
445 .ctrlbit = (1 << 11),
448 .devname =
"s5pv210-spi.0",
449 .parent = &clk_pclk_psys.
clk,
450 .enable = s5pv210_clk_ip3_ctrl,
454 .devname =
"s5pv210-spi.1",
455 .parent = &clk_pclk_psys.
clk,
456 .enable = s5pv210_clk_ip3_ctrl,
460 .devname =
"s5pv210-spi.2",
461 .parent = &clk_pclk_psys.
clk,
462 .enable = s5pv210_clk_ip3_ctrl,
466 .parent = &clk_pclk_psys.
clk,
467 .enable = s5pv210_clk_ip3_ctrl,
471 .parent = &clk_pclk_psys.
clk,
472 .enable = s5pv210_clk_ip3_ctrl,
476 .parent = &clk_pclk_psys.
clk,
477 .enable = s5pv210_clk_ip3_ctrl,
481 .devname =
"samsung-i2s.0",
483 .enable = s5pv210_clk_ip3_ctrl,
487 .devname =
"samsung-i2s.1",
489 .enable = s5pv210_clk_ip3_ctrl,
493 .devname =
"samsung-i2s.2",
495 .enable = s5pv210_clk_ip3_ctrl,
500 .enable = s5pv210_clk_ip3_ctrl,
505 static struct clk init_clocks[] = {
508 .parent = &clk_hclk_msys.
clk,
510 .
enable = s5pv210_clk_ip0_ctrl,
511 .
ops = &clk_hclk_imem_ops,
514 .devname =
"s5pv210-uart.0",
515 .parent = &clk_pclk_psys.
clk,
516 .enable = s5pv210_clk_ip3_ctrl,
517 .ctrlbit = (1 << 17),
520 .devname =
"s5pv210-uart.1",
521 .parent = &clk_pclk_psys.
clk,
522 .enable = s5pv210_clk_ip3_ctrl,
523 .ctrlbit = (1 << 18),
526 .devname =
"s5pv210-uart.2",
527 .parent = &clk_pclk_psys.
clk,
528 .enable = s5pv210_clk_ip3_ctrl,
529 .ctrlbit = (1 << 19),
532 .devname =
"s5pv210-uart.3",
533 .parent = &clk_pclk_psys.
clk,
534 .enable = s5pv210_clk_ip3_ctrl,
535 .ctrlbit = (1 << 20),
538 .parent = &clk_hclk_psys.
clk,
539 .enable = s5pv210_clk_ip1_ctrl,
540 .ctrlbit = (1 << 26),
544 static struct clk clk_hsmmc0 = {
546 .devname =
"s3c-sdhci.0",
547 .parent = &clk_hclk_psys.
clk,
548 .enable = s5pv210_clk_ip2_ctrl,
552 static struct clk clk_hsmmc1 = {
554 .devname =
"s3c-sdhci.1",
555 .parent = &clk_hclk_psys.
clk,
556 .enable = s5pv210_clk_ip2_ctrl,
560 static struct clk clk_hsmmc2 = {
562 .devname =
"s3c-sdhci.2",
563 .parent = &clk_hclk_psys.
clk,
564 .enable = s5pv210_clk_ip2_ctrl,
568 static struct clk clk_hsmmc3 = {
570 .devname =
"s3c-sdhci.3",
571 .parent = &clk_hclk_psys.
clk,
572 .enable = s5pv210_clk_ip2_ctrl,
576 static struct clk *clkset_uart_list[] = {
577 [6] = &clk_mout_mpll.
clk,
578 [7] = &clk_mout_epll.
clk,
582 .sources = clkset_uart_list,
586 static struct clk *clkset_group1_list[] = {
587 [0] = &clk_sclk_a2m.
clk,
588 [1] = &clk_mout_mpll.
clk,
589 [2] = &clk_mout_epll.
clk,
590 [3] = &clk_sclk_vpll.
clk,
594 .sources = clkset_group1_list,
598 static struct clk *clkset_sclk_onenand_list[] = {
599 [0] = &clk_hclk_psys.
clk,
600 [1] = &clk_hclk_dsys.
clk,
604 .sources = clkset_sclk_onenand_list,
605 .nr_sources =
ARRAY_SIZE(clkset_sclk_onenand_list),
608 static struct clk *clkset_sclk_dac_list[] = {
609 [0] = &clk_sclk_vpll.
clk,
610 [1] = &clk_sclk_hdmiphy,
614 .sources = clkset_sclk_dac_list,
615 .nr_sources =
ARRAY_SIZE(clkset_sclk_dac_list),
621 .enable = s5pv210_clk_mask0_ctrl,
630 .name =
"sclk_pixel",
631 .parent = &clk_sclk_vpll.
clk,
633 .reg_div = { .reg =
S5P_CLK_DIV1, .shift = 0, .size = 4},
636 static struct clk *clkset_sclk_hdmi_list[] = {
637 [0] = &clk_sclk_pixel.
clk,
638 [1] = &clk_sclk_hdmiphy,
642 .sources = clkset_sclk_hdmi_list,
643 .nr_sources =
ARRAY_SIZE(clkset_sclk_hdmi_list),
649 .enable = s5pv210_clk_mask0_ctrl,
656 static struct clk *clkset_sclk_mixer_list[] = {
657 [0] = &clk_sclk_dac.
clk,
658 [1] = &clk_sclk_hdmi.
clk,
662 .sources = clkset_sclk_mixer_list,
663 .nr_sources =
ARRAY_SIZE(clkset_sclk_mixer_list),
668 .name =
"sclk_mixer",
669 .enable = s5pv210_clk_mask0_ctrl,
683 static struct clk *clkset_sclk_audio0_list[] = {
685 [1] = &clk_pcmcdclk0,
686 [2] = &clk_sclk_hdmi27m,
687 [3] = &clk_sclk_usbphy0,
688 [4] = &clk_sclk_usbphy1,
689 [5] = &clk_sclk_hdmiphy,
690 [6] = &clk_mout_mpll.
clk,
691 [7] = &clk_mout_epll.
clk,
692 [8] = &clk_sclk_vpll.
clk,
696 .sources = clkset_sclk_audio0_list,
697 .nr_sources =
ARRAY_SIZE(clkset_sclk_audio0_list),
702 .name =
"sclk_audio",
703 .devname =
"soc-audio.0",
704 .enable = s5pv210_clk_mask0_ctrl,
705 .ctrlbit = (1 << 24),
707 .
sources = &clkset_sclk_audio0,
709 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 0, .size = 4 },
712 static struct clk *clkset_sclk_audio1_list[] = {
714 [1] = &clk_pcmcdclk1,
715 [2] = &clk_sclk_hdmi27m,
716 [3] = &clk_sclk_usbphy0,
717 [4] = &clk_sclk_usbphy1,
718 [5] = &clk_sclk_hdmiphy,
719 [6] = &clk_mout_mpll.
clk,
720 [7] = &clk_mout_epll.
clk,
721 [8] = &clk_sclk_vpll.
clk,
725 .sources = clkset_sclk_audio1_list,
726 .nr_sources =
ARRAY_SIZE(clkset_sclk_audio1_list),
731 .name =
"sclk_audio",
732 .devname =
"soc-audio.1",
733 .enable = s5pv210_clk_mask0_ctrl,
734 .ctrlbit = (1 << 25),
736 .
sources = &clkset_sclk_audio1,
738 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 4, .size = 4 },
741 static struct clk *clkset_sclk_audio2_list[] = {
743 [1] = &clk_pcmcdclk0,
744 [2] = &clk_sclk_hdmi27m,
745 [3] = &clk_sclk_usbphy0,
746 [4] = &clk_sclk_usbphy1,
747 [5] = &clk_sclk_hdmiphy,
748 [6] = &clk_mout_mpll.
clk,
749 [7] = &clk_mout_epll.
clk,
750 [8] = &clk_sclk_vpll.
clk,
754 .sources = clkset_sclk_audio2_list,
755 .nr_sources =
ARRAY_SIZE(clkset_sclk_audio2_list),
760 .name =
"sclk_audio",
761 .devname =
"soc-audio.2",
762 .enable = s5pv210_clk_mask0_ctrl,
763 .ctrlbit = (1 << 26),
765 .
sources = &clkset_sclk_audio2,
767 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 8, .size = 4 },
770 static struct clk *clkset_sclk_spdif_list[] = {
771 [0] = &clk_sclk_audio0.
clk,
772 [1] = &clk_sclk_audio1.
clk,
773 [2] = &clk_sclk_audio2.
clk,
777 .sources = clkset_sclk_spdif_list,
778 .nr_sources =
ARRAY_SIZE(clkset_sclk_spdif_list),
783 .name =
"sclk_spdif",
784 .enable = s5pv210_clk_mask0_ctrl,
785 .ctrlbit = (1 << 27),
792 static struct clk *clkset_group2_list[] = {
795 [2] = &clk_sclk_hdmi27m,
796 [3] = &clk_sclk_usbphy0,
797 [4] = &clk_sclk_usbphy1,
798 [5] = &clk_sclk_hdmiphy,
799 [6] = &clk_mout_mpll.
clk,
800 [7] = &clk_mout_epll.
clk,
801 [8] = &clk_sclk_vpll.
clk,
805 .sources = clkset_group2_list,
814 .sources = &clkset_group1,
815 .reg_src = { .reg =
S5P_CLK_SRC6, .shift = 24, .size = 2 },
816 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 28, .size = 4 },
819 .name =
"sclk_onenand",
821 .sources = &clkset_sclk_onenand,
822 .reg_src = { .reg =
S5P_CLK_SRC0, .shift = 28, .size = 1 },
823 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 12, .size = 3 },
827 .devname =
"s5pv210-fimc.0",
828 .enable = s5pv210_clk_mask1_ctrl,
833 .reg_div = { .reg =
S5P_CLK_DIV3, .shift = 12, .size = 4 },
837 .devname =
"s5pv210-fimc.1",
838 .enable = s5pv210_clk_mask1_ctrl,
843 .reg_div = { .reg =
S5P_CLK_DIV3, .shift = 16, .size = 4 },
847 .devname =
"s5pv210-fimc.2",
848 .enable = s5pv210_clk_mask1_ctrl,
853 .reg_div = { .reg =
S5P_CLK_DIV3, .shift = 20, .size = 4 },
857 .enable = s5pv210_clk_mask0_ctrl,
862 .reg_div = { .reg =
S5P_CLK_DIV1, .shift = 12, .size = 4 },
866 .enable = s5pv210_clk_mask0_ctrl,
871 .reg_div = { .reg =
S5P_CLK_DIV1, .shift = 16, .size = 4 },
875 .enable = s5pv210_clk_mask0_ctrl,
880 .reg_div = { .reg =
S5P_CLK_DIV1, .shift = 20, .size = 4 },
884 .devname =
"s5p-mfc",
885 .enable = s5pv210_clk_ip0_ctrl,
886 .ctrlbit = (1 << 16),
890 .reg_div = { .reg =
S5P_CLK_DIV2, .shift = 4, .size = 4 },
894 .enable = s5pv210_clk_ip0_ctrl,
895 .ctrlbit = (1 << 12),
899 .reg_div = { .reg =
S5P_CLK_DIV2, .shift = 8, .size = 4 },
903 .enable = s5pv210_clk_ip0_ctrl,
908 .reg_div = { .reg =
S5P_CLK_DIV2, .shift = 0, .size = 4 },
912 .enable = s5pv210_clk_mask0_ctrl,
917 .reg_div = { .reg =
S5P_CLK_DIV1, .shift = 28, .size = 4 },
921 .enable = s5pv210_clk_mask0_ctrl,
922 .ctrlbit = (1 << 29),
926 .reg_div = { .reg =
S5P_CLK_DIV6, .shift = 24, .size = 4 },
930 .enable = s5pv210_clk_mask0_ctrl,
931 .ctrlbit = (1 << 19),
935 .reg_div = { .reg =
S5P_CLK_DIV5, .shift = 12, .size = 4 },
942 .devname =
"s5pv210-uart.0",
943 .enable = s5pv210_clk_mask0_ctrl,
944 .ctrlbit = (1 << 12),
948 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 16, .size = 4 },
954 .devname =
"s5pv210-uart.1",
955 .enable = s5pv210_clk_mask0_ctrl,
956 .ctrlbit = (1 << 13),
960 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 20, .size = 4 },
966 .devname =
"s5pv210-uart.2",
967 .enable = s5pv210_clk_mask0_ctrl,
968 .ctrlbit = (1 << 14),
972 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 24, .size = 4 },
978 .devname =
"s5pv210-uart.3",
979 .enable = s5pv210_clk_mask0_ctrl,
980 .ctrlbit = (1 << 15),
984 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 28, .size = 4 },
990 .devname =
"s3c-sdhci.0",
991 .enable = s5pv210_clk_mask0_ctrl,
996 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 0, .size = 4 },
1002 .devname =
"s3c-sdhci.1",
1003 .enable = s5pv210_clk_mask0_ctrl,
1004 .ctrlbit = (1 << 9),
1008 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 4, .size = 4 },
1014 .devname =
"s3c-sdhci.2",
1015 .enable = s5pv210_clk_mask0_ctrl,
1016 .ctrlbit = (1 << 10),
1020 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 8, .size = 4 },
1026 .devname =
"s3c-sdhci.3",
1027 .enable = s5pv210_clk_mask0_ctrl,
1028 .ctrlbit = (1 << 11),
1032 .reg_div = { .reg =
S5P_CLK_DIV4, .shift = 12, .size = 4 },
1038 .devname =
"s5pv210-spi.0",
1039 .enable = s5pv210_clk_mask0_ctrl,
1040 .ctrlbit = (1 << 16),
1044 .reg_div = { .reg =
S5P_CLK_DIV5, .shift = 0, .size = 4 },
1050 .devname =
"s5pv210-spi.1",
1051 .enable = s5pv210_clk_mask0_ctrl,
1052 .ctrlbit = (1 << 17),
1056 .reg_div = { .reg =
S5P_CLK_DIV5, .shift = 4, .size = 4 },
1073 static struct clk *clk_cdev[] = {
1103 static u32 epll_div[][6] = {
1104 { 48000000, 0, 48, 3, 3, 0 },
1105 { 96000000, 0, 48, 3, 2, 0 },
1106 { 144000000, 1, 72, 3, 2, 0 },
1107 { 192000000, 0, 48, 3, 1, 0 },
1108 { 288000000, 1, 72, 3, 1, 0 },
1109 { 32750000, 1, 65, 3, 4, 35127 },
1110 { 32768000, 1, 65, 3, 4, 35127 },
1111 { 45158400, 0, 45, 3, 3, 10355 },
1112 { 45000000, 0, 45, 3, 3, 10355 },
1113 { 45158000, 0, 45, 3, 3, 10355 },
1114 { 49125000, 0, 49, 3, 3, 9961 },
1115 { 49152000, 0, 49, 3, 3, 9961 },
1116 { 67737600, 1, 67, 3, 3, 48366 },
1117 { 67738000, 1, 67, 3, 3, 48366 },
1118 { 73800000, 1, 73, 3, 3, 47710 },
1119 { 73728000, 1, 73, 3, 3, 47710 },
1120 { 36000000, 1, 32, 3, 4, 0 },
1121 { 60000000, 1, 60, 3, 3, 0 },
1122 { 72000000, 1, 72, 3, 3, 0 },
1123 { 80000000, 1, 80, 3, 3, 0 },
1124 { 84000000, 0, 42, 3, 2, 0 },
1125 { 50000000, 0, 50, 3, 3, 0 },
1128 static int s5pv210_epll_set_rate(
struct clk *clk,
unsigned long rate)
1130 unsigned int epll_con, epll_con_k;
1134 if (clk->
rate == rate)
1141 epll_con &= ~(1 << 27 |
1147 if (epll_div[i][0] == rate) {
1148 epll_con_k |= epll_div[
i][5] << 0;
1149 epll_con |= (epll_div[
i][1] << 27 |
1174 static struct clk_ops s5pv210_epll_ops = {
1175 .set_rate = s5pv210_epll_set_rate,
1179 static u32 vpll_div[][5] = {
1180 { 54000000, 3, 53, 3, 0 },
1181 { 108000000, 3, 53, 2, 0 },
1184 static unsigned long s5pv210_vpll_get_rate(
struct clk *clk)
1189 static int s5pv210_vpll_set_rate(
struct clk *clk,
unsigned long rate)
1191 unsigned int vpll_con;
1195 if (clk->
rate == rate)
1199 vpll_con &= ~(0x1 << 27 | \
1205 if (vpll_div[i][0] == rate) {
1209 vpll_con |= vpll_div[
i][4] << 27;
1229 static struct clk_ops s5pv210_vpll_ops = {
1230 .get_rate = s5pv210_vpll_get_rate,
1231 .set_rate = s5pv210_vpll_set_rate,
1236 struct clk *xtal_clk;
1237 unsigned long vpllsrc;
1238 unsigned long armclk;
1239 unsigned long hclk_msys;
1240 unsigned long hclk_dsys;
1241 unsigned long hclk_psys;
1242 unsigned long pclk_msys;
1243 unsigned long pclk_dsys;
1244 unsigned long pclk_psys;
1250 u32 clkdiv0, clkdiv1;
1262 __func__, clkdiv0, clkdiv1);
1265 BUG_ON(IS_ERR(xtal_clk));
1286 apll, mpll, epll, vpll);
1297 "HCLKP=%ld, PCLKM=%ld, PCLKD=%ld, PCLKP=%ld\n",
1298 armclk, hclk_msys, hclk_dsys, hclk_psys,
1299 pclk_msys, pclk_dsys, pclk_psys);
1301 clk_f.rate = armclk;
1302 clk_h.rate = hclk_psys;
1303 clk_p.rate = pclk_psys;
1305 for (ptr = 0; ptr <
ARRAY_SIZE(clksrcs); ptr++)
1319 static struct clk_lookup s5pv210_clk_lookup[] = {
1321 CLKDEV_INIT(
"s5pv210-uart.0",
"clk_uart_baud1", &clk_sclk_uart0.
clk),
1322 CLKDEV_INIT(
"s5pv210-uart.1",
"clk_uart_baud1", &clk_sclk_uart1.
clk),
1323 CLKDEV_INIT(
"s5pv210-uart.2",
"clk_uart_baud1", &clk_sclk_uart2.
clk),
1324 CLKDEV_INIT(
"s5pv210-uart.3",
"clk_uart_baud1", &clk_sclk_uart3.
clk),
1325 CLKDEV_INIT(
"s3c-sdhci.0",
"mmc_busclk.0", &clk_hsmmc0),
1326 CLKDEV_INIT(
"s3c-sdhci.1",
"mmc_busclk.0", &clk_hsmmc1),
1327 CLKDEV_INIT(
"s3c-sdhci.2",
"mmc_busclk.0", &clk_hsmmc2),
1328 CLKDEV_INIT(
"s3c-sdhci.3",
"mmc_busclk.0", &clk_hsmmc3),
1344 for (ptr = 0; ptr <
ARRAY_SIZE(sysclks); ptr++)
1347 for (ptr = 0; ptr <
ARRAY_SIZE(sclk_tv); ptr++)
1350 for (ptr = 0; ptr <
ARRAY_SIZE(clksrc_cdev); ptr++)
1361 for (ptr = 0; ptr <
ARRAY_SIZE(clk_cdev); ptr++)