* [PATCH v2 0/3] iio: pressure: bmp280: Add support for BMP390
@ 2023-08-23 15:58 Angel Iglesias
2023-08-23 15:58 ` [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids Angel Iglesias
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Angel Iglesias @ 2023-08-23 15:58 UTC (permalink / raw)
To: linux-iio
Cc: linux-kernel, Angel Iglesias, Jonathan Cameron,
Lars-Peter Clausen, Andy Shevchenko
Adds support for the Bosch BMP390 pressure sensors. This new series shares
the regmap present on the BMP380 family of sensors.
Changelog from v1:
- Added patch 1 optimizing data type used to store device ids (from
unsigned integer to unsigned 8-bit integer).
- Enhanced implementation and fixed error string building on patch 2
pointed by Andy Shevchenko <andriy.shevchenko@linux.intel.com>.
- Reorder IDs definitions on shared sensor header file on patch 3.
- Include a link to the datasheet for the bmp390 sensor in patch 3.
Previous versions:
v1:
https://lore.kernel.org/all/cover.1692305434.git.ang.iglesiasg@gmail.com/
Angel Iglesias (3):
iio: pressure: bmp280: Use uint8 to store chip ids
iio: pressure: bmp280: Allow multiple chips id per family of devices
iio: pressure: bmp280: Add support for BMP390
drivers/iio/pressure/bmp280-core.c | 54 ++++++++++++++++++++++++------
drivers/iio/pressure/bmp280.h | 4 ++-
2 files changed, 47 insertions(+), 11 deletions(-)
base-commit: 14b7447cec15ee8dfdfe0da66ba1e280ded7e00a
--
2.42.0
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids 2023-08-23 15:58 [PATCH v2 0/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias @ 2023-08-23 15:58 ` Angel Iglesias 2023-08-23 16:10 ` Andy Shevchenko 2023-08-23 15:58 ` [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 3/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias 2 siblings, 1 reply; 10+ messages in thread From: Angel Iglesias @ 2023-08-23 15:58 UTC (permalink / raw) To: linux-iio Cc: linux-kernel, Angel Iglesias, Jonathan Cameron, Lars-Peter Clausen, Andy Shevchenko Represent the device id reg values using uint8 to optimize memory use. Signed-off-by: Angel Iglesias <ang.iglesiasg@gmail.com> diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h index 5c0563ce7572..ff72e82f55ad 100644 --- a/drivers/iio/pressure/bmp280.h +++ b/drivers/iio/pressure/bmp280.h @@ -418,7 +418,7 @@ struct bmp280_data { struct bmp280_chip_info { unsigned int id_reg; - const unsigned int chip_id; + uint8_t chip_id; const struct regmap_config *regmap_config; -- 2.42.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids 2023-08-23 15:58 ` [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids Angel Iglesias @ 2023-08-23 16:10 ` Andy Shevchenko 2023-08-23 16:17 ` Andy Shevchenko 0 siblings, 1 reply; 10+ messages in thread From: Andy Shevchenko @ 2023-08-23 16:10 UTC (permalink / raw) To: Angel Iglesias Cc: linux-iio, linux-kernel, Jonathan Cameron, Lars-Peter Clausen On Wed, Aug 23, 2023 at 05:58:05PM +0200, Angel Iglesias wrote: > Represent the device id reg values using uint8 to optimize memory use. This doesn't correspond to the code, in the code you used uint8_t. ... > struct bmp280_chip_info { > unsigned int id_reg; > - const unsigned int chip_id; > + uint8_t chip_id; While this will compile and even work properly in kernel we use uXX types, here u8. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids 2023-08-23 16:10 ` Andy Shevchenko @ 2023-08-23 16:17 ` Andy Shevchenko 2023-08-25 9:28 ` Angel Iglesias 0 siblings, 1 reply; 10+ messages in thread From: Andy Shevchenko @ 2023-08-23 16:17 UTC (permalink / raw) To: Angel Iglesias Cc: linux-iio, linux-kernel, Jonathan Cameron, Lars-Peter Clausen On Wed, Aug 23, 2023 at 07:10:33PM +0300, Andy Shevchenko wrote: > On Wed, Aug 23, 2023 at 05:58:05PM +0200, Angel Iglesias wrote: > > Represent the device id reg values using uint8 to optimize memory use. > > This doesn't correspond to the code, in the code you used uint8_t. ... > > struct bmp280_chip_info { > > unsigned int id_reg; > > - const unsigned int chip_id; > > + uint8_t chip_id; > > While this will compile and even work properly in kernel we use uXX types, > here u8. Actually this patch doesn't optimize memory use. The alignment will create a gap anyway. That said, this patch is simply redundant. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids 2023-08-23 16:17 ` Andy Shevchenko @ 2023-08-25 9:28 ` Angel Iglesias 0 siblings, 0 replies; 10+ messages in thread From: Angel Iglesias @ 2023-08-25 9:28 UTC (permalink / raw) To: Andy Shevchenko Cc: linux-iio, linux-kernel, Jonathan Cameron, Lars-Peter Clausen On Wed, 2023-08-23 at 19:17 +0300, Andy Shevchenko wrote: > On Wed, Aug 23, 2023 at 07:10:33PM +0300, Andy Shevchenko wrote: > > On Wed, Aug 23, 2023 at 05:58:05PM +0200, Angel Iglesias wrote: > > > Represent the device id reg values using uint8 to optimize memory use. > > > > This doesn't correspond to the code, in the code you used uint8_t. > > ... > > > > struct bmp280_chip_info { > > > unsigned int id_reg; > > > - const unsigned int chip_id; > > > + uint8_t chip_id; > > > > While this will compile and even work properly in kernel we use uXX types, > > here u8. > > Actually this patch doesn't optimize memory use. The alignment will create > a gap anyway. > > That said, this patch is simply redundant. > OK, I'll drop it on v3 then ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices 2023-08-23 15:58 [PATCH v2 0/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids Angel Iglesias @ 2023-08-23 15:58 ` Angel Iglesias 2023-08-23 16:26 ` Andy Shevchenko 2023-08-23 15:58 ` [PATCH v2 3/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias 2 siblings, 1 reply; 10+ messages in thread From: Angel Iglesias @ 2023-08-23 15:58 UTC (permalink / raw) To: linux-iio Cc: linux-kernel, Angel Iglesias, Jonathan Cameron, Lars-Peter Clausen, Andy Shevchenko Improve device detection in certain chip families known to have various chip ids. Signed-off-by: Angel Iglesias <ang.iglesiasg@gmail.com> diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c index 6089f3f9d8f4..4a544a20d6cb 100644 --- a/drivers/iio/pressure/bmp280-core.c +++ b/drivers/iio/pressure/bmp280-core.c @@ -40,6 +40,7 @@ #include <linux/completion.h> #include <linux/pm_runtime.h> #include <linux/random.h> +#include <linux/overflow.h> #include <asm/unaligned.h> @@ -794,10 +795,12 @@ static int bmp280_chip_config(struct bmp280_data *data) } static const int bmp280_oversampling_avail[] = { 1, 2, 4, 8, 16 }; +static const uint8_t bmp280_chip_ids[] = { BMP280_CHIP_ID }; const struct bmp280_chip_info bmp280_chip_info = { .id_reg = BMP280_REG_ID, - .chip_id = BMP280_CHIP_ID, + .chip_id = bmp280_chip_ids, + .num_chip_id = ARRAY_SIZE(bmp280_chip_ids), .regmap_config = &bmp280_regmap_config, .start_up_time = 2000, .channels = bmp280_channels, @@ -846,9 +849,12 @@ static int bme280_chip_config(struct bmp280_data *data) return bmp280_chip_config(data); } +static const uint8_t bme280_chip_ids[] = { BME280_CHIP_ID }; + const struct bmp280_chip_info bme280_chip_info = { .id_reg = BMP280_REG_ID, - .chip_id = BME280_CHIP_ID, + .chip_id = bme280_chip_ids, + .num_chip_id = ARRAY_SIZE(bme280_chip_ids), .regmap_config = &bmp280_regmap_config, .start_up_time = 2000, .channels = bmp280_channels, @@ -1220,10 +1226,12 @@ static int bmp380_chip_config(struct bmp280_data *data) static const int bmp380_oversampling_avail[] = { 1, 2, 4, 8, 16, 32 }; static const int bmp380_iir_filter_coeffs_avail[] = { 1, 2, 4, 8, 16, 32, 64, 128}; +static const uint8_t bmp380_chip_ids[] = { BMP380_CHIP_ID }; const struct bmp280_chip_info bmp380_chip_info = { .id_reg = BMP380_REG_ID, - .chip_id = BMP380_CHIP_ID, + .chip_id = bmp380_chip_ids, + .num_chip_id = ARRAY_SIZE(bmp380_chip_ids), .regmap_config = &bmp380_regmap_config, .start_up_time = 2000, .channels = bmp380_channels, @@ -1720,10 +1728,12 @@ static int bmp580_chip_config(struct bmp280_data *data) } static const int bmp580_oversampling_avail[] = { 1, 2, 4, 8, 16, 32, 64, 128 }; +static const uint8_t bmp580_chip_ids[] = { BMP580_CHIP_ID, BMP580_CHIP_ID_ALT }; const struct bmp280_chip_info bmp580_chip_info = { .id_reg = BMP580_REG_CHIP_ID, - .chip_id = BMP580_CHIP_ID, + .chip_id = bmp580_chip_ids, + .num_chip_id = ARRAY_SIZE(bmp580_chip_ids), .regmap_config = &bmp580_regmap_config, .start_up_time = 2000, .channels = bmp380_channels, @@ -1983,10 +1993,12 @@ static int bmp180_chip_config(struct bmp280_data *data) static const int bmp180_oversampling_temp_avail[] = { 1 }; static const int bmp180_oversampling_press_avail[] = { 1, 2, 4, 8 }; +static const uint8_t bmp180_chip_ids[] = { BMP180_CHIP_ID }; const struct bmp280_chip_info bmp180_chip_info = { .id_reg = BMP280_REG_ID, - .chip_id = BMP180_CHIP_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, @@ -2077,7 +2089,7 @@ int bmp280_common_probe(struct device *dev, struct bmp280_data *data; struct gpio_desc *gpiod; unsigned int chip_id; - int ret; + int ret, i; indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); if (!indio_dev) @@ -2142,10 +2154,31 @@ int bmp280_common_probe(struct device *dev, ret = regmap_read(regmap, data->chip_info->id_reg, &chip_id); if (ret < 0) return ret; - if (chip_id != data->chip_info->chip_id) { - dev_err(dev, "bad chip id: expected %x got %x\n", - data->chip_info->chip_id, chip_id); - return -EINVAL; + + for (i = 0; i < data->chip_info->num_chip_id; i++) { + if (chip_id == data->chip_info->chip_id[i]) + break; + } + + if (i == data->chip_info->num_chip_id) { + size_t nbuf; + char *buf; + + // 0x<id>, so four chars per number plus one space + ENDL + if (check_mul_overflow(5, data->chip_info->num_chip_id, &nbuf)) + return ret; + + buf = kmalloc_array(nbuf, sizeof(char), GFP_KERNEL); + if (!buf) + return ret; + + for (i = 0; i < data->chip_info->num_chip_id; i++) + snprintf(&buf[i*5], nbuf, "0x%x ", data->chip_info->chip_id[i]); + buf[nbuf-1] = '\0'; + + dev_err(dev, "bad chip id: expected [ %s ] got 0x%x\n", buf, chip_id); + kfree(buf); + return ret; } if (data->chip_info->preinit) { diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h index ff72e82f55ad..c2acc9315223 100644 --- a/drivers/iio/pressure/bmp280.h +++ b/drivers/iio/pressure/bmp280.h @@ -418,7 +418,8 @@ struct bmp280_data { struct bmp280_chip_info { unsigned int id_reg; - uint8_t chip_id; + const uint8_t *chip_id; + int num_chip_id; const struct regmap_config *regmap_config; -- 2.42.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices 2023-08-23 15:58 ` [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices Angel Iglesias @ 2023-08-23 16:26 ` Andy Shevchenko 2023-08-25 9:30 ` Angel Iglesias 0 siblings, 1 reply; 10+ messages in thread From: Andy Shevchenko @ 2023-08-23 16:26 UTC (permalink / raw) To: Angel Iglesias Cc: linux-iio, linux-kernel, Jonathan Cameron, Lars-Peter Clausen On Wed, Aug 23, 2023 at 05:58:06PM +0200, Angel Iglesias wrote: > Improve device detection in certain chip families known to have various > chip ids. IDs ... > #include <linux/completion.h> > #include <linux/pm_runtime.h> > #include <linux/random.h> > +#include <linux/overflow.h> Please, preserve ordering. ... > struct bmp280_data *data; > struct gpio_desc *gpiod; > unsigned int chip_id; > - int ret; > + int ret, i; unsigned int i; ... > + if (i == data->chip_info->num_chip_id) { > + size_t nbuf; > + char *buf; > + > + // 0x<id>, so four chars per number plus one space + ENDL > + if (check_mul_overflow(5, data->chip_info->num_chip_id, &nbuf)) > + return ret; > + > + buf = kmalloc_array(nbuf, sizeof(char), GFP_KERNEL); We almost never do a array allocation for byte sizes. Instead of the above you need to use buf = kmalloc_array(data->chip_info->num_chip_id, 5, GFP_KERNEL); > + if (!buf) This check assumes that num_chip_id is never 0, so... > + return ret; > + > + for (i = 0; i < data->chip_info->num_chip_id; i++) > + snprintf(&buf[i*5], nbuf, "0x%x ", data->chip_info->chip_id[i]); > + buf[nbuf-1] = '\0'; ...this is redundant assignment. sprintf() guarantees the NUL termination. > + > + dev_err(dev, "bad chip id: expected [ %s ] got 0x%x\n", buf, chip_id); "...expected one of..." > + kfree(buf); > + return ret; Oh, I didn't get that you allocated memory only to print a message... > } -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices 2023-08-23 16:26 ` Andy Shevchenko @ 2023-08-25 9:30 ` Angel Iglesias 0 siblings, 0 replies; 10+ messages in thread From: Angel Iglesias @ 2023-08-25 9:30 UTC (permalink / raw) To: Andy Shevchenko Cc: linux-iio, linux-kernel, Jonathan Cameron, Lars-Peter Clausen On Wed, 2023-08-23 at 19:26 +0300, Andy Shevchenko wrote: > On Wed, Aug 23, 2023 at 05:58:06PM +0200, Angel Iglesias wrote: > > Improve device detection in certain chip families known to have various > > chip ids. > > IDs > > ... > > > #include <linux/completion.h> > > #include <linux/pm_runtime.h> > > #include <linux/random.h> > > +#include <linux/overflow.h> > > Please, preserve ordering. > > ... > > > struct bmp280_data *data; > > struct gpio_desc *gpiod; > > unsigned int chip_id; > > - int ret; > > + int ret, i; > > unsigned int i; > > ... > > > + if (i == data->chip_info->num_chip_id) { > > + size_t nbuf; > > + char *buf; > > + > > + // 0x<id>, so four chars per number plus one space + ENDL > > > + if (check_mul_overflow(5, data->chip_info->num_chip_id, > > &nbuf)) > > + return ret; > > + > > + buf = kmalloc_array(nbuf, sizeof(char), GFP_KERNEL); > > We almost never do a array allocation for byte sizes. Instead of the above you > need to use > > buf = kmalloc_array(data->chip_info->num_chip_id, 5, > GFP_KERNEL); > > > + if (!buf) > > This check assumes that num_chip_id is never 0, so... > > > + return ret; > > + > > + for (i = 0; i < data->chip_info->num_chip_id; i++) > > + snprintf(&buf[i*5], nbuf, "0x%x ", data->chip_info- > > >chip_id[i]); > > > + buf[nbuf-1] = '\0'; > > ...this is redundant assignment. sprintf() guarantees the NUL termination. > > > + > > + dev_err(dev, "bad chip id: expected [ %s ] got 0x%x\n", buf, > > chip_id); > > "...expected one of..." > > > + kfree(buf); > > + return ret; > > Oh, I didn't get that you allocated memory only to print a message... Yes, I just wanted to print the known IDs like before in a readable manner. If it is overkill, I'll change it for a more generic error message. > > > } > Kind regards, Angel ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 3/3] iio: pressure: bmp280: Add support for BMP390 2023-08-23 15:58 [PATCH v2 0/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices Angel Iglesias @ 2023-08-23 15:58 ` Angel Iglesias 2023-08-23 16:27 ` Andy Shevchenko 2 siblings, 1 reply; 10+ messages in thread From: Angel Iglesias @ 2023-08-23 15:58 UTC (permalink / raw) To: linux-iio Cc: linux-kernel, Angel Iglesias, Jonathan Cameron, Lars-Peter Clausen, Andy Shevchenko Adds BMP390 device id to the supported ids on bmp380 sensor family Signed-off-by: Angel Iglesias <ang.iglesiasg@gmail.com> diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c index 4a544a20d6cb..d679a5644d16 100644 --- a/drivers/iio/pressure/bmp280-core.c +++ b/drivers/iio/pressure/bmp280-core.c @@ -13,6 +13,7 @@ * https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp280-ds001.pdf * https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf * https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp388-ds001.pdf + * 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 * * Notice: @@ -1226,7 +1227,7 @@ static int bmp380_chip_config(struct bmp280_data *data) static const int bmp380_oversampling_avail[] = { 1, 2, 4, 8, 16, 32 }; static const int bmp380_iir_filter_coeffs_avail[] = { 1, 2, 4, 8, 16, 32, 64, 128}; -static const uint8_t bmp380_chip_ids[] = { BMP380_CHIP_ID }; +static const uint8_t bmp380_chip_ids[] = { BMP380_CHIP_ID, BMP390_CHIP_ID }; const struct bmp280_chip_info bmp380_chip_info = { .id_reg = BMP380_REG_ID, diff --git a/drivers/iio/pressure/bmp280.h b/drivers/iio/pressure/bmp280.h index c2acc9315223..d536e123ef14 100644 --- a/drivers/iio/pressure/bmp280.h +++ b/drivers/iio/pressure/bmp280.h @@ -292,6 +292,7 @@ #define BMP580_CHIP_ID_ALT 0x51 #define BMP180_CHIP_ID 0x55 #define BMP280_CHIP_ID 0x58 +#define BMP390_CHIP_ID 0x60 #define BME280_CHIP_ID 0x60 #define BMP280_SOFT_RESET_VAL 0xB6 -- 2.42.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 3/3] iio: pressure: bmp280: Add support for BMP390 2023-08-23 15:58 ` [PATCH v2 3/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias @ 2023-08-23 16:27 ` Andy Shevchenko 0 siblings, 0 replies; 10+ messages in thread From: Andy Shevchenko @ 2023-08-23 16:27 UTC (permalink / raw) To: Angel Iglesias Cc: linux-iio, linux-kernel, Jonathan Cameron, Lars-Peter Clausen On Wed, Aug 23, 2023 at 05:58:07PM +0200, Angel Iglesias wrote: > Adds BMP390 device id to the supported ids on bmp380 sensor family Add ID IDs -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-08-25 9:31 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-08-23 15:58 [PATCH v2 0/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 1/3] iio: pressure: bmp280: Use uint8 to store chip ids Angel Iglesias 2023-08-23 16:10 ` Andy Shevchenko 2023-08-23 16:17 ` Andy Shevchenko 2023-08-25 9:28 ` Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 2/3] iio: pressure: bmp280: Allow multiple chips id per family of devices Angel Iglesias 2023-08-23 16:26 ` Andy Shevchenko 2023-08-25 9:30 ` Angel Iglesias 2023-08-23 15:58 ` [PATCH v2 3/3] iio: pressure: bmp280: Add support for BMP390 Angel Iglesias 2023-08-23 16:27 ` Andy Shevchenko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox