From 003c9dc89176cacc9996f737d08490805e29582e Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Thu, 31 Jan 2019 16:30:58 +0100 Subject: [PATCH] fdt: Introduce fdtdec_get_alias_highest_id() Find out the highest alias ID used for certain subsystem. This call will be used for alocating IDs for i2c buses which are not described in DT. Signed-off-by: Michal Simek Reviewed-by: Heiko Schocher Reviewed-by: Simon Glass --- include/fdtdec.h | 13 +++++++++++++ lib/fdtdec.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/fdtdec.h b/include/fdtdec.h index f1bcbf837f..c2dd87ede2 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -625,6 +625,19 @@ int fdtdec_add_aliases_for_id(const void *blob, const char *name, int fdtdec_get_alias_seq(const void *blob, const char *base, int node, int *seqp); +/** + * Get the highest alias number for susbystem. + * + * It parses all aliases and find out highest recorded alias for subsystem. + * Aliases are of the form where is the sequence number. + * + * @param blob Device tree blob (if NULL, then error is returned) + * @param base Base name for alias susbystem (before the number) + * + * @return 0 highest alias ID, -1 if not found + */ +int fdtdec_get_alias_highest_id(const void *blob, const char *base); + /** * Get a property from the /chosen node * diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 18663ce6bd..55811975ef 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -549,6 +549,39 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset, return -ENOENT; } +int fdtdec_get_alias_highest_id(const void *blob, const char *base) +{ + int base_len = strlen(base); + int prop_offset; + int aliases; + int max = -1; + + debug("Looking for highest alias id for '%s'\n", base); + + aliases = fdt_path_offset(blob, "/aliases"); + for (prop_offset = fdt_first_property_offset(blob, aliases); + prop_offset > 0; + prop_offset = fdt_next_property_offset(blob, prop_offset)) { + const char *prop; + const char *name; + int len, val; + + prop = fdt_getprop_by_offset(blob, prop_offset, &name, &len); + debug(" - %s, %s\n", name, prop); + if (*prop != '/' || prop[len - 1] || + strncmp(name, base, base_len)) + continue; + + val = trailing_strtol(name); + if (val > max) { + debug("Found seq %d\n", val); + max = val; + } + } + + return max; +} + const char *fdtdec_get_chosen_prop(const void *blob, const char *name) { int chosen_node; -- 2.39.5