linux/drivers/iio/chemical/bme680_core.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Bosch BME680 - Temperature, Pressure, Humidity & Gas Sensor
   4 *
   5 * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
   6 * Copyright (C) 2018 Himanshu Jha <himanshujha199640@gmail.com>
   7 *
   8 * Datasheet:
   9 * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
  10 */
  11#include <linux/acpi.h>
  12#include <linux/bitfield.h>
  13#include <linux/device.h>
  14#include <linux/module.h>
  15#include <linux/log2.h>
  16#include <linux/regmap.h>
  17#include <linux/iio/iio.h>
  18#include <linux/iio/sysfs.h>
  19
  20#include "bme680.h"
  21
  22struct bme680_calib {
  23        u16 par_t1;
  24        s16 par_t2;
  25        s8  par_t3;
  26        u16 par_p1;
  27        s16 par_p2;
  28        s8  par_p3;
  29        s16 par_p4;
  30        s16 par_p5;
  31        s8  par_p6;
  32        s8  par_p7;
  33        s16 par_p8;
  34        s16 par_p9;
  35        u8  par_p10;
  36        u16 par_h1;
  37        u16 par_h2;
  38        s8  par_h3;
  39        s8  par_h4;
  40        s8  par_h5;
  41        s8  par_h6;
  42        s8  par_h7;
  43        s8  par_gh1;
  44        s16 par_gh2;
  45        s8  par_gh3;
  46        u8  res_heat_range;
  47        s8  res_heat_val;
  48        s8  range_sw_err;
  49};
  50
  51struct bme680_data {
  52        struct regmap *regmap;
  53        struct bme680_calib bme680;
  54        u8 oversampling_temp;
  55        u8 oversampling_press;
  56        u8 oversampling_humid;
  57        u16 heater_dur;
  58        u16 heater_temp;
  59        /*
  60         * Carryover value from temperature conversion, used in pressure
  61         * and humidity compensation calculations.
  62         */
  63        s32 t_fine;
  64};
  65
  66static const struct regmap_range bme680_volatile_ranges[] = {
  67        regmap_reg_range(BME680_REG_MEAS_STAT_0, BME680_REG_GAS_R_LSB),
  68        regmap_reg_range(BME680_REG_STATUS, BME680_REG_STATUS),
  69        regmap_reg_range(BME680_T2_LSB_REG, BME680_GH3_REG),
  70};
  71
  72static const struct regmap_access_table bme680_volatile_table = {
  73        .yes_ranges     = bme680_volatile_ranges,
  74        .n_yes_ranges   = ARRAY_SIZE(bme680_volatile_ranges),
  75};
  76
  77const struct regmap_config bme680_regmap_config = {
  78        .reg_bits = 8,
  79        .val_bits = 8,
  80        .max_register = 0xef,
  81        .volatile_table = &bme680_volatile_table,
  82        .cache_type = REGCACHE_RBTREE,
  83};
  84EXPORT_SYMBOL(bme680_regmap_config);
  85
  86static const struct iio_chan_spec bme680_channels[] = {
  87        {
  88                .type = IIO_TEMP,
  89                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
  90                                      BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
  91        },
  92        {
  93                .type = IIO_PRESSURE,
  94                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
  95                                      BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
  96        },
  97        {
  98                .type = IIO_HUMIDITYRELATIVE,
  99                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
 100                                      BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
 101        },
 102        {
 103                .type = IIO_RESISTANCE,
 104                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
 105        },
 106};
 107
 108static int bme680_read_calib(struct bme680_data *data,
 109                             struct bme680_calib *calib)
 110{
 111        struct device *dev = regmap_get_device(data->regmap);
 112        unsigned int tmp, tmp_msb, tmp_lsb;
 113        int ret;
 114        __le16 buf;
 115
 116        /* Temperature related coefficients */
 117        ret = regmap_bulk_read(data->regmap, BME680_T1_LSB_REG,
 118                               &buf, sizeof(buf));
 119        if (ret < 0) {
 120                dev_err(dev, "failed to read BME680_T1_LSB_REG\n");
 121                return ret;
 122        }
 123        calib->par_t1 = le16_to_cpu(buf);
 124
 125        ret = regmap_bulk_read(data->regmap, BME680_T2_LSB_REG,
 126                               &buf, sizeof(buf));
 127        if (ret < 0) {
 128                dev_err(dev, "failed to read BME680_T2_LSB_REG\n");
 129                return ret;
 130        }
 131        calib->par_t2 = le16_to_cpu(buf);
 132
 133        ret = regmap_read(data->regmap, BME680_T3_REG, &tmp);
 134        if (ret < 0) {
 135                dev_err(dev, "failed to read BME680_T3_REG\n");
 136                return ret;
 137        }
 138        calib->par_t3 = tmp;
 139
 140        /* Pressure related coefficients */
 141        ret = regmap_bulk_read(data->regmap, BME680_P1_LSB_REG,
 142                               &buf, sizeof(buf));
 143        if (ret < 0) {
 144                dev_err(dev, "failed to read BME680_P1_LSB_REG\n");
 145                return ret;
 146        }
 147        calib->par_p1 = le16_to_cpu(buf);
 148
 149        ret = regmap_bulk_read(data->regmap, BME680_P2_LSB_REG,
 150                               &buf, sizeof(buf));
 151        if (ret < 0) {
 152                dev_err(dev, "failed to read BME680_P2_LSB_REG\n");
 153                return ret;
 154        }
 155        calib->par_p2 = le16_to_cpu(buf);
 156
 157        ret = regmap_read(data->regmap, BME680_P3_REG, &tmp);
 158        if (ret < 0) {
 159                dev_err(dev, "failed to read BME680_P3_REG\n");
 160                return ret;
 161        }
 162        calib->par_p3 = tmp;
 163
 164        ret = regmap_bulk_read(data->regmap, BME680_P4_LSB_REG,
 165                               &buf, sizeof(buf));
 166        if (ret < 0) {
 167                dev_err(dev, "failed to read BME680_P4_LSB_REG\n");
 168                return ret;
 169        }
 170        calib->par_p4 = le16_to_cpu(buf);
 171
 172        ret = regmap_bulk_read(data->regmap, BME680_P5_LSB_REG,
 173                               &buf, sizeof(buf));
 174        if (ret < 0) {
 175                dev_err(dev, "failed to read BME680_P5_LSB_REG\n");
 176                return ret;
 177        }
 178        calib->par_p5 = le16_to_cpu(buf);
 179
 180        ret = regmap_read(data->regmap, BME680_P6_REG, &tmp);
 181        if (ret < 0) {
 182                dev_err(dev, "failed to read BME680_P6_REG\n");
 183                return ret;
 184        }
 185        calib->par_p6 = tmp;
 186
 187        ret = regmap_read(data->regmap, BME680_P7_REG, &tmp);
 188        if (ret < 0) {
 189                dev_err(dev, "failed to read BME680_P7_REG\n");
 190                return ret;
 191        }
 192        calib->par_p7 = tmp;
 193
 194        ret = regmap_bulk_read(data->regmap, BME680_P8_LSB_REG,
 195                               &buf, sizeof(buf));
 196        if (ret < 0) {
 197                dev_err(dev, "failed to read BME680_P8_LSB_REG\n");
 198                return ret;
 199        }
 200        calib->par_p8 = le16_to_cpu(buf);
 201
 202        ret = regmap_bulk_read(data->regmap, BME680_P9_LSB_REG,
 203                               &buf, sizeof(buf));
 204        if (ret < 0) {
 205                dev_err(dev, "failed to read BME680_P9_LSB_REG\n");
 206                return ret;
 207        }
 208        calib->par_p9 = le16_to_cpu(buf);
 209
 210        ret = regmap_read(data->regmap, BME680_P10_REG, &tmp);
 211        if (ret < 0) {
 212                dev_err(dev, "failed to read BME680_P10_REG\n");
 213                return ret;
 214        }
 215        calib->par_p10 = tmp;
 216
 217        /* Humidity related coefficients */
 218        ret = regmap_read(data->regmap, BME680_H1_MSB_REG, &tmp_msb);
 219        if (ret < 0) {
 220                dev_err(dev, "failed to read BME680_H1_MSB_REG\n");
 221                return ret;
 222        }
 223        ret = regmap_read(data->regmap, BME680_H1_LSB_REG, &tmp_lsb);
 224        if (ret < 0) {
 225                dev_err(dev, "failed to read BME680_H1_LSB_REG\n");
 226                return ret;
 227        }
 228        calib->par_h1 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
 229                        (tmp_lsb & BME680_BIT_H1_DATA_MASK);
 230
 231        ret = regmap_read(data->regmap, BME680_H2_MSB_REG, &tmp_msb);
 232        if (ret < 0) {
 233                dev_err(dev, "failed to read BME680_H2_MSB_REG\n");
 234                return ret;
 235        }
 236        ret = regmap_read(data->regmap, BME680_H2_LSB_REG, &tmp_lsb);
 237        if (ret < 0) {
 238                dev_err(dev, "failed to read BME680_H2_LSB_REG\n");
 239                return ret;
 240        }
 241        calib->par_h2 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
 242                        (tmp_lsb >> BME680_HUM_REG_SHIFT_VAL);
 243
 244        ret = regmap_read(data->regmap, BME680_H3_REG, &tmp);
 245        if (ret < 0) {
 246                dev_err(dev, "failed to read BME680_H3_REG\n");
 247                return ret;
 248        }
 249        calib->par_h3 = tmp;
 250
 251        ret = regmap_read(data->regmap, BME680_H4_REG, &tmp);
 252        if (ret < 0) {
 253                dev_err(dev, "failed to read BME680_H4_REG\n");
 254                return ret;
 255        }
 256        calib->par_h4 = tmp;
 257
 258        ret = regmap_read(data->regmap, BME680_H5_REG, &tmp);
 259        if (ret < 0) {
 260                dev_err(dev, "failed to read BME680_H5_REG\n");
 261                return ret;
 262        }
 263        calib->par_h5 = tmp;
 264
 265        ret = regmap_read(data->regmap, BME680_H6_REG, &tmp);
 266        if (ret < 0) {
 267                dev_err(dev, "failed to read BME680_H6_REG\n");
 268                return ret;
 269        }
 270        calib->par_h6 = tmp;
 271
 272        ret = regmap_read(data->regmap, BME680_H7_REG, &tmp);
 273        if (ret < 0) {
 274                dev_err(dev, "failed to read BME680_H7_REG\n");
 275                return ret;
 276        }
 277        calib->par_h7 = tmp;
 278
 279        /* Gas heater related coefficients */
 280        ret = regmap_read(data->regmap, BME680_GH1_REG, &tmp);
 281        if (ret < 0) {
 282                dev_err(dev, "failed to read BME680_GH1_REG\n");
 283                return ret;
 284        }
 285        calib->par_gh1 = tmp;
 286
 287        ret = regmap_bulk_read(data->regmap, BME680_GH2_LSB_REG,
 288                               &buf, sizeof(buf));
 289        if (ret < 0) {
 290                dev_err(dev, "failed to read BME680_GH2_LSB_REG\n");
 291                return ret;
 292        }
 293        calib->par_gh2 = le16_to_cpu(buf);
 294
 295        ret = regmap_read(data->regmap, BME680_GH3_REG, &tmp);
 296        if (ret < 0) {
 297                dev_err(dev, "failed to read BME680_GH3_REG\n");
 298                return ret;
 299        }
 300        calib->par_gh3 = tmp;
 301
 302        /* Other coefficients */
 303        ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_RANGE, &tmp);
 304        if (ret < 0) {
 305                dev_err(dev, "failed to read resistance heat range\n");
 306                return ret;
 307        }
 308        calib->res_heat_range = FIELD_GET(BME680_RHRANGE_MASK, tmp);
 309
 310        ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_VAL, &tmp);
 311        if (ret < 0) {
 312                dev_err(dev, "failed to read resistance heat value\n");
 313                return ret;
 314        }
 315        calib->res_heat_val = tmp;
 316
 317        ret = regmap_read(data->regmap, BME680_REG_RANGE_SW_ERR, &tmp);
 318        if (ret < 0) {
 319                dev_err(dev, "failed to read range software error\n");
 320                return ret;
 321        }
 322        calib->range_sw_err = FIELD_GET(BME680_RSERROR_MASK, tmp);
 323
 324        return 0;
 325}
 326
 327/*
 328 * Taken from Bosch BME680 API:
 329 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L876
 330 *
 331 * Returns temperature measurement in DegC, resolutions is 0.01 DegC. Therefore,
 332 * output value of "3233" represents 32.33 DegC.
 333 */
 334static s16 bme680_compensate_temp(struct bme680_data *data,
 335                                  s32 adc_temp)
 336{
 337        struct bme680_calib *calib = &data->bme680;
 338        s64 var1, var2, var3;
 339        s16 calc_temp;
 340
 341        /* If the calibration is invalid, attempt to reload it */
 342        if (!calib->par_t2)
 343                bme680_read_calib(data, calib);
 344
 345        var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
 346        var2 = (var1 * calib->par_t2) >> 11;
 347        var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
 348        var3 = (var3 * (calib->par_t3 << 4)) >> 14;
 349        data->t_fine = var2 + var3;
 350        calc_temp = (data->t_fine * 5 + 128) >> 8;
 351
 352        return calc_temp;
 353}
 354
 355/*
 356 * Taken from Bosch BME680 API:
 357 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L896
 358 *
 359 * Returns pressure measurement in Pa. Output value of "97356" represents
 360 * 97356 Pa = 973.56 hPa.
 361 */
 362static u32 bme680_compensate_press(struct bme680_data *data,
 363                                   u32 adc_press)
 364{
 365        struct bme680_calib *calib = &data->bme680;
 366        s32 var1, var2, var3, press_comp;
 367
 368        var1 = (data->t_fine >> 1) - 64000;
 369        var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
 370        var2 = var2 + (var1 * calib->par_p5 << 1);
 371        var2 = (var2 >> 2) + (calib->par_p4 << 16);
 372        var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
 373                        (calib->par_p3 << 5)) >> 3) +
 374                        ((calib->par_p2 * var1) >> 1);
 375        var1 = var1 >> 18;
 376        var1 = ((32768 + var1) * calib->par_p1) >> 15;
 377        press_comp = 1048576 - adc_press;
 378        press_comp = ((press_comp - (var2 >> 12)) * 3125);
 379
 380        if (press_comp >= BME680_MAX_OVERFLOW_VAL)
 381                press_comp = ((press_comp / (u32)var1) << 1);
 382        else
 383                press_comp = ((press_comp << 1) / (u32)var1);
 384
 385        var1 = (calib->par_p9 * (((press_comp >> 3) *
 386                        (press_comp >> 3)) >> 13)) >> 12;
 387        var2 = ((press_comp >> 2) * calib->par_p8) >> 13;
 388        var3 = ((press_comp >> 8) * (press_comp >> 8) *
 389                        (press_comp >> 8) * calib->par_p10) >> 17;
 390
 391        press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
 392
 393        return press_comp;
 394}
 395
 396/*
 397 * Taken from Bosch BME680 API:
 398 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L937
 399 *
 400 * Returns humidity measurement in percent, resolution is 0.001 percent. Output
 401 * value of "43215" represents 43.215 %rH.
 402 */
 403static u32 bme680_compensate_humid(struct bme680_data *data,
 404                                   u16 adc_humid)
 405{
 406        struct bme680_calib *calib = &data->bme680;
 407        s32 var1, var2, var3, var4, var5, var6, temp_scaled, calc_hum;
 408
 409        temp_scaled = (data->t_fine * 5 + 128) >> 8;
 410        var1 = (adc_humid - ((s32) ((s32) calib->par_h1 * 16))) -
 411                (((temp_scaled * (s32) calib->par_h3) / 100) >> 1);
 412        var2 = ((s32) calib->par_h2 *
 413                (((temp_scaled * calib->par_h4) / 100) +
 414                 (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
 415                   >> 6) / 100) + (1 << 14))) >> 10;
 416        var3 = var1 * var2;
 417        var4 = calib->par_h6 << 7;
 418        var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
 419        var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
 420        var6 = (var4 * var5) >> 1;
 421        calc_hum = (((var3 + var6) >> 10) * 1000) >> 12;
 422
 423        calc_hum = clamp(calc_hum, 0, 100000); /* clamp between 0-100 %rH */
 424
 425        return calc_hum;
 426}
 427
 428/*
 429 * Taken from Bosch BME680 API:
 430 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L973
 431 *
 432 * Returns gas measurement in Ohm. Output value of "82986" represent 82986 ohms.
 433 */
 434static u32 bme680_compensate_gas(struct bme680_data *data, u16 gas_res_adc,
 435                                 u8 gas_range)
 436{
 437        struct bme680_calib *calib = &data->bme680;
 438        s64 var1;
 439        u64 var2;
 440        s64 var3;
 441        u32 calc_gas_res;
 442
 443        /* Look up table for the possible gas range values */
 444        const u32 lookupTable[16] = {2147483647u, 2147483647u,
 445                                2147483647u, 2147483647u, 2147483647u,
 446                                2126008810u, 2147483647u, 2130303777u,
 447                                2147483647u, 2147483647u, 2143188679u,
 448                                2136746228u, 2147483647u, 2126008810u,
 449                                2147483647u, 2147483647u};
 450
 451        var1 = ((1340 + (5 * (s64) calib->range_sw_err)) *
 452                        ((s64) lookupTable[gas_range])) >> 16;
 453        var2 = ((gas_res_adc << 15) - 16777216) + var1;
 454        var3 = ((125000 << (15 - gas_range)) * var1) >> 9;
 455        var3 += (var2 >> 1);
 456        calc_gas_res = div64_s64(var3, (s64) var2);
 457
 458        return calc_gas_res;
 459}
 460
 461/*
 462 * Taken from Bosch BME680 API:
 463 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L1002
 464 */
 465static u8 bme680_calc_heater_res(struct bme680_data *data, u16 temp)
 466{
 467        struct bme680_calib *calib = &data->bme680;
 468        s32 var1, var2, var3, var4, var5, heatr_res_x100;
 469        u8 heatr_res;
 470
 471        if (temp > 400) /* Cap temperature */
 472                temp = 400;
 473
 474        var1 = (((s32) BME680_AMB_TEMP * calib->par_gh3) / 1000) * 256;
 475        var2 = (calib->par_gh1 + 784) * (((((calib->par_gh2 + 154009) *
 476                                                temp * 5) / 100)
 477                                                + 3276800) / 10);
 478        var3 = var1 + (var2 / 2);
 479        var4 = (var3 / (calib->res_heat_range + 4));
 480        var5 = 131 * calib->res_heat_val + 65536;
 481        heatr_res_x100 = ((var4 / var5) - 250) * 34;
 482        heatr_res = (heatr_res_x100 + 50) / 100;
 483
 484        return heatr_res;
 485}
 486
 487/*
 488 * Taken from Bosch BME680 API:
 489 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L1188
 490 */
 491static u8 bme680_calc_heater_dur(u16 dur)
 492{
 493        u8 durval, factor = 0;
 494
 495        if (dur >= 0xfc0) {
 496                durval = 0xff; /* Max duration */
 497        } else {
 498                while (dur > 0x3F) {
 499                        dur = dur / 4;
 500                        factor += 1;
 501                }
 502                durval = dur + (factor * 64);
 503        }
 504
 505        return durval;
 506}
 507
 508static int bme680_set_mode(struct bme680_data *data, bool mode)
 509{
 510        struct device *dev = regmap_get_device(data->regmap);
 511        int ret;
 512
 513        if (mode) {
 514                ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
 515                                        BME680_MODE_MASK, BME680_MODE_FORCED);
 516                if (ret < 0)
 517                        dev_err(dev, "failed to set forced mode\n");
 518
 519        } else {
 520                ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
 521                                        BME680_MODE_MASK, BME680_MODE_SLEEP);
 522                if (ret < 0)
 523                        dev_err(dev, "failed to set sleep mode\n");
 524
 525        }
 526
 527        return ret;
 528}
 529
 530static u8 bme680_oversampling_to_reg(u8 val)
 531{
 532        return ilog2(val) + 1;
 533}
 534
 535static int bme680_chip_config(struct bme680_data *data)
 536{
 537        struct device *dev = regmap_get_device(data->regmap);
 538        int ret;
 539        u8 osrs;
 540
 541        osrs = FIELD_PREP(
 542                BME680_OSRS_HUMIDITY_MASK,
 543                bme680_oversampling_to_reg(data->oversampling_humid));
 544        /*
 545         * Highly recommended to set oversampling of humidity before
 546         * temperature/pressure oversampling.
 547         */
 548        ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_HUMIDITY,
 549                                 BME680_OSRS_HUMIDITY_MASK, osrs);
 550        if (ret < 0) {
 551                dev_err(dev, "failed to write ctrl_hum register\n");
 552                return ret;
 553        }
 554
 555        /* IIR filter settings */
 556        ret = regmap_update_bits(data->regmap, BME680_REG_CONFIG,
 557                                 BME680_FILTER_MASK,
 558                                 BME680_FILTER_COEFF_VAL);
 559        if (ret < 0) {
 560                dev_err(dev, "failed to write config register\n");
 561                return ret;
 562        }
 563
 564        osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK,
 565                          bme680_oversampling_to_reg(data->oversampling_temp)) |
 566               FIELD_PREP(BME680_OSRS_PRESS_MASK,
 567                          bme680_oversampling_to_reg(data->oversampling_press));
 568        ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
 569                                BME680_OSRS_TEMP_MASK | BME680_OSRS_PRESS_MASK,
 570                                osrs);
 571        if (ret < 0)
 572                dev_err(dev, "failed to write ctrl_meas register\n");
 573
 574        return ret;
 575}
 576
 577static int bme680_gas_config(struct bme680_data *data)
 578{
 579        struct device *dev = regmap_get_device(data->regmap);
 580        int ret;
 581        u8 heatr_res, heatr_dur;
 582
 583        heatr_res = bme680_calc_heater_res(data, data->heater_temp);
 584
 585        /* set target heater temperature */
 586        ret = regmap_write(data->regmap, BME680_REG_RES_HEAT_0, heatr_res);
 587        if (ret < 0) {
 588                dev_err(dev, "failed to write res_heat_0 register\n");
 589                return ret;
 590        }
 591
 592        heatr_dur = bme680_calc_heater_dur(data->heater_dur);
 593
 594        /* set target heating duration */
 595        ret = regmap_write(data->regmap, BME680_REG_GAS_WAIT_0, heatr_dur);
 596        if (ret < 0) {
 597                dev_err(dev, "failed to write gas_wait_0 register\n");
 598                return ret;
 599        }
 600
 601        /* Enable the gas sensor and select heater profile set-point 0 */
 602        ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_GAS_1,
 603                                 BME680_RUN_GAS_MASK | BME680_NB_CONV_MASK,
 604                                 FIELD_PREP(BME680_RUN_GAS_MASK, 1) |
 605                                 FIELD_PREP(BME680_NB_CONV_MASK, 0));
 606        if (ret < 0)
 607                dev_err(dev, "failed to write ctrl_gas_1 register\n");
 608
 609        return ret;
 610}
 611
 612static int bme680_read_temp(struct bme680_data *data, int *val)
 613{
 614        struct device *dev = regmap_get_device(data->regmap);
 615        int ret;
 616        __be32 tmp = 0;
 617        s32 adc_temp;
 618        s16 comp_temp;
 619
 620        /* set forced mode to trigger measurement */
 621        ret = bme680_set_mode(data, true);
 622        if (ret < 0)
 623                return ret;
 624
 625        ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
 626                               &tmp, 3);
 627        if (ret < 0) {
 628                dev_err(dev, "failed to read temperature\n");
 629                return ret;
 630        }
 631
 632        adc_temp = be32_to_cpu(tmp) >> 12;
 633        if (adc_temp == BME680_MEAS_SKIPPED) {
 634                /* reading was skipped */
 635                dev_err(dev, "reading temperature skipped\n");
 636                return -EINVAL;
 637        }
 638        comp_temp = bme680_compensate_temp(data, adc_temp);
 639        /*
 640         * val might be NULL if we're called by the read_press/read_humid
 641         * routine which is callled to get t_fine value used in
 642         * compensate_press/compensate_humid to get compensated
 643         * pressure/humidity readings.
 644         */
 645        if (val) {
 646                *val = comp_temp * 10; /* Centidegrees to millidegrees */
 647                return IIO_VAL_INT;
 648        }
 649
 650        return ret;
 651}
 652
 653static int bme680_read_press(struct bme680_data *data,
 654                             int *val, int *val2)
 655{
 656        struct device *dev = regmap_get_device(data->regmap);
 657        int ret;
 658        __be32 tmp = 0;
 659        s32 adc_press;
 660
 661        /* Read and compensate temperature to get a reading of t_fine */
 662        ret = bme680_read_temp(data, NULL);
 663        if (ret < 0)
 664                return ret;
 665
 666        ret = regmap_bulk_read(data->regmap, BME680_REG_PRESS_MSB,
 667                               &tmp, 3);
 668        if (ret < 0) {
 669                dev_err(dev, "failed to read pressure\n");
 670                return ret;
 671        }
 672
 673        adc_press = be32_to_cpu(tmp) >> 12;
 674        if (adc_press == BME680_MEAS_SKIPPED) {
 675                /* reading was skipped */
 676                dev_err(dev, "reading pressure skipped\n");
 677                return -EINVAL;
 678        }
 679
 680        *val = bme680_compensate_press(data, adc_press);
 681        *val2 = 100;
 682        return IIO_VAL_FRACTIONAL;
 683}
 684
 685static int bme680_read_humid(struct bme680_data *data,
 686                             int *val, int *val2)
 687{
 688        struct device *dev = regmap_get_device(data->regmap);
 689        int ret;
 690        __be16 tmp = 0;
 691        s32 adc_humidity;
 692        u32 comp_humidity;
 693
 694        /* Read and compensate temperature to get a reading of t_fine */
 695        ret = bme680_read_temp(data, NULL);
 696        if (ret < 0)
 697                return ret;
 698
 699        ret = regmap_bulk_read(data->regmap, BM6880_REG_HUMIDITY_MSB,
 700                               &tmp, sizeof(tmp));
 701        if (ret < 0) {
 702                dev_err(dev, "failed to read humidity\n");
 703                return ret;
 704        }
 705
 706        adc_humidity = be16_to_cpu(tmp);
 707        if (adc_humidity == BME680_MEAS_SKIPPED) {
 708                /* reading was skipped */
 709                dev_err(dev, "reading humidity skipped\n");
 710                return -EINVAL;
 711        }
 712        comp_humidity = bme680_compensate_humid(data, adc_humidity);
 713
 714        *val = comp_humidity;
 715        *val2 = 1000;
 716        return IIO_VAL_FRACTIONAL;
 717}
 718
 719static int bme680_read_gas(struct bme680_data *data,
 720                           int *val)
 721{
 722        struct device *dev = regmap_get_device(data->regmap);
 723        int ret;
 724        __be16 tmp = 0;
 725        unsigned int check;
 726        u16 adc_gas_res;
 727        u8 gas_range;
 728
 729        /* Set heater settings */
 730        ret = bme680_gas_config(data);
 731        if (ret < 0) {
 732                dev_err(dev, "failed to set gas config\n");
 733                return ret;
 734        }
 735
 736        /* set forced mode to trigger measurement */
 737        ret = bme680_set_mode(data, true);
 738        if (ret < 0)
 739                return ret;
 740
 741        ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
 742        if (check & BME680_GAS_MEAS_BIT) {
 743                dev_err(dev, "gas measurement incomplete\n");
 744                return -EBUSY;
 745        }
 746
 747        ret = regmap_read(data->regmap, BME680_REG_GAS_R_LSB, &check);
 748        if (ret < 0) {
 749                dev_err(dev, "failed to read gas_r_lsb register\n");
 750                return ret;
 751        }
 752
 753        /*
 754         * occurs if either the gas heating duration was insuffient
 755         * to reach the target heater temperature or the target
 756         * heater temperature was too high for the heater sink to
 757         * reach.
 758         */
 759        if ((check & BME680_GAS_STAB_BIT) == 0) {
 760                dev_err(dev, "heater failed to reach the target temperature\n");
 761                return -EINVAL;
 762        }
 763
 764        ret = regmap_bulk_read(data->regmap, BME680_REG_GAS_MSB,
 765                               &tmp, sizeof(tmp));
 766        if (ret < 0) {
 767                dev_err(dev, "failed to read gas resistance\n");
 768                return ret;
 769        }
 770
 771        gas_range = check & BME680_GAS_RANGE_MASK;
 772        adc_gas_res = be16_to_cpu(tmp) >> BME680_ADC_GAS_RES_SHIFT;
 773
 774        *val = bme680_compensate_gas(data, adc_gas_res, gas_range);
 775        return IIO_VAL_INT;
 776}
 777
 778static int bme680_read_raw(struct iio_dev *indio_dev,
 779                           struct iio_chan_spec const *chan,
 780                           int *val, int *val2, long mask)
 781{
 782        struct bme680_data *data = iio_priv(indio_dev);
 783
 784        switch (mask) {
 785        case IIO_CHAN_INFO_PROCESSED:
 786                switch (chan->type) {
 787                case IIO_TEMP:
 788                        return bme680_read_temp(data, val);
 789                case IIO_PRESSURE:
 790                        return bme680_read_press(data, val, val2);
 791                case IIO_HUMIDITYRELATIVE:
 792                        return bme680_read_humid(data, val, val2);
 793                case IIO_RESISTANCE:
 794                        return bme680_read_gas(data, val);
 795                default:
 796                        return -EINVAL;
 797                }
 798        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
 799                switch (chan->type) {
 800                case IIO_TEMP:
 801                        *val = data->oversampling_temp;
 802                        return IIO_VAL_INT;
 803                case IIO_PRESSURE:
 804                        *val = data->oversampling_press;
 805                        return IIO_VAL_INT;
 806                case IIO_HUMIDITYRELATIVE:
 807                        *val = data->oversampling_humid;
 808                        return IIO_VAL_INT;
 809                default:
 810                        return -EINVAL;
 811                }
 812        default:
 813                return -EINVAL;
 814        }
 815}
 816
 817static bool bme680_is_valid_oversampling(int rate)
 818{
 819        return (rate > 0 && rate <= 16 && is_power_of_2(rate));
 820}
 821
 822static int bme680_write_raw(struct iio_dev *indio_dev,
 823                            struct iio_chan_spec const *chan,
 824                            int val, int val2, long mask)
 825{
 826        struct bme680_data *data = iio_priv(indio_dev);
 827
 828        if (val2 != 0)
 829                return -EINVAL;
 830
 831        switch (mask) {
 832        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
 833        {
 834                if (!bme680_is_valid_oversampling(val))
 835                        return -EINVAL;
 836
 837                switch (chan->type) {
 838                case IIO_TEMP:
 839                        data->oversampling_temp = val;
 840                        break;
 841                case IIO_PRESSURE:
 842                        data->oversampling_press = val;
 843                        break;
 844                case IIO_HUMIDITYRELATIVE:
 845                        data->oversampling_humid = val;
 846                        break;
 847                default:
 848                        return -EINVAL;
 849                }
 850
 851                return bme680_chip_config(data);
 852        }
 853        default:
 854                return -EINVAL;
 855        }
 856}
 857
 858static const char bme680_oversampling_ratio_show[] = "1 2 4 8 16";
 859
 860static IIO_CONST_ATTR(oversampling_ratio_available,
 861                      bme680_oversampling_ratio_show);
 862
 863static struct attribute *bme680_attributes[] = {
 864        &iio_const_attr_oversampling_ratio_available.dev_attr.attr,
 865        NULL,
 866};
 867
 868static const struct attribute_group bme680_attribute_group = {
 869        .attrs = bme680_attributes,
 870};
 871
 872static const struct iio_info bme680_info = {
 873        .read_raw = &bme680_read_raw,
 874        .write_raw = &bme680_write_raw,
 875        .attrs = &bme680_attribute_group,
 876};
 877
 878static const char *bme680_match_acpi_device(struct device *dev)
 879{
 880        const struct acpi_device_id *id;
 881
 882        id = acpi_match_device(dev->driver->acpi_match_table, dev);
 883        if (!id)
 884                return NULL;
 885
 886        return dev_name(dev);
 887}
 888
 889int bme680_core_probe(struct device *dev, struct regmap *regmap,
 890                      const char *name)
 891{
 892        struct iio_dev *indio_dev;
 893        struct bme680_data *data;
 894        unsigned int val;
 895        int ret;
 896
 897        ret = regmap_write(regmap, BME680_REG_SOFT_RESET,
 898                           BME680_CMD_SOFTRESET);
 899        if (ret < 0) {
 900                dev_err(dev, "Failed to reset chip\n");
 901                return ret;
 902        }
 903
 904        ret = regmap_read(regmap, BME680_REG_CHIP_ID, &val);
 905        if (ret < 0) {
 906                dev_err(dev, "Error reading chip ID\n");
 907                return ret;
 908        }
 909
 910        if (val != BME680_CHIP_ID_VAL) {
 911                dev_err(dev, "Wrong chip ID, got %x expected %x\n",
 912                                val, BME680_CHIP_ID_VAL);
 913                return -ENODEV;
 914        }
 915
 916        indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
 917        if (!indio_dev)
 918                return -ENOMEM;
 919
 920        if (!name && ACPI_HANDLE(dev))
 921                name = bme680_match_acpi_device(dev);
 922
 923        data = iio_priv(indio_dev);
 924        dev_set_drvdata(dev, indio_dev);
 925        data->regmap = regmap;
 926        indio_dev->name = name;
 927        indio_dev->channels = bme680_channels;
 928        indio_dev->num_channels = ARRAY_SIZE(bme680_channels);
 929        indio_dev->info = &bme680_info;
 930        indio_dev->modes = INDIO_DIRECT_MODE;
 931
 932        /* default values for the sensor */
 933        data->oversampling_humid = 2; /* 2X oversampling rate */
 934        data->oversampling_press = 4; /* 4X oversampling rate */
 935        data->oversampling_temp = 8;  /* 8X oversampling rate */
 936        data->heater_temp = 320; /* degree Celsius */
 937        data->heater_dur = 150;  /* milliseconds */
 938
 939        ret = bme680_chip_config(data);
 940        if (ret < 0) {
 941                dev_err(dev, "failed to set chip_config data\n");
 942                return ret;
 943        }
 944
 945        ret = bme680_gas_config(data);
 946        if (ret < 0) {
 947                dev_err(dev, "failed to set gas config data\n");
 948                return ret;
 949        }
 950
 951        ret = bme680_read_calib(data, &data->bme680);
 952        if (ret < 0) {
 953                dev_err(dev,
 954                        "failed to read calibration coefficients at probe\n");
 955                return ret;
 956        }
 957
 958        return devm_iio_device_register(dev, indio_dev);
 959}
 960EXPORT_SYMBOL_GPL(bme680_core_probe);
 961
 962MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");
 963MODULE_DESCRIPTION("Bosch BME680 Driver");
 964MODULE_LICENSE("GPL v2");
 965