Commit 333943ba authored by Paul Walmsley's avatar Paul Walmsley Committed by Tony Lindgren

ARM: OMAP2: Clockdomain: Integrate OMAP3 clocks with clockdomain code

This patch integrates the OMAP3 clock tree with the clockdomain code.
This patch:

- marks OMAP34xx clocks with their corresponding clockdomain.

- adds code to convert the clockdomain name to a clockdomain pointer in the
  struct clk during clk_register().

- modifies OMAP2 clock usecounting to call into the clockdomain code
  when clocks are enabled or disabled.
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>


parent d1b03f61
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <mach/clock.h> #include <mach/clock.h>
#include <mach/clockdomain.h>
#include <mach/sram.h> #include <mach/sram.h>
#include <mach/cpu.h> #include <mach/cpu.h>
#include <asm/div64.h> #include <asm/div64.h>
...@@ -62,9 +63,35 @@ ...@@ -62,9 +63,35 @@
u8 cpu_mask; u8 cpu_mask;
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* Omap2 specific clock functions * OMAP2/3 specific clock functions
*-------------------------------------------------------------------------*/ *-------------------------------------------------------------------------*/
/**
* omap2_init_clk_clkdm - look up a clockdomain name, store pointer in clk
* @clk: OMAP clock struct ptr to use
*
* Convert a clockdomain name stored in a struct clk 'clk' into a
* clockdomain pointer, and save it into the struct clk. Intended to be
* called during clk_register(). No return value.
*/
void omap2_init_clk_clkdm(struct clk *clk)
{
struct clockdomain *clkdm;
if (!clk->clkdm_name)
return;
clkdm = clkdm_lookup(clk->clkdm_name);
if (clkdm) {
pr_debug("clock: associated clk %s to clkdm %s\n",
clk->name, clk->clkdm_name);
clk->clkdm = clkdm;
} else {
pr_debug("clock: could not associate clk %s to "
"clkdm %s\n", clk->name, clk->clkdm_name);
}
}
/** /**
* omap2_init_clksel_parent - set a clksel clk's parent field from the hardware * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware
* @clk: OMAP clock struct ptr to use * @clk: OMAP clock struct ptr to use
...@@ -308,6 +335,9 @@ void omap2_clk_disable(struct clk *clk) ...@@ -308,6 +335,9 @@ void omap2_clk_disable(struct clk *clk)
_omap2_clk_disable(clk); _omap2_clk_disable(clk);
if (likely((u32)clk->parent)) if (likely((u32)clk->parent))
omap2_clk_disable(clk->parent); omap2_clk_disable(clk->parent);
if (clk->clkdm)
omap2_clkdm_clk_disable(clk->clkdm, clk);
} }
} }
...@@ -324,11 +354,19 @@ int omap2_clk_enable(struct clk *clk) ...@@ -324,11 +354,19 @@ int omap2_clk_enable(struct clk *clk)
return ret; return ret;
} }
if (clk->clkdm)
omap2_clkdm_clk_enable(clk->clkdm, clk);
ret = _omap2_clk_enable(clk); ret = _omap2_clk_enable(clk);
if (unlikely(ret != 0) && clk->parent) { if (unlikely(ret != 0)) {
omap2_clk_disable(clk->parent); if (clk->clkdm)
clk->usecount--; omap2_clkdm_clk_disable(clk->clkdm, clk);
if (clk->parent) {
omap2_clk_disable(clk->parent);
clk->usecount--;
}
} }
} }
......
...@@ -36,6 +36,7 @@ void omap2_clk_disable_unused(struct clk *clk); ...@@ -36,6 +36,7 @@ void omap2_clk_disable_unused(struct clk *clk);
#endif #endif
void omap2_clksel_recalc(struct clk *clk); void omap2_clksel_recalc(struct clk *clk);
void omap2_init_clk_clkdm(struct clk *clk);
void omap2_init_clksel_parent(struct clk *clk); void omap2_init_clksel_parent(struct clk *clk);
u32 omap2_clksel_get_divisor(struct clk *clk); u32 omap2_clksel_get_divisor(struct clk *clk);
u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate, u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
......
...@@ -489,8 +489,10 @@ int __init omap2_clk_init(void) ...@@ -489,8 +489,10 @@ int __init omap2_clk_init(void)
for (clkp = onchip_34xx_clks; for (clkp = onchip_34xx_clks;
clkp < onchip_34xx_clks + ARRAY_SIZE(onchip_34xx_clks); clkp < onchip_34xx_clks + ARRAY_SIZE(onchip_34xx_clks);
clkp++) { clkp++) {
if ((*clkp)->flags & cpu_clkflg) if ((*clkp)->flags & cpu_clkflg) {
clk_register(*clkp); clk_register(*clkp);
omap2_init_clk_clkdm(*clkp);
}
} }
/* REVISIT: Not yet ready for OMAP3 */ /* REVISIT: Not yet ready for OMAP3 */
......
This diff is collapsed.
...@@ -168,12 +168,19 @@ static struct clockdomain sgx_clkdm = { ...@@ -168,12 +168,19 @@ static struct clockdomain sgx_clkdm = {
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2), .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2),
}; };
/*
* The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
* then that information was removed from the 34xx ES2+ TRM. It is
* unclear whether the core is still there, but the clockdomain logic
* is there, and must be programmed to an appropriate state if the
* CORE clockdomain is to become inactive.
*/
static struct clockdomain d2d_clkdm = { static struct clockdomain d2d_clkdm = {
.name = "d2d_clkdm", .name = "d2d_clkdm",
.pwrdm_name = "core_pwrdm", .pwrdm_name = "core_pwrdm",
.flags = CLKDM_CAN_HWSUP, .flags = CLKDM_CAN_HWSUP,
.clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK, .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1), .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
}; };
static struct clockdomain core_l3_34xx_clkdm = { static struct clockdomain core_l3_34xx_clkdm = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment