@ -83,118 +83,6 @@ char *fdt_string(const void *fdt, int stroffset)
}
/*
* Check if the specified node is compatible by comparing the tokens
* in its " compatible " property with the specified string :
*
* nodeoffset - starting place of the node
* compat - the string to match to one of the tokens in the
* " compatible " list .
*/
int fdt_node_is_compatible ( const void * fdt , int nodeoffset ,
const char * compat )
{
const char * cp ;
int cplen , len ;
cp = fdt_getprop ( fdt , nodeoffset , " compatible " , & cplen ) ;
if ( cp = = NULL )
return 0 ;
while ( cplen > 0 ) {
if ( strncmp ( cp , compat , strlen ( compat ) ) = = 0 )
return 1 ;
len = strlen ( cp ) + 1 ;
cp + = len ;
cplen - = len ;
}
return 0 ;
}
/*
* Find a node by its device type property . On success , the offset of that
* node is returned or an error code otherwise :
*
* nodeoffset - the node to start searching from or 0 , the node you pass
* will not be searched , only the next one will ; typically ,
* you pass 0 to start the search and then what the previous
* call returned .
* type - the device type string to match against .
*/
int fdt_find_node_by_type ( const void * fdt , int nodeoffset , const char * type )
{
int offset , nextoffset ;
struct fdt_property * prop ;
uint32_t tag ;
int len , ret ;
CHECK_HEADER ( fdt ) ;
tag = fdt_next_tag ( fdt , nodeoffset , & nextoffset , NULL ) ;
if ( tag ! = FDT_BEGIN_NODE )
return - FDT_ERR_BADOFFSET ;
if ( nodeoffset )
nodeoffset = 0 ; /* start searching with next node */
while ( 1 ) {
offset = nextoffset ;
tag = fdt_next_tag ( fdt , offset , & nextoffset , NULL ) ;
switch ( tag ) {
case FDT_BEGIN_NODE :
nodeoffset = offset ;
break ;
case FDT_PROP :
if ( nodeoffset = = 0 )
break ;
ret = prop_name_eq ( fdt , offset , " device_type " ,
& prop , & len ) ;
if ( ret < 0 )
return ret ;
else if ( ret > 0 & &
strncmp ( prop - > data , type , len - 1 ) = = 0 )
return nodeoffset ;
break ;
case FDT_END_NODE :
case FDT_NOP :
break ;
case FDT_END :
return - FDT_ERR_NOTFOUND ;
default :
return - FDT_ERR_BADSTRUCTURE ;
}
}
}
/*
* Find a node based on its device type and one of the tokens in its its
* " compatible " property . On success , the offset of that node is returned
* or an error code otherwise :
*
* nodeoffset - the node to start searching from or 0 , the node you pass
* will not be searched , only the next one will ; typically ,
* you pass 0 to start the search and then what the previous
* call returned .
* type - the device type string to match against .
* compat - the string to match to one of the tokens in the
* " compatible " list .
*/
int fdt_find_compatible_node ( const void * fdt , int nodeoffset ,
const char * type , const char * compat )
{
int offset ;
offset = fdt_find_node_by_type ( fdt , nodeoffset , type ) ;
if ( offset < 0 | | fdt_node_is_compatible ( fdt , offset , compat ) )
return offset ;
return - FDT_ERR_NOTFOUND ;
}
/*
* Return the node offset of the node specified by :
* parentoffset - starting place ( 0 to start at the root )
* name - name being searched for