summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorTomoya MORINAGA <tomoya-linux@dsn.lapis-semi.com>2011-10-12 13:13:00 +0900
committerBen Dooks <ben-linux@fluff.org>2011-10-29 11:09:32 +0100
commit93e4ad74da14c8d5564cfc0b57c40ca311e53d47 (patch)
tree190708ec41707f3bdae87b68ddaa299b86b43f4d /drivers/i2c
parent1fdb24e969110fafea36d3b393bea438f702c87f (diff)
downloadlinux-3.10-93e4ad74da14c8d5564cfc0b57c40ca311e53d47.tar.gz
linux-3.10-93e4ad74da14c8d5564cfc0b57c40ca311e53d47.tar.bz2
linux-3.10-93e4ad74da14c8d5564cfc0b57c40ca311e53d47.zip
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>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-eg20t.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c
index ce1a32b71e4..a4f76cb76c4 100644
--- a/drivers/i2c/busses/i2c-eg20t.c
+++ b/drivers/i2c/busses/i2c-eg20t.c
@@ -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;
}
/**