[PATCH 04/15] thermal/drivers/samsung: acpm-tmu: Disable IRQ across system suspend/resume

From: Tudor Ambarus

Date: Mon Oct 26 2026 - 12:11:14 EST


The PM core masks device IRQs in dpm_suspend_noirq() and unmasks them in
dpm_resume_noirq(), leaving the TMU interrupt enabled after
acpm_tmu_suspend() and before acpm_tmu_resume() while runtime PM is
disabled and PCLK is gated:

1. If acpm_tmu_thread_fn() runs in that window,
pm_runtime_resume_and_get() fails with -EACCES and returns IRQ_NONE
without clearing the level-high hardware interrupt, triggering an
unhandled IRQF_ONESHOT interrupt storm when the line is unmasked.
2. If acpm_tmu_thread_fn() is already running when acpm_tmu_suspend()
executes, pm_runtime_force_suspend() ignores usage_count and gates
PCLK underneath MMIO INTPEND reads.

Call disable_irq() at the start of acpm_tmu_suspend() to mask and
synchronize the interrupt before tearing down sensors and runtime PM,
and re-enable it with enable_irq() on acpm_tmu_suspend() rollback and
before returning from acpm_tmu_resume().

Fixes: 50a2c5d4062a ("thermal/drivers/samsung: Add Exynos ACPM TMU driver GS101")
Reported-by: Sashiko <sashiko-bot@xxxxxxxxxx>
Link: https://sashiko.dev/#/patchset/20260603-acpm-tmu-v8-0-0f1810a356e6@xxxxxxxxxx?part=2
Signed-off-by: Tudor Ambarus <tudor.ambarus@xxxxxxxxxx>
---
drivers/thermal/samsung/acpm-tmu.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/samsung/acpm-tmu.c b/drivers/thermal/samsung/acpm-tmu.c
index f490551de69a..55ee97218f47 100644
--- a/drivers/thermal/samsung/acpm-tmu.c
+++ b/drivers/thermal/samsung/acpm-tmu.c
@@ -541,6 +541,8 @@ static int acpm_tmu_suspend(struct device *dev)
const struct acpm_tmu_ops *ops = &handle->ops->tmu;
int ret, restore_ret;

+ disable_irq(priv->irq);
+
ret = acpm_tmu_control(priv, false);
if (ret)
goto err_restore_sensors;
@@ -568,6 +570,8 @@ static int acpm_tmu_suspend(struct device *dev)
dev_err(dev, "Failed to re-enable TMU after suspend failure: %d\n",
restore_ret);

+ enable_irq(priv->irq);
+
return ret;
}

@@ -580,14 +584,19 @@ static int acpm_tmu_resume(struct device *dev)

ret = pm_runtime_force_resume(dev);
if (ret)
- return ret;
+ goto out_enable_irq;

/* APB clock not required for this specific msg */
ret = ops->resume(handle, priv->mbox_chan_id);
if (ret)
- return ret;
+ goto out_enable_irq;
+
+ ret = acpm_tmu_control(priv, true);

- return acpm_tmu_control(priv, true);
+out_enable_irq:
+ enable_irq(priv->irq);
+
+ return ret;
}

static int acpm_tmu_runtime_suspend(struct device *dev)

--
2.56.0.257.gf7497c7d27-goog