]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
of: Add for_each_compatible_node_scoped() helper
authorKrzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Fri, 9 Jan 2026 16:57:45 +0000 (17:57 +0100)
committerRob Herring (Arm) <robh@kernel.org>
Wed, 4 Feb 2026 02:58:12 +0000 (20:58 -0600)
Just like looping through children and available children, add a scoped
helper for for_each_compatible_node() so error paths can drop
of_node_put() leading to simpler code.

Suggested-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Link: https://patch.msgid.link/20260109-of-for-each-compatible-scoped-v3-1-c22fa2c0749a@oss.qualcomm.com
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
.clang-format
include/linux/of.h
scripts/dtc/dt-extract-compatibles

index 2ceca764122f87108c7706b31fc1bef482caa832..1f2429c4743353bbaa0c789d72435faf51c2b720 100644 (file)
@@ -259,6 +259,7 @@ ForEachMacros:
   - 'for_each_collection'
   - 'for_each_comp_order'
   - 'for_each_compatible_node'
+  - 'for_each_compatible_node_scoped'
   - 'for_each_component_dais'
   - 'for_each_component_dais_safe'
   - 'for_each_conduit'
index 9bbdcf25a2b448ba4ec5ddee8b35a105ca4aab8b..be6ec4916adf522aa5e4dcb1480fe91e1a4e29d2 100644 (file)
@@ -1485,6 +1485,13 @@ static inline int of_property_read_s32(const struct device_node *np,
 #define for_each_compatible_node(dn, type, compatible) \
        for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
             dn = of_find_compatible_node(dn, type, compatible))
+
+#define for_each_compatible_node_scoped(dn, type, compatible) \
+       for (struct device_node *dn __free(device_node) =               \
+            of_find_compatible_node(NULL, type, compatible);           \
+            dn;                                                        \
+            dn = of_find_compatible_node(dn, type, compatible))
+
 #define for_each_matching_node(dn, matches) \
        for (dn = of_find_matching_node(NULL, matches); dn; \
             dn = of_find_matching_node(dn, matches))
index 6570efabaa649ca42efee312b5b7253b2687424b..87999d7073905522a0a337a610c9cfbf106390b3 100755 (executable)
@@ -72,6 +72,7 @@ def parse_compatibles(file, compat_ignore_list):
                compat_list += parse_of_functions(data, "_is_compatible")
                compat_list += parse_of_functions(data, "of_find_compatible_node")
                compat_list += parse_of_functions(data, "for_each_compatible_node")
+               compat_list += parse_of_functions(data, "for_each_compatible_node_scoped")
                compat_list += parse_of_functions(data, "of_get_compatible_child")
 
        return compat_list