diff options
-rw-r--r-- | include/pbl.h | 9 | ||||
-rw-r--r-- | pbl/fdt.c | 35 | ||||
-rw-r--r-- | pbl/string.c | 12 |
3 files changed, 56 insertions, 0 deletions
diff --git a/include/pbl.h b/include/pbl.h index 194d5e7508..f58daec735 100644 --- a/include/pbl.h +++ b/include/pbl.h @@ -34,4 +34,13 @@ ssize_t pbl_fat_load(struct pbl_bio *, const char *filename, void *dest, size_t void fdt_find_mem(const void *fdt, unsigned long *membase, unsigned long *memsize); +struct fdt_device_id { + const char *compatible; + const void *data; +}; + +const void * +fdt_device_get_match_data(const void *fdt, const char *nodepath, + const struct fdt_device_id ids[]); + #endif /* __PBL_H__ */ @@ -68,3 +68,38 @@ err: pr_err("No memory, cannot continue\n"); while (1); } + +const void *fdt_device_get_match_data(const void *fdt, const char *nodepath, + const struct fdt_device_id ids[]) +{ + int node, length; + const char *list, *end; + const struct fdt_device_id *id; + + node = fdt_path_offset(fdt, nodepath); + if (node < 0) + return NULL; + + list = fdt_getprop(fdt, node, "compatible", &length); + if (!list) + return NULL; + + end = list + length; + + while (list < end) { + length = strnlen(list, end - list) + 1; + + /* Abort if the last string isn't properly NUL-terminated. */ + if (list + length > end) + return NULL; + + for (id = ids; id->compatible; id++) { + if (!strcasecmp(list, id->compatible)) + return id->data; + } + + list += length; + } + + return NULL; +} diff --git a/pbl/string.c b/pbl/string.c index e6c0997ebc..e96eb99fc2 100644 --- a/pbl/string.c +++ b/pbl/string.c @@ -7,6 +7,7 @@ #include <linux/types.h> #include <linux/string.h> #include <linux/compiler.h> +#include <linux/ctype.h> void *memcpy(void *__dest, __const void *__src, size_t __n) { @@ -98,6 +99,17 @@ int strcmp(const char *cs, const char *ct) return res; } +int strcasecmp(const char *s1, const char *s2) +{ + int c1, c2; + + do { + c1 = tolower(*s1++); + c2 = tolower(*s2++); + } while (c1 == c2 && c1 != 0); + return c1 - c2; +} + void *memchr(const void *s, int c, size_t count) { const unsigned char *p = s; |