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

This commit is contained in:
Wolfgang Denk 2008-10-12 23:13:16 +02:00
commit 72c55878ec
4 changed files with 59 additions and 22 deletions

View File

@ -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

View File

@ -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");

View File

@ -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;

View File

@ -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; const char *q = strchr(path, '/');
int aliasoffset = fdt_path_offset(fdt, "/aliases");
if (aliasoffset < 0)
return -FDT_ERR_BADPATH;
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 (pdepth >= depth) {
if (!name) name = fdt_get_name(fdt, offset, &namelen);
return namelen; if (!name)
if ((p + namelen + 1) <= buflen) { return namelen;
memcpy(buf + p, name, namelen); if ((p + namelen + 1) <= buflen) {
p += namelen; memcpy(buf + p, name, namelen);
buf[p++] = '/'; p += namelen;
pdepth++; 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;
} }
} }