]> git.itanic.dy.fi Git - linux-stable/commitdiff
clk: sprd: Hold reference returned by of_get_parent()
authorLiang He <windhl@126.com>
Mon, 4 Jul 2022 00:47:29 +0000 (08:47 +0800)
committerStephen Boyd <sboyd@kernel.org>
Fri, 19 Aug 2022 21:50:24 +0000 (14:50 -0700)
We should hold the reference returned by of_get_parent() and use it
to call of_node_put() for refcount balance.

Fixes: f95e8c7923d1 ("clk: sprd: support to get regmap from parent node")
Signed-off-by: Liang He <windhl@126.com>
Link: https://lore.kernel.org/r/20220704004729.272481-1-windhl@126.com
Reviewed-by: Orson Zhai <orsonzhai@gmail.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/sprd/common.c

index d620bbbcdfc88eeb77446b8f1ce267e75103a917..ce81e4087a8fce2e8d2239e6d706de7f33b24c7d 100644 (file)
@@ -41,7 +41,7 @@ int sprd_clk_regmap_init(struct platform_device *pdev,
 {
        void __iomem *base;
        struct device *dev = &pdev->dev;
-       struct device_node *node = dev->of_node;
+       struct device_node *node = dev->of_node, *np;
        struct regmap *regmap;
 
        if (of_find_property(node, "sprd,syscon", NULL)) {
@@ -50,9 +50,10 @@ int sprd_clk_regmap_init(struct platform_device *pdev,
                        pr_err("%s: failed to get syscon regmap\n", __func__);
                        return PTR_ERR(regmap);
                }
-       } else if (of_device_is_compatible(of_get_parent(dev->of_node),
-                          "syscon")) {
-               regmap = device_node_to_regmap(of_get_parent(dev->of_node));
+       } else if (of_device_is_compatible(np = of_get_parent(node), "syscon") ||
+                  (of_node_put(np), 0)) {
+               regmap = device_node_to_regmap(np);
+               of_node_put(np);
                if (IS_ERR(regmap)) {
                        dev_err(dev, "failed to get regmap from its parent.\n");
                        return PTR_ERR(regmap);