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 > --- > 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,