| From 331eb64cc08887d4cad15967916fdf821b8cfe79 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 1 May 2021 18:01:05 +0100 |
| Subject: iio: accel: hid: Fix buffer alignment in |
| iio_push_to_buffers_with_timestamp() |
| |
| From: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| |
| [ Upstream commit c6559bf796ccdb3a0c79db846af96c8f7046880b ] |
| |
| To make code more readable, use a structure to express the channel |
| layout and ensure the timestamp is 8 byte aligned. |
| Note this matches what was done in all the other hid sensor drivers. |
| This one was missed previously due to an extra level of indirection. |
| |
| Found during an audit of all calls of this function. |
| |
| Fixes: a96cd0f901ee ("iio: accel: hid-sensor-accel-3d: Add timestamp") |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> |
| Link: https://lore.kernel.org/r/20210501170121.512209-4-jic23@kernel.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/accel/hid-sensor-accel-3d.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c |
| index 4c5e594024f8..f05840d17fb7 100644 |
| --- a/drivers/iio/accel/hid-sensor-accel-3d.c |
| +++ b/drivers/iio/accel/hid-sensor-accel-3d.c |
| @@ -27,8 +27,11 @@ struct accel_3d_state { |
| struct hid_sensor_hub_callbacks callbacks; |
| struct hid_sensor_common common_attributes; |
| struct hid_sensor_hub_attribute_info accel[ACCEL_3D_CHANNEL_MAX]; |
| - /* Reserve for 3 channels + padding + timestamp */ |
| - u32 accel_val[ACCEL_3D_CHANNEL_MAX + 3]; |
| + /* Ensure timestamp is naturally aligned */ |
| + struct { |
| + u32 accel_val[3]; |
| + s64 timestamp __aligned(8); |
| + } scan; |
| int scale_pre_decml; |
| int scale_post_decml; |
| int scale_precision; |
| @@ -239,8 +242,8 @@ static int accel_3d_proc_event(struct hid_sensor_hub_device *hsdev, |
| accel_state->timestamp = iio_get_time_ns(indio_dev); |
| |
| hid_sensor_push_data(indio_dev, |
| - accel_state->accel_val, |
| - sizeof(accel_state->accel_val), |
| + &accel_state->scan, |
| + sizeof(accel_state->scan), |
| accel_state->timestamp); |
| |
| accel_state->timestamp = 0; |
| @@ -265,7 +268,7 @@ static int accel_3d_capture_sample(struct hid_sensor_hub_device *hsdev, |
| case HID_USAGE_SENSOR_ACCEL_Y_AXIS: |
| case HID_USAGE_SENSOR_ACCEL_Z_AXIS: |
| offset = usage_id - HID_USAGE_SENSOR_ACCEL_X_AXIS; |
| - accel_state->accel_val[CHANNEL_SCAN_INDEX_X + offset] = |
| + accel_state->scan.accel_val[CHANNEL_SCAN_INDEX_X + offset] = |
| *(u32 *)raw_data; |
| ret = 0; |
| break; |
| -- |
| 2.30.2 |
| |