summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/fdt.c24
-rw-r--r--lib/libfdt/fdt_overlay.c14
2 files changed, 31 insertions, 7 deletions
diff --git a/cmd/fdt.c b/cmd/fdt.c
index 0f5923e75a..58af7727ba 100644
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -639,6 +639,27 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
#endif
}
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+ /* apply an overlay */
+ else if (strncmp(argv[1], "ap", 2) == 0) {
+ unsigned long addr;
+ struct fdt_header *blob;
+
+ if (argc != 3)
+ return CMD_RET_USAGE;
+
+ if (!working_fdt)
+ return CMD_RET_FAILURE;
+
+ addr = simple_strtoul(argv[2], NULL, 16);
+ blob = map_sysmem(addr, 0);
+ if (!fdt_valid(&blob))
+ return CMD_RET_FAILURE;
+
+ if (fdt_overlay_apply(working_fdt, blob))
+ return CMD_RET_FAILURE;
+ }
+#endif
/* resize the fdt */
else if (strncmp(argv[1], "re", 2) == 0) {
fdt_shrink_to_minimum(working_fdt);
@@ -1025,6 +1046,9 @@ static int fdt_print(const char *pathp, char *prop, int depth)
#ifdef CONFIG_SYS_LONGHELP
static char fdt_help_text[] =
"addr [-c] <addr> [<length>] - Set the [control] fdt location to <addr>\n"
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+ "fdt apply <addr> - Apply overlay to the DT\n"
+#endif
#ifdef CONFIG_OF_BOARD_SETUP
"fdt boardsetup - Do board-specific set up\n"
#endif
diff --git a/lib/libfdt/fdt_overlay.c b/lib/libfdt/fdt_overlay.c
index c45e8b25fb..1dac8fd483 100644
--- a/lib/libfdt/fdt_overlay.c
+++ b/lib/libfdt/fdt_overlay.c
@@ -142,10 +142,10 @@ static int overlay_update_local_node_references(void *fdto,
adj_val += delta;
adj_val = cpu_to_fdt32(adj_val);
- ret = fdt_setprop_inplace_namelen_by_index(fdto, tree_node,
- name, strlen(name),
- index, &adj_val,
- sizeof(adj_val));
+ ret = fdt_setprop_inplace_namelen_partial(fdto, tree_node,
+ name, strlen(name),
+ index, &adj_val,
+ sizeof(adj_val));
if (ret)
return ret;
}
@@ -220,9 +220,9 @@ static int overlay_fixup_one_phandle(void *fdt, void *fdto,
return fixup_off;
phandle = cpu_to_fdt32(phandle);
- return fdt_setprop_inplace_namelen_by_index(fdto, fixup_off,
- name, name_len, index,
- &phandle, sizeof(phandle));
+ return fdt_setprop_inplace_namelen_partial(fdto, fixup_off,
+ name, name_len, index,
+ &phandle, sizeof(phandle));
};
static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,