[POWERPC] Add of_get_next_parent()
Iterating through a device node's parents is simple enough, but dealing with the refcounts properly is a little ugly, and replicating that logic is asking for someone to get it wrong or forget it all together, eg: while (dn != NULL) { /* loop body */ tmp = of_get_parent(dn); of_node_put(dn); dn = tmp; } So add of_get_next_parent(), inspired by of_get_next_child(). The contract is that it returns the parent and drops the reference on the current node, this makes the loop look like: while (dn != NULL) { /* loop body */ dn = of_get_next_parent(dn); } Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
58119068cb
Коммит
f4eb010706
|
@ -137,6 +137,31 @@ struct device_node *of_get_parent(const struct device_node *node)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(of_get_parent);
|
EXPORT_SYMBOL(of_get_parent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* of_get_next_parent - Iterate to a node's parent
|
||||||
|
* @node: Node to get parent of
|
||||||
|
*
|
||||||
|
* This is like of_get_parent() except that it drops the
|
||||||
|
* refcount on the passed node, making it suitable for iterating
|
||||||
|
* through a node's parents.
|
||||||
|
*
|
||||||
|
* Returns a node pointer with refcount incremented, use
|
||||||
|
* of_node_put() on it when done.
|
||||||
|
*/
|
||||||
|
struct device_node *of_get_next_parent(struct device_node *node)
|
||||||
|
{
|
||||||
|
struct device_node *parent;
|
||||||
|
|
||||||
|
if (!node)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
read_lock(&devtree_lock);
|
||||||
|
parent = of_node_get(node->parent);
|
||||||
|
of_node_put(node);
|
||||||
|
read_unlock(&devtree_lock);
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* of_get_next_child - Iterate a node childs
|
* of_get_next_child - Iterate a node childs
|
||||||
* @node: parent node
|
* @node: parent node
|
||||||
|
|
|
@ -50,6 +50,7 @@ extern struct device_node *of_find_matching_node(struct device_node *from,
|
||||||
extern struct device_node *of_find_node_by_path(const char *path);
|
extern struct device_node *of_find_node_by_path(const char *path);
|
||||||
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
||||||
extern struct device_node *of_get_parent(const struct device_node *node);
|
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_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);
|
||||||
#define for_each_child_of_node(parent, child) \
|
#define for_each_child_of_node(parent, child) \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче