]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: adc: ad7380: fix supplies for ad7380-4
authorJulien Stephan <jstephan@baylibre.com>
Tue, 22 Oct 2024 13:22:39 +0000 (15:22 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 24 Oct 2024 17:30:47 +0000 (18:30 +0100)
ad7380-4 is the only device in the family that does not have an internal
reference. It uses "refin" as a required external reference.
All other devices in the family use "refio"" as an optional external
reference.

Fixes: 737413da8704 ("iio: adc: ad7380: add support for ad738x-4 4 channels variants")
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Julien Stephan <jstephan@baylibre.com>
Link: https://patch.msgid.link/20241022-ad7380-fix-supplies-v3-4-f0cefe1b7fa6@baylibre.com
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7380.c

index b107d8e97ab36f7aed4685f18e0f398d63fd1e8d..fb728570debe6432d5f991595cb35e9e7af8b740 100644 (file)
@@ -89,6 +89,7 @@ struct ad7380_chip_info {
        bool has_mux;
        const char * const *supplies;
        unsigned int num_supplies;
+       bool external_ref_only;
        const char * const *vcm_supplies;
        unsigned int num_vcm_supplies;
        const unsigned long *available_scan_masks;
@@ -431,6 +432,7 @@ static const struct ad7380_chip_info ad7380_4_chip_info = {
        .num_simult_channels = 4,
        .supplies = ad7380_supplies,
        .num_supplies = ARRAY_SIZE(ad7380_supplies),
+       .external_ref_only = true,
        .available_scan_masks = ad7380_4_channel_scan_masks,
        .timing_specs = &ad7380_4_timing,
 };
@@ -1047,17 +1049,31 @@ static int ad7380_probe(struct spi_device *spi)
                                     "Failed to enable power supplies\n");
        fsleep(T_POWERUP_US);
 
-       /*
-        * If there is no REFIO supply, then it means that we are using
-        * the internal 2.5V reference, otherwise REFIO is reference voltage.
-        */
-       ret = devm_regulator_get_enable_read_voltage(&spi->dev, "refio");
-       if (ret < 0 && ret != -ENODEV)
-               return dev_err_probe(&spi->dev, ret,
-                                    "Failed to get refio regulator\n");
+       if (st->chip_info->external_ref_only) {
+               ret = devm_regulator_get_enable_read_voltage(&spi->dev,
+                                                            "refin");
+               if (ret < 0)
+                       return dev_err_probe(&spi->dev, ret,
+                                            "Failed to get refin regulator\n");
+
+               st->vref_mv = ret / 1000;
 
-       external_ref_en = ret != -ENODEV;
-       st->vref_mv = external_ref_en ? ret / 1000 : AD7380_INTERNAL_REF_MV;
+               /* these chips don't have a register bit for this */
+               external_ref_en = false;
+       } else {
+               /*
+                * If there is no REFIO supply, then it means that we are using
+                * the internal reference, otherwise REFIO is reference voltage.
+                */
+               ret = devm_regulator_get_enable_read_voltage(&spi->dev,
+                                                            "refio");
+               if (ret < 0 && ret != -ENODEV)
+                       return dev_err_probe(&spi->dev, ret,
+                                            "Failed to get refio regulator\n");
+
+               external_ref_en = ret != -ENODEV;
+               st->vref_mv = external_ref_en ? ret / 1000 : AD7380_INTERNAL_REF_MV;
+       }
 
        if (st->chip_info->num_vcm_supplies > ARRAY_SIZE(st->vcm_mv))
                return dev_err_probe(&spi->dev, -EINVAL,