| From 1b2003df384e452e8277a2f88141f1a8235d17a2 Mon Sep 17 00:00:00 2001 |
| From: Alexandru Tachici <alexandru.tachici@analog.com> |
| Date: Fri, 20 Dec 2019 12:07:19 +0200 |
| Subject: [PATCH] iio: adc: ad7124: Fix DT channel configuration |
| |
| commit d7857e4ee1ba69732b16c73b2f2dde83ecd78ee4 upstream. |
| |
| This patch fixes device tree channel configuration. |
| |
| ad7124 driver reads channels configuration from the device tree. |
| It expects to find channel specifications as child nodes. |
| Before this patch ad7124 driver assumed that the child nodes are parsed |
| by for_each_available_child_of_node in the order 0,1,2,3... |
| |
| This is wrong and the real order of the children can be seen by running: |
| dtc -I fs /sys/firmware/devicetree/base on the machine. |
| |
| For example, running this on an rpi 3B+ yields the real |
| children order: 4,2,0,7,5,3,1,6 |
| |
| Before this patch the driver assigned the channel configuration |
| like this: |
| - 0 <- 4 |
| - 1 <- 2 |
| - 2 <- 0 |
| ........ |
| For example, the symptoms can be observed by connecting the 4th channel |
| to a 1V tension and then reading the in_voltage0-voltage19_raw sysfs |
| (multiplied of course by the scale) one would see that channel 0 |
| measures 1V and channel 4 measures only noise. |
| |
| Now the driver uses the reg property of each child in order to |
| correctly identify to which channel the parsed configuration |
| belongs to. |
| |
| Fixes b3af341bbd966: ("iio: adc: Add ad7124 support") |
| Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com> |
| Cc: <Stable@vger.kernel.org> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c |
| index 5262d34ebea8..2d662dd09e6b 100644 |
| --- a/drivers/iio/adc/ad7124.c |
| +++ b/drivers/iio/adc/ad7124.c |
| @@ -485,13 +485,11 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev, |
| else |
| st->channel_config[channel].refsel = tmp; |
| |
| - *chan = ad7124_channel_template; |
| - chan->address = channel; |
| - chan->scan_index = channel; |
| - chan->channel = ain[0]; |
| - chan->channel2 = ain[1]; |
| - |
| - chan++; |
| + chan[channel] = ad7124_channel_template; |
| + chan[channel].address = channel; |
| + chan[channel].scan_index = channel; |
| + chan[channel].channel = ain[0]; |
| + chan[channel].channel2 = ain[1]; |
| } |
| |
| return 0; |
| -- |
| 2.7.4 |
| |