pinctrl: st: fix leaked of_node references
The call to of_get_child_by_name returns a node pointer with refcount incremented thus it must be explicitly decremented after the last usage. Detected by coccinelle with the following warnings: ./drivers/pinctrl/pinctrl-st.c:1188:3-9: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. ./drivers/pinctrl/pinctrl-st.c:1188:3-9: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. ./drivers/pinctrl/pinctrl-st.c:1199:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. ./drivers/pinctrl/pinctrl-st.c:1199:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. Signed-off-by: Wen Yang <wen.yang99@zte.com.cn> Cc: Patrice Chotard <patrice.chotard@st.com> Cc: Linus Walleij <linus.walleij@linaro.org> Cc: linux-gpio@vger.kernel.org Cc: linux-kernel@vger.kernel.org (open list) Reviewed-by: Patrice Chotard <patrice.chotard@st.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
44b9f86cd4
commit
483d70d73b
|
@ -1170,7 +1170,7 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
|
||||||
struct property *pp;
|
struct property *pp;
|
||||||
struct st_pinconf *conf;
|
struct st_pinconf *conf;
|
||||||
struct device_node *pins;
|
struct device_node *pins;
|
||||||
int i = 0, npins = 0, nr_props;
|
int i = 0, npins = 0, nr_props, ret = 0;
|
||||||
|
|
||||||
pins = of_get_child_by_name(np, "st,pins");
|
pins = of_get_child_by_name(np, "st,pins");
|
||||||
if (!pins)
|
if (!pins)
|
||||||
|
@ -1185,7 +1185,8 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
|
||||||
npins++;
|
npins++;
|
||||||
} else {
|
} else {
|
||||||
pr_warn("Invalid st,pins in %pOFn node\n", np);
|
pr_warn("Invalid st,pins in %pOFn node\n", np);
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto out_put_node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1195,8 +1196,10 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
|
||||||
grp->pin_conf = devm_kcalloc(info->dev,
|
grp->pin_conf = devm_kcalloc(info->dev,
|
||||||
npins, sizeof(*conf), GFP_KERNEL);
|
npins, sizeof(*conf), GFP_KERNEL);
|
||||||
|
|
||||||
if (!grp->pins || !grp->pin_conf)
|
if (!grp->pins || !grp->pin_conf) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto out_put_node;
|
||||||
|
}
|
||||||
|
|
||||||
/* <bank offset mux direction rt_type rt_delay rt_clk> */
|
/* <bank offset mux direction rt_type rt_delay rt_clk> */
|
||||||
for_each_property_of_node(pins, pp) {
|
for_each_property_of_node(pins, pp) {
|
||||||
|
@ -1229,9 +1232,11 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_put_node:
|
||||||
of_node_put(pins);
|
of_node_put(pins);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int st_pctl_parse_functions(struct device_node *np,
|
static int st_pctl_parse_functions(struct device_node *np,
|
||||||
|
|
Loading…
Reference in New Issue