2023-04-03 17:14:30

by Kang Chen

[permalink] [raw]
Subject: [PATCH v2 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe

use devm_clk_get_enabled to do automatic resource management.

Signed-off-by: Kang Chen <[email protected]>
---
I'm not quite sure if this function should return 0 when
devm_thermal_add_hwmon_sysfs occurs error. So I keep it.

drivers/thermal/mediatek/auxadc_thermal.c | 25 ++++++++---------------
1 file changed, 8 insertions(+), 17 deletions(-)

diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
index df5e2e354408..5baec2c08ebc 100644
--- a/drivers/thermal/mediatek/auxadc_thermal.c
+++ b/drivers/thermal/mediatek/auxadc_thermal.c
@@ -1178,16 +1178,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
if (ret)
return ret;

- ret = clk_prepare_enable(mt->clk_auxadc);
- if (ret) {
+ ret = devm_clk_get_enabled(&pdev->dev, mt->clk_auxadc);
+ if (IS_ERR(ret)) {
dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
- return ret;
+ return PTR_ERR(ret);
}

- ret = clk_prepare_enable(mt->clk_peri_therm);
- if (ret) {
+ ret = devm_clk_get_enabled(&pdev->dev, mt->clk_peri_therm);
+ if (IS_ERR(ret)) {
dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
- goto err_disable_clk_auxadc;
+ return PTR_ERR(ret);
}

if (mt->conf->version != MTK_THERMAL_V1) {
@@ -1211,23 +1211,14 @@ static int mtk_thermal_probe(struct platform_device *pdev)

tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
&mtk_thermal_ops);
- if (IS_ERR(tzdev)) {
- ret = PTR_ERR(tzdev);
- goto err_disable_clk_peri_therm;
- }
+ if (IS_ERR(tzdev))
+ return PTR_ERR(tzdev);

ret = devm_thermal_add_hwmon_sysfs(tzdev);
if (ret)
dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");

return 0;
-
-err_disable_clk_peri_therm:
- clk_disable_unprepare(mt->clk_peri_therm);
-err_disable_clk_auxadc:
- clk_disable_unprepare(mt->clk_auxadc);
-
- return ret;
}

static int mtk_thermal_remove(struct platform_device *pdev)
--
2.34.1


2023-04-10 03:51:27

by Kang Chen

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe




> -----原始邮件-----
> 发件人: "Kang Chen" <[email protected]>
> 发送时间: 2023-04-04 00:46:10 (星期二)
> 收件人: [email protected]
> 抄送: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
> 主题: [PATCH v2 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
>
> use devm_clk_get_enabled to do automatic resource management.
>
> Signed-off-by: Kang Chen <[email protected]>
> ---
> I'm not quite sure if this function should return 0 when
> devm_thermal_add_hwmon_sysfs occurs error. So I keep it.
>
> drivers/thermal/mediatek/auxadc_thermal.c | 25 ++++++++---------------
> 1 file changed, 8 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
> index df5e2e354408..5baec2c08ebc 100644
> --- a/drivers/thermal/mediatek/auxadc_thermal.c
> +++ b/drivers/thermal/mediatek/auxadc_thermal.c
> @@ -1178,16 +1178,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> - ret = clk_prepare_enable(mt->clk_auxadc);
> - if (ret) {
> + ret = devm_clk_get_enabled(&pdev->dev, mt->clk_auxadc);
> + if (IS_ERR(ret)) {
> dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
> - return ret;
> + return PTR_ERR(ret);
> }
>
> - ret = clk_prepare_enable(mt->clk_peri_therm);
> - if (ret) {
> + ret = devm_clk_get_enabled(&pdev->dev, mt->clk_peri_therm);
> + if (IS_ERR(ret)) {
> dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
> - goto err_disable_clk_auxadc;
> + return PTR_ERR(ret);
> }
>
> if (mt->conf->version != MTK_THERMAL_V1) {
> @@ -1211,23 +1211,14 @@ static int mtk_thermal_probe(struct platform_device *pdev)
>
> tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
> &mtk_thermal_ops);
> - if (IS_ERR(tzdev)) {
> - ret = PTR_ERR(tzdev);
> - goto err_disable_clk_peri_therm;
> - }
> + if (IS_ERR(tzdev))
> + return PTR_ERR(tzdev);
>
> ret = devm_thermal_add_hwmon_sysfs(tzdev);
> if (ret)
> dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
>
> return 0;
> -
> -err_disable_clk_peri_therm:
> - clk_disable_unprepare(mt->clk_peri_therm);
> -err_disable_clk_auxadc:
> - clk_disable_unprepare(mt->clk_auxadc);
> -
> - return ret;
> }
>
> static int mtk_thermal_remove(struct platform_device *pdev)
> --
> 2.34.1

ping?

2023-04-10 19:56:40

by Daniel Lezcano

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe

On 10/04/2023 05:46, 陈康 wrote:

[ ... ]

>> static int mtk_thermal_remove(struct platform_device *pdev)
>> --
>> 2.34.1
>
> ping?

Did you check the 'mtk_thermal_remove' function ?



--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

2023-04-11 06:38:15

by Kang Chen

[permalink] [raw]
Subject: [PATCH v3 1/2] thermal: mediatek: use devm_of_iomap to avoid resource leak in mtk_thermal_probe

Smatch reports:
1. mtk_thermal_probe() warn: 'apmixed_base' from of_iomap() not released.
2. mtk_thermal_probe() warn: 'auxadc_base' from of_iomap() not released.

The original code forgets to release iomap resource when handling errors,
fix it by switch to devm_of_iomap.

Fixes: 89945047b166 ("thermal: mediatek: Add tsensor support for V2 thermal system")
Signed-off-by: Kang Chen <[email protected]>
Reviewed-by: Dongliang Mu <[email protected]>
---
v3 -> v2: fix typo and put of_node in error handling
v2 -> v1: use devm_of_iomap instead.

drivers/thermal/mediatek/auxadc_thermal.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
index ab730f9552d0..3372f7c29626 100644
--- a/drivers/thermal/mediatek/auxadc_thermal.c
+++ b/drivers/thermal/mediatek/auxadc_thermal.c
@@ -1142,7 +1142,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV;
}

- auxadc_base = of_iomap(auxadc, 0);
+ auxadc_base = devm_of_iomap(&pdev->dev, auxadc, 0, NULL);
+ if (IS_ERR(auxadc_base)) {
+ of_node_put(auxadc);
+ return PTR_ERR(auxadc_base);
+ }
+
auxadc_phys_base = of_get_phys_base(auxadc);

of_node_put(auxadc);
@@ -1158,7 +1163,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV;
}

- apmixed_base = of_iomap(apmixedsys, 0);
+ apmixed_base = devm_of_iomap(&pdev->dev, apmixedsys, 0, NULL);
+ if (IS_ERR(apmixed_base)) {
+ of_node_put(apmixedsys);
+ return PTR_ERR(apmixed_base);
+ }
+
apmixed_phys_base = of_get_phys_base(apmixedsys);

of_node_put(apmixedsys);
--
2.34.1

2023-04-11 06:38:54

by Kang Chen

[permalink] [raw]
Subject: [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe

use devm_clk_get_enabled to do automatic resource management.
Meanwhile, remove error handling labels in the probe function and
the whole remove function.

Signed-off-by: Kang Chen <[email protected]>
Reviewed-by: Dongliang Mu <[email protected]>
---
v3 -> v2: remove some useles func calls.
v2 -> v1: init

Notice the devm_clk_get_enabled do the clk_get and clk_prepare_enable
at the same time.
I'm not sure if this has any side effects in initialization.

drivers/thermal/mediatek/auxadc_thermal.c | 48 +++++------------------
1 file changed, 10 insertions(+), 38 deletions(-)

diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
index 3372f7c29626..995837ce3ea2 100644
--- a/drivers/thermal/mediatek/auxadc_thermal.c
+++ b/drivers/thermal/mediatek/auxadc_thermal.c
@@ -1116,14 +1116,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)

mt->conf = of_device_get_match_data(&pdev->dev);

- mt->clk_peri_therm = devm_clk_get(&pdev->dev, "therm");
- if (IS_ERR(mt->clk_peri_therm))
- return PTR_ERR(mt->clk_peri_therm);
-
- mt->clk_auxadc = devm_clk_get(&pdev->dev, "auxadc");
- if (IS_ERR(mt->clk_auxadc))
- return PTR_ERR(mt->clk_auxadc);
-
mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
if (IS_ERR(mt->thermal_base))
return PTR_ERR(mt->thermal_base);
@@ -1182,16 +1174,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
if (ret)
return ret;

- ret = clk_prepare_enable(mt->clk_auxadc);
- if (ret) {
- dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
- return ret;
+ mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
+ if (IS_ERR(mt->clk_auxadc)) {
+ dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", mt->clk_auxadc);
+ return PTR_ERR(mt->clk_auxadc);
}

- ret = clk_prepare_enable(mt->clk_peri_therm);
- if (ret) {
- dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
- goto err_disable_clk_auxadc;
+ mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
+ if (IS_ERR(mt->clk_peri_therm)) {
+ dev_err(&pdev->dev, "Can't enable peri clk: %d\n", mt->clk_peri_therm);
+ return PTR_ERR(mt->clk_peri_therm);
}

if (mt->conf->version != MTK_THERMAL_V1) {
@@ -1215,38 +1207,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)

tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
&mtk_thermal_ops);
- if (IS_ERR(tzdev)) {
- ret = PTR_ERR(tzdev);
- goto err_disable_clk_peri_therm;
- }
+ if (IS_ERR(tzdev))
+ return PTR_ERR(tzdev);

ret = devm_thermal_add_hwmon_sysfs(tzdev);
if (ret)
dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");

return 0;
-
-err_disable_clk_peri_therm:
- clk_disable_unprepare(mt->clk_peri_therm);
-err_disable_clk_auxadc:
- clk_disable_unprepare(mt->clk_auxadc);
-
- return ret;
-}
-
-static int mtk_thermal_remove(struct platform_device *pdev)
-{
- struct mtk_thermal *mt = platform_get_drvdata(pdev);
-
- clk_disable_unprepare(mt->clk_peri_therm);
- clk_disable_unprepare(mt->clk_auxadc);
-
- return 0;
}

static struct platform_driver mtk_thermal_driver = {
.probe = mtk_thermal_probe,
- .remove = mtk_thermal_remove,
.driver = {
.name = "mtk-thermal",
.of_match_table = mtk_thermal_of_match,
--
2.34.1

2023-04-15 07:36:35

by Kang Chen

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe




> -----Original Messages-----
> From: "Kang Chen" <[email protected]>
> Sent Time: 2023-04-11 14:35:31 (Tuesday)
> To: [email protected]
> Cc: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
> Subject: [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
>
> use devm_clk_get_enabled to do automatic resource management.
> Meanwhile, remove error handling labels in the probe function and
> the whole remove function.
>
> Signed-off-by: Kang Chen <[email protected]>
> Reviewed-by: Dongliang Mu <[email protected]>
> ---
> v3 -> v2: remove some useles func calls.
> v2 -> v1: init
>
> Notice the devm_clk_get_enabled do the clk_get and clk_prepare_enable
> at the same time.
> I'm not sure if this has any side effects in initialization.
>
> drivers/thermal/mediatek/auxadc_thermal.c | 48 +++++------------------
> 1 file changed, 10 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
> index 3372f7c29626..995837ce3ea2 100644
> --- a/drivers/thermal/mediatek/auxadc_thermal.c
> +++ b/drivers/thermal/mediatek/auxadc_thermal.c
> @@ -1116,14 +1116,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)
>
> mt->conf = of_device_get_match_data(&pdev->dev);
>
> - mt->clk_peri_therm = devm_clk_get(&pdev->dev, "therm");
> - if (IS_ERR(mt->clk_peri_therm))
> - return PTR_ERR(mt->clk_peri_therm);
> -
> - mt->clk_auxadc = devm_clk_get(&pdev->dev, "auxadc");
> - if (IS_ERR(mt->clk_auxadc))
> - return PTR_ERR(mt->clk_auxadc);
> -
> mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
> if (IS_ERR(mt->thermal_base))
> return PTR_ERR(mt->thermal_base);
> @@ -1182,16 +1174,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> - ret = clk_prepare_enable(mt->clk_auxadc);
> - if (ret) {
> - dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
> - return ret;
> + mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
> + if (IS_ERR(mt->clk_auxadc)) {
> + dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", mt->clk_auxadc);
> + return PTR_ERR(mt->clk_auxadc);
> }
>
> - ret = clk_prepare_enable(mt->clk_peri_therm);
> - if (ret) {
> - dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
> - goto err_disable_clk_auxadc;
> + mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
> + if (IS_ERR(mt->clk_peri_therm)) {
> + dev_err(&pdev->dev, "Can't enable peri clk: %d\n", mt->clk_peri_therm);
> + return PTR_ERR(mt->clk_peri_therm);
> }
>
> if (mt->conf->version != MTK_THERMAL_V1) {
> @@ -1215,38 +1207,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)
>
> tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
> &mtk_thermal_ops);
> - if (IS_ERR(tzdev)) {
> - ret = PTR_ERR(tzdev);
> - goto err_disable_clk_peri_therm;
> - }
> + if (IS_ERR(tzdev))
> + return PTR_ERR(tzdev);
>
> ret = devm_thermal_add_hwmon_sysfs(tzdev);
> if (ret)
> dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
>
> return 0;
> -
> -err_disable_clk_peri_therm:
> - clk_disable_unprepare(mt->clk_peri_therm);
> -err_disable_clk_auxadc:
> - clk_disable_unprepare(mt->clk_auxadc);
> -
> - return ret;
> -}
> -
> -static int mtk_thermal_remove(struct platform_device *pdev)
> -{
> - struct mtk_thermal *mt = platform_get_drvdata(pdev);
> -
> - clk_disable_unprepare(mt->clk_peri_therm);
> - clk_disable_unprepare(mt->clk_auxadc);
> -
> - return 0;
> }
>
> static struct platform_driver mtk_thermal_driver = {
> .probe = mtk_thermal_probe,
> - .remove = mtk_thermal_remove,
> .driver = {
> .name = "mtk-thermal",
> .of_match_table = mtk_thermal_of_match,
> --
> 2.34.1

ping?

2023-04-17 09:59:31

by Daniel Lezcano

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe


Hi,

this patch does not apply:

Analyzing 9 messages in the thread
Will use the latest revision: v3
You can pick other revisions using the -vN flag
Checking attestation on all messages, may take a moment...
---
[PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to
devm_clk_get_enabled in mtk_thermal_probe
+ Signed-off-by: Daniel Lezcano <[email protected]>
+ Link:
https://lore.kernel.org/r/[email protected]
---
Total patches: 1 (cherrypicked: 2)
---
Link:
https://lore.kernel.org/r/[email protected]
Base: not specified
Applying: thermal: mediatek: change clk_prepare_enable to
devm_clk_get_enabled in mtk_thermal_probe
error: patch failed: drivers/thermal/mediatek/auxadc_thermal.c:1182
error: drivers/thermal/mediatek/auxadc_thermal.c: patch does not apply
Patch failed at 0001 thermal: mediatek: change clk_prepare_enable to
devm_clk_get_enabled in mtk_thermal_probe
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".



On 15/04/2023 09:14, [email protected] wrote:
>
>
>
>> -----Original Messages-----
>> From: "Kang Chen" <[email protected]>
>> Sent Time: 2023-04-11 14:35:31 (Tuesday)
>> To: [email protected]
>> Cc: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
>> Subject: [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
>>
>> use devm_clk_get_enabled to do automatic resource management.
>> Meanwhile, remove error handling labels in the probe function and
>> the whole remove function.
>>
>> Signed-off-by: Kang Chen <[email protected]>
>> Reviewed-by: Dongliang Mu <[email protected]>
>> ---
>> v3 -> v2: remove some useles func calls.
>> v2 -> v1: init
>>
>> Notice the devm_clk_get_enabled do the clk_get and clk_prepare_enable
>> at the same time.
>> I'm not sure if this has any side effects in initialization.
>>
>> drivers/thermal/mediatek/auxadc_thermal.c | 48 +++++------------------
>> 1 file changed, 10 insertions(+), 38 deletions(-)
>>
>> diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
>> index 3372f7c29626..995837ce3ea2 100644
>> --- a/drivers/thermal/mediatek/auxadc_thermal.c
>> +++ b/drivers/thermal/mediatek/auxadc_thermal.c
>> @@ -1116,14 +1116,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)
>>
>> mt->conf = of_device_get_match_data(&pdev->dev);
>>
>> - mt->clk_peri_therm = devm_clk_get(&pdev->dev, "therm");
>> - if (IS_ERR(mt->clk_peri_therm))
>> - return PTR_ERR(mt->clk_peri_therm);
>> -
>> - mt->clk_auxadc = devm_clk_get(&pdev->dev, "auxadc");
>> - if (IS_ERR(mt->clk_auxadc))
>> - return PTR_ERR(mt->clk_auxadc);
>> -
>> mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
>> if (IS_ERR(mt->thermal_base))
>> return PTR_ERR(mt->thermal_base);
>> @@ -1182,16 +1174,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
>> if (ret)
>> return ret;
>>
>> - ret = clk_prepare_enable(mt->clk_auxadc);
>> - if (ret) {
>> - dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
>> - return ret;
>> + mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
>> + if (IS_ERR(mt->clk_auxadc)) {
>> + dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", mt->clk_auxadc);
>> + return PTR_ERR(mt->clk_auxadc);
>> }
>>
>> - ret = clk_prepare_enable(mt->clk_peri_therm);
>> - if (ret) {
>> - dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
>> - goto err_disable_clk_auxadc;
>> + mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
>> + if (IS_ERR(mt->clk_peri_therm)) {
>> + dev_err(&pdev->dev, "Can't enable peri clk: %d\n", mt->clk_peri_therm);
>> + return PTR_ERR(mt->clk_peri_therm);
>> }
>>
>> if (mt->conf->version != MTK_THERMAL_V1) {
>> @@ -1215,38 +1207,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)
>>
>> tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
>> &mtk_thermal_ops);
>> - if (IS_ERR(tzdev)) {
>> - ret = PTR_ERR(tzdev);
>> - goto err_disable_clk_peri_therm;
>> - }
>> + if (IS_ERR(tzdev))
>> + return PTR_ERR(tzdev);
>>
>> ret = devm_thermal_add_hwmon_sysfs(tzdev);
>> if (ret)
>> dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
>>
>> return 0;
>> -
>> -err_disable_clk_peri_therm:
>> - clk_disable_unprepare(mt->clk_peri_therm);
>> -err_disable_clk_auxadc:
>> - clk_disable_unprepare(mt->clk_auxadc);
>> -
>> - return ret;
>> -}
>> -
>> -static int mtk_thermal_remove(struct platform_device *pdev)
>> -{
>> - struct mtk_thermal *mt = platform_get_drvdata(pdev);
>> -
>> - clk_disable_unprepare(mt->clk_peri_therm);
>> - clk_disable_unprepare(mt->clk_auxadc);
>> -
>> - return 0;
>> }
>>
>> static struct platform_driver mtk_thermal_driver = {
>> .probe = mtk_thermal_probe,
>> - .remove = mtk_thermal_remove,
>> .driver = {
>> .name = "mtk-thermal",
>> .of_match_table = mtk_thermal_of_match,
>> --
>> 2.34.1
>
> ping?

--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

2023-04-17 10:46:34

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe

On Mon, Apr 17, 2023 at 06:15:02PM +0800, Kang Chen wrote:
>
>
> > 2023年4月17日 17:52,Daniel Lezcano <[email protected]> 写道:
> >
> >
> > Hi,
> >
> > this patch does not apply:
> >
> > Analyzing 9 messages in the thread
> > Will use the latest revision: v3
> > You can pick other revisions using the -vN flag
> > Checking attestation on all messages, may take a moment...
> > ---
> > [PATCH v3 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
> > + Signed-off-by: Daniel Lezcano <[email protected]>
> > + Link: https://lore.kernel.org/r/[email protected]
> > ---
> > Total patches: 1 (cherrypicked: 2)
> > ---
> > Link: https://lore.kernel.org/r/[email protected]
> > Base: not specified
> > Applying: thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
> > error: patch failed: drivers/thermal/mediatek/auxadc_thermal.c:1182
> > error: drivers/thermal/mediatek/auxadc_thermal.c: patch does not apply
> > Patch failed at 0001 thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
> Could you show me your work tree? I can apply it on mainline-6.3-rc7...

Please write it against linux-next instead.

regards,
dan carpenter

2023-04-17 13:31:19

by Kang Chen

[permalink] [raw]
Subject: [PATCH v4 1/2] thermal: mediatek: use devm_of_iomap to avoid resource leak in mtk_thermal_probe

Smatch reports:
1. mtk_thermal_probe() warn: 'apmixed_base' from of_iomap() not released.
2. mtk_thermal_probe() warn: 'auxadc_base' from of_iomap() not released.

The original code forgets to release iomap resource when handling errors,
fix it by switch to devm_of_iomap.

Fixes: 89945047b166 ("thermal: mediatek: Add tsensor support for V2 thermal system")
Signed-off-by: Kang Chen <[email protected]>
Reviewed-by: Dongliang Mu <[email protected]>
---
v4 -> v3: no modify
v3 -> v2: fix typo and put of_node in error handling
v2 -> v1: use devm_of_iomap instead.

drivers/thermal/mediatek/auxadc_thermal.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
index b6bb9eaafb74..dcc64237ea60 100644
--- a/drivers/thermal/mediatek/auxadc_thermal.c
+++ b/drivers/thermal/mediatek/auxadc_thermal.c
@@ -1212,7 +1212,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV;
}

- auxadc_base = of_iomap(auxadc, 0);
+ auxadc_base = devm_of_iomap(&pdev->dev, auxadc, 0, NULL);
+ if (IS_ERR(auxadc_base)) {
+ of_node_put(auxadc);
+ return PTR_ERR(auxadc_base);
+ }
+
auxadc_phys_base = of_get_phys_base(auxadc);

of_node_put(auxadc);
@@ -1228,7 +1233,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV;
}

- apmixed_base = of_iomap(apmixedsys, 0);
+ apmixed_base = devm_of_iomap(&pdev->dev, apmixedsys, 0, NULL);
+ if (IS_ERR(apmixed_base)) {
+ of_node_put(apmixedsys);
+ return PTR_ERR(apmixed_base);
+ }
+
apmixed_phys_base = of_get_phys_base(apmixedsys);

of_node_put(apmixedsys);
--
2.34.1

2023-04-17 13:33:16

by Kang Chen

[permalink] [raw]
Subject: [PATCH v4 2/2] thermal: mediatek: change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe

use devm_clk_get_enabled to do automatic resource management.
Meanwhile, remove error handling labels in the probe function and
the whole remove function.

Signed-off-by: Kang Chen <[email protected]>
Reviewed-by: Dongliang Mu <[email protected]>
---
v4 -> v3: port to linux-next tree
v3 -> v2: remove some useles func calls.
v2 -> v1: init

drivers/thermal/mediatek/auxadc_thermal.c | 48 +++++------------------
1 file changed, 10 insertions(+), 38 deletions(-)

diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
index dcc64237ea60..18c8cce960c3 100644
--- a/drivers/thermal/mediatek/auxadc_thermal.c
+++ b/drivers/thermal/mediatek/auxadc_thermal.c
@@ -1186,14 +1186,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)

mt->conf = of_device_get_match_data(&pdev->dev);

- mt->clk_peri_therm = devm_clk_get(&pdev->dev, "therm");
- if (IS_ERR(mt->clk_peri_therm))
- return PTR_ERR(mt->clk_peri_therm);
-
- mt->clk_auxadc = devm_clk_get(&pdev->dev, "auxadc");
- if (IS_ERR(mt->clk_auxadc))
- return PTR_ERR(mt->clk_auxadc);
-
mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
if (IS_ERR(mt->thermal_base))
return PTR_ERR(mt->thermal_base);
@@ -1252,16 +1244,16 @@ static int mtk_thermal_probe(struct platform_device *pdev)
if (ret)
return ret;

- ret = clk_prepare_enable(mt->clk_auxadc);
- if (ret) {
- dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
- return ret;
+ mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
+ if (IS_ERR(mt->clk_auxadc)) {
+ dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", mt->clk_auxadc);
+ return PTR_ERR(mt->clk_auxadc);
}

- ret = clk_prepare_enable(mt->clk_peri_therm);
- if (ret) {
- dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
- goto err_disable_clk_auxadc;
+ mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
+ if (IS_ERR(mt->clk_peri_therm)) {
+ dev_err(&pdev->dev, "Can't enable peri clk: %d\n", mt->clk_peri_therm);
+ return PTR_ERR(mt->clk_peri_therm);
}

mtk_thermal_turn_on_buffer(mt, apmixed_base);
@@ -1288,38 +1280,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)

tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
&mtk_thermal_ops);
- if (IS_ERR(tzdev)) {
- ret = PTR_ERR(tzdev);
- goto err_disable_clk_peri_therm;
- }
+ if (IS_ERR(tzdev))
+ return PTR_ERR(tzdev);

ret = devm_thermal_add_hwmon_sysfs(&pdev->dev, tzdev);
if (ret)
dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");

return 0;
-
-err_disable_clk_peri_therm:
- clk_disable_unprepare(mt->clk_peri_therm);
-err_disable_clk_auxadc:
- clk_disable_unprepare(mt->clk_auxadc);
-
- return ret;
-}
-
-static int mtk_thermal_remove(struct platform_device *pdev)
-{
- struct mtk_thermal *mt = platform_get_drvdata(pdev);
-
- clk_disable_unprepare(mt->clk_peri_therm);
- clk_disable_unprepare(mt->clk_auxadc);
-
- return 0;
}

static struct platform_driver mtk_thermal_driver = {
.probe = mtk_thermal_probe,
- .remove = mtk_thermal_remove,
.driver = {
.name = "mtk-thermal",
.of_match_table = mtk_thermal_of_match,
--
2.34.1

Subject: Re: [PATCH v4 1/2] thermal: mediatek: use devm_of_iomap to avoid resource leak in mtk_thermal_probe

Il 17/04/23 14:55, Kang Chen ha scritto:
> Smatch reports:
> 1. mtk_thermal_probe() warn: 'apmixed_base' from of_iomap() not released.
> 2. mtk_thermal_probe() warn: 'auxadc_base' from of_iomap() not released.
>
> The original code forgets to release iomap resource when handling errors,
> fix it by switch to devm_of_iomap.
>
> Fixes: 89945047b166 ("thermal: mediatek: Add tsensor support for V2 thermal system")
> Signed-off-by: Kang Chen <[email protected]>
> Reviewed-by: Dongliang Mu <[email protected]>

Good job!

Reviewed-by: AngeloGioacchino Del Regno <[email protected]>