diff options
author | Hartmut Knaack <knaack.h@gmx.de> | 2015-08-28 17:59:58 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2015-10-11 10:45:17 -0400 |
commit | 399910534cca5f00d22438e80ecc7ccc7f4b8a14 (patch) | |
tree | e673942ffffdb8d8bf137b301855a6d7c3114840 | |
parent | acf2f67d055c656938a3980a0745ed62fb7985c9 (diff) |
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>
-rw-r--r-- | drivers/iio/dac/m62332.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/iio/dac/m62332.c b/drivers/iio/dac/m62332.c index fdb3e042c14d..76e8b044b979 100644 --- a/drivers/iio/dac/m62332.c +++ b/drivers/iio/dac/m62332.c | |||
@@ -31,7 +31,6 @@ | |||
31 | 31 | ||
32 | struct m62332_data { | 32 | struct m62332_data { |
33 | struct i2c_client *client; | 33 | struct i2c_client *client; |
34 | u16 vref_mv; | ||
35 | struct regulator *vcc; | 34 | struct regulator *vcc; |
36 | struct mutex mutex; | 35 | struct mutex mutex; |
37 | u8 raw[M62332_CHANNELS]; | 36 | u8 raw[M62332_CHANNELS]; |
@@ -89,11 +88,16 @@ static int m62332_read_raw(struct iio_dev *indio_dev, | |||
89 | long mask) | 88 | long mask) |
90 | { | 89 | { |
91 | struct m62332_data *data = iio_priv(indio_dev); | 90 | struct m62332_data *data = iio_priv(indio_dev); |
91 | int ret; | ||
92 | 92 | ||
93 | switch (mask) { | 93 | switch (mask) { |
94 | case IIO_CHAN_INFO_SCALE: | 94 | case IIO_CHAN_INFO_SCALE: |
95 | /* Corresponds to Vref / 2^(bits) */ | 95 | /* Corresponds to Vref / 2^(bits) */ |
96 | *val = data->vref_mv; | 96 | ret = regulator_get_voltage(data->vcc); |
97 | if (ret < 0) | ||
98 | return ret; | ||
99 | |||
100 | *val = ret / 1000; /* mV */ | ||
97 | *val2 = 8; | 101 | *val2 = 8; |
98 | 102 | ||
99 | return IIO_VAL_FRACTIONAL_LOG2; | 103 | return IIO_VAL_FRACTIONAL_LOG2; |
@@ -218,11 +222,6 @@ static int m62332_probe(struct i2c_client *client, | |||
218 | indio_dev->modes = INDIO_DIRECT_MODE; | 222 | indio_dev->modes = INDIO_DIRECT_MODE; |
219 | indio_dev->info = &m62332_info; | 223 | indio_dev->info = &m62332_info; |
220 | 224 | ||
221 | ret = regulator_get_voltage(data->vcc); | ||
222 | if (ret < 0) | ||
223 | return ret; | ||
224 | data->vref_mv = ret / 1000; /* mV */ | ||
225 | |||
226 | ret = iio_map_array_register(indio_dev, client->dev.platform_data); | 225 | ret = iio_map_array_register(indio_dev, client->dev.platform_data); |
227 | if (ret < 0) | 226 | if (ret < 0) |
228 | return ret; | 227 | return ret; |