1 /* linux/arch/arm/plat-s5pc1xx/s5pc100-clock.c
3 * Copyright 2009 Samsung Electronics, Co.
4 * Byungho Min <bhmin@samsung.com>
6 * S5PC100 based common clock support
8 * Based on plat-s3c64xx/s3c6400-clock.c
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
15 #include <linux/init.h>
16 #include <linux/module.h>
17 #include <linux/kernel.h>
18 #include <linux/list.h>
19 #include <linux/errno.h>
20 #include <linux/err.h>
21 #include <linux/clk.h>
22 #include <linux/sysdev.h>
25 #include <mach/hardware.h>
28 #include <plat/cpu-freq.h>
30 #include <plat/regs-clock.h>
31 #include <plat/clock.h>
32 #include <plat/clock-clksrc.h>
35 #include <plat/devs.h>
36 #include <plat/s5pc100.h>
38 /* fin_apll, fin_mpll and fin_epll are all the same clock, which we call
39 * ext_xtal_mux for want of an actual name from the manual.
42 static struct clk clk_ext_xtal_mux
= {
47 #define clk_fin_apll clk_ext_xtal_mux
48 #define clk_fin_mpll clk_ext_xtal_mux
49 #define clk_fin_epll clk_ext_xtal_mux
50 #define clk_fin_hpll clk_ext_xtal_mux
52 #define clk_fout_mpll clk_mpll
53 #define clk_vclk_54m clk_54m
56 static struct clk clk_fout_apll
= {
62 static struct clk
*clk_src_apll_list
[] = {
67 static struct clksrc_sources clk_src_apll
= {
68 .sources
= clk_src_apll_list
,
69 .nr_sources
= ARRAY_SIZE(clk_src_apll_list
),
72 static struct clksrc_clk clk_mout_apll
= {
77 .sources
= &clk_src_apll
,
78 .reg_src
= { .reg
= S5PC100_CLKSRC0
, .shift
= 0, .size
= 1, },
81 static unsigned long s5pc100_clk_dout_apll_get_rate(struct clk
*clk
)
83 unsigned long rate
= clk_get_rate(clk
->parent
);
86 ratio
= __raw_readl(S5PC100_CLKDIV0
) & S5PC100_CLKDIV0_APLL_MASK
;
87 ratio
>>= S5PC100_CLKDIV0_APLL_SHIFT
;
89 return rate
/ (ratio
+ 1);
92 static struct clk clk_dout_apll
= {
95 .parent
= &clk_mout_apll
.clk
,
96 .ops
= &(struct clk_ops
) {
97 .get_rate
= s5pc100_clk_dout_apll_get_rate
,
101 static unsigned long s5pc100_clk_arm_get_rate(struct clk
*clk
)
103 unsigned long rate
= clk_get_rate(clk
->parent
);
106 ratio
= __raw_readl(S5PC100_CLKDIV0
) & S5PC100_CLKDIV0_ARM_MASK
;
107 ratio
>>= S5PC100_CLKDIV0_ARM_SHIFT
;
109 return rate
/ (ratio
+ 1);
112 static unsigned long s5pc100_clk_arm_round_rate(struct clk
*clk
,
115 unsigned long parent
= clk_get_rate(clk
->parent
);
121 div
= (parent
/ rate
) - 1;
122 if (div
> S5PC100_CLKDIV0_ARM_MASK
)
123 div
= S5PC100_CLKDIV0_ARM_MASK
;
125 return parent
/ (div
+ 1);
128 static int s5pc100_clk_arm_set_rate(struct clk
*clk
, unsigned long rate
)
130 unsigned long parent
= clk_get_rate(clk
->parent
);
134 if (rate
< parent
/ (S5PC100_CLKDIV0_ARM_MASK
+ 1))
137 rate
= clk_round_rate(clk
, rate
);
138 div
= clk_get_rate(clk
->parent
) / rate
;
140 val
= __raw_readl(S5PC100_CLKDIV0
);
141 val
&= S5PC100_CLKDIV0_ARM_MASK
;
143 __raw_writel(val
, S5PC100_CLKDIV0
);
148 static struct clk clk_arm
= {
151 .parent
= &clk_dout_apll
,
152 .ops
= &(struct clk_ops
) {
153 .get_rate
= s5pc100_clk_arm_get_rate
,
154 .set_rate
= s5pc100_clk_arm_set_rate
,
155 .round_rate
= s5pc100_clk_arm_round_rate
,
159 static unsigned long s5pc100_clk_dout_d0_bus_get_rate(struct clk
*clk
)
161 unsigned long rate
= clk_get_rate(clk
->parent
);
164 ratio
= __raw_readl(S5PC100_CLKDIV0
) & S5PC100_CLKDIV0_D0_MASK
;
165 ratio
>>= S5PC100_CLKDIV0_D0_SHIFT
;
167 return rate
/ (ratio
+ 1);
170 static struct clk clk_dout_d0_bus
= {
171 .name
= "dout_d0_bus",
174 .ops
= &(struct clk_ops
) {
175 .get_rate
= s5pc100_clk_dout_d0_bus_get_rate
,
179 static unsigned long s5pc100_clk_dout_pclkd0_get_rate(struct clk
*clk
)
181 unsigned long rate
= clk_get_rate(clk
->parent
);
184 ratio
= __raw_readl(S5PC100_CLKDIV0
) & S5PC100_CLKDIV0_PCLKD0_MASK
;
185 ratio
>>= S5PC100_CLKDIV0_PCLKD0_SHIFT
;
187 return rate
/ (ratio
+ 1);
190 static struct clk clk_dout_pclkd0
= {
191 .name
= "dout_pclkd0",
193 .parent
= &clk_dout_d0_bus
,
194 .ops
= &(struct clk_ops
) {
195 .get_rate
= s5pc100_clk_dout_pclkd0_get_rate
,
199 static unsigned long s5pc100_clk_dout_apll2_get_rate(struct clk
*clk
)
201 unsigned long rate
= clk_get_rate(clk
->parent
);
204 ratio
= __raw_readl(S5PC100_CLKDIV1
) & S5PC100_CLKDIV1_APLL2_MASK
;
205 ratio
>>= S5PC100_CLKDIV1_APLL2_SHIFT
;
207 return rate
/ (ratio
+ 1);
210 static struct clk clk_dout_apll2
= {
211 .name
= "dout_apll2",
213 .parent
= &clk_mout_apll
.clk
,
214 .ops
= &(struct clk_ops
) {
215 .get_rate
= s5pc100_clk_dout_apll2_get_rate
,
220 static struct clk
*clk_src_mpll_list
[] = {
222 [1] = &clk_fout_mpll
,
225 static struct clksrc_sources clk_src_mpll
= {
226 .sources
= clk_src_mpll_list
,
227 .nr_sources
= ARRAY_SIZE(clk_src_mpll_list
),
230 static struct clksrc_clk clk_mout_mpll
= {
235 .sources
= &clk_src_mpll
,
236 .reg_src
= { .reg
= S5PC100_CLKSRC0
, .shift
= 4, .size
= 1, },
239 static struct clk
*clkset_am_list
[] = {
240 [0] = &clk_mout_mpll
.clk
,
241 [1] = &clk_dout_apll2
,
244 static struct clksrc_sources clk_src_am
= {
245 .sources
= clkset_am_list
,
246 .nr_sources
= ARRAY_SIZE(clkset_am_list
),
249 static struct clksrc_clk clk_mout_am
= {
254 .sources
= &clk_src_am
,
255 .reg_src
= { .reg
= S5PC100_CLKSRC0
, .shift
= 16, .size
= 1, },
258 static unsigned long s5pc100_clk_dout_d1_bus_get_rate(struct clk
*clk
)
260 unsigned long rate
= clk_get_rate(clk
->parent
);
263 printk(KERN_DEBUG
"%s: parent is %ld\n", __func__
, rate
);
265 ratio
= __raw_readl(S5PC100_CLKDIV1
) & S5PC100_CLKDIV1_D1_MASK
;
266 ratio
>>= S5PC100_CLKDIV1_D1_SHIFT
;
268 return rate
/ (ratio
+ 1);
271 static struct clk clk_dout_d1_bus
= {
272 .name
= "dout_d1_bus",
274 .parent
= &clk_mout_am
.clk
,
275 .ops
= &(struct clk_ops
) {
276 .get_rate
= s5pc100_clk_dout_d1_bus_get_rate
,
280 static struct clk
*clkset_onenand_list
[] = {
281 [0] = &clk_dout_d0_bus
,
282 [1] = &clk_dout_d1_bus
,
285 static struct clksrc_sources clk_src_onenand
= {
286 .sources
= clkset_onenand_list
,
287 .nr_sources
= ARRAY_SIZE(clkset_onenand_list
),
290 static struct clksrc_clk clk_mout_onenand
= {
292 .name
= "mout_onenand",
295 .sources
= &clk_src_onenand
,
296 .reg_src
= { .reg
= S5PC100_CLKSRC0
, .shift
= 24, .size
= 1, },
299 static unsigned long s5pc100_clk_dout_pclkd1_get_rate(struct clk
*clk
)
301 unsigned long rate
= clk_get_rate(clk
->parent
);
304 printk(KERN_DEBUG
"%s: parent is %ld\n", __func__
, rate
);
306 ratio
= __raw_readl(S5PC100_CLKDIV1
) & S5PC100_CLKDIV1_PCLKD1_MASK
;
307 ratio
>>= S5PC100_CLKDIV1_PCLKD1_SHIFT
;
309 return rate
/ (ratio
+ 1);
312 static struct clk clk_dout_pclkd1
= {
313 .name
= "dout_pclkd1",
315 .parent
= &clk_dout_d1_bus
,
316 .ops
= &(struct clk_ops
) {
317 .get_rate
= s5pc100_clk_dout_pclkd1_get_rate
,
321 static unsigned long s5pc100_clk_dout_mpll2_get_rate(struct clk
*clk
)
323 unsigned long rate
= clk_get_rate(clk
->parent
);
326 printk(KERN_DEBUG
"%s: parent is %ld\n", __func__
, rate
);
328 ratio
= __raw_readl(S5PC100_CLKDIV1
) & S5PC100_CLKDIV1_MPLL2_MASK
;
329 ratio
>>= S5PC100_CLKDIV1_MPLL2_SHIFT
;
331 return rate
/ (ratio
+ 1);
334 static struct clk clk_dout_mpll2
= {
335 .name
= "dout_mpll2",
337 .parent
= &clk_mout_am
.clk
,
338 .ops
= &(struct clk_ops
) {
339 .get_rate
= s5pc100_clk_dout_mpll2_get_rate
,
343 static unsigned long s5pc100_clk_dout_cam_get_rate(struct clk
*clk
)
345 unsigned long rate
= clk_get_rate(clk
->parent
);
348 printk(KERN_DEBUG
"%s: parent is %ld\n", __func__
, rate
);
350 ratio
= __raw_readl(S5PC100_CLKDIV1
) & S5PC100_CLKDIV1_CAM_MASK
;
351 ratio
>>= S5PC100_CLKDIV1_CAM_SHIFT
;
353 return rate
/ (ratio
+ 1);
356 static struct clk clk_dout_cam
= {
359 .parent
= &clk_dout_mpll2
,
360 .ops
= &(struct clk_ops
) {
361 .get_rate
= s5pc100_clk_dout_cam_get_rate
,
365 static unsigned long s5pc100_clk_dout_mpll_get_rate(struct clk
*clk
)
367 unsigned long rate
= clk_get_rate(clk
->parent
);
370 printk(KERN_DEBUG
"%s: parent is %ld\n", __func__
, rate
);
372 ratio
= __raw_readl(S5PC100_CLKDIV1
) & S5PC100_CLKDIV1_MPLL_MASK
;
373 ratio
>>= S5PC100_CLKDIV1_MPLL_SHIFT
;
375 return rate
/ (ratio
+ 1);
378 static struct clk clk_dout_mpll
= {
381 .parent
= &clk_mout_am
.clk
,
382 .ops
= &(struct clk_ops
) {
383 .get_rate
= s5pc100_clk_dout_mpll_get_rate
,
388 static struct clk clk_fout_epll
= {
393 static struct clk
*clk_src_epll_list
[] = {
395 [1] = &clk_fout_epll
,
398 static struct clksrc_sources clk_src_epll
= {
399 .sources
= clk_src_epll_list
,
400 .nr_sources
= ARRAY_SIZE(clk_src_epll_list
),
403 static struct clksrc_clk clk_mout_epll
= {
408 .sources
= &clk_src_epll
,
409 .reg_src
= { .reg
= S5PC100_CLKSRC0
, .shift
= 8, .size
= 1, },
413 static struct clk clk_fout_hpll
= {
418 static struct clk
*clk_src_hpll_list
[] = {
420 [1] = &clk_fout_hpll
,
423 static struct clksrc_sources clk_src_hpll
= {
424 .sources
= clk_src_hpll_list
,
425 .nr_sources
= ARRAY_SIZE(clk_src_hpll_list
),
428 static struct clksrc_clk clk_mout_hpll
= {
433 .sources
= &clk_src_hpll
,
434 .reg_src
= { .reg
= S5PC100_CLKSRC0
, .shift
= 12, .size
= 1, },
439 * The peripheral clocks are all controlled via clocksource followed
440 * by an optional divider and gate stage. We currently roll this into
441 * one clock which hides the intermediate clock from the mux.
443 * Note, the JPEG clock can only be an even divider...
445 * The scaler and LCD clocks depend on the S5PC100 version, and also
446 * have a common parent divisor so are not included here.
449 static struct clk clk_iis_cd0
= {
450 .name
= "iis_cdclk0",
454 static struct clk clk_iis_cd1
= {
455 .name
= "iis_cdclk1",
459 static struct clk clk_iis_cd2
= {
460 .name
= "iis_cdclk2",
464 static struct clk clk_pcm_cd0
= {
465 .name
= "pcm_cdclk0",
469 static struct clk clk_pcm_cd1
= {
470 .name
= "pcm_cdclk1",
474 static struct clk
*clkset_audio0_list
[] = {
483 static struct clksrc_sources clkset_audio0
= {
484 .sources
= clkset_audio0_list
,
485 .nr_sources
= ARRAY_SIZE(clkset_audio0_list
),
488 static struct clk
*clkset_spi_list
[] = {
495 static struct clksrc_sources clkset_spi
= {
496 .sources
= clkset_spi_list
,
497 .nr_sources
= ARRAY_SIZE(clkset_spi_list
),
500 static struct clk
*clkset_uart_list
[] = {
505 static struct clksrc_sources clkset_uart
= {
506 .sources
= clkset_uart_list
,
507 .nr_sources
= ARRAY_SIZE(clkset_uart_list
),
510 static struct clk
*clkset_audio1_list
[] = {
519 static struct clksrc_sources clkset_audio1
= {
520 .sources
= clkset_audio1_list
,
521 .nr_sources
= ARRAY_SIZE(clkset_audio1_list
),
524 static struct clk
*clkset_audio2_list
[] = {
532 static struct clksrc_sources clkset_audio2
= {
533 .sources
= clkset_audio2_list
,
534 .nr_sources
= ARRAY_SIZE(clkset_audio2_list
),
537 static struct clksrc_clk clksrc_audio
[] = {
542 .ctrlbit
= S5PC100_CLKGATE_SCLK1_AUDIO0
,
543 .enable
= s5pc100_sclk1_ctrl
,
545 .sources
= &clkset_audio0
,
546 .reg_div
= { .reg
= S5PC100_CLKDIV4
, .shift
= 12, .size
= 4, },
547 .reg_src
= { .reg
= S5PC100_CLKSRC3
, .shift
= 12, .size
= 3, },
552 .ctrlbit
= S5PC100_CLKGATE_SCLK1_AUDIO1
,
553 .enable
= s5pc100_sclk1_ctrl
,
555 .sources
= &clkset_audio1
,
556 .reg_div
= { .reg
= S5PC100_CLKDIV4
, .shift
= 16, .size
= 4, },
557 .reg_src
= { .reg
= S5PC100_CLKSRC3
, .shift
= 16, .size
= 3, },
562 .ctrlbit
= S5PC100_CLKGATE_SCLK1_AUDIO2
,
563 .enable
= s5pc100_sclk1_ctrl
,
565 .sources
= &clkset_audio2
,
566 .reg_div
= { .reg
= S5PC100_CLKDIV4
, .shift
= 20, .size
= 4, },
567 .reg_src
= { .reg
= S5PC100_CLKSRC3
, .shift
= 20, .size
= 3, },
571 static struct clk
*clkset_spdif_list
[] = {
572 &clksrc_audio
[0].clk
,
573 &clksrc_audio
[1].clk
,
574 &clksrc_audio
[2].clk
,
577 static struct clksrc_sources clkset_spdif
= {
578 .sources
= clkset_spdif_list
,
579 .nr_sources
= ARRAY_SIZE(clkset_spdif_list
),
582 static struct clk
*clkset_lcd_fimc_list
[] = {
589 static struct clksrc_sources clkset_lcd_fimc
= {
590 .sources
= clkset_lcd_fimc_list
,
591 .nr_sources
= ARRAY_SIZE(clkset_lcd_fimc_list
),
594 static struct clk
*clkset_mmc_list
[] = {
601 static struct clksrc_sources clkset_mmc
= {
602 .sources
= clkset_mmc_list
,
603 .nr_sources
= ARRAY_SIZE(clkset_mmc_list
),
606 static struct clk
*clkset_usbhost_list
[] = {
613 static struct clksrc_sources clkset_usbhost
= {
614 .sources
= clkset_usbhost_list
,
615 .nr_sources
= ARRAY_SIZE(clkset_usbhost_list
),
618 static struct clksrc_clk clksrc_clks
[] = {
623 .ctrlbit
= S5PC100_CLKGATE_SCLK0_SPI0
,
624 .enable
= s5pc100_sclk0_ctrl
,
627 .sources
= &clkset_spi
,
628 .reg_div
= { .reg
= S5PC100_CLKDIV2
, .shift
= 4, .size
= 4, },
629 .reg_src
= { .reg
= S5PC100_CLKSRC1
, .shift
= 4, .size
= 2, },
634 .ctrlbit
= S5PC100_CLKGATE_SCLK0_SPI1
,
635 .enable
= s5pc100_sclk0_ctrl
,
637 .sources
= &clkset_spi
,
638 .reg_div
= { .reg
= S5PC100_CLKDIV2
, .shift
= 8, .size
= 4, },
639 .reg_src
= { .reg
= S5PC100_CLKSRC1
, .shift
= 8, .size
= 2, },
644 .ctrlbit
= S5PC100_CLKGATE_SCLK0_SPI2
,
645 .enable
= s5pc100_sclk0_ctrl
,
647 .sources
= &clkset_spi
,
648 .reg_div
= { .reg
= S5PC100_CLKDIV2
, .shift
= 12, .size
= 4, },
649 .reg_src
= { .reg
= S5PC100_CLKSRC1
, .shift
= 12, .size
= 2, },
654 .ctrlbit
= S5PC100_CLKGATE_SCLK0_UART
,
655 .enable
= s5pc100_sclk0_ctrl
,
657 .sources
= &clkset_uart
,
658 .reg_div
= { .reg
= S5PC100_CLKDIV2
, .shift
= 0, .size
= 3, },
659 .reg_src
= { .reg
= S5PC100_CLKSRC1
, .shift
= 0, .size
= 1, },
665 .sources
= &clkset_spdif
,
666 .reg_src
= { .reg
= S5PC100_CLKSRC3
, .shift
= 24, .size
= 2, },
671 .ctrlbit
= S5PC100_CLKGATE_SCLK1_LCD
,
672 .enable
= s5pc100_sclk1_ctrl
,
674 .sources
= &clkset_lcd_fimc
,
675 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 12, .size
= 4, },
676 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 12, .size
= 2, },
681 .ctrlbit
= S5PC100_CLKGATE_SCLK1_FIMC0
,
682 .enable
= s5pc100_sclk1_ctrl
,
684 .sources
= &clkset_lcd_fimc
,
685 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 16, .size
= 4, },
686 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 16, .size
= 2, },
691 .ctrlbit
= S5PC100_CLKGATE_SCLK1_FIMC1
,
692 .enable
= s5pc100_sclk1_ctrl
,
694 .sources
= &clkset_lcd_fimc
,
695 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 20, .size
= 4, },
696 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 20, .size
= 2, },
701 .ctrlbit
= S5PC100_CLKGATE_SCLK1_FIMC2
,
702 .enable
= s5pc100_sclk1_ctrl
,
704 .sources
= &clkset_lcd_fimc
,
705 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 24, .size
= 4, },
706 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 24, .size
= 2, },
711 .ctrlbit
= S5PC100_CLKGATE_SCLK0_MMC0
,
712 .enable
= s5pc100_sclk0_ctrl
,
714 .sources
= &clkset_mmc
,
715 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 0, .size
= 4, },
716 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 0, .size
= 2, },
721 .ctrlbit
= S5PC100_CLKGATE_SCLK0_MMC1
,
722 .enable
= s5pc100_sclk0_ctrl
,
724 .sources
= &clkset_mmc
,
725 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 4, .size
= 4, },
726 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 4, .size
= 2, },
731 .ctrlbit
= S5PC100_CLKGATE_SCLK0_MMC2
,
732 .enable
= s5pc100_sclk0_ctrl
,
734 .sources
= &clkset_mmc
,
735 .reg_div
= { .reg
= S5PC100_CLKDIV3
, .shift
= 8, .size
= 4, },
736 .reg_src
= { .reg
= S5PC100_CLKSRC2
, .shift
= 8, .size
= 2, },
741 .ctrlbit
= S5PC100_CLKGATE_SCLK0_USBHOST
,
742 .enable
= s5pc100_sclk0_ctrl
,
744 .sources
= &clkset_usbhost
,
745 .reg_div
= { .reg
= S5PC100_CLKDIV2
, .shift
= 20, .size
= 4, },
746 .reg_src
= { .reg
= S5PC100_CLKSRC1
, .shift
= 20, .size
= 2, },
750 /* Clock initialisation code */
752 static struct clksrc_clk
*init_parents
[] = {
761 #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1)
763 void __init_or_cpufreq
s5pc100_setup_clocks(void)
765 struct clk
*xtal_clk
;
767 unsigned long armclk
;
768 unsigned long hclkd0
;
770 unsigned long pclkd0
;
772 unsigned long apll
, mpll
, epll
, hpll
;
774 u32 clkdiv0
, clkdiv1
;
776 printk(KERN_DEBUG
"%s: registering clocks\n", __func__
);
778 clkdiv0
= __raw_readl(S5PC100_CLKDIV0
);
779 clkdiv1
= __raw_readl(S5PC100_CLKDIV1
);
781 printk(KERN_DEBUG
"%s: clkdiv0 = %08x, clkdiv1 = %08x\n", __func__
, clkdiv0
, clkdiv1
);
783 xtal_clk
= clk_get(NULL
, "xtal");
784 BUG_ON(IS_ERR(xtal_clk
));
786 xtal
= clk_get_rate(xtal_clk
);
789 printk(KERN_DEBUG
"%s: xtal is %ld\n", __func__
, xtal
);
791 apll
= s5pc1xx_get_pll(xtal
, __raw_readl(S5PC100_APLL_CON
));
792 mpll
= s5pc1xx_get_pll(xtal
, __raw_readl(S5PC100_MPLL_CON
));
793 epll
= s5pc1xx_get_pll(xtal
, __raw_readl(S5PC100_EPLL_CON
));
794 hpll
= s5pc1xx_get_pll(xtal
, __raw_readl(S5PC100_HPLL_CON
));
796 printk(KERN_INFO
"S5PC100: Apll=%ld.%03ld Mhz, Mpll=%ld.%03ld Mhz"
797 ", Epll=%ld.%03ld Mhz, Hpll=%ld.%03ld Mhz\n",
798 print_mhz(apll
), print_mhz(mpll
),
799 print_mhz(epll
), print_mhz(hpll
));
801 armclk
= apll
/ GET_DIV(clkdiv0
, S5PC100_CLKDIV0_APLL
);
802 armclk
= armclk
/ GET_DIV(clkdiv0
, S5PC100_CLKDIV0_ARM
);
803 hclkd0
= armclk
/ GET_DIV(clkdiv0
, S5PC100_CLKDIV0_D0
);
804 pclkd0
= hclkd0
/ GET_DIV(clkdiv0
, S5PC100_CLKDIV0_PCLKD0
);
805 hclk
= mpll
/ GET_DIV(clkdiv1
, S5PC100_CLKDIV1_D1
);
806 pclk
= hclk
/ GET_DIV(clkdiv1
, S5PC100_CLKDIV1_PCLKD1
);
808 printk(KERN_INFO
"S5PC100: ARMCLK=%ld.%03ld MHz, HCLKD0=%ld.%03ld MHz,"
809 " PCLKD0=%ld.%03ld MHz\n, HCLK=%ld.%03ld MHz,"
810 " PCLK=%ld.%03ld MHz\n",
811 print_mhz(armclk
), print_mhz(hclkd0
),
812 print_mhz(pclkd0
), print_mhz(hclk
), print_mhz(pclk
));
814 clk_fout_apll
.rate
= apll
;
815 clk_fout_mpll
.rate
= mpll
;
816 clk_fout_epll
.rate
= epll
;
817 clk_fout_hpll
.rate
= hpll
;
823 for (ptr
= 0; ptr
< ARRAY_SIZE(init_parents
); ptr
++)
824 s3c_set_clksrc(init_parents
[ptr
], true);
826 for (ptr
= 0; ptr
< ARRAY_SIZE(clksrc_audio
); ptr
++)
827 s3c_set_clksrc(clksrc_audio
+ ptr
, true);
829 for (ptr
= 0; ptr
< ARRAY_SIZE(clksrc_clks
); ptr
++)
830 s3c_set_clksrc(clksrc_clks
+ ptr
, true);
833 static struct clk
*clks
[] __initdata
= {
845 &clk_mout_onenand
.clk
,
859 void __init
s5pc100_register_clocks(void)
865 for (ptr
= 0; ptr
< ARRAY_SIZE(clks
); ptr
++) {
867 ret
= s3c24xx_register_clock(clkp
);
869 printk(KERN_ERR
"Failed to register clock %s (%d)\n",
874 s3c_register_clksrc(clksrc_audio
, ARRAY_SIZE(clksrc_audio
));
875 s3c_register_clksrc(clksrc_clks
, ARRAY_SIZE(clksrc_clks
));