提交 3cfc535c 编写于 作者: A Andres Salomon 提交者: Grant Likely

of/promtree: make drivers/of/pdt.c no longer sparc-only

Clean up pdt.c:
 - make build dependent upon config OF_PROMTREE
 - #ifdef out the sparc-specific stuff
 - create pdt-specific header
Signed-off-by: NAndres Salomon <dilinger@queued.net>
Acked-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NGrant Likely <grant.likely@secretlab.ca>
上级 9bdf6bab
...@@ -19,6 +19,7 @@ config SPARC ...@@ -19,6 +19,7 @@ config SPARC
bool bool
default y default y
select OF select OF
select OF_PROMTREE
select HAVE_IDE select HAVE_IDE
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_ARCH_KGDB if !SMP || SPARC64 select HAVE_ARCH_KGDB if !SMP || SPARC64
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/of_pdt.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/atomic.h> #include <asm/atomic.h>
...@@ -67,8 +68,8 @@ extern struct device_node *of_console_device; ...@@ -67,8 +68,8 @@ extern struct device_node *of_console_device;
extern char *of_console_path; extern char *of_console_path;
extern char *of_console_options; extern char *of_console_options;
extern void (*prom_build_more)(struct device_node *dp, struct device_node ***nextp); extern void irq_trans_init(struct device_node *dp);
extern char *build_full_name(struct device_node *dp); extern char *build_path_component(struct device_node *dp);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _SPARC_PROM_H */ #endif /* _SPARC_PROM_H */
...@@ -4,12 +4,6 @@ ...@@ -4,12 +4,6 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/prom.h> #include <asm/prom.h>
extern void * prom_early_alloc(unsigned long size);
extern void irq_trans_init(struct device_node *dp);
extern unsigned int prom_unique_id;
extern char *build_path_component(struct device_node *dp);
extern void of_console_init(void); extern void of_console_init(void);
extern unsigned int prom_early_allocated; extern unsigned int prom_early_allocated;
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_pdt.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/leon.h> #include <asm/leon.h>
...@@ -119,4 +120,11 @@ EXPORT_SYMBOL(of_find_in_proplist); ...@@ -119,4 +120,11 @@ EXPORT_SYMBOL(of_find_in_proplist);
unsigned int prom_early_allocated __initdata; unsigned int prom_early_allocated __initdata;
#include "../../../drivers/of/pdt.c" void __init prom_build_devicetree(void)
{
of_pdt_build_devicetree(prom_root_node);
of_console_init();
pr_info("PROM: Built device tree with %u bytes of memory.\n",
prom_early_allocated);
}
...@@ -4,7 +4,7 @@ config DTC ...@@ -4,7 +4,7 @@ config DTC
config OF config OF
bool bool
menu "Flattened Device Tree and Open Firmware support" menu "Device Tree and Open Firmware support"
depends on OF depends on OF
config PROC_DEVICETREE config PROC_DEVICETREE
...@@ -19,6 +19,9 @@ config OF_FLATTREE ...@@ -19,6 +19,9 @@ config OF_FLATTREE
bool bool
select DTC select DTC
config OF_PROMTREE
bool
config OF_DYNAMIC config OF_DYNAMIC
def_bool y def_bool y
depends on PPC_OF depends on PPC_OF
......
obj-y = base.o obj-y = base.o
obj-$(CONFIG_OF_FLATTREE) += fdt.o obj-$(CONFIG_OF_FLATTREE) += fdt.o
obj-$(CONFIG_OF_PROMTREE) += pdt.o
obj-$(CONFIG_OF_ADDRESS) += address.o obj-$(CONFIG_OF_ADDRESS) += address.o
obj-$(CONFIG_OF_IRQ) += irq.o obj-$(CONFIG_OF_IRQ) += irq.o
obj-$(CONFIG_OF_DEVICE) += device.o platform.o obj-$(CONFIG_OF_DEVICE) += device.o platform.o
......
/* prom_common.c: OF device tree support common code. /* pdt.c: OF PROM device tree support code.
* *
* Paul Mackerras August 1996. * Paul Mackerras August 1996.
* Copyright (C) 1996-2005 Paul Mackerras. * Copyright (C) 1996-2005 Paul Mackerras.
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* {engebret|bergner}@us.ibm.com * {engebret|bergner}@us.ibm.com
* *
* Adapted for sparc by David S. Miller davem@davemloft.net * Adapted for sparc by David S. Miller davem@davemloft.net
* Adapted for multiple architectures by Andres Salomon <dilinger@queued.net>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -20,13 +21,36 @@ ...@@ -20,13 +21,36 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_pdt.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/leon.h>
void (*prom_build_more)(struct device_node *dp, struct device_node ***nextp); void __initdata (*prom_build_more)(struct device_node *dp,
struct device_node ***nextp);
unsigned int prom_unique_id; #if defined(CONFIG_SPARC)
unsigned int of_pdt_unique_id __initdata;
#define of_pdt_incr_unique_id(p) do { \
(p)->unique_id = of_pdt_unique_id++; \
} while (0)
static inline const char *of_pdt_node_name(struct device_node *dp)
{
return dp->path_component_name;
}
#else
static inline void of_pdt_incr_unique_id(void *p) { }
static inline void irq_trans_init(struct device_node *dp) { }
static inline const char *of_pdt_node_name(struct device_node *dp)
{
return dp->name;
}
#endif /* !CONFIG_SPARC */
static struct property * __init build_one_prop(phandle node, char *prev, static struct property * __init build_one_prop(phandle node, char *prev,
char *special_name, char *special_name,
...@@ -43,7 +67,7 @@ static struct property * __init build_one_prop(phandle node, char *prev, ...@@ -43,7 +67,7 @@ static struct property * __init build_one_prop(phandle node, char *prev,
tmp = NULL; tmp = NULL;
} else { } else {
p = prom_early_alloc(sizeof(struct property) + 32); p = prom_early_alloc(sizeof(struct property) + 32);
p->unique_id = prom_unique_id++; of_pdt_incr_unique_id(p);
} }
p->name = (char *) (p + 1); p->name = (char *) (p + 1);
...@@ -124,7 +148,7 @@ static struct device_node * __init prom_create_node(phandle node, ...@@ -124,7 +148,7 @@ static struct device_node * __init prom_create_node(phandle node,
return NULL; return NULL;
dp = prom_early_alloc(sizeof(*dp)); dp = prom_early_alloc(sizeof(*dp));
dp->unique_id = prom_unique_id++; of_pdt_incr_unique_id(dp);
dp->parent = parent; dp->parent = parent;
kref_init(&dp->kref); kref_init(&dp->kref);
...@@ -140,13 +164,13 @@ static struct device_node * __init prom_create_node(phandle node, ...@@ -140,13 +164,13 @@ static struct device_node * __init prom_create_node(phandle node,
return dp; return dp;
} }
char * __init build_full_name(struct device_node *dp) static char * __init build_full_name(struct device_node *dp)
{ {
int len, ourlen, plen; int len, ourlen, plen;
char *n; char *n;
plen = strlen(dp->parent->full_name); plen = strlen(dp->parent->full_name);
ourlen = strlen(dp->path_component_name); ourlen = strlen(of_pdt_node_name(dp));
len = ourlen + plen + 2; len = ourlen + plen + 2;
n = prom_early_alloc(len); n = prom_early_alloc(len);
...@@ -155,7 +179,7 @@ char * __init build_full_name(struct device_node *dp) ...@@ -155,7 +179,7 @@ char * __init build_full_name(struct device_node *dp)
strcpy(n + plen, "/"); strcpy(n + plen, "/");
plen++; plen++;
} }
strcpy(n + plen, dp->path_component_name); strcpy(n + plen, of_pdt_node_name(dp));
return n; return n;
} }
...@@ -182,7 +206,9 @@ static struct device_node * __init prom_build_tree(struct device_node *parent, ...@@ -182,7 +206,9 @@ static struct device_node * __init prom_build_tree(struct device_node *parent,
*(*nextp) = dp; *(*nextp) = dp;
*nextp = &dp->allnext; *nextp = &dp->allnext;
#if defined(CONFIG_SPARC)
dp->path_component_name = build_path_component(dp); dp->path_component_name = build_path_component(dp);
#endif
dp->full_name = build_full_name(dp); dp->full_name = build_full_name(dp);
dp->child = prom_build_tree(dp, prom_getchild(node), nextp); dp->child = prom_build_tree(dp, prom_getchild(node), nextp);
...@@ -196,20 +222,18 @@ static struct device_node * __init prom_build_tree(struct device_node *parent, ...@@ -196,20 +222,18 @@ static struct device_node * __init prom_build_tree(struct device_node *parent,
return ret; return ret;
} }
void __init prom_build_devicetree(void) void __init of_pdt_build_devicetree(phandle root_node)
{ {
struct device_node **nextp; struct device_node **nextp;
allnodes = prom_create_node(prom_root_node, NULL); allnodes = prom_create_node(root_node, NULL);
#if defined(CONFIG_SPARC)
allnodes->path_component_name = ""; allnodes->path_component_name = "";
#endif
allnodes->full_name = "/"; allnodes->full_name = "/";
nextp = &allnodes->allnext; nextp = &allnodes->allnext;
allnodes->child = prom_build_tree(allnodes, allnodes->child = prom_build_tree(allnodes,
prom_getchild(allnodes->phandle), prom_getchild(allnodes->phandle),
&nextp); &nextp);
of_console_init();
printk("PROM: Built device tree with %u bytes of memory.\n",
prom_early_allocated);
} }
/*
* Definitions for building a device tree by calling into the
* Open Firmware PROM.
*
* Copyright (C) 2010 Andres Salomon <dilinger@queued.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef _LINUX_OF_PDT_H
#define _LINUX_OF_PDT_H
extern void *prom_early_alloc(unsigned long size);
/* for building the device tree */
extern void of_pdt_build_devicetree(phandle root_node);
extern void (*prom_build_more)(struct device_node *dp,
struct device_node ***nextp);
#endif /* _LINUX_OF_PDT_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册