Removes OF_UNITTEST dependency on OF_DYNAMIC config symbol
This patch intends to remove the unittests dependency on the functions defined in dynamic.c. So, rather than calling of_attach_node defined in dynamic.c, minimal functionality required to attach a new node is re-defined in unittest.c. Also, now after executing the tests the test data is not removed from the device tree so there is no need to call of_detach_node. Tested with and without OF_DYNAMIC enabled on ppc, arm and x86 Signed-off-by: Gaurav Minocha <gaurav.minocha.os@gmail.com> Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
9a4305bde4
commit
3ce04b4a9f
|
@ -10,7 +10,6 @@ menu "Device Tree and Open Firmware support"
|
||||||
config OF_UNITTEST
|
config OF_UNITTEST
|
||||||
bool "Device Tree runtime unit tests"
|
bool "Device Tree runtime unit tests"
|
||||||
depends on OF_IRQ && OF_EARLY_FLATTREE
|
depends on OF_IRQ && OF_EARLY_FLATTREE
|
||||||
select OF_DYNAMIC
|
|
||||||
select OF_RESOLVE
|
select OF_RESOLVE
|
||||||
help
|
help
|
||||||
This option builds in test cases for the device tree infrastructure
|
This option builds in test cases for the device tree infrastructure
|
||||||
|
|
|
@ -822,6 +822,7 @@ static void update_node_properties(struct device_node *np,
|
||||||
static int attach_node_and_children(struct device_node *np)
|
static int attach_node_and_children(struct device_node *np)
|
||||||
{
|
{
|
||||||
struct device_node *next, *dup, *child;
|
struct device_node *next, *dup, *child;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
dup = of_find_node_by_path(np->full_name);
|
dup = of_find_node_by_path(np->full_name);
|
||||||
if (dup) {
|
if (dup) {
|
||||||
|
@ -838,8 +839,17 @@ static int attach_node_and_children(struct device_node *np)
|
||||||
|
|
||||||
child = np->child;
|
child = np->child;
|
||||||
np->child = NULL;
|
np->child = NULL;
|
||||||
np->sibling = NULL;
|
|
||||||
of_attach_node(np);
|
mutex_lock(&of_mutex);
|
||||||
|
raw_spin_lock_irqsave(&devtree_lock, flags);
|
||||||
|
np->sibling = np->parent->child;
|
||||||
|
np->parent->child = np;
|
||||||
|
of_node_clear_flag(np, OF_DETACHED);
|
||||||
|
raw_spin_unlock_irqrestore(&devtree_lock, flags);
|
||||||
|
|
||||||
|
__of_attach_node_sysfs(np);
|
||||||
|
mutex_unlock(&of_mutex);
|
||||||
|
|
||||||
while (child) {
|
while (child) {
|
||||||
next = child->sibling;
|
next = child->sibling;
|
||||||
attach_node_and_children(child);
|
attach_node_and_children(child);
|
||||||
|
@ -911,59 +921,6 @@ static int __init selftest_data_add(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* detach_node_and_children - detaches node
|
|
||||||
* and its children from live tree
|
|
||||||
*
|
|
||||||
* @np: Node to detach from live tree
|
|
||||||
*/
|
|
||||||
static void detach_node_and_children(struct device_node *np)
|
|
||||||
{
|
|
||||||
while (np->child)
|
|
||||||
detach_node_and_children(np->child);
|
|
||||||
of_detach_node(np);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* selftest_data_remove - removes the selftest data
|
|
||||||
* nodes from the live tree
|
|
||||||
*/
|
|
||||||
static void selftest_data_remove(void)
|
|
||||||
{
|
|
||||||
struct device_node *np;
|
|
||||||
struct property *prop;
|
|
||||||
|
|
||||||
if (selftest_live_tree) {
|
|
||||||
of_node_put(of_aliases);
|
|
||||||
of_node_put(of_chosen);
|
|
||||||
of_aliases = NULL;
|
|
||||||
of_chosen = NULL;
|
|
||||||
for_each_child_of_node(of_root, np)
|
|
||||||
detach_node_and_children(np);
|
|
||||||
__of_detach_node_sysfs(of_root);
|
|
||||||
of_root = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (last_node_index-- > 0) {
|
|
||||||
if (nodes[last_node_index]) {
|
|
||||||
np = of_find_node_by_path(nodes[last_node_index]->full_name);
|
|
||||||
if (np == nodes[last_node_index]) {
|
|
||||||
if (of_aliases == np) {
|
|
||||||
of_node_put(of_aliases);
|
|
||||||
of_aliases = NULL;
|
|
||||||
}
|
|
||||||
detach_node_and_children(np);
|
|
||||||
} else {
|
|
||||||
for_each_property_of_node(np, prop) {
|
|
||||||
if (strcmp(prop->name, "testcase-alias") == 0)
|
|
||||||
of_remove_property(np, prop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_OF_OVERLAY
|
#ifdef CONFIG_OF_OVERLAY
|
||||||
|
|
||||||
static int selftest_probe(struct platform_device *pdev)
|
static int selftest_probe(struct platform_device *pdev)
|
||||||
|
@ -1475,9 +1432,6 @@ static int __init of_selftest(void)
|
||||||
of_selftest_platform_populate();
|
of_selftest_platform_populate();
|
||||||
of_selftest_overlay();
|
of_selftest_overlay();
|
||||||
|
|
||||||
/* removing selftest data from live tree */
|
|
||||||
selftest_data_remove();
|
|
||||||
|
|
||||||
/* Double check linkage after removing testcase data */
|
/* Double check linkage after removing testcase data */
|
||||||
of_selftest_check_tree_linkage();
|
of_selftest_check_tree_linkage();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue