Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio:dac:m62332: use dynamic scale

Some regulators can supply multiple voltages. To take changing voltages
into account, the scale needs to be calculated on every read access.

Signed-off-by: Hartmut Knaack <knaack.h@gmx.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Hartmut Knaack and committed by
Jonathan Cameron
39991053 acf2f67d

+6 -7
+6 -7
drivers/iio/dac/m62332.c
··· 31 31 32 32 struct m62332_data { 33 33 struct i2c_client *client; 34 - u16 vref_mv; 35 34 struct regulator *vcc; 36 35 struct mutex mutex; 37 36 u8 raw[M62332_CHANNELS]; ··· 88 89 long mask) 89 90 { 90 91 struct m62332_data *data = iio_priv(indio_dev); 92 + int ret; 91 93 92 94 switch (mask) { 93 95 case IIO_CHAN_INFO_SCALE: 94 96 /* Corresponds to Vref / 2^(bits) */ 95 - *val = data->vref_mv; 97 + ret = regulator_get_voltage(data->vcc); 98 + if (ret < 0) 99 + return ret; 100 + 101 + *val = ret / 1000; /* mV */ 96 102 *val2 = 8; 97 103 98 104 return IIO_VAL_FRACTIONAL_LOG2; ··· 221 217 indio_dev->channels = m62332_channels; 222 218 indio_dev->modes = INDIO_DIRECT_MODE; 223 219 indio_dev->info = &m62332_info; 224 - 225 - ret = regulator_get_voltage(data->vcc); 226 - if (ret < 0) 227 - return ret; 228 - data->vref_mv = ret / 1000; /* mV */ 229 220 230 221 ret = iio_map_array_register(indio_dev, client->dev.platform_data); 231 222 if (ret < 0)