]> www.infradead.org Git - users/hch/misc.git/commitdiff
iio: adc: adi-axi-adc: add data align process
authorAntoniu Miclaus <antoniu.miclaus@analog.com>
Fri, 16 May 2025 08:26:26 +0000 (11:26 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 9 Jun 2025 06:45:34 +0000 (07:45 +0100)
Add support for starting the sync process used for data
capture alignment.

Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
Link: https://patch.msgid.link/20250516082630.8236-7-antoniu.miclaus@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/adi-axi-adc.c

index 9531aa39faeee2efb240ae6fa742384697702849..a21e5a7e13cfe89738c214234f6369c10382acb5 100644 (file)
@@ -44,6 +44,7 @@
 #define   ADI_AXI_ADC_REG_CONFIG_CMOS_OR_LVDS_N        BIT(7)
 
 #define ADI_AXI_ADC_REG_CTRL                   0x0044
+#define    ADI_AXI_ADC_CTRL_SYNC_MSK           BIT(3)
 #define    ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK   BIT(1)
 
 #define ADI_AXI_ADC_REG_CNTRL_3                        0x004c
@@ -54,6 +55,9 @@
 #define   AXI_AD485X_PACKET_FORMAT_32BIT       0x2
 #define   AXI_AD408X_CNTRL_3_FILTER_EN_MSK     BIT(0)
 
+#define ADI_AXI_ADC_REG_SYNC_STATUS            0x0068
+#define   ADI_AXI_ADC_SYNC_STATUS_ADC_SYNC_MSK BIT(0)
+
 #define ADI_AXI_ADC_REG_DRP_STATUS             0x0074
 #define   ADI_AXI_ADC_DRP_LOCKED               BIT(17)
 
@@ -416,6 +420,24 @@ static int axi_adc_ad408x_filter_type_set(struct iio_backend *back,
                                 AXI_AD408X_CNTRL_3_FILTER_EN_MSK);
 }
 
+static int axi_adc_ad408x_interface_data_align(struct iio_backend *back,
+                                              u32 timeout_us)
+{
+       struct adi_axi_adc_state *st = iio_backend_get_priv(back);
+       u32 val;
+       int ret;
+
+       ret = regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CTRL,
+                             ADI_AXI_ADC_CTRL_SYNC_MSK);
+       if (ret)
+               return ret;
+
+       return regmap_read_poll_timeout(st->regmap, ADI_AXI_ADC_REG_SYNC_STATUS,
+                                       val,
+                                       FIELD_GET(ADI_AXI_ADC_SYNC_STATUS_ADC_SYNC_MSK, val),
+                                       1, timeout_us);
+}
+
 static struct iio_buffer *axi_adc_request_buffer(struct iio_backend *back,
                                                 struct iio_dev *indio_dev)
 {
@@ -605,6 +627,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,
+       .interface_data_align = axi_adc_ad408x_interface_data_align,
        .debugfs_reg_access = iio_backend_debugfs_ptr(axi_adc_reg_access),
        .debugfs_print_chan_status = iio_backend_debugfs_ptr(axi_adc_debugfs_print_chan_status),
 };