diff options
author | Oleksij Rempel <o.rempel@pengutronix.de> | 2017-11-30 11:56:20 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-01-17 09:19:52 +0100 |
commit | 76759ec94eb3a32d71c32550b6b50965125afd92 (patch) | |
tree | 9ae15f4b79879c001169a0fa8f9649c9b23c0a11 | |
parent | 6a91cea016ba0ede7c6c22ee644291e19da05785 (diff) | |
download | barebox-76759ec94eb3a32d71c32550b6b50965125afd92.tar.gz barebox-76759ec94eb3a32d71c32550b6b50965125afd92.tar.xz |
of: base: use root_node compatible as suggestion for a hostname
on some SoCs we can use generic PLL and RAM initialization. In this
cases we create board file only to provide a host name.
With this patch host name will be created from device tree compatible.
For example:
compatible = "board_vendor,board", "chip_vendor,soc"
the host name will be:
"board"
This function will not overwrite a host name which is already set by
board or machine code.
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | common/misc.c | 7 | ||||
-rw-r--r-- | drivers/of/base.c | 32 | ||||
-rw-r--r-- | include/common.h | 1 | ||||
-rw-r--r-- | include/of.h | 1 |
4 files changed, 41 insertions, 0 deletions
diff --git a/common/misc.c b/common/misc.c index c5d3704c82..0888f1f4f6 100644 --- a/common/misc.c +++ b/common/misc.c @@ -187,6 +187,13 @@ const char *barebox_get_hostname(void) } EXPORT_SYMBOL(barebox_get_hostname); +void barebox_set_hostname_no_overwrite(const char *__hostname) +{ + if (!barebox_get_hostname()) + barebox_set_hostname(__hostname); +} +EXPORT_SYMBOL(barebox_set_hostname_no_overwrite); + BAREBOX_MAGICVAR_NAMED(global_hostname, global.hostname, "shortname of the board. Also used as hostname for DHCP requests"); diff --git a/drivers/of/base.c b/drivers/of/base.c index eabbf3d957..6a582177bf 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2360,3 +2360,35 @@ int of_graph_port_is_available(struct device_node *node) return available; } EXPORT_SYMBOL(of_graph_port_is_available); + +/** + * of_get_machine_compatible - get first compatible string from the root node. + * + * Returns the string or NULL. + */ +const char *of_get_machine_compatible(void) +{ + struct property *prop; + const char *name, *p; + + if (!root_node) + return NULL; + + prop = of_find_property(root_node, "compatible", NULL); + name = of_prop_next_string(prop, NULL); + + p = strchr(name, ','); + return p ? p + 1 : name; +} +EXPORT_SYMBOL(of_get_machine_compatible); + +static int of_init_hostname(void) +{ + const char *name; + + name = of_get_machine_compatible(); + barebox_set_hostname_no_overwrite(name ?: "barebox"); + + return 0; +} +late_initcall(of_init_hostname); diff --git a/include/common.h b/include/common.h index 54c76d4641..60e5005b8e 100644 --- a/include/common.h +++ b/include/common.h @@ -137,6 +137,7 @@ const char *barebox_get_model(void); void barebox_set_model(const char *); const char *barebox_get_hostname(void); void barebox_set_hostname(const char *); +void barebox_set_hostname_no_overwrite(const char *); #if defined(CONFIG_MIPS) #include <asm/addrspace.h> diff --git a/include/of.h b/include/of.h index 9bdbbb5ed2..1b9719d603 100644 --- a/include/of.h +++ b/include/of.h @@ -148,6 +148,7 @@ extern struct device_node *of_copy_node(struct device_node *parent, const struct device_node *other); extern void of_delete_node(struct device_node *node); +extern const char *of_get_machine_compatible(void); extern int of_machine_is_compatible(const char *compat); extern int of_device_is_compatible(const struct device_node *device, const char *compat); |