iio: adc: ltc2309: use devm_regulator_get_enable_read_voltage()
authorDavid Lechner <dlechner@baylibre.com>
Fri, 21 Jun 2024 22:11:52 +0000 (17:11 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 25 Jun 2024 20:04:51 +0000 (21:04 +0100)
Use devm_regulator_get_enable_read_voltage() to simplify the code.
Error message is changed since there is only one error return now.
LTC2309_INTERNAL_REF_MV macro is added to make the internal reference
voltage value self-documenting.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Link: https://patch.msgid.link/20240621-iio-regulator-refactor-round-2-v1-5-49e50cd0b99a@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ltc2309.c

index 8b3a89c1b840f56f87883b5350e4ff73f8e771f9..888a71454070f69f9ae7cfbf9d3e27f640e5fc0b 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/regulator/consumer.h>
 
 #define LTC2309_ADC_RESOLUTION 12
+#define LTC2309_INTERNAL_REF_MV 4096
 
 #define LTC2309_DIN_CH_MASK    GENMASK(7, 4)
 #define LTC2309_DIN_SDN                BIT(7)
  * struct ltc2309 - internal device data structure
  * @dev:       Device reference
  * @client:    I2C reference
- * @vref:      External reference source
  * @lock:      Lock to serialize data access
  * @vref_mv:   Internal voltage reference
  */
 struct ltc2309 {
        struct device           *dev;
        struct i2c_client       *client;
-       struct regulator        *vref;
        struct mutex            lock; /* serialize data access */
        int                     vref_mv;
 };
@@ -157,11 +156,6 @@ static const struct iio_info ltc2309_info = {
        .read_raw = ltc2309_read_raw,
 };
 
-static void ltc2309_regulator_disable(void *regulator)
-{
-       regulator_disable(regulator);
-}
-
 static int ltc2309_probe(struct i2c_client *client)
 {
        struct iio_dev *indio_dev;
@@ -175,7 +169,6 @@ static int ltc2309_probe(struct i2c_client *client)
        ltc2309 = iio_priv(indio_dev);
        ltc2309->dev = &indio_dev->dev;
        ltc2309->client = client;
-       ltc2309->vref_mv = 4096; /* Default to the internal ref */
 
        indio_dev->name = "ltc2309";
        indio_dev->modes = INDIO_DIRECT_MODE;
@@ -183,36 +176,12 @@ static int ltc2309_probe(struct i2c_client *client)
        indio_dev->num_channels = ARRAY_SIZE(ltc2309_channels);
        indio_dev->info = &ltc2309_info;
 
-       ltc2309->vref = devm_regulator_get_optional(&client->dev, "vref");
-       if (IS_ERR(ltc2309->vref)) {
-               ret = PTR_ERR(ltc2309->vref);
-               if (ret == -ENODEV)
-                       ltc2309->vref = NULL;
-               else
-                       return ret;
-       }
+       ret = devm_regulator_get_enable_read_voltage(&client->dev, "vref");
+       if (ret < 0 && ret != -ENODEV)
+               return dev_err_probe(ltc2309->dev, ret,
+                                    "failed to get vref voltage\n");
 
-       if (ltc2309->vref) {
-               ret = regulator_enable(ltc2309->vref);
-               if (ret)
-                       return dev_err_probe(ltc2309->dev, ret,
-                                            "failed to enable vref\n");
-
-               ret = devm_add_action_or_reset(ltc2309->dev,
-                                              ltc2309_regulator_disable,
-                                              ltc2309->vref);
-               if (ret) {
-                       return dev_err_probe(ltc2309->dev, ret,
-                                            "failed to add regulator_disable action: %d\n",
-                                            ret);
-               }
-
-               ret = regulator_get_voltage(ltc2309->vref);
-               if (ret < 0)
-                       return ret;
-
-               ltc2309->vref_mv = ret / 1000;
-       }
+       ltc2309->vref_mv = ret == -ENODEV ? LTC2309_INTERNAL_REF_MV : ret / 1000;
 
        mutex_init(&ltc2309->lock);