Commit 182b6164 authored by David Lechner's avatar David Lechner Committed by Jonathan Cameron
Browse files

iio: adc: ad7944: use devm_regulator_get_enable_read_voltage



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

Signed-off-by: default avatarDavid Lechner <dlechner@baylibre.com>
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Link: https://patch.msgid.link/20240612-iio-adc-ref-supply-refactor-v2-5-fa622e7354e9@baylibre.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 8f485a16
Loading
Loading
Loading
Loading
+12 −42
Original line number Diff line number Diff line
@@ -464,23 +464,17 @@ static const char * const ad7944_power_supplies[] = {
	"avdd",	"dvdd",	"bvdd", "vio"
};

static void ad7944_ref_disable(void *ref)
{
	regulator_disable(ref);
}

static int ad7944_probe(struct spi_device *spi)
{
	const struct ad7944_chip_info *chip_info;
	struct device *dev = &spi->dev;
	struct iio_dev *indio_dev;
	struct ad7944_adc *adc;
	bool have_refin = false;
	struct regulator *ref;
	bool have_refin;
	struct iio_chan_spec *chain_chan;
	unsigned long *chain_scan_masks;
	u32 n_chain_dev;
	int ret;
	int ret, ref_mv;

	indio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
	if (!indio_dev)
@@ -531,47 +525,23 @@ static int ad7944_probe(struct spi_device *spi)
	 * - external reference: REF is connected, REFIN is not connected
	 */

	ref = devm_regulator_get_optional(dev, "ref");
	if (IS_ERR(ref)) {
		if (PTR_ERR(ref) != -ENODEV)
			return dev_err_probe(dev, PTR_ERR(ref),
					     "failed to get REF supply\n");
	ret = devm_regulator_get_enable_read_voltage(dev, "ref");
	if (ret < 0 && ret != -ENODEV)
		return dev_err_probe(dev, ret, "failed to get REF voltage\n");

		ref = NULL;
	}
	ref_mv = ret == -ENODEV ? 0 : ret / 1000;

	ret = devm_regulator_get_enable_optional(dev, "refin");
	if (ret == 0)
		have_refin = true;
	else if (ret != -ENODEV)
		return dev_err_probe(dev, ret,
				     "failed to get and enable REFIN supply\n");
	if (ret < 0 && ret != -ENODEV)
		return dev_err_probe(dev, ret, "failed to get REFIN voltage\n");

	have_refin = ret != -ENODEV;

	if (have_refin && ref)
	if (have_refin && ref_mv)
		return dev_err_probe(dev, -EINVAL,
				     "cannot have both refin and ref supplies\n");

	if (ref) {
		ret = regulator_enable(ref);
		if (ret)
			return dev_err_probe(dev, ret,
					     "failed to enable REF supply\n");

		ret = devm_add_action_or_reset(dev, ad7944_ref_disable, ref);
		if (ret)
			return ret;

		ret = regulator_get_voltage(ref);
		if (ret < 0)
			return dev_err_probe(dev, ret,
					     "failed to get REF voltage\n");

		/* external reference */
		adc->ref_mv = ret / 1000;
	} else {
		/* internal reference */
		adc->ref_mv = AD7944_INTERNAL_REF_MV;
	}
	adc->ref_mv = ref_mv ?: AD7944_INTERNAL_REF_MV;

	adc->cnv = devm_gpiod_get_optional(dev, "cnv", GPIOD_OUT_LOW);
	if (IS_ERR(adc->cnv))