@@ -286,6 +286,7 @@ void omap2_clk_disable(struct clk *clk)
int omap2_clk_enable(struct clk *clk)
{
int ret;
+ int hwsup = 0;
pr_debug("clock: %s: incrementing usecount\n", clk->name);
@@ -304,6 +305,17 @@ int omap2_clk_enable(struct clk *clk)
goto oce_err1;
}
}
+ /*
+ * TODO: This is needed here only as long as drivers use
+ * clock framework to enable optional clocks. For all the
+ * essential clocks, this sequence is handled in the
+ * omap_hwmod framework.
+ */
+ /* Enable the clockdomain, if its an optional clock */
+ if ((clk->flags & CLOCK_OPTCLK) && (clk->clkdm)) {
+ hwsup = clkdm_is_idle(clk->clkdm);
+ clkdm_wakeup(clk->clkdm);
+ }
if (clk->ops && clk->ops->enable) {
trace_clock_enable(clk->name, 1, smp_processor_id());
@@ -315,6 +327,9 @@ int omap2_clk_enable(struct clk *clk)
}
}
+ if ((clk->flags & CLOCK_OPTCLK) && (clk->clkdm) && hwsup)
+ clkdm_allow_idle(clk->clkdm);
+
return 0;
oce_err2:
Optional clocks have a requirement to have the clockdomain force enabled (SW_WKUP) before the optional clock itself is enabled. Since optional clocks are currently handled directly by drivers using the clock framework, this needs to be handled at the clock framework. This sequence is already handled in the omap_hwmod framework for the essential/main clocks. Signed-off-by: Rajendra Nayak <rnayak@ti.com> --- arch/arm/mach-omap2/clock.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)