diff options
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.patch | 111 |
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)) { |