commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=9c8f4a29786bcc805f53bb1626915f6671ddb01b branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk
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 f2628a7..fcb041d 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
