@ -109,8 +109,8 @@ int misc_init_f (void)
int misc_init_r ( void )
{
volatile unsigned char * duart0_mcr = ( unsigned char * ) ( ( ulong ) DUART0_BA + 4 ) ;
volatile unsigned char * duart1_mcr = ( unsigned char * ) ( ( ulong ) DUART1_BA + 4 ) ;
unsigned char * duart0_mcr = ( unsigned char * ) ( ( ulong ) DUART0_BA + 4 ) ;
unsigned char * duart1_mcr = ( unsigned char * ) ( ( ulong ) DUART1_BA + 4 ) ;
unsigned char * dst ;
ulong len = sizeof ( fpgadata ) ;
int status ;
@ -184,16 +184,28 @@ int misc_init_r (void)
/*
* Reset external DUARTs
*/
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) | CFG_DUART_RST ) ;
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) | CFG_DUART_RST ) ; /* set reset to high */
udelay ( 10 ) ; /* wait 10us */
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) & ~ CFG_DUART_RST ) ;
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) & ~ CFG_DUART_RST ) ; /* set reset to low */
udelay ( 1000 ) ; /* wait 1ms */
/*
* Set NAND - FLASH GPIO signals to default
*/
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) & ~ ( CFG_NAND_CLE | CFG_NAND_ALE ) ) ;
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) | CFG_NAND_CE ) ;
/*
* Setup EEPROM write protection
*/
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) | CFG_EEPROM_WP ) ;
out_be32 ( ( void * ) GPIO0_TCR , in_be32 ( ( void * ) GPIO0_TCR ) | CFG_EEPROM_WP ) ;
/*
* Enable interrupts in exar duart mcr [ 3 ]
*/
* duart0_mcr = 0x08 ;
* duart1_mcr = 0x08 ;
out_8 ( duart0_mcr , 0x08 ) ;
out_8 ( duart1_mcr , 0x08 ) ;
return ( 0 ) ;
}
@ -259,3 +271,74 @@ void reset_phy(void)
lxt971_no_sleep ( ) ;
# endif
}
# if defined(CFG_EEPROM_WREN)
/* Input: <dev_addr> I2C address of EEPROM device to enable.
* < state > - 1 : deliver current state
* 0 : disable write
* 1 : enable write
* Returns : - 1 : wrong device address
* 0 : dis - / en - able done
* 0 / 1 : current state if < state > was - 1.
*/
int eeprom_write_enable ( unsigned dev_addr , int state )
{
if ( CFG_I2C_EEPROM_ADDR ! = dev_addr ) {
return - 1 ;
} else {
switch ( state ) {
case 1 :
/* Enable write access, clear bit GPIO0. */
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) & ~ CFG_EEPROM_WP ) ;
state = 0 ;
break ;
case 0 :
/* Disable write access, set bit GPIO0. */
out_be32 ( ( void * ) GPIO0_OR , in_be32 ( ( void * ) GPIO0_OR ) | CFG_EEPROM_WP ) ;
state = 0 ;
break ;
default :
/* Read current status back. */
state = ( 0 = = ( in_be32 ( ( void * ) GPIO0_OR ) & CFG_EEPROM_WP ) ) ;
break ;
}
}
return state ;
}
int do_eep_wren ( cmd_tbl_t * cmdtp , int flag , int argc , char * argv [ ] )
{
int query = argc = = 1 ;
int state = 0 ;
if ( query ) {
/* Query write access state. */
state = eeprom_write_enable ( CFG_I2C_EEPROM_ADDR , - 1 ) ;
if ( state < 0 ) {
puts ( " Query of write access state failed. \n " ) ;
} else {
printf ( " Write access for device 0x%0x is %sabled. \n " ,
CFG_I2C_EEPROM_ADDR , state ? " en " : " dis " ) ;
state = 0 ;
}
} else {
if ( ' 0 ' = = argv [ 1 ] [ 0 ] ) {
/* Disable write access. */
state = eeprom_write_enable ( CFG_I2C_EEPROM_ADDR , 0 ) ;
} else {
/* Enable write access. */
state = eeprom_write_enable ( CFG_I2C_EEPROM_ADDR , 1 ) ;
}
if ( state < 0 ) {
puts ( " Setup of write access state failed. \n " ) ;
}
}
return state ;
}
U_BOOT_CMD ( eepwren , 2 , 0 , do_eep_wren ,
" eepwren - Enable / disable / query EEPROM write access \n " ,
NULL ) ;
# endif /* #if defined(CFG_EEPROM_WREN) */