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
