return fdt_setprop_u32(fdt, nodeoffset, name, (uint32_t)val);
}
+int fdt_root(void *fdt)
+{
+ char *serial;
+ int err;
+
+ err = fdt_check_header(fdt);
+ if (err < 0) {
+ printf("fdt_root: %s\n", fdt_strerror(err));
+ return err;
+ }
+
+ serial = getenv("serial#");
+ if (serial) {
+ err = fdt_setprop(fdt, 0, "serial-number", serial,
+ strlen(serial) + 1);
+
+ if (err < 0) {
+ printf("WARNING: could not set serial-number %s.\n",
+ fdt_strerror(err));
+ return err;
+ }
+ }
+
+ return 0;
+}
int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end)
{
return err;
}
+ if (!banks)
+ return 0;
+
len = fdt_pack_reg(blob, tmp, start, size, banks);
err = fdt_setprop(blob, nodeoffset, "reg", tmp, len);
ret = fdt_add_mem_rsv(blob, (uintptr_t)blob, actualsize);
if (ret < 0)
return ret;
-
+ if (getenv("fdtsize"))
+ setenv_hex("fdtsize", actualsize);
return actualsize;
}
unsigned int r1;
};
-int fdt_del_subnodes(const void *blob, int parent_offset)
+static int fdt_del_subnodes(const void *blob, int parent_offset)
{
int off, ndepth;
int ret;
for (ndepth = 0, off = fdt_next_node(blob, parent_offset, &ndepth);
(off >= 0) && (ndepth > 0);
off = fdt_next_node(blob, off, &ndepth)) {
- if (ndepth == 1) {
- debug("delete %s: offset: %x\n",
- fdt_get_name(blob, off, 0), off);
- ret = fdt_del_node((void *)blob, off);
- if (ret < 0) {
- printf("Can't delete node: %s\n",
- fdt_strerror(ret));
- return ret;
- } else {
- ndepth = 0;
- off = parent_offset;
- }
+ if (ndepth < 0)
+ break;
+ else if (ndepth != 1)
+ continue;
+ else if (fdt_getprop(blob, off, "compatible", NULL))
+ continue;
+ debug("delete %s: offset: %x\n",
+ fdt_get_name(blob, off, 0), off);
+ ret = fdt_del_node((void *)blob, off);
+ if (ret < 0) {
+ printf("Can't delete node: %s\n",
+ fdt_strerror(ret));
+ return ret;
+ } else {
+ ndepth = 0;
+ off = parent_offset;
}
}
return 0;
{
const void *prop;
int ndepth = 0;
- int off;
+ int off = parent_offset;
int ret;
- off = fdt_next_node(blob, parent_offset, &ndepth);
- if (off > 0 && ndepth == 1) {
+ while ((off = fdt_next_node(blob, off, &ndepth)) > 0) {
+ if (ndepth < 0)
+ break;
+ else if (ndepth != 1)
+ continue;
+ else if (fdt_getprop(blob, off, "compatible", NULL))
+ continue;
prop = fdt_getprop(blob, off, "label", NULL);
if (prop == NULL) {
/*
struct list_head *pentry;
struct part_info *part;
struct reg_cell cell;
- int off, ndepth = 0;
+ int off = parent_offset, ndepth = 0;
int part_num, ret;
char buf[64];
* Check if it is nand {}; subnode, adjust
* the offset in this case
*/
- off = fdt_next_node(blob, parent_offset, &ndepth);
- if (off > 0 && ndepth == 1)
+ while ((off = fdt_next_node(blob, off, &ndepth)) > 0) {
+ if (ndepth < 0)
+ break;
+ else if (ndepth != 1)
+ continue;
+ else if (fdt_getprop(blob, off, "compatible", NULL))
+ continue;
parent_offset = off;
-
+ break;
+ }
part_num = 0;
list_for_each_prev(pentry, &dev->parts) {
int newoff;
goto bail;
bus = &of_busses[0];
- /* Cound address cells & copy address locally */
+ /* Count address cells & copy address locally */
bus->count_cells(blob, parent, &na, &ns);
if (!OF_CHECK_COUNTS(na, ns)) {
printf("%s: Bad cell count for %s\n", __FUNCTION__,
if (ret < 0)
return ret;
- snprintf(name, sizeof(name), "framebuffer@%llx", base_address);
+ snprintf(name, sizeof(name), "framebuffer@%" PRIx64, base_address);
ret = fdt_set_name(fdt, node, name);
if (ret < 0)
return ret;
return 0;
}
+
+/*
+ * Update native-mode in display-timings from display environment variable.
+ * The node to update are specified by path.
+ */
+int fdt_fixup_display(void *blob, const char *path, const char *display)
+{
+ int off, toff;
+
+ if (!display || !path)
+ return -FDT_ERR_NOTFOUND;
+
+ toff = fdt_path_offset(blob, path);
+ if (toff >= 0)
+ toff = fdt_subnode_offset(blob, toff, "display-timings");
+ if (toff < 0)
+ return toff;
+
+ for (off = fdt_first_subnode(blob, toff);
+ off >= 0;
+ off = fdt_next_subnode(blob, off)) {
+ uint32_t h = fdt_get_phandle(blob, off);
+ debug("%s:0x%x\n", fdt_get_name(blob, off, NULL),
+ fdt32_to_cpu(h));
+ if (strcasecmp(fdt_get_name(blob, off, NULL), display) == 0)
+ return fdt_setprop_u32(blob, toff, "native-mode", h);
+ }
+ return toff;
+}