On Sun, May 12, 2024 at 01:29:14PM +0100, Jonathan Cameron wrote: > On Wed, 8 May 2024 18:52:06 +0200 > Vasileios Amoiridis <vassilisamir@xxxxxxxxx> wrote: > > > Add extra IIO_CHAN_INFO_SCALE and IIO_CHAN_INFO_RAW channels in order > > to be able to calculate the processed value with standard userspace > > IIO tools. Can be used for triggered buffers as well. > > > > Even though it is not a good design choice to have SCALE, RAW and > > PROCESSED together, the PROCESSED channel is kept for ABI compatibility. > > > > While at it, separate BMPxxx and BMExxx device channels since BME > > supports also humidity measurements. > > > > Signed-off-by: Vasileios Amoiridis <vassilisamir@xxxxxxxxx> > num channels is now ARRAY_SIZE(xxx) for all of these rather than > the previous trick of using the same array and different numbers of channels. > > As such I think you can just replace the 2, 3 with ARRAY_SIZE(bmp280_channels) > and ARRAY_SIZE(bme280_channels) which will give more obviously correct > and maintainable code. > > Jonathan > Hi Jonathan! Indeed, this is a very good addition!!! Cheers, Vasilis > > > --- > > drivers/iio/pressure/bmp280-core.c | 86 +++++++++++++++++++++++++++--- > > 1 file changed, 78 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c > > index 70ce37370ac6..3f8144a0355b 100644 > > --- a/drivers/iio/pressure/bmp280-core.c > > +++ b/drivers/iio/pressure/bmp280-core.c > > @@ -137,17 +137,45 @@ enum { > > static const struct iio_chan_spec bmp280_channels[] = { > > { > > .type = IIO_PRESSURE, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > }, > > { > > .type = IIO_TEMP, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > + }, > > +}; > > + > > +static const struct iio_chan_spec bme280_channels[] = { > > + { > > + .type = IIO_PRESSURE, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > + }, > > + { > > + .type = IIO_TEMP, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > }, > > { > > .type = IIO_HUMIDITYRELATIVE, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > }, > > }; > > @@ -155,21 +183,20 @@ static const struct iio_chan_spec bmp280_channels[] = { > > static const struct iio_chan_spec bmp380_channels[] = { > > { > > .type = IIO_PRESSURE, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | > > BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), > > }, > > { > > .type = IIO_TEMP, > > + /* PROCESSED maintained for ABI backwards compatibility */ > > .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > - BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > - .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | > > - BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), > > - }, > > - { > > - .type = IIO_HUMIDITYRELATIVE, > > - .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | > > + BIT(IIO_CHAN_INFO_RAW) | > > + BIT(IIO_CHAN_INFO_SCALE) | > > BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), > > .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | > > BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), > > @@ -537,6 +564,49 @@ static int bmp280_read_raw_impl(struct iio_dev *indio_dev, > > default: > > return -EINVAL; > > } > > + case IIO_CHAN_INFO_RAW: > > + switch (chan->type) { > > + case IIO_HUMIDITYRELATIVE: > > + ret = data->chip_info->read_humid(data, &chan_value); > > + if (ret) > > + return ret; > > + > > + *val = chan_value; > > + return IIO_VAL_INT; > > + case IIO_PRESSURE: > > + ret = data->chip_info->read_press(data, &chan_value); > > + if (ret) > > + return ret; > > + > > + *val = chan_value; > > + return IIO_VAL_INT; > > + case IIO_TEMP: > > + ret = data->chip_info->read_temp(data, &chan_value); > > + if (ret) > > + return ret; > > + > > + *val = chan_value; > > + return IIO_VAL_INT; > > + default: > > + return -EINVAL; > > + } > > + case IIO_CHAN_INFO_SCALE: > > + switch (chan->type) { > > + case IIO_HUMIDITYRELATIVE: > > + *val = data->chip_info->humid_coeffs[0]; > > + *val2 = data->chip_info->humid_coeffs[1]; > > + return data->chip_info->humid_coeffs_type; > > + case IIO_PRESSURE: > > + *val = data->chip_info->press_coeffs[0]; > > + *val2 = data->chip_info->press_coeffs[1]; > > + return data->chip_info->press_coeffs_type; > > + case IIO_TEMP: > > + *val = data->chip_info->temp_coeffs[0]; > > + *val2 = data->chip_info->temp_coeffs[1]; > > + return data->chip_info->temp_coeffs_type; > > + default: > > + return -EINVAL; > > + } > > case IIO_CHAN_INFO_OVERSAMPLING_RATIO: > > switch (chan->type) { > > case IIO_HUMIDITYRELATIVE: > > @@ -903,7 +973,7 @@ const struct bmp280_chip_info bme280_chip_info = { > > .num_chip_id = ARRAY_SIZE(bme280_chip_ids), > > .regmap_config = &bmp280_regmap_config, > > .start_up_time = 2000, > > - .channels = bmp280_channels, > > + .channels = bme280_channels, > > .num_channels = 3, > > > > .oversampling_temp_avail = bmp280_oversampling_avail, >