diff options
-rw-r--r-- | drivers/of/base.c | 30 | ||||
-rw-r--r-- | include/of.h | 8 | ||||
-rw-r--r-- | test/self/of_manipulation.c | 2 |
3 files changed, 39 insertions, 1 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index d2e7ea4ae7..9b32215740 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2378,6 +2378,36 @@ int of_append_property(struct device_node *np, const char *name, const void *val return 0; } +int of_prepend_property(struct device_node *np, const char *name, const void *val, int len) +{ + struct property *pp; + const void *oldval; + void *buf; + int oldlen; + + pp = of_find_property(np, name, &oldlen); + if (!pp) { + of_new_property(np, name, val, len); + return 0; + } + + oldval = of_property_get_value(pp); + + buf = malloc(len + oldlen); + if (!buf) + return -ENOMEM; + + memcpy(buf, val, len); + memcpy(buf + len, oldval, oldlen); + + free(pp->value); + pp->value = buf; + pp->length = len + oldlen; + pp->value_const = NULL; + + return 0; +} + int of_property_sprintf(struct device_node *np, const char *propname, const char *fmt, ...) { diff --git a/include/of.h b/include/of.h index 392227e755..2c3b52d156 100644 --- a/include/of.h +++ b/include/of.h @@ -135,6 +135,8 @@ extern int of_set_property(struct device_node *node, const char *p, const void *val, int len, int create); extern int of_append_property(struct device_node *np, const char *p, const void *val, int len); +extern int of_prepend_property(struct device_node *np, const char *name, + const void *val, int len); extern struct property *of_new_property(struct device_node *node, const char *name, const void *data, int len); extern struct property *of_new_property_const(struct device_node *node, @@ -538,6 +540,12 @@ static inline int of_append_property(struct device_node *np, const char *p, return -ENOSYS; } +static inline int of_prepend_property(struct device_node *np, const char *name, + const void *val, int len) +{ + return -ENOSYS; +} + static inline struct property *of_new_property(struct device_node *node, const char *name, const void *data, int len) { diff --git a/test/self/of_manipulation.c b/test/self/of_manipulation.c index 7e30a60ca6..f7f95fa269 100644 --- a/test/self/of_manipulation.c +++ b/test/self/of_manipulation.c @@ -103,9 +103,9 @@ static void test_of_property_strings(struct device_node *root) of_append_property(np4, "property-single", "ayy", 4); - of_append_property(np4, "property-multi", "ayy", 4); of_append_property(np4, "property-multi", "bee", 4); of_append_property(np4, "property-multi", "sea", 4); + of_prepend_property(np4, "property-multi", "ayy", 4); assert_equal(np3, np4); } |