]> git.baikalelectronics.ru Git - kernel.git/commitdiff
iio: imu: fxos8700: fix IMU data bits returned to user space
authorCarlos Song <carlos.song@nxp.com>
Thu, 8 Dec 2022 07:19:08 +0000 (15:19 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Feb 2023 10:28:18 +0000 (11:28 +0100)
commit a53f945879c0cb9de3a4c05a665f5157884b5208 upstream.

ACCEL output data registers contain the X-axis, Y-axis, and Z-axis
14-bit left-justified sample data and MAGN output data registers
contain the X-axis, Y-axis, and Z-axis 16-bit sample data. The ACCEL
raw register output data should be divided by 4 before sent to
userspace.

Apply a 2 bits signed right shift to the raw data from ACCEL output
data register but keep that from MAGN sensor as the origin.

Fixes: 2c7e7594a2fd ("iio: imu: Add support for the FXOS8700 IMU")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
Link: https://lore.kernel.org/r/20221208071911.2405922-5-carlos.song@nxp.com
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/iio/imu/fxos8700_core.c

index 26029510b1e97afdcc8397a6065c715282a38b60..1e16da5084b8aae06a79dc620b9bb6763784e37a 100644 (file)
@@ -418,6 +418,7 @@ static int fxos8700_get_data(struct fxos8700_data *data, int chan_type,
                             int axis, int *val)
 {
        u8 base, reg;
+       s16 tmp;
        int ret;
        enum fxos8700_sensor type = fxos8700_to_sensor(chan_type);
 
@@ -432,8 +433,33 @@ static int fxos8700_get_data(struct fxos8700_data *data, int chan_type,
        /* Convert axis to buffer index */
        reg = axis - IIO_MOD_X;
 
+       /*
+        * Convert to native endianness. The accel data and magn data
+        * are signed, so a forced type conversion is needed.
+        */
+       tmp = be16_to_cpu(data->buf[reg]);
+
+       /*
+        * ACCEL output data registers contain the X-axis, Y-axis, and Z-axis
+        * 14-bit left-justified sample data and MAGN output data registers
+        * contain the X-axis, Y-axis, and Z-axis 16-bit sample data. Apply
+        * a signed 2 bits right shift to the readback raw data from ACCEL
+        * output data register and keep that from MAGN sensor as the origin.
+        * Value should be extended to 32 bit.
+        */
+       switch (chan_type) {
+       case IIO_ACCEL:
+               tmp = tmp >> 2;
+               break;
+       case IIO_MAGN:
+               /* Nothing to do */
+               break;
+       default:
+               return -EINVAL;
+       }
+
        /* Convert to native endianness */
-       *val = sign_extend32(be16_to_cpu(data->buf[reg]), 15);
+       *val = sign_extend32(tmp, 15);
 
        return 0;
 }