Subject: i2c-pxa: Clean transaction stop It was reported to me that the i2c-pxa driver was not able to process more that 50 transactions per second. Investigation revealed that the I2C unit was busy for 20 ms after every transaction. The reason seems to be that we forget to clear the STOP and ACKNACK bits at the end of the transaction. According to the PXA27x developer's manual, we shall do so. Signed-off-by: Jean Delvare Cc: Lennert Buytenhek Cc: Nicolas Pitre --- drivers/i2c/busses/i2c-pxa.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) --- linux-2.6.21-rc5.orig/drivers/i2c/busses/i2c-pxa.c 2007-03-14 18:42:09.000000000 +0100 +++ linux-2.6.21-rc5/drivers/i2c/busses/i2c-pxa.c 2007-03-30 18:42:22.000000000 +0200 @@ -539,6 +539,18 @@ static inline void i2c_pxa_start_message writel(icr | ICR_START | ICR_TB, _ICR(i2c)); } +static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c) +{ + u32 icr; + + /* + * Clear the STOP and ACK flags + */ + icr = readl(_ICR(i2c)); + icr &= ~(ICR_STOP | ICR_ACKNAK); + writel(icr, _IRC(i2c)); +} + /* * We are protected by the adapter bus mutex. */ @@ -581,6 +593,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2 * The rest of the processing occurs in the interrupt handler. */ timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); + i2c_pxa_stop_message(i2c); /* * We place the return code in i2c->msg_idx.