Commit 0d2775c1 authored by David Lechner's avatar David Lechner Committed by Jonathan Cameron

iio: adc: ad7192: use devm_regulator_get_enable_read_voltage

This makes use of the new devm_regulator_get_enable_read_voltage()
function to reduce boilerplate code.

Error messages have changed slightly since there are now fewer places
where we print an error. The rest of the logic of selecting which
supply to use as the reference voltage remains the same.

Also 1000 is replaced by MILLI in a few places for consistency.
Signed-off-by: default avatarDavid Lechner <dlechner@baylibre.com>
Signed-off-by: default avatarAlisa-Dariana Roman <alisa.roman@analog.com>
Reviewed-by: default avatarConor Dooley <conor.dooley@microchip.com>
Link: https://patch.msgid.link/20240624124941.113010-2-alisa.roman@analog.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent a3c2c5c9
...@@ -200,8 +200,6 @@ struct ad7192_chip_info { ...@@ -200,8 +200,6 @@ struct ad7192_chip_info {
struct ad7192_state { struct ad7192_state {
const struct ad7192_chip_info *chip_info; const struct ad7192_chip_info *chip_info;
struct regulator *avdd;
struct regulator *vref;
struct clk *mclk; struct clk *mclk;
u16 int_vref_mv; u16 int_vref_mv;
u32 aincom_mv; u32 aincom_mv;
...@@ -1189,18 +1187,12 @@ static const struct ad7192_chip_info ad7192_chip_info_tbl[] = { ...@@ -1189,18 +1187,12 @@ static const struct ad7192_chip_info ad7192_chip_info_tbl[] = {
}, },
}; };
static void ad7192_reg_disable(void *reg)
{
regulator_disable(reg);
}
static int ad7192_probe(struct spi_device *spi) static int ad7192_probe(struct spi_device *spi)
{ {
struct device *dev = &spi->dev; struct device *dev = &spi->dev;
struct ad7192_state *st; struct ad7192_state *st;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct regulator *aincom; int ret, avdd_mv;
int ret;
if (!spi->irq) if (!spi->irq)
return dev_err_probe(dev, -ENODEV, "Failed to get IRQ\n"); return dev_err_probe(dev, -ENODEV, "Failed to get IRQ\n");
...@@ -1218,72 +1210,49 @@ static int ad7192_probe(struct spi_device *spi) ...@@ -1218,72 +1210,49 @@ static int ad7192_probe(struct spi_device *spi)
* Newer firmware should provide a zero volt fixed supply if wired to * Newer firmware should provide a zero volt fixed supply if wired to
* ground. * ground.
*/ */
aincom = devm_regulator_get_optional(dev, "aincom"); ret = devm_regulator_get_enable_read_voltage(dev, "aincom");
if (IS_ERR(aincom)) { if (ret < 0 && ret != -ENODEV)
if (PTR_ERR(aincom) != -ENODEV) return dev_err_probe(dev, ret, "Failed to get AINCOM voltage\n");
return dev_err_probe(dev, PTR_ERR(aincom),
"Failed to get AINCOM supply\n"); st->aincom_mv = ret == -ENODEV ? 0 : ret / MILLI;
st->aincom_mv = 0; /* AVDD can optionally be used as reference voltage */
} else { ret = devm_regulator_get_enable_read_voltage(dev, "avdd");
ret = regulator_enable(aincom); if (ret == -ENODEV || ret == -EINVAL) {
if (ret) int ret2;
return dev_err_probe(dev, ret,
"Failed to enable specified AINCOM supply\n"); /*
* We get -EINVAL if avdd is a supply with unknown voltage. We
ret = devm_add_action_or_reset(dev, ad7192_reg_disable, aincom); * still need to enable it since it is also a power supply.
if (ret) */
return ret; ret2 = devm_regulator_get_enable(dev, "avdd");
if (ret2)
ret = regulator_get_voltage(aincom); return dev_err_probe(dev, ret2,
if (ret < 0) "Failed to enable AVDD supply\n");
return dev_err_probe(dev, ret, } else if (ret < 0) {
"Device tree error, AINCOM voltage undefined\n"); return dev_err_probe(dev, ret, "Failed to get AVDD voltage\n");
st->aincom_mv = ret / MILLI;
} }
st->avdd = devm_regulator_get(dev, "avdd"); avdd_mv = ret == -ENODEV || ret == -EINVAL ? 0 : ret / MILLI;
if (IS_ERR(st->avdd))
return PTR_ERR(st->avdd);
ret = regulator_enable(st->avdd);
if (ret)
return dev_err_probe(dev, ret,
"Failed to enable specified AVdd supply\n");
ret = devm_add_action_or_reset(dev, ad7192_reg_disable, st->avdd);
if (ret)
return ret;
ret = devm_regulator_get_enable(dev, "dvdd"); ret = devm_regulator_get_enable(dev, "dvdd");
if (ret) if (ret)
return dev_err_probe(dev, ret, "Failed to enable specified DVdd supply\n"); return dev_err_probe(dev, ret, "Failed to enable specified DVdd supply\n");
st->vref = devm_regulator_get_optional(dev, "vref"); /*
if (IS_ERR(st->vref)) { * This is either REFIN1 or REFIN2 depending on adi,refin2-pins-enable.
if (PTR_ERR(st->vref) != -ENODEV) * If this supply is not present, fall back to AVDD as reference.
return PTR_ERR(st->vref); */
ret = devm_regulator_get_enable_read_voltage(dev, "vref");
ret = regulator_get_voltage(st->avdd); if (ret == -ENODEV) {
if (ret < 0) if (avdd_mv == 0)
return dev_err_probe(dev, ret, return dev_err_probe(dev, -ENODEV,
"Device tree error, AVdd voltage undefined\n"); "No reference voltage available\n");
} else { } else if (ret < 0) {
ret = regulator_enable(st->vref); return ret;
if (ret)
return dev_err_probe(dev, ret,
"Failed to enable specified Vref supply\n");
ret = devm_add_action_or_reset(dev, ad7192_reg_disable, st->vref);
if (ret)
return ret;
ret = regulator_get_voltage(st->vref);
if (ret < 0)
return dev_err_probe(dev, ret,
"Device tree error, Vref voltage undefined\n");
} }
st->int_vref_mv = ret / 1000;
st->int_vref_mv = ret == -ENODEV ? avdd_mv : ret / MILLI;
st->chip_info = spi_get_device_match_data(spi); st->chip_info = spi_get_device_match_data(spi);
indio_dev->name = st->chip_info->name; indio_dev->name = st->chip_info->name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment