[PATCH 06/15] thermal/drivers/samsung: acpm-tmu: Rely on devres for probe error and remove teardown
Tudor Ambarus
tudor.ambarus at linaro.org
Mon Oct 26 09:01:23 PDT 2026
Disabling sensors manually on acpm_tmu_probe() failure or in
acpm_tmu_remove() happens before devres unregisters the thermal zones,
leaving live zones backed by disabled hardware.
With .change_mode() implemented, devres tears down the IRQ, thermal
zones, and runtime PM in reverse registration order:
devm_thermal_of_zone_release() disables each sensor via
thermal_zone_device_disable(), and devm_pm_runtime_enable() disables
autosuspend and runtime PM.
Drop acpm_tmu_remove(), acpm_tmu_control_rollback(), and the manual
teardown in acpm_tmu_probe(), and switch acpm_tmu_control() to
pm_runtime_put_autosuspend() since pm_runtime_put_sync() was only needed
by acpm_tmu_remove().
Fixes: 50a2c5d4062a ("thermal/drivers/samsung: Add Exynos ACPM TMU driver GS101")
Reported-by: Sashiko <sashiko-bot at kernel.org>
Link: https://sashiko.dev/#/patchset/20260603-acpm-tmu-v8-0-0f1810a356e6@linaro.org?part=2
Signed-off-by: Tudor Ambarus <tudor.ambarus at linaro.org>
---
drivers/thermal/samsung/acpm-tmu.c | 56 ++++----------------------------------
1 file changed, 5 insertions(+), 51 deletions(-)
diff --git a/drivers/thermal/samsung/acpm-tmu.c b/drivers/thermal/samsung/acpm-tmu.c
index 69793fce3bf1..4257bec802c1 100644
--- a/drivers/thermal/samsung/acpm-tmu.c
+++ b/drivers/thermal/samsung/acpm-tmu.c
@@ -153,26 +153,6 @@ static int acpm_tmu_op_tz_control(struct acpm_tmu_sensor *sensor, bool on)
return 0;
}
-static void acpm_tmu_control_rollback(struct acpm_tmu_priv *priv, int start_idx)
-{
- int i;
-
- for (i = start_idx; i >= 0; i--) {
- struct acpm_tmu_sensor *sensor = &priv->sensors[i];
- int ret;
-
- if (!sensor->tzd)
- continue;
-
- mutex_lock(&sensor->lock);
- ret = acpm_tmu_op_tz_control(sensor, false);
- mutex_unlock(&sensor->lock);
- if (ret)
- dev_err(priv->dev, "Rollback: Failed to disable sensor %d: %d\n",
- i, ret);
- }
-}
-
static int acpm_tmu_control(struct acpm_tmu_priv *priv, bool on)
{
struct device *dev = priv->dev;
@@ -199,7 +179,7 @@ static int acpm_tmu_control(struct acpm_tmu_priv *priv, bool on)
err = ret;
}
- pm_runtime_put_sync(dev);
+ pm_runtime_put_autosuspend(dev);
return err;
}
@@ -489,7 +469,7 @@ static int acpm_tmu_probe(struct platform_device *pdev)
ret = acpm_handle->ops->tmu.init(acpm_handle, priv->mbox_chan_id);
if (ret) {
ret = dev_err_probe(dev, ret, "Failed to init TMU\n");
- goto err_pm_put;
+ goto out_pm_put;
}
for (i = 0; i < priv->num_sensors; i++) {
@@ -510,7 +490,7 @@ static int acpm_tmu_probe(struct platform_device *pdev)
}
ret = dev_err_probe(dev, ret, "Failed to register sensor %d\n", i);
- goto err_rollback;
+ goto out_pm_put;
}
sensor->tzd = tzd;
@@ -522,39 +502,14 @@ static int acpm_tmu_probe(struct platform_device *pdev)
ret = devm_request_threaded_irq(dev, priv->irq, NULL,
acpm_tmu_thread_fn, IRQF_ONESHOT,
dev_name(dev), priv);
- if (ret) {
+ if (ret)
ret = dev_err_probe(dev, ret, "Failed to request irq\n");
- goto err_rollback;
- }
+out_pm_put:
pm_runtime_put_autosuspend(dev);
-
- return 0;
-
-err_rollback:
- acpm_tmu_control_rollback(priv, i - 1);
-err_pm_put:
- pm_runtime_dont_use_autosuspend(dev);
- pm_runtime_put_sync(dev);
return ret;
}
-static void acpm_tmu_remove(struct platform_device *pdev)
-{
- struct acpm_tmu_priv *priv = platform_get_drvdata(pdev);
-
- /* Stop IRQ first to prevent race with thread_fn */
- disable_irq(priv->irq);
-
- /*
- * Disable autosuspend to force the subsequent pm_runtime_put_sync()
- * inside acpm_tmu_control() to synchronously suspend the device
- * immediately, preventing clock leaks when the driver is removed.
- */
- pm_runtime_dont_use_autosuspend(&pdev->dev);
- acpm_tmu_control(priv, false);
-}
-
static int acpm_tmu_suspend(struct device *dev)
{
struct acpm_tmu_priv *priv = dev_get_drvdata(dev);
@@ -648,7 +603,6 @@ static struct platform_driver acpm_tmu_driver = {
.of_match_table = acpm_tmu_match,
},
.probe = acpm_tmu_probe,
- .remove = acpm_tmu_remove,
};
module_platform_driver(acpm_tmu_driver);
--
2.56.0.257.gf7497c7d27-goog
More information about the linux-arm-kernel
mailing list