diff options
Diffstat (limited to 'common/memory.c')
-rw-r--r-- | common/memory.c | 70 |
1 files changed, 18 insertions, 52 deletions
diff --git a/common/memory.c b/common/memory.c index 81641f0527..7ec211b8da 100644 --- a/common/memory.c +++ b/common/memory.c @@ -21,7 +21,6 @@ #include <memory.h> #include <of.h> #include <init.h> -#include <libfdt.h> #include <linux/ioport.h> #include <asm-generic/memory_layout.h> #include <asm/sections.h> @@ -164,71 +163,38 @@ 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) -{ - int shift = (size - 1) * 8; - - while (size-- > 0) { - *addr++ = (val >> shift) & 0xff; - shift -= 8; - } -} - -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); + size_cell_len = of_n_size_cells(memnode); for_each_memory_bank(bank) { - write_cell(tmp + len, bank->start, addr_cell_len); - len += addr_cell_len; - write_cell(tmp + len, bank->size, size_cell_len); - len += size_cell_len; + of_write_number(tmp + len, bank->start, addr_cell_len); + len += addr_cell_len * 4; + of_write_number(tmp + len, bank->size, size_cell_len); + len += size_cell_len * 4; } - 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; } |