mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
iio:pressure:mpl3115: Force alignment of buffer
Whilst this is another case of the issue Lars reported with an array of elements of smaller than 8 bytes being passed to iio_push_to_buffers_with_timestamp(), the solution here is a bit different from the other cases and relies on __aligned working on the stack (true since 4.6?) This one is unusual. We have to do an explicit memset() each time as we are reading 3 bytes into a potential 4 byte channel which may sometimes be a 2 byte channel depending on what is enabled. As such, moving the buffer to the heap in the iio_priv structure doesn't save us much. We can't use a nice explicit structure on the stack either as the data channels have different storage sizes and are all separately controlled. Fixes: cc26ad455f57 ("iio: Add Freescale MPL3115A2 pressure / temperature sensor driver") Reported-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Reviewed-by: Alexandru Ardelean <alexandru.ardelean@analog.com> Cc: Peter Meerwald <pmeerw@pmeerw.net> Cc: <Stable@vger.kernel.org> Link: https://lore.kernel.org/r/20200920112742.170751-7-jic23@kernel.org
This commit is contained in:
parent
7b6b51234d
commit
198cf32f05
@ -144,7 +144,14 @@ static irqreturn_t mpl3115_trigger_handler(int irq, void *p)
|
||||
struct iio_poll_func *pf = p;
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct mpl3115_data *data = iio_priv(indio_dev);
|
||||
u8 buffer[16]; /* 32-bit channel + 16-bit channel + padding + ts */
|
||||
/*
|
||||
* 32-bit channel + 16-bit channel + padding + ts
|
||||
* Note that it is possible for only one of the first 2
|
||||
* channels to be enabled. If that happens, the first element
|
||||
* of the buffer may be either 16 or 32-bits. As such we cannot
|
||||
* use a simple structure definition to express this data layout.
|
||||
*/
|
||||
u8 buffer[16] __aligned(8);
|
||||
int ret, pos = 0;
|
||||
|
||||
mutex_lock(&data->lock);
|
||||
|
Loading…
x
Reference in New Issue
Block a user