summaryrefslogtreecommitdiffstats
path: root/commands/oftree.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-01-09 13:14:45 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-01-19 11:48:17 +0100
commite118761c5f7e8e41fa3503ae96885459869dcb84 (patch)
treeb12a3d7d2b014fa2405d5397877b29701fe8655b /commands/oftree.c
parent9e824f30c21c1f6b667b82a287105803598b98a1 (diff)
downloadbarebox-e118761c5f7e8e41fa3503ae96885459869dcb84.tar.gz
barebox-e118761c5f7e8e41fa3503ae96885459869dcb84.tar.xz
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 <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/oftree.c')
-rw-r--r--commands/oftree.c99
1 files changed, 68 insertions, 31 deletions
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 <FILE>", "probe devices in oftree from <file>\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 <node>", "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