Skip to content

Commit 4a8ac5e

Browse files
cpackham-atlnzwsakernel
authored andcommitted
i2c: mpc: Poll for MCF
During some transfers the bus can still be busy when an interrupt is received. Commit 763778c ("i2c: mpc: Restore reread of I2C status register") attempted to address this by re-reading MPC_I2C_SR once but that just made it less likely to happen without actually preventing it. Instead of a single re-read, poll with a timeout so that the bus is given enough time to settle but a genuine stuck SCL is still noticed. Fixes: 1538d82 ("i2c: mpc: Interrupt driven transfer") Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Signed-off-by: Wolfram Sang <wsa@kernel.org>
1 parent a750bff commit 4a8ac5e

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

drivers/i2c/busses/i2c-mpc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,8 +635,8 @@ static irqreturn_t mpc_i2c_isr(int irq, void *dev_id)
635635

636636
status = readb(i2c->base + MPC_I2C_SR);
637637
if (status & CSR_MIF) {
638-
/* Read again to allow register to stabilise */
639-
status = readb(i2c->base + MPC_I2C_SR);
638+
/* Wait up to 100us for transfer to properly complete */
639+
readb_poll_timeout(i2c->base + MPC_I2C_SR, status, !(status & CSR_MCF), 0, 100);
640640
writeb(0, i2c->base + MPC_I2C_SR);
641641
mpc_i2c_do_intr(i2c, status);
642642
return IRQ_HANDLED;

0 commit comments

Comments
 (0)