The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* RE: [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion
       [not found] <20260428-ad_sigma_delta-fix-v1-1-8e3f925ee8d2@analog.com>
@ 2026-05-07 12:17 ` Sabau, Radu bogdan
  2026-05-07 13:52   ` Sabau, Radu bogdan
  2026-05-07 14:07   ` Jonathan Cameron
  0 siblings, 2 replies; 4+ messages in thread
From: Sabau, Radu bogdan @ 2026-05-07 12:17 UTC (permalink / raw)
  To: Sabau, Radu bogdan, Lars-Peter Clausen, Hennerich, Michael,
	Jonathan Cameron, David Lechner, Sa, Nuno, Andy Shevchenko,
	Uwe Kleine König
  Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org

> --- a/drivers/iio/adc/ad_sigma_delta.c
> +++ b/drivers/iio/adc/ad_sigma_delta.c
> @@ -442,10 +442,10 @@ int ad_sigma_delta_single_conversion(struct
> iio_dev *indio_dev,
>  	ad_sd_disable_irq(sigma_delta);
> 
>  	ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
> -	ad_sigma_delta_disable_one(sigma_delta, chan->address);
> 
>  out_unlock:
>  	sigma_delta->keep_cs_asserted = false;
> +	ad_sigma_delta_disable_one(sigma_delta, chan->address);
>  	sigma_delta->bus_locked = false;
>  	spi_bus_unlock(sigma_delta->spi->controller);
>  out_release:
> 
> ---
> base-commit: 3b3bea6d4b9c162f9e555905d96b8c1da67ecd5b
> change-id: 20260428-ad_sigma_delta-fix-bb65d56ccbb0
> 
> Best regards,
> --
> Radu Sabau <radu.sabau@analog.com>
> 

Hi everyone,

Uhmm..., why was this fix marked as Changes Requested? Is it something I am
missing?

Best Regards,
Radu

^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion
  2026-05-07 12:17 ` [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion Sabau, Radu bogdan
@ 2026-05-07 13:52   ` Sabau, Radu bogdan
  2026-05-07 14:09     ` Jonathan Cameron
  2026-05-07 14:07   ` Jonathan Cameron
  1 sibling, 1 reply; 4+ messages in thread
From: Sabau, Radu bogdan @ 2026-05-07 13:52 UTC (permalink / raw)
  To: Lars-Peter Clausen, Hennerich, Michael, Jonathan Cameron,
	David Lechner, Sa, Nuno, Andy Shevchenko, Uwe Kleine König
  Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org

> -----Original Message-----
> From: Sabau, Radu bogdan <Radu.Sabau@analog.com>
> Sent: Thursday, May 7, 2026 3:17 PM

...

> >
> 
> Hi everyone,
> 
> Uhmm..., why was this fix marked as Changes Requested? Is it something I am
> missing?
> 
> Best Regards,
> Radu

I have also had a look here :
https://sashiko.dev/#/patchset/20260428-ad_sigma_delta-fix-v1-1-8e3f925ee8d2%40analog.com

Therefore here is the reply to Sashiko's review:

> For devices that lack the optional disable_one callback,
> ad_sigma_delta_disable_one() is a no-op. In that scenario,
> ad_sigma_delta_set_mode() executes the final SPI transfer for the
> conversion.
>
> Because sigma_delta->keep_cs_asserted is still true when set_mode is
> called, its transfer will carry cs_change = 1. Since disable_one
> does not issue a subsequent transfer with cs_change = 0, will the SPI
> framework skip teardown and leave CS permanently stuck low?
>
> Could sigma_delta->keep_cs_asserted be cleared before calling
> ad_sigma_delta_set_mode() to ensure proper teardown, or should an
> explicit dummy transfer be added?

Good catch, thank you. The previous version only moved disable_one()
after clearing keep_cs_asserted, but left set_mode(AD_SD_MODE_IDLE) in
the out: block where keep_cs_asserted is still true. For devices that
do not implement disable_one, set_mode() issues the last SPI transfer,
so it carries cs_change=1 and CS stays stuck — the same bug reproduced
on a different code path.

Fixed by moving set_mode(IDLE) into the out_unlock: block as well, so
both calls execute after keep_cs_asserted is cleared. This matches the
pattern already used correctly in ad_sd_calibrate(), which clears
keep_cs_asserted before calling set_mode(IDLE) and disable_one() in its
single cleanup block.

...

> I noticed an additional state tracking issue in the error path of
> ad_sd_buffer_postenable() that wasn't introduced by this patch.
> When operations like ad_sigma_delta_clear_pending_event() fail, the error
> path calls spi_bus_unlock() but leaves sigma_delta->bus_locked = true and
> sigma_delta->keep_cs_asserted = true. Since the IIO core does not invoke
> predisable on a postenable failure, this state persists.
>
> Subsequent SPI operations like direct mode reads will observe
> bus_locked == true and incorrectly invoke spi_sync_locked(). As the bus
> is not actually locked at the controller level, this bypasses the
> SPI framework's bus_lock_mutex.
>
> Does this allow concurrent access to the SPI controller from multiple
> threads, potentially corrupting SPI bus data?

Yes, the concern is valid. With bus_locked == true but the controller's
bus_lock_mutex not held, any concurrent spi_sync() from another driver
can proceed unobstructed while our driver issues spi_sync_locked() —
exactly the race bus_lock_mutex is meant to prevent.

Fixed in the same patch by resetting both keep_cs_asserted and
bus_locked to false in err_unlock: before calling spi_bus_unlock(),
consistent with the teardown sequence in predisable().

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion
  2026-05-07 12:17 ` [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion Sabau, Radu bogdan
  2026-05-07 13:52   ` Sabau, Radu bogdan
@ 2026-05-07 14:07   ` Jonathan Cameron
  1 sibling, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2026-05-07 14:07 UTC (permalink / raw)
  To: Sabau, Radu bogdan
  Cc: Lars-Peter Clausen, Hennerich, Michael, David Lechner, Sa, Nuno,
	Andy Shevchenko, Uwe Kleine König, linux-iio@vger.kernel.org,
	linux-kernel@vger.kernel.org

On Thu, 7 May 2026 12:17:25 +0000
"Sabau, Radu bogdan" <Radu.Sabau@analog.com> wrote:

> > --- a/drivers/iio/adc/ad_sigma_delta.c
> > +++ b/drivers/iio/adc/ad_sigma_delta.c
> > @@ -442,10 +442,10 @@ int ad_sigma_delta_single_conversion(struct
> > iio_dev *indio_dev,
> >  	ad_sd_disable_irq(sigma_delta);
> > 
> >  	ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
> > -	ad_sigma_delta_disable_one(sigma_delta, chan->address);
> > 
> >  out_unlock:
> >  	sigma_delta->keep_cs_asserted = false;
> > +	ad_sigma_delta_disable_one(sigma_delta, chan->address);
> >  	sigma_delta->bus_locked = false;
> >  	spi_bus_unlock(sigma_delta->spi->controller);
> >  out_release:
> > 
> > ---
> > base-commit: 3b3bea6d4b9c162f9e555905d96b8c1da67ecd5b
> > change-id: 20260428-ad_sigma_delta-fix-bb65d56ccbb0
> > 
> > Best regards,
> > --
> > Radu Sabau <radu.sabau@analog.com>
> >   
> 
> Hi everyone,
> 
> Uhmm..., why was this fix marked as Changes Requested? Is it something I am
> missing?
Looks like I missed in patchwork. It has been applied.
> 
> Best Regards,
> Radu


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion
  2026-05-07 13:52   ` Sabau, Radu bogdan
@ 2026-05-07 14:09     ` Jonathan Cameron
  0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2026-05-07 14:09 UTC (permalink / raw)
  To: Sabau, Radu bogdan
  Cc: Lars-Peter Clausen, Hennerich, Michael, David Lechner, Sa, Nuno,
	Andy Shevchenko, Uwe Kleine König, linux-iio@vger.kernel.org,
	linux-kernel@vger.kernel.org

On Thu, 7 May 2026 13:52:20 +0000
"Sabau, Radu bogdan" <Radu.Sabau@analog.com> wrote:

> > -----Original Message-----
> > From: Sabau, Radu bogdan <Radu.Sabau@analog.com>
> > Sent: Thursday, May 7, 2026 3:17 PM  
> 
> ...
> 
> > >  
> > 
> > Hi everyone,
> > 
> > Uhmm..., why was this fix marked as Changes Requested? Is it something I am
> > missing?
> > 
> > Best Regards,
> > Radu  
> 
> I have also had a look here :
> https://sashiko.dev/#/patchset/20260428-ad_sigma_delta-fix-v1-1-8e3f925ee8d2%40analog.com
> 
> Therefore here is the reply to Sashiko's review:
> 
> > For devices that lack the optional disable_one callback,
> > ad_sigma_delta_disable_one() is a no-op. In that scenario,
> > ad_sigma_delta_set_mode() executes the final SPI transfer for the
> > conversion.
> >
> > Because sigma_delta->keep_cs_asserted is still true when set_mode is
> > called, its transfer will carry cs_change = 1. Since disable_one
> > does not issue a subsequent transfer with cs_change = 0, will the SPI
> > framework skip teardown and leave CS permanently stuck low?
> >
> > Could sigma_delta->keep_cs_asserted be cleared before calling
> > ad_sigma_delta_set_mode() to ensure proper teardown, or should an
> > explicit dummy transfer be added?  
> 
> Good catch, thank you. The previous version only moved disable_one()
> after clearing keep_cs_asserted, but left set_mode(AD_SD_MODE_IDLE) in
> the out: block where keep_cs_asserted is still true. For devices that
> do not implement disable_one, set_mode() issues the last SPI transfer,
> so it carries cs_change=1 and CS stays stuck — the same bug reproduced
> on a different code path.
> 
> Fixed by moving set_mode(IDLE) into the out_unlock: block as well, so
> both calls execute after keep_cs_asserted is cleared. This matches the
> pattern already used correctly in ad_sd_calibrate(), which clears
> keep_cs_asserted before calling set_mode(IDLE) and disable_one() in its
> single cleanup block.
> 
> ...
> 
> > I noticed an additional state tracking issue in the error path of
> > ad_sd_buffer_postenable() that wasn't introduced by this patch.
> > When operations like ad_sigma_delta_clear_pending_event() fail, the error
> > path calls spi_bus_unlock() but leaves sigma_delta->bus_locked = true and
> > sigma_delta->keep_cs_asserted = true. Since the IIO core does not invoke
> > predisable on a postenable failure, this state persists.
> >
> > Subsequent SPI operations like direct mode reads will observe
> > bus_locked == true and incorrectly invoke spi_sync_locked(). As the bus
> > is not actually locked at the controller level, this bypasses the
> > SPI framework's bus_lock_mutex.
> >
> > Does this allow concurrent access to the SPI controller from multiple
> > threads, potentially corrupting SPI bus data?  
> 
> Yes, the concern is valid. With bus_locked == true but the controller's
> bus_lock_mutex not held, any concurrent spi_sync() from another driver
> can proceed unobstructed while our driver issues spi_sync_locked() —
> exactly the race bus_lock_mutex is meant to prevent.
> 
> Fixed in the same patch by resetting both keep_cs_asserted and
> bus_locked to false in err_unlock: before calling spi_bus_unlock(),
> consistent with the teardown sequence in predisable().
With that lot in mind I'll drop this version.

thanks,

Jonathan



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-05-07 14:09 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20260428-ad_sigma_delta-fix-v1-1-8e3f925ee8d2@analog.com>
2026-05-07 12:17 ` [PATCH] iio: adc: ad_sigma_delta: fix CS held asserted after single conversion Sabau, Radu bogdan
2026-05-07 13:52   ` Sabau, Radu bogdan
2026-05-07 14:09     ` Jonathan Cameron
2026-05-07 14:07   ` Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox