@ -105,6 +105,40 @@ static void print_chip_data(void)
}
# endif /* CONFIG_SPL_BUILD */
# define AM335X_NAND_ECC_MASK 0x0f
# define AM335X_NAND_ECC_TYPE_16 0x02
static int ecc_type ;
struct am335x_nand_geometry {
u32 magic ;
u8 nand_geo_addr ;
u8 nand_geo_page ;
u8 nand_bus ;
} ;
static int draco_read_nand_geometry ( void )
{
struct am335x_nand_geometry geo ;
/* Read NAND geometry */
if ( i2c_read ( CONFIG_SYS_I2C_EEPROM_ADDR , 0x80 , 2 ,
( uchar * ) & geo , sizeof ( struct am335x_nand_geometry ) ) ) {
printf ( " Could not read the NAND geomtery; something fundamentally wrong on the I2C bus. \n " ) ;
return - EIO ;
}
if ( geo . magic ! = 0xa657b310 ) {
printf ( " %s: bad magic: %x \n " , __func__ , geo . magic ) ;
return - EFAULT ;
}
if ( ( geo . nand_bus & AM335X_NAND_ECC_MASK ) = = AM335X_NAND_ECC_TYPE_16 )
ecc_type = 16 ;
else
ecc_type = 8 ;
return 0 ;
}
/*
* Read header information from EEPROM into global structure .
*/
@ -147,6 +181,8 @@ static int read_eeprom(void)
printf ( " Warning: No chip data in eeprom \n " ) ;
print_ddr3_timings ( ) ;
return draco_read_nand_geometry ( ) ;
# endif
return 0 ;
}
@ -207,7 +243,14 @@ static void spl_siemens_board_init(void)
# ifdef CONFIG_BOARD_LATE_INIT
int board_late_init ( void )
{
omap_nand_switch_ecc ( 1 , 8 ) ;
int ret ;
ret = draco_read_nand_geometry ( ) ;
if ( ret ! = 0 )
return ret ;
nand_curr_device = 0 ;
omap_nand_switch_ecc ( 1 , ecc_type ) ;
# ifdef CONFIG_FACTORYSET
/* Set ASN in environment*/
if ( factory_dat . asn [ 0 ] ! = 0 ) {