@ -8,7 +8,6 @@
# include <dm.h>
# include <environment.h>
# include <errno.h>
# include <fdtdec.h>
# include <os.h>
# include <serial.h>
# include <stdio_dev.h>
@ -27,11 +26,53 @@ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
# error "Serial is required before relocation - define CONFIG_SYS_MALLOC_F_LEN to make this work"
# endif
static int serial_check_stdout ( const void * blob , struct udevice * * devp )
{
int node ;
/* Check for a chosen console */
node = fdtdec_get_chosen_node ( blob , " stdout-path " ) ;
if ( node < 0 ) {
const char * str , * p , * name ;
/*
* Deal with things like
* stdout - path = " serial0:115200n8 " ;
*
* We need to look up the alias and then follow it to the
* correct node .
*/
str = fdtdec_get_chosen_prop ( blob , " stdout-path " ) ;
if ( str ) {
p = strchr ( str , ' : ' ) ;
name = fdt_get_alias_namelen ( blob , str ,
p ? p - str : strlen ( str ) ) ;
if ( name )
node = fdt_path_offset ( blob , name ) ;
}
}
if ( node < 0 )
node = fdt_path_offset ( blob , " console " ) ;
if ( ! uclass_get_device_by_of_offset ( UCLASS_SERIAL , node , devp ) )
return 0 ;
/*
* If the console is not marked to be bound before relocation , bind it
* anyway .
*/
if ( node > 0 & & ! lists_bind_fdt ( gd - > dm_root , offset_to_ofnode ( node ) ,
devp ) ) {
if ( ! device_probe ( * devp ) )
return 0 ;
}
return - ENODEV ;
}
static void serial_find_console_or_panic ( void )
{
const void * blob = gd - > fdt_blob ;
struct udevice * dev ;
int node ;
if ( CONFIG_IS_ENABLED ( OF_PLATDATA ) ) {
uclass_first_device ( UCLASS_SERIAL , & dev ) ;
@ -40,47 +81,10 @@ static void serial_find_console_or_panic(void)
return ;
}
} else if ( CONFIG_IS_ENABLED ( OF_CONTROL ) & & blob ) {
/* Check for a chosen console */
node = fdtdec_get_chosen_node ( blob , " stdout-path " ) ;
if ( node < 0 ) {
const char * str , * p , * name ;
/*
* Deal with things like
* stdout - path = " serial0:115200n8 " ;
*
* We need to look up the alias and then follow it to
* the correct node .
*/
str = fdtdec_get_chosen_prop ( blob , " stdout-path " ) ;
if ( str ) {
p = strchr ( str , ' : ' ) ;
name = fdt_get_alias_namelen ( blob , str ,
p ? p - str : strlen ( str ) ) ;
if ( name )
node = fdt_path_offset ( blob , name ) ;
}
}
if ( node < 0 )
node = fdt_path_offset ( blob , " console " ) ;
if ( ! uclass_get_device_by_of_offset ( UCLASS_SERIAL , node ,
& dev ) ) {
if ( ! serial_check_stdout ( blob , & dev ) ) {
gd - > cur_serial_dev = dev ;
return ;
}
/*
* If the console is not marked to be bound before relocation ,
* bind it anyway .
*/
if ( node > 0 & &
! lists_bind_fdt ( gd - > dm_root , offset_to_ofnode ( node ) ,
& dev ) ) {
if ( ! device_probe ( dev ) ) {
gd - > cur_serial_dev = dev ;
return ;
}
}
}
if ( ! SPL_BUILD | | ! CONFIG_IS_ENABLED ( OF_CONTROL ) | | ! blob ) {
/*