Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

device property: Add scoped fwnode child node iterators

Add scoped versions of fwnode child node iterators that automatically
handle reference counting cleanup using the __free() attribute:

- fwnode_for_each_child_node_scoped()
- fwnode_for_each_available_child_node_scoped()

These macros follow the same pattern as existing scoped iterators in the
kernel, ensuring fwnode references are automatically released when the
iterator variable goes out of scope. This prevents resource leaks and
eliminates the need for manual cleanup in error paths.

The implementation mirrors the non-scoped variants but uses
__free(fwnode_handle) for automatic resource management, providing a
safer and more convenient interface for drivers iterating over firmware
node children.

Signed-off-by: Jean-François Lessard <jefflessard3@gmail.com>
Acked-by: Danilo Krummrich <dakr@kernel.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>

authored by

Jean-François Lessard and committed by
Wolfram Sang
448097bb 8f5ae30d

+10
+10
include/linux/property.h
··· 176 176 for (child = fwnode_get_next_available_child_node(fwnode, NULL); child;\ 177 177 child = fwnode_get_next_available_child_node(fwnode, child)) 178 178 179 + #define fwnode_for_each_child_node_scoped(fwnode, child) \ 180 + for (struct fwnode_handle *child __free(fwnode_handle) = \ 181 + fwnode_get_next_child_node(fwnode, NULL); \ 182 + child; child = fwnode_get_next_child_node(fwnode, child)) 183 + 184 + #define fwnode_for_each_available_child_node_scoped(fwnode, child) \ 185 + for (struct fwnode_handle *child __free(fwnode_handle) = \ 186 + fwnode_get_next_available_child_node(fwnode, NULL); \ 187 + child; child = fwnode_get_next_available_child_node(fwnode, child)) 188 + 179 189 struct fwnode_handle *device_get_next_child_node(const struct device *dev, 180 190 struct fwnode_handle *child); 181 191