Merge tag 'xilinx-for-v2023.01-rc3' of https://source.denx.de/u-boot/custodians/u...
[platform/kernel/u-boot.git] / drivers / core / ofnode.c
index 2c4d521..4d56b1a 100644 (file)
@@ -1197,12 +1197,12 @@ int ofnode_read_eth_phy_id(ofnode node, u16 *vendor, u16 *device)
        while (list < end) {
                len = strlen(list);
 
-               if (len >= strlen("ethernet-phy-idVVVV,DDDD")) {
+               if (len >= strlen("ethernet-phy-idVVVV.DDDD")) {
                        char *s = strstr(list, "ethernet-phy-id");
 
                        /*
                         * check if the string is something like
-                        * ethernet-phy-idVVVV,DDDD
+                        * ethernet-phy-idVVVV.DDDD
                         */
                        if (s && s[19] == '.') {
                                s += strlen("ethernet-phy-id");
@@ -1388,15 +1388,27 @@ ofnode ofnode_by_prop_value(ofnode from, const char *propname,
 }
 
 int ofnode_write_prop(ofnode node, const char *propname, const void *value,
-                     int len)
+                     int len, bool copy)
 {
-       if (of_live_active())
-               return of_write_prop(ofnode_to_np(node), propname, len, value);
-       else
+       if (of_live_active()) {
+               void *newval;
+               int ret;
+
+               if (copy) {
+                       newval = malloc(len);
+                       if (!newval)
+                               return log_ret(-ENOMEM);
+                       memcpy(newval, value, len);
+                       value = newval;
+               }
+               ret = of_write_prop(ofnode_to_np(node), propname, len, value);
+               if (ret && copy)
+                       free(newval);
+               return ret;
+       } else {
                return fdt_setprop(ofnode_to_fdt(node), ofnode_to_offset(node),
                                   propname, value, len);
-
-       return 0;
+       }
 }
 
 int ofnode_write_string(ofnode node, const char *propname, const char *value)
@@ -1405,7 +1417,8 @@ int ofnode_write_string(ofnode node, const char *propname, const char *value)
 
        debug("%s: %s = %s", __func__, propname, value);
 
-       return ofnode_write_prop(node, propname, value, strlen(value) + 1);
+       return ofnode_write_prop(node, propname, value, strlen(value) + 1,
+                                false);
 }
 
 int ofnode_write_u32(ofnode node, const char *propname, u32 value)
@@ -1420,7 +1433,7 @@ int ofnode_write_u32(ofnode node, const char *propname, u32 value)
                return -ENOMEM;
        *val = cpu_to_fdt32(value);
 
-       return ofnode_write_prop(node, propname, val, sizeof(value));
+       return ofnode_write_prop(node, propname, val, sizeof(value), false);
 }
 
 int ofnode_set_enabled(ofnode node, bool value)
@@ -1544,3 +1557,27 @@ int ofnode_add_subnode(ofnode node, const char *name, ofnode *subnodep)
 
        return ret;     /* 0 or -EEXIST */
 }
+
+int ofnode_copy_props(ofnode src, ofnode dst)
+{
+       struct ofprop prop;
+
+       ofnode_for_each_prop(prop, src) {
+               const char *name;
+               const char *val;
+               int len, ret;
+
+               val = ofprop_get_property(&prop, &name, &len);
+               if (!val) {
+                       log_debug("Cannot read prop (err=%d)\n", len);
+                       return log_msg_ret("get", -EINVAL);
+               }
+               ret = ofnode_write_prop(dst, name, val, len, true);
+               if (ret) {
+                       log_debug("Cannot write prop (err=%d)\n", ret);
+                       return log_msg_ret("wr", -EINVAL);
+               }
+       }
+
+       return 0;
+}