|
@@ -5,9 +5,11 @@
|
|
|
|
|
|
#ifndef USE_HOSTCC
|
|
|
#include <common.h>
|
|
|
+#include <errno.h>
|
|
|
#include <serial.h>
|
|
|
#include <libfdt.h>
|
|
|
#include <fdtdec.h>
|
|
|
+#include <linux/ctype.h>
|
|
|
|
|
|
#include <asm/gpio.h>
|
|
|
|
|
@@ -319,6 +321,50 @@ int fdtdec_add_aliases_for_id(const void *blob, const char *name,
|
|
|
return num_found;
|
|
|
}
|
|
|
|
|
|
+int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
|
|
|
+ int *seqp)
|
|
|
+{
|
|
|
+ int base_len = strlen(base);
|
|
|
+ const char *find_name;
|
|
|
+ int find_namelen;
|
|
|
+ int prop_offset;
|
|
|
+ int aliases;
|
|
|
+
|
|
|
+ find_name = fdt_get_name(blob, offset, &find_namelen);
|
|
|
+ debug("Looking for '%s' at %d, name %s\n", base, offset, find_name);
|
|
|
+
|
|
|
+ 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;
|
|
|
+ const char *slash;
|
|
|
+ const char *p;
|
|
|
+ int len;
|
|
|
+
|
|
|
+ prop = fdt_getprop_by_offset(blob, prop_offset, &name, &len);
|
|
|
+ debug(" - %s, %s\n", name, prop);
|
|
|
+ if (len < find_namelen || *prop != '/' || prop[len - 1] ||
|
|
|
+ strncmp(name, base, base_len))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ slash = strrchr(prop, '/');
|
|
|
+ if (strcmp(slash + 1, find_name))
|
|
|
+ continue;
|
|
|
+ for (p = name; *p; p++) {
|
|
|
+ if (isdigit(*p)) {
|
|
|
+ *seqp = simple_strtoul(p, NULL, 10);
|
|
|
+ debug("Found seq %d\n", *seqp);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ debug("Not found\n");
|
|
|
+ return -ENOENT;
|
|
|
+}
|
|
|
+
|
|
|
int fdtdec_check_fdt(void)
|
|
|
{
|
|
|
/*
|