@ -1,4 +1,8 @@
/*
/*
* ( C ) Copyright 2009
* Heiko Schocher , DENX Software Engineering , hs @ denx . de .
* Changes for multibus / multiadapter I2C support .
*
* ( C ) Copyright 2001 , 2002
* ( C ) Copyright 2001 , 2002
* Wolfgang Denk , DENX Software Engineering , wd @ denx . de .
* Wolfgang Denk , DENX Software Engineering , wd @ denx . de .
*
*
@ -103,14 +107,30 @@
/* #define DEBUG_I2C */
/* #define DEBUG_I2C */
# ifdef DEBUG_I2C
DECLARE_GLOBAL_DATA_PTR ;
DECLARE_GLOBAL_DATA_PTR ;
# ifndef I2C_SOFT_DECLARATIONS
# if defined(CONFIG_MPC8260)
# define I2C_SOFT_DECLARATIONS volatile ioport_t *iop = \
ioport_addr ( ( immap_t * ) CONFIG_SYS_IMMR , I2C_PORT ) ;
# elif defined(CONFIG_8xx)
# define I2C_SOFT_DECLARATIONS volatile immap_t *immr = \
( immap_t * ) CONFIG_SYS_IMMR ;
# else
# define I2C_SOFT_DECLARATIONS
# endif
# endif
# if !defined(CONFIG_SYS_SOFT_I2C_SPEED)
# define CONFIG_SYS_SOFT_I2C_SPEED CONFIG_SYS_I2C_SPEED
# endif
# if !defined(CONFIG_SYS_SOFT_I2C_SLAVE)
# define CONFIG_SYS_SOFT_I2C_SLAVE CONFIG_SYS_I2C_SLAVE
# endif
# endif
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
* Definitions
* Definitions
*/
*/
# define RETRIES 0
# define RETRIES 0
# define I2C_ACK 0 /* PD_SDA level to ack a byte */
# define I2C_ACK 0 /* PD_SDA level to ack a byte */
@ -125,10 +145,6 @@ DECLARE_GLOBAL_DATA_PTR;
# define PRINTD(fmt,args...)
# define PRINTD(fmt,args...)
# endif
# endif
# if defined(CONFIG_I2C_MULTI_BUS)
static unsigned int i2c_bus_num __attribute__ ( ( section ( " .data " ) ) ) = 0 ;
# endif /* CONFIG_I2C_MULTI_BUS */
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
* Local functions
* Local functions
*/
*/
@ -267,39 +283,6 @@ static int write_byte(uchar data)
return ( nack ) ; /* not a nack is an ack */
return ( nack ) ; /* not a nack is an ack */
}
}
# if defined(CONFIG_I2C_MULTI_BUS)
/*
* Functions for multiple I2C bus handling
*/
unsigned int i2c_get_bus_num ( void )
{
return i2c_bus_num ;
}
int i2c_set_bus_num ( unsigned int bus )
{
# if defined(CONFIG_I2C_MUX)
if ( bus < CONFIG_SYS_MAX_I2C_BUS ) {
i2c_bus_num = bus ;
} else {
int ret ;
ret = i2x_mux_select_mux ( bus ) ;
i2c_init_board ( ) ;
if ( ret = = 0 )
i2c_bus_num = bus ;
else
return ret ;
}
# else
if ( bus > = CONFIG_SYS_MAX_I2C_BUS )
return - 1 ;
i2c_bus_num = bus ;
# endif
return 0 ;
}
# endif
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
* if ack = = I2C_ACK , ACK the byte so can continue reading , else
* if ack = = I2C_ACK , ACK the byte so can continue reading , else
* send I2C_NOACK to end the read .
* send I2C_NOACK to end the read .
@ -330,14 +313,10 @@ static uchar read_byte(int ack)
return ( data ) ;
return ( data ) ;
}
}
/*=====================================================================*/
/* Public Functions */
/*=====================================================================*/
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
* Initialization
* Initialization
*/
*/
void i2c_init ( int speed , int slaveaddr )
static void soft_i2c_init ( struct i2c_adapter * adap , int speed , int slaveaddr )
{
{
# if defined(CONFIG_SYS_I2C_INIT_BOARD)
# if defined(CONFIG_SYS_I2C_INIT_BOARD)
/* call board specific i2c bus reset routine before accessing the */
/* call board specific i2c bus reset routine before accessing the */
@ -360,7 +339,7 @@ void i2c_init (int speed, int slaveaddr)
* completion of EEPROM writes since the chip stops responding until
* completion of EEPROM writes since the chip stops responding until
* the write completes ( typically 10 mSec ) .
* the write completes ( typically 10 mSec ) .
*/
*/
int i2c_probe ( uchar addr )
static int soft_ i2c_probe( struct i2c_adapter * adap , uint8_t addr )
{
{
int rc ;
int rc ;
@ -378,7 +357,8 @@ int i2c_probe(uchar addr)
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
* Read bytes
* Read bytes
*/
*/
int i2c_read ( uchar chip , uint addr , int alen , uchar * buffer , int len )
static int soft_i2c_read ( struct i2c_adapter * adap , uchar chip , uint addr ,
int alen , uchar * buffer , int len )
{
{
int shift ;
int shift ;
PRINTD ( " i2c_read: chip %02X addr %02X alen %d buffer %p len %d \n " ,
PRINTD ( " i2c_read: chip %02X addr %02X alen %d buffer %p len %d \n " ,
@ -452,7 +432,8 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
* Write bytes
* Write bytes
*/
*/
int i2c_write ( uchar chip , uint addr , int alen , uchar * buffer , int len )
static int soft_i2c_write ( struct i2c_adapter * adap , uchar chip , uint addr ,
int alen , uchar * buffer , int len )
{
{
int shift , failures = 0 ;
int shift , failures = 0 ;
@ -482,3 +463,32 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
send_stop ( ) ;
send_stop ( ) ;
return ( failures ) ;
return ( failures ) ;
}
}
/*
* Register soft i2c adapters
*/
U_BOOT_I2C_ADAP_COMPLETE ( soft0 , soft_i2c_init , soft_i2c_probe ,
soft_i2c_read , soft_i2c_write , NULL ,
CONFIG_SYS_I2C_SOFT_SPEED , CONFIG_SYS_I2C_SOFT_SLAVE ,
0 )
# if defined(I2C_SOFT_DECLARATIONS2)
U_BOOT_I2C_ADAP_COMPLETE ( soft1 , soft_i2c_init , soft_i2c_probe ,
soft_i2c_read , soft_i2c_write , NULL ,
CONFIG_SYS_I2C_SOFT_SPEED_2 ,
CONFIG_SYS_I2C_SOFT_SLAVE_2 ,
1 )
# endif
# if defined(I2C_SOFT_DECLARATIONS3)
U_BOOT_I2C_ADAP_COMPLETE ( soft2 , soft_i2c_init , soft_i2c_probe ,
soft_i2c_read , soft_i2c_write , NULL ,
CONFIG_SYS_I2C_SOFT_SPEED_3 ,
CONFIG_SYS_I2C_SOFT_SLAVE_3 ,
2 )
# endif
# if defined(I2C_SOFT_DECLARATIONS4)
U_BOOT_I2C_ADAP_COMPLETE ( soft3 , soft_i2c_init , soft_i2c_probe ,
soft_i2c_read , soft_i2c_write , NULL ,
CONFIG_SYS_I2C_SOFT_SPEED_4 ,
CONFIG_SYS_I2C_SOFT_SLAVE_4 ,
3 )
# endif