@ -121,19 +121,87 @@ struct list_head* stdio_get_list(void)
return & ( devs . list ) ;
}
# ifdef CONFIG_DM_VIDEO
/**
* stdio_probe_device ( ) - Find a device which provides the given stdio device
*
* This looks for a device of the given uclass which provides a particular
* stdio device . It is currently really only useful for UCLASS_VIDEO .
*
* Ultimately we want to be able to probe a device by its stdio name . At
* present devices register in their probe function ( for video devices this
* is done in vidconsole_post_probe ( ) ) and we don ' t know what name they will
* use until they do so .
* TODO ( sjg @ chromium . org ) : We should be able to determine the name before
* probing , and probe the required device .
*
* @ name : stdio device name ( e . g . " vidconsole " )
* id : Uclass ID of device to look for ( e . g . UCLASS_VIDEO )
* @ sdevp : Returns stdout device , if found , else NULL
* @ return 0 if found , - ENOENT if no device found with that name , other - ve
* on other error
*/
static int stdio_probe_device ( const char * name , enum uclass_id id ,
struct stdio_dev * * sdevp )
{
struct stdio_dev * sdev ;
struct udevice * dev ;
int seq , ret ;
* sdevp = NULL ;
seq = trailing_strtoln ( name , NULL ) ;
if ( seq = = - 1 )
ret = uclass_first_device_err ( id , & dev ) ;
else
ret = uclass_get_device_by_seq ( id , seq , & dev ) ;
if ( ret ) {
debug ( " No %s device for seq %d (%s) \n " , uclass_get_name ( id ) ,
seq , name ) ;
return ret ;
}
/* The device should be be the last one registered */
sdev = list_empty ( & devs . list ) ? NULL :
list_last_entry ( & devs . list , struct stdio_dev , list ) ;
if ( ! sdev | | strcmp ( sdev - > name , name ) ) {
debug ( " Device '%s' did not register with stdio as '%s' \n " ,
dev - > name , name ) ;
return - ENOENT ;
}
* sdevp = sdev ;
return 0 ;
}
# endif
struct stdio_dev * stdio_get_by_name ( const char * name )
{
struct list_head * pos ;
struct stdio_dev * dev ;
struct stdio_dev * s dev;
if ( ! name )
return NULL ;
list_for_each ( pos , & ( devs . list ) ) {
dev = list_entry ( pos , struct stdio_dev , list ) ;
if ( strcmp ( dev - > name , name ) = = 0 )
return dev ;
s dev = list_entry ( pos , struct stdio_dev , list ) ;
if ( strcmp ( s dev- > name , name ) = = 0 )
return s dev;
}
# ifdef CONFIG_DM_VIDEO
/*
* We did not find a suitable stdio device . If there is a video
* driver with a name starting with ' vidconsole ' , we can try probing
* that in the hope that it will produce the required stdio device .
*
* This function is sometimes called with the entire value of
* ' stdout ' , which may include a list of devices separate by commas .
* Obviously this is not going to work , so we ignore that case . The
* call path in that case is console_init_r ( ) - > search_device ( ) - >
* stdio_get_by_name ( ) .
*/
if ( ! strncmp ( name , " vidconsole " , 10 ) & & ! strchr ( name , ' , ' ) & &
! stdio_probe_device ( name , UCLASS_VIDEO , & sdev ) )
return sdev ;
# endif
return NULL ;
}
@ -282,6 +350,16 @@ int stdio_add_devices(void)
# endif
# endif
# ifdef CONFIG_DM_VIDEO
/*
* If the console setting is not in environment variables then
* console_init_r ( ) will not be calling iomux_doenv ( ) ( which calls
* search_device ( ) ) . So we will not dynamically add devices by
* calling stdio_probe_device ( ) .
*
* So just probe all video devices now so that whichever one is
* required will be available .
*/
# ifndef CONFIG_SYS_CONSOLE_IS_IN_ENV
struct udevice * vdev ;
# ifndef CONFIG_DM_KEYBOARD
int ret ;
@ -293,6 +371,7 @@ int stdio_add_devices(void)
;
if ( ret )
printf ( " %s: Video device failed (ret=%d) \n " , __func__ , ret ) ;
# endif /* !CONFIG_SYS_CONSOLE_IS_IN_ENV */
# else
# if defined(CONFIG_LCD)
drv_lcd_init ( ) ;