On Wed, Sep 12, 2012 at 5:21 PM, Tetsuyuki Kobayashi <k...@kmckk.co.jp> wrote: > Before this patch, i2c_{read,write} always returned 0. > Check TACK in i2c_raw_{read,write} so that i2c_{read,write} return non-zero > when error. > > Signed-off-by: Tetsuyuki Kobayashi <k...@kmckk.co.jp> > --- > Changes for v2: > - new > > drivers/i2c/sh_i2c.c | 44 ++++++++++++++++++++++++++++---------------- > 1 file changed, 28 insertions(+), 16 deletions(-) > > diff --git a/drivers/i2c/sh_i2c.c b/drivers/i2c/sh_i2c.c > index 25dbc43..e3ee804 100644 > --- a/drivers/i2c/sh_i2c.c > +++ b/drivers/i2c/sh_i2c.c > @@ -151,29 +151,35 @@ static void i2c_finish(struct sh_i2c *base) > writeb(readb(&base->iccr) & ~SH_I2C_ICCR_ICE, &base->iccr); > } > > -static void i2c_raw_write(struct sh_i2c *base, u8 id, u8 reg, u8 val) > +static int i2c_raw_write(struct sh_i2c *base, u8 id, u8 reg, u8 val) > { > - i2c_set_addr(base, id, reg, 0); > + if (i2c_set_addr(base, id, reg, 0) != 0) > + return -1; > udelay(10); > > writeb(val, &base->icdr); > - irq_dte(base); > + if (irq_dte_with_tack(base) != 0) > + return -1; > > writeb((SH_I2C_ICCR_ICE | SH_I2C_ICCR_RTS), &base->iccr); > - irq_dte(base); > + if (irq_dte_with_tack(base) != 0) > + return -1; > irq_busy(base); > > i2c_finish(base); > + return 0; > } > > -static u8 i2c_raw_read(struct sh_i2c *base, u8 id, u8 reg) > +static int i2c_raw_read(struct sh_i2c *base, u8 id, u8 reg) > { > - u8 ret; > + int ret; > > #if defined(CONFIG_SH73A0) > - i2c_set_addr(base, id, reg, 0); > + if (i2c_set_addr(base, id, reg, 0) != 0) > + return -1; > #else > - i2c_set_addr(base, id, reg, 1); > + if (i2c_set_addr(base, id, reg, 1) != 0) > + return -1; > udelay(100); > #endif > > @@ -181,12 +187,14 @@ static u8 i2c_raw_read(struct sh_i2c *base, u8 id, u8 > reg) > irq_dte(base); > > writeb(id << 1 | 0x01, &base->icdr); > - irq_dte(base); > + if (irq_dte_with_tack(base) != 0) > + return -1; > > writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_SCP), &base->iccr); > - irq_dte(base); > + if (irq_dte_with_tack(base) != 0) > + return -1; > > - ret = readb(&base->icdr); > + ret = readb(&base->icdr) & 0xff; > > writeb((SH_I2C_ICCR_ICE|SH_I2C_ICCR_RACK), &base->iccr); > readb(&base->icdr); /* Dummy read */ > @@ -303,10 +311,14 @@ void i2c_init(int speed, int slaveaddr) > */ > int i2c_read(u8 chip, u32 addr, int alen, u8 *buffer, int len) > { > + int ret; > int i = 0; > - for (i = 0 ; i < len ; i++) > - buffer[i] = i2c_raw_read(base, chip, addr + i); > - > + for (i = 0 ; i < len ; i++) { > + ret = i2c_raw_read(base, chip, addr + i); > + if (ret < 0) > + return -1; > + buffer[i] = ret & 0xff; > + } > return 0; > } > > @@ -327,8 +339,8 @@ int i2c_write(u8 chip, u32 addr, int alen, u8 *buffer, > int len) > { > int i = 0; > for (i = 0; i < len ; i++) > - i2c_raw_write(base, chip, addr + i, buffer[i]); > - > + if (i2c_raw_write(base, chip, addr + i, buffer[i]) != 0) > + return -1; > return 0; > } > > -- > 1.7.9.5 >
Acked-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu...@renesas.com> Best regards, Nobuhiro -- Nobuhiro Iwamatsu _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot