aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHartmut Knaack <knaack.h@gmx.de>2015-08-28 17:59:58 -0400
committerJonathan Cameron <jic23@kernel.org>2015-10-11 10:45:17 -0400
commit399910534cca5f00d22438e80ecc7ccc7f4b8a14 (patch)
treee673942ffffdb8d8bf137b301855a6d7c3114840
parentacf2f67d055c656938a3980a0745ed62fb7985c9 (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.c13
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
32struct m62332_data { 32struct 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;