Skip to content

Commit cd4a3ce

Browse files
bijudasThomas Gleixner
authored andcommitted
irqchip/renesas-rzv2h: Prevent TINT spurious interrupt during resume
A glitch in the edge detection circuit can cause a spurious interrupt. The hardware manual recommends clearing the status flag after setting the ICU_TSSRk register as a countermeasure. Currently, a spurious interrupt is generated on the resume path of s2idle for the PMIC RTC TINT interrupt due to a glitch related to unnecessary enabling/disabling of the TINT enable bit. Fix this issue by not setting TSSR(TINT Source) and TITSR(TINT Detection Method Selection) registers if the values are the same as those set in these registers. Fixes: 0d7605e ("irqchip: Add RZ/V2H(P) Interrupt Control Unit (ICU) driver") Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260113125315.359967-2-biju.das.jz@bp.renesas.com
1 parent f2edf79 commit cd4a3ce

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

drivers/irqchip/irq-renesas-rzv2h.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ static int rzv2h_tint_set_type(struct irq_data *d, unsigned int type)
328328
u32 titsr, titsr_k, titsel_n, tien;
329329
struct rzv2h_icu_priv *priv;
330330
u32 tssr, tssr_k, tssel_n;
331+
u32 titsr_cur, tssr_cur;
331332
unsigned int hwirq;
332333
u32 tint, sense;
333334
int tint_nr;
@@ -376,12 +377,18 @@ static int rzv2h_tint_set_type(struct irq_data *d, unsigned int type)
376377
guard(raw_spinlock)(&priv->lock);
377378

378379
tssr = readl_relaxed(priv->base + priv->info->t_offs + ICU_TSSR(tssr_k));
380+
titsr = readl_relaxed(priv->base + priv->info->t_offs + ICU_TITSR(titsr_k));
381+
382+
tssr_cur = field_get(ICU_TSSR_TSSEL_MASK(tssel_n, priv->info->field_width), tssr);
383+
titsr_cur = field_get(ICU_TITSR_TITSEL_MASK(titsel_n), titsr);
384+
if (tssr_cur == tint && titsr_cur == sense)
385+
return 0;
386+
379387
tssr &= ~(ICU_TSSR_TSSEL_MASK(tssel_n, priv->info->field_width) | tien);
380388
tssr |= ICU_TSSR_TSSEL_PREP(tint, tssel_n, priv->info->field_width);
381389

382390
writel_relaxed(tssr, priv->base + priv->info->t_offs + ICU_TSSR(tssr_k));
383391

384-
titsr = readl_relaxed(priv->base + priv->info->t_offs + ICU_TITSR(titsr_k));
385392
titsr &= ~ICU_TITSR_TITSEL_MASK(titsel_n);
386393
titsr |= ICU_TITSR_TITSEL_PREP(sense, titsel_n);
387394

0 commit comments

Comments
 (0)