On Fri, Sep 09, 2022 at 09:40:50AM +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> > --- > drivers/of/base.c | 35 +++++++++++++++++++++++++++++++++++ > include/of.h | 8 ++++++++ > test/self/of_manipulation.c | 2 +- > 3 files changed, 44 insertions(+), 1 deletion(-) > > diff --git a/drivers/of/base.c b/drivers/of/base.c > index 212b226eb55c..e208949b08bd 100644 > --- a/drivers/of/base.c > +++ b/drivers/of/base.c > @@ -2378,6 +2378,41 @@ 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; > + int orig_len; > + const void *orig_buf; > + void *buf; > + > + if (!np) > + return -ENOENT; > + > + pp = of_find_property(np, name, NULL); > + if (!pp) { > + of_new_property(np, name, val, len); > + return 0; > + } > + > + orig_len = pp->length; > + buf = realloc(pp->value, orig_len + len); > + if (!buf) > + return -ENOMEM; > + > + orig_buf = pp->value_const ?: buf; > + if (orig_buf) { orig_buf is always non NULL here. > + memmove(buf + len, orig_buf, orig_len); > + pp->value_const = NULL; > + } > + > + memcpy(buf, val, len); > + > + pp->value = buf; > + pp->length += len; > + > + return 0; > +} How about a bit more straight forward variant like this: int of_prepend_property(struct device_node *np, const char *name, const void *val, int len) { struct property *pp; int oldlen = 0; 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; } Sascha -- 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 |