iio:ad7791: Report scale as fractional value
authorLars-Peter Clausen <lars@metafoo.de>
Sat, 28 Sep 2013 09:31:00 +0000 (10:31 +0100)
committerJonathan Cameron <jic23@kernel.org>
Tue, 1 Oct 2013 15:19:12 +0000 (16:19 +0100)
Move the complexity of calculating the fixed point scale to the core.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/adc/ad7791.c

index c20203577d2d1e38da820299fba5aca0d10a0c37..c19f8fd1b4b7ac9ba5c2b216d5aa7be362200859 100644 (file)
@@ -202,7 +202,6 @@ static int ad7791_read_raw(struct iio_dev *indio_dev,
 {
        struct ad7791_state *st = iio_priv(indio_dev);
        bool unipolar = !!(st->mode & AD7791_MODE_UNIPOLAR);
-       unsigned long long scale_pv;
 
        switch (info) {
        case IIO_CHAN_INFO_RAW:
@@ -220,23 +219,26 @@ static int ad7791_read_raw(struct iio_dev *indio_dev,
        case IIO_CHAN_INFO_SCALE:
                /* The monitor channel uses an internal reference. */
                if (chan->address == AD7791_CH_AVDD_MONITOR) {
-                       scale_pv = 5850000000000ULL;
+                       /*
+                        * The signal is attenuated by a factor of 5 and
+                        * compared against a 1.17V internal reference.
+                        */
+                       *val = 1170 * 5;
                } else {
                        int voltage_uv;
 
                        voltage_uv = regulator_get_voltage(st->reg);
                        if (voltage_uv < 0)
                                return voltage_uv;
-                       scale_pv = (unsigned long long)voltage_uv * 1000000;
+
+                       *val = voltage_uv / 1000;
                }
                if (unipolar)
-                       scale_pv >>= chan->scan_type.realbits;
+                       *val2 = chan->scan_type.realbits;
                else
-                       scale_pv >>= chan->scan_type.realbits - 1;
-               *val2 = do_div(scale_pv, 1000000000);
-               *val = scale_pv;
+                       *val2 = chan->scan_type.realbits - 1;
 
-               return IIO_VAL_INT_PLUS_NANO;
+               return IIO_VAL_FRACTIONAL_LOG2;
        }
 
        return -EINVAL;