[PATCH v8 06/11] clk: renesas: rzg2l-cpg: Re-enable critical module clocks during resume

From: Biju

Date: Tue Mar 24 2026 - 08:00:48 EST


From: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>

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: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
---
v7->v8:
* Updated comment in rzg2l_mod_clock_init_mstop_helper() as resume()
calls this function.
* To avoid setting module state twice and also not to update the initial
mstop state for the critical clocks state during probe, replaced
rzg2l_mod_clock_endisable()->rzg2l_mod_clock_endisable_helper().
v6->v7:
* Updated commit description
* RZ/V2M has critical clocks but no mstop, so move the mstop check after
enabling critical clocks. After this, we need to restore only mstop for
module clocks, so remove the inverted logic and continue statement and
directly call rzg2l_mod_clock_init_mstop_helper() if the clock has
mstop.
v5->v6:
* Updated commit description
* Dropped the list implementation.
* Replaced rzg2l_mod_clock_init_mstop->rzg2l_mod_enable_crit_clock_init_mstop()
for enabling critical clks and restoring mstop state during resume.
v4->v5:
* No change
v4:
* Moved this patch from [1] as it is boot-dependent
[1] https://lore.kernel.org/all/20260306134228.871815-1-biju.das.jz@xxxxxxxxxxxxxx/
---
drivers/clk/renesas/rzg2l-cpg.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c
index 738a4b182f27..70228d8a2ef3 100644
--- a/drivers/clk/renesas/rzg2l-cpg.c
+++ b/drivers/clk/renesas/rzg2l-cpg.c
@@ -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;
}
--
2.43.0