]> git.sur5r.net Git - u-boot/commitdiff
mxc_i2c: check for arbitration lost
authorTroy Kisky <troy.kisky@boundarydevices.com>
Thu, 19 Jul 2012 08:18:15 +0000 (08:18 +0000)
committerHeiko Schocher <hs@denx.de>
Tue, 31 Jul 2012 05:53:24 +0000 (07:53 +0200)
No need to continue waiting if arbitration lost.

Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
Acked-by: Marek Vasut <marex@denx.de>
drivers/i2c/mxc_i2c.c

index ba2aad3d0dc52f0250ae01cdc8ebeeaf82b16e58..093a73f1c52dfac9a2cdeb528627346030029154 100644 (file)
@@ -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();