]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad7768-1: fix one-shot mode data acquisition
authorJonathan Santos <Jonathan.Santos@analog.com>
Mon, 23 Feb 2026 11:59:26 +0000 (08:59 -0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 1 Mar 2026 12:06:57 +0000 (12:06 +0000)
According to the datasheet, one-shot mode requires a SYNC_IN pulse to
trigger a new sample conversion. In the current implementation, No sync
pulse was sent after switching to one-shot mode and reinit_completion()
was called before mode switching, creating a race condition where spurious
interrupts during mode change could trigger completion prematurely.

Fix by sending a sync pulse after configuring one-shot mode and
reinit_completion() to ensure it only waits for the actual conversion
completion.

Fixes: a5f8c7da3dbe ("iio: adc: Add AD7768-1 ADC basic support")
Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7768-1.c

index fcd8aea7152e8caea8b79db69533b52670d839d0..4cb63ab4768a7835191cf8e60bf0f2d30392f76e 100644 (file)
@@ -463,12 +463,17 @@ static int ad7768_scan_direct(struct iio_dev *indio_dev)
        struct ad7768_state *st = iio_priv(indio_dev);
        int readval, ret;
 
-       reinit_completion(&st->completion);
-
        ret = ad7768_set_mode(st, AD7768_ONE_SHOT);
        if (ret < 0)
                return ret;
 
+       reinit_completion(&st->completion);
+
+       /* One-shot mode requires a SYNC pulse to generate a new sample */
+       ret = ad7768_send_sync_pulse(st);
+       if (ret)
+               return ret;
+
        ret = wait_for_completion_timeout(&st->completion,
                                          msecs_to_jiffies(1000));
        if (!ret)