| From 71d2e6bdab1f84ea2151f88d2f09e8827d21709c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 1 May 2021 18:01:06 +0100 |
| Subject: iio: accel: kxcjk-1013: Fix buffer alignment in |
| iio_push_to_buffers_with_timestamp() |
| |
| From: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| |
| [ Upstream commit 3ab3aa2e7bd57497f9a7c6275c00dce237d2c9ba ] |
| |
| To make code more readable, use a structure to express the channel |
| layout and ensure the timestamp is 8 byte aligned. |
| |
| Found during an audit of all calls of this function. |
| |
| Fixes: 1a4fbf6a9286 ("iio: accel: kxcjk1013 3-axis accelerometer driver") |
| 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-5-jic23@kernel.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/accel/kxcjk-1013.c | 24 ++++++++++++++---------- |
| 1 file changed, 14 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c |
| index 560a3373ff20..c99e90469a24 100644 |
| --- a/drivers/iio/accel/kxcjk-1013.c |
| +++ b/drivers/iio/accel/kxcjk-1013.c |
| @@ -132,13 +132,24 @@ enum kx_acpi_type { |
| ACPI_KIOX010A, |
| }; |
| |
| +enum kxcjk1013_axis { |
| + AXIS_X, |
| + AXIS_Y, |
| + AXIS_Z, |
| + AXIS_MAX |
| +}; |
| + |
| struct kxcjk1013_data { |
| struct i2c_client *client; |
| struct iio_trigger *dready_trig; |
| struct iio_trigger *motion_trig; |
| struct iio_mount_matrix orientation; |
| struct mutex mutex; |
| - s16 buffer[8]; |
| + /* Ensure timestamp naturally aligned */ |
| + struct { |
| + s16 chans[AXIS_MAX]; |
| + s64 timestamp __aligned(8); |
| + } scan; |
| u8 odr_bits; |
| u8 range; |
| int wake_thres; |
| @@ -152,13 +163,6 @@ struct kxcjk1013_data { |
| enum kx_acpi_type acpi_type; |
| }; |
| |
| -enum kxcjk1013_axis { |
| - AXIS_X, |
| - AXIS_Y, |
| - AXIS_Z, |
| - AXIS_MAX, |
| -}; |
| - |
| enum kxcjk1013_mode { |
| STANDBY, |
| OPERATION, |
| @@ -1092,12 +1096,12 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p) |
| ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client, |
| KXCJK1013_REG_XOUT_L, |
| AXIS_MAX * 2, |
| - (u8 *)data->buffer); |
| + (u8 *)data->scan.chans); |
| mutex_unlock(&data->mutex); |
| if (ret < 0) |
| goto err; |
| |
| - iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, |
| + iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, |
| data->timestamp); |
| err: |
| iio_trigger_notify_done(indio_dev->trig); |
| -- |
| 2.30.2 |
| |