]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/sparc/kernel/prom_common.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[mv-sheeva.git] / arch / sparc / kernel / prom_common.c
index d3eddc76763d049fd2a7b1773b37684d43b0897f..ff7b591c8946d1ad5f849f0956e4452037f78e66 100644 (file)
 
 #include "prom.h"
 
+struct device_node *of_console_device;
+EXPORT_SYMBOL(of_console_device);
+
+char *of_console_path;
+EXPORT_SYMBOL(of_console_path);
+
+char *of_console_options;
+EXPORT_SYMBOL(of_console_options);
+
 struct device_node *of_find_node_by_phandle(phandle handle)
 {
        struct device_node *np;
@@ -146,20 +155,12 @@ static struct property * __init build_one_prop(phandle node, char *prev,
                p->value = prom_early_alloc(special_len);
                memcpy(p->value, special_val, special_len);
        } else {
-#ifdef CONFIG_SPARC32
-               if (prev == NULL) {
-                       name = prom_firstprop(node, NULL);
-               } else {
-                       name = prom_nextprop(node, prev, NULL);
-               }
-#else
                if (prev == NULL) {
-                       prom_firstprop(node, p->name);
+                       name = prom_firstprop(node, p->name);
                } else {
-                       prom_nextprop(node, prev, p->name);
+                       name = prom_nextprop(node, prev, p->name);
                }
-               name = p->name;
-#endif
+
                if (strlen(name) == 0) {
                        tmp = p;
                        return NULL;
@@ -216,8 +217,8 @@ static char * __init get_one_property(phandle node, const char *name)
        return buf;
 }
 
-struct device_node * __init create_node(phandle node,
-                                       struct device_node *parent)
+static struct device_node * __init prom_create_node(phandle node,
+                                                   struct device_node *parent)
 {
        struct device_node *dp;
 
@@ -234,9 +235,84 @@ struct device_node * __init create_node(phandle node,
        dp->type = get_one_property(node, "device_type");
        dp->node = node;
 
-       /* Build interrupts later... */
-
        dp->properties = build_prop_list(node);
 
+       irq_trans_init(dp);
+
        return dp;
 }
+
+static char * __init build_full_name(struct device_node *dp)
+{
+       int len, ourlen, plen;
+       char *n;
+
+       plen = strlen(dp->parent->full_name);
+       ourlen = strlen(dp->path_component_name);
+       len = ourlen + plen + 2;
+
+       n = prom_early_alloc(len);
+       strcpy(n, dp->parent->full_name);
+       if (!is_root_node(dp->parent)) {
+               strcpy(n + plen, "/");
+               plen++;
+       }
+       strcpy(n + plen, dp->path_component_name);
+
+       return n;
+}
+
+static struct device_node * __init prom_build_tree(struct device_node *parent,
+                                                  phandle node,
+                                                  struct device_node ***nextp)
+{
+       struct device_node *ret = NULL, *prev_sibling = NULL;
+       struct device_node *dp;
+
+       while (1) {
+               dp = prom_create_node(node, parent);
+               if (!dp)
+                       break;
+
+               if (prev_sibling)
+                       prev_sibling->sibling = dp;
+
+               if (!ret)
+                       ret = dp;
+               prev_sibling = dp;
+
+               *(*nextp) = dp;
+               *nextp = &dp->allnext;
+
+               dp->path_component_name = build_path_component(dp);
+               dp->full_name = build_full_name(dp);
+
+               dp->child = prom_build_tree(dp, prom_getchild(node), nextp);
+
+               node = prom_getsibling(node);
+       }
+
+       return ret;
+}
+
+unsigned int prom_early_allocated __initdata;
+
+void __init prom_build_devicetree(void)
+{
+       struct device_node **nextp;
+
+       allnodes = prom_create_node(prom_root_node, NULL);
+       allnodes->path_component_name = "";
+       allnodes->full_name = "/";
+
+       nextp = &allnodes->allnext;
+       allnodes->child = prom_build_tree(allnodes,
+                                         prom_getchild(allnodes->node),
+                                         &nextp);
+       of_console_init();
+
+       printk("PROM: Built device tree with %u bytes of memory.\n",
+              prom_early_allocated);
+
+       of_fill_in_cpu_data();
+}