mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-11 12:44:49 -04:00
iio: pressure: bmp280: Use char instead of s32 for data buffer
As it was reported and discussed here [1], storing the sensor data in an endian aware s32 buffer is not optimal. Advertising the timestamp as an addition of 2 s32 variables which is also implied is again not the best practice. For that reason, change the s32 sensor_data buffer to a u8 buffer and align it properly. [1]: https://lore.kernel.org/linux-iio/73d13cc0-afb9-4306-b498-5d821728c3ba@stanley.mountain/ Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com> Link: https://patch.msgid.link/20240930202353.38203-3-vassilisamir@gmail.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
committed by
Jonathan Cameron
parent
8b13937b5e
commit
1960713218
@@ -1023,8 +1023,9 @@ 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;
|
||||
s32 t_fine;
|
||||
u32 adc_temp, adc_press, comp_press;
|
||||
s32 t_fine, comp_temp;
|
||||
s32 *chans = (s32 *)data->sensor_data;
|
||||
int ret;
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
@@ -1044,7 +1045,7 @@ static irqreturn_t bmp280_trigger_handler(int irq, void *p)
|
||||
goto out;
|
||||
}
|
||||
|
||||
data->sensor_data[1] = bmp280_compensate_temp(data, adc_temp);
|
||||
comp_temp = bmp280_compensate_temp(data, adc_temp);
|
||||
|
||||
/* Pressure calculations */
|
||||
adc_press = FIELD_GET(BMP280_MEAS_TRIM_MASK, get_unaligned_be24(&data->buf[0]));
|
||||
@@ -1054,10 +1055,12 @@ 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);
|
||||
|
||||
data->sensor_data[0] = bmp280_compensate_press(data, adc_press, t_fine);
|
||||
chans[0] = comp_press;
|
||||
chans[1] = comp_temp;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->sensor_data,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, data->sensor_data,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
out:
|
||||
@@ -1138,8 +1141,9 @@ 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;
|
||||
s32 t_fine;
|
||||
u32 adc_temp, adc_press, adc_humidity, comp_press, comp_humidity;
|
||||
s32 t_fine, comp_temp;
|
||||
s32 *chans = (s32 *)data->sensor_data;
|
||||
int ret;
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
@@ -1159,7 +1163,7 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
|
||||
goto out;
|
||||
}
|
||||
|
||||
data->sensor_data[1] = bmp280_compensate_temp(data, adc_temp);
|
||||
comp_temp = bmp280_compensate_temp(data, adc_temp);
|
||||
|
||||
/* Pressure calculations */
|
||||
adc_press = FIELD_GET(BMP280_MEAS_TRIM_MASK, get_unaligned_be24(&data->buf[0]));
|
||||
@@ -1169,8 +1173,7 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
|
||||
}
|
||||
|
||||
t_fine = bmp280_calc_t_fine(data, adc_temp);
|
||||
|
||||
data->sensor_data[0] = bmp280_compensate_press(data, adc_press, t_fine);
|
||||
comp_press = bmp280_compensate_press(data, adc_press, t_fine);
|
||||
|
||||
/* Humidity calculations */
|
||||
adc_humidity = get_unaligned_be16(&data->buf[6]);
|
||||
@@ -1179,9 +1182,14 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
|
||||
dev_err(data->dev, "reading humidity skipped\n");
|
||||
goto out;
|
||||
}
|
||||
data->sensor_data[2] = bme280_compensate_humidity(data, adc_humidity, t_fine);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->sensor_data,
|
||||
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_timestamp(indio_dev, data->sensor_data,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
out:
|
||||
@@ -1618,8 +1626,9 @@ 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;
|
||||
s32 t_fine;
|
||||
u32 adc_temp, adc_press, comp_press;
|
||||
s32 t_fine, comp_temp;
|
||||
s32 *chans = (s32 *)data->sensor_data;
|
||||
int ret;
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
@@ -1639,7 +1648,7 @@ static irqreturn_t bmp380_trigger_handler(int irq, void *p)
|
||||
goto out;
|
||||
}
|
||||
|
||||
data->sensor_data[1] = bmp380_compensate_temp(data, adc_temp);
|
||||
comp_temp = bmp380_compensate_temp(data, adc_temp);
|
||||
|
||||
/* Pressure calculations */
|
||||
adc_press = get_unaligned_le24(&data->buf[0]);
|
||||
@@ -1649,10 +1658,12 @@ 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);
|
||||
|
||||
data->sensor_data[0] = bmp380_compensate_press(data, adc_press, t_fine);
|
||||
chans[0] = comp_press;
|
||||
chans[1] = comp_temp;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->sensor_data,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, data->sensor_data,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
out:
|
||||
@@ -2199,7 +2210,7 @@ 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;
|
||||
int ret, offset;
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
|
||||
@@ -2211,13 +2222,15 @@ static irqreturn_t bmp580_trigger_handler(int irq, void *p)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Temperature calculations */
|
||||
memcpy(&data->sensor_data[1], &data->buf[0], 3);
|
||||
|
||||
/* Pressure calculations */
|
||||
memcpy(&data->sensor_data[0], &data->buf[3], 3);
|
||||
memcpy(&data->sensor_data[offset], &data->buf[3], 3);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->sensor_data,
|
||||
offset += sizeof(s32);
|
||||
|
||||
/* Temperature calculations */
|
||||
memcpy(&data->sensor_data[offset], &data->buf[0], 3);
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, data->sensor_data,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
out:
|
||||
@@ -2523,23 +2536,24 @@ 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, chan_value;
|
||||
int ret, comp_temp, comp_press;
|
||||
s32 *chans = (s32 *)data->sensor_data;
|
||||
|
||||
guard(mutex)(&data->lock);
|
||||
|
||||
ret = bmp180_read_temp(data, &chan_value);
|
||||
ret = bmp180_read_temp(data, &comp_temp);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
data->sensor_data[1] = chan_value;
|
||||
|
||||
ret = bmp180_read_press(data, &chan_value);
|
||||
ret = bmp180_read_press(data, &comp_press);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
data->sensor_data[0] = chan_value;
|
||||
chans[0] = comp_press;
|
||||
chans[1] = comp_temp;
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &data->sensor_data,
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, data->sensor_data,
|
||||
iio_get_time_ns(indio_dev));
|
||||
|
||||
out:
|
||||
|
||||
@@ -322,6 +322,7 @@
|
||||
BMP280_NUM_TEMP_BYTES + \
|
||||
BME280_NUM_HUMIDITY_BYTES)
|
||||
|
||||
#define BME280_NUM_MAX_CHANNELS 3
|
||||
/* Core exported structs */
|
||||
|
||||
static const char *const bmp280_supply_names[] = {
|
||||
@@ -419,7 +420,8 @@ struct bmp280_data {
|
||||
* Data to push to userspace triggered buffer. Up to 3 channels and
|
||||
* s64 timestamp, aligned.
|
||||
*/
|
||||
s32 sensor_data[6] __aligned(8);
|
||||
u8 sensor_data[ALIGN(sizeof(s32) * BME280_NUM_MAX_CHANNELS, sizeof(s64))
|
||||
+ sizeof(s64)] __aligned(sizeof(s64));
|
||||
|
||||
/*
|
||||
* DMA (thus cache coherency maintenance) may require the
|
||||
|
||||
Reference in New Issue
Block a user