libfdt: return correct value if #size-cells property is not present
authorMatthias Brugger <mbrugger@suse.com>
Thu, 5 Sep 2019 08:48:47 +0000 (10:48 +0200)
committerSimon Glass <sjg@chromium.org>
Tue, 15 Oct 2019 14:40:02 +0000 (08:40 -0600)
According to the device tree specification, the default value for
was not present.

This patch also makes fdt_address_cells() and fdt_size_cells() conform
to the behaviour documented in libfdt.h. The defaults are only returned
if fdt_getprop() returns -FDT_ERR_NOTFOUND, otherwise the actual error
is returned.

This is based on upstream commit:
aa7254d ("libfdt: return correct value if #size-cells property is not present")
but misses the test case part, as we don't implement them in U-Boot.

Signed-off-by: Matthias Brugger <mbrugger@suse.com>
scripts/dtc/libfdt/fdt_addresses.c
scripts/dtc/libfdt/libfdt.h

index 49537b578d03f05068b807d6fd5d2c8cfebb7f1b..f13a87dfa0681b32cbe0e37cd4aaa686ca3cdda7 100644 (file)
@@ -64,7 +64,7 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
 
        c = fdt_getprop(fdt, nodeoffset, name, &len);
        if (!c)
-               return 2;
+               return len;
 
        if (len != sizeof(*c))
                return -FDT_ERR_BADNCELLS;
@@ -78,10 +78,20 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name)
 
 int fdt_address_cells(const void *fdt, int nodeoffset)
 {
-       return fdt_cells(fdt, nodeoffset, "#address-cells");
+       int val;
+
+       val = fdt_cells(fdt, nodeoffset, "#address-cells");
+       if (val == -FDT_ERR_NOTFOUND)
+               return 2;
+       return val;
 }
 
 int fdt_size_cells(const void *fdt, int nodeoffset)
 {
-       return fdt_cells(fdt, nodeoffset, "#size-cells");
+       int val;
+
+       val = fdt_cells(fdt, nodeoffset, "#size-cells");
+       if (val == -FDT_ERR_NOTFOUND)
+               return 1;
+       return val;
 }
index 66f01fec53c7fde30b814b940bbbfd339546427f..5c778b115babbdbe7bdafacb2d2a56cd0239696b 100644 (file)
@@ -1109,7 +1109,7 @@ int fdt_address_cells(const void *fdt, int nodeoffset);
  *
  * returns:
  *     0 <= n < FDT_MAX_NCELLS, on success
- *      2, if the node has no #size-cells property
+ *      1, if the node has no #size-cells property
  *      -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
  *             #size-cells property
  *     -FDT_ERR_BADMAGIC,