summaryrefslogtreecommitdiff
path: root/drivers/i2c/mxc_i2c.c
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2012-07-19 08:18:15 +0000
committerHeiko Schocher <hs@denx.de>2012-07-31 07:53:24 +0200
commitd5383a63cd1286392a9792f3bd9e9b0d87e02171 (patch)
treeb6836667438c2ec070ceda9db49c18653a4732f2 /drivers/i2c/mxc_i2c.c
parentca741da106de2b3d1432a333b3da0af6849c4e9a (diff)
downloadu-boot-imx-d5383a63cd1286392a9792f3bd9e9b0d87e02171.zip
u-boot-imx-d5383a63cd1286392a9792f3bd9e9b0d87e02171.tar.gz
u-boot-imx-d5383a63cd1286392a9792f3bd9e9b0d87e02171.tar.bz2
mxc_i2c: check for arbitration lost
No need to continue waiting if arbitration lost. Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> Acked-by: Marek Vasut <marex@denx.de>
Diffstat (limited to 'drivers/i2c/mxc_i2c.c')
-rw-r--r--drivers/i2c/mxc_i2c.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index ba2aad3..093a73f 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -55,6 +55,7 @@ struct mxc_i2c_regs {
#define I2SR_ICF (1 << 7)
#define I2SR_IBB (1 << 5)
+#define I2SR_IAL (1 << 4)
#define I2SR_IIF (1 << 1)
#define I2SR_RX_NO_AK (1 << 0)
@@ -165,6 +166,12 @@ static int wait_for_sr_state(struct mxc_i2c_regs *i2c_regs, unsigned state)
ulong start_time = get_timer(0);
for (;;) {
sr = readb(&i2c_regs->i2sr);
+ if (sr & I2SR_IAL) {
+ writeb(sr & ~I2SR_IAL, &i2c_regs->i2sr);
+ printf("%s: Arbitration lost sr=%x cr=%x state=%x\n",
+ __func__, sr, readb(&i2c_regs->i2cr), state);
+ return -ERESTART;
+ }
if ((sr & (state >> 8)) == (unsigned char)state)
return sr;
WATCHDOG_RESET();