@ -40,8 +40,8 @@ typedef struct IMXI2C {
static void imx_i2c_set_slave_addr ( IMXI2C * s , uint8_t addr ,
enum IMXI2CDirection direction )
{
writeb ( s - > addr + I2DR_ADDR , ( addr < < 1 ) |
( direction = = IMX_I2C_READ ? 1 : 0 ) ) ;
qtest_ writeb( s - > parent . qts , s - > addr + I2DR_ADDR ,
( addr < < 1 ) | ( direction = = IMX_I2C_READ ? 1 : 0 ) ) ;
}
static void imx_i2c_send ( I2CAdapter * i2c , uint8_t addr ,
@ -63,35 +63,35 @@ static void imx_i2c_send(I2CAdapter *i2c, uint8_t addr,
I2CR_MTX |
I2CR_TXAK ;
writeb ( s - > addr + I2CR_ADDR , data ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2CR_ADDR , data ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) ! = 0 ) ;
/* set the slave address */
imx_i2c_set_slave_addr ( s , addr , IMX_I2C_WRITE ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) ! = 0 ) ;
g_assert ( ( status & I2SR_RXAK ) = = 0 ) ;
/* ack the interrupt */
writeb ( s - > addr + I2SR_ADDR , 0 ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2SR_ADDR , 0 ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) = = 0 ) ;
while ( size < len ) {
/* check we are still busy */
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) ! = 0 ) ;
/* write the data */
writeb ( s - > addr + I2DR_ADDR , buf [ size ] ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2DR_ADDR , buf [ size ] ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) ! = 0 ) ;
g_assert ( ( status & I2SR_RXAK ) = = 0 ) ;
/* ack the interrupt */
writeb ( s - > addr + I2SR_ADDR , 0 ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2SR_ADDR , 0 ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) = = 0 ) ;
size + + ;
@ -99,8 +99,8 @@ static void imx_i2c_send(I2CAdapter *i2c, uint8_t addr,
/* release the bus */
data & = ~ ( I2CR_MSTA | I2CR_MTX ) ;
writeb ( s - > addr + I2CR_ADDR , data ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2CR_ADDR , data ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) = = 0 ) ;
}
@ -123,19 +123,19 @@ static void imx_i2c_recv(I2CAdapter *i2c, uint8_t addr,
I2CR_MTX |
I2CR_TXAK ;
writeb ( s - > addr + I2CR_ADDR , data ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2CR_ADDR , data ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) ! = 0 ) ;
/* set the slave address */
imx_i2c_set_slave_addr ( s , addr , IMX_I2C_READ ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) ! = 0 ) ;
g_assert ( ( status & I2SR_RXAK ) = = 0 ) ;
/* ack the interrupt */
writeb ( s - > addr + I2SR_ADDR , 0 ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2SR_ADDR , 0 ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) = = 0 ) ;
/* set the bus for read */
@ -144,23 +144,23 @@ static void imx_i2c_recv(I2CAdapter *i2c, uint8_t addr,
if ( len ! = 1 ) {
data & = ~ I2CR_TXAK ;
}
writeb ( s - > addr + I2CR_ADDR , data ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2CR_ADDR , data ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) ! = 0 ) ;
/* dummy read */
readb ( s - > addr + I2DR_ADDR ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ readb( i2c - > qts , s - > addr + I2DR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) ! = 0 ) ;
/* ack the interrupt */
writeb ( s - > addr + I2SR_ADDR , 0 ) ;
status = readb ( s - > addr + I2SR_ADDR ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2SR_ADDR , 0 ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) = = 0 ) ;
while ( size < len ) {
/* check we are still busy */
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) ! = 0 ) ;
if ( size = = ( len - 1 ) ) {
@ -170,30 +170,30 @@ static void imx_i2c_recv(I2CAdapter *i2c, uint8_t addr,
/* ack the data read */
data | = I2CR_TXAK ;
}
writeb ( s - > addr + I2CR_ADDR , data ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2CR_ADDR , data ) ;
/* read the data */
buf [ size ] = readb ( s - > addr + I2DR_ADDR ) ;
buf [ size ] = qtest_ readb( i2c - > qts , s - > addr + I2DR_ADDR ) ;
if ( size ! = ( len - 1 ) ) {
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) ! = 0 ) ;
/* ack the interrupt */
writeb ( s - > addr + I2SR_ADDR , 0 ) ;
qtest_ writeb( i2c - > qts , s - > addr + I2SR_ADDR , 0 ) ;
}
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IIF ) = = 0 ) ;
size + + ;
}
status = readb ( s - > addr + I2SR_ADDR ) ;
status = qtest_ readb( i2c - > qts , s - > addr + I2SR_ADDR ) ;
g_assert ( ( status & I2SR_IBB ) = = 0 ) ;
}
I2CAdapter * imx_i2c_create ( uint64_t addr )
I2CAdapter * imx_i2c_create ( QTestState * qts , uint64_t addr )
{
IMXI2C * s = g_malloc0 ( sizeof ( * s ) ) ;
I2CAdapter * i2c = ( I2CAdapter * ) s ;
@ -202,6 +202,7 @@ I2CAdapter *imx_i2c_create(uint64_t addr)
i2c - > send = imx_i2c_send ;
i2c - > recv = imx_i2c_recv ;
i2c - > qts = qts ;
return i2c ;
}