aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Cassel <niklas.cassel@linaro.org>2018-07-16 09:32:51 -0400
committerMark Brown <broonie@kernel.org>2018-07-20 12:40:46 -0400
commitfffe7f52eb5db41eedadba9a8038e982dcfaee0c (patch)
tree39b48bf3971fbcffbab345c6e8c1fd77e52e67d9
parentcf18fd01466d59263c615165341684a055206dd5 (diff)
regulator: qcom_spmi: Fix warning Bad of_node_put()
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>
-rw-r--r--drivers/regulator/qcom_spmi-regulator.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/regulator/qcom_spmi-regulator.c b/drivers/regulator/qcom_spmi-regulator.c
index 9817f1a75342..4cc14c65d86b 100644
--- a/drivers/regulator/qcom_spmi-regulator.c
+++ b/drivers/regulator/qcom_spmi-regulator.c
@@ -1752,7 +1752,8 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
1752 const char *name; 1752 const char *name;
1753 struct device *dev = &pdev->dev; 1753 struct device *dev = &pdev->dev;
1754 struct device_node *node = pdev->dev.of_node; 1754 struct device_node *node = pdev->dev.of_node;
1755 struct device_node *syscon; 1755 struct device_node *syscon, *reg_node;
1756 struct property *reg_prop;
1756 int ret, lenp; 1757 int ret, lenp;
1757 struct list_head *vreg_list; 1758 struct list_head *vreg_list;
1758 1759
@@ -1780,10 +1781,13 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
1780 1781
1781 for (reg = match->data; reg->name; reg++) { 1782 for (reg = match->data; reg->name; reg++) {
1782 1783
1783 if (saw_regmap && \ 1784 if (saw_regmap) {
1784 of_find_property(of_find_node_by_name(node, reg->name), \ 1785 reg_node = of_get_child_by_name(node, reg->name);
1785 "qcom,saw-slave", &lenp)) { 1786 reg_prop = of_find_property(reg_node, "qcom,saw-slave",
1786 continue; 1787 &lenp);
1788 of_node_put(reg_node);
1789 if (reg_prop)
1790 continue;
1787 } 1791 }
1788 1792
1789 vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL); 1793 vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL);
@@ -1816,13 +1820,17 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
1816 if (ret) 1820 if (ret)
1817 continue; 1821 continue;
1818 1822
1819 if (saw_regmap && \ 1823 if (saw_regmap) {
1820 of_find_property(of_find_node_by_name(node, reg->name), \ 1824 reg_node = of_get_child_by_name(node, reg->name);
1821 "qcom,saw-leader", &lenp)) { 1825 reg_prop = of_find_property(reg_node, "qcom,saw-leader",
1822 spmi_saw_ops = *(vreg->desc.ops); 1826 &lenp);
1823 spmi_saw_ops.set_voltage_sel = \ 1827 of_node_put(reg_node);
1824 spmi_regulator_saw_set_voltage; 1828 if (reg_prop) {
1825 vreg->desc.ops = &spmi_saw_ops; 1829 spmi_saw_ops = *(vreg->desc.ops);
1830 spmi_saw_ops.set_voltage_sel =
1831 spmi_regulator_saw_set_voltage;
1832 vreg->desc.ops = &spmi_saw_ops;
1833 }
1826 } 1834 }
1827 1835
1828 config.dev = dev; 1836 config.dev = dev;