device property: Allow iterating over available child fwnodes
Implement a new helper function fwnode_get_next_available_child_node(), which enables obtaining next enabled child fwnode, which works on a similar basis to OF's of_get_next_available_child(). This commit also introduces a macro, thanks to which it is possible to iterate over the available fwnodes, using the new function described above. Signed-off-by: Marcin Wojtas <mw@semihalf.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
7c6c57f2ab
commit
3395de96ae
@@ -997,6 +997,32 @@ fwnode_get_next_child_node(const struct fwnode_handle *fwnode,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(fwnode_get_next_child_node);
|
EXPORT_SYMBOL_GPL(fwnode_get_next_child_node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fwnode_get_next_available_child_node - Return the next
|
||||||
|
* available child node handle for a node
|
||||||
|
* @fwnode: Firmware node to find the next child node for.
|
||||||
|
* @child: Handle to one of the node's child nodes or a %NULL handle.
|
||||||
|
*/
|
||||||
|
struct fwnode_handle *
|
||||||
|
fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode,
|
||||||
|
struct fwnode_handle *child)
|
||||||
|
{
|
||||||
|
struct fwnode_handle *next_child = child;
|
||||||
|
|
||||||
|
if (!fwnode)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
do {
|
||||||
|
next_child = fwnode_get_next_child_node(fwnode, next_child);
|
||||||
|
|
||||||
|
if (!next_child || fwnode_device_is_available(next_child))
|
||||||
|
break;
|
||||||
|
} while (next_child);
|
||||||
|
|
||||||
|
return next_child;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* device_get_next_child_node - Return the next child node handle for a device
|
* device_get_next_child_node - Return the next child node handle for a device
|
||||||
* @dev: Device to find the next child node for.
|
* @dev: Device to find the next child node for.
|
||||||
|
|||||||
@@ -83,11 +83,17 @@ struct fwnode_handle *fwnode_get_next_parent(
|
|||||||
struct fwnode_handle *fwnode);
|
struct fwnode_handle *fwnode);
|
||||||
struct fwnode_handle *fwnode_get_next_child_node(
|
struct fwnode_handle *fwnode_get_next_child_node(
|
||||||
const struct fwnode_handle *fwnode, struct fwnode_handle *child);
|
const struct fwnode_handle *fwnode, struct fwnode_handle *child);
|
||||||
|
struct fwnode_handle *fwnode_get_next_available_child_node(
|
||||||
|
const struct fwnode_handle *fwnode, struct fwnode_handle *child);
|
||||||
|
|
||||||
#define fwnode_for_each_child_node(fwnode, child) \
|
#define fwnode_for_each_child_node(fwnode, child) \
|
||||||
for (child = fwnode_get_next_child_node(fwnode, NULL); child; \
|
for (child = fwnode_get_next_child_node(fwnode, NULL); child; \
|
||||||
child = fwnode_get_next_child_node(fwnode, child))
|
child = fwnode_get_next_child_node(fwnode, child))
|
||||||
|
|
||||||
|
#define fwnode_for_each_available_child_node(fwnode, child) \
|
||||||
|
for (child = 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(
|
struct fwnode_handle *device_get_next_child_node(
|
||||||
struct device *dev, struct fwnode_handle *child);
|
struct device *dev, struct fwnode_handle *child);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user