On Sun, 7 Jun 2020 19:58:09 +0200 Tomasz Duszynski <tomasz.duszynski@xxxxxxxxxxx> wrote: > Add Sensirion SCD30 carbon dioxide core driver. > > Signed-off-by: Tomasz Duszynski <tomasz.duszynski@xxxxxxxxxxx> A few things I'd missed showed up in warnings when I applied this and ran a sparse check. Please fix up and send a v6. Also sanity check the rest with sparse. Note if I'd missed this 0-day would have sent use these warnings. Thanks, Jonathan > + > +static int scd30_read_meas(struct scd30_state *state) > +{ > + int i, ret; > + > + ret = state->command(state, CMD_READ_MEAS, 0, state->meas, sizeof(state->meas)); > + if (ret) > + return ret; > + > + be32_to_cpu_array(state->meas, state->meas, ARRAY_SIZE(state->meas)); The type of the input to the above has the wrong endian markings. CHECK drivers/iio/chemical/scd30_core.c drivers/iio/chemical/scd30_core.c:123:40: warning: incorrect type in argument 2 (different base types) drivers/iio/chemical/scd30_core.c:123:40: expected restricted __be32 const [usertype] *src drivers/iio/chemical/scd30_core.c:123:40: got int * Whilst you could use a cast, it would be tidier to use an array of __be32. > + > + for (i = 0; i < ARRAY_SIZE(state->meas); i++) > + state->meas[i] = scd30_float_to_fp(state->meas[i]); > + > + /* > + * co2 is left unprocessed while temperature and humidity are scaled > + * to milli deg C and milli percent respectively. > + */ > + state->meas[SCD30_TEMP] *= 10; > + state->meas[SCD30_HR] *= 10; > + > + return 0; > +} > + ... > + > +static irqreturn_t scd30_trigger_handler(int irq, void *p) > +{ > + struct iio_poll_func *pf = p; > + struct iio_dev *indio_dev = pf->indio_dev; > + struct scd30_state *state = iio_priv(indio_dev); > + struct { > + int data[SCD30_MEAS_COUNT]; > + s64 ts __aligned(8); > + } scan = { 0, }; should be scan = { {0, }, }; or something like that as first element happens to be an array. Actually there is padding in here you need to zero I think. So memset is a better bet. > + int ret; > + > + mutex_lock(&state->lock); > + if (!iio_trigger_using_own(indio_dev)) > + ret = scd30_read_poll(state); > + else > + ret = scd30_read_meas(state); > + memcpy(scan.data, state->meas, sizeof(state->meas)); > + mutex_unlock(&state->lock); > + if (ret) > + goto out; > + > + iio_push_to_buffers_with_timestamp(indio_dev, &scan, iio_get_time_ns(indio_dev)); > +out: > + iio_trigger_notify_done(indio_dev->trig); > + return IRQ_HANDLED; > +} > + ...