瀏覽代碼

Merge branch 'master' of git://git.denx.de/u-boot-fdt

Wolfgang Denk 16 年之前
父節點
當前提交
72c55878ec
共有 4 個文件被更改,包括 59 次插入22 次删除
  1. 27 1
      include/libfdt.h
  2. 1 1
      lib_ppc/bootm.c
  3. 1 1
      libfdt/fdt.c
  4. 30 19
      libfdt/fdt_ro.c

+ 27 - 1
include/libfdt.h

@@ -122,7 +122,7 @@
 /* Low-level functions (you probably don't need these)                */
 /* Low-level functions (you probably don't need these)                */
 /**********************************************************************/
 /**********************************************************************/
 
 
-const void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
+const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
 static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
 static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
 {
 {
 	return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
 	return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
@@ -458,6 +458,32 @@ static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
  */
  */
 uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
 uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
 
 
+/**
+ * fdt_get_alias_namelen - get alias based on substring
+ * @fdt: pointer to the device tree blob
+ * @name: name of the alias th look up
+ * @namelen: number of characters of name to consider
+ *
+ * Identical to fdt_get_alias(), but only examine the first namelen
+ * characters of name for matching the alias name.
+ */
+const char *fdt_get_alias_namelen(const void *fdt,
+				  const char *name, int namelen);
+
+/**
+ * fdt_get_alias - retreive the path referenced by a given alias
+ * @fdt: pointer to the device tree blob
+ * @name: name of the alias th look up
+ *
+ * fdt_get_alias() retrieves the value of a given alias.  That is, the
+ * value of the property named 'name' in the node /aliases.
+ *
+ * returns:
+ *	a pointer to the expansion of the alias named 'name', of it exists
+ *	NULL, if the given alias or the /aliases node does not exist
+ */
+const char *fdt_get_alias(const void *fdt, const char *name);
+
 /**
 /**
  * fdt_get_path - determine the full path of a node
  * fdt_get_path - determine the full path of a node
  * @fdt: pointer to the device tree blob
  * @fdt: pointer to the device tree blob

+ 1 - 1
lib_ppc/bootm.c

@@ -145,7 +145,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 	 * if the user wants it (the logic is in the subroutines).
 	 * if the user wants it (the logic is in the subroutines).
 	 */
 	 */
 	if (of_size) {
 	if (of_size) {
-		if (fdt_chosen(of_flat_tree, 0) < 0) {
+		if (fdt_chosen(of_flat_tree, 1) < 0) {
 			puts ("ERROR: ");
 			puts ("ERROR: ");
 			puts ("/chosen node create failed");
 			puts ("/chosen node create failed");
 			puts (" - must RESET the board to recover.\n");
 			puts (" - must RESET the board to recover.\n");

+ 1 - 1
libfdt/fdt.c

@@ -78,7 +78,7 @@ int fdt_check_header(const void *fdt)
 	return 0;
 	return 0;
 }
 }
 
 
-const void *fdt_offset_ptr(const void *fdt, int offset, int len)
+const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len)
 {
 {
 	const char *p;
 	const char *p;
 
 

+ 30 - 19
libfdt/fdt_ro.c

@@ -145,17 +145,12 @@ int fdt_path_offset(const void *fdt, const char *path)
 
 
 	/* see if we have an alias */
 	/* see if we have an alias */
 	if (*path != '/') {
 	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)
 		if (!q)
 			q = end;
 			q = end;
 
 
-		p = fdt_getprop_namelen(fdt, aliasoffset, path, q - p, NULL);
+		p = fdt_get_alias_namelen(fdt, p, q - p);
 		if (!p)
 		if (!p)
 			return -FDT_ERR_BADPATH;
 			return -FDT_ERR_BADPATH;
 		offset = fdt_path_offset(fdt, p);
 		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);
 	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 fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
 {
 {
 	int pdepth = 0, p = 0;
 	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;
 	for (offset = 0, depth = 0;
 	     (offset >= 0) && (offset <= nodeoffset);
 	     (offset >= 0) && (offset <= nodeoffset);
 	     offset = fdt_next_node(fdt, offset, &depth)) {
 	     offset = fdt_next_node(fdt, offset, &depth)) {
-		if (pdepth < depth)
-			continue; /* overflowed buffer */
-
 		while (pdepth > depth) {
 		while (pdepth > depth) {
 			do {
 			do {
 				p--;
 				p--;
@@ -330,14 +339,16 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
 			pdepth--;
 			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) {
 		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 "" */
 			if (p > 1) /* special case so that root path is "/", not "" */
 				p--;
 				p--;
 			buf[p] = '\0';
 			buf[p] = '\0';
-			return p;
+			return 0;
 		}
 		}
 	}
 	}