Unverified Commit 66991767 authored by Nicolas Frattaroli's avatar Nicolas Frattaroli Committed by Stephen Boyd
Browse files

clk: Respect CLK_OPS_PARENT_ENABLE during recalc



When CLK_OPS_PARENT_ENABLE was introduced, it guarded various clock
operations, such as setting the rate or switching parents. However,
another operation that can and often does touch actual hardware state is
recalc_rate, which may also be affected by such a dependency.

Add parent enables/disables where the recalc_rate op is called directly.

Fixes: fc8726a2 ("clk: core: support clocks which requires parents enable (part 2)")
Fixes: a4b3518d ("clk: core: support clocks which requires parents enable (part 1)")
Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: default avatarChen-Yu Tsai <wenst@chromium.org>
Signed-off-by: default avatarNicolas Frattaroli <nicolas.frattaroli@collabora.com>
Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent a2ed1aed
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1921,7 +1921,14 @@ static unsigned long clk_recalc(struct clk_core *core,
	unsigned long rate = parent_rate;

	if (core->ops->recalc_rate && !clk_pm_runtime_get(core)) {
		if (core->flags & CLK_OPS_PARENT_ENABLE)
			clk_core_prepare_enable(core->parent);

		rate = core->ops->recalc_rate(core->hw, parent_rate);

		if (core->flags & CLK_OPS_PARENT_ENABLE)
			clk_core_disable_unprepare(core->parent);

		clk_pm_runtime_put(core);
	}
	return rate;
@@ -4031,6 +4038,9 @@ static int __clk_core_init(struct clk_core *core)
	 */
	clk_core_update_duty_cycle_nolock(core);

	if (core->flags & CLK_OPS_PARENT_ENABLE)
		clk_core_prepare_enable(core->parent);

	/*
	 * Set clk's rate.  The preferred method is to use .recalc_rate.  For
	 * simple clocks and lazy developers the default fallback is to use the
@@ -4046,6 +4056,9 @@ static int __clk_core_init(struct clk_core *core)
		rate = 0;
	core->rate = core->req_rate = rate;

	if (core->flags & CLK_OPS_PARENT_ENABLE)
		clk_core_disable_unprepare(core->parent);

	/*
	 * Enable CLK_IS_CRITICAL clocks so newly added critical clocks
	 * don't get accidentally disabled when walking the orphan tree and