@ -48,7 +48,13 @@ static struct sh_i2c *base;
# define SH_IC_WAIT (1 << 1)
# define SH_IC_DTE (1 << 0)
static u8 iccl , icch ;
# ifdef CONFIG_SH_I2C_8BIT
/* store 8th bit of iccl and icch in ICIC register */
# define SH_I2C_ICIC_ICCLB8 (1 << 7)
# define SH_I2C_ICIC_ICCHB8 (1 << 6)
# endif
static u16 iccl , icch ;
# define IRQ_WAIT 1000
@ -76,12 +82,20 @@ static void irq_busy(struct sh_i2c *base)
static void i2c_set_addr ( struct sh_i2c * base , u8 id , u8 reg , int stop )
{
u8 icic = 0 ;
writeb ( readb ( & base - > iccr ) & ~ SH_I2C_ICCR_ICE , & base - > iccr ) ;
writeb ( readb ( & base - > iccr ) | SH_I2C_ICCR_ICE , & base - > iccr ) ;
writeb ( iccl , & base - > iccl ) ;
writeb ( icch , & base - > icch ) ;
writeb ( 0 , & base - > icic ) ;
writeb ( iccl & 0xff , & base - > iccl ) ;
writeb ( icch & 0xff , & base - > icch ) ;
# ifdef CONFIG_SH_I2C_8BIT
if ( iccl > 0xff )
icic | = SH_I2C_ICIC_ICCLB8 ;
if ( icch > 0xff )
icic | = SH_I2C_ICIC_ICCHB8 ;
# endif
writeb ( icic , & base - > icic ) ;
writeb ( ( SH_I2C_ICCR_ICE | SH_I2C_ICCR_RTS | SH_I2C_ICCR_BUSY ) , & base - > iccr ) ;
irq_dte ( base ) ;
@ -206,18 +220,18 @@ void i2c_init(int speed, int slaveaddr)
denom = speed * ( CONFIG_SH_I2C_DATA_HIGH + CONFIG_SH_I2C_DATA_LOW ) ;
tmp = num * 10 / denom ;
if ( tmp % 10 > = 5 )
iccl = ( u8 ) ( ( num / denom ) + 1 ) ;
iccl = ( u16 ) ( ( num / denom ) + 1 ) ;
else
iccl = ( u8 ) ( num / denom ) ;
iccl = ( u16 ) ( num / denom ) ;
/* Calculate the value for icch. From the data sheet:
icch = ( p clock / transfer rate ) * ( H / ( L + H ) ) */
num = CONFIG_SH_I2C_CLOCK * CONFIG_SH_I2C_DATA_HIGH ;
tmp = num * 10 / denom ;
if ( tmp % 10 > = 5 )
icch = ( u8 ) ( ( num / denom ) + 1 ) ;
icch = ( u16 ) ( ( num / denom ) + 1 ) ;
else
icch = ( u8 ) ( num / denom ) ;
icch = ( u16 ) ( num / denom ) ;
}
/*