From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Fri, 22 Jun 2012 19:04:41 +0200 Subject: [U-Boot] [PATCH 13/24] mxc_i2c: check for arbitration lost In-Reply-To: <1340338339-11626-13-git-send-email-troy.kisky@boundarydevices.com> References: <1340338339-11626-1-git-send-email-troy.kisky@boundarydevices.com> <1340338339-11626-13-git-send-email-troy.kisky@boundarydevices.com> Message-ID: <201206221904.41325.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Dear Troy Kisky, > No need to continue waiting if arbitration lost. > > Signed-off-by: Troy Kisky Acked-by: Marek Vasut > --- > 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