]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: pressure: bmp280: Use bulk read for humidity calibration data
authorVasileios Amoiridis <vassilisamir@gmail.com>
Mon, 2 Sep 2024 18:42:16 +0000 (20:42 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 30 Sep 2024 08:21:01 +0000 (09:21 +0100)
Convert individual reads to a bulk read for the humidity calibration data.

Signed-off-by: Vasileios Amoiridis <vassilisamir@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/20240902184222.24874-2-vassilisamir@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/pressure/bmp280-core.c
drivers/iio/pressure/bmp280.h

index b156dd763cf31de08d182a54bdf3120ab29ce9f2..8bea0e48587d31eff06cfb8193f16850d3a93da0 100644 (file)
@@ -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, tmp_3;
        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,23 @@ 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, tmp_1);
+       calib->H4 = sign_extend32(h4_upper | h4_lower, 11);
+       tmp_3 = get_unaligned_le16(&data->bme280_humid_cal_buf[H5]);
+       calib->H5 = sign_extend32(FIELD_GET(BME280_COMP_H5_MASK, tmp_3), 11);
+       calib->H6 = data->bme280_humid_cal_buf[H6];
 
        return 0;
 }
index ccacc67c1473115d4787d8850832960210d38117..9bea0b84d2f43da61cc4635225d951cb0bf96c30 100644 (file)
 #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
@@ -423,6 +428,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;