diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2009-12-09 15:12:09 +0100 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2009-12-09 15:24:57 +0100 |
commit | 90e3f0516d19c934d554f94561118fde405da6a1 (patch) | |
tree | 1e12978d7c0c67529617eae2c2e71598529dc5b4 | |
parent | 180a3a988e053f08dcd755406aeae5cae2a60a19 (diff) | |
download | barebox-90e3f0516d19c934d554f94561118fde405da6a1.tar.gz barebox-90e3f0516d19c934d554f94561118fde405da6a1.tar.xz |
i2c-imx: fix clear IFF race condition
During i2c read the original pattern was:
1. write i2c slave address
2. wait for transmit complete + clear IIF
3. wait for receive acknowledge
4. wait for IIF interrupt
Due to the clear of the I2SR register, the IIF flag was cleared, too. So
in step 4 the Interrupt wasn't detected. To fix this problem, we move
the clean of IIF before the writing of the slave address. So that it
looks this way:
0. clear IIF
1. write i2c slave address
2. wait for transmit complete
3. wait for receive acknowledge
4. wait for IIF interrupt
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r-- | drivers/i2c/i2c-imx.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/i2c/i2c-imx.c b/drivers/i2c/i2c-imx.c index 387c598a89..14d5260443 100644 --- a/drivers/i2c/i2c-imx.c +++ b/drivers/i2c/i2c-imx.c @@ -177,8 +177,6 @@ static int i2c_imx_trx_complete(struct i2c_adapter *adapter) dev_err(adapter->dev, "<%s> TXR timeout\n", __func__); return -EIO; } - - writeb(0x0, base + IMX_I2C_I2SR); } return 0; @@ -360,6 +358,9 @@ static int i2c_imx_read(struct i2c_adapter *adapter, struct i2c_msg *msgs) "<%s> write slave address: addr=0x%02x\n", __func__, (msgs->addr << 1) | 0x01); + /* clear IIF */ + writeb(0x0, base + IMX_I2C_I2SR); + /* write slave address */ writeb((msgs->addr << 1) | 0x01, base + IMX_I2C_I2DR); |