| From bf5595b3c273b1ccf26d6c228a9de51cd95ef0be Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 1 May 2021 18:01:08 +0100 |
| Subject: iio: accel: stk8312: Fix buffer alignment in |
| iio_push_to_buffers_with_timestamp() |
| |
| From: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| |
| [ Upstream commit f40a71ffec808e7e51848f63f0c0d3c32d65081b ] |
| |
| 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: 95c12bba51c3 ("iio: accel: Add buffer mode for Sensortek STK8312") |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> |
| Link: https://lore.kernel.org/r/20210501170121.512209-7-jic23@kernel.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iio/accel/stk8312.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c |
| index 3b59887a8581..7d24801e8aa7 100644 |
| --- a/drivers/iio/accel/stk8312.c |
| +++ b/drivers/iio/accel/stk8312.c |
| @@ -103,7 +103,11 @@ struct stk8312_data { |
| u8 mode; |
| struct iio_trigger *dready_trig; |
| bool dready_trigger_on; |
| - s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 64-bit timestamp */ |
| + /* Ensure timestamp is naturally aligned */ |
| + struct { |
| + s8 chans[3]; |
| + s64 timestamp __aligned(8); |
| + } scan; |
| }; |
| |
| static IIO_CONST_ATTR(in_accel_scale_available, STK8312_SCALE_AVAIL); |
| @@ -438,7 +442,7 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p) |
| ret = i2c_smbus_read_i2c_block_data(data->client, |
| STK8312_REG_XOUT, |
| STK8312_ALL_CHANNEL_SIZE, |
| - data->buffer); |
| + data->scan.chans); |
| if (ret < STK8312_ALL_CHANNEL_SIZE) { |
| dev_err(&data->client->dev, "register read failed\n"); |
| mutex_unlock(&data->lock); |
| @@ -452,12 +456,12 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p) |
| mutex_unlock(&data->lock); |
| goto err; |
| } |
| - data->buffer[i++] = ret; |
| + data->scan.chans[i++] = ret; |
| } |
| } |
| mutex_unlock(&data->lock); |
| |
| - iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, |
| + iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, |
| pf->timestamp); |
| err: |
| iio_trigger_notify_done(indio_dev->trig); |
| -- |
| 2.30.2 |
| |