aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/clock.c')
-rw-r--r--arch/arm/mach-omap2/clock.c46
1 files changed, 42 insertions, 4 deletions
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index 1d891e4a6933..aa9b37370d44 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -26,6 +26,7 @@
26#include <asm/io.h> 26#include <asm/io.h>
27 27
28#include <mach/clock.h> 28#include <mach/clock.h>
29#include <mach/clockdomain.h>
29#include <mach/sram.h> 30#include <mach/sram.h>
30#include <mach/cpu.h> 31#include <mach/cpu.h>
31#include <asm/div64.h> 32#include <asm/div64.h>
@@ -62,10 +63,36 @@
62u8 cpu_mask; 63u8 cpu_mask;
63 64
64/*------------------------------------------------------------------------- 65/*-------------------------------------------------------------------------
65 * Omap2 specific clock functions 66 * OMAP2/3 specific clock functions
66 *-------------------------------------------------------------------------*/ 67 *-------------------------------------------------------------------------*/
67 68
68/** 69/**
70 * omap2_init_clk_clkdm - look up a clockdomain name, store pointer in clk
71 * @clk: OMAP clock struct ptr to use
72 *
73 * Convert a clockdomain name stored in a struct clk 'clk' into a
74 * clockdomain pointer, and save it into the struct clk. Intended to be
75 * called during clk_register(). No return value.
76 */
77void omap2_init_clk_clkdm(struct clk *clk)
78{
79 struct clockdomain *clkdm;
80
81 if (!clk->clkdm_name)
82 return;
83
84 clkdm = clkdm_lookup(clk->clkdm_name);
85 if (clkdm) {
86 pr_debug("clock: associated clk %s to clkdm %s\n",
87 clk->name, clk->clkdm_name);
88 clk->clkdm = clkdm;
89 } else {
90 pr_debug("clock: could not associate clk %s to "
91 "clkdm %s\n", clk->name, clk->clkdm_name);
92 }
93}
94
95/**
69 * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware 96 * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware
70 * @clk: OMAP clock struct ptr to use 97 * @clk: OMAP clock struct ptr to use
71 * 98 *
@@ -308,6 +335,9 @@ void omap2_clk_disable(struct clk *clk)
308 _omap2_clk_disable(clk); 335 _omap2_clk_disable(clk);
309 if (likely((u32)clk->parent)) 336 if (likely((u32)clk->parent))
310 omap2_clk_disable(clk->parent); 337 omap2_clk_disable(clk->parent);
338 if (clk->clkdm)
339 omap2_clkdm_clk_disable(clk->clkdm, clk);
340
311 } 341 }
312} 342}
313 343
@@ -324,11 +354,19 @@ int omap2_clk_enable(struct clk *clk)
324 return ret; 354 return ret;
325 } 355 }
326 356
357 if (clk->clkdm)
358 omap2_clkdm_clk_enable(clk->clkdm, clk);
359
327 ret = _omap2_clk_enable(clk); 360 ret = _omap2_clk_enable(clk);
328 361
329 if (unlikely(ret != 0) && clk->parent) { 362 if (unlikely(ret != 0)) {
330 omap2_clk_disable(clk->parent); 363 if (clk->clkdm)
331 clk->usecount--; 364 omap2_clkdm_clk_disable(clk->clkdm, clk);
365
366 if (clk->parent) {
367 omap2_clk_disable(clk->parent);
368 clk->usecount--;
369 }
332 } 370 }
333 } 371 }
334 372