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

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.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent fc5cdff0
...@@ -66,6 +66,13 @@ ...@@ -66,6 +66,13 @@
FIELD_PREP(AD7173_CH_SETUP_AINNEG_MASK, neg)) FIELD_PREP(AD7173_CH_SETUP_AINNEG_MASK, neg))
#define AD7173_AIN_TEMP_POS 17 #define AD7173_AIN_TEMP_POS 17
#define AD7173_AIN_TEMP_NEG 18 #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 AD7172_2_ID 0x00d0
#define AD7175_ID 0x0cd0 #define AD7175_ID 0x0cd0
...@@ -146,6 +153,8 @@ struct ad7173_device_info { ...@@ -146,6 +153,8 @@ struct ad7173_device_info {
unsigned int id; unsigned int id;
char *name; char *name;
bool has_temp; bool has_temp;
/* ((AVDD1 − AVSS)/5) */
bool has_pow_supply_monitoring;
bool has_input_buf; bool has_input_buf;
bool has_int_ref; bool has_int_ref;
bool has_ref2; bool has_ref2;
...@@ -216,6 +225,7 @@ static const struct ad7173_device_info ad7173_device_info[] = { ...@@ -216,6 +225,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
.has_temp = true, .has_temp = true,
.has_input_buf = true, .has_input_buf = true,
.has_int_ref = true, .has_int_ref = true,
.has_pow_supply_monitoring = true,
.clock = 2 * HZ_PER_MHZ, .clock = 2 * HZ_PER_MHZ,
.sinc5_data_rates = ad7173_sinc5_data_rates, .sinc5_data_rates = ad7173_sinc5_data_rates,
.num_sinc5_data_rates = ARRAY_SIZE(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[] = { ...@@ -230,6 +240,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
.has_temp = false, .has_temp = false,
.has_input_buf = true, .has_input_buf = true,
.has_ref2 = true, .has_ref2 = true,
.has_pow_supply_monitoring = true,
.clock = 2 * HZ_PER_MHZ, .clock = 2 * HZ_PER_MHZ,
.sinc5_data_rates = ad7173_sinc5_data_rates, .sinc5_data_rates = ad7173_sinc5_data_rates,
.num_sinc5_data_rates = ARRAY_SIZE(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[] = { ...@@ -259,6 +270,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
.has_temp = true, .has_temp = true,
.has_input_buf = true, .has_input_buf = true,
.has_int_ref = true, .has_int_ref = true,
.has_pow_supply_monitoring = true,
.clock = 16 * HZ_PER_MHZ, .clock = 16 * HZ_PER_MHZ,
.sinc5_data_rates = ad7175_sinc5_data_rates, .sinc5_data_rates = ad7175_sinc5_data_rates,
.num_sinc5_data_rates = ARRAY_SIZE(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[] = { ...@@ -274,6 +286,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
.has_input_buf = true, .has_input_buf = true,
.has_int_ref = true, .has_int_ref = true,
.has_ref2 = true, .has_ref2 = true,
.has_pow_supply_monitoring = true,
.clock = 16 * HZ_PER_MHZ, .clock = 16 * HZ_PER_MHZ,
.sinc5_data_rates = ad7175_sinc5_data_rates, .sinc5_data_rates = ad7175_sinc5_data_rates,
.num_sinc5_data_rates = ARRAY_SIZE(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[] = { ...@@ -302,6 +315,7 @@ static const struct ad7173_device_info ad7173_device_info[] = {
.has_temp = true, .has_temp = true,
.has_input_buf = true, .has_input_buf = true,
.has_int_ref = true, .has_int_ref = true,
.has_pow_supply_monitoring = true,
.clock = 16 * HZ_PER_MHZ, .clock = 16 * HZ_PER_MHZ,
.odr_start_value = AD7177_ODR_START_VALUE, .odr_start_value = AD7177_ODR_START_VALUE,
.sinc5_data_rates = ad7175_sinc5_data_rates, .sinc5_data_rates = ad7175_sinc5_data_rates,
...@@ -910,9 +924,18 @@ static int ad7173_validate_voltage_ain_inputs(struct ad7173_state *st, ...@@ -910,9 +924,18 @@ static int ad7173_validate_voltage_ain_inputs(struct ad7173_state *st,
unsigned int ain0, unsigned int ain1) unsigned int ain0, unsigned int ain1)
{ {
struct device *dev = &st->sd.spi->dev; 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 || if ((ain0 >= st->info->num_inputs && !special_input0) ||
ain1 >= st->info->num_inputs) (ain1 >= st->info->num_inputs && !special_input1))
return dev_err_probe(dev, -EINVAL, return dev_err_probe(dev, -EINVAL,
"Input pin number out of range for pair (%d %d).\n", "Input pin number out of range for pair (%d %d).\n",
ain0, ain1); ain0, ain1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment