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

iio: adc: ad7173: add support for special inputs



 Add support for selecting REF+ and REF- inputs on all models.
 Add support for selecting ((AVDD1 − AVSS)/5) inputs
  on supported models.

Signed-off-by: default avatarDumitru Ceclan <dumitru.ceclan@analog.com>
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Reviewed-by: default avatarDavid Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20240607-ad4111-v7-6-97e3855900a0@analog.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent fc5cdff0
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -66,6 +66,13 @@
	 FIELD_PREP(AD7173_CH_SETUP_AINNEG_MASK, neg))
#define AD7173_AIN_TEMP_POS	17
#define AD7173_AIN_TEMP_NEG	18
#define AD7173_AIN_POW_MON_POS	19
#define AD7173_AIN_POW_MON_NEG	20
#define AD7173_AIN_REF_POS	21
#define AD7173_AIN_REF_NEG	22

#define AD7173_IS_REF_INPUT(x)		((x) == AD7173_AIN_REF_POS || \
					(x) == AD7173_AIN_REF_NEG)

#define AD7172_2_ID			0x00d0
#define AD7175_ID			0x0cd0
@@ -146,6 +153,8 @@ struct ad7173_device_info {
	unsigned int id;
	char *name;
	bool has_temp;
	/* ((AVDD1 − AVSS)/5) */
	bool has_pow_supply_monitoring;
	bool has_input_buf;
	bool has_int_ref;
	bool has_ref2;
@@ -216,6 +225,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
		.has_temp = true,
		.has_input_buf = true,
		.has_int_ref = true,
		.has_pow_supply_monitoring = true,
		.clock = 2 * HZ_PER_MHZ,
		.sinc5_data_rates = ad7173_sinc5_data_rates,
		.num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates),
@@ -230,6 +240,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
		.has_temp = false,
		.has_input_buf = true,
		.has_ref2 = true,
		.has_pow_supply_monitoring = true,
		.clock = 2 * HZ_PER_MHZ,
		.sinc5_data_rates = ad7173_sinc5_data_rates,
		.num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates),
@@ -259,6 +270,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
		.has_temp = true,
		.has_input_buf = true,
		.has_int_ref = true,
		.has_pow_supply_monitoring = true,
		.clock = 16 * HZ_PER_MHZ,
		.sinc5_data_rates = ad7175_sinc5_data_rates,
		.num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates),
@@ -274,6 +286,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
		.has_input_buf = true,
		.has_int_ref = true,
		.has_ref2 = true,
		.has_pow_supply_monitoring = true,
		.clock = 16 * HZ_PER_MHZ,
		.sinc5_data_rates = ad7175_sinc5_data_rates,
		.num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates),
@@ -302,6 +315,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
		.has_temp = true,
		.has_input_buf = true,
		.has_int_ref = true,
		.has_pow_supply_monitoring = true,
		.clock = 16 * HZ_PER_MHZ,
		.odr_start_value = AD7177_ODR_START_VALUE,
		.sinc5_data_rates = ad7175_sinc5_data_rates,
@@ -910,9 +924,18 @@ static int ad7173_validate_voltage_ain_inputs(struct ad7173_state *st,
					      unsigned int ain0, unsigned int ain1)
{
	struct device *dev = &st->sd.spi->dev;
	bool special_input0, special_input1;

	/* (AVDD1-AVSS)/5 power supply monitoring */
	if (ain0 == AD7173_AIN_POW_MON_POS && ain1 == AD7173_AIN_POW_MON_NEG &&
	    st->info->has_pow_supply_monitoring)
		return 0;

	special_input0 = AD7173_IS_REF_INPUT(ain0);
	special_input1 = AD7173_IS_REF_INPUT(ain1);

	if (ain0 >= st->info->num_inputs ||
	    ain1 >= st->info->num_inputs)
	if ((ain0 >= st->info->num_inputs && !special_input0) ||
	    (ain1 >= st->info->num_inputs && !special_input1))
		return dev_err_probe(dev, -EINVAL,
				     "Input pin number out of range for pair (%d %d).\n",
				     ain0, ain1);