Commit 765b596f authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Wen Zhiwei
Browse files

iio: adc: ad7124: Disable all channels at probe time

stable inclusion
from stable-v6.6.72
commit 6a96af5f309dd15061b82aa5a341f86f1d27e2ea
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBQN9L

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=6a96af5f309dd15061b82aa5a341f86f1d27e2ea



--------------------------------

commit 4be339af334c283a1a1af3cb28e7e448a0aa8a7c upstream.

When during a measurement two channels are enabled, two measurements are
done that are reported sequencially in the DATA register. As the code
triggered by reading one of the sysfs properties expects that only one
channel is enabled it only reads the first data set which might or might
not belong to the intended channel.

To prevent this situation disable all channels during probe. This fixes
a problem in practise because the reset default for channel 0 is
enabled. So all measurements before the first measurement on channel 0
(which disables channel 0 at the end) might report wrong values.

Fixes: 7b8d045e ("iio: adc: ad7124: allow more than 8 channels")
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://patch.msgid.link/20241104101905.845737-2-u.kleine-koenig@baylibre.com


Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarWen Zhiwei <wenzhiwei@kylinos.cn>
parent 4ddc761c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -923,6 +923,9 @@ static int ad7124_setup(struct ad7124_state *st)
		 * set all channels to this default value.
		 */
		ad7124_set_channel_odr(st, i, 10);

		/* Disable all channels to prevent unintended conversions. */
		ad_sd_write_reg(&st->sd, AD7124_CHANNEL(i), 2, 0);
	}

	return ret;