mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 13:06:59 +02:00
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: 737413da87 ("iio: adc: ad7380: add support for ad738x-4 4 channels variants")
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Julien 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: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
7ddbc27287
commit
05f9c67179
|
|
@ -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 there is no REFIO supply, then it means that we are using
|
||||
* the internal 2.5V reference, otherwise REFIO is reference voltage.
|
||||
*/
|
||||
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");
|
||||
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");
|
||||
|
||||
external_ref_en = ret != -ENODEV;
|
||||
st->vref_mv = external_ref_en ? ret / 1000 : AD7380_INTERNAL_REF_MV;
|
||||
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 reference, otherwise REFIO is reference voltage.
|
||||
*/
|
||||
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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user