Merge branch 'master' of git://git.denx.de/u-boot-spi
[platform/kernel/u-boot.git] / drivers / core / ofnode.c
index beb7296..0e584c1 100644 (file)
@@ -253,15 +253,15 @@ int ofnode_read_size(ofnode node, const char *propname)
 
 fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
 {
+       int na, ns;
+       fdt_size_t size;
+
        if (ofnode_is_np(node)) {
                const __be32 *prop_val;
                uint flags;
-               u64 size;
-               int na;
-               int ns;
 
-               prop_val = of_get_address(ofnode_to_np(node), index, &size,
-                                         &flags);
+               prop_val = of_get_address(ofnode_to_np(node), index,
+                                         (u64 *)&size, &flags);
                if (!prop_val)
                        return FDT_ADDR_T_NONE;
 
@@ -274,8 +274,11 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
                        return of_read_number(prop_val, na);
                }
        } else {
-               return fdt_get_base_address(gd->fdt_blob,
-                                           ofnode_to_offset(node));
+               na = ofnode_read_simple_addr_cells(ofnode_get_parent(node));
+               ns = ofnode_read_simple_size_cells(ofnode_get_parent(node));
+               return fdtdec_get_addr_size_fixed(gd->fdt_blob,
+                                                 ofnode_to_offset(node), "reg",
+                                                 index, na, ns, &size, true);
        }
 
        return FDT_ADDR_T_NONE;
@@ -543,7 +546,11 @@ fdt_addr_t ofnode_get_addr_size(ofnode node, const char *property,
                na = of_n_addr_cells(np);
                ns = of_n_size_cells(np);
                *sizep = of_read_number(prop + na, ns);
-               return of_read_number(prop, na);
+
+               if (IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0)
+                       return of_translate_address(np, prop);
+               else
+                       return of_read_number(prop, na);
        } else {
                return fdtdec_get_addr_size(gd->fdt_blob,
                                            ofnode_to_offset(node), property,
@@ -695,6 +702,8 @@ bool ofnode_pre_reloc(ofnode node)
 {
        if (ofnode_read_bool(node, "u-boot,dm-pre-reloc"))
                return true;
+       if (ofnode_read_bool(node, "u-boot,dm-pre-proper"))
+               return true;
 
 #ifdef CONFIG_TPL_BUILD
        if (ofnode_read_bool(node, "u-boot,dm-tpl"))
@@ -825,8 +834,10 @@ int ofnode_write_prop(ofnode node, const char *propname, int len,
                return -ENOMEM;
 
        new->name = strdup(propname);
-       if (!new->name)
+       if (!new->name) {
+               free(new);
                return -ENOMEM;
+       }
 
        new->value = (void *)value;
        new->length = len;