]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: nxp-sar-adc: harden buffer ISR against per-channel read failure
authorStepan Ionichev <sozdayvek@gmail.com>
Mon, 18 May 2026 18:11:38 +0000 (23:11 +0500)
committerJonathan Cameron <jic23@kernel.org>
Wed, 3 Jun 2026 17:29:09 +0000 (18:29 +0100)
nxp_sar_adc_isr_buffer() bails on the first channel-read failure
without calling iio_trigger_notify_done(), so the trigger use_count
is left incremented and iio_trigger_poll_chained() drops subsequent
dispatches until the device is rebound.

Reaching this path means a state machine has gone wrong (driver bug
or the SAR ADC in an unexpected state) rather than a transient bus
issue, so this is hardening rather than a bug fix. If the underlying
condition persists the device is wedged and needs an unbind anyway.

Call iio_trigger_notify_done() on the error exit too, matching the
success path. The nxp_sar_adc_read_notify() duplication is intentional
and avoids a goto label for a two-line bail-out, as suggested by David.

Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/adc/nxp-sar-adc.c

index 01f3da56e9876fdd9078587fcd8ce3b4ec0df70a..15c7432808f46be4173ceb7f7d8fb12cd3e4e4ce 100644 (file)
@@ -346,6 +346,7 @@ static void nxp_sar_adc_isr_buffer(struct iio_dev *indio_dev)
                ret = nxp_sar_adc_read_data(info, info->buffered_chan[i]);
                if (ret < 0) {
                        nxp_sar_adc_read_notify(info);
+                       iio_trigger_notify_done(indio_dev->trig);
                        return;
                }