diff options
| author | Troy Kisky <troy.kisky@boundarydevices.com> | 2012-07-19 08:18:15 +0000 | 
|---|---|---|
| committer | Heiko Schocher <hs@denx.de> | 2012-07-31 07:53:24 +0200 | 
| commit | d5383a63cd1286392a9792f3bd9e9b0d87e02171 (patch) | |
| tree | b6836667438c2ec070ceda9db49c18653a4732f2 /drivers/i2c | |
| parent | ca741da106de2b3d1432a333b3da0af6849c4e9a (diff) | |
| download | olio-uboot-2014.01-d5383a63cd1286392a9792f3bd9e9b0d87e02171.tar.xz olio-uboot-2014.01-d5383a63cd1286392a9792f3bd9e9b0d87e02171.zip | |
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')
| -rw-r--r-- | drivers/i2c/mxc_i2c.c | 7 | 
1 files changed, 7 insertions, 0 deletions
| diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c index ba2aad3d0..093a73f1c 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(); |