devicetree: Add DT_FOREACH_CHILD_STATUS_OKAY macro
The macro only iterates the enabled child nodes and invokes provided macro for each node. Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
This commit is contained in:
parent
9681034875
commit
0700a24276
5 changed files with 41 additions and 0 deletions
|
@ -51,6 +51,9 @@ node-macro =/ %s"DT_N" path-id %s"_PARENT"
|
||||||
; These are used internally by DT_FOREACH_CHILD, which iterates over
|
; These are used internally by DT_FOREACH_CHILD, which iterates over
|
||||||
; each child node.
|
; each child node.
|
||||||
node-macro =/ %s"DT_N" path-id %s"_FOREACH_CHILD"
|
node-macro =/ %s"DT_N" path-id %s"_FOREACH_CHILD"
|
||||||
|
; These are used internally by DT_FOREACH_CHILD_STATUS_OKAY, which iterates
|
||||||
|
; over each child node with status "okay".
|
||||||
|
node-macro =/ %s"DT_N" path-id %s"_FOREACH_CHILD_STATUS_OKAY"
|
||||||
; The node's status macro; dt-name in this case is something like "okay"
|
; The node's status macro; dt-name in this case is something like "okay"
|
||||||
; or "disabled".
|
; or "disabled".
|
||||||
node-macro =/ %s"DT_N" path-id %s"_STATUS_" dt-name
|
node-macro =/ %s"DT_N" path-id %s"_STATUS_" dt-name
|
||||||
|
|
|
@ -1485,6 +1485,21 @@
|
||||||
#define DT_FOREACH_CHILD(node_id, fn) \
|
#define DT_FOREACH_CHILD(node_id, fn) \
|
||||||
DT_CAT(node_id, _FOREACH_CHILD)(fn)
|
DT_CAT(node_id, _FOREACH_CHILD)(fn)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Call "fn" on the child nodes with status "okay"
|
||||||
|
*
|
||||||
|
* The macro "fn" should take one argument, which is the node
|
||||||
|
* identifier for the child node.
|
||||||
|
*
|
||||||
|
* As usual, both a missing status and an "ok" status are
|
||||||
|
* treated as "okay".
|
||||||
|
*
|
||||||
|
* @param node_id node identifier
|
||||||
|
* @param fn macro to invoke
|
||||||
|
*/
|
||||||
|
#define DT_FOREACH_CHILD_STATUS_OKAY(node_id, fn) \
|
||||||
|
DT_CAT(node_id, _FOREACH_CHILD_STATUS_OKAY)(fn)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Invokes "fn" for each element in the value of property "prop".
|
* @brief Invokes "fn" for each element in the value of property "prop".
|
||||||
*
|
*
|
||||||
|
|
|
@ -119,6 +119,7 @@ def main():
|
||||||
f"DT_{node.parent.z_path_id}")
|
f"DT_{node.parent.z_path_id}")
|
||||||
|
|
||||||
write_child_functions(node)
|
write_child_functions(node)
|
||||||
|
write_child_functions_status_okay(node)
|
||||||
write_dep_info(node)
|
write_dep_info(node)
|
||||||
write_idents_and_existence(node)
|
write_idents_and_existence(node)
|
||||||
write_bus(node)
|
write_bus(node)
|
||||||
|
@ -479,6 +480,18 @@ def write_child_functions(node):
|
||||||
node.children.values()))
|
node.children.values()))
|
||||||
|
|
||||||
|
|
||||||
|
def write_child_functions_status_okay(node):
|
||||||
|
# Writes macro that are helpers that will call a macro/function
|
||||||
|
# for each child node with status "okay".
|
||||||
|
|
||||||
|
functions = ''
|
||||||
|
for child in node.children.values():
|
||||||
|
if child.status == "okay":
|
||||||
|
functions = functions + f"fn(DT_{child.z_path_id}) "
|
||||||
|
|
||||||
|
out_dt_define(f"{node.z_path_id}_FOREACH_CHILD_STATUS_OKAY(fn)", functions)
|
||||||
|
|
||||||
|
|
||||||
def write_status(node):
|
def write_status(node):
|
||||||
out_dt_define(f"{node.z_path_id}_STATUS_{str2ident(node.status)}", 1)
|
out_dt_define(f"{node.z_path_id}_STATUS_{str2ident(node.status)}", 1)
|
||||||
|
|
||||||
|
|
|
@ -386,12 +386,15 @@
|
||||||
|
|
||||||
test_child_a: child-a {
|
test_child_a: child-a {
|
||||||
val = <0>;
|
val = <0>;
|
||||||
|
status = "okay";
|
||||||
};
|
};
|
||||||
test_child_b: child-b {
|
test_child_b: child-b {
|
||||||
val = <1>;
|
val = <1>;
|
||||||
|
status = "okay";
|
||||||
};
|
};
|
||||||
test_child_c: child-c {
|
test_child_c: child-c {
|
||||||
val = <2>;
|
val = <2>;
|
||||||
|
status = "disabled";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1568,8 +1568,13 @@ static void test_child_nodes_list(void)
|
||||||
DT_INST_FOREACH_CHILD(0, TEST_FUNC)
|
DT_INST_FOREACH_CHILD(0, TEST_FUNC)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct vnd_child_binding vals_status_okay[] = {
|
||||||
|
DT_FOREACH_CHILD_STATUS_OKAY(TEST_PARENT, TEST_FUNC)
|
||||||
|
};
|
||||||
|
|
||||||
zassert_equal(ARRAY_SIZE(vals), 3, "");
|
zassert_equal(ARRAY_SIZE(vals), 3, "");
|
||||||
zassert_equal(ARRAY_SIZE(vals_inst), 3, "");
|
zassert_equal(ARRAY_SIZE(vals_inst), 3, "");
|
||||||
|
zassert_equal(ARRAY_SIZE(vals_status_okay), 2, "");
|
||||||
|
|
||||||
zassert_false(strlen(STRINGIFY(TEST_PARENT)) == 0, "");
|
zassert_false(strlen(STRINGIFY(TEST_PARENT)) == 0, "");
|
||||||
|
|
||||||
|
@ -1579,6 +1584,8 @@ static void test_child_nodes_list(void)
|
||||||
zassert_equal(vals_inst[0].val, 0, "");
|
zassert_equal(vals_inst[0].val, 0, "");
|
||||||
zassert_equal(vals_inst[1].val, 1, "");
|
zassert_equal(vals_inst[1].val, 1, "");
|
||||||
zassert_equal(vals_inst[2].val, 2, "");
|
zassert_equal(vals_inst[2].val, 2, "");
|
||||||
|
zassert_equal(vals_status_okay[0].val, 0, "");
|
||||||
|
zassert_equal(vals_status_okay[1].val, 1, "");
|
||||||
|
|
||||||
#undef TEST_PARENT
|
#undef TEST_PARENT
|
||||||
#undef TEST_FUNC
|
#undef TEST_FUNC
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue