Merge branch 'master' of git://git.denx.de/u-boot-spi
[oweals/u-boot.git] / lib / fdtdec.c
index 9c9c30234732f09b8162414e12145373a23b6cc6..3ee786b57940df4b12f89cce3003f2c2a252c9e0 100644 (file)
@@ -1261,11 +1261,33 @@ __weak void *board_fdt_blob_setup(void)
 }
 #endif
 
-int fdtdec_set_phandle(void *blob, int node, uint32_t phandle)
+int fdtdec_set_ethernet_mac_address(void *fdt, const u8 *mac, size_t size)
 {
-       fdt32_t value = cpu_to_fdt32(phandle);
+       const char *path;
+       int offset, err;
 
-       return fdt_setprop(blob, node, "phandle", &value, sizeof(value));
+       if (!is_valid_ethaddr(mac))
+               return -EINVAL;
+
+       path = fdt_get_alias(fdt, "ethernet");
+       if (!path)
+               return 0;
+
+       debug("ethernet alias found: %s\n", path);
+
+       offset = fdt_path_offset(fdt, path);
+       if (offset < 0) {
+               debug("ethernet alias points to absent node %s\n", path);
+               return -ENOENT;
+       }
+
+       err = fdt_setprop_inplace(fdt, offset, "local-mac-address", mac, size);
+       if (err < 0)
+               return err;
+
+       debug("MAC address: %pM\n", mac);
+
+       return 0;
 }
 
 static int fdtdec_init_reserved_memory(void *blob)
@@ -1307,6 +1329,7 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
        fdt32_t cells[4] = {}, *ptr = cells;
        uint32_t upper, lower, phandle;
        int parent, node, na, ns, err;
+       fdt_size_t size;
        char name[64];
 
        /* create an empty /reserved-memory node if one doesn't exist */
@@ -1347,7 +1370,8 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
         * Unpack the start address and generate the name of the new node
         * base on the basename and the unit-address.
         */
-       lower = fdt_addr_unpack(carveout->start, &upper);
+       upper = upper_32_bits(carveout->start);
+       lower = lower_32_bits(carveout->start);
 
        if (na > 1 && upper > 0)
                snprintf(name, sizeof(name), "%s@%x,%x", basename, upper,
@@ -1381,7 +1405,9 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
        *ptr++ = cpu_to_fdt32(lower);
 
        /* store one or two size cells */
-       lower = fdt_size_unpack(carveout->end - carveout->start + 1, &upper);
+       size = carveout->end - carveout->start + 1;
+       upper = upper_32_bits(size);
+       lower = lower_32_bits(size);
 
        if (ns > 1)
                *ptr++ = cpu_to_fdt32(upper);