summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-François Lessard <jefflessard3@gmail.com>2025-09-02 15:04:39 -0400
committerWolfram Sang <wsa+renesas@sang-engineering.com>2025-09-10 14:48:03 +0200
commit448097bbd3836d2ee46fa6eabd18661e9a3c8be8 (patch)
tree890fd3a6e94120341d25793b66a4933f509c8045
parent8f5ae30d69d7543eee0d70083daf4de8fe15d585 (diff)
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>
-rw-r--r--include/linux/property.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/property.h b/include/linux/property.h
index 82f0cb3abd1e..862e208133f3 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -176,6 +176,16 @@ struct fwnode_handle *fwnode_get_next_available_child_node(
for (child = fwnode_get_next_available_child_node(fwnode, NULL); child;\
child = fwnode_get_next_available_child_node(fwnode, child))
+#define fwnode_for_each_child_node_scoped(fwnode, child) \
+ for (struct fwnode_handle *child __free(fwnode_handle) = \
+ fwnode_get_next_child_node(fwnode, NULL); \
+ child; child = fwnode_get_next_child_node(fwnode, child))
+
+#define fwnode_for_each_available_child_node_scoped(fwnode, child) \
+ for (struct fwnode_handle *child __free(fwnode_handle) = \
+ fwnode_get_next_available_child_node(fwnode, NULL); \
+ child; child = fwnode_get_next_available_child_node(fwnode, child))
+
struct fwnode_handle *device_get_next_child_node(const struct device *dev,
struct fwnode_handle *child);