From: Archit Anant Date: Sun, 12 Apr 2026 09:37:38 +0000 (+0530) Subject: iio: adc: ad799x: cache regulator voltages during probe X-Git-Tag: v7.2-rc1~67^2~5^2~208 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=97c3fae0dbc4bf62eac7a1798b723c258e85980d;p=thirdparty%2Fkernel%2Flinux.git iio: adc: ad799x: cache regulator voltages during probe Since the reference voltage for this ADC is not expected to change at runtime, determine the active reference voltage (either VREF or VCC) during probe() and cache it in a single variable in the state structure. Suggested-by: Jonathan Cameron Suggested-by: David Lechner Reviewed-by: David Lechner Signed-off-by: Archit Anant Reviewed-by: Andy Shevchenko Signed-off-by: Jonathan Cameron --- diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index d8389b6e19b55..e37bb64edd2b6 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -135,6 +136,9 @@ struct ad799x_state { u16 config; unsigned int transfer_size; + + int vref_uV; + IIO_DECLARE_BUFFER_WITH_TS(__be16, rx_buf, AD799X_MAX_CHANNELS); }; @@ -303,14 +307,7 @@ static int ad799x_read_raw(struct iio_dev *indio_dev, GENMASK(chan->scan_type.realbits - 1, 0); return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: - if (st->vref) - ret = regulator_get_voltage(st->vref); - else - ret = regulator_get_voltage(st->reg); - - if (ret < 0) - return ret; - *val = ret / 1000; + *val = st->vref_uV / (MICRO / MILLI); *val2 = chan->scan_type.realbits; return IIO_VAL_FRACTIONAL_LOG2; } @@ -829,9 +826,20 @@ static int ad799x_probe(struct i2c_client *client) ret = regulator_enable(st->vref); if (ret) goto error_disable_reg; + ret = regulator_get_voltage(st->vref); + if (ret < 0) + goto error_disable_vref; + st->vref_uV = ret; } } + if (!st->vref) { + ret = regulator_get_voltage(st->reg); + if (ret < 0) + goto error_disable_reg; + st->vref_uV = ret; + } + st->client = client; indio_dev->name = id->name;