@ -271,3 +271,70 @@ int fdtdec_check_fdt(void)
" binary or define CONFIG_OF_EMBED \n " ) ;
" binary or define CONFIG_OF_EMBED \n " ) ;
return 0 ;
return 0 ;
}
}
int fdtdec_lookup_phandle ( const void * blob , int node , const char * prop_name )
{
const u32 * phandle ;
int lookup ;
phandle = fdt_getprop ( blob , node , prop_name , NULL ) ;
if ( ! phandle )
return - FDT_ERR_NOTFOUND ;
lookup = fdt_node_offset_by_phandle ( blob , fdt32_to_cpu ( * phandle ) ) ;
return lookup ;
}
/**
* Look up a property in a node and check that it has a minimum length .
*
* @ param blob FDT blob
* @ param node node to examine
* @ param prop_name name of property to find
* @ param min_len minimum property length in bytes
* @ param err 0 if ok , or - FDT_ERR_NOTFOUND if the property is not
found , or - FDT_ERR_BADLAYOUT if not enough data
* @ return pointer to cell , which is only valid if err = = 0
*/
static const void * get_prop_check_min_len ( const void * blob , int node ,
const char * prop_name , int min_len , int * err )
{
const void * cell ;
int len ;
debug ( " %s: %s \n " , __func__ , prop_name ) ;
cell = fdt_getprop ( blob , node , prop_name , & len ) ;
if ( ! cell )
* err = - FDT_ERR_NOTFOUND ;
else if ( len < min_len )
* err = - FDT_ERR_BADLAYOUT ;
else
* err = 0 ;
return cell ;
}
int fdtdec_get_int_array ( const void * blob , int node , const char * prop_name ,
u32 * array , int count )
{
const u32 * cell ;
int i , err = 0 ;
debug ( " %s: %s \n " , __func__ , prop_name ) ;
cell = get_prop_check_min_len ( blob , node , prop_name ,
sizeof ( u32 ) * count , & err ) ;
if ( ! err ) {
for ( i = 0 ; i < count ; i + + )
array [ i ] = fdt32_to_cpu ( cell [ i ] ) ;
}
return err ;
}
int fdtdec_get_bool ( const void * blob , int node , const char * prop_name )
{
const s32 * cell ;
int len ;
debug ( " %s: %s \n " , __func__ , prop_name ) ;
cell = fdt_getprop ( blob , node , prop_name , & len ) ;
return cell ! = NULL ;
}