From 399910534cca5f00d22438e80ecc7ccc7f4b8a14 Mon Sep 17 00:00:00 2001 From: Hartmut Knaack Date: Fri, 28 Aug 2015 23:59:58 +0200 Subject: [PATCH] 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 Signed-off-by: Jonathan Cameron --- drivers/iio/dac/m62332.c | 13 ++++++------- 1 file 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 @@ struct m62332_data { struct i2c_client *client; - u16 vref_mv; struct regulator *vcc; struct mutex mutex; u8 raw[M62332_CHANNELS]; @@ -89,11 +88,16 @@ static int m62332_read_raw(struct iio_dev *indio_dev, long mask) { struct m62332_data *data = iio_priv(indio_dev); + int ret; switch (mask) { case IIO_CHAN_INFO_SCALE: /* Corresponds to Vref / 2^(bits) */ - *val = data->vref_mv; + ret = regulator_get_voltage(data->vcc); + if (ret < 0) + return ret; + + *val = ret / 1000; /* mV */ *val2 = 8; return IIO_VAL_FRACTIONAL_LOG2; @@ -218,11 +222,6 @@ static int m62332_probe(struct i2c_client *client, indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->info = &m62332_info; - ret = regulator_get_voltage(data->vcc); - if (ret < 0) - return ret; - data->vref_mv = ret / 1000; /* mV */ - ret = iio_map_array_register(indio_dev, client->dev.platform_data); if (ret < 0) return ret; -- 2.30.2