Commit 479e67ac authored by Vasileios Amoiridis's avatar Vasileios Amoiridis Committed by Jonathan Cameron

iio: pressure: bmp280: Add SCALE, RAW values in channels and refactorize them

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: default avatarVasileios Amoiridis <vassilisamir@gmail.com>
Link: https://lore.kernel.org/r/20240512230524.53990-5-vassilisamir@gmail.com
Link: https://patch.msgid.link/20240628171726.124852-3-vassilisamir@gmail.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 74353ceb
...@@ -137,17 +137,45 @@ enum { ...@@ -137,17 +137,45 @@ enum {
static const struct iio_chan_spec bmp280_channels[] = { static const struct iio_chan_spec bmp280_channels[] = {
{ {
.type = IIO_PRESSURE, .type = IIO_PRESSURE,
/* PROCESSED maintained for ABI backwards compatibility */
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
BIT(IIO_CHAN_INFO_RAW) |
BIT(IIO_CHAN_INFO_SCALE) |
BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
}, },
{ {
.type = IIO_TEMP, .type = IIO_TEMP,
/* PROCESSED maintained for ABI backwards compatibility */
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | .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), BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
}, },
{ {
.type = IIO_HUMIDITYRELATIVE, .type = IIO_HUMIDITYRELATIVE,
/* PROCESSED maintained for ABI backwards compatibility */
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
BIT(IIO_CHAN_INFO_RAW) |
BIT(IIO_CHAN_INFO_SCALE) |
BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
}, },
}; };
...@@ -155,21 +183,20 @@ static const struct iio_chan_spec bmp280_channels[] = { ...@@ -155,21 +183,20 @@ static const struct iio_chan_spec bmp280_channels[] = {
static const struct iio_chan_spec bmp380_channels[] = { static const struct iio_chan_spec bmp380_channels[] = {
{ {
.type = IIO_PRESSURE, .type = IIO_PRESSURE,
/* PROCESSED maintained for ABI backwards compatibility */
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
BIT(IIO_CHAN_INFO_RAW) |
BIT(IIO_CHAN_INFO_SCALE) |
BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) |
BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),
}, },
{ {
.type = IIO_TEMP, .type = IIO_TEMP,
/* PROCESSED maintained for ABI backwards compatibility */
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), BIT(IIO_CHAN_INFO_RAW) |
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | BIT(IIO_CHAN_INFO_SCALE) |
BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),
},
{
.type = IIO_HUMIDITYRELATIVE,
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) |
BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),
...@@ -537,6 +564,49 @@ static int bmp280_read_raw_impl(struct iio_dev *indio_dev, ...@@ -537,6 +564,49 @@ static int bmp280_read_raw_impl(struct iio_dev *indio_dev,
default: default:
return -EINVAL; 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: case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
switch (chan->type) { switch (chan->type) {
case IIO_HUMIDITYRELATIVE: case IIO_HUMIDITYRELATIVE:
...@@ -843,7 +913,7 @@ const struct bmp280_chip_info bmp280_chip_info = { ...@@ -843,7 +913,7 @@ const struct bmp280_chip_info bmp280_chip_info = {
.regmap_config = &bmp280_regmap_config, .regmap_config = &bmp280_regmap_config,
.start_up_time = 2000, .start_up_time = 2000,
.channels = bmp280_channels, .channels = bmp280_channels,
.num_channels = 2, .num_channels = ARRAY_SIZE(bmp280_channels),
.oversampling_temp_avail = bmp280_oversampling_avail, .oversampling_temp_avail = bmp280_oversampling_avail,
.num_oversampling_temp_avail = ARRAY_SIZE(bmp280_oversampling_avail), .num_oversampling_temp_avail = ARRAY_SIZE(bmp280_oversampling_avail),
...@@ -903,8 +973,8 @@ const struct bmp280_chip_info bme280_chip_info = { ...@@ -903,8 +973,8 @@ const struct bmp280_chip_info bme280_chip_info = {
.num_chip_id = ARRAY_SIZE(bme280_chip_ids), .num_chip_id = ARRAY_SIZE(bme280_chip_ids),
.regmap_config = &bmp280_regmap_config, .regmap_config = &bmp280_regmap_config,
.start_up_time = 2000, .start_up_time = 2000,
.channels = bmp280_channels, .channels = bme280_channels,
.num_channels = 3, .num_channels = ARRAY_SIZE(bme280_channels),
.oversampling_temp_avail = bmp280_oversampling_avail, .oversampling_temp_avail = bmp280_oversampling_avail,
.num_oversampling_temp_avail = ARRAY_SIZE(bmp280_oversampling_avail), .num_oversampling_temp_avail = ARRAY_SIZE(bmp280_oversampling_avail),
...@@ -1328,7 +1398,7 @@ const struct bmp280_chip_info bmp380_chip_info = { ...@@ -1328,7 +1398,7 @@ const struct bmp280_chip_info bmp380_chip_info = {
.spi_read_extra_byte = true, .spi_read_extra_byte = true,
.start_up_time = 2000, .start_up_time = 2000,
.channels = bmp380_channels, .channels = bmp380_channels,
.num_channels = 2, .num_channels = ARRAY_SIZE(bmp380_channels),
.oversampling_temp_avail = bmp380_oversampling_avail, .oversampling_temp_avail = bmp380_oversampling_avail,
.num_oversampling_temp_avail = ARRAY_SIZE(bmp380_oversampling_avail), .num_oversampling_temp_avail = ARRAY_SIZE(bmp380_oversampling_avail),
...@@ -1859,7 +1929,7 @@ const struct bmp280_chip_info bmp580_chip_info = { ...@@ -1859,7 +1929,7 @@ const struct bmp280_chip_info bmp580_chip_info = {
.regmap_config = &bmp580_regmap_config, .regmap_config = &bmp580_regmap_config,
.start_up_time = 2000, .start_up_time = 2000,
.channels = bmp380_channels, .channels = bmp380_channels,
.num_channels = 2, .num_channels = ARRAY_SIZE(bmp380_channels),
.oversampling_temp_avail = bmp580_oversampling_avail, .oversampling_temp_avail = bmp580_oversampling_avail,
.num_oversampling_temp_avail = ARRAY_SIZE(bmp580_oversampling_avail), .num_oversampling_temp_avail = ARRAY_SIZE(bmp580_oversampling_avail),
...@@ -2148,7 +2218,7 @@ const struct bmp280_chip_info bmp180_chip_info = { ...@@ -2148,7 +2218,7 @@ const struct bmp280_chip_info bmp180_chip_info = {
.regmap_config = &bmp180_regmap_config, .regmap_config = &bmp180_regmap_config,
.start_up_time = 2000, .start_up_time = 2000,
.channels = bmp280_channels, .channels = bmp280_channels,
.num_channels = 2, .num_channels = ARRAY_SIZE(bmp280_channels),
.oversampling_temp_avail = bmp180_oversampling_temp_avail, .oversampling_temp_avail = bmp180_oversampling_temp_avail,
.num_oversampling_temp_avail = .num_oversampling_temp_avail =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment