]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
Revert "of: overlay: add overlay symbols to live device tree"
authorNava kishore Manne <nava.manne@xilinx.com>
Tue, 13 Mar 2018 09:41:55 +0000 (15:11 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 16 Mar 2018 07:28:02 +0000 (08:28 +0100)
This reverts commit d1651b03c2df75db8eda3fbcd3a07adb337ee8b0.

This commit must be reverted, else loading overlays
from the configfs interface will be fails with the
following errors:
OF: changeset: add_property failed @/__symbols__/...
OF: Error applying changeset (-17)

Signed-off-by: Nava kishore Manne <navam@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/of/overlay.c

index f82f65c7dd91e3ef9bf63326c418b5cb53555af2..eca64182ebc53a3335ae280655f379a24041004d 100644 (file)
@@ -35,7 +35,6 @@
 struct of_overlay_info {
        struct device_node *target;
        struct device_node *overlay;
-       bool is_symbols_node;
 };
 
 /**
@@ -56,8 +55,7 @@ struct of_overlay {
 };
 
 static int of_overlay_apply_one(struct of_overlay *ov,
-               struct device_node *target, const struct device_node *overlay,
-               bool is_symbols_node);
+               struct device_node *target, const struct device_node *overlay);
 
 static BLOCKING_NOTIFIER_HEAD(of_overlay_chain);
 
@@ -94,74 +92,10 @@ static int of_overlay_notify(struct of_overlay *ov,
        return 0;
 }
 
-static struct property *dup_and_fixup_symbol_prop(struct of_overlay *ov,
-               const struct property *prop)
-{
-       struct of_overlay_info *ovinfo;
-       struct property *new;
-       const char *overlay_name;
-       char *label_path;
-       char *symbol_path;
-       const char *target_path;
-       int k;
-       int label_path_len;
-       int overlay_name_len;
-       int target_path_len;
-
-       if (!prop->value)
-               return NULL;
-       symbol_path = prop->value;
-
-       new = kzalloc(sizeof(*new), GFP_KERNEL);
-       if (!new)
-               return NULL;
-
-       for (k = 0; k < ov->count; k++) {
-               ovinfo = &ov->ovinfo_tab[k];
-               overlay_name = ovinfo->overlay->full_name;
-               overlay_name_len = strlen(overlay_name);
-               if (!strncasecmp(symbol_path, overlay_name, overlay_name_len))
-                       break;
-       }
-
-       if (k >= ov->count)
-               goto err_free;
-
-       target_path = ovinfo->target->full_name;
-       target_path_len = strlen(target_path);
-
-       label_path = symbol_path + overlay_name_len;
-       label_path_len = strlen(label_path);
-
-       new->name = kstrdup(prop->name, GFP_KERNEL);
-       new->length = target_path_len + label_path_len + 1;
-       new->value = kzalloc(new->length, GFP_KERNEL);
-
-       if (!new->name || !new->value)
-               goto err_free;
-
-       strcpy(new->value, target_path);
-       strcpy(new->value + target_path_len, label_path);
-
-       /* mark the property as dynamic */
-       of_property_set_flag(new, OF_DYNAMIC);
-
-       return new;
-
- err_free:
-       kfree(new->name);
-       kfree(new->value);
-       kfree(new);
-       return NULL;
-
-
-}
-
 static int of_overlay_apply_single_property(struct of_overlay *ov,
-               struct device_node *target, struct property *prop,
-               bool is_symbols_node)
+               struct device_node *target, struct property *prop)
 {
-       struct property *propn = NULL, *tprop;
+       struct property *propn, *tprop;
 
        /* NOTE: Multiple changes of single properties not supported */
        tprop = of_find_property(target, prop->name, NULL);
@@ -172,15 +106,7 @@ static int of_overlay_apply_single_property(struct of_overlay *ov,
            of_prop_cmp(prop->name, "linux,phandle") == 0)
                return 0;
 
-       if (is_symbols_node) {
-               /* changing a property in __symbols__ node not allowed */
-               if (tprop)
-                       return -EINVAL;
-               propn = dup_and_fixup_symbol_prop(ov, prop);
-       } else {
-               propn = __of_prop_dup(prop, GFP_KERNEL);
-       }
-
+       propn = __of_prop_dup(prop, GFP_KERNEL);
        if (propn == NULL)
                return -ENOMEM;
 
@@ -214,7 +140,7 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
                        return -EINVAL;
 
                /* apply overlay recursively */
-               ret = of_overlay_apply_one(ov, tchild, child, 0);
+               ret = of_overlay_apply_one(ov, tchild, child);
                of_node_put(tchild);
        } else {
                /* create empty tree as a target */
@@ -229,7 +155,7 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
                if (ret)
                        return ret;
 
-               ret = of_overlay_apply_one(ov, tchild, child, 0);
+               ret = of_overlay_apply_one(ov, tchild, child);
                if (ret)
                        return ret;
        }
@@ -245,16 +171,14 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
  * by using the changeset.
  */
 static int of_overlay_apply_one(struct of_overlay *ov,
-               struct device_node *target, const struct device_node *overlay,
-               bool is_symbols_node)
+               struct device_node *target, const struct device_node *overlay)
 {
        struct device_node *child;
        struct property *prop;
        int ret;
 
        for_each_property_of_node(overlay, prop) {
-               ret = of_overlay_apply_single_property(ov, target, prop,
-                                                      is_symbols_node);
+               ret = of_overlay_apply_single_property(ov, target, prop);
                if (ret) {
                        pr_err("Failed to apply prop @%pOF/%s\n",
                               target, prop->name);
@@ -262,10 +186,6 @@ static int of_overlay_apply_one(struct of_overlay *ov,
                }
        }
 
-       /* do not allow symbols node to have any children */
-       if (is_symbols_node)
-               return 0;
-
        for_each_child_of_node(overlay, child) {
                ret = of_overlay_apply_single_device_node(ov, target, child);
                if (ret != 0) {
@@ -296,8 +216,7 @@ static int of_overlay_apply(struct of_overlay *ov)
        for (i = 0; i < ov->count; i++) {
                struct of_overlay_info *ovinfo = &ov->ovinfo_tab[i];
 
-               err = of_overlay_apply_one(ov, ovinfo->target, ovinfo->overlay,
-                                          ovinfo->is_symbols_node);
+               err = of_overlay_apply_one(ov, ovinfo->target, ovinfo->overlay);
                if (err != 0) {
                        pr_err("apply failed '%pOF'\n", ovinfo->target);
                        return err;
@@ -395,9 +314,6 @@ static int of_build_overlay_info(struct of_overlay *ov,
        for_each_child_of_node(tree, node)
                cnt++;
 
-       if (of_get_child_by_name(tree, "__symbols__"))
-               cnt++;
-
        ovinfo = kcalloc(cnt, sizeof(*ovinfo), GFP_KERNEL);
        if (ovinfo == NULL)
                return -ENOMEM;
@@ -409,20 +325,6 @@ static int of_build_overlay_info(struct of_overlay *ov,
                        cnt++;
        }
 
-       node = of_get_child_by_name(tree, "__symbols__");
-       if (node) {
-               ovinfo[cnt].overlay = node;
-               ovinfo[cnt].target = of_find_node_by_path("/__symbols__");
-               ovinfo[cnt].is_symbols_node = 1;
-
-               if (!ovinfo[cnt].target) {
-                       pr_err("no symbols in root of device tree.\n");
-                       return -EINVAL;
-               }
-
-               cnt++;
-       }
-
        /* if nothing filled, return error */
        if (cnt == 0) {
                kfree(ovinfo);