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: Paul Walmsley <paul@pwsan.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
d1b03f615a
commit
333943ba9e
5 changed files with 232 additions and 24 deletions
|
@ -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 @@
|
||||||
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)
|
||||||
_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)
|
||||||
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);
|
||||||
#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)
|
||||||
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 */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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 = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue