@ -10,30 +10,6 @@
# include <asm/io.h>
# include "designware_i2c.h"
static struct i2c_regs * i2c_get_base ( struct i2c_adapter * adap )
{
switch ( adap - > hwadapnr ) {
# if CONFIG_SYS_I2C_BUS_MAX >= 4
case 3 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE3 ;
# endif
# if CONFIG_SYS_I2C_BUS_MAX >= 3
case 2 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE2 ;
# endif
# if CONFIG_SYS_I2C_BUS_MAX >= 2
case 1 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE1 ;
# endif
case 0 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE ;
default :
printf ( " Wrong I2C-adapter number %d \n " , adap - > hwadapnr ) ;
}
return NULL ;
}
static void dw_i2c_enable ( struct i2c_regs * i2c_base , bool enable )
{
u32 ena = enable ? IC_ENABLE_0B : 0 ;
@ -61,10 +37,9 @@ static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
*
* Set the i2c speed .
*/
static unsigned int dw_i2c_set_bus_speed ( struct i2c_adapter * adap ,
unsigned int speed )
static unsigned int __ dw_i2c_set_bus_speed( struct i2c_regs * i2c_base ,
unsigned int speed )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
unsigned int cntl ;
unsigned int hcnt , lcnt ;
int i2c_spd ;
@ -113,47 +88,17 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
/* Enable back i2c now speed set */
dw_i2c_enable ( i2c_base , true ) ;
adap - > speed = speed ;
return 0 ;
}
/*
* i2c_init - Init function
* @ speed : required i2c speed
* @ slaveaddr : slave address for the device
*
* Initialization function .
*/
static void dw_i2c_init ( struct i2c_adapter * adap , int speed ,
int slaveaddr )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
/* Disable i2c */
dw_i2c_enable ( i2c_base , false ) ;
writel ( ( IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM ) , & i2c_base - > ic_con ) ;
writel ( IC_RX_TL , & i2c_base - > ic_rx_tl ) ;
writel ( IC_TX_TL , & i2c_base - > ic_tx_tl ) ;
dw_i2c_set_bus_speed ( adap , speed ) ;
writel ( IC_STOP_DET , & i2c_base - > ic_intr_mask ) ;
writel ( slaveaddr , & i2c_base - > ic_sar ) ;
/* Enable i2c */
dw_i2c_enable ( i2c_base , true ) ;
}
/*
* i2c_setaddress - Sets the target slave address
* @ i2c_addr : target i2c address
*
* Sets the target slave address .
*/
static void i2c_setaddress ( struct i2c_adapter * adap , unsigned int i2c_addr )
static void i2c_setaddress ( struct i2c_regs * i2c_base , unsigned int i2c_addr )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
/* Disable i2c */
dw_i2c_enable ( i2c_base , false ) ;
@ -168,10 +113,8 @@ static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
*
* Flushes the i2c RX FIFO
*/
static void i2c_flush_rxfifo ( struct i2c_adapter * adap )
static void i2c_flush_rxfifo ( struct i2c_regs * i2c_base )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
while ( readl ( & i2c_base - > ic_status ) & IC_STATUS_RFNE )
readl ( & i2c_base - > ic_cmd_data ) ;
}
@ -181,9 +124,8 @@ static void i2c_flush_rxfifo(struct i2c_adapter *adap)
*
* Waits for bus busy
*/
static int i2c_wait_for_bb ( struct i2c_adapter * adap )
static int i2c_wait_for_bb ( struct i2c_regs * i2c_base )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
unsigned long start_time_bb = get_timer ( 0 ) ;
while ( ( readl ( & i2c_base - > ic_status ) & IC_STATUS_MA ) | |
@ -197,15 +139,13 @@ static int i2c_wait_for_bb(struct i2c_adapter *adap)
return 0 ;
}
static int i2c_xfer_init ( struct i2c_adapter * adap , uchar chip , uint addr ,
static int i2c_xfer_init ( struct i2c_regs * i2c_base , uchar chip , uint addr ,
int alen )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
if ( i2c_wait_for_bb ( adap ) )
if ( i2c_wait_for_bb ( i2c_base ) )
return 1 ;
i2c_setaddress ( adap , chip ) ;
i2c_setaddress ( i2c_base , chip ) ;
while ( alen ) {
alen - - ;
/* high byte address going out first */
@ -215,9 +155,8 @@ static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
return 0 ;
}
static int i2c_xfer_finish ( struct i2c_adapter * adap )
static int i2c_xfer_finish ( struct i2c_regs * i2c_base )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
ulong start_stop_det = get_timer ( 0 ) ;
while ( 1 ) {
@ -229,12 +168,12 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
}
}
if ( i2c_wait_for_bb ( adap ) ) {
if ( i2c_wait_for_bb ( i2c_base ) ) {
printf ( " Timed out waiting for bus \n " ) ;
return 1 ;
}
i2c_flush_rxfifo ( adap ) ;
i2c_flush_rxfifo ( i2c_base ) ;
return 0 ;
}
@ -249,10 +188,9 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
*
* Read from i2c memory .
*/
static int dw_i2c_read ( struct i2c_adapter * adap , u8 dev , uint addr ,
int alen , u8 * buffer , int len )
static int __ dw_i2c_read( struct i2c_regs * i2c_base , u8 dev , uint addr ,
int alen , u8 * buffer , int len )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
unsigned long start_time_rx ;
# ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
@ -274,7 +212,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
addr ) ;
# endif
if ( i2c_xfer_init ( adap , dev , addr , alen ) )
if ( i2c_xfer_init ( i2c_base , dev , addr , alen ) )
return 1 ;
start_time_rx = get_timer ( 0 ) ;
@ -294,7 +232,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
}
}
return i2c_xfer_finish ( adap ) ;
return i2c_xfer_finish ( i2c_base ) ;
}
/*
@ -307,10 +245,9 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
*
* Write to i2c memory .
*/
static int dw_i2c_write ( struct i2c_adapter * adap , u8 dev , uint addr ,
int alen , u8 * buffer , int len )
static int __ dw_i2c_write( struct i2c_regs * i2c_base , u8 dev , uint addr ,
int alen , u8 * buffer , int len )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
int nb = len ;
unsigned long start_time_tx ;
@ -333,7 +270,7 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
addr ) ;
# endif
if ( i2c_xfer_init ( adap , dev , addr , alen ) )
if ( i2c_xfer_init ( i2c_base , dev , addr , alen ) )
return 1 ;
start_time_tx = get_timer ( 0 ) ;
@ -354,7 +291,76 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
}
}
return i2c_xfer_finish ( adap ) ;
return i2c_xfer_finish ( i2c_base ) ;
}
static struct i2c_regs * i2c_get_base ( struct i2c_adapter * adap )
{
switch ( adap - > hwadapnr ) {
# if CONFIG_SYS_I2C_BUS_MAX >= 4
case 3 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE3 ;
# endif
# if CONFIG_SYS_I2C_BUS_MAX >= 3
case 2 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE2 ;
# endif
# if CONFIG_SYS_I2C_BUS_MAX >= 2
case 1 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE1 ;
# endif
case 0 :
return ( struct i2c_regs * ) CONFIG_SYS_I2C_BASE ;
default :
printf ( " Wrong I2C-adapter number %d \n " , adap - > hwadapnr ) ;
}
return NULL ;
}
static unsigned int dw_i2c_set_bus_speed ( struct i2c_adapter * adap ,
unsigned int speed )
{
adap - > speed = speed ;
return __dw_i2c_set_bus_speed ( i2c_get_base ( adap ) , speed ) ;
}
/*
* i2c_init - Init function
* @ speed : required i2c speed
* @ slaveaddr : slave address for the device
*
* Initialization function .
*/
static void dw_i2c_init ( struct i2c_adapter * adap , int speed ,
int slaveaddr )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
/* Disable i2c */
dw_i2c_enable ( i2c_base , false ) ;
writel ( ( IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM ) , & i2c_base - > ic_con ) ;
writel ( IC_RX_TL , & i2c_base - > ic_rx_tl ) ;
writel ( IC_TX_TL , & i2c_base - > ic_tx_tl ) ;
dw_i2c_set_bus_speed ( adap , speed ) ;
writel ( IC_STOP_DET , & i2c_base - > ic_intr_mask ) ;
writel ( slaveaddr , & i2c_base - > ic_sar ) ;
/* Enable i2c */
dw_i2c_enable ( i2c_base , true ) ;
}
static int dw_i2c_read ( struct i2c_adapter * adap , u8 dev , uint addr ,
int alen , u8 * buffer , int len )
{
return __dw_i2c_read ( i2c_get_base ( adap ) , dev , addr , alen , buffer , len ) ;
}
static int dw_i2c_write ( struct i2c_adapter * adap , u8 dev , uint addr ,
int alen , u8 * buffer , int len )
{
return __dw_i2c_write ( i2c_get_base ( adap ) , dev , addr , alen , buffer , len ) ;
}
/*
@ -362,13 +368,14 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
*/
static int dw_i2c_probe ( struct i2c_adapter * adap , u8 dev )
{
struct i2c_regs * i2c_base = i2c_get_base ( adap ) ;
u32 tmp ;
int ret ;
/*
* Try to read the first location of the chip .
*/
ret = dw_i2c_read ( adap , dev , 0 , 1 , ( uchar * ) & tmp , 1 ) ;
ret = __ dw_i2c_read( i2c_base , dev , 0 , 1 , ( uchar * ) & tmp , 1 ) ;
if ( ret )
dw_i2c_init ( adap , adap - > speed , adap - > slaveaddr ) ;