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

Consolidate of_get_next_child

This adds a read_lock around the child/next accesses on Sparc.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Acked-by: Paul Mackerras <paulus@samba.org>
Acked-by: David S. Miller <davem@davemloft.net>

+24 -52
-24
arch/powerpc/kernel/prom.c
··· 1241 1241 EXPORT_SYMBOL(of_find_all_nodes); 1242 1242 1243 1243 /** 1244 - * of_get_next_child - Iterate a node childs 1245 - * @node: parent node 1246 - * @prev: previous child of the parent node, or NULL to get first 1247 - * 1248 - * Returns a node pointer with refcount incremented, use 1249 - * of_node_put() on it when done. 1250 - */ 1251 - struct device_node *of_get_next_child(const struct device_node *node, 1252 - struct device_node *prev) 1253 - { 1254 - struct device_node *next; 1255 - 1256 - read_lock(&devtree_lock); 1257 - next = prev ? prev->sibling : node->child; 1258 - for (; next != 0; next = next->sibling) 1259 - if (of_node_get(next)) 1260 - break; 1261 - of_node_put(prev); 1262 - read_unlock(&devtree_lock); 1263 - return next; 1264 - } 1265 - EXPORT_SYMBOL(of_get_next_child); 1266 - 1267 - /** 1268 1244 * of_node_get - Increment refcount of a node 1269 1245 * @node: Node to inc refcount, NULL is supported to 1270 1246 * simplify writing of callers
-14
arch/sparc/kernel/prom.c
··· 29 29 30 30 extern rwlock_t devtree_lock; /* temporary while merging */ 31 31 32 - struct device_node *of_get_next_child(const struct device_node *node, 33 - struct device_node *prev) 34 - { 35 - struct device_node *next; 36 - 37 - next = prev ? prev->sibling : node->child; 38 - for (; next != 0; next = next->sibling) { 39 - break; 40 - } 41 - 42 - return next; 43 - } 44 - EXPORT_SYMBOL(of_get_next_child); 45 - 46 32 struct device_node *of_find_node_by_path(const char *path) 47 33 { 48 34 struct device_node *np = allnodes;
-14
arch/sparc64/kernel/prom.c
··· 34 34 35 35 extern rwlock_t devtree_lock; /* temporary while merging */ 36 36 37 - struct device_node *of_get_next_child(const struct device_node *node, 38 - struct device_node *prev) 39 - { 40 - struct device_node *next; 41 - 42 - next = prev ? prev->sibling : node->child; 43 - for (; next != 0; next = next->sibling) { 44 - break; 45 - } 46 - 47 - return next; 48 - } 49 - EXPORT_SYMBOL(of_get_next_child); 50 - 51 37 struct device_node *of_find_node_by_path(const char *path) 52 38 { 53 39 struct device_node *np = allnodes;
+24
drivers/of/base.c
··· 134 134 return np; 135 135 } 136 136 EXPORT_SYMBOL(of_get_parent); 137 + 138 + /** 139 + * of_get_next_child - Iterate a node childs 140 + * @node: parent node 141 + * @prev: previous child of the parent node, or NULL to get first 142 + * 143 + * Returns a node pointer with refcount incremented, use 144 + * of_node_put() on it when done. 145 + */ 146 + struct device_node *of_get_next_child(const struct device_node *node, 147 + struct device_node *prev) 148 + { 149 + struct device_node *next; 150 + 151 + read_lock(&devtree_lock); 152 + next = prev ? prev->sibling : node->child; 153 + for (; next; next = next->sibling) 154 + if (of_node_get(next)) 155 + break; 156 + of_node_put(prev); 157 + read_unlock(&devtree_lock); 158 + return next; 159 + } 160 + EXPORT_SYMBOL(of_get_next_child);