lkml.org 
[lkml]   [2018]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 090/235] regulator: qcom_spmi: Fix warning Bad of_node_put()
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Niklas Cassel <niklas.cassel@linaro.org>

    [ Upstream commit fffe7f52eb5db41eedadba9a8038e982dcfaee0c ]

    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>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/regulator/qcom_spmi-regulator.c | 32 ++++++++++++++++++++------------
    1 file changed, 20 insertions(+), 12 deletions(-)

    --- a/drivers/regulator/qcom_spmi-regulator.c
    +++ b/drivers/regulator/qcom_spmi-regulator.c
    @@ -1752,7 +1752,8 @@ static int qcom_spmi_regulator_probe(str
    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(str

    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(str
    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;

    \
     
     \ /
      Last update: 2018-09-24 14:36    [W:4.026 / U:0.544 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site