iio: pressure: bmp280: drop sensor_data array

Drop the sensor_data array from struct bmp280_data and replace it using
local structs in each interrupt handler.

The sensor_data array in struct bmp280_data is not used to share data
between functions and isn't used for DMA, so there isn't really a need
to have it in the struct. Instead, we can use the struct pattern for
scan data in each interrupt handler. This has the advantage of allowing
us to see the actual layout of each scan buffer for each different type
of supported sensor. It also avoid juggling values between local
variables and the array which makes the code a bit simpler by avoiding
some extra assignments.

We can also drop the BME280_NUM_MAX_CHANNELS macro as it is no longer
used.

Suggested-by: Jonathan Cameron <jic23@kernel.org>
Link: https://lore.kernel.org/linux-iio/20250421135540.1a667221@jic23-huawei/
Signed-off-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Link: https://patch.msgid.link/20250422-iio-pressure-bmp280-rework-push-to-buffers-v1-1-ee722f29aeca@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
David Lechner 2025-04-22 14:28:36 -05:00 committed by Jonathan Cameron
parent 162129a27c
commit 872c8014e0
2 changed files with 52 additions and 58 deletions

View File

@ -46,6 +46,7 @@
#include <linux/random.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/types.h>
#include <linux/iio/buffer.h>
#include <linux/iio/iio.h>
@ -1105,9 +1106,13 @@ static irqreturn_t bmp280_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmp280_data *data = iio_priv(indio_dev);
u32 adc_temp, adc_press, comp_press;
s32 t_fine, comp_temp;
s32 *chans = (s32 *)data->sensor_data;
u32 adc_temp, adc_press;
s32 t_fine;
struct {
u32 comp_press;
s32 comp_temp;
aligned_s64 timestamp;
} buffer;
int ret;
guard(mutex)(&data->lock);
@ -1127,7 +1132,7 @@ static irqreturn_t bmp280_trigger_handler(int irq, void *p)
goto out;
}
comp_temp = bmp280_compensate_temp(data, adc_temp);
buffer.comp_temp = bmp280_compensate_temp(data, adc_temp);
/* Pressure calculations */
adc_press = FIELD_GET(BMP280_MEAS_TRIM_MASK, get_unaligned_be24(&data->buf[0]));
@ -1137,13 +1142,9 @@ static irqreturn_t bmp280_trigger_handler(int irq, void *p)
}
t_fine = bmp280_calc_t_fine(data, adc_temp);
comp_press = bmp280_compensate_press(data, adc_press, t_fine);
buffer.comp_press = bmp280_compensate_press(data, adc_press, t_fine);
chans[0] = comp_press;
chans[1] = comp_temp;
iio_push_to_buffers_with_ts(indio_dev, data->sensor_data,
sizeof(data->sensor_data),
iio_push_to_buffers_with_ts(indio_dev, &buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
out:
@ -1226,9 +1227,14 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmp280_data *data = iio_priv(indio_dev);
u32 adc_temp, adc_press, adc_humidity, comp_press, comp_humidity;
s32 t_fine, comp_temp;
s32 *chans = (s32 *)data->sensor_data;
u32 adc_temp, adc_press, adc_humidity;
s32 t_fine;
struct {
u32 comp_press;
s32 comp_temp;
u32 comp_humidity;
aligned_s64 timestamp;
} buffer;
int ret;
guard(mutex)(&data->lock);
@ -1248,7 +1254,7 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
goto out;
}
comp_temp = bmp280_compensate_temp(data, adc_temp);
buffer.comp_temp = bmp280_compensate_temp(data, adc_temp);
/* Pressure calculations */
adc_press = FIELD_GET(BMP280_MEAS_TRIM_MASK, get_unaligned_be24(&data->buf[0]));
@ -1258,7 +1264,7 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
}
t_fine = bmp280_calc_t_fine(data, adc_temp);
comp_press = bmp280_compensate_press(data, adc_press, t_fine);
buffer.comp_press = bmp280_compensate_press(data, adc_press, t_fine);
/* Humidity calculations */
adc_humidity = get_unaligned_be16(&data->buf[6]);
@ -1268,14 +1274,10 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
goto out;
}
comp_humidity = bme280_compensate_humidity(data, adc_humidity, t_fine);
buffer.comp_humidity = bme280_compensate_humidity(data, adc_humidity,
t_fine);
chans[0] = comp_press;
chans[1] = comp_temp;
chans[2] = comp_humidity;
iio_push_to_buffers_with_ts(indio_dev, data->sensor_data,
sizeof(data->sensor_data),
iio_push_to_buffers_with_ts(indio_dev, &buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
out:
@ -1901,9 +1903,13 @@ static irqreturn_t bmp380_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmp280_data *data = iio_priv(indio_dev);
u32 adc_temp, adc_press, comp_press;
s32 t_fine, comp_temp;
s32 *chans = (s32 *)data->sensor_data;
u32 adc_temp, adc_press;
s32 t_fine;
struct {
u32 comp_press;
s32 comp_temp;
aligned_s64 timestamp;
} buffer;
int ret;
guard(mutex)(&data->lock);
@ -1923,7 +1929,7 @@ static irqreturn_t bmp380_trigger_handler(int irq, void *p)
goto out;
}
comp_temp = bmp380_compensate_temp(data, adc_temp);
buffer.comp_temp = bmp380_compensate_temp(data, adc_temp);
/* Pressure calculations */
adc_press = get_unaligned_le24(&data->buf[0]);
@ -1933,13 +1939,9 @@ static irqreturn_t bmp380_trigger_handler(int irq, void *p)
}
t_fine = bmp380_calc_t_fine(data, adc_temp);
comp_press = bmp380_compensate_press(data, adc_press, t_fine);
buffer.comp_press = bmp380_compensate_press(data, adc_press, t_fine);
chans[0] = comp_press;
chans[1] = comp_temp;
iio_push_to_buffers_with_ts(indio_dev, data->sensor_data,
sizeof(data->sensor_data),
iio_push_to_buffers_with_ts(indio_dev, &buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
out:
@ -2611,7 +2613,12 @@ static irqreturn_t bmp580_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmp280_data *data = iio_priv(indio_dev);
int ret, offset;
struct {
__le32 comp_temp;
__le32 comp_press;
aligned_s64 timestamp;
} buffer;
int ret;
guard(mutex)(&data->lock);
@ -2623,18 +2630,13 @@ static irqreturn_t bmp580_trigger_handler(int irq, void *p)
goto out;
}
offset = 0;
/* Pressure calculations */
memcpy(&data->sensor_data[offset], &data->buf[3], 3);
offset += sizeof(s32);
memcpy(&buffer.comp_press, &data->buf[3], 3);
/* Temperature calculations */
memcpy(&data->sensor_data[offset], &data->buf[0], 3);
memcpy(&buffer.comp_temp, &data->buf[0], 3);
iio_push_to_buffers_with_ts(indio_dev, data->sensor_data,
sizeof(data->sensor_data),
iio_push_to_buffers_with_ts(indio_dev, &buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
out:
@ -2956,25 +2958,25 @@ static irqreturn_t bmp180_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmp280_data *data = iio_priv(indio_dev);
int ret, comp_temp, comp_press;
s32 *chans = (s32 *)data->sensor_data;
struct {
u32 comp_press;
s32 comp_temp;
aligned_s64 timestamp;
} buffer;
int ret;
guard(mutex)(&data->lock);
ret = bmp180_read_temp(data, &comp_temp);
ret = bmp180_read_temp(data, &buffer.comp_temp);
if (ret)
goto out;
ret = bmp180_read_press(data, &comp_press);
ret = bmp180_read_press(data, &buffer.comp_press);
if (ret)
goto out;
chans[0] = comp_press;
chans[1] = comp_temp;
iio_push_to_buffers_with_ts(indio_dev, data->sensor_data,
sizeof(data->sensor_data),
iio_push_to_buffers_with_ts(indio_dev, &buffer, sizeof(buffer),
iio_get_time_ns(indio_dev));
out:

View File

@ -349,7 +349,6 @@
BMP280_NUM_TEMP_BYTES + \
BME280_NUM_HUMIDITY_BYTES)
#define BME280_NUM_MAX_CHANNELS 3
/* Core exported structs */
static const char *const bmp280_supply_names[] = {
@ -452,13 +451,6 @@ struct bmp280_data {
*/
int sampling_freq;
/*
* Data to push to userspace triggered buffer. Up to 3 channels and
* s64 timestamp, aligned.
*/
u8 sensor_data[ALIGN(sizeof(s32) * BME280_NUM_MAX_CHANNELS, sizeof(s64))
+ sizeof(s64)] __aligned(sizeof(s64));
/* Value to hold the current operation mode of the device */
enum bmp280_op_mode op_mode;