Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0725cf99 authored by Taniya Das's avatar Taniya Das Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarTaniya Das <tdas@codeaurora.org>
parent bd4743e8
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -865,8 +865,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.
@@ -880,10 +878,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;
}