iio: dac: ad5504: use devm_regulator_get_enable_read_voltage()
authorDavid Lechner <dlechner@baylibre.com>
Wed, 23 Oct 2024 23:54:09 +0000 (18:54 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 1 Nov 2024 14:54:46 +0000 (14:54 +0000)
Simplify the code by using devm_regulator_get_enable_read_voltage().

Signed-off-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20241023-iio-regulator-refactor-round-5-v1-5-d0bd396b3f50@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/dac/ad5504.c

index 305cd58..f171795 100644 (file)
@@ -273,35 +273,27 @@ static int ad5504_probe(struct spi_device *spi)
        const struct ad5504_platform_data *pdata = dev_get_platdata(&spi->dev);
        struct iio_dev *indio_dev;
        struct ad5504_state *st;
-       struct regulator *reg;
-       int ret, voltage_uv = 0;
+       int ret;
 
        indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
        if (!indio_dev)
                return -ENOMEM;
-       reg = devm_regulator_get(&spi->dev, "vcc");
-       if (!IS_ERR(reg)) {
-               ret = regulator_enable(reg);
-               if (ret)
-                       return ret;
-
-               ret = regulator_get_voltage(reg);
-               if (ret < 0)
-                       goto error_disable_reg;
-
-               voltage_uv = ret;
-       }
 
        spi_set_drvdata(spi, indio_dev);
        st = iio_priv(indio_dev);
-       if (voltage_uv)
-               st->vref_mv = voltage_uv / 1000;
-       else if (pdata)
-               st->vref_mv = pdata->vref_mv;
-       else
-               dev_warn(&spi->dev, "reference voltage unspecified\n");
 
-       st->reg = reg;
+       ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vcc");
+       if (ret < 0 && ret != -ENODEV)
+               return ret;
+       if (ret == -ENODEV) {
+               if (pdata->vref_mv)
+                       st->vref_mv = pdata->vref_mv;
+               else
+                       dev_warn(&spi->dev, "reference voltage unspecified\n");
+       } else {
+               st->vref_mv = ret / 1000;
+       }
+
        st->spi = spi;
        indio_dev->name = spi_get_device_id(st->spi)->name;
        indio_dev->info = &ad5504_info;
@@ -320,31 +312,17 @@ static int ad5504_probe(struct spi_device *spi)
                                           spi_get_device_id(st->spi)->name,
                                           indio_dev);
                if (ret)
-                       goto error_disable_reg;
+                       return ret;
        }
 
-       ret = iio_device_register(indio_dev);
-       if (ret)
-               goto error_disable_reg;
-
-       return 0;
-
-error_disable_reg:
-       if (!IS_ERR(reg))
-               regulator_disable(reg);
-
-       return ret;
+       return iio_device_register(indio_dev);
 }
 
 static void ad5504_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
-       struct ad5504_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-
-       if (!IS_ERR(st->reg))
-               regulator_disable(st->reg);
 }
 
 static const struct spi_device_id ad5504_id[] = {