clk: qcom: clock-generic: Fix handoff for mux_div clock

The current implementation would check for the parent rate and decide the
handoff state of the clock, which is not true for mux clocks. With this
logic the function returns 'enabled' even when the clock downstream of this
clock is disabled. The handoff code will unnecessarily enable the current
parent of this clock.
If this function always returns 'disabled' and a clock downstream is on,
the clock handoff  code will bump up the ref count for this clock and its
current parent as necessary. The clocks without an actual HW gate can
always return handoff disabled.

Change-Id: I1f06842e2761b336b49a9390a556064de44f2e36
Signed-off-by: Taniya Das <tdas@codeaurora.org>
This commit is contained in:
Taniya Das 2015-12-21 13:57:58 +05:30 committed by Gerrit - the friendly Code Review server
parent 20d189ae63
commit c9e523c794
1 changed files with 14 additions and 6 deletions

View File

@ -880,8 +880,6 @@ static enum handoff mux_div_clk_handoff(struct clk *c)
unsigned int numer;
parent_rate = clk_get_rate(c->parent);
if (!parent_rate)
return HANDOFF_DISABLED_CLK;
/*
* div values are doubled for half dividers.
* Adjust for that by picking a numer of 2.
@ -895,10 +893,20 @@ static enum handoff mux_div_clk_handoff(struct clk *c)
return HANDOFF_DISABLED_CLK;
}
if (!md->ops->is_enabled)
return HANDOFF_DISABLED_CLK;
if (md->ops->is_enabled(md))
return HANDOFF_ENABLED_CLK;
if (md->en_mask && md->ops && md->ops->is_enabled)
return md->ops->is_enabled(md)
? HANDOFF_ENABLED_CLK
: HANDOFF_DISABLED_CLK;
/*
* If this function returns 'enabled' even when the clock downstream
* of this clock is disabled, then handoff code will unnecessarily
* enable the current parent of this clock. If this function always
* returns 'disabled' and a clock downstream is on, the clock handoff
* code will bump up the ref count for this clock and its current
* parent as necessary. So, clocks without an actual HW gate can
* always return disabled.
*/
return HANDOFF_DISABLED_CLK;
}