lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 680/717] iio:pressure:mpl3115: Force alignment of buffer
    Date
    From: Jonathan Cameron <Jonathan.Cameron@huawei.com>

    commit 198cf32f0503d2ad60d320b95ef6fb8243db857f upstream.

    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
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/iio/pressure/mpl3115.c | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    --- a/drivers/iio/pressure/mpl3115.c
    +++ b/drivers/iio/pressure/mpl3115.c
    @@ -144,7 +144,14 @@ static irqreturn_t mpl3115_trigger_handl
    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);

    \
     
     \ /
      Last update: 2020-12-28 15:37    [W:2.244 / U:3.344 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site