| From 45130fb030aec26ac28b4bb23344901df3ec3b7f Mon Sep 17 00:00:00 2001 |
| From: Jeremy Fertic <jeremyfertic@gmail.com> |
| Date: Sat, 22 Dec 2018 21:57:42 -0700 |
| Subject: staging: iio: adt7316: fix the dac read calculation |
| |
| From: Jeremy Fertic <jeremyfertic@gmail.com> |
| |
| commit 45130fb030aec26ac28b4bb23344901df3ec3b7f upstream. |
| |
| The calculation of the current dac value is using the wrong bits of the |
| dac lsb register. Create two macros to shift the lsb register value into |
| lsb position, depending on whether the dac is 10 or 12 bit. Initialize |
| data to 0 so, with an 8 bit dac, the msb register value can be bitwise |
| ORed with data. |
| |
| Fixes: 35f6b6b86ede ("staging: iio: new ADT7316/7/8 and ADT7516/7/9 driver") |
| Signed-off-by: Jeremy Fertic <jeremyfertic@gmail.com> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/staging/iio/addac/adt7316.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/staging/iio/addac/adt7316.c |
| +++ b/drivers/staging/iio/addac/adt7316.c |
| @@ -47,6 +47,8 @@ |
| #define ADT7516_MSB_AIN3 0xA |
| #define ADT7516_MSB_AIN4 0xB |
| #define ADT7316_DA_DATA_BASE 0x10 |
| +#define ADT7316_DA_10_BIT_LSB_SHIFT 6 |
| +#define ADT7316_DA_12_BIT_LSB_SHIFT 4 |
| #define ADT7316_DA_MSB_DATA_REGS 4 |
| #define ADT7316_LSB_DAC_A 0x10 |
| #define ADT7316_MSB_DAC_A 0x11 |
| @@ -1403,7 +1405,7 @@ static IIO_DEVICE_ATTR(ex_analog_temp_of |
| static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip, |
| int channel, char *buf) |
| { |
| - u16 data; |
| + u16 data = 0; |
| u8 msb, lsb, offset; |
| int ret; |
| |
| @@ -1428,7 +1430,11 @@ static ssize_t adt7316_show_DAC(struct a |
| if (ret) |
| return -EIO; |
| |
| - data = (msb << offset) + (lsb & ((1 << offset) - 1)); |
| + if (chip->dac_bits == 12) |
| + data = lsb >> ADT7316_DA_12_BIT_LSB_SHIFT; |
| + else if (chip->dac_bits == 10) |
| + data = lsb >> ADT7316_DA_10_BIT_LSB_SHIFT; |
| + data |= msb << offset; |
| |
| return sprintf(buf, "%d\n", data); |
| } |