From 81dd24a0946c694f3d40dadc0e01254ce15a79bb Mon Sep 17 00:00:00 2001 From: Oleksij Rempel Date: Tue, 3 May 2022 11:12:18 +0200 Subject: of: add generic of_prepend_machine_compatible() Add generic function to extend/fixup machine compatible. Signed-off-by: Oleksij Rempel Link: https://lore.barebox.org/20220503091220.3871612-4-o.rempel@pengutronix.de Signed-off-by: Sascha Hauer --- common/misc.c | 23 +++++++++++++++++++++++ common/oftree.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) (limited to 'common') diff --git a/common/misc.c b/common/misc.c index 3b3bc05bfd..0f6de3e9e5 100644 --- a/common/misc.c +++ b/common/misc.c @@ -150,6 +150,7 @@ BAREBOX_MAGICVAR(global.model, "Product name of this hardware"); static char *hostname; static char *serial_number; +static char *of_machine_compatible; /* * The hostname is supposed to be the shortname of a board. It should @@ -195,6 +196,28 @@ const char *barebox_get_serial_number(void) BAREBOX_MAGICVAR(global.serial_number, "Board serial number"); +void barebox_set_of_machine_compatible(const char *__compatible) +{ + free(of_machine_compatible); + of_machine_compatible = xstrdup(__compatible); +} + +const char *barebox_get_of_machine_compatible(void) +{ + return of_machine_compatible; +} + +static int of_kernel_init(void) +{ + globalvar_add_simple_string("of.kernel.add_machine_compatible", + &of_machine_compatible); + + return 0; +} +device_initcall(of_kernel_init); + +BAREBOX_MAGICVAR(global.of.kernel.add_machine_compatible, "Additional machine/board compatible"); + void __noreturn panic(const char *fmt, ...) { va_list args; diff --git a/common/oftree.c b/common/oftree.c index 51f825c3f3..91b3fcc9fa 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -207,11 +207,16 @@ static int of_fixup_bootargs(struct device_node *root, void *unused) int instance = reset_source_get_instance(); struct device_d *dev; const char *serialno; + const char *compat; serialno = barebox_get_serial_number(); if (serialno) of_property_write_string(root, "serial-number", serialno); + compat = barebox_get_of_machine_compatible(); + if (compat) + of_prepend_machine_compatible(root, compat); + node = of_create_node(root, "/chosen"); if (!node) return -ENOMEM; @@ -483,3 +488,34 @@ int of_autoenable_i2c_by_component(char *path) return ret; } + +int of_prepend_machine_compatible(struct device_node *root, const char *compat) +{ + int cclen = 0, clen = strlen(compat) + 1; + const char *curcompat; + void *buf; + + if (!root) { + root = of_get_root_node(); + if (!root) + return -ENODEV; + } + + if (of_device_is_compatible(root, compat)) + return 0; + + curcompat = of_get_property(root, "compatible", &cclen); + + buf = xzalloc(cclen + clen); + + memcpy(buf, compat, clen); + + if (curcompat) + memcpy(buf + clen, curcompat, cclen); + + of_set_property(root, "compatible", buf, cclen + clen, true); + + free(buf); + + return 0; +} -- cgit v1.2.3