@ -15,7 +15,10 @@
# include <dm/device.h>
# include <dm/device-internal.h>
# include <dm/lists.h>
# include <dm/of.h>
# include <dm/of_access.h>
# include <dm/platdata.h>
# include <dm/read.h>
# include <dm/root.h>
# include <dm/uclass.h>
# include <dm/util.h>
@ -147,7 +150,7 @@ void fix_devices(void)
# endif
int dm_init ( void )
int dm_init ( bool of_live )
{
int ret ;
@ -167,7 +170,12 @@ int dm_init(void)
if ( ret )
return ret ;
# if CONFIG_IS_ENABLED(OF_CONTROL)
DM_ROOT_NON_CONST - > node = offset_to_ofnode ( 0 ) ;
# if CONFIG_IS_ENABLED(OF_LIVE)
if ( of_live )
DM_ROOT_NON_CONST - > node = np_to_ofnode ( gd - > of_root ) ;
else
# endif
DM_ROOT_NON_CONST - > node = offset_to_ofnode ( 0 ) ;
# endif
ret = device_probe ( DM_ROOT_NON_CONST ) ;
if ( ret )
@ -206,6 +214,36 @@ int dm_scan_platdata(bool pre_reloc_only)
return ret ;
}
# if CONFIG_IS_ENABLED(OF_LIVE)
static int dm_scan_fdt_live ( struct udevice * parent ,
const struct device_node * node_parent ,
bool pre_reloc_only )
{
struct device_node * np ;
int ret = 0 , err ;
for ( np = node_parent - > child ; np ; np = np - > sibling ) {
if ( pre_reloc_only & &
! of_find_property ( np , " u-boot,dm-pre-reloc " , NULL ) )
continue ;
if ( ! of_device_is_available ( np ) ) {
dm_dbg ( " - ignoring disabled device \n " ) ;
continue ;
}
err = lists_bind_fdt ( parent , np_to_ofnode ( np ) , NULL ) ;
if ( err & & ! ret ) {
ret = err ;
debug ( " %s: ret=%d \n " , np - > name , ret ) ;
}
}
if ( ret )
dm_warn ( " Some drivers failed to bind \n " ) ;
return ret ;
}
# endif /* CONFIG_IS_ENABLED(OF_LIVE) */
# if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
/**
* dm_scan_fdt_node ( ) - Scan the device tree and bind drivers for a node
@ -251,15 +289,27 @@ static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
int dm_scan_fdt_dev ( struct udevice * dev )
{
if ( dev_of_offset ( dev ) = = - 1 )
if ( ! dev_of_valid ( dev ) )
return 0 ;
# if CONFIG_IS_ENABLED(OF_LIVE)
if ( of_live_active ( ) )
return dm_scan_fdt_live ( dev , dev_np ( dev ) ,
gd - > flags & GD_FLG_RELOC ? false : true ) ;
else
# endif
return dm_scan_fdt_node ( dev , gd - > fdt_blob , dev_of_offset ( dev ) ,
gd - > flags & GD_FLG_RELOC ? false : true ) ;
}
int dm_scan_fdt ( const void * blob , bool pre_reloc_only )
{
# if CONFIG_IS_ENABLED(OF_LIVE)
if ( of_live_active ( ) )
return dm_scan_fdt_live ( gd - > dm_root , gd - > of_root ,
pre_reloc_only ) ;
else
# endif
return dm_scan_fdt_node ( gd - > dm_root , blob , 0 , pre_reloc_only ) ;
}
# endif
@ -273,7 +323,7 @@ int dm_init_and_scan(bool pre_reloc_only)
{
int ret ;
ret = dm_init ( ) ;
ret = dm_init ( IS_ENABLED ( CONFIG_OF_LIVE ) ) ;
if ( ret ) {
debug ( " dm_init() failed: %d \n " , ret ) ;
return ret ;