Commit 763778cd authored by Chris Packham's avatar Chris Packham Committed by Wolfram Sang
Browse files

i2c: mpc: Restore reread of I2C status register



Prior to commit 1538d82f ("i2c: mpc: Interrupt driven transfer") the
old interrupt handler would reread MPC_I2C_SR after checking the CSR_MIF
bit. When the driver was re-written this was removed as it seemed
unnecessary. However as it turns out this is necessary for i2c devices
which do clock stretching otherwise we end up thinking the bus is still
busy when processing the interrupt.

Fixes: 1538d82f ("i2c: mpc: Interrupt driven transfer")
Signed-off-by: default avatarChris Packham <chris.packham@alliedtelesis.co.nz>
Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
parent 87cf5127
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -564,6 +564,8 @@ static irqreturn_t mpc_i2c_isr(int irq, void *dev_id)


	status = readb(i2c->base + MPC_I2C_SR);
	status = readb(i2c->base + MPC_I2C_SR);
	if (status & CSR_MIF) {
	if (status & CSR_MIF) {
		/* Read again to allow register to stabilise */
		status = readb(i2c->base + MPC_I2C_SR);
		writeb(0, i2c->base + MPC_I2C_SR);
		writeb(0, i2c->base + MPC_I2C_SR);
		mpc_i2c_do_intr(i2c, status);
		mpc_i2c_do_intr(i2c, status);
		return IRQ_HANDLED;
		return IRQ_HANDLED;