iio: accel: kxsd9: Fix up offset and scaling
[sfrench/cifs-2.6.git] / drivers / iio / accel / kxsd9.c
index dc0bea7cbf4f46ba609c241a0864fd44be2d5c68..6a1e67723d0c49eafb55e7922f7c90579ae66b9d 100644 (file)
@@ -55,6 +55,8 @@ struct kxsd9_state {
 /* reverse order */
 static const int kxsd9_micro_scales[4] = { 47853, 35934, 23927, 11978 };
 
+#define KXSD9_ZERO_G_OFFSET -2048
+
 static int kxsd9_write_scale(struct iio_dev *indio_dev, int micro)
 {
        int ret, i;
@@ -82,19 +84,6 @@ error_ret:
        return ret;
 }
 
-static int kxsd9_read(struct iio_dev *indio_dev, u8 address)
-{
-       int ret;
-       struct kxsd9_state *st = iio_priv(indio_dev);
-       __be16 raw_val;
-
-       ret = regmap_bulk_read(st->map, address, &raw_val, sizeof(raw_val));
-       if (ret)
-               return ret;
-       /* Only 12 bits are valid */
-       return be16_to_cpu(raw_val) & 0xfff0;
-}
-
 static IIO_CONST_ATTR(accel_scale_available,
                KXSD9_SCALE_2G " "
                KXSD9_SCALE_4G " "
@@ -131,13 +120,24 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev,
        int ret = -EINVAL;
        struct kxsd9_state *st = iio_priv(indio_dev);
        unsigned int regval;
+       __be16 raw_val;
+       u16 nval;
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
-               ret = kxsd9_read(indio_dev, chan->address);
-               if (ret < 0)
+               ret = regmap_bulk_read(st->map, chan->address, &raw_val,
+                                      sizeof(raw_val));
+               if (ret)
                        goto error_ret;
-               *val = ret;
+               nval = be16_to_cpu(raw_val);
+               /* Only 12 bits are valid */
+               nval >>= 4;
+               *val = nval;
+               ret = IIO_VAL_INT;
+               break;
+       case IIO_CHAN_INFO_OFFSET:
+               /* This has a bias of -2048 */
+               *val = KXSD9_ZERO_G_OFFSET;
                ret = IIO_VAL_INT;
                break;
        case IIO_CHAN_INFO_SCALE:
@@ -161,7 +161,8 @@ error_ret:
                .modified = 1,                                          \
                .channel2 = IIO_MOD_##axis,                             \
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),           \
-               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),   \
+               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
+                                       BIT(IIO_CHAN_INFO_OFFSET),      \
                .address = KXSD9_REG_##axis,                            \
        }