diff options
Diffstat (limited to 'arch/arm/mach-omap2/clock.c')
-rw-r--r-- | arch/arm/mach-omap2/clock.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 4716206547ac..759c72a48f7f 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -70,9 +70,41 @@ | |||
70 | u8 cpu_mask; | 70 | u8 cpu_mask; |
71 | 71 | ||
72 | /*------------------------------------------------------------------------- | 72 | /*------------------------------------------------------------------------- |
73 | * OMAP2/3 specific clock functions | 73 | * OMAP2/3/4 specific clock functions |
74 | *-------------------------------------------------------------------------*/ | 74 | *-------------------------------------------------------------------------*/ |
75 | 75 | ||
76 | void omap2_init_dpll_parent(struct clk *clk) | ||
77 | { | ||
78 | u32 v; | ||
79 | struct dpll_data *dd; | ||
80 | |||
81 | dd = clk->dpll_data; | ||
82 | if (!dd) | ||
83 | return; | ||
84 | |||
85 | /* Return bypass rate if DPLL is bypassed */ | ||
86 | v = __raw_readl(dd->control_reg); | ||
87 | v &= dd->enable_mask; | ||
88 | v >>= __ffs(dd->enable_mask); | ||
89 | |||
90 | /* Reparent in case the dpll is in bypass */ | ||
91 | if (cpu_is_omap24xx()) { | ||
92 | if (v == OMAP2XXX_EN_DPLL_LPBYPASS || | ||
93 | v == OMAP2XXX_EN_DPLL_FRBYPASS) | ||
94 | clk_reparent(clk, dd->clk_bypass); | ||
95 | } else if (cpu_is_omap34xx()) { | ||
96 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || | ||
97 | v == OMAP3XXX_EN_DPLL_FRBYPASS) | ||
98 | clk_reparent(clk, dd->clk_bypass); | ||
99 | } else if (cpu_is_omap44xx()) { | ||
100 | if (v == OMAP4XXX_EN_DPLL_LPBYPASS || | ||
101 | v == OMAP4XXX_EN_DPLL_FRBYPASS || | ||
102 | v == OMAP4XXX_EN_DPLL_MNBYPASS) | ||
103 | clk_reparent(clk, dd->clk_bypass); | ||
104 | } | ||
105 | return; | ||
106 | } | ||
107 | |||
76 | /** | 108 | /** |
77 | * _omap2xxx_clk_commit - commit clock parent/rate changes in hardware | 109 | * _omap2xxx_clk_commit - commit clock parent/rate changes in hardware |
78 | * @clk: struct clk * | 110 | * @clk: struct clk * |
@@ -149,6 +181,7 @@ static int _dpll_test_fint(struct clk *clk, u8 n) | |||
149 | * clockdomain pointer, and save it into the struct clk. Intended to be | 181 | * clockdomain pointer, and save it into the struct clk. Intended to be |
150 | * called during clk_register(). No return value. | 182 | * called during clk_register(). No return value. |
151 | */ | 183 | */ |
184 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ | ||
152 | void omap2_init_clk_clkdm(struct clk *clk) | 185 | void omap2_init_clk_clkdm(struct clk *clk) |
153 | { | 186 | { |
154 | struct clockdomain *clkdm; | 187 | struct clockdomain *clkdm; |
@@ -166,6 +199,7 @@ void omap2_init_clk_clkdm(struct clk *clk) | |||
166 | "clkdm %s\n", clk->name, clk->clkdm_name); | 199 | "clkdm %s\n", clk->name, clk->clkdm_name); |
167 | } | 200 | } |
168 | } | 201 | } |
202 | #endif | ||
169 | 203 | ||
170 | /** | 204 | /** |
171 | * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware | 205 | * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware |
@@ -247,6 +281,11 @@ u32 omap2_get_dpll_rate(struct clk *clk) | |||
247 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || | 281 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || |
248 | v == OMAP3XXX_EN_DPLL_FRBYPASS) | 282 | v == OMAP3XXX_EN_DPLL_FRBYPASS) |
249 | return dd->clk_bypass->rate; | 283 | return dd->clk_bypass->rate; |
284 | } else if (cpu_is_omap44xx()) { | ||
285 | if (v == OMAP4XXX_EN_DPLL_LPBYPASS || | ||
286 | v == OMAP4XXX_EN_DPLL_FRBYPASS || | ||
287 | v == OMAP4XXX_EN_DPLL_MNBYPASS) | ||
288 | return dd->clk_bypass->rate; | ||
250 | } | 289 | } |
251 | 290 | ||
252 | v = __raw_readl(dd->mult_div1_reg); | 291 | v = __raw_readl(dd->mult_div1_reg); |
@@ -437,8 +476,10 @@ void omap2_clk_disable(struct clk *clk) | |||
437 | _omap2_clk_disable(clk); | 476 | _omap2_clk_disable(clk); |
438 | if (clk->parent) | 477 | if (clk->parent) |
439 | omap2_clk_disable(clk->parent); | 478 | omap2_clk_disable(clk->parent); |
479 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ | ||
440 | if (clk->clkdm) | 480 | if (clk->clkdm) |
441 | omap2_clkdm_clk_disable(clk->clkdm, clk); | 481 | omap2_clkdm_clk_disable(clk->clkdm, clk); |
482 | #endif | ||
442 | 483 | ||
443 | } | 484 | } |
444 | } | 485 | } |
@@ -448,8 +489,10 @@ int omap2_clk_enable(struct clk *clk) | |||
448 | int ret = 0; | 489 | int ret = 0; |
449 | 490 | ||
450 | if (clk->usecount++ == 0) { | 491 | if (clk->usecount++ == 0) { |
492 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ | ||
451 | if (clk->clkdm) | 493 | if (clk->clkdm) |
452 | omap2_clkdm_clk_enable(clk->clkdm, clk); | 494 | omap2_clkdm_clk_enable(clk->clkdm, clk); |
495 | #endif | ||
453 | 496 | ||
454 | if (clk->parent) { | 497 | if (clk->parent) { |
455 | ret = omap2_clk_enable(clk->parent); | 498 | ret = omap2_clk_enable(clk->parent); |
@@ -468,8 +511,10 @@ int omap2_clk_enable(struct clk *clk) | |||
468 | return ret; | 511 | return ret; |
469 | 512 | ||
470 | err: | 513 | err: |
514 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ | ||
471 | if (clk->clkdm) | 515 | if (clk->clkdm) |
472 | omap2_clkdm_clk_disable(clk->clkdm, clk); | 516 | omap2_clkdm_clk_disable(clk->clkdm, clk); |
517 | #endif | ||
473 | clk->usecount--; | 518 | clk->usecount--; |
474 | return ret; | 519 | return ret; |
475 | } | 520 | } |