mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
iio: adc: ad799x: add reference voltage capability to chip_info
If the chip supports an external reference voltage
on REFIN pin then the "vref-supply" regulator may be used.
This commit partially refactors 6b104e7895
to add the capability of the chip to have an external
voltage reference and then remove the ugly conditional check
on chip id.
Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Stefano Manni <stefano.manni@gmail.com>
Acked-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250807074850.130831-2-stefano.manni@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
d2d75e2526
commit
ed187a201b
|
|
@ -114,11 +114,13 @@ struct ad799x_chip_config {
|
|||
* @num_channels: number of channels
|
||||
* @noirq_config: device configuration w/o IRQ
|
||||
* @irq_config: device configuration w/IRQ
|
||||
* @has_vref: device supports external reference voltage
|
||||
*/
|
||||
struct ad799x_chip_info {
|
||||
int num_channels;
|
||||
const struct ad799x_chip_config noirq_config;
|
||||
const struct ad799x_chip_config irq_config;
|
||||
bool has_vref;
|
||||
};
|
||||
|
||||
struct ad799x_state {
|
||||
|
|
@ -604,6 +606,7 @@ static const struct iio_event_spec ad799x_events[] = {
|
|||
static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
|
||||
[ad7991] = {
|
||||
.num_channels = 5,
|
||||
.has_vref = true,
|
||||
.noirq_config = {
|
||||
.channel = {
|
||||
AD799X_CHANNEL(0, 12),
|
||||
|
|
@ -617,6 +620,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
|
|||
},
|
||||
[ad7995] = {
|
||||
.num_channels = 5,
|
||||
.has_vref = true,
|
||||
.noirq_config = {
|
||||
.channel = {
|
||||
AD799X_CHANNEL(0, 10),
|
||||
|
|
@ -630,6 +634,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
|
|||
},
|
||||
[ad7999] = {
|
||||
.num_channels = 5,
|
||||
.has_vref = true,
|
||||
.noirq_config = {
|
||||
.channel = {
|
||||
AD799X_CHANNEL(0, 8),
|
||||
|
|
@ -809,32 +814,22 @@ static int ad799x_probe(struct i2c_client *client)
|
|||
return ret;
|
||||
|
||||
/* check if an external reference is supplied */
|
||||
st->vref = devm_regulator_get_optional(&client->dev, "vref");
|
||||
|
||||
if (IS_ERR(st->vref)) {
|
||||
if (PTR_ERR(st->vref) == -ENODEV) {
|
||||
if (chip_info->has_vref) {
|
||||
st->vref = devm_regulator_get_optional(&client->dev, "vref");
|
||||
ret = PTR_ERR_OR_ZERO(st->vref);
|
||||
if (ret) {
|
||||
if (ret != -ENODEV)
|
||||
goto error_disable_reg;
|
||||
st->vref = NULL;
|
||||
dev_info(&client->dev, "Using VCC reference voltage\n");
|
||||
} else {
|
||||
ret = PTR_ERR(st->vref);
|
||||
goto error_disable_reg;
|
||||
}
|
||||
}
|
||||
|
||||
if (st->vref) {
|
||||
/*
|
||||
* Use external reference voltage if supported by hardware.
|
||||
* This is optional if voltage / regulator present, use VCC otherwise.
|
||||
*/
|
||||
if ((st->id == ad7991) || (st->id == ad7995) || (st->id == ad7999)) {
|
||||
if (st->vref) {
|
||||
dev_info(&client->dev, "Using external reference voltage\n");
|
||||
extra_config |= AD7991_REF_SEL;
|
||||
ret = regulator_enable(st->vref);
|
||||
if (ret)
|
||||
goto error_disable_reg;
|
||||
} else {
|
||||
st->vref = NULL;
|
||||
dev_warn(&client->dev, "Supplied reference not supported\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user