aboutsummaryrefslogtreecommitdiffstats
path: root/queue-6.6/iio-pressure-fixes-bmp38x-and-bmp390-spi-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'queue-6.6/iio-pressure-fixes-bmp38x-and-bmp390-spi-support.patch')
-rw-r--r--queue-6.6/iio-pressure-fixes-bmp38x-and-bmp390-spi-support.patch111
1 files changed, 111 insertions, 0 deletions
diff --git a/queue-6.6/iio-pressure-fixes-bmp38x-and-bmp390-spi-support.patch b/queue-6.6/iio-pressure-fixes-bmp38x-and-bmp390-spi-support.patch
new file mode 100644
index 0000000000..f5ccf0151e
--- /dev/null
+++ b/queue-6.6/iio-pressure-fixes-bmp38x-and-bmp390-spi-support.patch
@@ -0,0 +1,111 @@
+From a9dd9ba323114f366eb07f1d9630822f8df6cbb2 Mon Sep 17 00:00:00 2001
+From: Vasileios Amoiridis <vassilisamir@gmail.com>
+Date: Mon, 19 Feb 2024 20:13:59 +0100
+Subject: iio: pressure: Fixes BMP38x and BMP390 SPI support
+
+From: Vasileios Amoiridis <vassilisamir@gmail.com>
+
+commit a9dd9ba323114f366eb07f1d9630822f8df6cbb2 upstream.
+
+According to the datasheet of BMP38x and BMP390 devices, for an SPI
+read operation the first byte that is returned needs to be dropped,
+and the rest of the bytes are the actual data returned from the
+sensor.
+
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Fixes: 8d329309184d ("iio: pressure: bmp280: Add support for BMP380 sensor family")
+Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
+Acked-by: Angel Iglesias <ang.iglesiasg@gmail.com>
+Link: https://lore.kernel.org/r/20240219191359.18367-1-vassilisamir@gmail.com
+Cc: <Stable@vger.kernel.org>
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/iio/pressure/bmp280-spi.c | 50 +++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 49 insertions(+), 1 deletion(-)
+
+--- a/drivers/iio/pressure/bmp280-spi.c
++++ b/drivers/iio/pressure/bmp280-spi.c
+@@ -4,6 +4,7 @@
+ *
+ * Inspired by the older BMP085 driver drivers/misc/bmp085-spi.c
+ */
++#include <linux/bits.h>
+ #include <linux/module.h>
+ #include <linux/spi/spi.h>
+ #include <linux/err.h>
+@@ -37,6 +38,34 @@ static int bmp280_regmap_spi_read(void *
+ return spi_write_then_read(spi, reg, reg_size, val, val_size);
+ }
+
++static int bmp380_regmap_spi_read(void *context, const void *reg,
++ size_t reg_size, void *val, size_t val_size)
++{
++ struct spi_device *spi = to_spi_device(context);
++ u8 rx_buf[4];
++ ssize_t status;
++
++ /*
++ * Maximum number of consecutive bytes read for a temperature or
++ * pressure measurement is 3.
++ */
++ if (val_size > 3)
++ return -EINVAL;
++
++ /*
++ * According to the BMP3xx datasheets, for a basic SPI read opertion,
++ * the first byte needs to be dropped and the rest are the requested
++ * data.
++ */
++ status = spi_write_then_read(spi, reg, 1, rx_buf, val_size + 1);
++ if (status)
++ return status;
++
++ memcpy(val, rx_buf + 1, val_size);
++
++ return 0;
++}
++
+ static struct regmap_bus bmp280_regmap_bus = {
+ .write = bmp280_regmap_spi_write,
+ .read = bmp280_regmap_spi_read,
+@@ -44,10 +73,19 @@ static struct regmap_bus bmp280_regmap_b
+ .val_format_endian_default = REGMAP_ENDIAN_BIG,
+ };
+
++static struct regmap_bus bmp380_regmap_bus = {
++ .write = bmp280_regmap_spi_write,
++ .read = bmp380_regmap_spi_read,
++ .read_flag_mask = BIT(7),
++ .reg_format_endian_default = REGMAP_ENDIAN_BIG,
++ .val_format_endian_default = REGMAP_ENDIAN_BIG,
++};
++
+ static int bmp280_spi_probe(struct spi_device *spi)
+ {
+ const struct spi_device_id *id = spi_get_device_id(spi);
+ const struct bmp280_chip_info *chip_info;
++ struct regmap_bus *bmp_regmap_bus;
+ struct regmap *regmap;
+ int ret;
+
+@@ -62,8 +100,18 @@ static int bmp280_spi_probe(struct spi_d
+ if (!chip_info)
+ chip_info = (const struct bmp280_chip_info *) id->driver_data;
+
++ switch (chip_info->chip_id[0]) {
++ case BMP380_CHIP_ID:
++ case BMP390_CHIP_ID:
++ bmp_regmap_bus = &bmp380_regmap_bus;
++ break;
++ default:
++ bmp_regmap_bus = &bmp280_regmap_bus;
++ break;
++ }
++
+ regmap = devm_regmap_init(&spi->dev,
+- &bmp280_regmap_bus,
++ bmp_regmap_bus,
+ &spi->dev,
+ chip_info->regmap_config);
+ if (IS_ERR(regmap)) {