[PATCH v3 5/5] iio: adc: ltc2378: Enable triggered buffer data capture
From: Marcelo Schmitt
Date: Tue Jun 16 2026 - 22:06:12 EST
Enable users to run triggered data captures with LTC2378 and similar ADCs.
Signed-off-by: Marcelo Schmitt <marcelo.schmitt@xxxxxxxxxx>
---
Change log v2 -> v3:
- Extracted from main driver file into a separate buffer-specific containment.
drivers/iio/adc/ltc2378-lib-core.c | 17 +++++++-
drivers/iio/adc/ltc2378-triggered-buffer.c | 49 ++++++++++++++++++++++
drivers/iio/adc/ltc2378.h | 15 +++++++
3 files changed, 80 insertions(+), 1 deletion(-)
create mode 100644 drivers/iio/adc/ltc2378-triggered-buffer.c
diff --git a/drivers/iio/adc/ltc2378-lib-core.c b/drivers/iio/adc/ltc2378-lib-core.c
index 1160f4324d01..ec83e9f2ae81 100644
--- a/drivers/iio/adc/ltc2378-lib-core.c
+++ b/drivers/iio/adc/ltc2378-lib-core.c
@@ -18,7 +18,7 @@ int ltc2378_lib_buffer_setup(struct iio_dev *indio_dev, struct ltc2378_state *st
ret = __ltc2378_set_offload_ops(st);
if (ret == -EOPNOTSUPP)
- return 0; /* Let device setup complete without buffer support */
+ goto trigger_buf_setup;
if (!ret)
ret = st->ops->buffer_setup(indio_dev, st);
@@ -27,6 +27,21 @@ int ltc2378_lib_buffer_setup(struct iio_dev *indio_dev, struct ltc2378_state *st
return dev_err_probe(dev, ret, "error on SPI offload setup\n");
return 0;
+
+trigger_buf_setup:
+ ret = __ltc2378_set_triggered_buf_ops(st);
+ if (ret == -EOPNOTSUPP)
+ return 0; /* Let device setup complete without buffer support */
+
+ if (!ret)
+ ret = st->ops->buffer_setup(indio_dev, st);
+
+ if (ret)
+ return dev_err_probe(dev, ret, "error on buffer setup\n");
+
+ st->chans[st->num_iio_chans++] = IIO_CHAN_SOFT_TIMESTAMP(1);
+
+ return 0;
}
EXPORT_SYMBOL_NS_GPL(ltc2378_lib_buffer_setup, "IIO_LTC2378");
diff --git a/drivers/iio/adc/ltc2378-triggered-buffer.c b/drivers/iio/adc/ltc2378-triggered-buffer.c
new file mode 100644
index 000000000000..d1d788fb5cb4
--- /dev/null
+++ b/drivers/iio/adc/ltc2378-triggered-buffer.c
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2026 Analog Devices, Inc.
+ * Author: Marcelo Schmitt <marcelo.schmitt@xxxxxxxxxx>
+ */
+
+#include <linux/iio/buffer.h>
+#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/trigger_consumer.h>
+
+#include <ltc2378.h>
+
+static irqreturn_t ltc2378_trigger_handler(int irq, void *p)
+{
+ struct iio_poll_func *pf = p;
+ struct iio_dev *indio_dev = pf->indio_dev;
+ struct ltc2378_state *st = iio_priv(indio_dev);
+ int ret;
+
+ ret = ltc2378_convert_and_acquire(st);
+ if (ret < 0)
+ goto err_out;
+
+ iio_push_to_buffers_with_ts(indio_dev, &st->scan, sizeof(st->scan),
+ pf->timestamp);
+
+err_out:
+ iio_trigger_notify_done(indio_dev->trig);
+ return IRQ_HANDLED;
+}
+
+static int ltc2378_triggered_buffer_setup(struct iio_dev *indio_dev, struct ltc2378_state *st)
+{
+ return devm_iio_triggered_buffer_setup(&st->spi->dev, indio_dev,
+ &iio_pollfunc_store_time,
+ <c2378_trigger_handler,
+ NULL);
+}
+
+static const struct ltc2378_ops ltc2378_triggered_buf_ops = {
+ .buffer_setup = ltc2378_triggered_buffer_setup,
+};
+
+int ltc2378_set_triggered_buf_ops(struct ltc2378_state *st)
+{
+ st->ops = <c2378_triggered_buf_ops;
+ return 0;
+}
+EXPORT_SYMBOL_NS_GPL(ltc2378_set_triggered_buf_ops, "IIO_LTC2378");
diff --git a/drivers/iio/adc/ltc2378.h b/drivers/iio/adc/ltc2378.h
index f6e10f9a83e0..4241b1e79ac0 100644
--- a/drivers/iio/adc/ltc2378.h
+++ b/drivers/iio/adc/ltc2378.h
@@ -89,6 +89,8 @@ int ltc2378_lib_buffer_setup(struct iio_dev *indio_dev, struct ltc2378_state *st
#define __ltc2378_set_offload_ops(st) ltc2378_set_offload_ops((st))
+#define __ltc2378_set_triggered_buf_ops(st) ltc2378_set_triggered_buf_ops((st))
+
#ifdef CONFIG_LTC2378_LIB_OFFLOAD_BUFFER
int ltc2378_set_offload_ops(struct ltc2378_state *st);
@@ -102,4 +104,17 @@ static inline int ltc2378_set_offload_ops(struct ltc2378_state *st)
#endif /* CONFIG_LTC2378_LIB_OFFLOAD_BUFFER */
+#ifdef CONFIG_LTC2378_LIB_TRIGGERED_BUFFER
+
+int ltc2378_set_triggered_buf_ops(struct ltc2378_state *st);
+
+#else
+
+static inline int ltc2378_set_triggered_buf_ops(struct ltc2378_state *st)
+{
+ return -EOPNOTSUPP;
+}
+
+#endif /* CONFIG_LTC2378_LIB_TRIGGERED_BUFFER */
+
#endif /* __DRIVERS_IIO_ADC_LTC2378_H__ */
--
2.53.0