mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
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: Alan Tull <atull@kernel.org> Signed-off-by: Frank Rowand <frank.rowand@sony.com>
This commit is contained in:
parent
f962788101
commit
5babefb7f7
1 changed files with 35 additions and 8 deletions
|
@ -1071,20 +1071,44 @@ static void __init of_unittest_platform_populate(void)
|
|||
* of np into dup node (present in live tree) and
|
||||
* 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
|
||||
*/
|
||||
static void update_node_properties(struct device_node *np,
|
||||
struct device_node *dup)
|
||||
{
|
||||
struct property *prop;
|
||||
struct property *save_next;
|
||||
struct device_node *child;
|
||||
|
||||
for_each_property_of_node(np, prop)
|
||||
of_add_property(dup, prop);
|
||||
int ret;
|
||||
|
||||
for_each_child_of_node(np, child)
|
||||
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,
|
|||
*
|
||||
* @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;
|
||||
unsigned long flags;
|
||||
const char *full_name;
|
||||
|
||||
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);
|
||||
kfree(full_name);
|
||||
if (dup) {
|
||||
update_node_properties(np, dup);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
child = np->child;
|
||||
|
@ -1125,8 +1154,6 @@ static int attach_node_and_children(struct device_node *np)
|
|||
attach_node_and_children(child);
|
||||
child = next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue