| From 0d106b74c558e3000aa0e058b4725cacb70ce77a Mon Sep 17 00:00:00 2001 |
| From: Akinobu Mita <akinobu.mita@gmail.com> |
| Date: Fri, 21 Jul 2017 00:24:17 +0900 |
| Subject: iio: adc: ti-ads1015: fix incorrect data rate setting update |
| |
| From: Akinobu Mita <akinobu.mita@gmail.com> |
| |
| commit 0d106b74c558e3000aa0e058b4725cacb70ce77a upstream. |
| |
| The ti-ads1015 driver has eight iio voltage channels and each iio channel |
| can hold own sampling frequency information. |
| |
| The ADS1015 device only have a single config register which contains an |
| input multiplexer selection, PGA and data rate settings. So the driver |
| should load the correct settings when the input multiplexer selection is |
| changed. |
| |
| However, regardless of which channlel is currently selected, changing any |
| iio channel's sampling frequency information immediately overwrites the |
| current data rate setting in the config register. |
| |
| It breaks the current data rate setting if the different channel's sampling |
| frequency information is changed because the data rate setting is not |
| reloaded when the input multiplexer is switched. |
| |
| This removes the unexpected config register update and correctly load the |
| data rate setting before getting adc result. |
| |
| Cc: Daniel Baluta <daniel.baluta@gmail.com> |
| Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/iio/adc/ti-ads1015.c | 27 ++++++++++----------------- |
| 1 file changed, 10 insertions(+), 17 deletions(-) |
| |
| --- a/drivers/iio/adc/ti-ads1015.c |
| +++ b/drivers/iio/adc/ti-ads1015.c |
| @@ -251,9 +251,11 @@ int ads1015_get_adc_result(struct ads101 |
| |
| ret = regmap_update_bits_check(data->regmap, ADS1015_CFG_REG, |
| ADS1015_CFG_MUX_MASK | |
| - ADS1015_CFG_PGA_MASK, |
| + ADS1015_CFG_PGA_MASK | |
| + ADS1015_CFG_DR_MASK, |
| chan << ADS1015_CFG_MUX_SHIFT | |
| - pga << ADS1015_CFG_PGA_SHIFT, |
| + pga << ADS1015_CFG_PGA_SHIFT | |
| + dr << ADS1015_CFG_DR_SHIFT, |
| &change); |
| if (ret < 0) |
| return ret; |
| @@ -324,25 +326,16 @@ static int ads1015_set_scale(struct ads1 |
| |
| static int ads1015_set_data_rate(struct ads1015_data *data, int chan, int rate) |
| { |
| - int i, ret, rindex = -1; |
| + int i; |
| |
| - for (i = 0; i < ARRAY_SIZE(ads1015_data_rate); i++) |
| + for (i = 0; i < ARRAY_SIZE(ads1015_data_rate); i++) { |
| if (data->data_rate[i] == rate) { |
| - rindex = i; |
| - break; |
| + data->channel_data[chan].data_rate = i; |
| + return 0; |
| } |
| - if (rindex < 0) |
| - return -EINVAL; |
| - |
| - ret = regmap_update_bits(data->regmap, ADS1015_CFG_REG, |
| - ADS1015_CFG_DR_MASK, |
| - rindex << ADS1015_CFG_DR_SHIFT); |
| - if (ret < 0) |
| - return ret; |
| - |
| - data->channel_data[chan].data_rate = rindex; |
| + } |
| |
| - return 0; |
| + return -EINVAL; |
| } |
| |
| static int ads1015_read_raw(struct iio_dev *indio_dev, |