commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=f53a92c15a10b224cd5c3b0d88930816e572afcf
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/2010R1

This issue is reported by isabelle leonardi < [email protected]>

Sometimes, the first I2C transmit interrupt is not served in time because some
higher priority interrupt handler is running in kernel. The RESART bit is not
set before next I2C clock. When the TWI interrupt handler is called finally,
the I2C session is aborted(MEM bit is reset) and both SMITSERV and MCOMP int
status bits are set.

Signed-off-by: Sonic Zhang <[email protected]>
---
 drivers/i2c/busses/i2c-bfin-twi.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c
index 05a1fdc..6fcf210 100644
--- a/drivers/i2c/busses/i2c-bfin-twi.c
+++ b/drivers/i2c/busses/i2c-bfin-twi.c
@@ -201,7 +201,13 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
 		return;
 	}
 	if (twi_int_status & MCOMP) {
-		if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
+		if ((read_MASTER_CTL(iface) & MEN) == 0 &&
+			(iface->cur_mode == TWI_I2C_MODE_REPEAT ||
+			iface->cur_mode == TWI_I2C_MODE_COMBINED)) {
+			iface->result = -1;
+			write_INT_MASK(iface, 0);
+			write_MASTER_CTL(iface, 0);
+		} else if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
 			if (iface->readNum == 0) {
 				/* set the read number to 1 and ask for manual
 				 * stop in block combine mode
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to