[U-Boot] [PATCH v2 6/9] i2c: sh_i2c.c: check error in i2c_read and i2c_write

2012-09-12 Thread Tetsuyuki Kobayashi
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

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH v2 6/9] i2c: sh_i2c.c: check error in i2c_read and i2c_write

2012-09-12 Thread Tetsuyuki Kobayashi
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

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


Re: [U-Boot] [PATCH v2 6/9] i2c: sh_i2c.c: check error in i2c_read and i2c_write

2012-09-12 Thread Nobuhiro Iwamatsu
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