| From 558df982d4ead9cac628153d0d7b60feae05ddc8 Mon Sep 17 00:00:00 2001 |
| From: Pekka Korpinen <pekka.korpinen@iki.fi> |
| Date: Wed, 29 Sep 2021 21:57:55 +0300 |
| Subject: iio: dac: ad5446: Fix ad5622_write() return value |
| |
| From: Pekka Korpinen <pekka.korpinen@iki.fi> |
| |
| commit 558df982d4ead9cac628153d0d7b60feae05ddc8 upstream. |
| |
| On success i2c_master_send() returns the number of bytes written. The |
| call from iio_write_channel_info(), however, expects the return value to |
| be zero on success. |
| |
| This bug causes incorrect consumption of the sysfs buffer in |
| iio_write_channel_info(). When writing more than two characters to |
| out_voltage0_raw, the ad5446 write handler is called multiple times |
| causing unexpected behavior. |
| |
| Fixes: 3ec36a2cf0d5 ("iio:ad5446: Add support for I2C based DACs") |
| Signed-off-by: Pekka Korpinen <pekka.korpinen@iki.fi> |
| Link: https://lore.kernel.org/r/20210929185755.2384-1-pekka.korpinen@iki.fi |
| Cc: <Stable@vger.kernel.org> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/dac/ad5446.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/iio/dac/ad5446.c |
| +++ b/drivers/iio/dac/ad5446.c |
| @@ -527,8 +527,15 @@ static int ad5622_write(struct ad5446_st |
| { |
| struct i2c_client *client = to_i2c_client(st->dev); |
| __be16 data = cpu_to_be16(val); |
| + int ret; |
| |
| - return i2c_master_send(client, (char *)&data, sizeof(data)); |
| + ret = i2c_master_send(client, (char *)&data, sizeof(data)); |
| + if (ret < 0) |
| + return ret; |
| + if (ret != sizeof(data)) |
| + return -EIO; |
| + |
| + return 0; |
| } |
| |
| /** |