]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
thermal/drivers/sprd: Add missing of_node_put for loop iteration
authorKrzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Mon, 14 Jun 2021 19:22:30 +0000 (21:22 +0200)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 14 Jun 2021 20:42:09 +0000 (22:42 +0200)
Early exits from for_each_available_child_of_node() should decrement the
node reference counter.  Reported by Coccinelle:

  drivers/thermal/sprd_thermal.c:387:1-23: WARNING:
    Function "for_each_child_of_node" should have of_node_put() before goto around lines 391.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Acked-by: Chunyan Zhang <zhang.lyra@gmail.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20210614192230.19248-2-krzysztof.kozlowski@canonical.com
drivers/thermal/sprd_thermal.c

index fe06cccf14b382adf09be9169f102d7c955cc216..fff80fc180028416e864a16ee82fcfae39f8d510 100644 (file)
@@ -388,7 +388,7 @@ static int sprd_thm_probe(struct platform_device *pdev)
                sen = devm_kzalloc(&pdev->dev, sizeof(*sen), GFP_KERNEL);
                if (!sen) {
                        ret = -ENOMEM;
-                       goto disable_clk;
+                       goto of_put;
                }
 
                sen->data = thm;
@@ -397,13 +397,13 @@ static int sprd_thm_probe(struct platform_device *pdev)
                ret = of_property_read_u32(sen_child, "reg", &sen->id);
                if (ret) {
                        dev_err(&pdev->dev, "get sensor reg failed");
-                       goto disable_clk;
+                       goto of_put;
                }
 
                ret = sprd_thm_sensor_calibration(sen_child, thm, sen);
                if (ret) {
                        dev_err(&pdev->dev, "efuse cal analysis failed");
-                       goto disable_clk;
+                       goto of_put;
                }
 
                sprd_thm_sensor_init(thm, sen);
@@ -416,19 +416,20 @@ static int sprd_thm_probe(struct platform_device *pdev)
                        dev_err(&pdev->dev, "register thermal zone failed %d\n",
                                sen->id);
                        ret = PTR_ERR(sen->tzd);
-                       goto disable_clk;
+                       goto of_put;
                }
 
                thm->sensor[sen->id] = sen;
        }
+       /* sen_child set to NULL at this point */
 
        ret = sprd_thm_set_ready(thm);
        if (ret)
-               goto disable_clk;
+               goto of_put;
 
        ret = sprd_thm_wait_temp_ready(thm);
        if (ret)
-               goto disable_clk;
+               goto of_put;
 
        for (i = 0; i < thm->nr_sensors; i++)
                sprd_thm_toggle_sensor(thm->sensor[i], true);
@@ -436,6 +437,8 @@ static int sprd_thm_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, thm);
        return 0;
 
+of_put:
+       of_node_put(sen_child);
 disable_clk:
        clk_disable_unprepare(thm->clk);
        return ret;