mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-09 03:58:18 -04:00
Merge branch 'master' of git://git.denx.de/u-boot-fdt
This commit is contained in:
commit
72c55878ec
@ -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
|
||||||
|
@ -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");
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user