|
@@ -145,17 +145,12 @@ int fdt_path_offset(const void *fdt, const char *path)
|
|
|
|
|
|
/* see if we have an alias */
|
|
|
if (*path != '/') {
|
|
|
- const char *q;
|
|
|
- int aliasoffset = fdt_path_offset(fdt, "/aliases");
|
|
|
-
|
|
|
- if (aliasoffset < 0)
|
|
|
- return -FDT_ERR_BADPATH;
|
|
|
+ const char *q = strchr(path, '/');
|
|
|
|
|
|
- q = strchr(path, '/');
|
|
|
if (!q)
|
|
|
q = end;
|
|
|
|
|
|
- p = fdt_getprop_namelen(fdt, aliasoffset, path, q - p, NULL);
|
|
|
+ p = fdt_get_alias_namelen(fdt, p, q - p);
|
|
|
if (!p)
|
|
|
return -FDT_ERR_BADPATH;
|
|
|
offset = fdt_path_offset(fdt, p);
|
|
@@ -306,6 +301,23 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
|
|
|
return fdt32_to_cpu(*php);
|
|
|
}
|
|
|
|
|
|
+const char *fdt_get_alias_namelen(const void *fdt,
|
|
|
+ const char *name, int namelen)
|
|
|
+{
|
|
|
+ int aliasoffset;
|
|
|
+
|
|
|
+ aliasoffset = fdt_path_offset(fdt, "/aliases");
|
|
|
+ if (aliasoffset < 0)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL);
|
|
|
+}
|
|
|
+
|
|
|
+const char *fdt_get_alias(const void *fdt, const char *name)
|
|
|
+{
|
|
|
+ return fdt_get_alias_namelen(fdt, name, strlen(name));
|
|
|
+}
|
|
|
+
|
|
|
int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
|
|
{
|
|
|
int pdepth = 0, p = 0;
|
|
@@ -320,9 +332,6 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
|
|
for (offset = 0, depth = 0;
|
|
|
(offset >= 0) && (offset <= nodeoffset);
|
|
|
offset = fdt_next_node(fdt, offset, &depth)) {
|
|
|
- if (pdepth < depth)
|
|
|
- continue; /* overflowed buffer */
|
|
|
-
|
|
|
while (pdepth > depth) {
|
|
|
do {
|
|
|
p--;
|
|
@@ -330,14 +339,16 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
|
|
pdepth--;
|
|
|
}
|
|
|
|
|
|
- name = fdt_get_name(fdt, offset, &namelen);
|
|
|
- if (!name)
|
|
|
- return namelen;
|
|
|
- if ((p + namelen + 1) <= buflen) {
|
|
|
- memcpy(buf + p, name, namelen);
|
|
|
- p += namelen;
|
|
|
- buf[p++] = '/';
|
|
|
- pdepth++;
|
|
|
+ if (pdepth >= depth) {
|
|
|
+ name = fdt_get_name(fdt, offset, &namelen);
|
|
|
+ if (!name)
|
|
|
+ return namelen;
|
|
|
+ if ((p + namelen + 1) <= buflen) {
|
|
|
+ memcpy(buf + p, name, namelen);
|
|
|
+ p += namelen;
|
|
|
+ buf[p++] = '/';
|
|
|
+ pdepth++;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (offset == nodeoffset) {
|
|
@@ -347,7 +358,7 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
|
|
if (p > 1) /* special case so that root path is "/", not "" */
|
|
|
p--;
|
|
|
buf[p] = '\0';
|
|
|
- return p;
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
|