Linux IIO development
 help / color / mirror / Atom feed
* [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6
@ 2024-11-20 21:33 David Lechner
  2024-11-20 21:33 ` [PATCH 01/11] iio: dac: ad5624r: fix struct name in doc comment David Lechner
                   ` (10 more replies)
  0 siblings, 11 replies; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

This series includes the last of the low-hanging fruit for converting
to devm_regulator_get_enable_read_voltage().

By low-hanging fruit, I mean that these are the drivers that read the
voltage of a regulator in the probe function. If you grep for this, you
will still find a few that do this, but in those cases, they usually
have power management where we need a handle to the regulator to power
things down and back up in suspend/resume. So we can't take advantage of
this helper function in those cases.

There is another class of drivers that could potentially make use of
this helper function that I haven't addressed. There are many drivers
that call regulator_get_voltage() in the IIO_CHAN_INFO_SCALE case of
the read_raw() callback. In most of these cases we could move the call
to regulator_get_voltage() to the probe function and store the value in
the private data structure instead. For those, we would need to be a bit
careful though to make sure the the intention wasn't to handle a change
in voltage during operation.

As a bonus, this series also includes a few other minor cleanups to fix
some copy/paste typos and remove some driver remove() callbacks.

---
David Lechner (11):
      iio: dac: ad5624r: fix struct name in doc comment
      iio: dac: ad5686: fix struct name in doc comment
      iio: dac: ad5686: use devm_regulator_get_enable_read_voltage()
      iio: dac: ad5686: drop driver remove function
      iio: dac: ad7293: use devm_regulator_get_enable_read_voltage()
      iio: dac: ad8801: use devm_regulator_get_enable_read_voltage()
      iio: dac ad8801: drop driver remove function
      iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage()
      iio: dac ltc2632: drop driver remove function
      iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage()
      iio: dac: max5821: use devm_regulator_get_enable_read_voltage()

 drivers/iio/dac/ad5624r.h    |  2 +-
 drivers/iio/dac/ad5686-spi.c |  6 ----
 drivers/iio/dac/ad5686.c     | 62 ++++++++-------------------------
 drivers/iio/dac/ad5686.h     |  6 +---
 drivers/iio/dac/ad5696-i2c.c |  6 ----
 drivers/iio/dac/ad7293.c     | 66 ++++++------------------------------
 drivers/iio/dac/ad8801.c     | 81 +++++++-------------------------------------
 drivers/iio/dac/ltc2632.c    | 69 +++++++++++--------------------------
 drivers/iio/dac/ltc2688.c    | 44 ++++++------------------
 drivers/iio/dac/max5821.c    | 36 +++-----------------
 10 files changed, 74 insertions(+), 304 deletions(-)
---
base-commit: 414c97c966b69e4a6ea7b32970fa166b2f9b9ef0
change-id: 20241120-iio-regulator-cleanup-round-6-78b05be06718

Best regards,
-- 
David Lechner <dlechner@baylibre.com>


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 01/11] iio: dac: ad5624r: fix struct name in doc comment
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-20 21:33 ` [PATCH 02/11] iio: dac: ad5686: " David Lechner
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Fix a copy/paste mistake in the struct ad5624r_state doc comment.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad5624r.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/dac/ad5624r.h b/drivers/iio/dac/ad5624r.h
index 14a439b06eb6..8c2ab6ae855b 100644
--- a/drivers/iio/dac/ad5624r.h
+++ b/drivers/iio/dac/ad5624r.h
@@ -41,7 +41,7 @@ struct ad5624r_chip_info {
 };
 
 /**
- * struct ad5446_state - driver instance specific data
+ * struct ad5624r_state - driver instance specific data
  * @indio_dev:		the industrial I/O device
  * @us:			spi_device
  * @chip_info:		chip model specific constants, available modes etc

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 02/11] iio: dac: ad5686: fix struct name in doc comment
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
  2024-11-20 21:33 ` [PATCH 01/11] iio: dac: ad5624r: fix struct name in doc comment David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-20 21:33 ` [PATCH 03/11] iio: dac: ad5686: use devm_regulator_get_enable_read_voltage() David Lechner
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Fix a copy/paste mistake in the struct ad5686_state doc comment.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad5686.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/dac/ad5686.h b/drivers/iio/dac/ad5686.h
index 760f852911df..5b150f344fda 100644
--- a/drivers/iio/dac/ad5686.h
+++ b/drivers/iio/dac/ad5686.h
@@ -115,7 +115,7 @@ struct ad5686_chip_info {
 };
 
 /**
- * struct ad5446_state - driver instance specific data
+ * struct ad5686_state - driver instance specific data
  * @spi:		spi_device
  * @chip_info:		chip model specific constants, available modes etc
  * @reg:		supply regulator

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 03/11] iio: dac: ad5686: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
  2024-11-20 21:33 ` [PATCH 01/11] iio: dac: ad5624r: fix struct name in doc comment David Lechner
  2024-11-20 21:33 ` [PATCH 02/11] iio: dac: ad5686: " David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-20 21:33 ` [PATCH 04/11] iio: dac: ad5686: drop driver remove function David Lechner
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Simplify the code by using devm_regulator_get_enable_read_voltage().

There is a small change in behavior. Before, all errors from
devm_regulator_get_optional() were ignored and assumed to mean that
the external reference supply was absent. Now, only -ENODEV is checked
and other errors will cause a failure to probe. So now, this will
catch errors, like using the wrong data type for the devicetree
property.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad5686.c | 53 ++++++++++++++----------------------------------
 drivers/iio/dac/ad5686.h |  2 --
 2 files changed, 15 insertions(+), 40 deletions(-)

diff --git a/drivers/iio/dac/ad5686.c b/drivers/iio/dac/ad5686.c
index 57cc0f0eedc6..a8a38879fc40 100644
--- a/drivers/iio/dac/ad5686.c
+++ b/drivers/iio/dac/ad5686.c
@@ -455,8 +455,9 @@ int ad5686_probe(struct device *dev,
 	struct ad5686_state *st;
 	struct iio_dev *indio_dev;
 	unsigned int val, ref_bit_msk;
+	bool has_external_vref;
 	u8 cmd;
-	int ret, i, voltage_uv = 0;
+	int ret, i;
 
 	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
 	if (indio_dev == NULL)
@@ -469,25 +470,14 @@ int ad5686_probe(struct device *dev,
 	st->write = write;
 	st->read = read;
 
-	st->reg = devm_regulator_get_optional(dev, "vcc");
-	if (!IS_ERR(st->reg)) {
-		ret = regulator_enable(st->reg);
-		if (ret)
-			return ret;
-
-		ret = regulator_get_voltage(st->reg);
-		if (ret < 0)
-			goto error_disable_reg;
-
-		voltage_uv = ret;
-	}
-
 	st->chip_info = &ad5686_chip_info_tbl[chip_type];
 
-	if (voltage_uv)
-		st->vref_mv = voltage_uv / 1000;
-	else
-		st->vref_mv = st->chip_info->int_vref_mv;
+	ret = devm_regulator_get_enable_read_voltage(dev, "vcc");
+	if (ret < 0 && ret != -ENODEV)
+		return ret;
+
+	has_external_vref = ret != -ENODEV;
+	st->vref_mv = has_external_vref ? ret / 1000 : st->chip_info->int_vref_mv;
 
 	/* Set all the power down mode for all channels to 1K pulldown */
 	for (i = 0; i < st->chip_info->num_channels; i++)
@@ -505,12 +495,12 @@ int ad5686_probe(struct device *dev,
 	case AD5310_REGMAP:
 		cmd = AD5686_CMD_CONTROL_REG;
 		ref_bit_msk = AD5310_REF_BIT_MSK;
-		st->use_internal_vref = !voltage_uv;
+		st->use_internal_vref = !has_external_vref;
 		break;
 	case AD5683_REGMAP:
 		cmd = AD5686_CMD_CONTROL_REG;
 		ref_bit_msk = AD5683_REF_BIT_MSK;
-		st->use_internal_vref = !voltage_uv;
+		st->use_internal_vref = !has_external_vref;
 		break;
 	case AD5686_REGMAP:
 		cmd = AD5686_CMD_INTERNAL_REFER_SETUP;
@@ -519,40 +509,27 @@ int ad5686_probe(struct device *dev,
 	case AD5693_REGMAP:
 		cmd = AD5686_CMD_CONTROL_REG;
 		ref_bit_msk = AD5693_REF_BIT_MSK;
-		st->use_internal_vref = !voltage_uv;
+		st->use_internal_vref = !has_external_vref;
 		break;
 	default:
-		ret = -EINVAL;
-		goto error_disable_reg;
+		return -EINVAL;
 	}
 
-	val = (voltage_uv | ref_bit_msk);
+	val = (has_external_vref | ref_bit_msk);
 
 	ret = st->write(st, cmd, 0, !!val);
 	if (ret)
-		goto error_disable_reg;
-
-	ret = iio_device_register(indio_dev);
-	if (ret)
-		goto error_disable_reg;
-
-	return 0;
+		return ret;
 
-error_disable_reg:
-	if (!IS_ERR(st->reg))
-		regulator_disable(st->reg);
-	return ret;
+	return iio_device_register(indio_dev);
 }
 EXPORT_SYMBOL_NS_GPL(ad5686_probe, IIO_AD5686);
 
 void ad5686_remove(struct device *dev)
 {
 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
-	struct ad5686_state *st = iio_priv(indio_dev);
 
 	iio_device_unregister(indio_dev);
-	if (!IS_ERR(st->reg))
-		regulator_disable(st->reg);
 }
 EXPORT_SYMBOL_NS_GPL(ad5686_remove, IIO_AD5686);
 
diff --git a/drivers/iio/dac/ad5686.h b/drivers/iio/dac/ad5686.h
index 5b150f344fda..62eb309711af 100644
--- a/drivers/iio/dac/ad5686.h
+++ b/drivers/iio/dac/ad5686.h
@@ -118,7 +118,6 @@ struct ad5686_chip_info {
  * struct ad5686_state - driver instance specific data
  * @spi:		spi_device
  * @chip_info:		chip model specific constants, available modes etc
- * @reg:		supply regulator
  * @vref_mv:		actual reference voltage used
  * @pwr_down_mask:	power down mask
  * @pwr_down_mode:	current power down mode
@@ -130,7 +129,6 @@ struct ad5686_chip_info {
 struct ad5686_state {
 	struct device			*dev;
 	const struct ad5686_chip_info	*chip_info;
-	struct regulator		*reg;
 	unsigned short			vref_mv;
 	unsigned int			pwr_down_mask;
 	unsigned int			pwr_down_mode;

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 04/11] iio: dac: ad5686: drop driver remove function
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (2 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 03/11] iio: dac: ad5686: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:45   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 05/11] iio: dac: ad7293: use devm_regulator_get_enable_read_voltage() David Lechner
                   ` (6 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Remove driver remove callback for ad5686 SPI and I2C drivers.

By making use of devm_iio_device_register(), we no longer need a driver
remove callback. Also since this was the last user of dev_get_drvdata(),
we can drop the call to dev_set_drvdata().

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad5686-spi.c |  6 ------
 drivers/iio/dac/ad5686.c     | 11 +----------
 drivers/iio/dac/ad5686.h     |  2 --
 drivers/iio/dac/ad5696-i2c.c |  6 ------
 4 files changed, 1 insertion(+), 24 deletions(-)

diff --git a/drivers/iio/dac/ad5686-spi.c b/drivers/iio/dac/ad5686-spi.c
index 8ba2ea70451a..79cfae7a1048 100644
--- a/drivers/iio/dac/ad5686-spi.c
+++ b/drivers/iio/dac/ad5686-spi.c
@@ -95,11 +95,6 @@ static int ad5686_spi_probe(struct spi_device *spi)
 			    ad5686_spi_write, ad5686_spi_read);
 }
 
-static void ad5686_spi_remove(struct spi_device *spi)
-{
-	ad5686_remove(&spi->dev);
-}
-
 static const struct spi_device_id ad5686_spi_id[] = {
 	{"ad5310r", ID_AD5310R},
 	{"ad5672r", ID_AD5672R},
@@ -126,7 +121,6 @@ static struct spi_driver ad5686_spi_driver = {
 		.name = "ad5686",
 	},
 	.probe = ad5686_spi_probe,
-	.remove = ad5686_spi_remove,
 	.id_table = ad5686_spi_id,
 };
 
diff --git a/drivers/iio/dac/ad5686.c b/drivers/iio/dac/ad5686.c
index a8a38879fc40..b848b076851c 100644
--- a/drivers/iio/dac/ad5686.c
+++ b/drivers/iio/dac/ad5686.c
@@ -464,7 +464,6 @@ int ad5686_probe(struct device *dev,
 		return  -ENOMEM;
 
 	st = iio_priv(indio_dev);
-	dev_set_drvdata(dev, indio_dev);
 
 	st->dev = dev;
 	st->write = write;
@@ -521,18 +520,10 @@ int ad5686_probe(struct device *dev,
 	if (ret)
 		return ret;
 
-	return iio_device_register(indio_dev);
+	return devm_iio_device_register(dev, indio_dev);
 }
 EXPORT_SYMBOL_NS_GPL(ad5686_probe, IIO_AD5686);
 
-void ad5686_remove(struct device *dev)
-{
-	struct iio_dev *indio_dev = dev_get_drvdata(dev);
-
-	iio_device_unregister(indio_dev);
-}
-EXPORT_SYMBOL_NS_GPL(ad5686_remove, IIO_AD5686);
-
 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
 MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC");
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/iio/dac/ad5686.h b/drivers/iio/dac/ad5686.h
index 62eb309711af..e7d36bae3e59 100644
--- a/drivers/iio/dac/ad5686.h
+++ b/drivers/iio/dac/ad5686.h
@@ -155,7 +155,5 @@ int ad5686_probe(struct device *dev,
 		 const char *name, ad5686_write_func write,
 		 ad5686_read_func read);
 
-void ad5686_remove(struct device *dev);
-
 
 #endif /* __DRIVERS_IIO_DAC_AD5686_H__ */
diff --git a/drivers/iio/dac/ad5696-i2c.c b/drivers/iio/dac/ad5696-i2c.c
index 81541f755a3e..a56a7a410111 100644
--- a/drivers/iio/dac/ad5696-i2c.c
+++ b/drivers/iio/dac/ad5696-i2c.c
@@ -65,11 +65,6 @@ static int ad5686_i2c_probe(struct i2c_client *i2c)
 			    ad5686_i2c_write, ad5686_i2c_read);
 }
 
-static void ad5686_i2c_remove(struct i2c_client *i2c)
-{
-	ad5686_remove(&i2c->dev);
-}
-
 static const struct i2c_device_id ad5686_i2c_id[] = {
 	{"ad5311r", ID_AD5311R},
 	{"ad5337r", ID_AD5337R},
@@ -116,7 +111,6 @@ static struct i2c_driver ad5686_i2c_driver = {
 		.of_match_table = ad5686_of_match,
 	},
 	.probe = ad5686_i2c_probe,
-	.remove = ad5686_i2c_remove,
 	.id_table = ad5686_i2c_id,
 };
 

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 05/11] iio: dac: ad7293: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (3 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 04/11] iio: dac: ad5686: drop driver remove function David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:50   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 06/11] iio: dac: ad8801: " David Lechner
                   ` (5 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Simplify the code by using devm_regulator_get_enable_read_voltage().

A small change in behavior here due to moving the enable to the same
place as the get: supplies now are enabled before the reset GPIO is
toggled (which is arguably the correct order).

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad7293.c | 66 ++++++++----------------------------------------
 1 file changed, 11 insertions(+), 55 deletions(-)

diff --git a/drivers/iio/dac/ad7293.c b/drivers/iio/dac/ad7293.c
index 1d4032670482..58f7926ec3f3 100644
--- a/drivers/iio/dac/ad7293.c
+++ b/drivers/iio/dac/ad7293.c
@@ -141,8 +141,6 @@ struct ad7293_state {
 	/* Protect against concurrent accesses to the device, page selection and data content */
 	struct mutex lock;
 	struct gpio_desc *gpio_reset;
-	struct regulator *reg_avdd;
-	struct regulator *reg_vdrive;
 	u8 page_select;
 	u8 data[3] __aligned(IIO_DMA_MINALIGN);
 };
@@ -777,6 +775,7 @@ static int ad7293_reset(struct ad7293_state *st)
 static int ad7293_properties_parse(struct ad7293_state *st)
 {
 	struct spi_device *spi = st->spi;
+	int ret;
 
 	st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
 						 GPIOD_OUT_HIGH);
@@ -784,24 +783,23 @@ static int ad7293_properties_parse(struct ad7293_state *st)
 		return dev_err_probe(&spi->dev, PTR_ERR(st->gpio_reset),
 				     "failed to get the reset GPIO\n");
 
-	st->reg_avdd = devm_regulator_get(&spi->dev, "avdd");
-	if (IS_ERR(st->reg_avdd))
-		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_avdd),
+	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "avdd");
+	if (ret < 0)
+		return dev_err_probe(&spi->dev, ret,
 				     "failed to get the AVDD voltage\n");
+	if (ret > 5500000 || ret < 4500000)
+		return -EINVAL;
 
-	st->reg_vdrive = devm_regulator_get(&spi->dev, "vdrive");
-	if (IS_ERR(st->reg_vdrive))
-		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_vdrive),
+	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vdrive");
+	if (ret < 0)
+		return dev_err_probe(&spi->dev, ret,
 				     "failed to get the VDRIVE voltage\n");
+	if (ret > 5500000 || ret < 1700000)
+		return -EINVAL;
 
 	return 0;
 }
 
-static void ad7293_reg_disable(void *data)
-{
-	regulator_disable(data);
-}
-
 static int ad7293_init(struct ad7293_state *st)
 {
 	int ret;
@@ -816,48 +814,6 @@ static int ad7293_init(struct ad7293_state *st)
 	if (ret)
 		return ret;
 
-	ret = regulator_enable(st->reg_avdd);
-	if (ret) {
-		dev_err(&spi->dev,
-			"Failed to enable specified AVDD Voltage!\n");
-		return ret;
-	}
-
-	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
-				       st->reg_avdd);
-	if (ret)
-		return ret;
-
-	ret = regulator_enable(st->reg_vdrive);
-	if (ret) {
-		dev_err(&spi->dev,
-			"Failed to enable specified VDRIVE Voltage!\n");
-		return ret;
-	}
-
-	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
-				       st->reg_vdrive);
-	if (ret)
-		return ret;
-
-	ret = regulator_get_voltage(st->reg_avdd);
-	if (ret < 0) {
-		dev_err(&spi->dev, "Failed to read avdd regulator: %d\n", ret);
-		return ret;
-	}
-
-	if (ret > 5500000 || ret < 4500000)
-		return -EINVAL;
-
-	ret = regulator_get_voltage(st->reg_vdrive);
-	if (ret < 0) {
-		dev_err(&spi->dev,
-			"Failed to read vdrive regulator: %d\n", ret);
-		return ret;
-	}
-	if (ret > 5500000 || ret < 1700000)
-		return -EINVAL;
-
 	/* Check Chip ID */
 	ret = __ad7293_spi_read(st, AD7293_REG_DEVICE_ID, &chip_id);
 	if (ret)

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 06/11] iio: dac: ad8801: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (4 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 05/11] iio: dac: ad7293: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:51   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 07/11] iio: dac ad8801: drop driver remove function David Lechner
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Simplify the code by using devm_regulator_get_enable_read_voltage().

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad8801.c | 70 +++++++++---------------------------------------
 1 file changed, 12 insertions(+), 58 deletions(-)

diff --git a/drivers/iio/dac/ad8801.c b/drivers/iio/dac/ad8801.c
index 919e8c880697..bd857754fc11 100644
--- a/drivers/iio/dac/ad8801.c
+++ b/drivers/iio/dac/ad8801.c
@@ -23,8 +23,6 @@ struct ad8801_state {
 	unsigned char dac_cache[8]; /* Value write on each channel */
 	unsigned int vrefh_mv;
 	unsigned int vrefl_mv;
-	struct regulator *vrefh_reg;
-	struct regulator *vrefl_reg;
 
 	__be16 data __aligned(IIO_DMA_MINALIGN);
 };
@@ -122,51 +120,20 @@ static int ad8801_probe(struct spi_device *spi)
 	state->spi = spi;
 	id = spi_get_device_id(spi);
 
-	state->vrefh_reg = devm_regulator_get(&spi->dev, "vrefh");
-	if (IS_ERR(state->vrefh_reg))
-		return dev_err_probe(&spi->dev, PTR_ERR(state->vrefh_reg),
-				     "Vrefh regulator not specified\n");
+	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vrefh");
+	if (ret < 0)
+		return dev_err_probe(&spi->dev, ret,
+				     "failed to get Vrefh voltage\n");
 
-	ret = regulator_enable(state->vrefh_reg);
-	if (ret) {
-		dev_err(&spi->dev, "Failed to enable vrefh regulator: %d\n",
-				ret);
-		return ret;
-	}
-
-	ret = regulator_get_voltage(state->vrefh_reg);
-	if (ret < 0) {
-		dev_err(&spi->dev, "Failed to read vrefh regulator: %d\n",
-				ret);
-		goto error_disable_vrefh_reg;
-	}
 	state->vrefh_mv = ret / 1000;
 
 	if (id->driver_data == ID_AD8803) {
-		state->vrefl_reg = devm_regulator_get(&spi->dev, "vrefl");
-		if (IS_ERR(state->vrefl_reg)) {
-			ret = dev_err_probe(&spi->dev, PTR_ERR(state->vrefl_reg),
-					    "Vrefl regulator not specified\n");
-			goto error_disable_vrefh_reg;
-		}
-
-		ret = regulator_enable(state->vrefl_reg);
-		if (ret) {
-			dev_err(&spi->dev, "Failed to enable vrefl regulator: %d\n",
-					ret);
-			goto error_disable_vrefh_reg;
-		}
-
-		ret = regulator_get_voltage(state->vrefl_reg);
-		if (ret < 0) {
-			dev_err(&spi->dev, "Failed to read vrefl regulator: %d\n",
-					ret);
-			goto error_disable_vrefl_reg;
-		}
+		ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vrefl");
+		if (ret < 0)
+			return dev_err_probe(&spi->dev, ret,
+					     "failed to get Vrefl voltage\n");
+
 		state->vrefl_mv = ret / 1000;
-	} else {
-		state->vrefl_mv = 0;
-		state->vrefl_reg = NULL;
 	}
 
 	spi_set_drvdata(spi, indio_dev);
@@ -177,31 +144,18 @@ static int ad8801_probe(struct spi_device *spi)
 	indio_dev->name = id->name;
 
 	ret = iio_device_register(indio_dev);
-	if (ret) {
-		dev_err(&spi->dev, "Failed to register iio device: %d\n",
-				ret);
-		goto error_disable_vrefl_reg;
-	}
+	if (ret)
+		return dev_err_probe(&spi->dev, ret,
+				     "Failed to register iio device\n");
 
 	return 0;
-
-error_disable_vrefl_reg:
-	if (state->vrefl_reg)
-		regulator_disable(state->vrefl_reg);
-error_disable_vrefh_reg:
-	regulator_disable(state->vrefh_reg);
-	return ret;
 }
 
 static void ad8801_remove(struct spi_device *spi)
 {
 	struct iio_dev *indio_dev = spi_get_drvdata(spi);
-	struct ad8801_state *state = iio_priv(indio_dev);
 
 	iio_device_unregister(indio_dev);
-	if (state->vrefl_reg)
-		regulator_disable(state->vrefl_reg);
-	regulator_disable(state->vrefh_reg);
 }
 
 static const struct spi_device_id ad8801_ids[] = {

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 07/11] iio: dac ad8801: drop driver remove function
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (5 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 06/11] iio: dac: ad8801: " David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:52   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 08/11] iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage() David Lechner
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Remove driver remove callback in the ad8801 driver.

By making use of devm_iio_device_register(), we no longer need a driver
remove callback. Also since this was the last user of spi_get_drvdata(),
we can drop the call to spi_set_drvdata().

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ad8801.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/drivers/iio/dac/ad8801.c b/drivers/iio/dac/ad8801.c
index bd857754fc11..8a362fae2eca 100644
--- a/drivers/iio/dac/ad8801.c
+++ b/drivers/iio/dac/ad8801.c
@@ -136,14 +136,13 @@ static int ad8801_probe(struct spi_device *spi)
 		state->vrefl_mv = ret / 1000;
 	}
 
-	spi_set_drvdata(spi, indio_dev);
 	indio_dev->info = &ad8801_info;
 	indio_dev->modes = INDIO_DIRECT_MODE;
 	indio_dev->channels = ad8801_channels;
 	indio_dev->num_channels = ARRAY_SIZE(ad8801_channels);
 	indio_dev->name = id->name;
 
-	ret = iio_device_register(indio_dev);
+	ret = devm_iio_device_register(&spi->dev, indio_dev);
 	if (ret)
 		return dev_err_probe(&spi->dev, ret,
 				     "Failed to register iio device\n");
@@ -151,13 +150,6 @@ static int ad8801_probe(struct spi_device *spi)
 	return 0;
 }
 
-static void ad8801_remove(struct spi_device *spi)
-{
-	struct iio_dev *indio_dev = spi_get_drvdata(spi);
-
-	iio_device_unregister(indio_dev);
-}
-
 static const struct spi_device_id ad8801_ids[] = {
 	{"ad8801", ID_AD8801},
 	{"ad8803", ID_AD8803},
@@ -170,7 +162,6 @@ static struct spi_driver ad8801_driver = {
 		.name	= "ad8801",
 	},
 	.probe		= ad8801_probe,
-	.remove		= ad8801_remove,
 	.id_table	= ad8801_ids,
 };
 module_spi_driver(ad8801_driver);

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 08/11] iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (6 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 07/11] iio: dac ad8801: drop driver remove function David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:53   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 09/11] iio: dac ltc2632: drop driver remove function David Lechner
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

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>
---
 drivers/iio/dac/ltc2632.c | 58 +++++++++++++++--------------------------------
 1 file changed, 18 insertions(+), 40 deletions(-)

diff --git a/drivers/iio/dac/ltc2632.c b/drivers/iio/dac/ltc2632.c
index a4fb2509c950..28f8347eb687 100644
--- a/drivers/iio/dac/ltc2632.c
+++ b/drivers/iio/dac/ltc2632.c
@@ -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[] = {

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 09/11] iio: dac ltc2632: drop driver remove function
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (7 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 08/11] iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:54   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 10/11] iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage() David Lechner
  2024-11-20 21:33 ` [PATCH 11/11] iio: dac: max5821: " David Lechner
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Remove driver remove callback for the ltc2632 driver.

By making use of devm_iio_device_register(), we no longer need a driver
remove callback. Also since this was the last user of spi_get_drvdata(),
we can drop the call to spi_set_drvdata().

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ltc2632.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/drivers/iio/dac/ltc2632.c b/drivers/iio/dac/ltc2632.c
index 28f8347eb687..999348836d87 100644
--- a/drivers/iio/dac/ltc2632.c
+++ b/drivers/iio/dac/ltc2632.c
@@ -317,7 +317,6 @@ static int ltc2632_probe(struct spi_device *spi)
 
 	st = iio_priv(indio_dev);
 
-	spi_set_drvdata(spi, indio_dev);
 	st->spi_dev = spi;
 
 	chip_info = (struct ltc2632_chip_info *)
@@ -351,14 +350,7 @@ static int ltc2632_probe(struct spi_device *spi)
 	indio_dev->channels = chip_info->channels;
 	indio_dev->num_channels = chip_info->num_channels;
 
-	return iio_device_register(indio_dev);
-}
-
-static void ltc2632_remove(struct spi_device *spi)
-{
-	struct iio_dev *indio_dev = spi_get_drvdata(spi);
-
-	iio_device_unregister(indio_dev);
+	return devm_iio_device_register(&spi->dev, indio_dev);
 }
 
 static const struct spi_device_id ltc2632_id[] = {
@@ -450,7 +442,6 @@ static struct spi_driver ltc2632_driver = {
 		.of_match_table = ltc2632_of_match,
 	},
 	.probe		= ltc2632_probe,
-	.remove		= ltc2632_remove,
 	.id_table	= ltc2632_id,
 };
 module_spi_driver(ltc2632_driver);

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 10/11] iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (8 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 09/11] iio: dac ltc2632: drop driver remove function David Lechner
@ 2024-11-20 21:33 ` David Lechner
  2024-11-23 15:55   ` Jonathan Cameron
  2024-11-20 21:33 ` [PATCH 11/11] iio: dac: max5821: " David Lechner
  10 siblings, 1 reply; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Simplify the code by using devm_regulator_get_enable_read_voltage().

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/ltc2688.c | 44 ++++++++++----------------------------------
 1 file changed, 10 insertions(+), 34 deletions(-)

diff --git a/drivers/iio/dac/ltc2688.c b/drivers/iio/dac/ltc2688.c
index 376dca163c91..bdc857c7fa6d 100644
--- a/drivers/iio/dac/ltc2688.c
+++ b/drivers/iio/dac/ltc2688.c
@@ -842,7 +842,7 @@ static int ltc2688_channel_config(struct ltc2688_state *st)
 	return 0;
 }
 
-static int ltc2688_setup(struct ltc2688_state *st, struct regulator *vref)
+static int ltc2688_setup(struct ltc2688_state *st, bool has_external_vref)
 {
 	struct device *dev = &st->spi->dev;
 	struct gpio_desc *gpio;
@@ -881,18 +881,13 @@ static int ltc2688_setup(struct ltc2688_state *st, struct regulator *vref)
 	if (ret)
 		return ret;
 
-	if (!vref)
+	if (!has_external_vref)
 		return 0;
 
 	return regmap_set_bits(st->regmap, LTC2688_CMD_CONFIG,
 			       LTC2688_CONFIG_EXT_REF);
 }
 
-static void ltc2688_disable_regulator(void *regulator)
-{
-	regulator_disable(regulator);
-}
-
 static bool ltc2688_reg_readable(struct device *dev, unsigned int reg)
 {
 	switch (reg) {
@@ -947,8 +942,8 @@ static int ltc2688_probe(struct spi_device *spi)
 	static const char * const regulators[] = { "vcc", "iovcc" };
 	struct ltc2688_state *st;
 	struct iio_dev *indio_dev;
-	struct regulator *vref_reg;
 	struct device *dev = &spi->dev;
+	bool has_external_vref;
 	int ret;
 
 	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
@@ -973,34 +968,15 @@ static int ltc2688_probe(struct spi_device *spi)
 	if (ret)
 		return dev_err_probe(dev, ret, "Failed to enable regulators\n");
 
-	vref_reg = devm_regulator_get_optional(dev, "vref");
-	if (IS_ERR(vref_reg)) {
-		if (PTR_ERR(vref_reg) != -ENODEV)
-			return dev_err_probe(dev, PTR_ERR(vref_reg),
-					     "Failed to get vref regulator");
-
-		vref_reg = NULL;
-		/* internal reference */
-		st->vref = 4096;
-	} else {
-		ret = regulator_enable(vref_reg);
-		if (ret)
-			return dev_err_probe(dev, ret,
-					     "Failed to enable vref regulators\n");
-
-		ret = devm_add_action_or_reset(dev, ltc2688_disable_regulator,
-					       vref_reg);
-		if (ret)
-			return ret;
-
-		ret = regulator_get_voltage(vref_reg);
-		if (ret < 0)
-			return dev_err_probe(dev, ret, "Failed to get vref\n");
+	ret = devm_regulator_get_enable_read_voltage(dev, "vref");
+	if (ret < 0 && ret != -ENODEV)
+		return dev_err_probe(dev, ret,
+				     "Failed to get vref regulator voltage\n");
 
-		st->vref = ret / 1000;
-	}
+	has_external_vref = ret != -ENODEV;
+	st->vref = has_external_vref ? ret / 1000 : 0;
 
-	ret = ltc2688_setup(st, vref_reg);
+	ret = ltc2688_setup(st, has_external_vref);
 	if (ret)
 		return ret;
 

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 11/11] iio: dac: max5821: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
                   ` (9 preceding siblings ...)
  2024-11-20 21:33 ` [PATCH 10/11] iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-20 21:33 ` David Lechner
  10 siblings, 0 replies; 19+ messages in thread
From: David Lechner @ 2024-11-20 21:33 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel, David Lechner

Simplify the code by using devm_regulator_get_enable_read_voltage().

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/max5821.c | 36 ++++--------------------------------
 1 file changed, 4 insertions(+), 32 deletions(-)

diff --git a/drivers/iio/dac/max5821.c b/drivers/iio/dac/max5821.c
index 18ba3eaaad75..b062a18be5e7 100644
--- a/drivers/iio/dac/max5821.c
+++ b/drivers/iio/dac/max5821.c
@@ -32,7 +32,6 @@ enum max5821_device_ids {
 
 struct max5821_data {
 	struct i2c_client	*client;
-	struct regulator	*vref_reg;
 	unsigned short		vref_mv;
 	bool			powerdown[MAX5821_MAX_DAC_CHANNELS];
 	u8			powerdown_mode[MAX5821_MAX_DAC_CHANNELS];
@@ -295,11 +294,6 @@ static const struct iio_info max5821_info = {
 	.write_raw = max5821_write_raw,
 };
 
-static void max5821_regulator_disable(void *reg)
-{
-	regulator_disable(reg);
-}
-
 static int max5821_probe(struct i2c_client *client)
 {
 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
@@ -321,32 +315,10 @@ static int max5821_probe(struct i2c_client *client)
 		data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND;
 	}
 
-	data->vref_reg = devm_regulator_get(&client->dev, "vref");
-	if (IS_ERR(data->vref_reg))
-		return dev_err_probe(&client->dev, PTR_ERR(data->vref_reg),
-				     "Failed to get vref regulator\n");
-
-	ret = regulator_enable(data->vref_reg);
-	if (ret) {
-		dev_err(&client->dev,
-			"Failed to enable vref regulator: %d\n", ret);
-		return ret;
-	}
-
-	ret = devm_add_action_or_reset(&client->dev, max5821_regulator_disable,
-				       data->vref_reg);
-	if (ret) {
-		dev_err(&client->dev,
-			"Failed to add action to managed regulator: %d\n", ret);
-		return ret;
-	}
-
-	ret = regulator_get_voltage(data->vref_reg);
-	if (ret < 0) {
-		dev_err(&client->dev,
-			"Failed to get voltage on regulator: %d\n", ret);
-		return ret;
-	}
+	ret = devm_regulator_get_enable_read_voltage(&client->dev, "vref");
+	if (ret)
+		return dev_err_probe(&client->dev, ret,
+				     "Failed to get vref regulator voltage\n");
 
 	data->vref_mv = ret / 1000;
 

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 04/11] iio: dac: ad5686: drop driver remove function
  2024-11-20 21:33 ` [PATCH 04/11] iio: dac: ad5686: drop driver remove function David Lechner
@ 2024-11-23 15:45   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:45 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:27 -0600
David Lechner <dlechner@baylibre.com> wrote:

> Remove driver remove callback for ad5686 SPI and I2C drivers.
> 
> By making use of devm_iio_device_register(), we no longer need a driver
> remove callback. Also since this was the last user of dev_get_drvdata(),
> we can drop the call to dev_set_drvdata().
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
Applied 1-4 
> ---
>  drivers/iio/dac/ad5686-spi.c |  6 ------
>  drivers/iio/dac/ad5686.c     | 11 +----------
>  drivers/iio/dac/ad5686.h     |  2 --
>  drivers/iio/dac/ad5696-i2c.c |  6 ------
>  4 files changed, 1 insertion(+), 24 deletions(-)
> 
> diff --git a/drivers/iio/dac/ad5686-spi.c b/drivers/iio/dac/ad5686-spi.c
> index 8ba2ea70451a..79cfae7a1048 100644
> --- a/drivers/iio/dac/ad5686-spi.c
> +++ b/drivers/iio/dac/ad5686-spi.c
> @@ -95,11 +95,6 @@ static int ad5686_spi_probe(struct spi_device *spi)
>  			    ad5686_spi_write, ad5686_spi_read);
>  }
>  
> -static void ad5686_spi_remove(struct spi_device *spi)
> -{
> -	ad5686_remove(&spi->dev);
> -}
> -
>  static const struct spi_device_id ad5686_spi_id[] = {
>  	{"ad5310r", ID_AD5310R},
>  	{"ad5672r", ID_AD5672R},
> @@ -126,7 +121,6 @@ static struct spi_driver ad5686_spi_driver = {
>  		.name = "ad5686",
>  	},
>  	.probe = ad5686_spi_probe,
> -	.remove = ad5686_spi_remove,
>  	.id_table = ad5686_spi_id,
>  };
>  
> diff --git a/drivers/iio/dac/ad5686.c b/drivers/iio/dac/ad5686.c
> index a8a38879fc40..b848b076851c 100644
> --- a/drivers/iio/dac/ad5686.c
> +++ b/drivers/iio/dac/ad5686.c
> @@ -464,7 +464,6 @@ int ad5686_probe(struct device *dev,
>  		return  -ENOMEM;
>  
>  	st = iio_priv(indio_dev);
> -	dev_set_drvdata(dev, indio_dev);
>  
>  	st->dev = dev;
>  	st->write = write;
> @@ -521,18 +520,10 @@ int ad5686_probe(struct device *dev,
>  	if (ret)
>  		return ret;
>  
> -	return iio_device_register(indio_dev);
> +	return devm_iio_device_register(dev, indio_dev);
>  }
>  EXPORT_SYMBOL_NS_GPL(ad5686_probe, IIO_AD5686);
>  
> -void ad5686_remove(struct device *dev)
> -{
> -	struct iio_dev *indio_dev = dev_get_drvdata(dev);
> -
> -	iio_device_unregister(indio_dev);
> -}
> -EXPORT_SYMBOL_NS_GPL(ad5686_remove, IIO_AD5686);
> -
>  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
>  MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC");
>  MODULE_LICENSE("GPL v2");
> diff --git a/drivers/iio/dac/ad5686.h b/drivers/iio/dac/ad5686.h
> index 62eb309711af..e7d36bae3e59 100644
> --- a/drivers/iio/dac/ad5686.h
> +++ b/drivers/iio/dac/ad5686.h
> @@ -155,7 +155,5 @@ int ad5686_probe(struct device *dev,
>  		 const char *name, ad5686_write_func write,
>  		 ad5686_read_func read);
>  
> -void ad5686_remove(struct device *dev);
> -
>  
>  #endif /* __DRIVERS_IIO_DAC_AD5686_H__ */
> diff --git a/drivers/iio/dac/ad5696-i2c.c b/drivers/iio/dac/ad5696-i2c.c
> index 81541f755a3e..a56a7a410111 100644
> --- a/drivers/iio/dac/ad5696-i2c.c
> +++ b/drivers/iio/dac/ad5696-i2c.c
> @@ -65,11 +65,6 @@ static int ad5686_i2c_probe(struct i2c_client *i2c)
>  			    ad5686_i2c_write, ad5686_i2c_read);
>  }
>  
> -static void ad5686_i2c_remove(struct i2c_client *i2c)
> -{
> -	ad5686_remove(&i2c->dev);
> -}
> -
>  static const struct i2c_device_id ad5686_i2c_id[] = {
>  	{"ad5311r", ID_AD5311R},
>  	{"ad5337r", ID_AD5337R},
> @@ -116,7 +111,6 @@ static struct i2c_driver ad5686_i2c_driver = {
>  		.of_match_table = ad5686_of_match,
>  	},
>  	.probe = ad5686_i2c_probe,
> -	.remove = ad5686_i2c_remove,
>  	.id_table = ad5686_i2c_id,
>  };
>  
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 05/11] iio: dac: ad7293: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 ` [PATCH 05/11] iio: dac: ad7293: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-23 15:50   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:50 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:28 -0600
David Lechner <dlechner@baylibre.com> wrote:

> Simplify the code by using devm_regulator_get_enable_read_voltage().
> 
> A small change in behavior here due to moving the enable to the same
> place as the get: supplies now are enabled before the reset GPIO is
> toggled (which is arguably the correct order).
Agreed ordering is weird before this change so that should be fine.
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>

This raises some questions for me (about the original code)
My gut feeling is drop the reading of the regulator voltage but
maybe I'm missing something.

> ---
>  drivers/iio/dac/ad7293.c | 66 ++++++++----------------------------------------
>  1 file changed, 11 insertions(+), 55 deletions(-)
> 
> diff --git a/drivers/iio/dac/ad7293.c b/drivers/iio/dac/ad7293.c
> index 1d4032670482..58f7926ec3f3 100644
> --- a/drivers/iio/dac/ad7293.c
> +++ b/drivers/iio/dac/ad7293.c
> @@ -141,8 +141,6 @@ struct ad7293_state {
>  	/* Protect against concurrent accesses to the device, page selection and data content */
>  	struct mutex lock;
>  	struct gpio_desc *gpio_reset;
> -	struct regulator *reg_avdd;
> -	struct regulator *reg_vdrive;
>  	u8 page_select;
>  	u8 data[3] __aligned(IIO_DMA_MINALIGN);
>  };
> @@ -777,6 +775,7 @@ static int ad7293_reset(struct ad7293_state *st)
>  static int ad7293_properties_parse(struct ad7293_state *st)
>  {
>  	struct spi_device *spi = st->spi;
> +	int ret;
>  
>  	st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
>  						 GPIOD_OUT_HIGH);
> @@ -784,24 +783,23 @@ static int ad7293_properties_parse(struct ad7293_state *st)
>  		return dev_err_probe(&spi->dev, PTR_ERR(st->gpio_reset),
>  				     "failed to get the reset GPIO\n");
>  
> -	st->reg_avdd = devm_regulator_get(&spi->dev, "avdd");
> -	if (IS_ERR(st->reg_avdd))
> -		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_avdd),
> +	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "avdd");
> +	if (ret < 0)
> +		return dev_err_probe(&spi->dev, ret,
>  				     "failed to get the AVDD voltage\n");
> +	if (ret > 5500000 || ret < 4500000)
> +		return -EINVAL;

Why is this a driver problem?


>  
> -	st->reg_vdrive = devm_regulator_get(&spi->dev, "vdrive");
> -	if (IS_ERR(st->reg_vdrive))
> -		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_vdrive),
> +	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vdrive");
> +	if (ret < 0)
> +		return dev_err_probe(&spi->dev, ret,
>  				     "failed to get the VDRIVE voltage\n");
> +	if (ret > 5500000 || ret < 1700000)
> +		return -EINVAL;
Likewise.

Regulators might be fine and we can't read the voltages. If they are out
of spec, that's a design or board configuration problem.

To keep these in place rather than just dropping them, I'd like more
info on why!  May well be in the history but I'm busy / lazy  (take
your pick) so won't look today.



>  	return 0;
>  }
>  
> -static void ad7293_reg_disable(void *data)
> -{
> -	regulator_disable(data);
> -}
> -
>  static int ad7293_init(struct ad7293_state *st)
>  {
>  	int ret;
> @@ -816,48 +814,6 @@ static int ad7293_init(struct ad7293_state *st)
>  	if (ret)
>  		return ret;
>  
> -	ret = regulator_enable(st->reg_avdd);
> -	if (ret) {
> -		dev_err(&spi->dev,
> -			"Failed to enable specified AVDD Voltage!\n");
> -		return ret;
> -	}
> -
> -	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
> -				       st->reg_avdd);
> -	if (ret)
> -		return ret;
> -
> -	ret = regulator_enable(st->reg_vdrive);
> -	if (ret) {
> -		dev_err(&spi->dev,
> -			"Failed to enable specified VDRIVE Voltage!\n");
> -		return ret;
> -	}
> -
> -	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
> -				       st->reg_vdrive);
> -	if (ret)
> -		return ret;
> -
> -	ret = regulator_get_voltage(st->reg_avdd);
> -	if (ret < 0) {
> -		dev_err(&spi->dev, "Failed to read avdd regulator: %d\n", ret);
> -		return ret;
> -	}
> -
> -	if (ret > 5500000 || ret < 4500000)
> -		return -EINVAL;
> -
> -	ret = regulator_get_voltage(st->reg_vdrive);
> -	if (ret < 0) {
> -		dev_err(&spi->dev,
> -			"Failed to read vdrive regulator: %d\n", ret);
> -		return ret;
> -	}
> -	if (ret > 5500000 || ret < 1700000)
> -		return -EINVAL;
> -
>  	/* Check Chip ID */
>  	ret = __ad7293_spi_read(st, AD7293_REG_DEVICE_ID, &chip_id);
>  	if (ret)
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 06/11] iio: dac: ad8801: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 ` [PATCH 06/11] iio: dac: ad8801: " David Lechner
@ 2024-11-23 15:51   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:51 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:29 -0600
David Lechner <dlechner@baylibre.com> wrote:

> Simplify the code by using devm_regulator_get_enable_read_voltage().
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
Particularly nice saving in this one ;)

Applied.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 07/11] iio: dac ad8801: drop driver remove function
  2024-11-20 21:33 ` [PATCH 07/11] iio: dac ad8801: drop driver remove function David Lechner
@ 2024-11-23 15:52   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:52 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:30 -0600
David Lechner <dlechner@baylibre.com> wrote:

> Remove driver remove callback in the ad8801 driver.
> 
> By making use of devm_iio_device_register(), we no longer need a driver
> remove callback. Also since this was the last user of spi_get_drvdata(),
> we can drop the call to spi_set_drvdata().
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
Applied.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 08/11] iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 ` [PATCH 08/11] iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-23 15:53   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:53 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:31 -0600
David Lechner <dlechner@baylibre.com> wrote:

> 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>
Applied.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 09/11] iio: dac ltc2632: drop driver remove function
  2024-11-20 21:33 ` [PATCH 09/11] iio: dac ltc2632: drop driver remove function David Lechner
@ 2024-11-23 15:54   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:54 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:32 -0600
David Lechner <dlechner@baylibre.com> wrote:

> Remove driver remove callback for the ltc2632 driver.
> 
> By making use of devm_iio_device_register(), we no longer need a driver
> remove callback. Also since this was the last user of spi_get_drvdata(),
> we can drop the call to spi_set_drvdata().
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
Applied.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 10/11] iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage()
  2024-11-20 21:33 ` [PATCH 10/11] iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-11-23 15:55   ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2024-11-23 15:55 UTC (permalink / raw)
  To: David Lechner
  Cc: Michael Hennerich, Liam Girdwood, Mark Brown, Antoniu Miclaus,
	Nuno Sá, linux-iio, linux-kernel

On Wed, 20 Nov 2024 15:33:33 -0600
David Lechner <dlechner@baylibre.com> wrote:

> Simplify the code by using devm_regulator_get_enable_read_voltage().
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
Applied

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2024-11-23 15:55 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-20 21:33 [PATCH 00/11] iio: use devm_regulator_get_enable_read_voltage round 6 David Lechner
2024-11-20 21:33 ` [PATCH 01/11] iio: dac: ad5624r: fix struct name in doc comment David Lechner
2024-11-20 21:33 ` [PATCH 02/11] iio: dac: ad5686: " David Lechner
2024-11-20 21:33 ` [PATCH 03/11] iio: dac: ad5686: use devm_regulator_get_enable_read_voltage() David Lechner
2024-11-20 21:33 ` [PATCH 04/11] iio: dac: ad5686: drop driver remove function David Lechner
2024-11-23 15:45   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 05/11] iio: dac: ad7293: use devm_regulator_get_enable_read_voltage() David Lechner
2024-11-23 15:50   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 06/11] iio: dac: ad8801: " David Lechner
2024-11-23 15:51   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 07/11] iio: dac ad8801: drop driver remove function David Lechner
2024-11-23 15:52   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 08/11] iio: dac: ltc2632: use devm_regulator_get_enable_read_voltage() David Lechner
2024-11-23 15:53   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 09/11] iio: dac ltc2632: drop driver remove function David Lechner
2024-11-23 15:54   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 10/11] iio: dac: ltc2688: use devm_regulator_get_enable_read_voltage() David Lechner
2024-11-23 15:55   ` Jonathan Cameron
2024-11-20 21:33 ` [PATCH 11/11] iio: dac: max5821: " David Lechner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox