Commit bf497e7b authored by Biju Das's avatar Biju Das Committed by Geert Uytterhoeven
Browse files

clk: renesas: rzg2l: Re-enable critical module clocks during resume



After a suspend/resume cycle, critical module clocks (CLK_IS_CRITICAL)
may be left disabled as there is no owning driver to restore them,
unlike regular clocks.
Add rzg2l_mod_enable_crit_clock_init_mstop() which walks all module
clocks on resume, re-enables any critical clock found disabled, and then
restores the MSTOP state for clocks that have one via the existing
helper.  This replaces the direct call to rzg2l_mod_clock_init_mstop()
in rzg2l_cpg_resume(), preserving the correct clock-before-MSTOP restore
ordering.

Signed-off-by: default avatarBiju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Link: https://patch.msgid.link/20260324114329.268249-7-biju.das.jz@bp.renesas.com


Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
parent fa3e973c
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -1599,8 +1599,8 @@ static void rzg2l_mod_clock_init_mstop_helper(struct rzg2l_cpg_priv *priv,
{
	/*
	 * Out of reset all modules are enabled. Set module state in case
	 * associated clocks are disabled at probe. Otherwise module is in
	 * invalid HW state.
	 * associated clocks are disabled at probe/resume. Otherwise module
	 * is in invalid HW state.
	 */
	scoped_guard(spinlock_irqsave, &priv->rmw_lock) {
		if (!rzg2l_mod_clock_is_enabled(&clk->hw))
@@ -1608,6 +1608,21 @@ static void rzg2l_mod_clock_init_mstop_helper(struct rzg2l_cpg_priv *priv,
	}
}

static void rzg2l_mod_enable_crit_clock_init_mstop(struct rzg2l_cpg_priv *priv)
{
	struct mod_clock *clk;
	struct clk_hw *hw;

	for_each_mod_clock(clk, hw, priv) {
		if ((clk_hw_get_flags(&clk->hw) & CLK_IS_CRITICAL) &&
		    (!rzg2l_mod_clock_is_enabled(&clk->hw)))
			rzg2l_mod_clock_endisable_helper(&clk->hw, true, false);

		if (clk->mstop)
			rzg2l_mod_clock_init_mstop_helper(priv, clk);
	}
}

static void rzg2l_mod_clock_init_mstop(struct rzg2l_cpg_priv *priv)
{
	struct mod_clock *clk;
@@ -2103,7 +2118,7 @@ static int rzg2l_cpg_resume(struct device *dev)
	if (ret)
		return ret;

	rzg2l_mod_clock_init_mstop(priv);
	rzg2l_mod_enable_crit_clock_init_mstop(priv);

	return 0;
}