diff options
author | Linus Torvalds <[email protected]> | 2016-03-19 15:15:07 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2016-03-19 15:15:07 -0700 |
commit | 31e182363b39d84031eadf0caf6d99fd9eb056f0 (patch) | |
tree | 82dfe8293c9880ad521f67f3afc20a2fe55efddd /scripts/dtc/dtc.c | |
parent | 1200b6809dfd9d73bc4c7db76d288c35fa4b2ebe (diff) | |
parent | 5027e19db8cee24e189f8afa53b548e1ac5d0c1d (diff) |
Merge tag 'devicetree-for-4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
Pull DeviceTree updates from Rob Herring:
- new tool 'dtx_diff' to diff DT files
- sync kernel's dtc/libfdt to current dtc repo master
- fix for reserved memory regions located in highmem
- document standard unit suffixes for DT properties
- various DT binding doc updates
* tag 'devicetree-for-4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux:
of: Add vendor prefix for eGalax_eMPIA Technology Inc
Input: ads7846: Add description how to use internal reference (ADS7846)
ARM: realview: add EB syscon variants to bindings
devicetree: bindings: ARM: Use "uV" for micro-volt
serial: fsl-imx-uart: Fix typo in fsl,dte-mode description
of: add 'const' for of_property_*_string*() parameter '*np'
of/unittest: fix infinite loop in of_unittest_destroy_tracked_overlays()
of: alloc anywhere from memblock if range not specified
kbuild: Allow using host dtc instead of kernel's copy
of: resolver: Add missing of_node_get and of_node_put
of: Add United Radiant Technology Corporation vendor prefix
dt/bindings: add documentation on standard property unit suffixes
scripts/dtc: Update to upstream commit b06e55c88b9b
ARM: boot: Add an implementation of strnlen for libfdt
scripts/dtc: dtx_diff - add info to error message
dtc: create tool to diff device trees
Diffstat (limited to 'scripts/dtc/dtc.c')
-rw-r--r-- | scripts/dtc/dtc.c | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c index 8c4add69a765..5fa23c406266 100644 --- a/scripts/dtc/dtc.c +++ b/scripts/dtc/dtc.c @@ -18,6 +18,8 @@ * USA */ +#include <sys/stat.h> + #include "dtc.h" #include "srcpos.h" @@ -104,11 +106,56 @@ static const char * const usage_opts_help[] = { NULL, }; +static const char *guess_type_by_name(const char *fname, const char *fallback) +{ + const char *s; + + s = strrchr(fname, '.'); + if (s == NULL) + return fallback; + if (!strcasecmp(s, ".dts")) + return "dts"; + if (!strcasecmp(s, ".dtb")) + return "dtb"; + return fallback; +} + +static const char *guess_input_format(const char *fname, const char *fallback) +{ + struct stat statbuf; + uint32_t magic; + FILE *f; + + if (stat(fname, &statbuf) != 0) + return fallback; + + if (S_ISDIR(statbuf.st_mode)) + return "fs"; + + if (!S_ISREG(statbuf.st_mode)) + return fallback; + + f = fopen(fname, "r"); + if (f == NULL) + return fallback; + if (fread(&magic, 4, 1, f) != 1) { + fclose(f); + return fallback; + } + fclose(f); + + magic = fdt32_to_cpu(magic); + if (magic == FDT_MAGIC) + return "dtb"; + + return guess_type_by_name(fname, fallback); +} + int main(int argc, char *argv[]) { struct boot_info *bi; - const char *inform = "dts"; - const char *outform = "dts"; + const char *inform = NULL; + const char *outform = NULL; const char *outname = "-"; const char *depname = NULL; bool force = false, sort = false; @@ -213,6 +260,17 @@ int main(int argc, char *argv[]) fprintf(depfile, "%s:", outname); } + if (inform == NULL) + inform = guess_input_format(arg, "dts"); + if (outform == NULL) { + outform = guess_type_by_name(outname, NULL); + if (outform == NULL) { + if (streq(inform, "dts")) + outform = "dtb"; + else + outform = "dts"; + } + } if (streq(inform, "dts")) bi = dt_from_source(arg); else if (streq(inform, "fs")) |