Commit e896be5a authored by Russell King's avatar Russell King Committed by Wolfram Sang
Browse files

i2c: pxa: fix i2c_pxa_wait_bus_not_busy() boundary condition



Fix i2c_pxa_wait_bus_not_busy()'s boundary conditions, so that a
coincidental success and timeout results in the function returning
success.

Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
parent bb82ba69
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -416,19 +416,26 @@ static void i2c_pxa_abort(struct pxa_i2c *i2c)
static int i2c_pxa_wait_bus_not_busy(struct pxa_i2c *i2c)
{
	int timeout = DEF_TIMEOUT;
	u32 isr;

	while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) {
		if ((readl(_ISR(i2c)) & ISR_SAD) != 0)
	while (1) {
		isr = readl(_ISR(i2c));
		if (!(isr & (ISR_IBB | ISR_UB)))
			return 0;

		if (isr & ISR_SAD)
			timeout += 4;

		if (!timeout--)
			break;

		msleep(2);
		show_state(i2c);
	}

	if (timeout < 0)
	show_state(i2c);

	return timeout < 0 ? I2C_RETRY : 0;
	return I2C_RETRY;
}

static int i2c_pxa_wait_master(struct pxa_i2c *i2c)