* [PATCH v2 1/2] iio: adc: adi-axi-adc: add data size support for AD408X backend
2026-07-13 8:40 [PATCH v2 0/2] iio: adc: ad4080: add backend data size configuration Antoniu Miclaus
@ 2026-07-13 8:40 ` Antoniu Miclaus
2026-07-13 8:40 ` [PATCH v2 2/2] iio: adc: ad4080: configure backend data size Antoniu Miclaus
2026-07-23 22:55 ` [PATCH v2 0/2] iio: adc: ad4080: add backend data size configuration Jonathan Cameron
2 siblings, 0 replies; 4+ messages in thread
From: Antoniu Miclaus @ 2026-07-13 8:40 UTC (permalink / raw)
To: Nuno Sá,
Michael Hennerich, Antoniu Miclaus, Jonathan Cameron,
David Lechner, linux, linux-iio, linux-kernel
The AD408X AXI core can pack the sample data on the bus using different
word widths. Expose this through the data_size_set backend operation so
that frontends can program the packet format field (bits 3:2 of the
CNTRL_3 register) according to the ADC resolution: 20-bit, 16-bit and
14-bit map to packet format values 0, 1 and 2 respectively.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
changes in v2:
- No changes.
drivers/iio/adc/adi-axi-adc.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c
index ced0a2321ecf..aac6f4a0705e 100644
--- a/drivers/iio/adc/adi-axi-adc.c
+++ b/drivers/iio/adc/adi-axi-adc.c
@@ -54,6 +54,10 @@
#define AXI_AD485X_PACKET_FORMAT_24BIT 0x1
#define AXI_AD485X_PACKET_FORMAT_32BIT 0x2
#define AXI_AD408X_CNTRL_3_FILTER_EN_MSK BIT(0)
+#define AXI_AD408X_CNTRL_3_PACKET_FORMAT_MSK GENMASK(3, 2)
+#define AXI_AD408X_PACKET_FORMAT_20BIT 0x0
+#define AXI_AD408X_PACKET_FORMAT_16BIT 0x1
+#define AXI_AD408X_PACKET_FORMAT_14BIT 0x2
#define ADI_AXI_ADC_REG_SYNC_STATUS 0x0068
#define ADI_AXI_ADC_SYNC_STATUS_ADC_SYNC_MSK BIT(0)
@@ -437,6 +441,31 @@ static int axi_adc_ad408x_filter_type_set(struct iio_backend *back,
AXI_AD408X_CNTRL_3_FILTER_EN_MSK);
}
+static int axi_adc_ad408x_data_size_set(struct iio_backend *back,
+ unsigned int size)
+{
+ struct adi_axi_adc_state *st = iio_backend_get_priv(back);
+ unsigned int val;
+
+ switch (size) {
+ case 20:
+ val = AXI_AD408X_PACKET_FORMAT_20BIT;
+ break;
+ case 16:
+ val = AXI_AD408X_PACKET_FORMAT_16BIT;
+ break;
+ case 14:
+ val = AXI_AD408X_PACKET_FORMAT_14BIT;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return regmap_update_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3,
+ AXI_AD408X_CNTRL_3_PACKET_FORMAT_MSK,
+ FIELD_PREP(AXI_AD408X_CNTRL_3_PACKET_FORMAT_MSK, val));
+}
+
static int axi_adc_ad408x_interface_data_align(struct iio_backend *back,
u32 timeout_us)
{
@@ -660,6 +689,7 @@ static const struct iio_backend_ops adi_ad408x_ops = {
.free_buffer = axi_adc_free_buffer,
.data_sample_trigger = axi_adc_data_sample_trigger,
.filter_type_set = axi_adc_ad408x_filter_type_set,
+ .data_size_set = axi_adc_ad408x_data_size_set,
.interface_data_align = axi_adc_ad408x_interface_data_align,
.num_lanes_set = axi_adc_num_lanes_set,
.debugfs_reg_access = iio_backend_debugfs_ptr(axi_adc_reg_access),
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v2 2/2] iio: adc: ad4080: configure backend data size
2026-07-13 8:40 [PATCH v2 0/2] iio: adc: ad4080: add backend data size configuration Antoniu Miclaus
2026-07-13 8:40 ` [PATCH v2 1/2] iio: adc: adi-axi-adc: add data size support for AD408X backend Antoniu Miclaus
@ 2026-07-13 8:40 ` Antoniu Miclaus
2026-07-23 22:55 ` [PATCH v2 0/2] iio: adc: ad4080: add backend data size configuration Jonathan Cameron
2 siblings, 0 replies; 4+ messages in thread
From: Antoniu Miclaus @ 2026-07-13 8:40 UTC (permalink / raw)
To: Nuno Sá,
Michael Hennerich, Antoniu Miclaus, Jonathan Cameron,
David Lechner, linux, linux-iio, linux-kernel
The AXI backend needs to know the ADC word width in order to pack the
sample data correctly on the bus. During channel setup, program the
backend packet format via iio_backend_data_size_set() using the channel
resolution, so the data is transferred according to the device's
realbits.
The backend packet format field defaults to 20-bit packing, so the
20-bit parts (AD4080/AD4081/AD4082, AD4880) were unaffected. The 16-bit
(AD4083/AD4084/AD4085, AD4884) and 14-bit (AD4086/AD4087/AD4088) parts,
however, were left packing data at the wrong width, producing corrupt
buffered captures.
Fixes: 6c3e7265734b ("iio: adc: ad4080: add support for AD4084")
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
changes in v2:
- Expand the commit message to describe which parts are affected by the
wrong packet format.
- Add a Fixes tag
drivers/iio/adc/ad4080.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/iio/adc/ad4080.c b/drivers/iio/adc/ad4080.c
index 8d2953341b15..8feb0c7f7fcb 100644
--- a/drivers/iio/adc/ad4080.c
+++ b/drivers/iio/adc/ad4080.c
@@ -698,6 +698,11 @@ static int ad4080_setup_channel(struct ad4080_state *st, unsigned int ch)
if (ret)
return ret;
+ ret = iio_backend_data_size_set(st->back[ch],
+ st->info->channels[0].scan_type.realbits);
+ if (ret)
+ return ret;
+
if (!st->lvds_cnv_en)
return 0;
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2 0/2] iio: adc: ad4080: add backend data size configuration
2026-07-13 8:40 [PATCH v2 0/2] iio: adc: ad4080: add backend data size configuration Antoniu Miclaus
2026-07-13 8:40 ` [PATCH v2 1/2] iio: adc: adi-axi-adc: add data size support for AD408X backend Antoniu Miclaus
2026-07-13 8:40 ` [PATCH v2 2/2] iio: adc: ad4080: configure backend data size Antoniu Miclaus
@ 2026-07-23 22:55 ` Jonathan Cameron
2 siblings, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2026-07-23 22:55 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: Nuno Sá,
Michael Hennerich, David Lechner, linux, linux-iio, linux-kernel
On Mon, 13 Jul 2026 11:40:41 +0300
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> The AD408X AXI core can pack sample data on the bus using different word
> widths (20-bit, 16-bit and 14-bit), selected through the packet format
> field of the CNTRL_3 register. Until now this was left at its default,
> which only matched the AD4080 20-bit resolution.
>
> This series exposes the packet format through a new data_size_set backend
> operation and has the ad4080 driver program it during channel setup based
> on the channel resolution, so the bus packing always matches the device
> realbits.
>
> Patch 1 adds the data_size_set operation to the adi-axi-adc backend.
> Patch 2 calls iio_backend_data_size_set() from the ad4080 channel setup.
>
> Link: https://analogdevicesinc.github.io/hdl/library/axi_ad408x/index.html
Hi Antoniu
B4 noticed you'd missed David's tag for this version. So all worked out
fine in the end but please make sure to carry those forward.
I've applied this to the fixes-togreg branch of iio.git.
Thanks
Jonathan
>
> Changes since v1:
> - Patch 2: expand the commit message to describe which parts were
> affected by the wrong packet format, and added a Fixes tag.
>
> Antoniu Miclaus (2):
> iio: adc: adi-axi-adc: add data size support for AD408X backend
> iio: adc: ad4080: configure backend data size
>
> drivers/iio/adc/ad4080.c | 5 +++++
> drivers/iio/adc/adi-axi-adc.c | 30 ++++++++++++++++++++++++++++++
> 2 files changed, 35 insertions(+)
>
^ permalink raw reply [flat|nested] 4+ messages in thread