]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage()
authorDavid Lechner <dlechner@baylibre.com>
Wed, 20 Nov 2024 21:33:31 +0000 (15:33 -0600)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 7 Dec 2024 17:47:57 +0000 (17:47 +0000)
Simplify the code by using devm_regulator_get_enable_read_voltage().

Some use of dev_err() is replaced with dev_err_probe() to simplify
things even more since we are refactoring these lines anyway.

Signed-off-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20241120-iio-regulator-cleanup-round-6-v1-8-d5a5360f7ec3@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/dac/ltc2632.c

index a4fb2509c950a15d5bfbb410d7f0656b3aafedfb..28f8347eb687e2bee3e960ab84cd8c58f30b0884 100644 (file)
@@ -41,13 +41,11 @@ struct ltc2632_chip_info {
  * @spi_dev:                   pointer to the spi_device struct
  * @powerdown_cache_mask:      used to show current channel powerdown state
  * @vref_mv:                   used reference voltage (internal or external)
- * @vref_reg:          regulator for the reference voltage
  */
 struct ltc2632_state {
        struct spi_device *spi_dev;
        unsigned int powerdown_cache_mask;
        int vref_mv;
-       struct regulator *vref_reg;
 };
 
 enum ltc2632_supported_device_ids {
@@ -310,6 +308,7 @@ static int ltc2632_probe(struct spi_device *spi)
        struct ltc2632_state *st;
        struct iio_dev *indio_dev;
        struct ltc2632_chip_info *chip_info;
+       bool has_external_vref;
        int ret;
 
        indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
@@ -324,43 +323,26 @@ static int ltc2632_probe(struct spi_device *spi)
        chip_info = (struct ltc2632_chip_info *)
                        spi_get_device_id(spi)->driver_data;
 
-       st->vref_reg = devm_regulator_get_optional(&spi->dev, "vref");
-       if (PTR_ERR(st->vref_reg) == -ENODEV) {
-               /* use internal reference voltage */
-               st->vref_reg = NULL;
-               st->vref_mv = chip_info->vref_mv;
+       ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref");
+       if (ret < 0 && ret != -ENODEV)
+               return dev_err_probe(&spi->dev, ret,
+                                    "Failed to get vref regulator voltage\n");
 
-               ret = ltc2632_spi_write(spi, LTC2632_CMD_INTERNAL_REFER,
-                               0, 0, 0);
-               if (ret) {
-                       dev_err(&spi->dev,
-                               "Set internal reference command failed, %d\n",
-                               ret);
-                       return ret;
-               }
-       } else if (IS_ERR(st->vref_reg)) {
-               dev_err(&spi->dev,
-                               "Error getting voltage reference regulator\n");
-               return PTR_ERR(st->vref_reg);
-       } else {
-               /* use external reference voltage */
-               ret = regulator_enable(st->vref_reg);
-               if (ret) {
-                       dev_err(&spi->dev,
-                               "enable reference regulator failed, %d\n",
-                               ret);
-                       return ret;
-               }
-               st->vref_mv = regulator_get_voltage(st->vref_reg) / 1000;
+       has_external_vref = ret != -ENODEV;
+       st->vref_mv = has_external_vref ? ret / 1000 : chip_info->vref_mv;
 
+       if (has_external_vref) {
                ret = ltc2632_spi_write(spi, LTC2632_CMD_EXTERNAL_REFER,
-                               0, 0, 0);
-               if (ret) {
-                       dev_err(&spi->dev,
-                               "Set external reference command failed, %d\n",
-                               ret);
-                       return ret;
-               }
+                                       0, 0, 0);
+               if (ret)
+                       return dev_err_probe(&spi->dev, ret,
+                               "Set external reference command failed\n");
+       } else {
+               ret = ltc2632_spi_write(spi, LTC2632_CMD_INTERNAL_REFER,
+                                       0, 0, 0);
+               if (ret)
+                       return dev_err_probe(&spi->dev, ret,
+                               "Set internal reference command failed\n");
        }
 
        indio_dev->name = fwnode_get_name(dev_fwnode(&spi->dev)) ?: spi_get_device_id(spi)->name;
@@ -375,12 +357,8 @@ static int ltc2632_probe(struct spi_device *spi)
 static void ltc2632_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
-       struct ltc2632_state *st = iio_priv(indio_dev);
 
        iio_device_unregister(indio_dev);
-
-       if (st->vref_reg)
-               regulator_disable(st->vref_reg);
 }
 
 static const struct spi_device_id ltc2632_id[] = {