@ -29,11 +29,25 @@ static struct mxs_i2c_regs *mxs_i2c_get_base(struct i2c_adapter *adap)
return ( struct mxs_i2c_regs * ) MXS_I2C0_BASE ;
}
static unsigned int mxs_i2c_get_bus_speed ( void )
{
struct mxs_i2c_regs * i2c_regs = mxs_i2c_get_base ( NULL ) ;
uint32_t clk = mxc_get_clock ( MXC_XTAL_CLK ) ;
uint32_t timing0 ;
timing0 = readl ( & i2c_regs - > hw_i2c_timing0 ) ;
/*
* This is a reverse version of the algorithm presented in
* i2c_set_bus_speed ( ) . Please refer there for details .
*/
return clk / ( ( ( ( timing0 > > 16 ) - 3 ) * 2 ) + 38 ) ;
}
static void mxs_i2c_reset ( void )
{
struct mxs_i2c_regs * i2c_regs = mxs_i2c_get_base ( NULL ) ;
int ret ;
int speed = i2c_get_bus_speed ( ) ;
int speed = mxs_ i2c_get_bus_speed( ) ;
ret = mxs_reset_block ( & i2c_regs - > hw_i2c_ctrl0_reg ) ;
if ( ret ) {
@ -165,7 +179,9 @@ err:
return 1 ;
}
int i2c_read ( uchar chip , uint addr , int alen , uchar * buffer , int len )
static int mxs_i2c_if_read ( struct i2c_adapter * adap , uint8_t chip ,
uint addr , int alen , uint8_t * buffer ,
int len )
{
struct mxs_i2c_regs * i2c_regs = mxs_i2c_get_base ( NULL ) ;
uint32_t tmp = 0 ;
@ -214,7 +230,9 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
return 0 ;
}
int i2c_write ( uchar chip , uint addr , int alen , uchar * buffer , int len )
static int mxs_i2c_if_write ( struct i2c_adapter * adap , uint8_t chip ,
uint addr , int alen , uint8_t * buffer ,
int len )
{
int ret ;
ret = mxs_i2c_write ( chip , addr , alen , buffer , len , 1 ) ;
@ -230,7 +248,7 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
return ret ;
}
int i2c_probe ( uchar chip )
static int mxs_ i2c_probe( struct i2c_adapter * adap , uint8_t chip )
{
int ret ;
ret = mxs_i2c_write ( chip , 0 , 1 , NULL , 0 , 1 ) ;
@ -240,7 +258,7 @@ int i2c_probe(uchar chip)
return ret ;
}
int i2c_set_bus_speed ( unsigned int speed )
static u int mxs_ i2c_set_bus_speed( struct i2c_adapter * adap , u int speed )
{
struct mxs_i2c_regs * i2c_regs = mxs_i2c_get_base ( NULL ) ;
/*
@ -281,24 +299,15 @@ int i2c_set_bus_speed(unsigned int speed)
return 0 ;
}
unsigned int i2c_get_bus_speed ( void )
{
struct mxs_i2c_regs * i2c_regs = mxs_i2c_get_base ( NULL ) ;
uint32_t clk = mxc_get_clock ( MXC_XTAL_CLK ) ;
uint32_t timing0 ;
timing0 = readl ( & i2c_regs - > hw_i2c_timing0 ) ;
/*
* This is a reverse version of the algorithm presented in
* i2c_set_bus_speed ( ) . Please refer there for details .
*/
return clk / ( ( ( ( timing0 > > 16 ) - 3 ) * 2 ) + 38 ) ;
}
void i2c_init ( int speed , int slaveadd )
static void mxs_i2c_init ( struct i2c_adapter * adap , int speed , int slaveaddr )
{
mxs_i2c_reset ( ) ;
i2c_set_bus_speed ( speed ) ;
return ;
}
U_BOOT_I2C_ADAP_COMPLETE ( mxs0 , mxs_i2c_init , mxs_i2c_probe ,
mxs_i2c_if_read , mxs_i2c_if_write ,
mxs_i2c_set_bus_speed ,
CONFIG_SYS_I2C_SPEED , 0 , 0 )