linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3
@ 2024-07-12 16:03 David Lechner
  2024-07-12 16:03 ` [PATCH 1/6] iio: dac: mcp4728: rename err to ret in probe function David Lechner
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

This is the third round of patches to convert IIO drivers to use the
new devm_regulator_get_enable_read_voltage() helper function.

This time, we are converting some Microchip drivers. These weren't as
trivial as some other drivers because of nested functions that need
to know info about the reference voltage, but for the most part, should
be fairly straightforward. And there is a bonus to remove a remove()
callback in one of the drivers.

---
David Lechner (6):
      iio: dac: mcp4728: rename err to ret in probe function
      iio: dac: mcp4728: use devm_regulator_get_enable_read_voltage()
      iio: dac: mcp4922: use devm_regulator_get_enable_read_voltage()
      iio: dac: mcp4922: drop remove() callback
      iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage()
      iio: adc: mcp3911: use devm_regulator_get_enable_read_voltage()

 drivers/iio/adc/mcp3564.c | 54 +++++++++++++------------------------------
 drivers/iio/adc/mcp3911.c | 59 +++++++++++++----------------------------------
 drivers/iio/dac/mcp4728.c | 45 +++++++++++-------------------------
 drivers/iio/dac/mcp4922.c | 47 ++++++-------------------------------
 4 files changed, 52 insertions(+), 153 deletions(-)
---
base-commit: 986da024b99a72e64f6bdb3f3f0e52af024b1f50
change-id: 20240712-iio-regulator-refactor-round-3-17f2a82d2181

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

* [PATCH 1/6] iio: dac: mcp4728: rename err to ret in probe function
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
@ 2024-07-12 16:03 ` David Lechner
  2024-07-12 16:03 ` [PATCH 2/6] iio: dac: mcp4728: use devm_regulator_get_enable_read_voltage() David Lechner
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

To prepare for using a function that returns a non-error value, rename
the variable 'err' to 'ret' in the probe function.

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

diff --git a/drivers/iio/dac/mcp4728.c b/drivers/iio/dac/mcp4728.c
index c449ca949465..300985beb35d 100644
--- a/drivers/iio/dac/mcp4728.c
+++ b/drivers/iio/dac/mcp4728.c
@@ -540,7 +540,7 @@ static int mcp4728_probe(struct i2c_client *client)
 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
 	struct mcp4728_data *data;
 	struct iio_dev *indio_dev;
-	int err;
+	int ret;
 
 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 	if (!indio_dev)
@@ -554,14 +554,14 @@ static int mcp4728_probe(struct i2c_client *client)
 	if (IS_ERR(data->vdd_reg))
 		return PTR_ERR(data->vdd_reg);
 
-	err = regulator_enable(data->vdd_reg);
-	if (err)
-		return err;
+	ret = regulator_enable(data->vdd_reg);
+	if (ret)
+		return ret;
 
-	err = devm_add_action_or_reset(&client->dev, mcp4728_reg_disable,
+	ret = devm_add_action_or_reset(&client->dev, mcp4728_reg_disable,
 				       data->vdd_reg);
-	if (err)
-		return err;
+	if (ret)
+		return ret;
 
 	/*
 	 * MCP4728 has internal EEPROM that save each channel boot
@@ -569,15 +569,15 @@ static int mcp4728_probe(struct i2c_client *client)
 	 * driver at kernel boot. mcp4728_init_channels_data() reads back DAC
 	 * settings and stores them in data structure.
 	 */
-	err = mcp4728_init_channels_data(data);
-	if (err) {
-		return dev_err_probe(&client->dev, err,
+	ret = mcp4728_init_channels_data(data);
+	if (ret) {
+		return dev_err_probe(&client->dev, ret,
 			"failed to read mcp4728 current configuration\n");
 	}
 
-	err = mcp4728_init_scales_avail(data);
-	if (err) {
-		return dev_err_probe(&client->dev, err,
+	ret = mcp4728_init_scales_avail(data);
+	if (ret) {
+		return dev_err_probe(&client->dev, ret,
 				     "failed to init scales\n");
 	}
 

-- 
2.43.0


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

* [PATCH 2/6] iio: dac: mcp4728: use devm_regulator_get_enable_read_voltage()
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
  2024-07-12 16:03 ` [PATCH 1/6] iio: dac: mcp4728: rename err to ret in probe function David Lechner
@ 2024-07-12 16:03 ` David Lechner
  2024-07-12 16:03 ` [PATCH 3/6] iio: dac: mcp4922: " David Lechner
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

This makes use of the new devm_regulator_get_enable_read_voltage()
helper function to reduce boilerplate code in the MCP4728 DAC driver.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/mcp4728.c | 33 +++++++--------------------------
 1 file changed, 7 insertions(+), 26 deletions(-)

diff --git a/drivers/iio/dac/mcp4728.c b/drivers/iio/dac/mcp4728.c
index 300985beb35d..192175dc6419 100644
--- a/drivers/iio/dac/mcp4728.c
+++ b/drivers/iio/dac/mcp4728.c
@@ -84,7 +84,6 @@ enum mcp4728_scale {
 
 struct mcp4728_data {
 	struct i2c_client *client;
-	struct regulator *vdd_reg;
 	bool powerdown;
 	int scales_avail[MCP4728_N_SCALES * 2];
 	struct mcp4728_channel_data chdata[MCP4728_N_CHANNELS];
@@ -415,15 +414,9 @@ static void mcp4728_init_scale_avail(enum mcp4728_scale scale, int vref_mv,
 	data->scales_avail[scale * 2 + 1] = value_micro;
 }
 
-static int mcp4728_init_scales_avail(struct mcp4728_data *data)
+static int mcp4728_init_scales_avail(struct mcp4728_data *data, int vdd_mv)
 {
-	int ret;
-
-	ret = regulator_get_voltage(data->vdd_reg);
-	if (ret < 0)
-		return ret;
-
-	mcp4728_init_scale_avail(MCP4728_SCALE_VDD, ret / 1000, data);
+	mcp4728_init_scale_avail(MCP4728_SCALE_VDD, vdd_mv, data);
 	mcp4728_init_scale_avail(MCP4728_SCALE_VINT_NO_GAIN, 2048, data);
 	mcp4728_init_scale_avail(MCP4728_SCALE_VINT_GAIN_X2, 4096, data);
 
@@ -530,17 +523,12 @@ static int mcp4728_init_channels_data(struct mcp4728_data *data)
 	return 0;
 }
 
-static void mcp4728_reg_disable(void *reg)
-{
-	regulator_disable(reg);
-}
-
 static int mcp4728_probe(struct i2c_client *client)
 {
 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
 	struct mcp4728_data *data;
 	struct iio_dev *indio_dev;
-	int ret;
+	int ret, vdd_mv;
 
 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 	if (!indio_dev)
@@ -550,18 +538,11 @@ static int mcp4728_probe(struct i2c_client *client)
 	i2c_set_clientdata(client, indio_dev);
 	data->client = client;
 
-	data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
-	if (IS_ERR(data->vdd_reg))
-		return PTR_ERR(data->vdd_reg);
-
-	ret = regulator_enable(data->vdd_reg);
-	if (ret)
+	ret = devm_regulator_get_enable_read_voltage(&client->dev, "vdd");
+	if (ret < 0)
 		return ret;
 
-	ret = devm_add_action_or_reset(&client->dev, mcp4728_reg_disable,
-				       data->vdd_reg);
-	if (ret)
-		return ret;
+	vdd_mv = ret / 1000;
 
 	/*
 	 * MCP4728 has internal EEPROM that save each channel boot
@@ -575,7 +556,7 @@ static int mcp4728_probe(struct i2c_client *client)
 			"failed to read mcp4728 current configuration\n");
 	}
 
-	ret = mcp4728_init_scales_avail(data);
+	ret = mcp4728_init_scales_avail(data, vdd_mv);
 	if (ret) {
 		return dev_err_probe(&client->dev, ret,
 				     "failed to init scales\n");

-- 
2.43.0


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

* [PATCH 3/6] iio: dac: mcp4922: use devm_regulator_get_enable_read_voltage()
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
  2024-07-12 16:03 ` [PATCH 1/6] iio: dac: mcp4728: rename err to ret in probe function David Lechner
  2024-07-12 16:03 ` [PATCH 2/6] iio: dac: mcp4728: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-07-12 16:03 ` David Lechner
  2024-07-12 16:03 ` [PATCH 4/6] iio: dac: mcp4922: drop remove() callback David Lechner
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

This makes use of the new devm_regulator_get_enable_read_voltage()
helper function to reduce boilerplate code in the MCP4922 DAC driver.

The error message is slightly different because there is only one error
return path now.

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

diff --git a/drivers/iio/dac/mcp4922.c b/drivers/iio/dac/mcp4922.c
index da4327624d45..f89af70fa5af 100644
--- a/drivers/iio/dac/mcp4922.c
+++ b/drivers/iio/dac/mcp4922.c
@@ -30,7 +30,6 @@ struct mcp4922_state {
 	struct spi_device *spi;
 	unsigned int value[MCP4922_NUM_CHANNELS];
 	unsigned int vref_mv;
-	struct regulator *vref_reg;
 	u8 mosi[2] __aligned(IIO_DMA_MINALIGN);
 };
 
@@ -132,24 +131,11 @@ static int mcp4922_probe(struct spi_device *spi)
 
 	state = iio_priv(indio_dev);
 	state->spi = spi;
-	state->vref_reg = devm_regulator_get(&spi->dev, "vref");
-	if (IS_ERR(state->vref_reg))
-		return dev_err_probe(&spi->dev, PTR_ERR(state->vref_reg),
-				     "Vref regulator not specified\n");
 
-	ret = regulator_enable(state->vref_reg);
-	if (ret) {
-		dev_err(&spi->dev, "Failed to enable vref regulator: %d\n",
-				ret);
-		return ret;
-	}
+	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref");
+	if (ret < 0)
+		return dev_err_probe(&spi->dev, ret, "Failed to get vref voltage\n");
 
-	ret = regulator_get_voltage(state->vref_reg);
-	if (ret < 0) {
-		dev_err(&spi->dev, "Failed to read vref regulator: %d\n",
-				ret);
-		goto error_disable_reg;
-	}
 	state->vref_mv = ret / 1000;
 
 	spi_set_drvdata(spi, indio_dev);
@@ -167,25 +153,17 @@ static int mcp4922_probe(struct spi_device *spi)
 	if (ret) {
 		dev_err(&spi->dev, "Failed to register iio device: %d\n",
 				ret);
-		goto error_disable_reg;
+		return ret;
 	}
 
 	return 0;
-
-error_disable_reg:
-	regulator_disable(state->vref_reg);
-
-	return ret;
 }
 
 static void mcp4922_remove(struct spi_device *spi)
 {
 	struct iio_dev *indio_dev = spi_get_drvdata(spi);
-	struct mcp4922_state *state;
 
 	iio_device_unregister(indio_dev);
-	state = iio_priv(indio_dev);
-	regulator_disable(state->vref_reg);
 }
 
 static const struct spi_device_id mcp4922_id[] = {

-- 
2.43.0


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

* [PATCH 4/6] iio: dac: mcp4922: drop remove() callback
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
                   ` (2 preceding siblings ...)
  2024-07-12 16:03 ` [PATCH 3/6] iio: dac: mcp4922: " David Lechner
@ 2024-07-12 16:03 ` David Lechner
  2024-07-12 16:03 ` [PATCH 5/6] iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage() David Lechner
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

By using devm_iio_device_register(), we can drop the remove() callback
in the mcp4922 driver. We can also remove spi_set_drvdata() since there
are no more callers of spi_get_drvdata(). Also use dev_err_probe()
while we are at it.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/dac/mcp4922.c | 17 +++--------------
 1 file changed, 3 insertions(+), 14 deletions(-)

diff --git a/drivers/iio/dac/mcp4922.c b/drivers/iio/dac/mcp4922.c
index f89af70fa5af..26aa99059813 100644
--- a/drivers/iio/dac/mcp4922.c
+++ b/drivers/iio/dac/mcp4922.c
@@ -138,7 +138,6 @@ static int mcp4922_probe(struct spi_device *spi)
 
 	state->vref_mv = ret / 1000;
 
-	spi_set_drvdata(spi, indio_dev);
 	id = spi_get_device_id(spi);
 	indio_dev->info = &mcp4922_info;
 	indio_dev->modes = INDIO_DIRECT_MODE;
@@ -149,22 +148,13 @@ static int mcp4922_probe(struct spi_device *spi)
 		indio_dev->num_channels = MCP4922_NUM_CHANNELS;
 	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);
-		return ret;
-	}
+	ret = devm_iio_device_register(&spi->dev, indio_dev);
+	if (ret)
+		return dev_err_probe(&spi->dev, ret, "Failed to register iio device\n");
 
 	return 0;
 }
 
-static void mcp4922_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 mcp4922_id[] = {
 	{"mcp4902", ID_MCP4902},
@@ -180,7 +170,6 @@ static struct spi_driver mcp4922_driver = {
 		   .name = "mcp4922",
 		   },
 	.probe = mcp4922_probe,
-	.remove = mcp4922_remove,
 	.id_table = mcp4922_id,
 };
 module_spi_driver(mcp4922_driver);

-- 
2.43.0


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

* [PATCH 5/6] iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage()
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
                   ` (3 preceding siblings ...)
  2024-07-12 16:03 ` [PATCH 4/6] iio: dac: mcp4922: drop remove() callback David Lechner
@ 2024-07-12 16:03 ` David Lechner
  2024-07-17 13:02   ` Marius.Cristea
  2024-07-12 16:03 ` [PATCH 6/6] iio: adc: mcp3911: " David Lechner
  2024-07-20 12:50 ` [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 Jonathan Cameron
  6 siblings, 1 reply; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

This makes use of the new devm_regulator_get_enable_read_voltage()
helper function to reduce boilerplate code in the MCP3564 ADC driver.

The error message is slightly changed since there are fewer error
return paths.

Setting adc->vref_mv is consolidated into a single place to make the
logic easier to follow.

A use_auto_zeroing_ref_attr local variable is added to make it more
obvious what the difference between the two iio info structures is.

The return value of the "Unknown Vref" dev_err_probe() is hard-coded to
-ENODEV instead of ret since it was getting a bit far from where ret
was set and logically that is the only value it could have.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/adc/mcp3564.c | 54 ++++++++++++++---------------------------------
 1 file changed, 16 insertions(+), 38 deletions(-)

diff --git a/drivers/iio/adc/mcp3564.c b/drivers/iio/adc/mcp3564.c
index d83bed0e63d2..34903b7b3cc4 100644
--- a/drivers/iio/adc/mcp3564.c
+++ b/drivers/iio/adc/mcp3564.c
@@ -349,8 +349,6 @@ struct mcp3564_chip_info {
  * struct mcp3564_state - working data for a ADC device
  * @chip_info:		chip specific data
  * @spi:		SPI device structure
- * @vref:		the regulator device used as a voltage reference in case
- *			external voltage reference is used
  * @vref_mv:		voltage reference value in miliVolts
  * @lock:		synchronize access to driver's state members
  * @dev_addr:		hardware device address
@@ -369,7 +367,6 @@ struct mcp3564_chip_info {
 struct mcp3564_state {
 	const struct mcp3564_chip_info	*chip_info;
 	struct spi_device		*spi;
-	struct regulator		*vref;
 	unsigned short			vref_mv;
 	struct mutex			lock; /* Synchronize access to driver's state members */
 	u8				dev_addr;
@@ -1085,11 +1082,6 @@ static int mcp3564_parse_fw_children(struct iio_dev *indio_dev)
 	return 0;
 }
 
-static void mcp3564_disable_reg(void *reg)
-{
-	regulator_disable(reg);
-}
-
 static void mcp3564_fill_scale_tbls(struct mcp3564_state *adc)
 {
 	unsigned int pow = adc->chip_info->resolution - 1;
@@ -1110,7 +1102,7 @@ static void mcp3564_fill_scale_tbls(struct mcp3564_state *adc)
 	}
 }
 
-static int mcp3564_config(struct iio_dev *indio_dev)
+static int mcp3564_config(struct iio_dev *indio_dev, bool *use_auto_zeroing_ref_attr)
 {
 	struct mcp3564_state *adc = iio_priv(indio_dev);
 	struct device *dev = &adc->spi->dev;
@@ -1119,6 +1111,7 @@ static int mcp3564_config(struct iio_dev *indio_dev)
 	enum mcp3564_ids ids;
 	int ret = 0;
 	unsigned int tmp = 0x01;
+	bool internal_vref;
 	bool err = false;
 
 	/*
@@ -1218,36 +1211,22 @@ static int mcp3564_config(struct iio_dev *indio_dev)
 
 	dev_dbg(dev, "Found %s chip\n", adc->chip_info->name);
 
-	adc->vref = devm_regulator_get_optional(dev, "vref");
-	if (IS_ERR(adc->vref)) {
-		if (PTR_ERR(adc->vref) != -ENODEV)
-			return dev_err_probe(dev, PTR_ERR(adc->vref),
-					     "failed to get regulator\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 voltage\n");
+
+	internal_vref = ret == -ENODEV;
+	adc->vref_mv = internal_vref ? MCP3564R_INT_VREF_MV : ret / MILLI;
+	*use_auto_zeroing_ref_attr = internal_vref;
 
+	if (internal_vref) {
 		/* Check if chip has internal vref */
 		if (!adc->have_vref)
-			return dev_err_probe(dev, PTR_ERR(adc->vref),
-					     "Unknown Vref\n");
-		adc->vref = NULL;
+			return dev_err_probe(dev, -ENODEV, "Unknown Vref\n");
+
 		dev_dbg(dev, "%s: Using internal Vref\n", __func__);
 	} else {
-		ret = regulator_enable(adc->vref);
-		if (ret)
-			return ret;
-
-		ret = devm_add_action_or_reset(dev, mcp3564_disable_reg,
-					       adc->vref);
-		if (ret)
-			return ret;
-
 		dev_dbg(dev, "%s: Using External Vref\n", __func__);
-
-		ret = regulator_get_voltage(adc->vref);
-		if (ret < 0)
-			return dev_err_probe(dev, ret,
-					     "Failed to read vref regulator\n");
-
-		adc->vref_mv = ret / MILLI;
 	}
 
 	ret = mcp3564_parse_fw_children(indio_dev);
@@ -1350,10 +1329,8 @@ static int mcp3564_config(struct iio_dev *indio_dev)
 	tmp_reg |= FIELD_PREP(MCP3564_CONFIG0_CLK_SEL_MASK, MCP3564_CONFIG0_USE_INT_CLK);
 	tmp_reg |= MCP3456_CONFIG0_BIT6_DEFAULT;
 
-	if (!adc->vref) {
+	if (internal_vref)
 		tmp_reg |= FIELD_PREP(MCP3456_CONFIG0_VREF_MASK, 1);
-		adc->vref_mv = MCP3564R_INT_VREF_MV;
-	}
 
 	ret = mcp3564_write_8bits(adc, MCP3564_CONFIG0_REG, tmp_reg);
 
@@ -1412,6 +1389,7 @@ static int mcp3564_probe(struct spi_device *spi)
 	int ret;
 	struct iio_dev *indio_dev;
 	struct mcp3564_state *adc;
+	bool use_auto_zeroing_ref_attr;
 
 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
 	if (!indio_dev)
@@ -1428,7 +1406,7 @@ static int mcp3564_probe(struct spi_device *spi)
 	 * enable/disable certain channels
 	 * change the sampling rate to the requested value
 	 */
-	ret = mcp3564_config(indio_dev);
+	ret = mcp3564_config(indio_dev, &use_auto_zeroing_ref_attr);
 	if (ret)
 		return dev_err_probe(&spi->dev, ret,
 				     "Can't configure MCP356X device\n");
@@ -1440,7 +1418,7 @@ static int mcp3564_probe(struct spi_device *spi)
 	indio_dev->name = adc->chip_info->name;
 	indio_dev->modes = INDIO_DIRECT_MODE;
 
-	if (!adc->vref)
+	if (use_auto_zeroing_ref_attr)
 		indio_dev->info = &mcp3564r_info;
 	else
 		indio_dev->info = &mcp3564_info;

-- 
2.43.0


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

* [PATCH 6/6] iio: adc: mcp3911: use devm_regulator_get_enable_read_voltage()
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
                   ` (4 preceding siblings ...)
  2024-07-12 16:03 ` [PATCH 5/6] iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-07-12 16:03 ` David Lechner
  2024-07-13  5:48   ` Marcus Folkesson
  2024-07-20 12:50 ` [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 Jonathan Cameron
  6 siblings, 1 reply; 10+ messages in thread
From: David Lechner @ 2024-07-12 16:03 UTC (permalink / raw)
  To: Jonathan Cameron, Marius Cristea, Marcus Folkesson,
	Kent Gustavsson
  Cc: David Lechner, Liam Girdwood, Mark Brown, linux-iio, linux-kernel

This makes use of the new devm_regulator_get_enable_read_voltage()
helper function to reduce boilerplate code in the MCP3911 ADC driver.

The error message is slightly changed since there are fewer error
return paths.

An extra parameter is added to the config callback to avoid adding
state that is not used outside of the probe() function.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---
 drivers/iio/adc/mcp3911.c | 59 +++++++++++++----------------------------------
 1 file changed, 16 insertions(+), 43 deletions(-)

diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
index 7a32e7a1be9d..5076028f541d 100644
--- a/drivers/iio/adc/mcp3911.c
+++ b/drivers/iio/adc/mcp3911.c
@@ -103,7 +103,7 @@ struct mcp3911_chip_info {
 	const struct iio_chan_spec *channels;
 	unsigned int num_channels;
 
-	int (*config)(struct mcp3911 *adc);
+	int (*config)(struct mcp3911 *adc, bool external_vref);
 	int (*get_osr)(struct mcp3911 *adc, u32 *val);
 	int (*set_osr)(struct mcp3911 *adc, u32 val);
 	int (*enable_offset)(struct mcp3911 *adc, bool enable);
@@ -115,7 +115,6 @@ struct mcp3911_chip_info {
 struct mcp3911 {
 	struct spi_device *spi;
 	struct mutex lock;
-	struct regulator *vref;
 	struct clk *clki;
 	u32 dev_addr;
 	struct iio_trigger *trig;
@@ -385,23 +384,11 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
 	}
 }
 
-static int mcp3911_calc_scale_table(struct mcp3911 *adc)
+static int mcp3911_calc_scale_table(u32 vref_mv)
 {
-	struct device *dev = &adc->spi->dev;
-	u32 ref = MCP3911_INT_VREF_MV;
 	u32 div;
-	int ret;
 	u64 tmp;
 
-	if (adc->vref) {
-		ret = regulator_get_voltage(adc->vref);
-		if (ret < 0) {
-			return dev_err_probe(dev, ret, "failed to get vref voltage\n");
-		}
-
-		ref = ret / 1000;
-	}
-
 	/*
 	 * For 24-bit Conversion
 	 * Raw = ((Voltage)/(Vref) * 2^23 * Gain * 1.5
@@ -412,7 +399,7 @@ static int mcp3911_calc_scale_table(struct mcp3911 *adc)
 	 */
 	for (int i = 0; i < MCP3911_NUM_SCALES; i++) {
 		div = 12582912 * BIT(i);
-		tmp = div_s64((s64)ref * 1000000000LL, div);
+		tmp = div_s64((s64)vref_mv * 1000000000LL, div);
 
 		mcp3911_scale_table[i][0] = 0;
 		mcp3911_scale_table[i][1] = tmp;
@@ -544,7 +531,7 @@ static const struct iio_info mcp3911_info = {
 	.write_raw_get_fmt = mcp3911_write_raw_get_fmt,
 };
 
-static int mcp3911_config(struct mcp3911 *adc)
+static int mcp3911_config(struct mcp3911 *adc, bool external_vref)
 {
 	struct device *dev = &adc->spi->dev;
 	u32 regval;
@@ -555,7 +542,7 @@ static int mcp3911_config(struct mcp3911 *adc)
 		return ret;
 
 	regval &= ~MCP3911_CONFIG_VREFEXT;
-	if (adc->vref) {
+	if (external_vref) {
 		dev_dbg(dev, "use external voltage reference\n");
 		regval |= FIELD_PREP(MCP3911_CONFIG_VREFEXT, 1);
 	} else {
@@ -610,7 +597,7 @@ static int mcp3911_config(struct mcp3911 *adc)
 	return mcp3911_write(adc, MCP3911_REG_GAIN, regval, 1);
 }
 
-static int mcp3910_config(struct mcp3911 *adc)
+static int mcp3910_config(struct mcp3911 *adc, bool external_vref)
 {
 	struct device *dev = &adc->spi->dev;
 	u32 regval;
@@ -621,7 +608,7 @@ static int mcp3910_config(struct mcp3911 *adc)
 		return ret;
 
 	regval &= ~MCP3910_CONFIG1_VREFEXT;
-	if (adc->vref) {
+	if (external_vref) {
 		dev_dbg(dev, "use external voltage reference\n");
 		regval |= FIELD_PREP(MCP3910_CONFIG1_VREFEXT, 1);
 	} else {
@@ -677,11 +664,6 @@ static int mcp3910_config(struct mcp3911 *adc)
 	return adc->chip->enable_offset(adc, 0);
 }
 
-static void mcp3911_cleanup_regulator(void *vref)
-{
-	regulator_disable(vref);
-}
-
 static int mcp3911_set_trigger_state(struct iio_trigger *trig, bool enable)
 {
 	struct mcp3911 *adc = iio_trigger_get_drvdata(trig);
@@ -704,6 +686,8 @@ static int mcp3911_probe(struct spi_device *spi)
 	struct device *dev = &spi->dev;
 	struct iio_dev *indio_dev;
 	struct mcp3911 *adc;
+	bool external_vref;
+	u32 vref_mv;
 	int ret;
 
 	indio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
@@ -714,23 +698,12 @@ static int mcp3911_probe(struct spi_device *spi)
 	adc->spi = spi;
 	adc->chip = spi_get_device_match_data(spi);
 
-	adc->vref = devm_regulator_get_optional(dev, "vref");
-	if (IS_ERR(adc->vref)) {
-		if (PTR_ERR(adc->vref) == -ENODEV) {
-			adc->vref = NULL;
-		} else {
-			return dev_err_probe(dev, PTR_ERR(adc->vref), "failed to get regulator\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 voltage\n");
 
-	} else {
-		ret = regulator_enable(adc->vref);
-		if (ret)
-			return ret;
-
-		ret = devm_add_action_or_reset(dev, mcp3911_cleanup_regulator, adc->vref);
-		if (ret)
-			return ret;
-	}
+	external_vref = ret != -ENODEV;
+	vref_mv = external_vref ? ret / 1000 : MCP3911_INT_VREF_MV;
 
 	adc->clki = devm_clk_get_enabled(dev, NULL);
 	if (IS_ERR(adc->clki)) {
@@ -755,11 +728,11 @@ static int mcp3911_probe(struct spi_device *spi)
 	}
 	dev_dbg(dev, "use device address %i\n", adc->dev_addr);
 
-	ret = adc->chip->config(adc);
+	ret = adc->chip->config(adc, external_vref);
 	if (ret)
 		return ret;
 
-	ret = mcp3911_calc_scale_table(adc);
+	ret = mcp3911_calc_scale_table(vref_mv);
 	if (ret)
 		return ret;
 

-- 
2.43.0


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

* Re: [PATCH 6/6] iio: adc: mcp3911: use devm_regulator_get_enable_read_voltage()
  2024-07-12 16:03 ` [PATCH 6/6] iio: adc: mcp3911: " David Lechner
@ 2024-07-13  5:48   ` Marcus Folkesson
  0 siblings, 0 replies; 10+ messages in thread
From: Marcus Folkesson @ 2024-07-13  5:48 UTC (permalink / raw)
  To: David Lechner
  Cc: Jonathan Cameron, Marius Cristea, Kent Gustavsson, Liam Girdwood,
	Mark Brown, linux-iio, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 552 bytes --]

On Fri, Jul 12, 2024 at 11:03:57AM -0500, David Lechner wrote:
> This makes use of the new devm_regulator_get_enable_read_voltage()
> helper function to reduce boilerplate code in the MCP3911 ADC driver.
> 
> The error message is slightly changed since there are fewer error
> return paths.
> 
> An extra parameter is added to the config callback to avoid adding
> state that is not used outside of the probe() function.
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>

Reviewed-by: Marcus Folkesson <marcus.folkesson@gmail.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH 5/6] iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage()
  2024-07-12 16:03 ` [PATCH 5/6] iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage() David Lechner
@ 2024-07-17 13:02   ` Marius.Cristea
  0 siblings, 0 replies; 10+ messages in thread
From: Marius.Cristea @ 2024-07-17 13:02 UTC (permalink / raw)
  To: kent, jic23, marcus.folkesson, dlechner
  Cc: lgirdwood, broonie, linux-kernel, linux-iio

Hi David,

   Thank you very much for cleaning up the code.

On Fri, 2024-07-12 at 11:03 -0500, David Lechner wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
> 
> This makes use of the new devm_regulator_get_enable_read_voltage()
> helper function to reduce boilerplate code in the MCP3564 ADC driver.
> 
> The error message is slightly changed since there are fewer error
> return paths.
> 
> Setting adc->vref_mv is consolidated into a single place to make the
> logic easier to follow.
> 
> A use_auto_zeroing_ref_attr local variable is added to make it more
> obvious what the difference between the two iio info structures is.
> 

Can we use another name here, instead of "use_auto_zeroing_ref_attr" to
use something like "use_internal_vref_attr". It could be misleading
because the difference between the two part numbers is related to
having or not having the internal voltage reference. If the part has
voltage reference (with the R at the end) and the user want's to use
it, there is an attribute to enable/disable in hardware the
"auto_zeroing_ref".

> The return value of the "Unknown Vref" dev_err_probe() is hard-coded
> to
> -ENODEV instead of ret since it was getting a bit far from where ret
> was set and logically that is the only value it could have.
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
> ---

Best regards,
Marius

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

* Re: [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3
  2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
                   ` (5 preceding siblings ...)
  2024-07-12 16:03 ` [PATCH 6/6] iio: adc: mcp3911: " David Lechner
@ 2024-07-20 12:50 ` Jonathan Cameron
  6 siblings, 0 replies; 10+ messages in thread
From: Jonathan Cameron @ 2024-07-20 12:50 UTC (permalink / raw)
  To: David Lechner
  Cc: Marius Cristea, Marcus Folkesson, Kent Gustavsson, Liam Girdwood,
	Mark Brown, linux-iio, linux-kernel

On Fri, 12 Jul 2024 11:03:51 -0500
David Lechner <dlechner@baylibre.com> wrote:

> This is the third round of patches to convert IIO drivers to use the
> new devm_regulator_get_enable_read_voltage() helper function.
> 
> This time, we are converting some Microchip drivers. These weren't as
> trivial as some other drivers because of nested functions that need
> to know info about the reference voltage, but for the most part, should
> be fairly straightforward. And there is a bonus to remove a remove()
> callback in one of the drivers.
Applied 1-4 and 6. Comment outstanding on 5 so I'm assuming I'll see
a v2 of just that patch at somepoint.

Thanks,

Jonathan

> 
> ---
> David Lechner (6):
>       iio: dac: mcp4728: rename err to ret in probe function
>       iio: dac: mcp4728: use devm_regulator_get_enable_read_voltage()
>       iio: dac: mcp4922: use devm_regulator_get_enable_read_voltage()
>       iio: dac: mcp4922: drop remove() callback
>       iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage()
>       iio: adc: mcp3911: use devm_regulator_get_enable_read_voltage()
> 
>  drivers/iio/adc/mcp3564.c | 54 +++++++++++++------------------------------
>  drivers/iio/adc/mcp3911.c | 59 +++++++++++++----------------------------------
>  drivers/iio/dac/mcp4728.c | 45 +++++++++++-------------------------
>  drivers/iio/dac/mcp4922.c | 47 ++++++-------------------------------
>  4 files changed, 52 insertions(+), 153 deletions(-)
> ---
> base-commit: 986da024b99a72e64f6bdb3f3f0e52af024b1f50
> change-id: 20240712-iio-regulator-refactor-round-3-17f2a82d2181


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

end of thread, other threads:[~2024-07-20 12:50 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-12 16:03 [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 David Lechner
2024-07-12 16:03 ` [PATCH 1/6] iio: dac: mcp4728: rename err to ret in probe function David Lechner
2024-07-12 16:03 ` [PATCH 2/6] iio: dac: mcp4728: use devm_regulator_get_enable_read_voltage() David Lechner
2024-07-12 16:03 ` [PATCH 3/6] iio: dac: mcp4922: " David Lechner
2024-07-12 16:03 ` [PATCH 4/6] iio: dac: mcp4922: drop remove() callback David Lechner
2024-07-12 16:03 ` [PATCH 5/6] iio: adc: mcp3564: use devm_regulator_get_enable_read_voltage() David Lechner
2024-07-17 13:02   ` Marius.Cristea
2024-07-12 16:03 ` [PATCH 6/6] iio: adc: mcp3911: " David Lechner
2024-07-13  5:48   ` Marcus Folkesson
2024-07-20 12:50 ` [PATCH 0/6] iio: use devm_regulator_get_enable_read_voltage round 3 Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).