summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-02-21 00:21:29 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-03-06 11:41:29 +0100
commit9d8e08353cf8628d41335b9c5910bd352ef75f4d (patch)
tree75b534f7a701420c3ae112b22d7e58fe35d8c76d /common
parentcf95711e5201b04e32be8f9122200308638279e9 (diff)
downloadbarebox-9d8e08353cf8628d41335b9c5910bd352ef75f4d.tar.gz
barebox-9d8e08353cf8628d41335b9c5910bd352ef75f4d.tar.xz
of: fixup unflattened devicetree
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r--common/memory.c48
-rw-r--r--common/oftree.c70
2 files changed, 36 insertions, 82 deletions
diff --git a/common/memory.c b/common/memory.c
index 81641f0527..1d2e3a322c 100644
--- a/common/memory.c
+++ b/common/memory.c
@@ -165,22 +165,6 @@ int release_sdram_region(struct resource *res)
#ifdef CONFIG_OFTREE
/*
- * Get cells len in bytes
- * if #NNNN-cells property is 2 then len is 8
- * otherwise len is 4
- */
-static int get_cells_len(struct fdt_header *fdt, char *nr_cells_name)
-{
- const u32 *cell;
-
- cell = fdt_getprop(fdt, 0, nr_cells_name, NULL);
- if (cell && *cell == 2)
- return 8;
-
- return 4;
-}
-
-/*
* Write a 4 or 8 byte big endian cell
*/
static void write_cell(u8 *addr, u64 val, int size)
@@ -193,28 +177,24 @@ static void write_cell(u8 *addr, u64 val, int size)
}
}
-static int of_memory_fixup(struct fdt_header *fdt)
+static int of_memory_fixup(struct device_node *node)
{
struct memory_bank *bank;
- int err, nodeoffset;
+ int err;
int addr_cell_len, size_cell_len, len = 0;
+ struct device_node *memnode;
u8 tmp[16 * 16]; /* Up to 64-bit address + 64-bit size */
- /* update, or add and update /memory node */
- nodeoffset = fdt_get_path_or_create(fdt, "/memory");
- if (nodeoffset < 0)
- return nodeoffset;
+ memnode = of_create_node(node, "/memory");
+ if (!memnode)
+ return -ENOMEM;
- err = fdt_setprop(fdt, nodeoffset, "device_type", "memory",
- sizeof("memory"));
- if (err < 0) {
- printf("WARNING: could not set %s %s.\n", "device_type",
- fdt_strerror(err));
+ err = of_set_property(memnode, "device_type", "memory", sizeof("memory"), 1);
+ if (err)
return err;
- }
- addr_cell_len = get_cells_len(fdt, "#address-cells");
- size_cell_len = get_cells_len(fdt, "#size-cells");
+ addr_cell_len = of_n_addr_cells(memnode) * 4;
+ size_cell_len = of_n_size_cells(memnode) * 4;
for_each_memory_bank(bank) {
write_cell(tmp + len, bank->start, addr_cell_len);
@@ -223,12 +203,12 @@ static int of_memory_fixup(struct fdt_header *fdt)
len += size_cell_len;
}
- err = fdt_setprop(fdt, nodeoffset, "reg", tmp, len);
- if (err < 0) {
- printf("WARNING: could not set %s %s.\n",
- "reg", fdt_strerror(err));
+ err = of_set_property(memnode, "reg", tmp, len, 1);
+ if (err) {
+ pr_err("could not set reg %s.\n", strerror(-err));
return err;
}
+
return 0;
}
diff --git a/common/oftree.c b/common/oftree.c
index be9eb28b63..44ffadec3f 100644
--- a/common/oftree.c
+++ b/common/oftree.c
@@ -339,26 +339,24 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
return 0;
}
-static int of_fixup_bootargs(struct fdt_header *fdt)
+static int of_fixup_bootargs(struct device_node *root)
{
- int nodeoffset;
+ struct device_node *node;
const char *str;
int err;
- nodeoffset = fdt_get_path_or_create(fdt, "/chosen");
- if (nodeoffset < 0)
- return nodeoffset;
-
str = linux_bootargs_get();
- if (str) {
- err = fdt_setprop(fdt, nodeoffset,
- "bootargs", str, strlen(str)+1);
- if (err < 0)
- printf("WARNING: could not set bootargs %s.\n",
- fdt_strerror(err));
- }
+ if (!str)
+ return 0;
- return 0;
+ node = of_create_node(root, "/chosen");
+ if (!node)
+ return -ENOMEM;
+
+
+ err = of_set_property(node, "bootargs", str, strlen(str) + 1, 1);
+
+ return err;
}
static int of_register_bootargs_fixup(void)
@@ -368,13 +366,13 @@ static int of_register_bootargs_fixup(void)
late_initcall(of_register_bootargs_fixup);
struct of_fixup {
- int (*fixup)(struct fdt_header *);
+ int (*fixup)(struct device_node *);
struct list_head list;
};
static LIST_HEAD(of_fixup_list);
-int of_register_fixup(int (*fixup)(struct fdt_header *))
+int of_register_fixup(int (*fixup)(struct device_node *))
{
struct of_fixup *of_fixup = xzalloc(sizeof(*of_fixup));
@@ -389,13 +387,13 @@ int of_register_fixup(int (*fixup)(struct fdt_header *))
* Apply registered fixups for the given fdt. The fdt must have
* enough free space to apply the fixups.
*/
-int of_fix_tree(struct fdt_header *fdt)
+int of_fix_tree(struct device_node *node)
{
struct of_fixup *of_fixup;
int ret;
list_for_each_entry(of_fixup, &of_fixup_list, list) {
- ret = of_fixup->fixup(fdt);
+ ret = of_fixup->fixup(node);
if (ret)
return ret;
}
@@ -418,8 +416,6 @@ int of_fix_tree(struct fdt_header *fdt)
struct fdt_header *of_get_fixed_tree(struct device_node *node)
{
int ret;
- void *fixfdt, *internalfdt = NULL;
- int size, align;
struct fdt_header *fdt;
if (!node) {
@@ -428,35 +424,13 @@ struct fdt_header *of_get_fixed_tree(struct device_node *node)
return NULL;
}
- fdt = internalfdt = of_flatten_dtb(node);
- if (!fdt)
- return NULL;
-
- size = fdt_totalsize(fdt);
-
- /*
- * ARM Linux uses a single 1MiB section (with 1MiB alignment)
- * for mapping the devicetree, so we are not allowed to cross
- * 1MiB boundaries.
- */
- align = 1 << fls(size + OFTREE_SIZE_INCREASE - 1);
-
- fixfdt = xmemalign(align, size + OFTREE_SIZE_INCREASE);
- ret = fdt_open_into(fdt, fixfdt, size + OFTREE_SIZE_INCREASE);
-
- free(internalfdt);
-
+ ret = of_fix_tree(node);
if (ret)
- goto out_free;
-
- ret = of_fix_tree(fixfdt);
- if (ret)
- goto out_free;
-
- return fixfdt;
+ return NULL;
-out_free:
- free(fixfdt);
+ fdt = of_flatten_dtb(node);
+ if (!fdt)
+ return NULL;
- return NULL;
+ return fdt;
}