i2c-eg20t: Fix bus-idle waiting issue
Currently, when checking whether bus is idle or not, if timeout occurs, this function always returns success(zero). This patch fixes the issue. Signed-off-by: Tomoya MORINAGA <tomoya-linux@dsn.lapis-semi.com> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
parent
1fdb24e969
commit
93e4ad74da
|
@ -273,23 +273,23 @@ static s32 pch_i2c_wait_for_bus_idle(struct i2c_algo_pch_data *adap,
|
|||
s32 timeout)
|
||||
{
|
||||
void __iomem *p = adap->pch_base_address;
|
||||
ktime_t ns_val;
|
||||
|
||||
if ((ioread32(p + PCH_I2CSR) & I2CMBB_BIT) == 0)
|
||||
return 0;
|
||||
|
||||
/* MAX timeout value is timeout*1000*1000nsec */
|
||||
ktime_t ns_val = ktime_add_ns(ktime_get(), timeout*1000*1000);
|
||||
ns_val = ktime_add_ns(ktime_get(), timeout*1000*1000);
|
||||
do {
|
||||
if ((ioread32(p + PCH_I2CSR) & I2CMBB_BIT) == 0)
|
||||
break;
|
||||
msleep(20);
|
||||
if ((ioread32(p + PCH_I2CSR) & I2CMBB_BIT) == 0)
|
||||
return 0;
|
||||
} while (ktime_lt(ktime_get(), ns_val));
|
||||
|
||||
pch_dbg(adap, "I2CSR = %x\n", ioread32(p + PCH_I2CSR));
|
||||
pch_err(adap, "%s: Timeout Error.return%d\n", __func__, -ETIME);
|
||||
|
||||
if (timeout == 0) {
|
||||
pch_err(adap, "%s: Timeout Error.return%d\n", __func__, -ETIME);
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue