]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: pressure: bmp280: Add support for bmp280 soft reset
authorVasileios Amoiridis <vassilisamir@gmail.com>
Mon, 2 Sep 2024 18:42:17 +0000 (20:42 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 30 Sep 2024 08:21:02 +0000 (09:21 +0100)
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>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/20240902184222.24874-3-vassilisamir@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/pressure/bmp280-core.c
drivers/iio/pressure/bmp280.h

index 8bea0e48587d31eff06cfb8193f16850d3a93da0..e98d73b56b0f2965c495057e0bf257d9cb73e03d 100644 (file)
@@ -964,6 +964,33 @@ static const unsigned long bme280_avail_scan_masks[] = {
        0
 };
 
+static int bmp280_preinit(struct bmp280_data *data)
+{
+       struct device *dev = data->dev;
+       unsigned int reg;
+       int ret;
+
+       ret = regmap_write(data->regmap, BMP280_REG_RESET, BMP280_RST_SOFT_CMD);
+       if (ret)
+               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, &reg);
+       if (ret)
+               return dev_err_probe(dev, ret, "Failed to read status register.\n");
+
+       if (reg & BMP280_REG_STATUS_IM_UPDATE)
+               return dev_err_probe(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) |
@@ -1080,6 +1107,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,
 };
@@ -1197,6 +1225,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,
 };
index 9bea0b84d2f43da61cc4635225d951cb0bf96c30..a9f220c1f77a700d1ccf1bad9d9e54501ae38c4f 100644 (file)
 #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