@@ -1108,11 +1108,11 @@ static int max9286_parse_dt(struct max9286_priv *priv)
struct device_node *node = NULL;
unsigned int i2c_mux_mask = 0;
+ /* Balance the of_node_put() performed by of_find_node_by_name(). */
of_node_get(dev->of_node);
i2c_mux = of_find_node_by_name(dev->of_node, "i2c-mux");
if (!i2c_mux) {
dev_err(dev, "Failed to find i2c-mux node\n");
- of_node_put(dev->of_node);
return -EINVAL;
}
@@ -1160,7 +1160,6 @@ static int max9286_parse_dt(struct max9286_priv *priv)
of_fwnode_handle(node), &vep);
if (ret) {
of_node_put(node);
- of_node_put(dev->of_node);
return ret;
}
@@ -1170,7 +1169,6 @@ static int max9286_parse_dt(struct max9286_priv *priv)
vep.bus_type);
v4l2_fwnode_endpoint_free(&vep);
of_node_put(node);
- of_node_put(dev->of_node);
return -EINVAL;
}
@@ -1208,7 +1206,6 @@ static int max9286_parse_dt(struct max9286_priv *priv)
priv->nsources++;
}
of_node_put(node);
- of_node_put(dev->of_node);
priv->route_mask = priv->source_mask;
With a little help from an of_ref_read(): +static int of_ref_read(struct device_node *node) +{ + if (node) + return kref_read(&node->kobj.kref); + + return 0; +} I've validated the refcount of the node now stays consitent. Particularly between entry (A) and exit (B) of the parse_dt function: [ 2.305784] max9286 4-004c: A: node refcnt is 6 [ 2.310401] max9286 4-004c: node refcnt is 6 [ 2.314729] max9286 4-004c: 1335: node refcnt is 6 [ 2.319587] max9286 4-004c: 1356: node refcnt is 6 [ 2.324432] max9286 4-004c: 1364: (in for_each) node refcnt is 6 [ 2.330503] max9286 4-004c: 1364: (in for_each) node refcnt is 6 [ 2.336575] max9286 4-004c: 1364: (in for_each) node refcnt is 6 [ 2.342656] max9286 4-004c: 1364: (in for_each) node refcnt is 6 [ 2.348724] max9286 4-004c: 1364: (in for_each) node refcnt is 6 [ 2.354808] max9286 4-004c: 1437: node refcnt is 6 [ 2.359644] max9286 4-004c: B: node refcnt is 6 I've added a comment to explain the extra of_node_get() but the exercise identified that the driver was incorrectly calling of_node_put() on the same node. Those have been removed. Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> --- drivers/media/i2c/max9286.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)