iio: sca3000: Use scan_type when processing raw data
authorGwendal Grignou <gwendal@chromium.org>
Thu, 4 Nov 2021 08:24:04 +0000 (01:24 -0700)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 17 Nov 2021 17:51:41 +0000 (17:51 +0000)
Use channel definition as root of trust and replace constant
when reading elements directly using the raw sysfs attributes.

Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Link: https://lore.kernel.org/r/20211104082413.3681212-5-gwendal@chromium.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/sca3000.c

index c6b7530..43ecacb 100644 (file)
@@ -534,6 +534,13 @@ static const struct iio_chan_spec sca3000_channels_with_temp[] = {
                        BIT(IIO_CHAN_INFO_OFFSET),
                /* No buffer support */
                .scan_index = -1,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 9,
+                       .storagebits = 16,
+                       .shift = 5,
+                       .endianness = IIO_BE,
+               },
        },
        {
                .type = IIO_ACCEL,
@@ -730,8 +737,9 @@ static int sca3000_read_raw(struct iio_dev *indio_dev,
                                mutex_unlock(&st->lock);
                                return ret;
                        }
-                       *val = (be16_to_cpup((__be16 *)st->rx) >> 3) & 0x1FFF;
-                       *val = sign_extend32(*val, 12);
+                       *val = sign_extend32(be16_to_cpup((__be16 *)st->rx) >>
+                                            chan->scan_type.shift,
+                                            chan->scan_type.realbits - 1);
                } else {
                        /* get the temperature when available */
                        ret = sca3000_read_data_short(st,
@@ -741,8 +749,9 @@ static int sca3000_read_raw(struct iio_dev *indio_dev,
                                mutex_unlock(&st->lock);
                                return ret;
                        }
-                       *val = ((st->rx[0] & 0x3F) << 3) |
-                              ((st->rx[1] & 0xE0) >> 5);
+                       *val = (be16_to_cpup((__be16 *)st->rx) >>
+                               chan->scan_type.shift) &
+                               GENMASK(chan->scan_type.realbits - 1, 0);
                }
                mutex_unlock(&st->lock);
                return IIO_VAL_INT;