From: Anand Moon <linux.amoon@gmail.com>
To: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>,
Krzysztof Kozlowski <krzk@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Daniel Lezcano <daniel.lezcano@kernel.org>,
Zhang Rui <rui.zhang@intel.com>,
Lukasz Luba <lukasz.luba@arm.com>,
Peter Griffin <peter.griffin@linaro.org>,
Alim Akhtar <alim.akhtar@samsung.com>,
linux-samsung-soc@vger.kernel.org (open list:SAMSUNG THERMAL
DRIVER), linux-pm@vger.kernel.org (open list:THERMAL),
linux-kernel@vger.kernel.org (open list),
linux-arm-kernel@lists.infradead.org (moderated list:ARM/SAMSUNG
S3C, S5P AND EXYNOS ARM ARCHITECTURES)
Cc: Anand Moon <linux.amoon@gmail.com>
Subject: [PATCH v9 1/9] thermal/drivers/exynos: Optimize clock lifecycle with devm helpers
Date: Sun, 13 Sep 2026 20:28:29 +0530 [thread overview]
Message-ID: <20260913145905.9404-2-linux.amoon@gmail.com> (raw)
In-Reply-To: <20260913145905.9404-1-linux.amoon@gmail.com>
Use the managed clock APIs to prepare and enable the TMU clocks in
exynos_tmu_probe().
Replace devm_clk_get() followed by manual clock preparation or enabling
with devm_clk_get_prepared(), devm_clk_get_optional_prepared(), and
devm_clk_get_enabled(). This also allows the manual clock cleanup and
error handling paths to be removed.
Preserve the existing requirement for the triminfo clock on
SOC_ARCH_EXYNOS5420_TRIMINFO when using the optional clock API.
This simplifies the probe and remove paths and ensures clock resources
are automatically released when the device is removed or probe fails.
Signed-off-by: Anand Moon <linux.amoon@gmail.com>
---
drivers/thermal/samsung/exynos_tmu.c | 86 ++++++++--------------------
1 file changed, 25 insertions(+), 61 deletions(-)
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 56717bb50d60..e75040222ccf 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -1036,65 +1036,44 @@ static int exynos_tmu_probe(struct platform_device *pdev)
if (ret)
return ret;
- data->clk = devm_clk_get(dev, "tmu_apbif");
+ data->clk = devm_clk_get_prepared(dev, "tmu_apbif");
if (IS_ERR(data->clk))
- return dev_err_probe(dev, PTR_ERR(data->clk), "Failed to get clock\n");
-
- data->clk_sec = devm_clk_get(dev, "tmu_triminfo_apbif");
- if (IS_ERR(data->clk_sec)) {
- if (data->soc == SOC_ARCH_EXYNOS5420_TRIMINFO)
- return dev_err_probe(dev, PTR_ERR(data->clk_sec),
- "Failed to get triminfo clock\n");
- } else {
- ret = clk_prepare(data->clk_sec);
- if (ret) {
- dev_err(dev, "Failed to get clock\n");
- return ret;
- }
- }
-
- ret = clk_prepare(data->clk);
- if (ret) {
- dev_err(dev, "Failed to get clock\n");
- goto err_clk_sec;
- }
-
- switch (data->soc) {
- case SOC_ARCH_EXYNOS5433:
- case SOC_ARCH_EXYNOS7:
- data->sclk = devm_clk_get(dev, "tmu_sclk");
- if (IS_ERR(data->sclk)) {
- ret = dev_err_probe(dev, PTR_ERR(data->sclk), "Failed to get sclk\n");
- goto err_clk;
- } else {
- ret = clk_prepare_enable(data->sclk);
- if (ret) {
- dev_err(dev, "Failed to enable sclk\n");
- goto err_clk;
- }
- }
- break;
- default:
- break;
+ return dev_err_probe(dev, PTR_ERR(data->clk),
+ "Failed to get tmu_apbif clock\n");
+
+ data->clk_sec = devm_clk_get_optional_prepared(dev,
+ "tmu_triminfo_apbif");
+ if (IS_ERR(data->clk_sec))
+ return dev_err_probe(dev, PTR_ERR(data->clk_sec),
+ "Failed to get tmu_triminfo_apbif clock\n");
+
+ if (!data->clk_sec && data->soc == SOC_ARCH_EXYNOS5420_TRIMINFO)
+ return dev_err_probe(dev, -ENOENT,
+ "Failed to get tmu_triminfo_apbif clock\n");
+
+ if (data->soc == SOC_ARCH_EXYNOS5433 ||
+ data->soc == SOC_ARCH_EXYNOS7) {
+ data->sclk = devm_clk_get_enabled(dev, "tmu_sclk");
+ if (IS_ERR(data->sclk))
+ return dev_err_probe(dev, PTR_ERR(data->sclk),
+ "Failed to get tmu_sclk clock\n");
}
ret = exynos_tmu_initialize(pdev);
if (ret) {
dev_err(dev, "Failed to initialize TMU\n");
- goto err_sclk;
+ return ret;
}
data->tzd = devm_thermal_of_zone_register(dev, 0, data,
&exynos_sensor_ops);
- if (IS_ERR(data->tzd)) {
+ if (IS_ERR(data->tzd))
ret = dev_err_probe(dev, PTR_ERR(data->tzd), "Failed to register sensor\n");
- goto err_sclk;
- }
ret = exynos_thermal_zone_configure(pdev);
if (ret) {
dev_err(dev, "Failed to configure the thermal zone\n");
- goto err_sclk;
+ return ret;
}
ret = devm_request_threaded_irq(dev, data->irq, NULL,
@@ -1103,31 +1082,16 @@ static int exynos_tmu_probe(struct platform_device *pdev)
| IRQF_SHARED | IRQF_ONESHOT,
dev_name(dev), data);
if (ret)
- goto err_sclk;
+ return dev_err_probe(dev, ret, "Failed to request irq\n");
exynos_tmu_control(pdev, true);
- return 0;
-err_sclk:
- clk_disable_unprepare(data->sclk);
-err_clk:
- clk_unprepare(data->clk);
-err_clk_sec:
- if (!IS_ERR(data->clk_sec))
- clk_unprepare(data->clk_sec);
- return ret;
+ return 0;
}
static void exynos_tmu_remove(struct platform_device *pdev)
{
- struct exynos_tmu_data *data = platform_get_drvdata(pdev);
-
exynos_tmu_control(pdev, false);
-
- clk_disable_unprepare(data->sclk);
- clk_unprepare(data->clk);
- if (!IS_ERR(data->clk_sec))
- clk_unprepare(data->clk_sec);
}
#ifdef CONFIG_PM_SLEEP
--
2.55.0
WARNING: multiple messages have this Message-ID (diff)
From: Anand Moon <linux.amoon@gmail.com>
To: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>,
Krzysztof Kozlowski <krzk@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Daniel Lezcano <daniel.lezcano@kernel.org>,
Zhang Rui <rui.zhang@intel.com>,
Lukasz Luba <lukasz.luba@arm.com>,
Peter Griffin <peter.griffin@linaro.org>,
Alim Akhtar <alim.akhtar@samsung.com>,
linux-samsung-soc@vger.kernel.org (open list:SAMSUNG THERMAL
DRIVER), linux-pm@vger.kernel.org (open list:THERMAL),
linux-kernel@vger.kernel.org (open list),
linux-arm-kernel@lists.infradead.org (moderated list:ARM/SAMSUNG
S3C, S5P AND EXYNOS ARM ARCHITECTURES)
Subject: [PATCH v9 1/9] thermal/drivers/exynos: Optimize clock lifecycle with devm helpers
Date: Sun, 13 Sep 2026 20:28:29 +0530 [thread overview]
Message-ID: <20260913145905.9404-2-linux.amoon@gmail.com> (raw)
In-Reply-To: <20260913145905.9404-1-linux.amoon@gmail.com>
Use the managed clock APIs to prepare and enable the TMU clocks in
exynos_tmu_probe().
Replace devm_clk_get() followed by manual clock preparation or enabling
with devm_clk_get_prepared(), devm_clk_get_optional_prepared(), and
devm_clk_get_enabled(). This also allows the manual clock cleanup and
error handling paths to be removed.
Preserve the existing requirement for the triminfo clock on
SOC_ARCH_EXYNOS5420_TRIMINFO when using the optional clock API.
This simplifies the probe and remove paths and ensures clock resources
are automatically released when the device is removed or probe fails.
Signed-off-by: Anand Moon <linux.amoon@gmail.com>
---
drivers/thermal/samsung/exynos_tmu.c | 86 ++++++++--------------------
1 file changed, 25 insertions(+), 61 deletions(-)
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index 56717bb50d60..e75040222ccf 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -1036,65 +1036,44 @@ static int exynos_tmu_probe(struct platform_device *pdev)
if (ret)
return ret;
- data->clk = devm_clk_get(dev, "tmu_apbif");
+ data->clk = devm_clk_get_prepared(dev, "tmu_apbif");
if (IS_ERR(data->clk))
- return dev_err_probe(dev, PTR_ERR(data->clk), "Failed to get clock\n");
-
- data->clk_sec = devm_clk_get(dev, "tmu_triminfo_apbif");
- if (IS_ERR(data->clk_sec)) {
- if (data->soc == SOC_ARCH_EXYNOS5420_TRIMINFO)
- return dev_err_probe(dev, PTR_ERR(data->clk_sec),
- "Failed to get triminfo clock\n");
- } else {
- ret = clk_prepare(data->clk_sec);
- if (ret) {
- dev_err(dev, "Failed to get clock\n");
- return ret;
- }
- }
-
- ret = clk_prepare(data->clk);
- if (ret) {
- dev_err(dev, "Failed to get clock\n");
- goto err_clk_sec;
- }
-
- switch (data->soc) {
- case SOC_ARCH_EXYNOS5433:
- case SOC_ARCH_EXYNOS7:
- data->sclk = devm_clk_get(dev, "tmu_sclk");
- if (IS_ERR(data->sclk)) {
- ret = dev_err_probe(dev, PTR_ERR(data->sclk), "Failed to get sclk\n");
- goto err_clk;
- } else {
- ret = clk_prepare_enable(data->sclk);
- if (ret) {
- dev_err(dev, "Failed to enable sclk\n");
- goto err_clk;
- }
- }
- break;
- default:
- break;
+ return dev_err_probe(dev, PTR_ERR(data->clk),
+ "Failed to get tmu_apbif clock\n");
+
+ data->clk_sec = devm_clk_get_optional_prepared(dev,
+ "tmu_triminfo_apbif");
+ if (IS_ERR(data->clk_sec))
+ return dev_err_probe(dev, PTR_ERR(data->clk_sec),
+ "Failed to get tmu_triminfo_apbif clock\n");
+
+ if (!data->clk_sec && data->soc == SOC_ARCH_EXYNOS5420_TRIMINFO)
+ return dev_err_probe(dev, -ENOENT,
+ "Failed to get tmu_triminfo_apbif clock\n");
+
+ if (data->soc == SOC_ARCH_EXYNOS5433 ||
+ data->soc == SOC_ARCH_EXYNOS7) {
+ data->sclk = devm_clk_get_enabled(dev, "tmu_sclk");
+ if (IS_ERR(data->sclk))
+ return dev_err_probe(dev, PTR_ERR(data->sclk),
+ "Failed to get tmu_sclk clock\n");
}
ret = exynos_tmu_initialize(pdev);
if (ret) {
dev_err(dev, "Failed to initialize TMU\n");
- goto err_sclk;
+ return ret;
}
data->tzd = devm_thermal_of_zone_register(dev, 0, data,
&exynos_sensor_ops);
- if (IS_ERR(data->tzd)) {
+ if (IS_ERR(data->tzd))
ret = dev_err_probe(dev, PTR_ERR(data->tzd), "Failed to register sensor\n");
- goto err_sclk;
- }
ret = exynos_thermal_zone_configure(pdev);
if (ret) {
dev_err(dev, "Failed to configure the thermal zone\n");
- goto err_sclk;
+ return ret;
}
ret = devm_request_threaded_irq(dev, data->irq, NULL,
@@ -1103,31 +1082,16 @@ static int exynos_tmu_probe(struct platform_device *pdev)
| IRQF_SHARED | IRQF_ONESHOT,
dev_name(dev), data);
if (ret)
- goto err_sclk;
+ return dev_err_probe(dev, ret, "Failed to request irq\n");
exynos_tmu_control(pdev, true);
- return 0;
-err_sclk:
- clk_disable_unprepare(data->sclk);
-err_clk:
- clk_unprepare(data->clk);
-err_clk_sec:
- if (!IS_ERR(data->clk_sec))
- clk_unprepare(data->clk_sec);
- return ret;
+ return 0;
}
static void exynos_tmu_remove(struct platform_device *pdev)
{
- struct exynos_tmu_data *data = platform_get_drvdata(pdev);
-
exynos_tmu_control(pdev, false);
-
- clk_disable_unprepare(data->sclk);
- clk_unprepare(data->clk);
- if (!IS_ERR(data->clk_sec))
- clk_unprepare(data->clk_sec);
}
#ifdef CONFIG_PM_SLEEP
--
2.55.0
next prev parent reply other threads:[~2026-09-13 14:59 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-13 14:58 [PATCH v9 0/9] Exynos Thermal code improvement Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` Anand Moon [this message]
2026-09-13 14:58 ` [PATCH v9 1/9] thermal/drivers/exynos: Optimize clock lifecycle with devm helpers Anand Moon
2026-09-13 14:58 ` [PATCH v9 2/9] thermal/drivers/exynos: Drop invalid IRQF_SHARED flag from TMU interrupts Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 3/9] thermal/drivers/exynos: Handle optional triminfo clock correctly Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 4/9] thermal/drivers/exynos: Fixed the efuse min max value for exynos5420 Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 5/9] thermal/drivers/exynos: Remove redundant base_second register resource Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 6/9] thermal/drivers/exynos: Use SoC-specific variant data to TMU configuration Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 7/9] thermal/drivers/exynos: Move thermal zone ops to variant data Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 8/9] thermal/drivers/exynos: Add missing drvdata assignment in Exynos TMU probe Anand Moon
2026-09-13 14:58 ` Anand Moon
2026-09-13 14:58 ` [PATCH v9 9/9] thermal/drivers/exynos: Select thermal emulation support Anand Moon
2026-09-13 14:58 ` Anand Moon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260913145905.9404-2-linux.amoon@gmail.com \
--to=linux.amoon@gmail.com \
--cc=alim.akhtar@samsung.com \
--cc=bzolnier@gmail.com \
--cc=daniel.lezcano@kernel.org \
--cc=krzk@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=peter.griffin@linaro.org \
--cc=rafael@kernel.org \
--cc=rui.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.