1 /* linux/arch/arm/plat-s5p/clock.c
3 * Copyright 2009 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com/
6 * S5P - Common 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/init.h>
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/list.h>
17 #include <linux/errno.h>
18 #include <linux/err.h>
19 #include <linux/clk.h>
20 #include <linux/sysdev.h>
22 #include <asm/div64.h>
24 #include <plat/clock.h>
25 #include <plat/clock-clksrc.h>
26 #include <plat/s5p-clock.h>
28 /* fin_apll, fin_mpll and fin_epll are all the same clock, which we call
31 struct clk clk_ext_xtal_mux
= {
36 /* 48MHz USB Phy clock output */
37 struct clk clk_48m
= {
44 * No need .ctrlbit, this is always on
46 struct clk clk_fout_apll
= {
52 * No need .ctrlbit, this is always on
54 struct clk clk_fout_mpll
= {
59 /* EPLL clock output */
60 struct clk clk_fout_epll
= {
67 struct clk clk_arm
= {
74 /* Possible clock sources for APLL Mux */
75 static struct clk
*clk_src_apll_list
[] = {
80 struct clksrc_sources clk_src_apll
= {
81 .sources
= clk_src_apll_list
,
82 .nr_sources
= ARRAY_SIZE(clk_src_apll_list
),
85 /* Possible clock sources for MPLL Mux */
86 static struct clk
*clk_src_mpll_list
[] = {
91 struct clksrc_sources clk_src_mpll
= {
92 .sources
= clk_src_mpll_list
,
93 .nr_sources
= ARRAY_SIZE(clk_src_mpll_list
),
96 /* Possible clock sources for EPLL Mux */
97 static struct clk
*clk_src_epll_list
[] = {
102 struct clksrc_sources clk_src_epll
= {
103 .sources
= clk_src_epll_list
,
104 .nr_sources
= ARRAY_SIZE(clk_src_epll_list
),
107 int s5p_gatectrl(void __iomem
*reg
, struct clk
*clk
, int enable
)
109 unsigned int ctrlbit
= clk
->ctrlbit
;
112 con
= __raw_readl(reg
);
113 con
= enable
? (con
| ctrlbit
) : (con
& ~ctrlbit
);
114 __raw_writel(con
, reg
);
118 static struct clk
*s5p_clks
[] __initdata
= {
127 void __init
s5p_register_clocks(unsigned long xtal_freq
)
131 clk_ext_xtal_mux
.rate
= xtal_freq
;
133 ret
= s3c24xx_register_clocks(s5p_clks
, ARRAY_SIZE(s5p_clks
));
135 printk(KERN_ERR
"Failed to register s5p clocks\n");