From e118761c5f7e8e41fa3503ae96885459869dcb84 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 9 Jan 2013 13:14:45 +0100 Subject: oftree command: refactor This has several improvements for the oftree command: - loading a devicetree (-l) and actually probing (-p) it now is separated - the command now can dump the internal devicetree or a dtb given on the command line. - The -f option now actually frees the internal devicetree With this the usage pattern for this command is: oftree -l /env/oftree oftree -d -n /sound oftree -d /env/oftree oftree -f oftree -p oftree -l -p /env/oftree Signed-off-by: Sascha Hauer --- commands/oftree.c | 99 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 68 insertions(+), 31 deletions(-) (limited to 'commands/oftree.c') diff --git a/commands/oftree.c b/commands/oftree.c index 17af9eb581..c5239eb8eb 100644 --- a/commands/oftree.c +++ b/commands/oftree.c @@ -39,17 +39,23 @@ static int do_oftree(int argc, char *argv[]) { - struct fdt_header *fdt; + struct fdt_header *fdt = NULL; + void *fdt_free = NULL; int size; int opt; char *file = NULL; const char *node = "/"; int dump = 0; int probe = 0; + int load = 0; + int free_of = 0; int ret; - while ((opt = getopt(argc, argv, "dpfn:")) > 0) { + while ((opt = getopt(argc, argv, "dpfn:l")) > 0) { switch (opt) { + case 'l': + load = 1; + break; case 'd': dump = 1; break; @@ -62,66 +68,97 @@ static int do_oftree(int argc, char *argv[]) } break; case 'f': - return 0; + free_of = 1; + break; case 'n': node = optarg; break; } } + if (free_of) { + struct device_node *root = of_get_root_node(); + + if (root) + of_free(root); + + return 0; + } + if (optind < argc) file = argv[optind]; - if (!dump && !probe) + if (!dump && !probe && !load) return COMMAND_ERROR_USAGE; - if (dump) { - if (file) { - fdt = read_file(file, &size); - if (!fdt) { - printf("unable to read %s\n", file); - return 1; - } - - fdt_print(fdt, node); - free(fdt); - } else { + if (file) { + fdt = read_file(file, &size); + if (!fdt) { + printf("unable to read %s\n", file); return 1; } - return 0; - } - if (probe) { - if (!file) - return COMMAND_ERROR_USAGE; + fdt_free = fdt; + } - fdt = read_file(file, &size); + if (load) { if (!fdt) { - perror("open"); - return 1; + printf("no fdt given\n"); + ret = -ENOENT; + + goto out; } ret = of_unflatten_dtb(fdt); if (ret) { printf("parse oftree: %s\n", strerror(-ret)); - return 1; + goto out; } + } - of_probe(); + if (dump) { + if (fdt) { + ret = fdt_print(fdt, node); + } else { + struct device_node *n = of_find_node_by_path(node); + + if (!n) { + ret = -ENOENT; + goto out; + } + + of_print_nodes(n, 0); + + ret = 0; + } + + goto out; } - return 0; + if (probe) { + ret = of_probe(); + if (ret) + goto out; + } + + ret = 0; +out: + free(fdt_free); + + return ret; } BAREBOX_CMD_HELP_START(oftree) -BAREBOX_CMD_HELP_USAGE("oftree [OPTIONS]\n") -BAREBOX_CMD_HELP_OPT ("-p ", "probe devices in oftree from \n") -BAREBOX_CMD_HELP_OPT ("-d [FILE]", "dump oftree from [FILE] or the parsed tree if no file is given\n") -BAREBOX_CMD_HELP_OPT ("-f", "free stored oftree\n") +BAREBOX_CMD_HELP_USAGE("oftree [OPTIONS] [DTB]\n") +BAREBOX_CMD_HELP_OPT ("-l", "Load [DTB] to internal devicetree\n") +BAREBOX_CMD_HELP_OPT ("-p", "probe devices from stored devicetree\n") +BAREBOX_CMD_HELP_OPT ("-d", "dump oftree from [DTB] or the parsed tree if no dtb is given\n") +BAREBOX_CMD_HELP_OPT ("-f", "free stored devicetree\n") +BAREBOX_CMD_HELP_OPT ("-n ", "specify root devicenode to dump for -d\n") BAREBOX_CMD_HELP_END BAREBOX_CMD_START(oftree) .cmd = do_oftree, - .usage = "handle oftrees", + .usage = "handle devicetrees", BAREBOX_CMD_HELP(cmd_oftree_help) BAREBOX_CMD_END -- cgit v1.2.3