Skip to content

Commit 934dccc

Browse files
prabhakarladgeertu
authored andcommitted
clk: renesas: cpg-mssr: Add read-back and delay handling for RZ/T2H MSTP
On the RZ/T2H SoC, a specific sequence is required when releasing a module from the module stop state (i.e. when clearing the corresponding bit in the MSTPCRm register to '0'). After writing to the MSTPCRm register, a read-back of the same register must be performed, followed by at least seven dummy reads of any register within the IP block that is being released. To avoid mapping device registers for this purpose, a short delay is introduced after the read-back to ensure proper hardware stabilization before the module becomes accessible. Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://patch.msgid.link/20251014105348.93705-1-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
1 parent 3b37979 commit 934dccc

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

drivers/clk/renesas/renesas-cpg-mssr.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,21 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
308308

309309
spin_unlock_irqrestore(&priv->pub.rmw_lock, flags);
310310

311-
if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A ||
312-
priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H)
311+
if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
313312
return 0;
314313

314+
if (priv->reg_layout == CLK_REG_LAYOUT_RZ_T2H) {
315+
/*
316+
* For the RZ/T2H case, it is necessary to perform a read-back after
317+
* accessing the MSTPCRm register and to dummy-read any register of
318+
* the IP at least seven times. Instead of memory-mapping the IP
319+
* register, we simply add a delay after the read operation.
320+
*/
321+
cpg_rzt2h_mstp_read(hw, priv->control_regs[reg]);
322+
udelay(10);
323+
return 0;
324+
}
325+
315326
error = readl_poll_timeout_atomic(priv->pub.base0 + priv->status_regs[reg],
316327
value, !(value & bitmask), 0, 10);
317328
if (error)

0 commit comments

Comments
 (0)