]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
regulator: qcom_spmi: Fix warning Bad of_node_put()
authorNiklas Cassel <niklas.cassel@linaro.org>
Mon, 16 Jul 2018 13:32:51 +0000 (15:32 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 20 Jul 2018 16:40:46 +0000 (17:40 +0100)
For of_find_node_by_name(), you typically pass what the previous call
returned. Therefore, of_find_node_by_name() increases the refcount of
the returned node, and decreases the refcount of the node passed as the
first argument.

of_find_node_by_name() is incorrectly used, and produces a warning.
Fix the warning by using the more suitable function
of_get_child_by_name().

Also add a missing of_node_put() for the returned value, since this was
previously being leaked.

OF: ERROR: Bad of_node_put() on /soc/qcom,spmi@400f000/pmic@3/regulators
CPU: 1 PID: 1 Comm: swapper/0 Tainted: G        W         4.18.0-rc4-00223-gefd7b360b70e #12
Hardware name: Qualcomm Technologies, Inc. DB820c (DT)
Call trace:
 dump_backtrace+0x0/0x1a8
 show_stack+0x14/0x20
 dump_stack+0x90/0xb4
 of_node_release+0x74/0x78
 kobject_put+0x90/0x1f0
 of_node_put+0x14/0x20
 of_find_node_by_name+0x80/0xd8
 qcom_spmi_regulator_probe+0x30c/0x508

Fixes: 0caecaa87202 ("regulator: qcom_spmi: Add support for SAW")
Signed-off-by: Niklas Cassel <niklas.cassel@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/qcom_spmi-regulator.c

index 9817f1a753425e2199b0f3fda82ac15907ffc63a..4cc14c65d86b1221681d03deb95ba026b48561f9 100644 (file)
@@ -1752,7 +1752,8 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
        const char *name;
        struct device *dev = &pdev->dev;
        struct device_node *node = pdev->dev.of_node;
-       struct device_node *syscon;
+       struct device_node *syscon, *reg_node;
+       struct property *reg_prop;
        int ret, lenp;
        struct list_head *vreg_list;
 
@@ -1780,10 +1781,13 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
 
        for (reg = match->data; reg->name; reg++) {
 
-               if (saw_regmap && \
-                   of_find_property(of_find_node_by_name(node, reg->name), \
-                                    "qcom,saw-slave", &lenp)) {
-                       continue;
+               if (saw_regmap) {
+                       reg_node = of_get_child_by_name(node, reg->name);
+                       reg_prop = of_find_property(reg_node, "qcom,saw-slave",
+                                                   &lenp);
+                       of_node_put(reg_node);
+                       if (reg_prop)
+                               continue;
                }
 
                vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL);
@@ -1816,13 +1820,17 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
                if (ret)
                        continue;
 
-               if (saw_regmap && \
-                   of_find_property(of_find_node_by_name(node, reg->name), \
-                                    "qcom,saw-leader", &lenp)) {
-                       spmi_saw_ops = *(vreg->desc.ops);
-                       spmi_saw_ops.set_voltage_sel = \
-                               spmi_regulator_saw_set_voltage;
-                       vreg->desc.ops = &spmi_saw_ops;
+               if (saw_regmap) {
+                       reg_node = of_get_child_by_name(node, reg->name);
+                       reg_prop = of_find_property(reg_node, "qcom,saw-leader",
+                                                   &lenp);
+                       of_node_put(reg_node);
+                       if (reg_prop) {
+                               spmi_saw_ops = *(vreg->desc.ops);
+                               spmi_saw_ops.set_voltage_sel =
+                                       spmi_regulator_saw_set_voltage;
+                               vreg->desc.ops = &spmi_saw_ops;
+                       }
                }
 
                config.dev = dev;