| From: John Syne <rodrigosiqueiramelo@gmail.com> |
| Date: Fri, 23 Mar 2018 11:22:10 -0300 |
| Subject: staging:iio:ade7854: Fix error handling on read/write |
| |
| commit 4297b23d927fa5265378f4a71372ecef3c33023a upstream. |
| |
| The original code does not correctly handle the error related to I2C |
| read and write. This patch fixes the error handling related to all |
| read/write functions for I2C. |
| |
| Signed-off-by: John Syne <john3909@gmail.com> |
| Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> |
| Fixes: 8d97a5877 ("staging: iio: meter: new driver for ADE7754 devices") |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/staging/iio/meter/ade7854-i2c.c | 24 ++++++++++++------------ |
| drivers/staging/iio/meter/ade7854.c | 10 +++++----- |
| 2 files changed, 17 insertions(+), 17 deletions(-) |
| |
| --- a/drivers/staging/iio/meter/ade7854-i2c.c |
| +++ b/drivers/staging/iio/meter/ade7854-i2c.c |
| @@ -31,7 +31,7 @@ static int ade7854_i2c_write_reg_8(struc |
| ret = i2c_master_send(st->i2c, st->tx, 3); |
| mutex_unlock(&st->buf_lock); |
| |
| - return ret; |
| + return ret < 0 ? ret : 0; |
| } |
| |
| static int ade7854_i2c_write_reg_16(struct device *dev, |
| @@ -51,7 +51,7 @@ static int ade7854_i2c_write_reg_16(stru |
| ret = i2c_master_send(st->i2c, st->tx, 4); |
| mutex_unlock(&st->buf_lock); |
| |
| - return ret; |
| + return ret < 0 ? ret : 0; |
| } |
| |
| static int ade7854_i2c_write_reg_24(struct device *dev, |
| @@ -72,7 +72,7 @@ static int ade7854_i2c_write_reg_24(stru |
| ret = i2c_master_send(st->i2c, st->tx, 5); |
| mutex_unlock(&st->buf_lock); |
| |
| - return ret; |
| + return ret < 0 ? ret : 0; |
| } |
| |
| static int ade7854_i2c_write_reg_32(struct device *dev, |
| @@ -94,7 +94,7 @@ static int ade7854_i2c_write_reg_32(stru |
| ret = i2c_master_send(st->i2c, st->tx, 6); |
| mutex_unlock(&st->buf_lock); |
| |
| - return ret; |
| + return ret < 0 ? ret : 0; |
| } |
| |
| static int ade7854_i2c_read_reg_8(struct device *dev, |
| @@ -110,11 +110,11 @@ static int ade7854_i2c_read_reg_8(struct |
| st->tx[1] = reg_address & 0xFF; |
| |
| ret = i2c_master_send(st->i2c, st->tx, 2); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| ret = i2c_master_recv(st->i2c, st->rx, 1); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| *val = st->rx[0]; |
| @@ -136,11 +136,11 @@ static int ade7854_i2c_read_reg_16(struc |
| st->tx[1] = reg_address & 0xFF; |
| |
| ret = i2c_master_send(st->i2c, st->tx, 2); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| ret = i2c_master_recv(st->i2c, st->rx, 2); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| *val = (st->rx[0] << 8) | st->rx[1]; |
| @@ -162,11 +162,11 @@ static int ade7854_i2c_read_reg_24(struc |
| st->tx[1] = reg_address & 0xFF; |
| |
| ret = i2c_master_send(st->i2c, st->tx, 2); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| ret = i2c_master_recv(st->i2c, st->rx, 3); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2]; |
| @@ -188,11 +188,11 @@ static int ade7854_i2c_read_reg_32(struc |
| st->tx[1] = reg_address & 0xFF; |
| |
| ret = i2c_master_send(st->i2c, st->tx, 2); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| ret = i2c_master_recv(st->i2c, st->rx, 3); |
| - if (ret) |
| + if (ret < 0) |
| goto out; |
| |
| *val = (st->rx[0] << 24) | (st->rx[1] << 16) | (st->rx[2] << 8) | st->rx[3]; |
| --- a/drivers/staging/iio/meter/ade7854.c |
| +++ b/drivers/staging/iio/meter/ade7854.c |
| @@ -33,7 +33,7 @@ static ssize_t ade7854_read_8bit(struct |
| struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); |
| |
| ret = st->read_reg_8(dev, this_attr->address, &val); |
| - if (ret) |
| + if (ret < 0) |
| return ret; |
| |
| return sprintf(buf, "%u\n", val); |
| @@ -50,7 +50,7 @@ static ssize_t ade7854_read_16bit(struct |
| struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); |
| |
| ret = st->read_reg_16(dev, this_attr->address, &val); |
| - if (ret) |
| + if (ret < 0) |
| return ret; |
| |
| return sprintf(buf, "%u\n", val); |
| @@ -67,7 +67,7 @@ static ssize_t ade7854_read_24bit(struct |
| struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); |
| |
| ret = st->read_reg_24(dev, this_attr->address, &val); |
| - if (ret) |
| + if (ret < 0) |
| return ret; |
| |
| return sprintf(buf, "%u\n", val); |
| @@ -84,7 +84,7 @@ static ssize_t ade7854_read_32bit(struct |
| struct ade7854_state *st = iio_priv(indio_dev); |
| |
| ret = st->read_reg_32(dev, this_attr->address, &val); |
| - if (ret) |
| + if (ret < 0) |
| return ret; |
| |
| return sprintf(buf, "%u\n", val); |
| @@ -416,7 +416,7 @@ static int ade7854_set_irq(struct device |
| u32 irqen; |
| |
| ret = st->read_reg_32(dev, ADE7854_MASK0, &irqen); |
| - if (ret) |
| + if (ret < 0) |
| goto error_ret; |
| |
| if (enable) |