Re: [PATCH] iio: adc: ad7124: Really disable all channels at probe time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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






[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux