On Mon, Sep 12, 2022 at 05:54:36PM +0200, Ahmad Fatoum wrote: > 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@xxxxxxxxxxxxxx> > --- > v1 -> v2: > - simplify with malloc/memcpy instead of realloc/memmove (Sascha) > --- > drivers/of/base.c | 30 ++++++++++++++++++++++++++++++ > include/of.h | 8 ++++++++ > test/self/of_manipulation.c | 2 +- > 3 files changed, 39 insertions(+), 1 deletion(-) Applied, thanks Sascha > > diff --git a/drivers/of/base.c b/drivers/of/base.c > index 212b226eb55c..ea2a88764bb2 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 153e75d3e51d..052d5fcad84c 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, > @@ -536,6 +538,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 7e30a60ca687..f7f95fa269af 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); > } > -- > 2.30.2 > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |