mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
iio: gyro: mpu3050: fix sign of raw angular velocity readings
The MPU-3050 gyroscope output registers hold 16-bit two's complement
values; the angular velocity channels are declared with .sign = 's'.
When mpu3050_read_raw() handles IIO_CHAN_INFO_RAW it reads the register
via a big-endian regmap_bulk_read() and assigns it with:
*val = be16_to_cpu(raw_val);
be16_to_cpu() yields an unsigned 16-bit quantity, so negative rates
(bit 15 set) are reported to userspace as large positive integers
(e.g. -1 becomes 65535) instead of the correct negative value.
Cast to s16 before the assignment, matching the temperature channel a
few lines above which already handles the sign correctly.
Fixes: 3904b28efb ("iio: gyro: Add driver for the MPU-3050 gyroscope")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4
Signed-off-by: Cong Nguyen <congnt264@gmail.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
This commit is contained in:
parent
a40b2e7a17
commit
06fab97602
|
|
@ -356,7 +356,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
|
|||
goto out_read_raw_unlock;
|
||||
}
|
||||
|
||||
*val = be16_to_cpu(raw_val);
|
||||
*val = (s16)be16_to_cpu(raw_val);
|
||||
ret = IIO_VAL_INT;
|
||||
|
||||
goto out_read_raw_unlock;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user