On Tue, 4 Feb 2025 12:50:23 +0100 Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxx> wrote: > If one or more of the 16 channels are enabled and the driver is not > aware of that, unexpected things happen because different channels are > used than intended. To prevent that, all channels should be disabled at > probe time. In Commit 4be339af334c ("iio: adc: ad7124: Disable all > channels at probe time") I intended do that, however only the channels > that are potentially used by the driver and not all channels are > disabled since then. So disable all 16 channels and not only the used > ones. > > Also fix the same issue in the .disable_all() callback. > > Fixes: 4be339af334c ("iio: adc: ad7124: Disable all channels at probe time") > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxx> I've applied this on the togreg branch of iio.git but you may need to do a manual backport of the fix to get it on 6.14 once that's released. Jonathan > --- > Hello, > > this patch is based on v6.14-rc1 + the patch "iio: adc: ad7124: Micro-optimize > channel disabling" > (https://lore.kernel.org/linux-iio/20250120140708.1093655-2-u.kleine-koenig@xxxxxxxxxxxx) > that Jonathan claimed to have taken already. > > Best regards > Uwe > > drivers/iio/adc/ad7124.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c > index 2fdeb3247952..6bc418d38820 100644 > --- a/drivers/iio/adc/ad7124.c > +++ b/drivers/iio/adc/ad7124.c > @@ -550,11 +550,10 @@ static int ad7124_disable_one(struct ad_sigma_delta *sd, unsigned int chan) > > static int ad7124_disable_all(struct ad_sigma_delta *sd) > { > - struct ad7124_state *st = container_of(sd, struct ad7124_state, sd); > int ret; > int i; > > - for (i = 0; i < st->num_channels; i++) { > + for (i = 0; i < 16; i++) { > ret = ad7124_disable_one(sd, i); > if (ret < 0) > return ret; > @@ -1017,11 +1016,10 @@ 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); > } > > + ad7124_disable_all(&st->sd); > + > ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control); > if (ret < 0) > return dev_err_probe(dev, ret, "Failed to setup CONTROL register\n"); > > base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b > prerequisite-patch-id: c8d3727852b9c3bb4dcd2f16508bebbd093a3768