summaryrefslogtreecommitdiffstats
path: root/drivers/of/base.c
diff options
context:
space:
mode:
authorDong Aisheng2012-07-11 07:16:37 +0200
committerBenjamin Herrenschmidt2012-07-11 07:26:51 +0200
commit475d0094293b51353e342d1198377967dbc48169 (patch)
treeb10a01706dd433b93353600a00491ce62e385ec9 /drivers/of/base.c
parentpowerpc: Add "memory" attribute for mfmsr() (diff)
downloadkernel-qcow2-linux-475d0094293b51353e342d1198377967dbc48169.tar.gz
kernel-qcow2-linux-475d0094293b51353e342d1198377967dbc48169.tar.xz
kernel-qcow2-linux-475d0094293b51353e342d1198377967dbc48169.zip
of: Improve prom_update_property() function
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>
Diffstat (limited to 'drivers/of/base.c')
-rw-r--r--drivers/of/base.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index eada3f4ef801..bc86ea2af668 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -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) {