Commit 05f9c671 authored by Julien Stephan's avatar Julien Stephan Committed by Jonathan Cameron
Browse files

iio: adc: ad7380: fix supplies for ad7380-4



ad7380-4 is the only device in the family that does not have an internal
reference. It uses "refin" as a required external reference.
All other devices in the family use "refio"" as an optional external
reference.

Fixes: 737413da ("iio: adc: ad7380: add support for ad738x-4 4 channels variants")
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Reviewed-by: default avatarDavid Lechner <dlechner@baylibre.com>
Signed-off-by: default avatarJulien Stephan <jstephan@baylibre.com>
Link: https://patch.msgid.link/20241022-ad7380-fix-supplies-v3-4-f0cefe1b7fa6@baylibre.com


Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 7ddbc272
Loading
Loading
Loading
Loading
+26 −10
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ struct ad7380_chip_info {
	bool has_mux;
	const char * const *supplies;
	unsigned int num_supplies;
	bool external_ref_only;
	const char * const *vcm_supplies;
	unsigned int num_vcm_supplies;
	const unsigned long *available_scan_masks;
@@ -431,6 +432,7 @@ static const struct ad7380_chip_info ad7380_4_chip_info = {
	.num_simult_channels = 4,
	.supplies = ad7380_supplies,
	.num_supplies = ARRAY_SIZE(ad7380_supplies),
	.external_ref_only = true,
	.available_scan_masks = ad7380_4_channel_scan_masks,
	.timing_specs = &ad7380_4_timing,
};
@@ -1047,17 +1049,31 @@ static int ad7380_probe(struct spi_device *spi)
				     "Failed to enable power supplies\n");
	fsleep(T_POWERUP_US);

	if (st->chip_info->external_ref_only) {
		ret = devm_regulator_get_enable_read_voltage(&spi->dev,
							     "refin");
		if (ret < 0)
			return dev_err_probe(&spi->dev, ret,
					     "Failed to get refin regulator\n");

		st->vref_mv = ret / 1000;

		/* these chips don't have a register bit for this */
		external_ref_en = false;
	} else {
		/*
		 * If there is no REFIO supply, then it means that we are using
	 * the internal 2.5V reference, otherwise REFIO is reference voltage.
		 * the internal reference, otherwise REFIO is reference voltage.
		 */
	ret = devm_regulator_get_enable_read_voltage(&spi->dev, "refio");
		ret = devm_regulator_get_enable_read_voltage(&spi->dev,
							     "refio");
		if (ret < 0 && ret != -ENODEV)
			return dev_err_probe(&spi->dev, ret,
					     "Failed to get refio regulator\n");

		external_ref_en = ret != -ENODEV;
		st->vref_mv = external_ref_en ? ret / 1000 : AD7380_INTERNAL_REF_MV;
	}

	if (st->chip_info->num_vcm_supplies > ARRAY_SIZE(st->vcm_mv))
		return dev_err_probe(&spi->dev, -EINVAL,