dt: introduce for_each_available_child_of_node, of_get_next_available_child
Macro for_each_child_of_node() makes it easy to iterate over all of the children for a given device tree node, including those nodes that are marked as unavailable (i.e. status = "disabled"). Introduce for_each_available_child_of_node(), which is like for_each_child_of_node(), but it automatically skips unavailable nodes. This also requires the introduction of helper function of_get_next_available_child(), which returns the next available child node. Signed-off-by: Timur Tabi <timur@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								476ad154f3
							
						
					
				
			
			
				commit
				
					
						3296193d14
					
				
			
		
					 2 changed files with 34 additions and 0 deletions
				
			
		| 
						 | 
					@ -363,6 +363,33 @@ struct device_node *of_get_next_child(const struct device_node *node,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(of_get_next_child);
 | 
					EXPORT_SYMBOL(of_get_next_child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *	of_get_next_available_child - Find the next available child node
 | 
				
			||||||
 | 
					 *	@node:	parent node
 | 
				
			||||||
 | 
					 *	@prev:	previous child of the parent node, or NULL to get first
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *      This function is like of_get_next_child(), except that it
 | 
				
			||||||
 | 
					 *      automatically skips any disabled nodes (i.e. status = "disabled").
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct device_node *of_get_next_available_child(const struct device_node *node,
 | 
				
			||||||
 | 
						struct device_node *prev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct device_node *next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						read_lock(&devtree_lock);
 | 
				
			||||||
 | 
						next = prev ? prev->sibling : node->child;
 | 
				
			||||||
 | 
						for (; next; next = next->sibling) {
 | 
				
			||||||
 | 
							if (!of_device_is_available(next))
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							if (of_node_get(next))
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						of_node_put(prev);
 | 
				
			||||||
 | 
						read_unlock(&devtree_lock);
 | 
				
			||||||
 | 
						return next;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(of_get_next_available_child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 *	of_find_node_by_path - Find a node matching a full OF path
 | 
					 *	of_find_node_by_path - Find a node matching a full OF path
 | 
				
			||||||
 *	@path:	The full path to match
 | 
					 *	@path:	The full path to match
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,10 +190,17 @@ extern struct device_node *of_get_parent(const struct device_node *node);
 | 
				
			||||||
extern struct device_node *of_get_next_parent(struct device_node *node);
 | 
					extern struct device_node *of_get_next_parent(struct device_node *node);
 | 
				
			||||||
extern struct device_node *of_get_next_child(const struct device_node *node,
 | 
					extern struct device_node *of_get_next_child(const struct device_node *node,
 | 
				
			||||||
					     struct device_node *prev);
 | 
										     struct device_node *prev);
 | 
				
			||||||
 | 
					extern struct device_node *of_get_next_available_child(
 | 
				
			||||||
 | 
						const struct device_node *node, struct device_node *prev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define for_each_child_of_node(parent, child) \
 | 
					#define for_each_child_of_node(parent, child) \
 | 
				
			||||||
	for (child = of_get_next_child(parent, NULL); child != NULL; \
 | 
						for (child = of_get_next_child(parent, NULL); child != NULL; \
 | 
				
			||||||
	     child = of_get_next_child(parent, child))
 | 
						     child = of_get_next_child(parent, child))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define for_each_available_child_of_node(parent, child) \
 | 
				
			||||||
 | 
						for (child = of_get_next_available_child(parent, NULL); child != NULL; \
 | 
				
			||||||
 | 
						     child = of_get_next_available_child(parent, child))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int of_get_child_count(const struct device_node *np)
 | 
					static inline int of_get_child_count(const struct device_node *np)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct device_node *child;
 | 
						struct device_node *child;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue