diff options
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clkt2xxx_apll.c | 120 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock2xxx.c | 86 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock2xxx.h | 1 |
4 files changed, 124 insertions, 86 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 2b58363a8947..825c303f671f 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -12,7 +12,8 @@ clock-common = clock.o clock_common_data.o \ | |||
12 | clockdomain.o clkt_dpll.o \ | 12 | clockdomain.o clkt_dpll.o \ |
13 | clkt_clksel.o | 13 | clkt_clksel.o |
14 | clock-omap2xxx = clkt2xxx_dpllcore.o \ | 14 | clock-omap2xxx = clkt2xxx_dpllcore.o \ |
15 | clkt2xxx_virt_prcm_set.o | 15 | clkt2xxx_virt_prcm_set.o \ |
16 | clkt2xxx_apll.o | ||
16 | 17 | ||
17 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(clock-common) \ | 18 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(clock-common) \ |
18 | $(clock-omap2xxx) | 19 | $(clock-omap2xxx) |
diff --git a/arch/arm/mach-omap2/clkt2xxx_apll.c b/arch/arm/mach-omap2/clkt2xxx_apll.c new file mode 100644 index 000000000000..fc32ff8e790f --- /dev/null +++ b/arch/arm/mach-omap2/clkt2xxx_apll.c | |||
@@ -0,0 +1,120 @@ | |||
1 | /* | ||
2 | * OMAP2xxx APLL clock control functions | ||
3 | * | ||
4 | * Copyright (C) 2005-2008 Texas Instruments, Inc. | ||
5 | * Copyright (C) 2004-2010 Nokia Corporation | ||
6 | * | ||
7 | * Contacts: | ||
8 | * Richard Woodruff <r-woodruff2@ti.com> | ||
9 | * Paul Walmsley | ||
10 | * | ||
11 | * Based on earlier work by Tuukka Tikkanen, Tony Lindgren, | ||
12 | * Gordon McNutt and RidgeRun, Inc. | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | */ | ||
18 | #undef DEBUG | ||
19 | |||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/clk.h> | ||
22 | #include <linux/io.h> | ||
23 | |||
24 | #include <plat/clock.h> | ||
25 | #include <plat/prcm.h> | ||
26 | |||
27 | #include "clock.h" | ||
28 | #include "clock2xxx.h" | ||
29 | #include "cm.h" | ||
30 | #include "cm-regbits-24xx.h" | ||
31 | |||
32 | /* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */ | ||
33 | #define EN_APLL_STOPPED 0 | ||
34 | #define EN_APLL_LOCKED 3 | ||
35 | |||
36 | /* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */ | ||
37 | #define APLLS_CLKIN_19_2MHZ 0 | ||
38 | #define APLLS_CLKIN_13MHZ 2 | ||
39 | #define APLLS_CLKIN_12MHZ 3 | ||
40 | |||
41 | /* Private functions */ | ||
42 | |||
43 | /* Enable an APLL if off */ | ||
44 | static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) | ||
45 | { | ||
46 | u32 cval, apll_mask; | ||
47 | |||
48 | apll_mask = EN_APLL_LOCKED << clk->enable_bit; | ||
49 | |||
50 | cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
51 | |||
52 | if ((cval & apll_mask) == apll_mask) | ||
53 | return 0; /* apll already enabled */ | ||
54 | |||
55 | cval &= ~apll_mask; | ||
56 | cval |= apll_mask; | ||
57 | cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); | ||
58 | |||
59 | omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), status_mask, | ||
60 | clk->name); | ||
61 | |||
62 | /* | ||
63 | * REVISIT: Should we return an error code if omap2_wait_clock_ready() | ||
64 | * fails? | ||
65 | */ | ||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static int omap2_clk_apll96_enable(struct clk *clk) | ||
70 | { | ||
71 | return omap2_clk_apll_enable(clk, OMAP24XX_ST_96M_APLL); | ||
72 | } | ||
73 | |||
74 | static int omap2_clk_apll54_enable(struct clk *clk) | ||
75 | { | ||
76 | return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL); | ||
77 | } | ||
78 | |||
79 | /* Stop APLL */ | ||
80 | static void omap2_clk_apll_disable(struct clk *clk) | ||
81 | { | ||
82 | u32 cval; | ||
83 | |||
84 | cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
85 | cval &= ~(EN_APLL_LOCKED << clk->enable_bit); | ||
86 | cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); | ||
87 | } | ||
88 | |||
89 | /* Public data */ | ||
90 | |||
91 | const struct clkops clkops_apll96 = { | ||
92 | .enable = omap2_clk_apll96_enable, | ||
93 | .disable = omap2_clk_apll_disable, | ||
94 | }; | ||
95 | |||
96 | const struct clkops clkops_apll54 = { | ||
97 | .enable = omap2_clk_apll54_enable, | ||
98 | .disable = omap2_clk_apll_disable, | ||
99 | }; | ||
100 | |||
101 | /* Public functions */ | ||
102 | |||
103 | u32 omap2xxx_get_apll_clkin(void) | ||
104 | { | ||
105 | u32 aplls, srate = 0; | ||
106 | |||
107 | aplls = cm_read_mod_reg(PLL_MOD, CM_CLKSEL1); | ||
108 | aplls &= OMAP24XX_APLLS_CLKIN_MASK; | ||
109 | aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT; | ||
110 | |||
111 | if (aplls == APLLS_CLKIN_19_2MHZ) | ||
112 | srate = 19200000; | ||
113 | else if (aplls == APLLS_CLKIN_13MHZ) | ||
114 | srate = 13000000; | ||
115 | else if (aplls == APLLS_CLKIN_12MHZ) | ||
116 | srate = 12000000; | ||
117 | |||
118 | return srate; | ||
119 | } | ||
120 | |||
diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index 11d6edb0b32f..88077e746966 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c | |||
@@ -44,16 +44,6 @@ | |||
44 | #include "cm.h" | 44 | #include "cm.h" |
45 | #include "cm-regbits-24xx.h" | 45 | #include "cm-regbits-24xx.h" |
46 | 46 | ||
47 | |||
48 | /* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */ | ||
49 | #define EN_APLL_STOPPED 0 | ||
50 | #define EN_APLL_LOCKED 3 | ||
51 | |||
52 | /* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */ | ||
53 | #define APLLS_CLKIN_19_2MHZ 0 | ||
54 | #define APLLS_CLKIN_13MHZ 2 | ||
55 | #define APLLS_CLKIN_12MHZ 3 | ||
56 | |||
57 | struct clk *vclk, *sclk, *dclk; | 47 | struct clk *vclk, *sclk, *dclk; |
58 | 48 | ||
59 | void __iomem *prcm_clksrc_ctrl; | 49 | void __iomem *prcm_clksrc_ctrl; |
@@ -126,80 +116,6 @@ static void omap2_sys_clk_recalc(struct clk *clk) | |||
126 | } | 116 | } |
127 | #endif /* OLD_CK */ | 117 | #endif /* OLD_CK */ |
128 | 118 | ||
129 | /* Enable an APLL if off */ | ||
130 | static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) | ||
131 | { | ||
132 | u32 cval, apll_mask; | ||
133 | |||
134 | apll_mask = EN_APLL_LOCKED << clk->enable_bit; | ||
135 | |||
136 | cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
137 | |||
138 | if ((cval & apll_mask) == apll_mask) | ||
139 | return 0; /* apll already enabled */ | ||
140 | |||
141 | cval &= ~apll_mask; | ||
142 | cval |= apll_mask; | ||
143 | cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); | ||
144 | |||
145 | omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), status_mask, | ||
146 | clk->name); | ||
147 | |||
148 | /* | ||
149 | * REVISIT: Should we return an error code if omap2_wait_clock_ready() | ||
150 | * fails? | ||
151 | */ | ||
152 | return 0; | ||
153 | } | ||
154 | |||
155 | static int omap2_clk_apll96_enable(struct clk *clk) | ||
156 | { | ||
157 | return omap2_clk_apll_enable(clk, OMAP24XX_ST_96M_APLL); | ||
158 | } | ||
159 | |||
160 | static int omap2_clk_apll54_enable(struct clk *clk) | ||
161 | { | ||
162 | return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL); | ||
163 | } | ||
164 | |||
165 | /* Stop APLL */ | ||
166 | static void omap2_clk_apll_disable(struct clk *clk) | ||
167 | { | ||
168 | u32 cval; | ||
169 | |||
170 | cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
171 | cval &= ~(EN_APLL_LOCKED << clk->enable_bit); | ||
172 | cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); | ||
173 | } | ||
174 | |||
175 | const struct clkops clkops_apll96 = { | ||
176 | .enable = omap2_clk_apll96_enable, | ||
177 | .disable = omap2_clk_apll_disable, | ||
178 | }; | ||
179 | |||
180 | const struct clkops clkops_apll54 = { | ||
181 | .enable = omap2_clk_apll54_enable, | ||
182 | .disable = omap2_clk_apll_disable, | ||
183 | }; | ||
184 | |||
185 | static u32 omap2_get_apll_clkin(void) | ||
186 | { | ||
187 | u32 aplls, srate = 0; | ||
188 | |||
189 | aplls = cm_read_mod_reg(PLL_MOD, CM_CLKSEL1); | ||
190 | aplls &= OMAP24XX_APLLS_CLKIN_MASK; | ||
191 | aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT; | ||
192 | |||
193 | if (aplls == APLLS_CLKIN_19_2MHZ) | ||
194 | srate = 19200000; | ||
195 | else if (aplls == APLLS_CLKIN_13MHZ) | ||
196 | srate = 13000000; | ||
197 | else if (aplls == APLLS_CLKIN_12MHZ) | ||
198 | srate = 12000000; | ||
199 | |||
200 | return srate; | ||
201 | } | ||
202 | |||
203 | static u32 omap2_get_sysclkdiv(void) | 119 | static u32 omap2_get_sysclkdiv(void) |
204 | { | 120 | { |
205 | u32 div; | 121 | u32 div; |
@@ -213,7 +129,7 @@ static u32 omap2_get_sysclkdiv(void) | |||
213 | 129 | ||
214 | unsigned long omap2_osc_clk_recalc(struct clk *clk) | 130 | unsigned long omap2_osc_clk_recalc(struct clk *clk) |
215 | { | 131 | { |
216 | return omap2_get_apll_clkin() * omap2_get_sysclkdiv(); | 132 | return omap2xxx_get_apll_clkin() * omap2_get_sysclkdiv(); |
217 | } | 133 | } |
218 | 134 | ||
219 | unsigned long omap2_sys_clk_recalc(struct clk *clk) | 135 | unsigned long omap2_sys_clk_recalc(struct clk *clk) |
diff --git a/arch/arm/mach-omap2/clock2xxx.h b/arch/arm/mach-omap2/clock2xxx.h index e35efde4bd80..3f1672e071c2 100644 --- a/arch/arm/mach-omap2/clock2xxx.h +++ b/arch/arm/mach-omap2/clock2xxx.h | |||
@@ -17,6 +17,7 @@ unsigned long omap2_sys_clk_recalc(struct clk *clk); | |||
17 | unsigned long omap2_dpllcore_recalc(struct clk *clk); | 17 | unsigned long omap2_dpllcore_recalc(struct clk *clk); |
18 | int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate); | 18 | int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate); |
19 | unsigned long omap2xxx_clk_get_core_rate(struct clk *clk); | 19 | unsigned long omap2xxx_clk_get_core_rate(struct clk *clk); |
20 | u32 omap2xxx_get_apll_clkin(void); | ||
20 | 21 | ||
21 | /* REVISIT: These should be set dynamically for CONFIG_MULTI_OMAP2 */ | 22 | /* REVISIT: These should be set dynamically for CONFIG_MULTI_OMAP2 */ |
22 | #ifdef CONFIG_ARCH_OMAP2420 | 23 | #ifdef CONFIG_ARCH_OMAP2420 |