mirror of https://gitee.com/openkylin/linux.git
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: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
parent
bb82ba6907
commit
e896be5ad1
|
@ -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);
|
||||
show_state(i2c);
|
||||
|
||||
return timeout < 0 ? I2C_RETRY : 0;
|
||||
return I2C_RETRY;
|
||||
}
|
||||
|
||||
static int i2c_pxa_wait_master(struct pxa_i2c *i2c)
|
||||
|
|
Loading…
Reference in New Issue