| From 76b7fe8d6c4daf4db672eb953c892c6f6572a282 Mon Sep 17 00:00:00 2001 |
| From: Jeremy Fertic <jeremyfertic@gmail.com> |
| Date: Sat, 22 Dec 2018 21:57:41 -0700 |
| Subject: staging: iio: adt7316: fix handling of dac high resolution option |
| |
| From: Jeremy Fertic <jeremyfertic@gmail.com> |
| |
| commit 76b7fe8d6c4daf4db672eb953c892c6f6572a282 upstream. |
| |
| The adt7316/7 and adt7516/7 have the option to output voltage proportional |
| to temperature on dac a and/or dac b. The default dac resolution in this |
| mode is 8 bits with the dac high resolution option enabling 10 bits. None |
| of these settings affect dacs c and d. Remove the "1 (12 bits)" output from |
| the show function since that is not an option for this mode. Return |
| "1 (10 bits)" if the device is one of the above mentioned chips and the dac |
| high resolution mode is enabled. |
| |
| In the store function, the driver currently allows the user to write to the |
| ADT7316_DA_HIGH_RESOLUTION bit regardless of the device in use. Add a check |
| to return an error in the case of an adt7318 or adt7519. Remove the else |
| statement that clears the ADT7316_DA_HIGH_RESOLUTION bit. Instead, clear it |
| before conditionally enabling it, depending on user input. This matches the |
| typical pattern in the driver when an attribute is a boolean. |
| |
| 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 | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/staging/iio/addac/adt7316.c |
| +++ b/drivers/staging/iio/addac/adt7316.c |
| @@ -634,9 +634,7 @@ static ssize_t adt7316_show_da_high_reso |
| struct adt7316_chip_info *chip = iio_priv(dev_info); |
| |
| if (chip->config3 & ADT7316_DA_HIGH_RESOLUTION) { |
| - if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516) |
| - return sprintf(buf, "1 (12 bits)\n"); |
| - if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517) |
| + if (chip->id != ID_ADT7318 && chip->id != ID_ADT7519) |
| return sprintf(buf, "1 (10 bits)\n"); |
| } |
| |
| @@ -653,10 +651,12 @@ static ssize_t adt7316_store_da_high_res |
| u8 config3; |
| int ret; |
| |
| + if (chip->id == ID_ADT7318 || chip->id == ID_ADT7519) |
| + return -EPERM; |
| + |
| + config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION); |
| if (buf[0] == '1') |
| - config3 = chip->config3 | ADT7316_DA_HIGH_RESOLUTION; |
| - else |
| - config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION); |
| + config3 |= ADT7316_DA_HIGH_RESOLUTION; |
| |
| ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3); |
| if (ret) |