iio: adc: ad7173: add support for special inputs
authorDumitru Ceclan <dumitru.ceclan@analog.com>
Fri, 7 Jun 2024 14:53:12 +0000 (17:53 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 25 Jun 2024 20:04:43 +0000 (21:04 +0100)
 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: Dumitru Ceclan <dumitru.ceclan@analog.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20240607-ad4111-v7-6-97e3855900a0@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7173.c

index cacc411..f0696b4 100644 (file)
         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);