OSDN Git Service

Removes OF_UNITTEST dependency on OF_DYNAMIC config symbol
authorGaurav Minocha <gaurav.minocha.os@gmail.com>
Sun, 11 Jan 2015 07:19:51 +0000 (23:19 -0800)
committerRob Herring <robh@kernel.org>
Tue, 13 Jan 2015 19:58:02 +0000 (13:58 -0600)
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>
drivers/of/Kconfig
drivers/of/unittest.c

index b5e0c87..38d1c51 100644 (file)
@@ -10,7 +10,6 @@ menu "Device Tree and Open Firmware support"
 config OF_UNITTEST
        bool "Device Tree runtime unit tests"
        depends on OF_IRQ && OF_EARLY_FLATTREE
-       select OF_DYNAMIC
        select OF_RESOLVE
        help
          This option builds in test cases for the device tree infrastructure
index 844838e..139363a 100644 (file)
@@ -822,6 +822,7 @@ static void update_node_properties(struct device_node *np,
 static int attach_node_and_children(struct device_node *np)
 {
        struct device_node *next, *dup, *child;
+       unsigned long flags;
 
        dup = of_find_node_by_path(np->full_name);
        if (dup) {
@@ -838,8 +839,17 @@ static int attach_node_and_children(struct device_node *np)
 
        child = np->child;
        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) {
                next = child->sibling;
                attach_node_and_children(child);
@@ -911,59 +921,6 @@ static int __init selftest_data_add(void)
        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
 
 static int selftest_probe(struct platform_device *pdev)
@@ -1475,9 +1432,6 @@ static int __init of_selftest(void)
        of_selftest_platform_populate();
        of_selftest_overlay();
 
-       /* removing selftest data from live tree */
-       selftest_data_remove();
-
        /* Double check linkage after removing testcase data */
        of_selftest_check_tree_linkage();