[U-Boot] [PATCH 13/24] mxc_i2c: check for arbitration lost

Marek Vasut
2012-06-22T17:04:41Z

Dear Troy Kisky,

> 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 | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
> index 2bff2b8..df033ea 100644
> --- a/drivers/i2c/mxc_i2c.c
> +++ b/drivers/i2c/mxc_i2c.c
> @@ -54,6 +54,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)
>
> @@ -164,6 +165,12 @@ static unsigned 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;
> elapsed = get_timer(start_time);

Best regards,
Marek Vasut