diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2022-09-12 17:54:36 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-09-13 12:07:55 +0200 |
commit | fe6fd13905579639cbfb259921be3156e7552b9a (patch) | |
tree | 8cbb7303bd1c03e0243c04c17ba49407119e4cdf | |
parent | 31b8b7254f2bfd8dd03522dee50a92cbf44a448d (diff) | |
download | barebox-fe6fd13905579639cbfb259921be3156e7552b9a.tar.gz |
of: implement of_prepend_property
Like of_append_property for adding at the end of properties, implement
of_prepend_property for placing data into the front.
This is especially useful to fixup most-specific compatibles into
existing nodes.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Link: https://lore.barebox.org/20220912155436.1565755-1-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-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); } |