diff options
Diffstat (limited to 'arch/arm/mach-omap2/clock.c')
-rw-r--r-- | arch/arm/mach-omap2/clock.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 180299e4a83..1334f595eab 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | #include "clock.h" | 33 | #include "clock.h" |
34 | #include "cm2xxx_3xxx.h" | 34 | #include "cm2xxx_3xxx.h" |
35 | #include "cm44xx.h" | ||
35 | #include "cm-regbits-24xx.h" | 36 | #include "cm-regbits-24xx.h" |
36 | #include "cm-regbits-34xx.h" | 37 | #include "cm-regbits-34xx.h" |
37 | 38 | ||
@@ -43,6 +44,11 @@ u8 cpu_mask; | |||
43 | 44 | ||
44 | /* Private functions */ | 45 | /* Private functions */ |
45 | 46 | ||
47 | static void _omap4_module_wait_ready(struct clk *clk) | ||
48 | { | ||
49 | omap4_cm_wait_module_ready(clk->enable_reg); | ||
50 | } | ||
51 | |||
46 | /** | 52 | /** |
47 | * _omap2_module_wait_ready - wait for an OMAP module to leave IDLE | 53 | * _omap2_module_wait_ready - wait for an OMAP module to leave IDLE |
48 | * @clk: struct clk * belonging to the module | 54 | * @clk: struct clk * belonging to the module |
@@ -190,8 +196,12 @@ int omap2_dflt_clk_enable(struct clk *clk) | |||
190 | __raw_writel(v, clk->enable_reg); | 196 | __raw_writel(v, clk->enable_reg); |
191 | v = __raw_readl(clk->enable_reg); /* OCP barrier */ | 197 | v = __raw_readl(clk->enable_reg); /* OCP barrier */ |
192 | 198 | ||
193 | if (clk->ops->find_idlest) | 199 | if (clk->ops->find_idlest) { |
194 | _omap2_module_wait_ready(clk); | 200 | if (cpu_is_omap44xx()) |
201 | _omap4_module_wait_ready(clk); | ||
202 | else | ||
203 | _omap2_module_wait_ready(clk); | ||
204 | } | ||
195 | 205 | ||
196 | return 0; | 206 | return 0; |
197 | } | 207 | } |
@@ -219,6 +229,12 @@ void omap2_dflt_clk_disable(struct clk *clk) | |||
219 | /* No OCP barrier needed here since it is a disable operation */ | 229 | /* No OCP barrier needed here since it is a disable operation */ |
220 | } | 230 | } |
221 | 231 | ||
232 | const struct clkops clkops_omap4_dflt_wait = { | ||
233 | .enable = omap2_dflt_clk_enable, | ||
234 | .disable = omap2_dflt_clk_disable, | ||
235 | .find_idlest = omap2_clk_dflt_find_idlest, | ||
236 | }; | ||
237 | |||
222 | const struct clkops clkops_omap2_dflt_wait = { | 238 | const struct clkops clkops_omap2_dflt_wait = { |
223 | .enable = omap2_dflt_clk_enable, | 239 | .enable = omap2_dflt_clk_enable, |
224 | .disable = omap2_dflt_clk_disable, | 240 | .disable = omap2_dflt_clk_disable, |
@@ -327,6 +343,10 @@ int omap2_clk_enable(struct clk *clk) | |||
327 | } | 343 | } |
328 | } | 344 | } |
329 | 345 | ||
346 | /* If clockdomain supports hardware control, enable it */ | ||
347 | if (clk->clkdm) | ||
348 | clkdm_allow_idle(clk->clkdm); | ||
349 | |||
330 | return 0; | 350 | return 0; |
331 | 351 | ||
332 | oce_err3: | 352 | oce_err3: |