@ -64,6 +64,23 @@ static enum env_location env_locations[] = {
static enum env_location env_load_location = ENVL_UNKNOWN ;
static bool env_has_inited ( enum env_location location )
{
return gd - > env_has_init & BIT ( location ) ;
}
static void env_set_inited ( enum env_location location )
{
/*
* We ' re using a 32 - bits bitmask stored in gd ( env_has_init )
* using the above enum value as the bit index . We need to
* make sure that we ' re not overflowing it .
*/
BUILD_BUG_ON ( ARRAY_SIZE ( env_locations ) > BITS_PER_LONG ) ;
gd - > env_has_init | = BIT ( location ) ;
}
/**
* env_get_location ( ) - Returns the best env location for a board
* @ op : operations performed on the environment
@ -145,6 +162,9 @@ int env_get_char(int index)
if ( ! drv - > get_char )
continue ;
if ( ! env_has_inited ( drv - > location ) )
continue ;
ret = drv - > get_char ( index ) ;
if ( ! ret )
return 0 ;
@ -167,6 +187,9 @@ int env_load(void)
if ( ! drv - > load )
continue ;
if ( ! env_has_inited ( drv - > location ) )
continue ;
printf ( " Loading Environment from %s... " , drv - > name ) ;
ret = drv - > load ( ) ;
if ( ret )
@ -192,6 +215,9 @@ int env_save(void)
if ( ! drv - > save )
continue ;
if ( ! env_has_inited ( drv - > location ) )
continue ;
printf ( " Saving Environment to %s... " , drv - > name ) ;
ret = drv - > save ( ) ;
if ( ret )
@ -213,14 +239,10 @@ int env_init(void)
int prio ;
for ( prio = 0 ; ( drv = env_driver_lookup ( ENVOP_INIT , prio ) ) ; prio + + ) {
if ( ! drv - > init )
continue ;
ret = drv - > init ( ) ;
if ( ! ret )
return 0 ;
if ( ! drv - > init | | ! ( ret = drv - > init ( ) ) )
env_set_inited ( drv - > location ) ;
debug ( " %s: Environment %s failed to init (err =%d) \n " , __func__ ,
debug ( " %s: Environment %s init done (ret=%d) \n " , __func__ ,
drv - > name , ret ) ;
}