@ -35,25 +35,18 @@
# if defined(CONFIG_OF_LIBFDT)
# include <libfdt.h>
# include <libfdt_env.h>
# include <fdt_support.h>
DECLARE_GLOBAL_DATA_PTR ;
static void do_fixup ( void * fdt , const char * node , const char * prop ,
const void * val , int len , int create )
{
# if defined(DEBUG)
int i ;
debug ( " Updating property '%s/%s' = " , node , prop ) ;
for ( i = 0 ; i < len ; i + + )
debug ( " %.2x " , * ( u8 * ) ( val + i ) ) ;
debug ( " (%d) \n " , * ( u32 * ) val ) ;
# endif
int rc = fdt_find_and_setprop ( fdt , node , prop , val , len , create ) ;
if ( rc )
printf ( " Unable to update property %s:%s, err=%s \n " ,
node , prop , fdt_strerror ( rc ) ) ;
}
/*
* The aliases needed for this generic etherne MAC address
* fixup function are not in place yet . So don ' t use this
* approach for now . This will be enabled later .
*/
# undef USES_FDT_ALIASES
# ifndef USES_FDT_ALIASES
static void do_fixup_macaddr ( void * fdt , int offset , const void * val , int i )
{
int rc ;
@ -69,87 +62,47 @@ static void do_fixup_macaddr(void *fdt, int offset, const void *val, int i)
printf ( " Unable to update property %s, err=%s \n " ,
" local-mac-address " , fdt_strerror ( rc ) ) ;
}
static void do_fixup_u32 ( void * fdt , const char * node , const char * prop ,
u32 val , int create )
{
val = cpu_to_fdt32 ( val ) ;
do_fixup ( fdt , node , prop , & val , sizeof ( val ) , create ) ;
}
static void do_fixup_uart ( void * fdt , int offset , int i , bd_t * bd )
{
int rc ;
u32 val ;
PPC4xx_SYS_INFO sys_info ;
get_sys_info ( & sys_info ) ;
debug ( " Updating node UART%d: clock-frequency=%d \n " , i , gd - > uart_clk ) ;
val = cpu_to_fdt32 ( gd - > uart_clk ) ;
rc = fdt_setprop ( fdt , offset , " clock-frequency " , & val , 4 ) ;
if ( rc )
printf ( " Unable to update node UART, err=%s \n " , fdt_strerror ( rc ) ) ;
val = cpu_to_fdt32 ( bd - > bi_baudrate ) ;
rc = fdt_setprop ( fdt , offset , " current-speed " , & val , 4 ) ;
if ( rc )
printf ( " Unable to update node UART, err=%s \n " , fdt_strerror ( rc ) ) ;
}
# endif /* USES_FDT_ALIASES */
void ft_cpu_setup ( void * blob , bd_t * bd )
{
char * cpu_path = " /cpus/ " OF_CPU ;
char * cpu_path = " /cpus/ " OF_CPU ;
sys_info_t sys_info ;
int offset ;
int i ;
int tmp [ 2 ] ;
get_sys_info ( & sys_info ) ;
get_sys_info ( & sys_info ) ;
do_fixup_u32 ( blob , cpu_path , " timebase-frequency " , bd - > bi_intfreq , 1 ) ;
do_fixup_u32 ( blob , cpu_path , " clock-frequency " , bd - > bi_intfreq , 1 ) ;
do_fixup_u32 ( blob , " /plb " , " clock-frequency " , sys_info . freqPLB , 1 ) ;
do_fixup_u32 ( blob , " /plb/opb " , " clock-frequency " , sys_info . freqOPB , 1 ) ;
do_fixup_u32 ( blob , " /plb/opb/ebc " , " clock-frequency " , sys_info . freqEBC , 1 ) ;
/* update, or add and update /memory node */
offset = fdt_find_node_by_path ( blob , " /memory " ) ;
if ( offset < 0 ) {
offset = fdt_add_subnode ( blob , 0 , " memory " ) ;
if ( offset < 0 )
debug ( " failed to add /memory node: %s \n " ,
fdt_strerror ( offset ) ) ;
}
if ( offset > = 0 ) {
fdt_setprop ( blob , offset , " device_type " ,
" memory " , sizeof ( " memory " ) ) ;
tmp [ 0 ] = cpu_to_fdt32 ( bd - > bi_memstart ) ;
tmp [ 1 ] = cpu_to_fdt32 ( bd - > bi_memsize ) ;
fdt_setprop ( blob , offset , " reg " , tmp , sizeof ( tmp ) ) ;
debug ( " Updating /memory node to %d:%d \n " ,
bd - > bi_memstart , bd - > bi_memsize ) ;
}
do_fixup_by_path_u32 ( blob , cpu_path , " timebase-frequency " , bd - > bi_intfreq , 1 ) ;
do_fixup_by_path_u32 ( blob , cpu_path , " clock-frequency " , bd - > bi_intfreq , 1 ) ;
do_fixup_by_path_u32 ( blob , " /plb " , " clock-frequency " , sys_info . freqPLB , 1 ) ;
do_fixup_by_path_u32 ( blob , " /plb/opb " , " clock-frequency " , sys_info . freqOPB , 1 ) ;
do_fixup_by_path_u32 ( blob , " /plb/opb/ebc " , " clock-frequency " ,
sys_info . freqEBC , 1 ) ;
fdt_fixup_memory ( blob , ( u64 ) bd - > bi_memstart , ( u64 ) bd - > bi_memsize ) ;
/*
* Setup all baudrates for the UARTs
*/
offset = 0 ;
for ( i = 0 ; i < 4 ; i + + ) {
offset = fdt_find_node_by_type ( blob , offset , " serial " ) ;
if ( offset < 0 )
break ;
do_fixup_uart ( blob , offset , i , bd ) ;
}
do_fixup_by_compat_u32 ( blob , " ns16550 " , " clock-frequency " , gd - > uart_clk , 1 ) ;
# ifdef USES_FDT_ALIASES
/*
* Setup all MAC addresses in fdt
* The aliases needed for this generic etherne MAC address
* fixup function are not in place yet . So don ' t use this
* approach for now . This will be enabled later .
*/
offset = 0 ;
fdt_fixup_ethernet ( blob , bd ) ;
# else
offset = - 1 ;
for ( i = 0 ; i < 4 ; i + + ) {
offset = fdt_find_node_by_type ( blob , offset , " network " ) ;
/*
* FIXME : This will cause problems with emac3 compatible
* devices , like on 405 GP . But hopefully when we deal
* with those devices , the aliases stuff will be in
* place .
*/
offset = fdt_node_offset_by_compatible ( blob , offset , " ibm,emac4 " ) ;
if ( offset < 0 )
break ;
@ -174,5 +127,6 @@ void ft_cpu_setup(void *blob, bd_t *bd)
# endif
}
}
# endif /* USES_FDT_ALIASES */
}
# endif /* CONFIG_OF_LIBFDT */