of: Improve prom_update_property() function
authorDong Aisheng <dong.aisheng@linaro.org>
Wed, 11 Jul 2012 05:16:37 +0000 (15:16 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 11 Jul 2012 05:26:51 +0000 (15:26 +1000)
prom_update_property() currently fails if the property doesn't
actually exist yet which isn't what we want. Change to add-or-update
instead of update-only, then we can remove a lot duplicated lines.

Suggested-by: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
Acked-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/platforms/85xx/p1022_ds.c
arch/powerpc/platforms/pseries/mobility.c
arch/powerpc/platforms/pseries/reconfig.c
drivers/of/base.c
fs/proc/proc_devtree.c
include/linux/of.h

index 74e310b4b460b3ddba96b336014bb74e1b642591..31d18b964f94f4bbc6b8f5097eceb575b676a828 100644 (file)
@@ -348,13 +348,7 @@ void __init p1022_ds_pic_init(void)
  */
 static void __init disable_one_node(struct device_node *np, struct property *new)
 {
-       struct property *old;
-
-       old = of_find_property(np, new->name, NULL);
-       if (old)
-               prom_update_property(np, new, old);
-       else
-               prom_add_property(np, new);
+       prom_update_property(np, new);
 }
 
 /* TRUE if there is a "video=fslfb" command-line parameter. */
index 029a562af3738070d5d612dbad13c3819f970642..dd30b12edfe4c5d8166c6cf1ca67a1aaddca1711 100644 (file)
@@ -67,7 +67,6 @@ static int update_dt_property(struct device_node *dn, struct property **prop,
                              const char *name, u32 vd, char *value)
 {
        struct property *new_prop = *prop;
-       struct property *old_prop;
        int more = 0;
 
        /* A negative 'vd' value indicates that only part of the new property
@@ -117,12 +116,7 @@ static int update_dt_property(struct device_node *dn, struct property **prop,
        }
 
        if (!more) {
-               old_prop = of_find_property(dn, new_prop->name, NULL);
-               if (old_prop)
-                       prom_update_property(dn, new_prop, old_prop);
-               else
-                       prom_add_property(dn, new_prop);
-
+               prom_update_property(dn, new_prop);
                new_prop = NULL;
        }
 
index 7b3bf76ef8344f0d36c5d99fa221a175aec36bba..39f71fba9b38eed2e34d717d2bd2e4ea1ca38925 100644 (file)
@@ -432,7 +432,7 @@ static int do_update_property(char *buf, size_t bufsize)
        unsigned char *value;
        char *name, *end, *next_prop;
        int rc, length;
-       struct property *newprop, *oldprop;
+       struct property *newprop;
        buf = parse_node(buf, bufsize, &np);
        end = buf + bufsize;
 
@@ -443,6 +443,9 @@ static int do_update_property(char *buf, size_t bufsize)
        if (!next_prop)
                return -EINVAL;
 
+       if (!strlen(name))
+               return -ENODEV;
+
        newprop = new_property(name, length, value, NULL);
        if (!newprop)
                return -ENOMEM;
@@ -450,18 +453,11 @@ static int do_update_property(char *buf, size_t bufsize)
        if (!strcmp(name, "slb-size") || !strcmp(name, "ibm,slb-size"))
                slb_set_size(*(int *)value);
 
-       oldprop = of_find_property(np, name,NULL);
-       if (!oldprop) {
-               if (strlen(name))
-                       return prom_add_property(np, newprop);
-               return -ENODEV;
-       }
-
        upd_value.node = np;
        upd_value.property = newprop;
        pSeries_reconfig_notify(PSERIES_UPDATE_PROPERTY, &upd_value);
 
-       rc = prom_update_property(np, newprop, oldprop);
+       rc = prom_update_property(np, newprop);
        if (rc)
                return rc;
 
@@ -486,7 +482,7 @@ static int do_update_property(char *buf, size_t bufsize)
 
                rc = pSeries_reconfig_notify(action, value);
                if (rc) {
-                       prom_update_property(np, oldprop, newprop);
+                       prom_update_property(np, newprop);
                        return rc;
                }
        }
index eada3f4ef80100de1e0c3f8f2a236acff6e662a2..bc86ea2af668454efb2a75fd55108e36eb602a47 100644 (file)
@@ -1073,7 +1073,8 @@ int prom_remove_property(struct device_node *np, struct property *prop)
 }
 
 /*
- * prom_update_property - Update a property in a node.
+ * prom_update_property - Update a property in a node, if the property does
+ * not exist, add it.
  *
  * Note that we don't actually remove it, since we have given out
  * who-knows-how-many pointers to the data using get-property.
@@ -1081,13 +1082,19 @@ int prom_remove_property(struct device_node *np, struct property *prop)
  * and add the new property to the property list
  */
 int prom_update_property(struct device_node *np,
-                        struct property *newprop,
-                        struct property *oldprop)
+                        struct property *newprop)
 {
-       struct property **next;
+       struct property **next, *oldprop;
        unsigned long flags;
        int found = 0;
 
+       if (!newprop->name)
+               return -EINVAL;
+
+       oldprop = of_find_property(np, newprop->name, NULL);
+       if (!oldprop)
+               return prom_add_property(np, newprop);
+
        write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
index 927cbd115e532857936a0ddc4d51de14149a37b7..df7dd08d439121253bb180e26ad4d7e982775adf 100644 (file)
@@ -101,6 +101,11 @@ void proc_device_tree_update_prop(struct proc_dir_entry *pde,
 {
        struct proc_dir_entry *ent;
 
+       if (!oldprop) {
+               proc_device_tree_add_prop(pde, newprop);
+               return;
+       }
+
        for (ent = pde->subdir; ent != NULL; ent = ent->next)
                if (ent->data == oldprop)
                        break;
index 2ec1083af7ffba234db74acdd0e42d25d861b8c1..b27c87191df23f4283fbcaa383c8b6641853c354 100644 (file)
@@ -260,8 +260,7 @@ extern int of_machine_is_compatible(const char *compat);
 extern int prom_add_property(struct device_node* np, struct property* prop);
 extern int prom_remove_property(struct device_node *np, struct property *prop);
 extern int prom_update_property(struct device_node *np,
-                               struct property *newprop,
-                               struct property *oldprop);
+                               struct property *newprop);
 
 #if defined(CONFIG_OF_DYNAMIC)
 /* For updating the device tree at runtime */