* 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