Commit 9eb13cf3 authored by Aaro Koskinen's avatar Aaro Koskinen Committed by Wolfram Sang

i2c: omap: fix draining irq handling

Commit 0bdfe0cb (i2c: omap: sanitize
exit path) changed the interrupt handler to exit early and complete
the transfer after the draining IRQ is handled. As a result, the ARDY
may not be cleared properly, and it may cause all future I2C transfers
to timeout with "timeout waiting for bus ready". This is reproducible
at least with N900 when twl4030_gpio makes a long write (> FIFO size)
during the probe (http://marc.info/?l=linux-omap&m=135818882610432&w=2).

The fix is to continue until we get ARDY interrupt that completes the
transfer. Tested with 3.8-rc4 + N900: 20 boots in a row without errors;
without the patch the problem triggers after few reboots.
Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Acked-by: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarWolfram Sang <w.sang@pengutronix.de>
parent 2c5de558
...@@ -963,7 +963,7 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) ...@@ -963,7 +963,7 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
i2c_omap_errata_i207(dev, stat); i2c_omap_errata_i207(dev, stat);
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR);
break; continue;
} }
if (stat & OMAP_I2C_STAT_RRDY) { if (stat & OMAP_I2C_STAT_RRDY) {
...@@ -989,7 +989,7 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) ...@@ -989,7 +989,7 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
break; break;
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XDR); omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XDR);
break; continue;
} }
if (stat & OMAP_I2C_STAT_XRDY) { if (stat & OMAP_I2C_STAT_XRDY) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment