On Sun, 2019-10-13 at 10:47 +0100, jic23@xxxxxxxxxx wrote: > From: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > > Highlighted by sparse: > CHECK drivers/iio/adc/ti-adc084s021.c > drivers/iio/adc/ti-adc084s021.c:79:26: warning: incorrect type in > assignment (different base types) > drivers/iio/adc/ti-adc084s021.c:79:26: expected unsigned short > [unsigned] [short] [usertype] <noident> > drivers/iio/adc/ti-adc084s021.c:79:26: got restricted __be16 <noident> > drivers/iio/adc/ti-adc084s021.c:110:24: warning: cast to restricted > __be16 > drivers/iio/adc/ti-adc084s021.c:110:24: warning: cast to restricted > __be16 > drivers/iio/adc/ti-adc084s021.c:110:24: warning: cast to restricted > __be16 > drivers/iio/adc/ti-adc084s021.c:110:24: warning: cast to restricted > __be16 > This one looks a bit tricky. And looks like it could use a bit more cleanup than this. Otherwise sparse may come along and complain about more stuff. One thing that would be good, would be to change: int adc084s021_adc_conversion(struct adc084s021 *adc, void *data) to int adc084s021_adc_conversion(struct adc084s021 *adc, __be16 *data, int buf_size) [1] > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > Cc: Mårten Lindahl <martenli@xxxxxxxx> > --- > drivers/iio/adc/ti-adc084s021.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/adc/ti-adc084s021.c b/drivers/iio/adc/ti- > adc084s021.c > index bdedf456ee05..42966f2eb3d8 100644 > --- a/drivers/iio/adc/ti-adc084s021.c > +++ b/drivers/iio/adc/ti-adc084s021.c > @@ -68,7 +68,7 @@ static int adc084s021_adc_conversion(struct adc084s021 > *adc, void *data) > { > int n_words = (adc->spi_trans.len >> 1) - 1; /* Discard first word > */ > int ret, i = 0; > - u16 *p = data; > + __be16 *p = data; > > /* Do the transfer */ > ret = spi_sync(adc->spi, &adc->message); > @@ -87,6 +87,7 @@ static int adc084s021_read_raw(struct iio_dev > *indio_dev, > { > struct adc084s021 *adc = iio_priv(indio_dev); > int ret; > + __be16 value; > > switch (mask) { > case IIO_CHAN_INFO_RAW: > @@ -101,13 +102,13 @@ static int adc084s021_read_raw(struct iio_dev > *indio_dev, > } > > adc->tx_buf[0] = channel->channel << 3; > - ret = adc084s021_adc_conversion(adc, val); > + ret = adc084s021_adc_conversion(adc, &value); Following [1], this could be called with "adc084s021_adc_conversion(adc, &value, 1)" to make sure it's not doing any stack corruption. I can't tell if this is doing any or not; the code is a bit fuzzy to me. The neat part is that memcpy() could be used to then access the data on rx_buf. > iio_device_release_direct_mode(indio_dev); > regulator_disable(adc->reg); > if (ret < 0) > return ret; > > - *val = be16_to_cpu(*val); > + *val = be16_to_cpu(value); > *val = (*val >> channel->scan_type.shift) & 0xff; > > return IIO_VAL_INT;