aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk.c
diff options
context:
space:
mode:
authorMike Turquette <mturquette@linaro.org>2012-12-04 14:00:35 -0500
committerMike Turquette <mturquette@linaro.org>2012-12-11 01:35:02 -0500
commit7c045a55c97fb83a2e5e9c6c857162c4866cc602 (patch)
treee8c5a171b9b9085e86541aaccf9b85e3ec52298e /drivers/clk/clk.c
parent2630b17b6ee47ac79b4f5120ac49105027f644ea (diff)
clk: introduce optional disable_unused callback
Some gate clocks have special needs which must be handled during the disable-unused clocks sequence. These needs might be driven by software due to the fact that we're disabling a clock outside of the normal clk_disable path and a clk's enable_count will not be accurate. On the other hand a specific hardware programming sequence might need to be followed for this corner case. This change is needed for the upcoming OMAP port to the common clock framework. Specifically, it is undesirable to treat the disable-unused path identically to the normal clk_disable path since other software layers are involved. In this case OMAP's clockdomain code throws WARNs and bails early due to the clock's enable_count being set to zero. A custom callback mitigates this problem nicely. Cc: Paul Walmsley <paul@pwsan.com> Acked-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Mike Turquette <mturquette@linaro.org>
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r--drivers/clk/clk.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 9955ad7e786e..251e45d6024d 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -219,8 +219,17 @@ static void clk_disable_unused_subtree(struct clk *clk)
219 if (clk->flags & CLK_IGNORE_UNUSED) 219 if (clk->flags & CLK_IGNORE_UNUSED)
220 goto unlock_out; 220 goto unlock_out;
221 221
222 if (__clk_is_enabled(clk) && clk->ops->disable) 222 /*
223 clk->ops->disable(clk->hw); 223 * some gate clocks have special needs during the disable-unused
224 * sequence. call .disable_unused if available, otherwise fall
225 * back to .disable
226 */
227 if (__clk_is_enabled(clk)) {
228 if (clk->ops->disable_unused)
229 clk->ops->disable_unused(clk->hw);
230 else if (clk->ops->disable)
231 clk->ops->disable(clk->hw);
232 }
224 233
225unlock_out: 234unlock_out:
226 spin_unlock_irqrestore(&enable_lock, flags); 235 spin_unlock_irqrestore(&enable_lock, flags);