| From 6c3b615379d7cd90d2f70b3cf9860c5a4910546a Mon Sep 17 00:00:00 2001 |
| From: Ye Xiang <xiang.ye@intel.com> |
| Date: Sat, 30 Jan 2021 18:25:46 +0800 |
| Subject: iio: hid-sensor-rotation: Fix quaternion data not correct |
| |
| From: Ye Xiang <xiang.ye@intel.com> |
| |
| commit 6c3b615379d7cd90d2f70b3cf9860c5a4910546a upstream. |
| |
| Because the data of HID_USAGE_SENSOR_ORIENT_QUATERNION defined by ISH FW |
| is s16, but quaternion data type is in_rot_quaternion_type(le:s16/32X4>>0), |
| need to transform data type from s16 to s32 |
| |
| May require manual backporting. |
| |
| Fixes: fc18dddc0625 ("iio: hid-sensors: Added device rotation support") |
| Signed-off-by: Ye Xiang <xiang.ye@intel.com> |
| Link: https://lore.kernel.org/r/20210130102546.31397-1-xiang.ye@intel.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/orientation/hid-sensor-rotation.c | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/iio/orientation/hid-sensor-rotation.c |
| +++ b/drivers/iio/orientation/hid-sensor-rotation.c |
| @@ -21,7 +21,7 @@ struct dev_rot_state { |
| struct hid_sensor_common common_attributes; |
| struct hid_sensor_hub_attribute_info quaternion; |
| struct { |
| - u32 sampled_vals[4] __aligned(16); |
| + s32 sampled_vals[4] __aligned(16); |
| u64 timestamp __aligned(8); |
| } scan; |
| int scale_pre_decml; |
| @@ -170,8 +170,15 @@ static int dev_rot_capture_sample(struct |
| struct dev_rot_state *rot_state = iio_priv(indio_dev); |
| |
| if (usage_id == HID_USAGE_SENSOR_ORIENT_QUATERNION) { |
| - memcpy(&rot_state->scan.sampled_vals, raw_data, |
| - sizeof(rot_state->scan.sampled_vals)); |
| + if (raw_len / 4 == sizeof(s16)) { |
| + rot_state->scan.sampled_vals[0] = ((s16 *)raw_data)[0]; |
| + rot_state->scan.sampled_vals[1] = ((s16 *)raw_data)[1]; |
| + rot_state->scan.sampled_vals[2] = ((s16 *)raw_data)[2]; |
| + rot_state->scan.sampled_vals[3] = ((s16 *)raw_data)[3]; |
| + } else { |
| + memcpy(&rot_state->scan.sampled_vals, raw_data, |
| + sizeof(rot_state->scan.sampled_vals)); |
| + } |
| |
| dev_dbg(&indio_dev->dev, "Recd Quat len:%zu::%zu\n", raw_len, |
| sizeof(rot_state->scan.sampled_vals)); |