Commit 5babefb7 authored by Frank Rowand's avatar Frank Rowand

of: unittest: allow base devicetree to have symbol metadata

The overlay metadata nodes in the FDT created from testcases.dts
are not handled properly.

The __fixups__ and __local_fixups__ node were added to the live
devicetree, but should not be.

Only the first property in the /__symbols__ node was added to the
live devicetree if the live devicetree already contained a
/__symbols node.  All of the node's properties must be added.
Tested-by: default avatarAlan Tull <atull@kernel.org>
Signed-off-by: default avatarFrank Rowand <frank.rowand@sony.com>
parent f9627881
...@@ -1071,20 +1071,44 @@ static void __init of_unittest_platform_populate(void) ...@@ -1071,20 +1071,44 @@ static void __init of_unittest_platform_populate(void)
* of np into dup node (present in live tree) and * of np into dup node (present in live tree) and
* updates parent of children of np to dup. * updates parent of children of np to dup.
* *
* @np: node already present in live tree * @np: node whose properties are being added to the live tree
* @dup: node present in live tree to be updated * @dup: node present in live tree to be updated
*/ */
static void update_node_properties(struct device_node *np, static void update_node_properties(struct device_node *np,
struct device_node *dup) struct device_node *dup)
{ {
struct property *prop; struct property *prop;
struct property *save_next;
struct device_node *child; struct device_node *child;
int ret;
for_each_property_of_node(np, prop)
of_add_property(dup, prop);
for_each_child_of_node(np, child) for_each_child_of_node(np, child)
child->parent = dup; child->parent = dup;
/*
* "unittest internal error: unable to add testdata property"
*
* If this message reports a property in node '/__symbols__' then
* the respective unittest overlay contains a label that has the
* same name as a label in the live devicetree. The label will
* be in the live devicetree only if the devicetree source was
* compiled with the '-@' option. If you encounter this error,
* please consider renaming __all__ of the labels in the unittest
* overlay dts files with an odd prefix that is unlikely to be
* used in a real devicetree.
*/
/*
* open code for_each_property_of_node() because of_add_property()
* sets prop->next to NULL
*/
for (prop = np->properties; prop != NULL; prop = save_next) {
save_next = prop->next;
ret = of_add_property(dup, prop);
if (ret)
pr_err("unittest internal error: unable to add testdata property %pOF/%s",
np, prop->name);
}
} }
/** /**
...@@ -1093,18 +1117,23 @@ static void update_node_properties(struct device_node *np, ...@@ -1093,18 +1117,23 @@ static void update_node_properties(struct device_node *np,
* *
* @np: Node to attach to live tree * @np: Node to attach to live tree
*/ */
static int attach_node_and_children(struct device_node *np) static void attach_node_and_children(struct device_node *np)
{ {
struct device_node *next, *dup, *child; struct device_node *next, *dup, *child;
unsigned long flags; unsigned long flags;
const char *full_name; const char *full_name;
full_name = kasprintf(GFP_KERNEL, "%pOF", np); full_name = kasprintf(GFP_KERNEL, "%pOF", np);
if (!strcmp(full_name, "/__local_fixups__") ||
!strcmp(full_name, "/__fixups__"))
return;
dup = of_find_node_by_path(full_name); dup = of_find_node_by_path(full_name);
kfree(full_name); kfree(full_name);
if (dup) { if (dup) {
update_node_properties(np, dup); update_node_properties(np, dup);
return 0; return;
} }
child = np->child; child = np->child;
...@@ -1125,8 +1154,6 @@ static int attach_node_and_children(struct device_node *np) ...@@ -1125,8 +1154,6 @@ static int attach_node_and_children(struct device_node *np)
attach_node_and_children(child); attach_node_and_children(child);
child = next; child = next;
} }
return 0;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment