Commit 819b69ab authored by Dumitru Ceclan's avatar Dumitru Ceclan Committed by Jonathan Cameron
Browse files

iio: adc: ad7173: add support for ad4113



This commit adds support for the AD4113 ADC.
The AD4113 is a low power, low noise, 16-bit, Σ-Δ analog-to-digital
converter (ADC) that integrates an analog front end (AFE) for four
fully differential or eight single-ended inputs.

Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Signed-off-by: default avatarDumitru Ceclan <dumitru.ceclan@analog.com>
Link: https://patch.msgid.link/20240812-ad4113-v3-3-046e785dd253@analog.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 8a9687b3
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
 * AD717x and AD411x family SPI ADC driver
 *
 * Supported devices:
 *  AD4111/AD4112/AD4114/AD4115/AD4116
 *  AD4111/AD4112/AD4113/AD4114/AD4115/AD4116
 *  AD7172-2/AD7172-4/AD7173-8/AD7175-2
 *  AD7175-8/AD7176-2/AD7177-2
 *
@@ -84,6 +84,7 @@
#define AD4111_ID			AD7173_ID
#define AD4112_ID			AD7173_ID
#define AD4114_ID			AD7173_ID
#define AD4113_ID			0x31d0
#define AD4116_ID			0x34d0
#define AD4115_ID			0x38d0
#define AD7175_8_ID			0x3cd0
@@ -170,6 +171,7 @@ struct ad7173_device_info {
	bool has_temp;
	/* ((AVDD1 − AVSS)/5) */
	bool has_pow_supply_monitoring;
	bool data_reg_only_16bit;
	bool has_input_buf;
	bool has_int_ref;
	bool has_ref2;
@@ -294,6 +296,24 @@ static const struct ad7173_device_info ad4112_device_info = {
	.num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates),
};

static const struct ad7173_device_info ad4113_device_info = {
	.name = "ad4113",
	.id = AD4113_ID,
	.num_voltage_in_div = 8,
	.num_channels = 16,
	.num_configs = 8,
	.num_voltage_in = 8,
	.num_gpios = 2,
	.data_reg_only_16bit = true,
	.higher_gpio_bits = true,
	.has_vincom_input = true,
	.has_input_buf = true,
	.has_int_ref = true,
	.clock = 2 * HZ_PER_MHZ,
	.sinc5_data_rates = ad7173_sinc5_data_rates,
	.num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates),
};

static const struct ad7173_device_info ad4114_device_info = {
	.name = "ad4114",
	.id = AD4114_ID,
@@ -985,6 +1005,13 @@ static const struct iio_info ad7173_info = {
	.update_scan_mode = ad7173_update_scan_mode,
};

static const struct iio_scan_type ad4113_scan_type = {
	.sign = 'u',
	.realbits = 16,
	.storagebits = 16,
	.endianness = IIO_BE,
};

static const struct iio_chan_spec ad7173_channel_template = {
	.type = IIO_VOLTAGE,
	.indexed = 1,
@@ -1226,6 +1253,8 @@ static int ad7173_fw_parse_channel_config(struct iio_dev *indio_dev)
		chan_st_priv->cfg.input_buf = st->info->has_input_buf;
		chan_st_priv->cfg.ref_sel = AD7173_SETUP_REF_SEL_INT_REF;
		st->adc_mode |= AD7173_ADC_MODE_REF_EN;
		if (st->info->data_reg_only_16bit)
			chan_arr[chan_index].scan_type = ad4113_scan_type;

		chan_index++;
	}
@@ -1306,6 +1335,9 @@ static int ad7173_fw_parse_channel_config(struct iio_dev *indio_dev)
			chan_st_priv->ain = AD7173_CH_ADDRESS(ain[0], ain[1]);
		}

		if (st->info->data_reg_only_16bit)
			chan_arr[chan_index].scan_type = ad4113_scan_type;

		chan_index++;
	}
	return 0;
@@ -1434,6 +1466,7 @@ static int ad7173_probe(struct spi_device *spi)
static const struct of_device_id ad7173_of_match[] = {
	{ .compatible = "adi,ad4111",	.data = &ad4111_device_info },
	{ .compatible = "adi,ad4112",	.data = &ad4112_device_info },
	{ .compatible = "adi,ad4113",	.data = &ad4113_device_info },
	{ .compatible = "adi,ad4114",	.data = &ad4114_device_info },
	{ .compatible = "adi,ad4115",	.data = &ad4115_device_info },
	{ .compatible = "adi,ad4116",	.data = &ad4116_device_info },
@@ -1451,6 +1484,7 @@ MODULE_DEVICE_TABLE(of, ad7173_of_match);
static const struct spi_device_id ad7173_id_table[] = {
	{ "ad4111",   (kernel_ulong_t)&ad4111_device_info },
	{ "ad4112",   (kernel_ulong_t)&ad4112_device_info },
	{ "ad4113",   (kernel_ulong_t)&ad4113_device_info },
	{ "ad4114",   (kernel_ulong_t)&ad4114_device_info },
	{ "ad4115",   (kernel_ulong_t)&ad4115_device_info },
	{ "ad4116",   (kernel_ulong_t)&ad4116_device_info },