| From 079cd4bac08c29dd3313b61ee009775d72b9b4a7 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Fri, 2 May 2014 21:15:08 +0200 |
| Subject: i2c: sh_mobile: improve error handling |
| |
| Use standard i2c error codes for i2c failures. Also, don't print |
| something on timeout since it happens regularly with i2c. Simplify some, |
| logic, too. |
| |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit 5a72b25e7896e6358b62b590ce5b3a457516ae40) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/i2c/busses/i2c-sh_mobile.c | 25 +++++++++---------------- |
| 1 file changed, 9 insertions(+), 16 deletions(-) |
| |
| diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c |
| index d91625eea6bb..d2fa222df3d1 100644 |
| --- a/drivers/i2c/busses/i2c-sh_mobile.c |
| +++ b/drivers/i2c/busses/i2c-sh_mobile.c |
| @@ -480,7 +480,7 @@ static int start_ch(struct sh_mobile_i2c_data *pd, struct i2c_msg *usr_msg, |
| { |
| if (usr_msg->len == 0 && (usr_msg->flags & I2C_M_RD)) { |
| dev_err(pd->dev, "Unsupported zero length i2c read\n"); |
| - return -EIO; |
| + return -EOPNOTSUPP; |
| } |
| |
| if (do_init) { |
| @@ -515,17 +515,12 @@ static int poll_dte(struct sh_mobile_i2c_data *pd) |
| break; |
| |
| if (val & ICSR_TACK) |
| - return -EIO; |
| + return -ENXIO; |
| |
| udelay(10); |
| } |
| |
| - if (!i) { |
| - dev_warn(pd->dev, "Timeout polling for DTE!\n"); |
| - return -ETIMEDOUT; |
| - } |
| - |
| - return 0; |
| + return i ? 0 : -ETIMEDOUT; |
| } |
| |
| static int poll_busy(struct sh_mobile_i2c_data *pd) |
| @@ -543,20 +538,18 @@ static int poll_busy(struct sh_mobile_i2c_data *pd) |
| */ |
| if (!(val & ICSR_BUSY)) { |
| /* handle missing acknowledge and arbitration lost */ |
| - if ((val | pd->sr) & (ICSR_TACK | ICSR_AL)) |
| - return -EIO; |
| + val |= pd->sr; |
| + if (val & ICSR_TACK) |
| + return -ENXIO; |
| + if (val & ICSR_AL) |
| + return -EAGAIN; |
| break; |
| } |
| |
| udelay(10); |
| } |
| |
| - if (!i) { |
| - dev_err(pd->dev, "Polling timed out\n"); |
| - return -ETIMEDOUT; |
| - } |
| - |
| - return 0; |
| + return i ? 0 : -ETIMEDOUT; |
| } |
| |
| static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter, |
| -- |
| 2.1.2 |
| |