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 /drivers | |
parent | 31b8b7254f2bfd8dd03522dee50a92cbf44a448d (diff) | |
download | barebox-fe6fd13905579639cbfb259921be3156e7552b9a.tar.gz barebox-fe6fd13905579639cbfb259921be3156e7552b9a.tar.xz |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/of/base.c | 30 |
1 files changed, 30 insertions, 0 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, ...) { |