* [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support
@ 2024-08-28 20:51 Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data Vasileios Amoiridis
` (6 more replies)
0 siblings, 7 replies; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
Depends on this: https://lore.kernel.org/linux-iio/20240823172017.9028-1-vassilisamir@gmail.com
Changes in v4:
[PATCH v4 1/7]:
- Use better names and split value assignments for better readability.
[PATCH v4 2/7]:
- Move to fsleep() and add comment on top
- Use appropriate return error value in bmp280_preinit()
[PATCH v4 3/7]:
- Split lines for logical and better readability
[PATCH v4 4/7]:
- Change style in static const array assignments
- Use BIT() function instead of bit shifting
- Change usleep_range() to fsleep() and add comments
[PATCH v4 5/7]:
- Add allOf:if in order to allow the interrupt in the device-tree
only in sensors who support it.
[PATCH v4 6/7]:
- Change function pointer return type to irq_handler_t
- Remove extra check in dev_fwnode()
- Fix check in fwnode_irq_get()
- Fix shadowed error check
- Remove extra check in irq_get_irq_data(irq);
- Improve indentation
- Fix return values in certain cases
- Fix identation and if checks
[PATCH v4 7/7]:
- Fix commit message
Vasileios Amoiridis (7):
iio: pressure: bmp280: Use bulk read for humidity calibration data
iio: pressure: bmp280: Add support for bmp280 soft reset
iio: pressure: bmp280: Remove config error check for IIR filter
updates
iio: pressure: bmp280: Use sleep and forced mode for oneshot captures
dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and
BMP5xx devices
iio: pressure: bmp280: Add data ready trigger support
iio: pressure: bmp280: Move bmp085 interrupt to new configuration
.../bindings/iio/pressure/bmp085.yaml | 22 +-
drivers/iio/pressure/bmp280-core.c | 692 +++++++++++++++---
drivers/iio/pressure/bmp280-i2c.c | 4 +-
drivers/iio/pressure/bmp280-spi.c | 4 +-
drivers/iio/pressure/bmp280.h | 52 ++
5 files changed, 684 insertions(+), 90 deletions(-)
base-commit: 0f718e10da81446df0909c9939dff2b77e3b4e95
prerequisite-patch-id: e4f81f31f4fbb2aa872c0c74ed4511893eee0c9a
--
2.25.1
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-29 12:06 ` Andy Shevchenko
2024-08-28 20:51 ` [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset Vasileios Amoiridis
` (5 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
Convert individual reads to a bulk read for the humidity calibration data.
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
drivers/iio/pressure/bmp280-core.c | 64 +++++++++++-------------------
drivers/iio/pressure/bmp280.h | 6 +++
2 files changed, 29 insertions(+), 41 deletions(-)
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index 8383d1a73cf9..9c705f2c4a7b 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -340,10 +340,19 @@ static int bmp280_read_calib(struct bmp280_data *data)
return 0;
}
+/*
+ * These enums are used for indexing into the array of humidity parameters
+ * for BME280. Due to some weird indexing, unaligned BE/LE accesses co-exist in
+ * order to prepare the FIELD_{GET/PREP}() fields. Table 16 in Section 4.2.2 of
+ * the datasheet.
+ */
+enum { H2 = 0, H3 = 2, H4 = 3, H5 = 4, H6 = 6 };
+
static int bme280_read_calib(struct bmp280_data *data)
{
struct bmp280_calib *calib = &data->calib.bmp280;
struct device *dev = data->dev;
+ s16 h4_upper, h4_lower, tmp_1, tmp_2;
unsigned int tmp;
int ret;
@@ -352,14 +361,6 @@ static int bme280_read_calib(struct bmp280_data *data)
if (ret)
return ret;
- /*
- * Read humidity calibration values.
- * Due to some odd register addressing we cannot just
- * do a big bulk read. Instead, we have to read each Hx
- * value separately and sometimes do some bit shifting...
- * Humidity data is only available on BME280.
- */
-
ret = regmap_read(data->regmap, BME280_REG_COMP_H1, &tmp);
if (ret) {
dev_err(dev, "failed to read H1 comp value\n");
@@ -368,43 +369,24 @@ static int bme280_read_calib(struct bmp280_data *data)
calib->H1 = tmp;
ret = regmap_bulk_read(data->regmap, BME280_REG_COMP_H2,
- &data->le16, sizeof(data->le16));
- if (ret) {
- dev_err(dev, "failed to read H2 comp value\n");
- return ret;
- }
- calib->H2 = sign_extend32(le16_to_cpu(data->le16), 15);
-
- ret = regmap_read(data->regmap, BME280_REG_COMP_H3, &tmp);
- if (ret) {
- dev_err(dev, "failed to read H3 comp value\n");
- return ret;
- }
- calib->H3 = tmp;
-
- ret = regmap_bulk_read(data->regmap, BME280_REG_COMP_H4,
- &data->be16, sizeof(data->be16));
+ data->bme280_humid_cal_buf,
+ sizeof(data->bme280_humid_cal_buf));
if (ret) {
- dev_err(dev, "failed to read H4 comp value\n");
+ dev_err(dev, "failed to read humidity calibration values\n");
return ret;
}
- calib->H4 = sign_extend32(((be16_to_cpu(data->be16) >> 4) & 0xff0) |
- (be16_to_cpu(data->be16) & 0xf), 11);
- ret = regmap_bulk_read(data->regmap, BME280_REG_COMP_H5,
- &data->le16, sizeof(data->le16));
- if (ret) {
- dev_err(dev, "failed to read H5 comp value\n");
- return ret;
- }
- calib->H5 = sign_extend32(FIELD_GET(BME280_COMP_H5_MASK, le16_to_cpu(data->le16)), 11);
-
- ret = regmap_read(data->regmap, BME280_REG_COMP_H6, &tmp);
- if (ret) {
- dev_err(dev, "failed to read H6 comp value\n");
- return ret;
- }
- calib->H6 = sign_extend32(tmp, 7);
+ calib->H2 = get_unaligned_le16(&data->bme280_humid_cal_buf[H2]);
+ calib->H3 = data->bme280_humid_cal_buf[H3];
+ tmp_1 = get_unaligned_be16(&data->bme280_humid_cal_buf[H4]);
+ tmp_2 = FIELD_GET(BME280_COMP_H4_GET_MASK_UP, tmp_1);
+ h4_upper = FIELD_PREP(BME280_COMP_H4_PREP_MASK_UP, tmp_2);
+ h4_lower = FIELD_GET(BME280_COMP_H4_MASK_LOW,
+ get_unaligned_be16(&data->bme280_humid_cal_buf[H4]));
+ calib->H4 = sign_extend32(h4_upper | h4_lower, 11);
+ calib->H5 = sign_extend32(FIELD_GET(BME280_COMP_H5_MASK,
+ get_unaligned_le16(&data->bme280_humid_cal_buf[H5])), 11);
+ calib->H6 = data->bme280_humid_cal_buf[H6];
return 0;
}
diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h
index a853b6d5bdfa..4e675401d61b 100644
--- a/drivers/iio/pressure/bmp280.h
+++ b/drivers/iio/pressure/bmp280.h
@@ -257,8 +257,13 @@
#define BME280_REG_COMP_H5 0xE5
#define BME280_REG_COMP_H6 0xE7
+#define BME280_COMP_H4_GET_MASK_UP GENMASK(15, 8)
+#define BME280_COMP_H4_PREP_MASK_UP GENMASK(11, 4)
+#define BME280_COMP_H4_MASK_LOW GENMASK(3, 0)
#define BME280_COMP_H5_MASK GENMASK(15, 4)
+#define BME280_CONTIGUOUS_CALIB_REGS 7
+
#define BME280_OSRS_HUMIDITY_MASK GENMASK(2, 0)
#define BME280_OSRS_HUMIDITY_SKIP 0
#define BME280_OSRS_HUMIDITY_1X 1
@@ -426,6 +431,7 @@ struct bmp280_data {
/* Calibration data buffers */
__le16 bmp280_cal_buf[BMP280_CONTIGUOUS_CALIB_REGS / 2];
__be16 bmp180_cal_buf[BMP180_REG_CALIB_COUNT / 2];
+ u8 bme280_humid_cal_buf[BME280_CONTIGUOUS_CALIB_REGS];
u8 bmp380_cal_buf[BMP380_CALIB_REG_COUNT];
/* Miscellaneous, endianness-aware data buffers */
__le16 le16;
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-29 12:10 ` Andy Shevchenko
2024-08-28 20:51 ` [PATCH v4 3/7] iio: pressure: bmp280: Remove config error check for IIR filter updates Vasileios Amoiridis
` (4 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
The BM(P/E)28x devices have an option for soft reset which is also
recommended by the Bosch Sensortech BME2 Sensor API to be used before the
initial configuration of the device.
Link: https://github.com/boschsensortec/BME280_SensorAPI/blob/bme280_v3.5.1/bme280.c#L429
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
drivers/iio/pressure/bmp280-core.c | 31 ++++++++++++++++++++++++++++++
drivers/iio/pressure/bmp280.h | 3 +++
2 files changed, 34 insertions(+)
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index 9c705f2c4a7b..193a8fcbb5d8 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -965,6 +965,35 @@ static const unsigned long bme280_avail_scan_masks[] = {
0
};
+static int bmp280_preinit(struct bmp280_data *data)
+{
+ unsigned int reg;
+ int ret;
+
+ ret = regmap_write(data->regmap, BMP280_REG_RESET, BMP280_RST_SOFT_CMD);
+ if (ret)
+ return dev_err_probe(data->dev, ret,
+ "Failed to reset device.\n");
+
+ /*
+ * According to the datasheet in Chapter 1: Specification, Table 2,
+ * after resetting, the device uses the complete power-on sequence so
+ * it needs to wait for the defined start-up time.
+ */
+ fsleep(data->start_up_time);
+
+ ret = regmap_read(data->regmap, BMP280_REG_STATUS, ®);
+ if (ret)
+ return dev_err_probe(data->dev, ret,
+ "Failed to read status register.\n");
+
+ if (reg & BMP280_REG_STATUS_IM_UPDATE)
+ return dev_err_probe(data->dev, -EIO,
+ "Failed to copy NVM contents.\n");
+
+ return 0;
+}
+
static int bmp280_chip_config(struct bmp280_data *data)
{
u8 osrs = FIELD_PREP(BMP280_OSRS_TEMP_MASK, data->oversampling_temp + 1) |
@@ -1082,6 +1111,7 @@ const struct bmp280_chip_info bmp280_chip_info = {
.read_temp = bmp280_read_temp,
.read_press = bmp280_read_press,
.read_calib = bmp280_read_calib,
+ .preinit = bmp280_preinit,
.trigger_handler = bmp280_trigger_handler,
};
@@ -1202,6 +1232,7 @@ const struct bmp280_chip_info bme280_chip_info = {
.read_press = bmp280_read_press,
.read_humid = bme280_read_humid,
.read_calib = bme280_read_calib,
+ .preinit = bmp280_preinit,
.trigger_handler = bme280_trigger_handler,
};
diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h
index 4e675401d61b..73516878d020 100644
--- a/drivers/iio/pressure/bmp280.h
+++ b/drivers/iio/pressure/bmp280.h
@@ -205,6 +205,9 @@
#define BMP280_REG_CONFIG 0xF5
#define BMP280_REG_CTRL_MEAS 0xF4
#define BMP280_REG_STATUS 0xF3
+#define BMP280_REG_STATUS_IM_UPDATE BIT(0)
+#define BMP280_REG_RESET 0xE0
+#define BMP280_RST_SOFT_CMD 0xB6
#define BMP280_REG_COMP_TEMP_START 0x88
#define BMP280_COMP_TEMP_REG_COUNT 6
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v4 3/7] iio: pressure: bmp280: Remove config error check for IIR filter updates
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures Vasileios Amoiridis
` (3 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
When there is a change in the configuration of the BMP3xx device, several
steps take place. These steps include:
1) Update the OSR settings and check if there was an update
2) Update the ODR settings and check if there was an update
3) Update the IIR settings and check if there was an update
4) Check if there was an update with the following procedure:
a) Set sensor to SLEEP mode and after to NORMAL mode to trigger
a new measurement.
b) Wait the maximum amount possible depending on the OSR settings
c) Check the configuration error register if there was an error
during the configuration of the sensor.
This check is necessary, because there could be a case where the OSR is
too high for the requested ODR so either the ODR needs to be slower or the
OSR needs to be less. This is something that is checked internally by the
sensor when it runs in NORMAL mode.
In the BMP58x devices the previous steps are done internally by the sensor.
The IIR filter settings do not depend on the OSR or ODR settings, and there
is no need to run a check in case they change.
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
drivers/iio/pressure/bmp280-core.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index 193a8fcbb5d8..2ca907771d42 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -1562,14 +1562,12 @@ static int bmp380_chip_config(struct bmp280_data *data)
change = change || aux;
/* Set filter data */
- ret = regmap_update_bits_check(data->regmap, BMP380_REG_CONFIG, BMP380_FILTER_MASK,
- FIELD_PREP(BMP380_FILTER_MASK, data->iir_filter_coeff),
- &aux);
+ ret = regmap_update_bits(data->regmap, BMP380_REG_CONFIG, BMP380_FILTER_MASK,
+ FIELD_PREP(BMP380_FILTER_MASK, data->iir_filter_coeff));
if (ret) {
dev_err(data->dev, "failed to write config register\n");
return ret;
}
- change = change || aux;
if (change) {
/*
@@ -2159,15 +2157,13 @@ static int bmp580_chip_config(struct bmp280_data *data)
reg_val = FIELD_PREP(BMP580_DSP_IIR_PRESS_MASK, data->iir_filter_coeff) |
FIELD_PREP(BMP580_DSP_IIR_TEMP_MASK, data->iir_filter_coeff);
- ret = regmap_update_bits_check(data->regmap, BMP580_REG_DSP_IIR,
- BMP580_DSP_IIR_PRESS_MASK |
- BMP580_DSP_IIR_TEMP_MASK,
- reg_val, &aux);
+ ret = regmap_update_bits(data->regmap, BMP580_REG_DSP_IIR,
+ BMP580_DSP_IIR_PRESS_MASK | BMP580_DSP_IIR_TEMP_MASK,
+ reg_val);
if (ret) {
dev_err(data->dev, "failed to write config register\n");
return ret;
}
- change = change || aux;
/* Restore sensor to normal operation mode */
ret = regmap_write_bits(data->regmap, BMP580_REG_ODR_CONFIG,
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
` (2 preceding siblings ...)
2024-08-28 20:51 ` [PATCH v4 3/7] iio: pressure: bmp280: Remove config error check for IIR filter updates Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-29 12:31 ` Andy Shevchenko
2024-08-28 20:51 ` [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices Vasileios Amoiridis
` (2 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
This commit adds forced mode support in sensors BMP28x, BME28x, BMP3xx
and BMP58x. Sensors BMP18x and BMP085 are old and do not support this
feature so their operation is not affected at all.
Essentially, up to now, the rest of the sensors were used in normal mode
all the time. This means that they are continuously doing measurements
even though these measurements are not used. Even though the sensor does
provide PM support, to cover all the possible use cases, the sensor needs
to go into sleep mode and wake up whenever necessary.
This commit, adds sleep and forced mode support. Essentially, the sensor
sleeps all the time except for when a measurement is requested. When there
is a request for a measurement, the sensor is put into forced mode, starts
the measurement and after it is done we read the output and we put it again
in sleep mode.
For really fast and more deterministic measurements, the triggered buffer
interface can be used, since the sensor is still used in normal mode for
that use case.
This commit does not add though support for DEEP STANDBY, Low Power NORMAL
and CONTINUOUS modes, supported only by the BMP58x version.
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
drivers/iio/pressure/bmp280-core.c | 294 ++++++++++++++++++++++++++---
drivers/iio/pressure/bmp280.h | 21 +++
2 files changed, 294 insertions(+), 21 deletions(-)
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index 2ca907771d42..e716bcb1dc96 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -16,6 +16,11 @@
* https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp390-ds002.pdf
* https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp581-ds004.pdf
*
+ * Sensor API:
+ * https://github.com/boschsensortec/BME280_SensorAPI
+ * https://github.com/boschsensortec/BMP3_SensorAPI
+ * https://github.com/boschsensortec/BMP5_SensorAPI
+ *
* Notice:
* The link to the bmp180 datasheet points to an outdated version missing these changes:
* - Changed document referral from ANP015 to BST-MPS-AN004-00 on page 26
@@ -617,6 +622,14 @@ static int bmp280_read_raw_impl(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_PROCESSED:
+ ret = data->chip_info->set_mode(data, BMP280_FORCED);
+ if (ret)
+ return ret;
+
+ ret = data->chip_info->wait_conv(data);
+ if (ret)
+ return ret;
+
switch (chan->type) {
case IIO_HUMIDITYRELATIVE:
ret = data->chip_info->read_humid(data, &chan_value);
@@ -646,6 +659,14 @@ static int bmp280_read_raw_impl(struct iio_dev *indio_dev,
return -EINVAL;
}
case IIO_CHAN_INFO_RAW:
+ ret = data->chip_info->set_mode(data, BMP280_FORCED);
+ if (ret)
+ return ret;
+
+ ret = data->chip_info->wait_conv(data);
+ if (ret)
+ return ret;
+
switch (chan->type) {
case IIO_HUMIDITYRELATIVE:
ret = data->chip_info->read_humid(data, &chan_value);
@@ -994,6 +1015,70 @@ static int bmp280_preinit(struct bmp280_data *data)
return 0;
}
+static const u8 bmp280_operation_mode[] = {
+ BMP280_MODE_SLEEP, BMP280_MODE_FORCED, BMP280_MODE_NORMAL,
+};
+
+static int bmp280_set_mode(struct bmp280_data *data, enum bmp280_op_mode mode)
+{
+ int ret;
+
+ switch (mode) {
+ case BMP280_SLEEP:
+ case BMP280_FORCED:
+ case BMP280_NORMAL:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,
+ BMP280_MODE_MASK, bmp280_operation_mode[mode]);
+ if (ret) {
+ dev_err(data->dev, "failed to write ctrl_meas register\n");
+ return ret;
+ }
+
+ data->op_mode = mode;
+
+ return 0;
+}
+
+static int bmp280_wait_conv(struct bmp280_data *data)
+{
+ unsigned int reg;
+ int ret, meas_time;
+
+
+ /* Check if we are using a BME280 device */
+ if (data->oversampling_humid)
+ meas_time += BIT(data->oversampling_humid) * BMP280_MEAS_DUR +
+ BMP280_PRESS_HUMID_MEAS_OFFSET;
+
+ /* Pressure measurement time */
+ meas_time += BIT(data->oversampling_press) * BMP280_MEAS_DUR +
+ BMP280_PRESS_HUMID_MEAS_OFFSET;
+
+ /* Temperature measurement time */
+ meas_time += BIT(data->oversampling_temp) * BMP280_MEAS_DUR;
+
+ /* Waiting time according to the BM(P/E)2 Sensor API */
+ fsleep(meas_time);
+
+ ret = regmap_read(data->regmap, BMP280_REG_STATUS, ®);
+ if (ret) {
+ dev_err(data->dev, "failed to read status register\n");
+ return ret;
+ }
+
+ if (reg & BMP280_REG_STATUS_MEAS_BIT) {
+ dev_err(data->dev, "Measurement cycle didn't complete\n");
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
static int bmp280_chip_config(struct bmp280_data *data)
{
u8 osrs = FIELD_PREP(BMP280_OSRS_TEMP_MASK, data->oversampling_temp + 1) |
@@ -1004,7 +1089,7 @@ static int bmp280_chip_config(struct bmp280_data *data)
BMP280_OSRS_TEMP_MASK |
BMP280_OSRS_PRESS_MASK |
BMP280_MODE_MASK,
- osrs | BMP280_MODE_NORMAL);
+ osrs | BMP280_MODE_SLEEP);
if (ret) {
dev_err(data->dev, "failed to write ctrl_meas register\n");
return ret;
@@ -1111,6 +1196,8 @@ const struct bmp280_chip_info bmp280_chip_info = {
.read_temp = bmp280_read_temp,
.read_press = bmp280_read_press,
.read_calib = bmp280_read_calib,
+ .set_mode = bmp280_set_mode,
+ .wait_conv = bmp280_wait_conv,
.preinit = bmp280_preinit,
.trigger_handler = bmp280_trigger_handler,
@@ -1232,6 +1319,8 @@ const struct bmp280_chip_info bme280_chip_info = {
.read_press = bmp280_read_press,
.read_humid = bme280_read_humid,
.read_calib = bme280_read_calib,
+ .set_mode = bmp280_set_mode,
+ .wait_conv = bmp280_wait_conv,
.preinit = bmp280_preinit,
.trigger_handler = bme280_trigger_handler,
@@ -1519,6 +1608,71 @@ static int bmp380_preinit(struct bmp280_data *data)
return bmp380_cmd(data, BMP380_CMD_SOFT_RESET);
}
+static const u8 bmp380_operation_mode[] = {
+ BMP380_MODE_SLEEP, BMP380_MODE_FORCED, BMP380_MODE_NORMAL,
+};
+
+static int bmp380_set_mode(struct bmp280_data *data, enum bmp280_op_mode mode)
+{
+ int ret;
+
+ switch (mode) {
+ case BMP280_SLEEP:
+ case BMP280_FORCED:
+ case BMP280_NORMAL:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ ret = regmap_write_bits(data->regmap, BMP380_REG_POWER_CONTROL,
+ BMP380_MODE_MASK,
+ FIELD_PREP(BMP380_MODE_MASK,
+ bmp380_operation_mode[mode]));
+ if (ret) {
+ dev_err(data->dev, "failed to write power control register\n");
+ return ret;
+ }
+
+ data->op_mode = mode;
+
+ return 0;
+}
+
+static int bmp380_wait_conv(struct bmp280_data *data)
+{
+ unsigned int reg;
+ int ret, meas_time;
+
+ /* Offset measurement time */
+ meas_time = BMP380_MEAS_OFFSET;
+
+ /* Pressure measurement time */
+ meas_time += BIT(data->oversampling_press) * BMP380_MEAS_DUR +
+ BMP380_PRESS_MEAS_OFFSET;
+
+ /* Temperature measurement time */
+ meas_time += BIT(data->oversampling_temp) * BMP380_MEAS_DUR +
+ BMP380_TEMP_MEAS_OFFSET;
+
+ /* Measurement time defined in Datasheet Section 3.9.2 */
+ fsleep(meas_time);
+
+ ret = regmap_read(data->regmap, BMP380_REG_STATUS, ®);
+ if (ret) {
+ dev_err(data->dev, "failed to read status register\n");
+ return ret;
+ }
+
+ if (!(reg & BMP380_STATUS_DRDY_PRESS_MASK) ||
+ !(reg & BMP380_STATUS_DRDY_TEMP_MASK)) {
+ dev_err(data->dev, "Measurement cycle didn't complete.\n");
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
static int bmp380_chip_config(struct bmp280_data *data)
{
bool change = false, aux;
@@ -1579,17 +1733,19 @@ static int bmp380_chip_config(struct bmp280_data *data)
* Resets sensor measurement loop toggling between sleep and
* normal operating modes.
*/
- ret = regmap_write_bits(data->regmap, BMP380_REG_POWER_CONTROL,
- BMP380_MODE_MASK,
- FIELD_PREP(BMP380_MODE_MASK, BMP380_MODE_SLEEP));
+ ret = bmp380_set_mode(data, BMP280_SLEEP);
if (ret) {
dev_err(data->dev, "failed to set sleep mode\n");
return ret;
}
- usleep_range(2000, 2500);
- ret = regmap_write_bits(data->regmap, BMP380_REG_POWER_CONTROL,
- BMP380_MODE_MASK,
- FIELD_PREP(BMP380_MODE_MASK, BMP380_MODE_NORMAL));
+
+ /*
+ * According to the BMP3 Sensor API, the sensor needs 5000ms
+ * in order to go to the sleep mode.
+ */
+ fsleep(5000);
+
+ ret = bmp380_set_mode(data, BMP280_NORMAL);
if (ret) {
dev_err(data->dev, "failed to set normal mode\n");
return ret;
@@ -1615,6 +1771,17 @@ static int bmp380_chip_config(struct bmp280_data *data)
}
}
+ /* Dummy read to empty data registers. */
+ ret = bmp380_read_press(data, &tmp);
+ if (ret)
+ return ret;
+
+ ret = bmp380_set_mode(data, BMP280_SLEEP);
+ if (ret) {
+ dev_err(data->dev, "failed to set sleep mode\n");
+ return ret;
+ }
+
return 0;
}
@@ -1708,6 +1875,8 @@ const struct bmp280_chip_info bmp380_chip_info = {
.read_temp = bmp380_read_temp,
.read_press = bmp380_read_press,
.read_calib = bmp380_read_calib,
+ .set_mode = bmp380_set_mode,
+ .wait_conv = bmp380_wait_conv,
.preinit = bmp380_preinit,
.trigger_handler = bmp380_trigger_handler,
@@ -2095,6 +2264,70 @@ static int bmp580_preinit(struct bmp280_data *data)
return PTR_ERR_OR_ZERO(devm_nvmem_register(config.dev, &config));
}
+static const u8 bmp580_operation_mode[] = {
+ BMP580_MODE_SLEEP, BMP580_MODE_FORCED, BMP580_MODE_NORMAL,
+};
+
+static int bmp580_set_mode(struct bmp280_data *data, enum bmp280_op_mode mode)
+{
+ int ret;
+
+ switch (mode) {
+ case BMP280_SLEEP:
+ case BMP280_NORMAL:
+ break;
+ case BMP280_FORCED:
+ ret = regmap_set_bits(data->regmap, BMP580_REG_DSP_CONFIG,
+ BMP580_DSP_IIR_FORCED_FLUSH);
+ if (ret) {
+ dev_err(data->dev,
+ "Could not flush IIR filter constants.\n");
+ return ret;
+ }
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ ret = regmap_write_bits(data->regmap, BMP580_REG_ODR_CONFIG,
+ BMP580_MODE_MASK,
+ FIELD_PREP(BMP580_MODE_MASK,
+ bmp580_operation_mode[mode]));
+ if (ret) {
+ dev_err(data->dev, "failed to write power control register\n");
+ return ret;
+ }
+
+ data->op_mode = mode;
+
+ return 0;
+}
+
+static int bmp580_wait_conv(struct bmp280_data *data)
+{
+ /*
+ * Taken from datasheet, Section 2 "Specification, Table 3 "Electrical
+ * characteristics.
+ */
+ static const int time_conv_press[] = {
+ 0, 1050, 1785, 3045, 5670, 10920, 21420, 42420, 84420
+ };
+
+ static const int time_conv_temp[] = {
+ 0, 1050, 1105, 1575, 2205, 3465, 6090, 11340, 21840
+ };
+
+ int meas_time;
+
+ meas_time = 4 * USEC_PER_MSEC + time_conv_temp[data->oversampling_temp]
+ + time_conv_press[data->oversampling_press];
+
+ /* Measurement time mentioned in Chapter 2, Table 4 of the datasheet. */
+ fsleep(meas_time);
+
+ return 0;
+}
+
static int bmp580_chip_config(struct bmp280_data *data)
{
bool change = false, aux;
@@ -2112,7 +2345,7 @@ static int bmp580_chip_config(struct bmp280_data *data)
return ret;
}
/* From datasheet's table 4: electrical characteristics */
- usleep_range(2500, 3000);
+ fsleep(data->start_up_time + 500);
/* Set default DSP mode settings */
reg_val = FIELD_PREP(BMP580_DSP_COMP_MASK, BMP580_DSP_PRESS_TEMP_COMP_EN) |
@@ -2165,17 +2398,6 @@ static int bmp580_chip_config(struct bmp280_data *data)
return ret;
}
- /* Restore sensor to normal operation mode */
- ret = regmap_write_bits(data->regmap, BMP580_REG_ODR_CONFIG,
- BMP580_MODE_MASK,
- FIELD_PREP(BMP580_MODE_MASK, BMP580_MODE_NORMAL));
- if (ret) {
- dev_err(data->dev, "failed to set normal mode\n");
- return ret;
- }
- /* From datasheet's table 4: electrical characteristics */
- usleep_range(3000, 3500);
-
if (change) {
/*
* Check if ODR and OSR settings are valid or we are
@@ -2271,6 +2493,8 @@ const struct bmp280_chip_info bmp580_chip_info = {
.chip_config = bmp580_chip_config,
.read_temp = bmp580_read_temp,
.read_press = bmp580_read_press,
+ .set_mode = bmp580_set_mode,
+ .wait_conv = bmp580_wait_conv,
.preinit = bmp580_preinit,
.trigger_handler = bmp580_trigger_handler,
@@ -2518,6 +2742,19 @@ static int bmp180_read_press(struct bmp280_data *data, u32 *comp_press)
return 0;
}
+/* Keep compatibility with newer generations of the sensor */
+static int bmp180_set_mode(struct bmp280_data *data, enum bmp280_op_mode mode)
+{
+ return 0;
+}
+
+/* Keep compatibility with newer generations of the sensor */
+static int bmp180_wait_conv(struct bmp280_data *data)
+{
+ return 0;
+}
+
+/* Keep compatibility with newer generations of the sensor */
static int bmp180_chip_config(struct bmp280_data *data)
{
return 0;
@@ -2588,6 +2825,8 @@ const struct bmp280_chip_info bmp180_chip_info = {
.read_temp = bmp180_read_temp,
.read_press = bmp180_read_press,
.read_calib = bmp180_read_calib,
+ .set_mode = bmp180_set_mode,
+ .wait_conv = bmp180_wait_conv,
.trigger_handler = bmp180_trigger_handler,
};
@@ -2640,6 +2879,7 @@ static int bmp280_buffer_preenable(struct iio_dev *indio_dev)
struct bmp280_data *data = iio_priv(indio_dev);
pm_runtime_get_sync(data->dev);
+ data->chip_info->set_mode(data, BMP280_NORMAL);
return 0;
}
@@ -2810,6 +3050,10 @@ int bmp280_common_probe(struct device *dev,
return ret;
}
+ ret = data->chip_info->set_mode(data, BMP280_SLEEP);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to set sleep mode\n");
+
/* Enable runtime PM */
pm_runtime_get_noresume(dev);
pm_runtime_set_active(dev);
@@ -2835,6 +3079,9 @@ static int bmp280_runtime_suspend(struct device *dev)
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct bmp280_data *data = iio_priv(indio_dev);
+ data->chip_info->set_mode(data, BMP280_SLEEP);
+
+ usleep_range(2500, 3000);
return regulator_bulk_disable(BMP280_NUM_SUPPLIES, data->supplies);
}
@@ -2849,7 +3096,12 @@ static int bmp280_runtime_resume(struct device *dev)
return ret;
usleep_range(data->start_up_time, data->start_up_time + 100);
- return data->chip_info->chip_config(data);
+
+ ret = data->chip_info->chip_config(data);
+ if (ret)
+ return ret;
+
+ return data->chip_info->set_mode(data, data->op_mode);
}
EXPORT_RUNTIME_DEV_PM_OPS(bmp280_dev_pm_ops, bmp280_runtime_suspend,
diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h
index 73516878d020..c9840b8d58b0 100644
--- a/drivers/iio/pressure/bmp280.h
+++ b/drivers/iio/pressure/bmp280.h
@@ -170,6 +170,11 @@
#define BMP380_MODE_FORCED 1
#define BMP380_MODE_NORMAL 3
+#define BMP380_MEAS_OFFSET 234
+#define BMP380_MEAS_DUR 2020
+#define BMP380_TEMP_MEAS_OFFSET 163
+#define BMP380_PRESS_MEAS_OFFSET 392
+
#define BMP380_MIN_TEMP -4000
#define BMP380_MAX_TEMP 8500
#define BMP380_MIN_PRES 3000000
@@ -206,6 +211,7 @@
#define BMP280_REG_CTRL_MEAS 0xF4
#define BMP280_REG_STATUS 0xF3
#define BMP280_REG_STATUS_IM_UPDATE BIT(0)
+#define BMP280_REG_STATUS_MEAS_BIT BIT(3)
#define BMP280_REG_RESET 0xE0
#define BMP280_RST_SOFT_CMD 0xB6
@@ -246,6 +252,10 @@
#define BMP280_MODE_FORCED 1
#define BMP280_MODE_NORMAL 3
+#define BMP280_MEAS_OFFSET 1250
+#define BMP280_MEAS_DUR 2300
+#define BMP280_PRESS_HUMID_MEAS_OFFSET 575
+
/* BME280 specific registers */
#define BME280_REG_HUMIDITY_LSB 0xFE
#define BME280_REG_HUMIDITY_MSB 0xFD
@@ -384,6 +394,12 @@ struct bmp380_calib {
s8 P11;
};
+enum bmp280_op_mode {
+ BMP280_SLEEP,
+ BMP280_FORCED,
+ BMP280_NORMAL,
+};
+
struct bmp280_data {
struct device *dev;
struct mutex lock;
@@ -424,6 +440,9 @@ struct bmp280_data {
s64 ts __aligned(8);
} buffer;
+ /* Value to hold the current operation mode of the device */
+ enum bmp280_op_mode op_mode;
+
/*
* DMA (thus cache coherency maintenance) may require the
* transfer buffers to live in their own cache lines.
@@ -488,6 +507,8 @@ struct bmp280_chip_info {
int (*read_humid)(struct bmp280_data *data, u32 *adc_humidity);
int (*read_calib)(struct bmp280_data *data);
int (*preinit)(struct bmp280_data *data);
+ int (*set_mode)(struct bmp280_data *data, enum bmp280_op_mode mode);
+ int (*wait_conv)(struct bmp280_data *data);
irqreturn_t (*trigger_handler)(int irq, void *p);
};
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
` (3 preceding siblings ...)
2024-08-28 20:51 ` [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-29 6:06 ` Krzysztof Kozlowski
2024-08-28 20:51 ` [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration Vasileios Amoiridis
6 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
Add interrupt options for BMP3xx and BMP5xx devices as well.
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
.../bindings/iio/pressure/bmp085.yaml | 22 ++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml b/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
index 6fda887ee9d4..edf5901c6c87 100644
--- a/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
+++ b/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
@@ -48,14 +48,34 @@ properties:
interrupts:
description:
- interrupt mapping for IRQ (BMP085 only)
+ interrupt mapping for IRQ. Supported in BMP085, BMP3xx, BMP5xx
maxItems: 1
+ drive-open-drain:
+ description:
+ set if the interrupt pin should be configured as open drain.
+ If not set, defaults to push-pull configuration.
+
required:
- compatible
- vddd-supply
- vdda-supply
+allOf:
+ - if:
+ properties:
+ compatible:
+ enum:
+ - bosch,bmp085
+ - bosch,bmp380
+ - bosch,bmp580
+ then:
+ properties:
+ interrupts: true
+ else:
+ properties:
+ interrupts: false
+
additionalProperties: false
examples:
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
` (4 preceding siblings ...)
2024-08-28 20:51 ` [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-29 12:40 ` Andy Shevchenko
2024-08-28 20:51 ` [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration Vasileios Amoiridis
6 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
The BMP3xx and BMP5xx sensors have an interrupt pin which can be used as
a trigger for when there are data ready in the sensor for pick up.
This use case is used along with NORMAL_MODE in the sensor, which allows
the sensor to do consecutive measurements depending on the ODR rate value.
The trigger pin can be configured to be open-drain or push-pull and either
rising or falling edge.
No support is added yet for interrupts for FIFO, WATERMARK and out of range
values.
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
drivers/iio/pressure/bmp280-core.c | 231 ++++++++++++++++++++++++++++-
drivers/iio/pressure/bmp280.h | 21 +++
2 files changed, 250 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index e716bcb1dc96..c37c56446183 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -42,12 +42,14 @@
#include <linux/module.h>
#include <linux/nvmem-provider.h>
#include <linux/pm_runtime.h>
+#include <linux/property.h>
#include <linux/random.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/iio/buffer.h>
#include <linux/iio/iio.h>
+#include <linux/iio/trigger.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/iio/triggered_buffer.h>
@@ -1282,6 +1284,66 @@ static irqreturn_t bme280_trigger_handler(int irq, void *p)
return IRQ_HANDLED;
}
+static int __bmp280_trigger_probe(struct iio_dev *indio_dev,
+ const struct iio_trigger_ops *trigger_ops,
+ int (*int_config)(struct bmp280_data *data),
+ irq_handler_t irq_thread_handler)
+{
+ struct bmp280_data *data = iio_priv(indio_dev);
+ struct fwnode_handle *fwnode;
+ int ret, irq, irq_type;
+ struct irq_data *desc;
+
+ irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
+ if (irq < 0)
+ return dev_err_probe(data->dev, irq, "No interrupt found.\n");
+
+ desc = irq_get_irq_data(irq);
+ irq_type = irqd_get_trigger_type(desc);
+ switch (irq_type) {
+ case IRQF_TRIGGER_RISING:
+ data->trig_active_high = true;
+ break;
+ case IRQF_TRIGGER_FALLING:
+ data->trig_active_high = false;
+ break;
+ default:
+ return dev_err_probe(data->dev, -EINVAL,
+ "Invalid interrupt type specified.\n");
+ }
+
+ data->trig_open_drain =
+ fwnode_property_read_bool(fwnode, "int-open-drain");
+
+ ret = int_config(data);
+ if (ret)
+ return ret;
+
+ data->trig = devm_iio_trigger_alloc(data->dev, "%s-dev%d",
+ indio_dev->name,
+ iio_device_id(indio_dev));
+ if (!data->trig)
+ return -ENOMEM;
+
+ data->trig->ops = trigger_ops;
+ iio_trigger_set_drvdata(data->trig, data);
+
+ ret = devm_request_threaded_irq(data->dev, irq, NULL,
+ irq_thread_handler, IRQF_ONESHOT,
+ indio_dev->name, indio_dev);
+ if (ret)
+ return dev_err_probe(data->dev, ret, "request irq failed.\n");
+
+ ret = devm_iio_trigger_register(data->dev, data->trig);
+ if (ret)
+ return dev_err_probe(data->dev, ret,
+ "iio trigger register failed.\n");
+
+ indio_dev->trig = iio_trigger_get(data->trig);
+
+ return 0;
+}
+
static const u8 bme280_chip_ids[] = { BME280_CHIP_ID };
static const int bme280_humid_coeffs[] = { 1000, 1024 };
@@ -1785,6 +1847,83 @@ static int bmp380_chip_config(struct bmp280_data *data)
return 0;
}
+static void bmp380_trigger_reenable(struct iio_trigger *trig)
+{
+ struct bmp280_data *data = iio_trigger_get_drvdata(trig);
+ unsigned int tmp;
+ int ret;
+
+ ret = regmap_read(data->regmap, BMP380_REG_INT_STATUS, &tmp);
+ if (ret)
+ dev_err(data->dev, "Failed to reset interrupt\n");
+}
+
+static int bmp380_data_rdy_trigger_set_state(struct iio_trigger *trig,
+ bool state)
+{
+ struct bmp280_data *data = iio_trigger_get_drvdata(trig);
+ int ret;
+
+ guard(mutex)(&data->lock);
+
+ ret = regmap_update_bits(data->regmap, BMP380_REG_INT_CONTROL,
+ BMP380_INT_CTRL_DRDY_EN,
+ FIELD_PREP(BMP380_INT_CTRL_DRDY_EN, !!state));
+ if (ret)
+ dev_err(data->dev,
+ "Could not %s interrupt\n", str_enable_disable(state));
+ return ret;
+}
+
+static const struct iio_trigger_ops bmp380_trigger_ops = {
+ .set_trigger_state = &bmp380_data_rdy_trigger_set_state,
+ .reenable = &bmp380_trigger_reenable,
+};
+
+static int bmp380_int_config(struct bmp280_data *data)
+{
+ int pin_drive_cfg = FIELD_PREP(BMP380_INT_CTRL_OPEN_DRAIN,
+ data->trig_open_drain);
+ int pin_level_cfg = FIELD_PREP(BMP380_INT_CTRL_LEVEL,
+ data->trig_active_high);
+ int ret, int_cfg = pin_drive_cfg | pin_level_cfg;
+
+ ret = regmap_update_bits(data->regmap, BMP380_REG_INT_CONTROL,
+ BMP380_INT_CTRL_SETTINGS_MASK, int_cfg);
+ if (ret) {
+ dev_err(data->dev, "Could not set interrupt settings\n");
+ return ret;
+ }
+
+ return ret;
+}
+
+static irqreturn_t bmp380_irq_thread_handler(int irq, void *p)
+{
+ struct iio_dev *indio_dev = p;
+ struct bmp280_data *data = iio_priv(indio_dev);
+ unsigned int int_ctrl;
+ int ret;
+
+ scoped_guard(mutex, &data->lock) {
+ ret = regmap_read(data->regmap, BMP380_REG_INT_STATUS, &int_ctrl);
+ if (ret)
+ return IRQ_NONE;
+ }
+
+ if (FIELD_GET(BMP380_INT_STATUS_DRDY, int_ctrl))
+ iio_trigger_poll_nested(data->trig);
+
+ return IRQ_HANDLED;
+}
+
+static int bmp380_trigger_probe(struct iio_dev *indio_dev)
+{
+ return __bmp280_trigger_probe(indio_dev, &bmp380_trigger_ops,
+ bmp380_int_config,
+ bmp380_irq_thread_handler);
+}
+
static irqreturn_t bmp380_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -1879,6 +2018,7 @@ const struct bmp280_chip_info bmp380_chip_info = {
.wait_conv = bmp380_wait_conv,
.preinit = bmp380_preinit,
+ .trigger_probe = bmp380_trigger_probe,
.trigger_handler = bmp380_trigger_handler,
};
EXPORT_SYMBOL_NS(bmp380_chip_info, IIO_BMP280);
@@ -2421,6 +2561,89 @@ static int bmp580_chip_config(struct bmp280_data *data)
return 0;
}
+static void bmp580_trigger_reenable(struct iio_trigger *trig)
+{
+ struct bmp280_data *data = iio_trigger_get_drvdata(trig);
+ unsigned int tmp;
+ int ret;
+
+ ret = regmap_read(data->regmap, BMP580_REG_INT_STATUS, &tmp);
+ if (ret)
+ dev_err(data->dev, "Failed to reset interrupt\n");
+}
+
+static int bmp580_data_rdy_trigger_set_state(struct iio_trigger *trig,
+ bool state)
+{
+ struct bmp280_data *data = iio_trigger_get_drvdata(trig);
+ int ret;
+
+ guard(mutex)(&data->lock);
+
+ ret = regmap_update_bits(data->regmap, BMP580_REG_INT_CONFIG,
+ BMP580_INT_CONFIG_INT_EN,
+ FIELD_PREP(BMP580_INT_CONFIG_INT_EN, !!state));
+ if (ret)
+ dev_err(data->dev,
+ "Could not %s interrupt\n", str_enable_disable(state));
+ return ret;
+}
+
+static const struct iio_trigger_ops bmp580_trigger_ops = {
+ .set_trigger_state = &bmp580_data_rdy_trigger_set_state,
+ .reenable = &bmp580_trigger_reenable,
+};
+
+static int bmp580_int_config(struct bmp280_data *data)
+{
+ int ret, int_cfg = FIELD_PREP(BMP580_INT_CONFIG_OPEN_DRAIN,
+ data->trig_open_drain) |
+ FIELD_PREP(BMP580_INT_CONFIG_LEVEL,
+ data->trig_active_high);
+
+ ret = regmap_update_bits(data->regmap, BMP580_REG_INT_CONFIG,
+ BMP580_INT_CONFIG_MASK, int_cfg);
+ if (ret) {
+ dev_err(data->dev, "Could not set interrupt settings\n");
+ return ret;
+ }
+
+ ret = regmap_set_bits(data->regmap, BMP580_REG_INT_SOURCE,
+ BMP580_INT_SOURCE_DRDY);
+ if (ret) {
+ dev_err(data->dev, "Could not set interrupt source\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static irqreturn_t bmp580_irq_thread_handler(int irq, void *p)
+{
+ struct iio_dev *indio_dev = p;
+ struct bmp280_data *data = iio_priv(indio_dev);
+ unsigned int int_ctrl;
+ int ret;
+
+ scoped_guard(mutex, &data->lock) {
+ ret = regmap_read(data->regmap, BMP580_REG_INT_STATUS, &int_ctrl);
+ if (ret)
+ return IRQ_NONE;
+ }
+
+ if (FIELD_GET(BMP580_INT_STATUS_DRDY_MASK, int_ctrl))
+ iio_trigger_poll_nested(data->trig);
+
+ return IRQ_HANDLED;
+}
+
+static int bmp580_trigger_probe(struct iio_dev *indio_dev)
+{
+ return __bmp280_trigger_probe(indio_dev, &bmp580_trigger_ops,
+ bmp580_int_config,
+ bmp580_irq_thread_handler);
+}
+
static irqreturn_t bmp580_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -2497,6 +2720,7 @@ const struct bmp280_chip_info bmp580_chip_info = {
.wait_conv = bmp580_wait_conv,
.preinit = bmp580_preinit,
+ .trigger_probe = bmp580_trigger_probe,
.trigger_handler = bmp580_trigger_handler,
};
EXPORT_SYMBOL_NS(bmp580_chip_info, IIO_BMP280);
@@ -3044,8 +3268,11 @@ int bmp280_common_probe(struct device *dev,
* however as it happens, the BMP085 shares the chip ID of BMP180
* so we look for an IRQ if we have that.
*/
- if (irq > 0 && (chip_id == BMP180_CHIP_ID)) {
- ret = bmp085_fetch_eoc_irq(dev, name, irq, data);
+ if (irq > 0) {
+ if (chip_id == BMP180_CHIP_ID)
+ ret = bmp085_fetch_eoc_irq(dev, name, irq, data);
+ if (data->chip_info->trigger_probe)
+ ret = data->chip_info->trigger_probe(indio_dev);
if (ret)
return ret;
}
diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h
index c9840b8d58b0..0c32b6430677 100644
--- a/drivers/iio/pressure/bmp280.h
+++ b/drivers/iio/pressure/bmp280.h
@@ -55,8 +55,17 @@
#define BMP580_CMD_NVM_WRITE_SEQ_1 0xA0
#define BMP580_CMD_SOFT_RESET 0xB6
+#define BMP580_INT_STATUS_DRDY_MASK BIT(0)
#define BMP580_INT_STATUS_POR_MASK BIT(4)
+#define BMP580_INT_SOURCE_DRDY BIT(0)
+
+#define BMP580_INT_CONFIG_MASK GENMASK(3, 0)
+#define BMP580_INT_CONFIG_LATCH BIT(0)
+#define BMP580_INT_CONFIG_LEVEL BIT(1)
+#define BMP580_INT_CONFIG_OPEN_DRAIN BIT(2)
+#define BMP580_INT_CONFIG_INT_EN BIT(3)
+
#define BMP580_STATUS_CORE_RDY_MASK BIT(0)
#define BMP580_STATUS_NVM_RDY_MASK BIT(1)
#define BMP580_STATUS_NVM_ERR_MASK BIT(2)
@@ -175,6 +184,14 @@
#define BMP380_TEMP_MEAS_OFFSET 163
#define BMP380_PRESS_MEAS_OFFSET 392
+#define BMP380_INT_STATUS_DRDY BIT(3)
+
+#define BMP380_INT_CTRL_SETTINGS_MASK GENMASK(2, 0)
+#define BMP380_INT_CTRL_OPEN_DRAIN BIT(0)
+#define BMP380_INT_CTRL_LEVEL BIT(1)
+#define BMP380_INT_CTRL_LATCH BIT(2)
+#define BMP380_INT_CTRL_DRDY_EN BIT(6)
+
#define BMP380_MIN_TEMP -4000
#define BMP380_MAX_TEMP 8500
#define BMP380_MIN_PRES 3000000
@@ -406,6 +423,9 @@ struct bmp280_data {
struct regmap *regmap;
struct completion done;
bool use_eoc;
+ bool trig_open_drain;
+ bool trig_active_high;
+ struct iio_trigger *trig;
const struct bmp280_chip_info *chip_info;
union {
struct bmp180_calib bmp180;
@@ -510,6 +530,7 @@ struct bmp280_chip_info {
int (*set_mode)(struct bmp280_data *data, enum bmp280_op_mode mode);
int (*wait_conv)(struct bmp280_data *data);
+ int (*trigger_probe)(struct iio_dev *indio_dev);
irqreturn_t (*trigger_handler)(int irq, void *p);
};
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
` (5 preceding siblings ...)
2024-08-28 20:51 ` [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support Vasileios Amoiridis
@ 2024-08-28 20:51 ` Vasileios Amoiridis
2024-08-29 12:42 ` Andy Shevchenko
6 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-28 20:51 UTC (permalink / raw)
To: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko
Cc: vassilisamir, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
This commit intends to add the old BMP085 sensor to the new IRQ interface
of the driver for consistence. No functional changes intended.
The BMP085 sensor is equivalent with the BMP180 with the only difference of
BMP085 having an extra interrupt pin to inform about an End of Conversion.
Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
---
drivers/iio/pressure/bmp280-core.c | 62 +++++++++++++++++++++++-------
drivers/iio/pressure/bmp280-i2c.c | 4 +-
drivers/iio/pressure/bmp280-spi.c | 4 +-
drivers/iio/pressure/bmp280.h | 1 +
4 files changed, 53 insertions(+), 18 deletions(-)
diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
index c37c56446183..948d11c6912f 100644
--- a/drivers/iio/pressure/bmp280-core.c
+++ b/drivers/iio/pressure/bmp280-core.c
@@ -3065,13 +3065,16 @@ static irqreturn_t bmp085_eoc_irq(int irq, void *d)
return IRQ_HANDLED;
}
-static int bmp085_fetch_eoc_irq(struct device *dev,
- const char *name,
- int irq,
- struct bmp280_data *data)
+static int bmp085_trigger_probe(struct iio_dev *indio_dev)
{
+ struct bmp280_data *data = iio_priv(indio_dev);
+ struct device *dev = data->dev;
unsigned long irq_trig;
- int ret;
+ int ret, irq;
+
+ irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
+ if (irq < 0)
+ return dev_err_probe(data->dev, irq, "No interrupt found.\n");
irq_trig = irqd_get_trigger_type(irq_get_irq_data(irq));
if (irq_trig != IRQF_TRIGGER_RISING) {
@@ -3081,13 +3084,8 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
init_completion(&data->done);
- ret = devm_request_threaded_irq(dev,
- irq,
- bmp085_eoc_irq,
- NULL,
- irq_trig,
- name,
- data);
+ ret = devm_request_irq(dev, irq, bmp085_eoc_irq, irq_trig,
+ indio_dev->name, data);
if (ret) {
/* Bail out without IRQ but keep the driver in place */
dev_err(dev, "unable to request DRDY IRQ\n");
@@ -3098,6 +3096,44 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
return 0;
}
+/* Identical to bmp180_chip_info + bmp085_trigger_probe */
+const struct bmp280_chip_info bmp085_chip_info = {
+ .id_reg = BMP280_REG_ID,
+ .chip_id = bmp180_chip_ids,
+ .num_chip_id = ARRAY_SIZE(bmp180_chip_ids),
+ .regmap_config = &bmp180_regmap_config,
+ .start_up_time = 2000,
+ .channels = bmp280_channels,
+ .num_channels = ARRAY_SIZE(bmp280_channels),
+ .avail_scan_masks = bmp280_avail_scan_masks,
+
+ .oversampling_temp_avail = bmp180_oversampling_temp_avail,
+ .num_oversampling_temp_avail =
+ ARRAY_SIZE(bmp180_oversampling_temp_avail),
+ .oversampling_temp_default = 0,
+
+ .oversampling_press_avail = bmp180_oversampling_press_avail,
+ .num_oversampling_press_avail =
+ ARRAY_SIZE(bmp180_oversampling_press_avail),
+ .oversampling_press_default = BMP180_MEAS_PRESS_8X,
+
+ .temp_coeffs = bmp180_temp_coeffs,
+ .temp_coeffs_type = IIO_VAL_FRACTIONAL,
+ .press_coeffs = bmp180_press_coeffs,
+ .press_coeffs_type = IIO_VAL_FRACTIONAL,
+
+ .chip_config = bmp180_chip_config,
+ .read_temp = bmp180_read_temp,
+ .read_press = bmp180_read_press,
+ .read_calib = bmp180_read_calib,
+ .set_mode = bmp180_set_mode,
+ .wait_conv = bmp180_wait_conv,
+
+ .trigger_probe = bmp085_trigger_probe,
+ .trigger_handler = bmp180_trigger_handler,
+};
+EXPORT_SYMBOL_NS(bmp085_chip_info, IIO_BMP280);
+
static int bmp280_buffer_preenable(struct iio_dev *indio_dev)
{
struct bmp280_data *data = iio_priv(indio_dev);
@@ -3269,8 +3305,6 @@ int bmp280_common_probe(struct device *dev,
* so we look for an IRQ if we have that.
*/
if (irq > 0) {
- if (chip_id == BMP180_CHIP_ID)
- ret = bmp085_fetch_eoc_irq(dev, name, irq, data);
if (data->chip_info->trigger_probe)
ret = data->chip_info->trigger_probe(indio_dev);
if (ret)
diff --git a/drivers/iio/pressure/bmp280-i2c.c b/drivers/iio/pressure/bmp280-i2c.c
index 5c3a63b4327c..2f7b25984c7b 100644
--- a/drivers/iio/pressure/bmp280-i2c.c
+++ b/drivers/iio/pressure/bmp280-i2c.c
@@ -27,7 +27,7 @@ static int bmp280_i2c_probe(struct i2c_client *client)
}
static const struct of_device_id bmp280_of_i2c_match[] = {
- { .compatible = "bosch,bmp085", .data = &bmp180_chip_info },
+ { .compatible = "bosch,bmp085", .data = &bmp085_chip_info },
{ .compatible = "bosch,bmp180", .data = &bmp180_chip_info },
{ .compatible = "bosch,bmp280", .data = &bmp280_chip_info },
{ .compatible = "bosch,bme280", .data = &bme280_chip_info },
@@ -38,7 +38,7 @@ static const struct of_device_id bmp280_of_i2c_match[] = {
MODULE_DEVICE_TABLE(of, bmp280_of_i2c_match);
static const struct i2c_device_id bmp280_i2c_id[] = {
- {"bmp085", (kernel_ulong_t)&bmp180_chip_info },
+ {"bmp085", (kernel_ulong_t)&bmp085_chip_info },
{"bmp180", (kernel_ulong_t)&bmp180_chip_info },
{"bmp280", (kernel_ulong_t)&bmp280_chip_info },
{"bme280", (kernel_ulong_t)&bme280_chip_info },
diff --git a/drivers/iio/pressure/bmp280-spi.c b/drivers/iio/pressure/bmp280-spi.c
index d18549d9bb64..49aa8c2cd85b 100644
--- a/drivers/iio/pressure/bmp280-spi.c
+++ b/drivers/iio/pressure/bmp280-spi.c
@@ -114,7 +114,7 @@ static int bmp280_spi_probe(struct spi_device *spi)
}
static const struct of_device_id bmp280_of_spi_match[] = {
- { .compatible = "bosch,bmp085", .data = &bmp180_chip_info },
+ { .compatible = "bosch,bmp085", .data = &bmp085_chip_info },
{ .compatible = "bosch,bmp180", .data = &bmp180_chip_info },
{ .compatible = "bosch,bmp181", .data = &bmp180_chip_info },
{ .compatible = "bosch,bmp280", .data = &bmp280_chip_info },
@@ -126,7 +126,7 @@ static const struct of_device_id bmp280_of_spi_match[] = {
MODULE_DEVICE_TABLE(of, bmp280_of_spi_match);
static const struct spi_device_id bmp280_spi_id[] = {
- { "bmp085", (kernel_ulong_t)&bmp180_chip_info },
+ { "bmp085", (kernel_ulong_t)&bmp085_chip_info },
{ "bmp180", (kernel_ulong_t)&bmp180_chip_info },
{ "bmp181", (kernel_ulong_t)&bmp180_chip_info },
{ "bmp280", (kernel_ulong_t)&bmp280_chip_info },
diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h
index 0c32b6430677..e0e47bf22472 100644
--- a/drivers/iio/pressure/bmp280.h
+++ b/drivers/iio/pressure/bmp280.h
@@ -535,6 +535,7 @@ struct bmp280_chip_info {
};
/* Chip infos for each variant */
+extern const struct bmp280_chip_info bmp085_chip_info;
extern const struct bmp280_chip_info bmp180_chip_info;
extern const struct bmp280_chip_info bmp280_chip_info;
extern const struct bmp280_chip_info bme280_chip_info;
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices
2024-08-28 20:51 ` [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices Vasileios Amoiridis
@ 2024-08-29 6:06 ` Krzysztof Kozlowski
2024-08-29 19:15 ` Vasileios Amoiridis
0 siblings, 1 reply; 23+ messages in thread
From: Krzysztof Kozlowski @ 2024-08-29 6:06 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, andriy.shevchenko,
ang.iglesiasg, linus.walleij, biju.das.jz, javier.carrasco.cruz,
semen.protsenko, 579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Wed, Aug 28, 2024 at 10:51:25PM +0200, Vasileios Amoiridis wrote:
> Add interrupt options for BMP3xx and BMP5xx devices as well.
>
> Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
> ---
> .../bindings/iio/pressure/bmp085.yaml | 22 ++++++++++++++++++-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml b/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
> index 6fda887ee9d4..edf5901c6c87 100644
> --- a/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
> +++ b/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
> @@ -48,14 +48,34 @@ properties:
>
> interrupts:
> description:
> - interrupt mapping for IRQ (BMP085 only)
> + interrupt mapping for IRQ. Supported in BMP085, BMP3xx, BMP5xx
> maxItems: 1
>
> + drive-open-drain:
> + description:
> + set if the interrupt pin should be configured as open drain.
> + If not set, defaults to push-pull configuration.
I don't think you implemented my comment.
> +
> required:
> - compatible
> - vddd-supply
> - vdda-supply
>
> +allOf:
> + - if:
not:
> + properties:
> + compatible:
> + enum:
> + - bosch,bmp085
> + - bosch,bmp380
> + - bosch,bmp580
> + then:
> + properties:
> + interrupts: true
> + else:
so no need for else:.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data
2024-08-28 20:51 ` [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data Vasileios Amoiridis
@ 2024-08-29 12:06 ` Andy Shevchenko
2024-08-29 18:57 ` Vasileios Amoiridis
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 12:06 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Wed, Aug 28, 2024 at 10:51:21PM +0200, Vasileios Amoiridis wrote:
> Convert individual reads to a bulk read for the humidity calibration data.
...
> + calib->H2 = get_unaligned_le16(&data->bme280_humid_cal_buf[H2]);
> + calib->H3 = data->bme280_humid_cal_buf[H3];
> + tmp_1 = get_unaligned_be16(&data->bme280_humid_cal_buf[H4]);
> + tmp_2 = FIELD_GET(BME280_COMP_H4_GET_MASK_UP, tmp_1);
> + h4_upper = FIELD_PREP(BME280_COMP_H4_PREP_MASK_UP, tmp_2);
> + h4_lower = FIELD_GET(BME280_COMP_H4_MASK_LOW,
> + get_unaligned_be16(&data->bme280_humid_cal_buf[H4]));
Either I don't understand the side effects, or this is the same as tmp_1. No?
> + calib->H4 = sign_extend32(h4_upper | h4_lower, 11);
> + calib->H5 = sign_extend32(FIELD_GET(BME280_COMP_H5_MASK,
> + get_unaligned_le16(&data->bme280_humid_cal_buf[H5])), 11);
> + calib->H6 = data->bme280_humid_cal_buf[H6];
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset
2024-08-28 20:51 ` [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset Vasileios Amoiridis
@ 2024-08-29 12:10 ` Andy Shevchenko
2024-08-29 19:00 ` Vasileios Amoiridis
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 12:10 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Wed, Aug 28, 2024 at 10:51:22PM +0200, Vasileios Amoiridis wrote:
> The BM(P/E)28x devices have an option for soft reset which is also
> recommended by the Bosch Sensortech BME2 Sensor API to be used before the
> initial configuration of the device.
...
> +static int bmp280_preinit(struct bmp280_data *data)
> +{
With
struct device *dev = data->dev;
it will look better?
> + unsigned int reg;
> + int ret;
> + ret = regmap_write(data->regmap, BMP280_REG_RESET, BMP280_RST_SOFT_CMD);
> + if (ret)
> + return dev_err_probe(data->dev, ret,
> + "Failed to reset device.\n");
return dev_err_probe(dev, ret, "Failed to reset device.\n");
> + /*
> + * According to the datasheet in Chapter 1: Specification, Table 2,
> + * after resetting, the device uses the complete power-on sequence so
> + * it needs to wait for the defined start-up time.
> + */
> + fsleep(data->start_up_time);
> +
> + ret = regmap_read(data->regmap, BMP280_REG_STATUS, ®);
> + if (ret)
> + return dev_err_probe(data->dev, ret,
> + "Failed to read status register.\n");
return dev_err_probe(dev, ret, "Failed to read status register.\n");
> + if (reg & BMP280_REG_STATUS_IM_UPDATE)
> + return dev_err_probe(data->dev, -EIO,
> + "Failed to copy NVM contents.\n");
return dev_err_probe(dev, -EIO, "Failed to copy NVM contents.\n");
> + return 0;
> +}
Yes, it's up to 84 characters long, but I think it improves readability.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures
2024-08-28 20:51 ` [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures Vasileios Amoiridis
@ 2024-08-29 12:31 ` Andy Shevchenko
2024-08-29 19:13 ` Vasileios Amoiridis
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 12:31 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Wed, Aug 28, 2024 at 10:51:24PM +0200, Vasileios Amoiridis wrote:
> This commit adds forced mode support in sensors BMP28x, BME28x, BMP3xx
s/This commit, adds/Add/
The imperative mode is documented in Submitting Patches.
> and BMP58x. Sensors BMP18x and BMP085 are old and do not support this
> feature so their operation is not affected at all.
>
> Essentially, up to now, the rest of the sensors were used in normal mode
> all the time. This means that they are continuously doing measurements
> even though these measurements are not used. Even though the sensor does
> provide PM support, to cover all the possible use cases, the sensor needs
> to go into sleep mode and wake up whenever necessary.
>
> This commit, adds sleep and forced mode support. Essentially, the sensor
Déjà-vu feeling... Ah, first line is the same!
> sleeps all the time except for when a measurement is requested. When there
> is a request for a measurement, the sensor is put into forced mode, starts
> the measurement and after it is done we read the output and we put it again
> in sleep mode.
>
> For really fast and more deterministic measurements, the triggered buffer
> interface can be used, since the sensor is still used in normal mode for
> that use case.
>
> This commit does not add though support for DEEP STANDBY, Low Power NORMAL
> and CONTINUOUS modes, supported only by the BMP58x version.
...
> +static int bmp280_wait_conv(struct bmp280_data *data)
> +{
> + unsigned int reg;
> + int ret, meas_time;
Why meas_time is signed?
Also, please name it with a unit suffix
unsigned int meas_time_us;
(and check the rest of the patch for the similar).
> +
> +
A single blank line is enough. Also check all patches for this.
> + /* Check if we are using a BME280 device */
> + if (data->oversampling_humid)
> + meas_time += BIT(data->oversampling_humid) * BMP280_MEAS_DUR +
> + BMP280_PRESS_HUMID_MEAS_OFFSET;
Indentation issue, the same seems in all of similar expressions in this patch.
Also play with this form and check if it looks better
meas_time += BMP280_PRESS_HUMID_MEAS_OFFSET +
BIT(data->oversampling_humid) * BMP280_MEAS_DUR;
(at least I found it better to read as first we apply constants, followed by
longer variable-based calculations).
> + /* Pressure measurement time */
> + meas_time += BIT(data->oversampling_press) * BMP280_MEAS_DUR +
> + BMP280_PRESS_HUMID_MEAS_OFFSET;
> +
> + /* Temperature measurement time */
> + meas_time += BIT(data->oversampling_temp) * BMP280_MEAS_DUR;
> +
> + /* Waiting time according to the BM(P/E)2 Sensor API */
> + fsleep(meas_time);
> +
> + ret = regmap_read(data->regmap, BMP280_REG_STATUS, ®);
> + if (ret) {
> + dev_err(data->dev, "failed to read status register\n");
> + return ret;
> + }
> +
> + if (reg & BMP280_REG_STATUS_MEAS_BIT) {
> + dev_err(data->dev, "Measurement cycle didn't complete\n");
> + return -EBUSY;
> + }
> +
> + return 0;
> +}
...
int bmp280_chip_config(struct bmp280_data *data)
> BMP280_OSRS_TEMP_MASK |
> BMP280_OSRS_PRESS_MASK |
> BMP280_MODE_MASK,
> - osrs | BMP280_MODE_NORMAL);
> + osrs | BMP280_MODE_SLEEP);
> if (ret) {
> dev_err(data->dev, "failed to write ctrl_meas register\n");
> return ret;
This _feels_ like a separate change. I haven't found anything explicitly
describing it in the commit message. Did I miss it?
...
> + /*
> + * According to the BMP3 Sensor API, the sensor needs 5000ms
I believe it's a typo in unit suffix.
If not, this should be very well described to explain why 5 seconds is needed.
> + * in order to go to the sleep mode.
> + */
> + fsleep(5000);
...
> +{
> + int ret;
> +
> + switch (mode) {
> + case BMP280_SLEEP:
> + case BMP280_NORMAL:
> + break;
> + case BMP280_FORCED:
> + ret = regmap_set_bits(data->regmap, BMP580_REG_DSP_CONFIG,
> + BMP580_DSP_IIR_FORCED_FLUSH);
> + if (ret) {
> + dev_err(data->dev,
> + "Could not flush IIR filter constants.\n");
Temporary variable for data->dev?
> + return ret;
> + }
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + ret = regmap_write_bits(data->regmap, BMP580_REG_ODR_CONFIG,
> + BMP580_MODE_MASK,
> + FIELD_PREP(BMP580_MODE_MASK,
> + bmp580_operation_mode[mode]));
> + if (ret) {
> + dev_err(data->dev, "failed to write power control register\n");
> + return ret;
> + }
> +
> + data->op_mode = mode;
> +
> + return 0;
> +}
...
> +static int bmp580_wait_conv(struct bmp280_data *data)
> +{
> + /*
> + * Taken from datasheet, Section 2 "Specification, Table 3 "Electrical
> + * characteristics.
> + */
> + static const int time_conv_press[] = {
> + 0, 1050, 1785, 3045, 5670, 10920, 21420, 42420, 84420
> + };
Mind the comma at the end.
And in programming hardware we quite often operate with power-of-2 things, so I
recommend to have 8 per line,
static const int time_conv_press[] = {
0, 1050, 1785, 3045, 5670, 10920, 21420, 42420, /* 0-7 */
84420, /* 8 */
};
> + static const int time_conv_temp[] = {
> + 0, 1050, 1105, 1575, 2205, 3465, 6090, 11340, 21840
> + };
Ditto.
> +
Stray blank line. This is a definition block, we don't need blank lines in it.
> + int meas_time;
> +
> + meas_time = 4 * USEC_PER_MSEC + time_conv_temp[data->oversampling_temp]
> + + time_conv_press[data->oversampling_press];
> +
> + /* Measurement time mentioned in Chapter 2, Table 4 of the datasheet. */
> + fsleep(meas_time);
> +
> + return 0;
> +}
...
> /* From datasheet's table 4: electrical characteristics */
With this change the comment seems odd. Can you elaborate more?
> - usleep_range(2500, 3000);
> + fsleep(data->start_up_time + 500);
Also, can we name it start_up_time_us?
It's fine to postpone renaming if it takes too many unrelated changes.
...
> + usleep_range(2500, 3000);
fsleep()? Comment?
...
> usleep_range(data->start_up_time, data->start_up_time + 100);
This is already in the code, but maybe switching to fsleep() and adding
a comment to explain how it's calculated (based on the spec? Reference?),
so in a separate change?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support
2024-08-28 20:51 ` [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support Vasileios Amoiridis
@ 2024-08-29 12:40 ` Andy Shevchenko
2024-08-29 19:19 ` Vasileios Amoiridis
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 12:40 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Wed, Aug 28, 2024 at 10:51:26PM +0200, Vasileios Amoiridis wrote:
> The BMP3xx and BMP5xx sensors have an interrupt pin which can be used as
> a trigger for when there are data ready in the sensor for pick up.
>
> This use case is used along with NORMAL_MODE in the sensor, which allows
> the sensor to do consecutive measurements depending on the ODR rate value.
>
> The trigger pin can be configured to be open-drain or push-pull and either
> rising or falling edge.
>
> No support is added yet for interrupts for FIFO, WATERMARK and out of range
> values.
> Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
> ---
> drivers/iio/pressure/bmp280-core.c | 231 ++++++++++++++++++++++++++++-
> drivers/iio/pressure/bmp280.h | 21 +++
> 2 files changed, 250 insertions(+), 2 deletions(-)
...
> +static int __bmp280_trigger_probe(struct iio_dev *indio_dev,
> + const struct iio_trigger_ops *trigger_ops,
> + int (*int_config)(struct bmp280_data *data),
> + irq_handler_t irq_thread_handler)
> +{
> + struct bmp280_data *data = iio_priv(indio_dev);
With
struct device *dev = data->dev;
you may shorten some lines below and collapse a few.
> + struct fwnode_handle *fwnode;
> + int ret, irq, irq_type;
Why irq_type is signed?
Also try to make that returned variable is closer to the end of the definition
block. And it might be worth to follow reversed xmas tree order (longer lines
first).
> + struct irq_data *desc;
> +
> + irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
> + if (irq < 0)
> + return dev_err_probe(data->dev, irq, "No interrupt found.\n");
> +
> + desc = irq_get_irq_data(irq);
> + irq_type = irqd_get_trigger_type(desc);
So, altogether it may be written as
irq_type = irqd_get_trigger_type(irq_get_irq_data(irq));
And looking further, we have a helper for that:
irq_get_trigger_type(). Why not use it?
> + switch (irq_type) {
> + case IRQF_TRIGGER_RISING:
> + data->trig_active_high = true;
> + break;
> + case IRQF_TRIGGER_FALLING:
> + data->trig_active_high = false;
> + break;
> + default:
> + return dev_err_probe(data->dev, -EINVAL,
> + "Invalid interrupt type specified.\n");
> + }
> +
> + data->trig_open_drain =
> + fwnode_property_read_bool(fwnode, "int-open-drain");
> +
> + ret = int_config(data);
> + if (ret)
> + return ret;
> +
> + data->trig = devm_iio_trigger_alloc(data->dev, "%s-dev%d",
> + indio_dev->name,
> + iio_device_id(indio_dev));
> + if (!data->trig)
> + return -ENOMEM;
> +
> + data->trig->ops = trigger_ops;
> + iio_trigger_set_drvdata(data->trig, data);
> +
> + ret = devm_request_threaded_irq(data->dev, irq, NULL,
> + irq_thread_handler, IRQF_ONESHOT,
> + indio_dev->name, indio_dev);
> + if (ret)
> + return dev_err_probe(data->dev, ret, "request irq failed.\n");
> +
> + ret = devm_iio_trigger_register(data->dev, data->trig);
> + if (ret)
> + return dev_err_probe(data->dev, ret,
> + "iio trigger register failed.\n");
> +
> + indio_dev->trig = iio_trigger_get(data->trig);
> +
> + return 0;
> +}
...
> +static int bmp380_int_config(struct bmp280_data *data)
> +{
> + int pin_drive_cfg = FIELD_PREP(BMP380_INT_CTRL_OPEN_DRAIN,
> + data->trig_open_drain);
> + int pin_level_cfg = FIELD_PREP(BMP380_INT_CTRL_LEVEL,
> + data->trig_active_high);
> + int ret, int_cfg = pin_drive_cfg | pin_level_cfg;
> +
> + ret = regmap_update_bits(data->regmap, BMP380_REG_INT_CONTROL,
> + BMP380_INT_CTRL_SETTINGS_MASK, int_cfg);
> + if (ret) {
> + dev_err(data->dev, "Could not set interrupt settings\n");
> + return ret;
> + }
> +
> + return ret;
One of them is redundant or the last one should be return 0, but why not just
leave one of them?
> +}
...
> +static int bmp580_int_config(struct bmp280_data *data)
> +{
> + int ret, int_cfg = FIELD_PREP(BMP580_INT_CONFIG_OPEN_DRAIN,
> + data->trig_open_drain) |
> + FIELD_PREP(BMP580_INT_CONFIG_LEVEL,
> + data->trig_active_high);
> +
> + ret = regmap_update_bits(data->regmap, BMP580_REG_INT_CONFIG,
> + BMP580_INT_CONFIG_MASK, int_cfg);
> + if (ret) {
> + dev_err(data->dev, "Could not set interrupt settings\n");
> + return ret;
> + }
> +
> + ret = regmap_set_bits(data->regmap, BMP580_REG_INT_SOURCE,
> + BMP580_INT_SOURCE_DRDY);
> + if (ret) {
> + dev_err(data->dev, "Could not set interrupt source\n");
> + return ret;
> + }
> +
> + return 0;
So far you have three different styles in the same patch for this!
Choose one and be consistent with it.
> +}
...
> + int (*trigger_probe)(struct iio_dev *indio_dev);
> irqreturn_t (*trigger_handler)(int irq, void *p);
Yeah, at some point this can be changed to
irq_handler_t trigger_handler;
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration
2024-08-28 20:51 ` [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration Vasileios Amoiridis
@ 2024-08-29 12:42 ` Andy Shevchenko
2024-08-29 19:20 ` Vasileios Amoiridis
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 12:42 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Wed, Aug 28, 2024 at 10:51:27PM +0200, Vasileios Amoiridis wrote:
> This commit intends to add the old BMP085 sensor to the new IRQ interface
> of the driver for consistence. No functional changes intended.
>
> The BMP085 sensor is equivalent with the BMP180 with the only difference of
> BMP085 having an extra interrupt pin to inform about an End of Conversion.
...
> +static int bmp085_trigger_probe(struct iio_dev *indio_dev)
> {
> + struct bmp280_data *data = iio_priv(indio_dev);
> + struct device *dev = data->dev;
> unsigned long irq_trig;
> - int ret;
> + int ret, irq;
> +
> + irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
You have dev, use it!
> + if (irq < 0)
> + return dev_err_probe(data->dev, irq, "No interrupt found.\n");
Ditto!
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data
2024-08-29 12:06 ` Andy Shevchenko
@ 2024-08-29 18:57 ` Vasileios Amoiridis
0 siblings, 0 replies; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-29 18:57 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Vasileios Amoiridis, jic23, lars, robh, krzk+dt, conor+dt,
ang.iglesiasg, linus.walleij, biju.das.jz, javier.carrasco.cruz,
semen.protsenko, 579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 03:06:14PM +0300, Andy Shevchenko wrote:
> On Wed, Aug 28, 2024 at 10:51:21PM +0200, Vasileios Amoiridis wrote:
> > Convert individual reads to a bulk read for the humidity calibration data.
>
> ...
>
> > + calib->H2 = get_unaligned_le16(&data->bme280_humid_cal_buf[H2]);
> > + calib->H3 = data->bme280_humid_cal_buf[H3];
> > + tmp_1 = get_unaligned_be16(&data->bme280_humid_cal_buf[H4]);
> > + tmp_2 = FIELD_GET(BME280_COMP_H4_GET_MASK_UP, tmp_1);
> > + h4_upper = FIELD_PREP(BME280_COMP_H4_PREP_MASK_UP, tmp_2);
> > + h4_lower = FIELD_GET(BME280_COMP_H4_MASK_LOW,
>
> > + get_unaligned_be16(&data->bme280_humid_cal_buf[H4]));
>
> Either I don't understand the side effects, or this is the same as tmp_1. No?
>
Hi Andy,
Thanks again for taking the time to review this!
This is the same as tmp1, and I didn't notice that I should change it.
Thanks for pointing it out.
Cheers,
Vasilis
> > + calib->H4 = sign_extend32(h4_upper | h4_lower, 11);
> > + calib->H5 = sign_extend32(FIELD_GET(BME280_COMP_H5_MASK,
> > + get_unaligned_le16(&data->bme280_humid_cal_buf[H5])), 11);
> > + calib->H6 = data->bme280_humid_cal_buf[H6];
>
> --
> With Best Regards,
> Andy Shevchenko
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset
2024-08-29 12:10 ` Andy Shevchenko
@ 2024-08-29 19:00 ` Vasileios Amoiridis
2024-08-29 20:18 ` Andy Shevchenko
0 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-29 19:00 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Vasileios Amoiridis, jic23, lars, robh, krzk+dt, conor+dt,
ang.iglesiasg, linus.walleij, biju.das.jz, javier.carrasco.cruz,
semen.protsenko, 579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 03:10:22PM +0300, Andy Shevchenko wrote:
> On Wed, Aug 28, 2024 at 10:51:22PM +0200, Vasileios Amoiridis wrote:
> > The BM(P/E)28x devices have an option for soft reset which is also
> > recommended by the Bosch Sensortech BME2 Sensor API to be used before the
> > initial configuration of the device.
>
> ...
>
> > +static int bmp280_preinit(struct bmp280_data *data)
> > +{
>
> With
>
> struct device *dev = data->dev;
>
> it will look better?
>
Yes, that could be used.
> > + unsigned int reg;
> > + int ret;
>
> > + ret = regmap_write(data->regmap, BMP280_REG_RESET, BMP280_RST_SOFT_CMD);
> > + if (ret)
>
> > + return dev_err_probe(data->dev, ret,
> > + "Failed to reset device.\n");
>
> return dev_err_probe(dev, ret, "Failed to reset device.\n");
>
ACK.
> > + /*
> > + * According to the datasheet in Chapter 1: Specification, Table 2,
> > + * after resetting, the device uses the complete power-on sequence so
> > + * it needs to wait for the defined start-up time.
> > + */
> > + fsleep(data->start_up_time);
> > +
> > + ret = regmap_read(data->regmap, BMP280_REG_STATUS, ®);
> > + if (ret)
>
> > + return dev_err_probe(data->dev, ret,
> > + "Failed to read status register.\n");
>
> return dev_err_probe(dev, ret, "Failed to read status register.\n");
>
ACK.
> > + if (reg & BMP280_REG_STATUS_IM_UPDATE)
>
> > + return dev_err_probe(data->dev, -EIO,
> > + "Failed to copy NVM contents.\n");
>
> return dev_err_probe(dev, -EIO, "Failed to copy NVM contents.\n");
>
ACK.
> > + return 0;
> > +}
>
> Yes, it's up to 84 characters long, but I think it improves readability.
>
In all the previous cases though, shouldn't checkpatch.pl generate errors?
I didn't notice that they were below 80 chars and I never checked more
because checkpatch.pl didn't say anything...
> --
> With Best Regards,
> Andy Shevchenko
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures
2024-08-29 12:31 ` Andy Shevchenko
@ 2024-08-29 19:13 ` Vasileios Amoiridis
2024-08-29 20:26 ` Andy Shevchenko
0 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-29 19:13 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Vasileios Amoiridis, jic23, lars, robh, krzk+dt, conor+dt,
ang.iglesiasg, linus.walleij, biju.das.jz, javier.carrasco.cruz,
semen.protsenko, 579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 03:31:48PM +0300, Andy Shevchenko wrote:
> On Wed, Aug 28, 2024 at 10:51:24PM +0200, Vasileios Amoiridis wrote:
> > This commit adds forced mode support in sensors BMP28x, BME28x, BMP3xx
>
> s/This commit, adds/Add/
>
> The imperative mode is documented in Submitting Patches.
>
> > and BMP58x. Sensors BMP18x and BMP085 are old and do not support this
> > feature so their operation is not affected at all.
> >
> > Essentially, up to now, the rest of the sensors were used in normal mode
> > all the time. This means that they are continuously doing measurements
> > even though these measurements are not used. Even though the sensor does
> > provide PM support, to cover all the possible use cases, the sensor needs
> > to go into sleep mode and wake up whenever necessary.
> >
> > This commit, adds sleep and forced mode support. Essentially, the sensor
>
> Déjà-vu feeling... Ah, first line is the same!
>
I see your point, I can work this out better.
> > sleeps all the time except for when a measurement is requested. When there
> > is a request for a measurement, the sensor is put into forced mode, starts
> > the measurement and after it is done we read the output and we put it again
> > in sleep mode.
> >
> > For really fast and more deterministic measurements, the triggered buffer
> > interface can be used, since the sensor is still used in normal mode for
> > that use case.
> >
> > This commit does not add though support for DEEP STANDBY, Low Power NORMAL
> > and CONTINUOUS modes, supported only by the BMP58x version.
>
> ...
>
> > +static int bmp280_wait_conv(struct bmp280_data *data)
> > +{
> > + unsigned int reg;
>
> > + int ret, meas_time;
>
> Why meas_time is signed?
> Also, please name it with a unit suffix
No reason, I can make it unsigned. Unit suffix is a good addition
indeed!!!
>
> unsigned int meas_time_us;
>
> (and check the rest of the patch for the similar).
>
True, thanks!!!
> > +
> > +
>
> A single blank line is enough. Also check all patches for this.
>
ACK.
> > + /* Check if we are using a BME280 device */
> > + if (data->oversampling_humid)
>
> > + meas_time += BIT(data->oversampling_humid) * BMP280_MEAS_DUR +
> > + BMP280_PRESS_HUMID_MEAS_OFFSET;
>
> Indentation issue, the same seems in all of similar expressions in this patch.
>
It seems I have indentation issues in other places as well.
I think I remember checkpatch.pl informing me about those but I didn't
got anything back...
> Also play with this form and check if it looks better
>
> meas_time += BMP280_PRESS_HUMID_MEAS_OFFSET +
> BIT(data->oversampling_humid) * BMP280_MEAS_DUR;
>
> (at least I found it better to read as first we apply constants, followed by
> longer variable-based calculations).
>
I see your point, I can try it.
> > + /* Pressure measurement time */
> > + meas_time += BIT(data->oversampling_press) * BMP280_MEAS_DUR +
> > + BMP280_PRESS_HUMID_MEAS_OFFSET;
> > +
> > + /* Temperature measurement time */
> > + meas_time += BIT(data->oversampling_temp) * BMP280_MEAS_DUR;
> > +
> > + /* Waiting time according to the BM(P/E)2 Sensor API */
> > + fsleep(meas_time);
> > +
> > + ret = regmap_read(data->regmap, BMP280_REG_STATUS, ®);
> > + if (ret) {
> > + dev_err(data->dev, "failed to read status register\n");
> > + return ret;
> > + }
> > +
> > + if (reg & BMP280_REG_STATUS_MEAS_BIT) {
> > + dev_err(data->dev, "Measurement cycle didn't complete\n");
> > + return -EBUSY;
> > + }
> > +
> > + return 0;
> > +}
>
> ...
>
> int bmp280_chip_config(struct bmp280_data *data)
>
> > BMP280_OSRS_TEMP_MASK |
> > BMP280_OSRS_PRESS_MASK |
> > BMP280_MODE_MASK,
> > - osrs | BMP280_MODE_NORMAL);
> > + osrs | BMP280_MODE_SLEEP);
> > if (ret) {
> > dev_err(data->dev, "failed to write ctrl_meas register\n");
> > return ret;
>
> This _feels_ like a separate change. I haven't found anything explicitly
> describing it in the commit message. Did I miss it?
>
Well this change is because before, the sensor was by default in
NORMAL_MODE so whenever we were writing a different setting (Output
data rate, oversampling ratio) to the sensor, the NORMAL_MODE was
chosen. There was no idea of SLEEP or FORCED MODE.
While now, since this commits adds the idea of SLEEP_MODE
by default (FORCED_MODE for oneshot captures, and NORMAL_MODE for
buffer/trigger) we need to keep the sensor in SLEEP_MODE as well
when we change its configuration.
I believe it belongs to this commit. Maybe though, I should mention
this change explicitly in the commit message?
> ...
>
> > + /*
> > + * According to the BMP3 Sensor API, the sensor needs 5000ms
>
> I believe it's a typo in unit suffix.
>
Yes indeed its a typo, I wanted to say 5000us. The fsleep(5000) is correct.
> If not, this should be very well described to explain why 5 seconds is needed.
>
> > + * in order to go to the sleep mode.
> > + */
> > + fsleep(5000);
>
> ...
>
> > +{
> > + int ret;
> > +
> > + switch (mode) {
> > + case BMP280_SLEEP:
> > + case BMP280_NORMAL:
> > + break;
> > + case BMP280_FORCED:
> > + ret = regmap_set_bits(data->regmap, BMP580_REG_DSP_CONFIG,
> > + BMP580_DSP_IIR_FORCED_FLUSH);
> > + if (ret) {
> > + dev_err(data->dev,
> > + "Could not flush IIR filter constants.\n");
>
> Temporary variable for data->dev?
>
That could help, yeah!
> > + return ret;
> > + }
> > + break;
> > + default:
> > + return -EINVAL;
> > + }
> > +
> > + ret = regmap_write_bits(data->regmap, BMP580_REG_ODR_CONFIG,
> > + BMP580_MODE_MASK,
> > + FIELD_PREP(BMP580_MODE_MASK,
> > + bmp580_operation_mode[mode]));
> > + if (ret) {
> > + dev_err(data->dev, "failed to write power control register\n");
> > + return ret;
> > + }
> > +
> > + data->op_mode = mode;
> > +
> > + return 0;
> > +}
>
> ...
>
> > +static int bmp580_wait_conv(struct bmp280_data *data)
> > +{
> > + /*
> > + * Taken from datasheet, Section 2 "Specification, Table 3 "Electrical
> > + * characteristics.
> > + */
> > + static const int time_conv_press[] = {
> > + 0, 1050, 1785, 3045, 5670, 10920, 21420, 42420, 84420
> > + };
>
> Mind the comma at the end.
>
ACK.
> And in programming hardware we quite often operate with power-of-2 things, so I
> recommend to have 8 per line,
>
> static const int time_conv_press[] = {
> 0, 1050, 1785, 3045, 5670, 10920, 21420, 42420, /* 0-7 */
> 84420, /* 8 */
> };
>
I was not aware of this convention, I can do it.
> > + static const int time_conv_temp[] = {
> > + 0, 1050, 1105, 1575, 2205, 3465, 6090, 11340, 21840
> > + };
>
> Ditto.
>
ACK.
> > +
>
> Stray blank line. This is a definition block, we don't need blank lines in it.
>
ACK.
> > + int meas_time;
> > +
> > + meas_time = 4 * USEC_PER_MSEC + time_conv_temp[data->oversampling_temp]
> > + + time_conv_press[data->oversampling_press];
> > +
> > + /* Measurement time mentioned in Chapter 2, Table 4 of the datasheet. */
> > + fsleep(meas_time);
> > +
> > + return 0;
> > +}
>
> ...
>
> > /* From datasheet's table 4: electrical characteristics */
>
> With this change the comment seems odd. Can you elaborate more?
>
I can elaborate more in the comment yes.
> > - usleep_range(2500, 3000);
> > + fsleep(data->start_up_time + 500);
>
> Also, can we name it start_up_time_us?
> It's fine to postpone renaming if it takes too many unrelated changes.
>
I can maybe do it in a separate commit because you have already pointed
out things that could be improved with styling.
> ...
>
> > + usleep_range(2500, 3000);
>
> fsleep()? Comment?
>
ACK.
> ...
>
> > usleep_range(data->start_up_time, data->start_up_time + 100);
>
> This is already in the code, but maybe switching to fsleep() and adding
> a comment to explain how it's calculated (based on the spec? Reference?),
> so in a separate change?
>
Yes, that would be good!!!
Cheers,
Vasilis
> --
> With Best Regards,
> Andy Shevchenko
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices
2024-08-29 6:06 ` Krzysztof Kozlowski
@ 2024-08-29 19:15 ` Vasileios Amoiridis
0 siblings, 0 replies; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-29 19:15 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Vasileios Amoiridis, jic23, lars, robh, krzk+dt, conor+dt,
andriy.shevchenko, ang.iglesiasg, linus.walleij, biju.das.jz,
javier.carrasco.cruz, semen.protsenko, 579lpy, ak, linux-iio,
devicetree, linux-kernel, christophe.jaillet
On Thu, Aug 29, 2024 at 08:06:07AM +0200, Krzysztof Kozlowski wrote:
> On Wed, Aug 28, 2024 at 10:51:25PM +0200, Vasileios Amoiridis wrote:
> > Add interrupt options for BMP3xx and BMP5xx devices as well.
> >
> > Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
> > ---
> > .../bindings/iio/pressure/bmp085.yaml | 22 ++++++++++++++++++-
> > 1 file changed, 21 insertions(+), 1 deletion(-)
> >
> > diff --git a/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml b/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
> > index 6fda887ee9d4..edf5901c6c87 100644
> > --- a/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
> > +++ b/Documentation/devicetree/bindings/iio/pressure/bmp085.yaml
> > @@ -48,14 +48,34 @@ properties:
> >
> > interrupts:
> > description:
> > - interrupt mapping for IRQ (BMP085 only)
> > + interrupt mapping for IRQ. Supported in BMP085, BMP3xx, BMP5xx
> > maxItems: 1
> >
> > + drive-open-drain:
> > + description:
> > + set if the interrupt pin should be configured as open drain.
> > + If not set, defaults to push-pull configuration.
>
> I don't think you implemented my comment.
>
Hi Krzysztof,
Thanks for you reply!
Indeed, I totally forgot this change, I will do it in next
version. If you see the cover letter I didn't even mention it
there so I totally forgot it...
> > +
> > required:
> > - compatible
> > - vddd-supply
> > - vdda-supply
> >
> > +allOf:
> > + - if:
>
> not:
ACK.
>
> > + properties:
> > + compatible:
> > + enum:
> > + - bosch,bmp085
> > + - bosch,bmp380
> > + - bosch,bmp580
> > + then:
> > + properties:
> > + interrupts: true
> > + else:
>
> so no need for else:.
>
By default this property is considered false?
Cheers,
Vasilis
>
> Best regards,
> Krzysztof
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support
2024-08-29 12:40 ` Andy Shevchenko
@ 2024-08-29 19:19 ` Vasileios Amoiridis
2024-08-31 11:04 ` Jonathan Cameron
0 siblings, 1 reply; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-29 19:19 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Vasileios Amoiridis, jic23, lars, robh, krzk+dt, conor+dt,
ang.iglesiasg, linus.walleij, biju.das.jz, javier.carrasco.cruz,
semen.protsenko, 579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 03:40:34PM +0300, Andy Shevchenko wrote:
> On Wed, Aug 28, 2024 at 10:51:26PM +0200, Vasileios Amoiridis wrote:
> > The BMP3xx and BMP5xx sensors have an interrupt pin which can be used as
> > a trigger for when there are data ready in the sensor for pick up.
> >
> > This use case is used along with NORMAL_MODE in the sensor, which allows
> > the sensor to do consecutive measurements depending on the ODR rate value.
> >
> > The trigger pin can be configured to be open-drain or push-pull and either
> > rising or falling edge.
> >
> > No support is added yet for interrupts for FIFO, WATERMARK and out of range
> > values.
>
> > Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
> > ---
> > drivers/iio/pressure/bmp280-core.c | 231 ++++++++++++++++++++++++++++-
> > drivers/iio/pressure/bmp280.h | 21 +++
> > 2 files changed, 250 insertions(+), 2 deletions(-)
>
> ...
>
> > +static int __bmp280_trigger_probe(struct iio_dev *indio_dev,
> > + const struct iio_trigger_ops *trigger_ops,
> > + int (*int_config)(struct bmp280_data *data),
> > + irq_handler_t irq_thread_handler)
> > +{
> > + struct bmp280_data *data = iio_priv(indio_dev);
>
> With
>
> struct device *dev = data->dev;
>
> you may shorten some lines below and collapse a few.
>
ACK.
> > + struct fwnode_handle *fwnode;
> > + int ret, irq, irq_type;
>
> Why irq_type is signed?
>
True, this can be made u32.
> Also try to make that returned variable is closer to the end of the definition
> block. And it might be worth to follow reversed xmas tree order (longer lines
> first).
>
> > + struct irq_data *desc;
> > +
> > + irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
> > + if (irq < 0)
> > + return dev_err_probe(data->dev, irq, "No interrupt found.\n");
> > +
> > + desc = irq_get_irq_data(irq);
> > + irq_type = irqd_get_trigger_type(desc);
>
> So, altogether it may be written as
>
> irq_type = irqd_get_trigger_type(irq_get_irq_data(irq));
>
> And looking further, we have a helper for that:
> irq_get_trigger_type(). Why not use it?
>
I was not aware of that, I can definitely change it.
> > + switch (irq_type) {
> > + case IRQF_TRIGGER_RISING:
> > + data->trig_active_high = true;
> > + break;
> > + case IRQF_TRIGGER_FALLING:
> > + data->trig_active_high = false;
> > + break;
> > + default:
> > + return dev_err_probe(data->dev, -EINVAL,
> > + "Invalid interrupt type specified.\n");
> > + }
> > +
> > + data->trig_open_drain =
> > + fwnode_property_read_bool(fwnode, "int-open-drain");
> > +
> > + ret = int_config(data);
> > + if (ret)
> > + return ret;
> > +
> > + data->trig = devm_iio_trigger_alloc(data->dev, "%s-dev%d",
> > + indio_dev->name,
> > + iio_device_id(indio_dev));
> > + if (!data->trig)
> > + return -ENOMEM;
> > +
> > + data->trig->ops = trigger_ops;
> > + iio_trigger_set_drvdata(data->trig, data);
> > +
> > + ret = devm_request_threaded_irq(data->dev, irq, NULL,
> > + irq_thread_handler, IRQF_ONESHOT,
> > + indio_dev->name, indio_dev);
> > + if (ret)
> > + return dev_err_probe(data->dev, ret, "request irq failed.\n");
> > +
> > + ret = devm_iio_trigger_register(data->dev, data->trig);
> > + if (ret)
> > + return dev_err_probe(data->dev, ret,
> > + "iio trigger register failed.\n");
> > +
> > + indio_dev->trig = iio_trigger_get(data->trig);
> > +
> > + return 0;
> > +}
>
> ...
>
> > +static int bmp380_int_config(struct bmp280_data *data)
> > +{
> > + int pin_drive_cfg = FIELD_PREP(BMP380_INT_CTRL_OPEN_DRAIN,
> > + data->trig_open_drain);
> > + int pin_level_cfg = FIELD_PREP(BMP380_INT_CTRL_LEVEL,
> > + data->trig_active_high);
> > + int ret, int_cfg = pin_drive_cfg | pin_level_cfg;
> > +
> > + ret = regmap_update_bits(data->regmap, BMP380_REG_INT_CONTROL,
> > + BMP380_INT_CTRL_SETTINGS_MASK, int_cfg);
> > + if (ret) {
> > + dev_err(data->dev, "Could not set interrupt settings\n");
>
> > + return ret;
> > + }
> > +
> > + return ret;
>
> One of them is redundant or the last one should be return 0, but why not just
> leave one of them?
>
I can just leave one of them, true!
> > +}
>
> ...
>
> > +static int bmp580_int_config(struct bmp280_data *data)
> > +{
> > + int ret, int_cfg = FIELD_PREP(BMP580_INT_CONFIG_OPEN_DRAIN,
> > + data->trig_open_drain) |
> > + FIELD_PREP(BMP580_INT_CONFIG_LEVEL,
> > + data->trig_active_high);
> > +
> > + ret = regmap_update_bits(data->regmap, BMP580_REG_INT_CONFIG,
> > + BMP580_INT_CONFIG_MASK, int_cfg);
> > + if (ret) {
> > + dev_err(data->dev, "Could not set interrupt settings\n");
> > + return ret;
> > + }
> > +
> > + ret = regmap_set_bits(data->regmap, BMP580_REG_INT_SOURCE,
> > + BMP580_INT_SOURCE_DRDY);
> > + if (ret) {
> > + dev_err(data->dev, "Could not set interrupt source\n");
> > + return ret;
> > + }
> > +
> > + return 0;
>
> So far you have three different styles in the same patch for this!
> Choose one and be consistent with it.
>
> > +}
>
> ...
>
> > + int (*trigger_probe)(struct iio_dev *indio_dev);
> > irqreturn_t (*trigger_handler)(int irq, void *p);
>
> Yeah, at some point this can be changed to
>
> irq_handler_t trigger_handler;
>
I can definitely try that in a separate patch, thanks for pointing
all these out!
Cheers,
Vasilis
> --
> With Best Regards,
> Andy Shevchenko
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration
2024-08-29 12:42 ` Andy Shevchenko
@ 2024-08-29 19:20 ` Vasileios Amoiridis
0 siblings, 0 replies; 23+ messages in thread
From: Vasileios Amoiridis @ 2024-08-29 19:20 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Vasileios Amoiridis, jic23, lars, robh, krzk+dt, conor+dt,
ang.iglesiasg, linus.walleij, biju.das.jz, javier.carrasco.cruz,
semen.protsenko, 579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 03:42:01PM +0300, Andy Shevchenko wrote:
> On Wed, Aug 28, 2024 at 10:51:27PM +0200, Vasileios Amoiridis wrote:
> > This commit intends to add the old BMP085 sensor to the new IRQ interface
> > of the driver for consistence. No functional changes intended.
> >
> > The BMP085 sensor is equivalent with the BMP180 with the only difference of
> > BMP085 having an extra interrupt pin to inform about an End of Conversion.
>
> ...
>
> > +static int bmp085_trigger_probe(struct iio_dev *indio_dev)
> > {
> > + struct bmp280_data *data = iio_priv(indio_dev);
> > + struct device *dev = data->dev;
> > unsigned long irq_trig;
> > - int ret;
> > + int ret, irq;
> > +
> > + irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
>
> You have dev, use it!
ACK.
>
> > + if (irq < 0)
> > + return dev_err_probe(data->dev, irq, "No interrupt found.\n");
>
> Ditto!
>
ACK.
Thanks again Andy for the review, it's highly appreciated!!!
Cheers,
Vasilis
> --
> With Best Regards,
> Andy Shevchenko
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset
2024-08-29 19:00 ` Vasileios Amoiridis
@ 2024-08-29 20:18 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 20:18 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 09:00:04PM +0200, Vasileios Amoiridis wrote:
> On Thu, Aug 29, 2024 at 03:10:22PM +0300, Andy Shevchenko wrote:
> > On Wed, Aug 28, 2024 at 10:51:22PM +0200, Vasileios Amoiridis wrote:
...
> > Yes, it's up to 84 characters long, but I think it improves readability.
>
> In all the previous cases though, shouldn't checkpatch.pl generate errors?
No, much earlier than 100 characters relaxed limit was introduced, checkpatch
stopped complaining on long string literals.
> I didn't notice that they were below 80 chars and I never checked more
> because checkpatch.pl didn't say anything...
Exactly! This is old (6+ years?) feature.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures
2024-08-29 19:13 ` Vasileios Amoiridis
@ 2024-08-29 20:26 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2024-08-29 20:26 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: jic23, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, Aug 29, 2024 at 09:13:44PM +0200, Vasileios Amoiridis wrote:
> On Thu, Aug 29, 2024 at 03:31:48PM +0300, Andy Shevchenko wrote:
> > On Wed, Aug 28, 2024 at 10:51:24PM +0200, Vasileios Amoiridis wrote:
...
> > int bmp280_chip_config(struct bmp280_data *data)
> >
> > > BMP280_OSRS_TEMP_MASK |
> > > BMP280_OSRS_PRESS_MASK |
> > > BMP280_MODE_MASK,
> > > - osrs | BMP280_MODE_NORMAL);
> > > + osrs | BMP280_MODE_SLEEP);
> > > if (ret) {
> > > dev_err(data->dev, "failed to write ctrl_meas register\n");
> > > return ret;
> >
> > This _feels_ like a separate change. I haven't found anything explicitly
> > describing it in the commit message. Did I miss it?
>
> Well this change is because before, the sensor was by default in
> NORMAL_MODE so whenever we were writing a different setting (Output
> data rate, oversampling ratio) to the sensor, the NORMAL_MODE was
> chosen. There was no idea of SLEEP or FORCED MODE.
>
> While now, since this commits adds the idea of SLEEP_MODE
> by default (FORCED_MODE for oneshot captures, and NORMAL_MODE for
> buffer/trigger) we need to keep the sensor in SLEEP_MODE as well
> when we change its configuration.
>
> I believe it belongs to this commit. Maybe though, I should mention
> this change explicitly in the commit message?
Yes, please.
...
> > And in programming hardware we quite often operate with power-of-2 things, so I
> > recommend to have 8 per line,
> >
> > static const int time_conv_press[] = {
> > 0, 1050, 1785, 3045, 5670, 10920, 21420, 42420, /* 0-7 */
> > 84420, /* 8 */
> > };
>
> I was not aware of this convention, I can do it.
It's rather a common sense to easy maintain this and see exactly how many
(decimal) values are supplied. With hex values we usually make them fixed-width
and hence easier to count (however also makes sense to keep power-of-2 in mind).
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support
2024-08-29 19:19 ` Vasileios Amoiridis
@ 2024-08-31 11:04 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2024-08-31 11:04 UTC (permalink / raw)
To: Vasileios Amoiridis
Cc: Andy Shevchenko, lars, robh, krzk+dt, conor+dt, ang.iglesiasg,
linus.walleij, biju.das.jz, javier.carrasco.cruz, semen.protsenko,
579lpy, ak, linux-iio, devicetree, linux-kernel,
christophe.jaillet
On Thu, 29 Aug 2024 21:19:57 +0200
Vasileios Amoiridis <vassilisamir@gmail.com> wrote:
> On Thu, Aug 29, 2024 at 03:40:34PM +0300, Andy Shevchenko wrote:
> > On Wed, Aug 28, 2024 at 10:51:26PM +0200, Vasileios Amoiridis wrote:
> > > The BMP3xx and BMP5xx sensors have an interrupt pin which can be used as
> > > a trigger for when there are data ready in the sensor for pick up.
> > >
> > > This use case is used along with NORMAL_MODE in the sensor, which allows
> > > the sensor to do consecutive measurements depending on the ODR rate value.
> > >
> > > The trigger pin can be configured to be open-drain or push-pull and either
> > > rising or falling edge.
> > >
> > > No support is added yet for interrupts for FIFO, WATERMARK and out of range
> > > values.
> >
> > > Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
> > > ---
> > > drivers/iio/pressure/bmp280-core.c | 231 ++++++++++++++++++++++++++++-
> > > drivers/iio/pressure/bmp280.h | 21 +++
> > > 2 files changed, 250 insertions(+), 2 deletions(-)
> >
> > ...
> >
> > > +static int __bmp280_trigger_probe(struct iio_dev *indio_dev,
> > > + const struct iio_trigger_ops *trigger_ops,
> > > + int (*int_config)(struct bmp280_data *data),
> > > + irq_handler_t irq_thread_handler)
> > > +{
> > > + struct bmp280_data *data = iio_priv(indio_dev);
> >
> > With
> >
> > struct device *dev = data->dev;
> >
> > you may shorten some lines below and collapse a few.
> >
>
> ACK.
>
> > > + struct fwnode_handle *fwnode;
> > > + int ret, irq, irq_type;
> >
> > Why irq_type is signed?
> >
>
> True, this can be made u32.
>
> > Also try to make that returned variable is closer to the end of the definition
> > block. And it might be worth to follow reversed xmas tree order (longer lines
> > first).
> >
> > > + struct irq_data *desc;
> > > +
> > > + irq = fwnode_irq_get(dev_fwnode(data->dev), 0);
> > > + if (irq < 0)
> > > + return dev_err_probe(data->dev, irq, "No interrupt found.\n");
> > > +
> > > + desc = irq_get_irq_data(irq);
> > > + irq_type = irqd_get_trigger_type(desc);
> >
> > So, altogether it may be written as
> >
> > irq_type = irqd_get_trigger_type(irq_get_irq_data(irq));
> >
> > And looking further, we have a helper for that:
> > irq_get_trigger_type(). Why not use it?
> >
>
> I was not aware of that, I can definitely change it.
Nice. A quick grep suggests a bunch of other places
where this cleanup applies.
Maybe I'll do it this weekend, but if not patches welcome ;)
Jonathan
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2024-08-31 11:04 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-28 20:51 [PATCH v4 0/7] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 1/7] iio: pressure: bmp280: Use bulk read for humidity calibration data Vasileios Amoiridis
2024-08-29 12:06 ` Andy Shevchenko
2024-08-29 18:57 ` Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 2/7] iio: pressure: bmp280: Add support for bmp280 soft reset Vasileios Amoiridis
2024-08-29 12:10 ` Andy Shevchenko
2024-08-29 19:00 ` Vasileios Amoiridis
2024-08-29 20:18 ` Andy Shevchenko
2024-08-28 20:51 ` [PATCH v4 3/7] iio: pressure: bmp280: Remove config error check for IIR filter updates Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 4/7] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures Vasileios Amoiridis
2024-08-29 12:31 ` Andy Shevchenko
2024-08-29 19:13 ` Vasileios Amoiridis
2024-08-29 20:26 ` Andy Shevchenko
2024-08-28 20:51 ` [PATCH v4 5/7] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices Vasileios Amoiridis
2024-08-29 6:06 ` Krzysztof Kozlowski
2024-08-29 19:15 ` Vasileios Amoiridis
2024-08-28 20:51 ` [PATCH v4 6/7] iio: pressure: bmp280: Add data ready trigger support Vasileios Amoiridis
2024-08-29 12:40 ` Andy Shevchenko
2024-08-29 19:19 ` Vasileios Amoiridis
2024-08-31 11:04 ` Jonathan Cameron
2024-08-28 20:51 ` [PATCH v4 7/7] iio: pressure: bmp280: Move bmp085 interrupt to new configuration Vasileios Amoiridis
2024-08-29 12:42 ` Andy Shevchenko
2024-08-29 19:20 ` Vasileios Amoiridis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).