mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
iio: adc: adi-axi-adc: add data size support for AD408X backend
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> Reviewed-by: David Lechner <dlechner@baylibre.com> Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
This commit is contained in:
parent
bcd3f72e26
commit
60f6f7fd5f
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user