patch "iio: imu: fxos8700: fix IMU data bits returned to user space" added to char-misc-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iio: imu: fxos8700: fix IMU data bits returned to user space
to my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From a53f945879c0cb9de3a4c05a665f5157884b5208 Mon Sep 17 00:00:00 2001
From: Carlos Song <[email protected]>
Date: Thu, 8 Dec 2022 15:19:08 +0800
Subject: iio: imu: fxos8700: fix IMU data bits returned to user space
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.
--- drivers/iio/imu/fxos8700_core.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
drivers/iio/imu/fxos8700_core.c +27 -1
@@ -394,6 +394,7 @@ static int fxos8700_get_data(struct fxos8700_data *data, int chan_type, int axis, int *val) { u8 base, reg; +s16 tmp;int ret;/*
@@ -421,8 +422,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 ; }
Signature · 1 line
2.39.1