Message ID | 20240217164249.921878-5-jic23@kernel.org |
---|---|
State | New |
Headers | show |
Series | device property / IIO: Use cleanup.h magic for fwnode_handle_put() handling. | expand |
On Sat, Feb 17, 2024 at 04:42:38PM +0000, Jonathan Cameron wrote: > From: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > Similar to recently propose for_each_child_of_node_scoped() this > new version of the loop macro instantiates a new local > struct fwnode_handle * that uses the __free(fwnode_handle) auto > cleanup handling so that if a reference to a node is held on early > exit from the loop the reference will be released. If the loop > runs to completion, the child pointer will be NULL and no action will > be taken. > > The reason this is useful is that it removes the need for > fwnode_handle_put() on early loop exits. If there is a need > to retain the reference, then return_ptr(child) or no_free_ptr(child) > may be used to safely disable the auto cleanup. > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- > v4: Include the alignement changes that were in patch 15 of v3 with > a tweak as I missed the first line. Thanks Andy! > > include/linux/property.h | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/include/linux/property.h b/include/linux/property.h > index 9e67c3c4df6e..eefd662a2f9d 100644 > --- a/include/linux/property.h > +++ b/include/linux/property.h > @@ -182,6 +182,11 @@ struct fwnode_handle *device_get_next_child_node(const struct device *dev, > for (child = device_get_next_child_node(dev, NULL); child; \ > child = device_get_next_child_node(dev, child)) > > +#define device_for_each_child_node_scoped(dev, child) \ > + for (struct fwnode_handle *child __free(fwnode_handle) = \ > + device_get_next_child_node(dev, NULL); \ > + child; child = device_get_next_child_node(dev, child)) > + > struct fwnode_handle *fwnode_get_named_child_node(const struct fwnode_handle *fwnode, > const char *childname); > struct fwnode_handle *device_get_named_child_node(const struct device *dev, Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
On Sat, Feb 17, 2024 at 04:42:38PM +0000, Jonathan Cameron wrote: > From: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > Similar to recently propose for_each_child_of_node_scoped() this > new version of the loop macro instantiates a new local > struct fwnode_handle * that uses the __free(fwnode_handle) auto > cleanup handling so that if a reference to a node is held on early > exit from the loop the reference will be released. If the loop > runs to completion, the child pointer will be NULL and no action will > be taken. > > The reason this is useful is that it removes the need for > fwnode_handle_put() on early loop exits. If there is a need > to retain the reference, then return_ptr(child) or no_free_ptr(child) > may be used to safely disable the auto cleanup. > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
diff --git a/include/linux/property.h b/include/linux/property.h index 9e67c3c4df6e..eefd662a2f9d 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -182,6 +182,11 @@ struct fwnode_handle *device_get_next_child_node(const struct device *dev, for (child = device_get_next_child_node(dev, NULL); child; \ child = device_get_next_child_node(dev, child)) +#define device_for_each_child_node_scoped(dev, child) \ + for (struct fwnode_handle *child __free(fwnode_handle) = \ + device_get_next_child_node(dev, NULL); \ + child; child = device_get_next_child_node(dev, child)) + struct fwnode_handle *fwnode_get_named_child_node(const struct fwnode_handle *fwnode, const char *childname); struct fwnode_handle *device_get_named_child_node(const struct device *dev,