0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/acpi.h>
0012 #include <linux/bitfield.h>
0013 #include <linux/device.h>
0014 #include <linux/module.h>
0015 #include <linux/log2.h>
0016 #include <linux/regmap.h>
0017 #include <linux/iio/iio.h>
0018 #include <linux/iio/sysfs.h>
0019
0020 #include "bme680.h"
0021
0022 struct bme680_calib {
0023 u16 par_t1;
0024 s16 par_t2;
0025 s8 par_t3;
0026 u16 par_p1;
0027 s16 par_p2;
0028 s8 par_p3;
0029 s16 par_p4;
0030 s16 par_p5;
0031 s8 par_p6;
0032 s8 par_p7;
0033 s16 par_p8;
0034 s16 par_p9;
0035 u8 par_p10;
0036 u16 par_h1;
0037 u16 par_h2;
0038 s8 par_h3;
0039 s8 par_h4;
0040 s8 par_h5;
0041 s8 par_h6;
0042 s8 par_h7;
0043 s8 par_gh1;
0044 s16 par_gh2;
0045 s8 par_gh3;
0046 u8 res_heat_range;
0047 s8 res_heat_val;
0048 s8 range_sw_err;
0049 };
0050
0051 struct bme680_data {
0052 struct regmap *regmap;
0053 struct bme680_calib bme680;
0054 u8 oversampling_temp;
0055 u8 oversampling_press;
0056 u8 oversampling_humid;
0057 u16 heater_dur;
0058 u16 heater_temp;
0059
0060
0061
0062
0063 s32 t_fine;
0064 };
0065
0066 static const struct regmap_range bme680_volatile_ranges[] = {
0067 regmap_reg_range(BME680_REG_MEAS_STAT_0, BME680_REG_GAS_R_LSB),
0068 regmap_reg_range(BME680_REG_STATUS, BME680_REG_STATUS),
0069 regmap_reg_range(BME680_T2_LSB_REG, BME680_GH3_REG),
0070 };
0071
0072 static const struct regmap_access_table bme680_volatile_table = {
0073 .yes_ranges = bme680_volatile_ranges,
0074 .n_yes_ranges = ARRAY_SIZE(bme680_volatile_ranges),
0075 };
0076
0077 const struct regmap_config bme680_regmap_config = {
0078 .reg_bits = 8,
0079 .val_bits = 8,
0080 .max_register = 0xef,
0081 .volatile_table = &bme680_volatile_table,
0082 .cache_type = REGCACHE_RBTREE,
0083 };
0084 EXPORT_SYMBOL_NS(bme680_regmap_config, IIO_BME680);
0085
0086 static const struct iio_chan_spec bme680_channels[] = {
0087 {
0088 .type = IIO_TEMP,
0089 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
0090 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
0091 },
0092 {
0093 .type = IIO_PRESSURE,
0094 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
0095 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
0096 },
0097 {
0098 .type = IIO_HUMIDITYRELATIVE,
0099 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
0100 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
0101 },
0102 {
0103 .type = IIO_RESISTANCE,
0104 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
0105 },
0106 };
0107
0108 static int bme680_read_calib(struct bme680_data *data,
0109 struct bme680_calib *calib)
0110 {
0111 struct device *dev = regmap_get_device(data->regmap);
0112 unsigned int tmp, tmp_msb, tmp_lsb;
0113 int ret;
0114 __le16 buf;
0115
0116
0117 ret = regmap_bulk_read(data->regmap, BME680_T1_LSB_REG,
0118 &buf, sizeof(buf));
0119 if (ret < 0) {
0120 dev_err(dev, "failed to read BME680_T1_LSB_REG\n");
0121 return ret;
0122 }
0123 calib->par_t1 = le16_to_cpu(buf);
0124
0125 ret = regmap_bulk_read(data->regmap, BME680_T2_LSB_REG,
0126 &buf, sizeof(buf));
0127 if (ret < 0) {
0128 dev_err(dev, "failed to read BME680_T2_LSB_REG\n");
0129 return ret;
0130 }
0131 calib->par_t2 = le16_to_cpu(buf);
0132
0133 ret = regmap_read(data->regmap, BME680_T3_REG, &tmp);
0134 if (ret < 0) {
0135 dev_err(dev, "failed to read BME680_T3_REG\n");
0136 return ret;
0137 }
0138 calib->par_t3 = tmp;
0139
0140
0141 ret = regmap_bulk_read(data->regmap, BME680_P1_LSB_REG,
0142 &buf, sizeof(buf));
0143 if (ret < 0) {
0144 dev_err(dev, "failed to read BME680_P1_LSB_REG\n");
0145 return ret;
0146 }
0147 calib->par_p1 = le16_to_cpu(buf);
0148
0149 ret = regmap_bulk_read(data->regmap, BME680_P2_LSB_REG,
0150 &buf, sizeof(buf));
0151 if (ret < 0) {
0152 dev_err(dev, "failed to read BME680_P2_LSB_REG\n");
0153 return ret;
0154 }
0155 calib->par_p2 = le16_to_cpu(buf);
0156
0157 ret = regmap_read(data->regmap, BME680_P3_REG, &tmp);
0158 if (ret < 0) {
0159 dev_err(dev, "failed to read BME680_P3_REG\n");
0160 return ret;
0161 }
0162 calib->par_p3 = tmp;
0163
0164 ret = regmap_bulk_read(data->regmap, BME680_P4_LSB_REG,
0165 &buf, sizeof(buf));
0166 if (ret < 0) {
0167 dev_err(dev, "failed to read BME680_P4_LSB_REG\n");
0168 return ret;
0169 }
0170 calib->par_p4 = le16_to_cpu(buf);
0171
0172 ret = regmap_bulk_read(data->regmap, BME680_P5_LSB_REG,
0173 &buf, sizeof(buf));
0174 if (ret < 0) {
0175 dev_err(dev, "failed to read BME680_P5_LSB_REG\n");
0176 return ret;
0177 }
0178 calib->par_p5 = le16_to_cpu(buf);
0179
0180 ret = regmap_read(data->regmap, BME680_P6_REG, &tmp);
0181 if (ret < 0) {
0182 dev_err(dev, "failed to read BME680_P6_REG\n");
0183 return ret;
0184 }
0185 calib->par_p6 = tmp;
0186
0187 ret = regmap_read(data->regmap, BME680_P7_REG, &tmp);
0188 if (ret < 0) {
0189 dev_err(dev, "failed to read BME680_P7_REG\n");
0190 return ret;
0191 }
0192 calib->par_p7 = tmp;
0193
0194 ret = regmap_bulk_read(data->regmap, BME680_P8_LSB_REG,
0195 &buf, sizeof(buf));
0196 if (ret < 0) {
0197 dev_err(dev, "failed to read BME680_P8_LSB_REG\n");
0198 return ret;
0199 }
0200 calib->par_p8 = le16_to_cpu(buf);
0201
0202 ret = regmap_bulk_read(data->regmap, BME680_P9_LSB_REG,
0203 &buf, sizeof(buf));
0204 if (ret < 0) {
0205 dev_err(dev, "failed to read BME680_P9_LSB_REG\n");
0206 return ret;
0207 }
0208 calib->par_p9 = le16_to_cpu(buf);
0209
0210 ret = regmap_read(data->regmap, BME680_P10_REG, &tmp);
0211 if (ret < 0) {
0212 dev_err(dev, "failed to read BME680_P10_REG\n");
0213 return ret;
0214 }
0215 calib->par_p10 = tmp;
0216
0217
0218 ret = regmap_read(data->regmap, BME680_H1_MSB_REG, &tmp_msb);
0219 if (ret < 0) {
0220 dev_err(dev, "failed to read BME680_H1_MSB_REG\n");
0221 return ret;
0222 }
0223 ret = regmap_read(data->regmap, BME680_H1_LSB_REG, &tmp_lsb);
0224 if (ret < 0) {
0225 dev_err(dev, "failed to read BME680_H1_LSB_REG\n");
0226 return ret;
0227 }
0228 calib->par_h1 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
0229 (tmp_lsb & BME680_BIT_H1_DATA_MASK);
0230
0231 ret = regmap_read(data->regmap, BME680_H2_MSB_REG, &tmp_msb);
0232 if (ret < 0) {
0233 dev_err(dev, "failed to read BME680_H2_MSB_REG\n");
0234 return ret;
0235 }
0236 ret = regmap_read(data->regmap, BME680_H2_LSB_REG, &tmp_lsb);
0237 if (ret < 0) {
0238 dev_err(dev, "failed to read BME680_H2_LSB_REG\n");
0239 return ret;
0240 }
0241 calib->par_h2 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
0242 (tmp_lsb >> BME680_HUM_REG_SHIFT_VAL);
0243
0244 ret = regmap_read(data->regmap, BME680_H3_REG, &tmp);
0245 if (ret < 0) {
0246 dev_err(dev, "failed to read BME680_H3_REG\n");
0247 return ret;
0248 }
0249 calib->par_h3 = tmp;
0250
0251 ret = regmap_read(data->regmap, BME680_H4_REG, &tmp);
0252 if (ret < 0) {
0253 dev_err(dev, "failed to read BME680_H4_REG\n");
0254 return ret;
0255 }
0256 calib->par_h4 = tmp;
0257
0258 ret = regmap_read(data->regmap, BME680_H5_REG, &tmp);
0259 if (ret < 0) {
0260 dev_err(dev, "failed to read BME680_H5_REG\n");
0261 return ret;
0262 }
0263 calib->par_h5 = tmp;
0264
0265 ret = regmap_read(data->regmap, BME680_H6_REG, &tmp);
0266 if (ret < 0) {
0267 dev_err(dev, "failed to read BME680_H6_REG\n");
0268 return ret;
0269 }
0270 calib->par_h6 = tmp;
0271
0272 ret = regmap_read(data->regmap, BME680_H7_REG, &tmp);
0273 if (ret < 0) {
0274 dev_err(dev, "failed to read BME680_H7_REG\n");
0275 return ret;
0276 }
0277 calib->par_h7 = tmp;
0278
0279
0280 ret = regmap_read(data->regmap, BME680_GH1_REG, &tmp);
0281 if (ret < 0) {
0282 dev_err(dev, "failed to read BME680_GH1_REG\n");
0283 return ret;
0284 }
0285 calib->par_gh1 = tmp;
0286
0287 ret = regmap_bulk_read(data->regmap, BME680_GH2_LSB_REG,
0288 &buf, sizeof(buf));
0289 if (ret < 0) {
0290 dev_err(dev, "failed to read BME680_GH2_LSB_REG\n");
0291 return ret;
0292 }
0293 calib->par_gh2 = le16_to_cpu(buf);
0294
0295 ret = regmap_read(data->regmap, BME680_GH3_REG, &tmp);
0296 if (ret < 0) {
0297 dev_err(dev, "failed to read BME680_GH3_REG\n");
0298 return ret;
0299 }
0300 calib->par_gh3 = tmp;
0301
0302
0303 ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_RANGE, &tmp);
0304 if (ret < 0) {
0305 dev_err(dev, "failed to read resistance heat range\n");
0306 return ret;
0307 }
0308 calib->res_heat_range = FIELD_GET(BME680_RHRANGE_MASK, tmp);
0309
0310 ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_VAL, &tmp);
0311 if (ret < 0) {
0312 dev_err(dev, "failed to read resistance heat value\n");
0313 return ret;
0314 }
0315 calib->res_heat_val = tmp;
0316
0317 ret = regmap_read(data->regmap, BME680_REG_RANGE_SW_ERR, &tmp);
0318 if (ret < 0) {
0319 dev_err(dev, "failed to read range software error\n");
0320 return ret;
0321 }
0322 calib->range_sw_err = FIELD_GET(BME680_RSERROR_MASK, tmp);
0323
0324 return 0;
0325 }
0326
0327
0328
0329
0330
0331
0332
0333
0334 static s16 bme680_compensate_temp(struct bme680_data *data,
0335 s32 adc_temp)
0336 {
0337 struct bme680_calib *calib = &data->bme680;
0338 s64 var1, var2, var3;
0339 s16 calc_temp;
0340
0341
0342 if (!calib->par_t2)
0343 bme680_read_calib(data, calib);
0344
0345 var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
0346 var2 = (var1 * calib->par_t2) >> 11;
0347 var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
0348 var3 = (var3 * (calib->par_t3 << 4)) >> 14;
0349 data->t_fine = var2 + var3;
0350 calc_temp = (data->t_fine * 5 + 128) >> 8;
0351
0352 return calc_temp;
0353 }
0354
0355
0356
0357
0358
0359
0360
0361
0362 static u32 bme680_compensate_press(struct bme680_data *data,
0363 u32 adc_press)
0364 {
0365 struct bme680_calib *calib = &data->bme680;
0366 s32 var1, var2, var3, press_comp;
0367
0368 var1 = (data->t_fine >> 1) - 64000;
0369 var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
0370 var2 = var2 + (var1 * calib->par_p5 << 1);
0371 var2 = (var2 >> 2) + (calib->par_p4 << 16);
0372 var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
0373 (calib->par_p3 << 5)) >> 3) +
0374 ((calib->par_p2 * var1) >> 1);
0375 var1 = var1 >> 18;
0376 var1 = ((32768 + var1) * calib->par_p1) >> 15;
0377 press_comp = 1048576 - adc_press;
0378 press_comp = ((press_comp - (var2 >> 12)) * 3125);
0379
0380 if (press_comp >= BME680_MAX_OVERFLOW_VAL)
0381 press_comp = ((press_comp / (u32)var1) << 1);
0382 else
0383 press_comp = ((press_comp << 1) / (u32)var1);
0384
0385 var1 = (calib->par_p9 * (((press_comp >> 3) *
0386 (press_comp >> 3)) >> 13)) >> 12;
0387 var2 = ((press_comp >> 2) * calib->par_p8) >> 13;
0388 var3 = ((press_comp >> 8) * (press_comp >> 8) *
0389 (press_comp >> 8) * calib->par_p10) >> 17;
0390
0391 press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
0392
0393 return press_comp;
0394 }
0395
0396
0397
0398
0399
0400
0401
0402
0403 static u32 bme680_compensate_humid(struct bme680_data *data,
0404 u16 adc_humid)
0405 {
0406 struct bme680_calib *calib = &data->bme680;
0407 s32 var1, var2, var3, var4, var5, var6, temp_scaled, calc_hum;
0408
0409 temp_scaled = (data->t_fine * 5 + 128) >> 8;
0410 var1 = (adc_humid - ((s32) ((s32) calib->par_h1 * 16))) -
0411 (((temp_scaled * (s32) calib->par_h3) / 100) >> 1);
0412 var2 = ((s32) calib->par_h2 *
0413 (((temp_scaled * calib->par_h4) / 100) +
0414 (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
0415 >> 6) / 100) + (1 << 14))) >> 10;
0416 var3 = var1 * var2;
0417 var4 = calib->par_h6 << 7;
0418 var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
0419 var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
0420 var6 = (var4 * var5) >> 1;
0421 calc_hum = (((var3 + var6) >> 10) * 1000) >> 12;
0422
0423 calc_hum = clamp(calc_hum, 0, 100000);
0424
0425 return calc_hum;
0426 }
0427
0428
0429
0430
0431
0432
0433
0434 static u32 bme680_compensate_gas(struct bme680_data *data, u16 gas_res_adc,
0435 u8 gas_range)
0436 {
0437 struct bme680_calib *calib = &data->bme680;
0438 s64 var1;
0439 u64 var2;
0440 s64 var3;
0441 u32 calc_gas_res;
0442
0443
0444 const u32 lookupTable[16] = {2147483647u, 2147483647u,
0445 2147483647u, 2147483647u, 2147483647u,
0446 2126008810u, 2147483647u, 2130303777u,
0447 2147483647u, 2147483647u, 2143188679u,
0448 2136746228u, 2147483647u, 2126008810u,
0449 2147483647u, 2147483647u};
0450
0451 var1 = ((1340 + (5 * (s64) calib->range_sw_err)) *
0452 ((s64) lookupTable[gas_range])) >> 16;
0453 var2 = ((gas_res_adc << 15) - 16777216) + var1;
0454 var3 = ((125000 << (15 - gas_range)) * var1) >> 9;
0455 var3 += (var2 >> 1);
0456 calc_gas_res = div64_s64(var3, (s64) var2);
0457
0458 return calc_gas_res;
0459 }
0460
0461
0462
0463
0464
0465 static u8 bme680_calc_heater_res(struct bme680_data *data, u16 temp)
0466 {
0467 struct bme680_calib *calib = &data->bme680;
0468 s32 var1, var2, var3, var4, var5, heatr_res_x100;
0469 u8 heatr_res;
0470
0471 if (temp > 400)
0472 temp = 400;
0473
0474 var1 = (((s32) BME680_AMB_TEMP * calib->par_gh3) / 1000) * 256;
0475 var2 = (calib->par_gh1 + 784) * (((((calib->par_gh2 + 154009) *
0476 temp * 5) / 100)
0477 + 3276800) / 10);
0478 var3 = var1 + (var2 / 2);
0479 var4 = (var3 / (calib->res_heat_range + 4));
0480 var5 = 131 * calib->res_heat_val + 65536;
0481 heatr_res_x100 = ((var4 / var5) - 250) * 34;
0482 heatr_res = DIV_ROUND_CLOSEST(heatr_res_x100, 100);
0483
0484 return heatr_res;
0485 }
0486
0487
0488
0489
0490
0491 static u8 bme680_calc_heater_dur(u16 dur)
0492 {
0493 u8 durval, factor = 0;
0494
0495 if (dur >= 0xfc0) {
0496 durval = 0xff;
0497 } else {
0498 while (dur > 0x3F) {
0499 dur = dur / 4;
0500 factor += 1;
0501 }
0502 durval = dur + (factor * 64);
0503 }
0504
0505 return durval;
0506 }
0507
0508 static int bme680_set_mode(struct bme680_data *data, bool mode)
0509 {
0510 struct device *dev = regmap_get_device(data->regmap);
0511 int ret;
0512
0513 if (mode) {
0514 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
0515 BME680_MODE_MASK, BME680_MODE_FORCED);
0516 if (ret < 0)
0517 dev_err(dev, "failed to set forced mode\n");
0518
0519 } else {
0520 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
0521 BME680_MODE_MASK, BME680_MODE_SLEEP);
0522 if (ret < 0)
0523 dev_err(dev, "failed to set sleep mode\n");
0524
0525 }
0526
0527 return ret;
0528 }
0529
0530 static u8 bme680_oversampling_to_reg(u8 val)
0531 {
0532 return ilog2(val) + 1;
0533 }
0534
0535 static int bme680_chip_config(struct bme680_data *data)
0536 {
0537 struct device *dev = regmap_get_device(data->regmap);
0538 int ret;
0539 u8 osrs;
0540
0541 osrs = FIELD_PREP(
0542 BME680_OSRS_HUMIDITY_MASK,
0543 bme680_oversampling_to_reg(data->oversampling_humid));
0544
0545
0546
0547
0548 ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_HUMIDITY,
0549 BME680_OSRS_HUMIDITY_MASK, osrs);
0550 if (ret < 0) {
0551 dev_err(dev, "failed to write ctrl_hum register\n");
0552 return ret;
0553 }
0554
0555
0556 ret = regmap_update_bits(data->regmap, BME680_REG_CONFIG,
0557 BME680_FILTER_MASK,
0558 BME680_FILTER_COEFF_VAL);
0559 if (ret < 0) {
0560 dev_err(dev, "failed to write config register\n");
0561 return ret;
0562 }
0563
0564 osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK,
0565 bme680_oversampling_to_reg(data->oversampling_temp)) |
0566 FIELD_PREP(BME680_OSRS_PRESS_MASK,
0567 bme680_oversampling_to_reg(data->oversampling_press));
0568 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
0569 BME680_OSRS_TEMP_MASK | BME680_OSRS_PRESS_MASK,
0570 osrs);
0571 if (ret < 0)
0572 dev_err(dev, "failed to write ctrl_meas register\n");
0573
0574 return ret;
0575 }
0576
0577 static int bme680_gas_config(struct bme680_data *data)
0578 {
0579 struct device *dev = regmap_get_device(data->regmap);
0580 int ret;
0581 u8 heatr_res, heatr_dur;
0582
0583 heatr_res = bme680_calc_heater_res(data, data->heater_temp);
0584
0585
0586 ret = regmap_write(data->regmap, BME680_REG_RES_HEAT_0, heatr_res);
0587 if (ret < 0) {
0588 dev_err(dev, "failed to write res_heat_0 register\n");
0589 return ret;
0590 }
0591
0592 heatr_dur = bme680_calc_heater_dur(data->heater_dur);
0593
0594
0595 ret = regmap_write(data->regmap, BME680_REG_GAS_WAIT_0, heatr_dur);
0596 if (ret < 0) {
0597 dev_err(dev, "failed to write gas_wait_0 register\n");
0598 return ret;
0599 }
0600
0601
0602 ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_GAS_1,
0603 BME680_RUN_GAS_MASK | BME680_NB_CONV_MASK,
0604 FIELD_PREP(BME680_RUN_GAS_MASK, 1) |
0605 FIELD_PREP(BME680_NB_CONV_MASK, 0));
0606 if (ret < 0)
0607 dev_err(dev, "failed to write ctrl_gas_1 register\n");
0608
0609 return ret;
0610 }
0611
0612 static int bme680_read_temp(struct bme680_data *data, int *val)
0613 {
0614 struct device *dev = regmap_get_device(data->regmap);
0615 int ret;
0616 __be32 tmp = 0;
0617 s32 adc_temp;
0618 s16 comp_temp;
0619
0620
0621 ret = bme680_set_mode(data, true);
0622 if (ret < 0)
0623 return ret;
0624
0625 ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
0626 &tmp, 3);
0627 if (ret < 0) {
0628 dev_err(dev, "failed to read temperature\n");
0629 return ret;
0630 }
0631
0632 adc_temp = be32_to_cpu(tmp) >> 12;
0633 if (adc_temp == BME680_MEAS_SKIPPED) {
0634
0635 dev_err(dev, "reading temperature skipped\n");
0636 return -EINVAL;
0637 }
0638 comp_temp = bme680_compensate_temp(data, adc_temp);
0639
0640
0641
0642
0643
0644
0645 if (val) {
0646 *val = comp_temp * 10;
0647 return IIO_VAL_INT;
0648 }
0649
0650 return ret;
0651 }
0652
0653 static int bme680_read_press(struct bme680_data *data,
0654 int *val, int *val2)
0655 {
0656 struct device *dev = regmap_get_device(data->regmap);
0657 int ret;
0658 __be32 tmp = 0;
0659 s32 adc_press;
0660
0661
0662 ret = bme680_read_temp(data, NULL);
0663 if (ret < 0)
0664 return ret;
0665
0666 ret = regmap_bulk_read(data->regmap, BME680_REG_PRESS_MSB,
0667 &tmp, 3);
0668 if (ret < 0) {
0669 dev_err(dev, "failed to read pressure\n");
0670 return ret;
0671 }
0672
0673 adc_press = be32_to_cpu(tmp) >> 12;
0674 if (adc_press == BME680_MEAS_SKIPPED) {
0675
0676 dev_err(dev, "reading pressure skipped\n");
0677 return -EINVAL;
0678 }
0679
0680 *val = bme680_compensate_press(data, adc_press);
0681 *val2 = 100;
0682 return IIO_VAL_FRACTIONAL;
0683 }
0684
0685 static int bme680_read_humid(struct bme680_data *data,
0686 int *val, int *val2)
0687 {
0688 struct device *dev = regmap_get_device(data->regmap);
0689 int ret;
0690 __be16 tmp = 0;
0691 s32 adc_humidity;
0692 u32 comp_humidity;
0693
0694
0695 ret = bme680_read_temp(data, NULL);
0696 if (ret < 0)
0697 return ret;
0698
0699 ret = regmap_bulk_read(data->regmap, BM6880_REG_HUMIDITY_MSB,
0700 &tmp, sizeof(tmp));
0701 if (ret < 0) {
0702 dev_err(dev, "failed to read humidity\n");
0703 return ret;
0704 }
0705
0706 adc_humidity = be16_to_cpu(tmp);
0707 if (adc_humidity == BME680_MEAS_SKIPPED) {
0708
0709 dev_err(dev, "reading humidity skipped\n");
0710 return -EINVAL;
0711 }
0712 comp_humidity = bme680_compensate_humid(data, adc_humidity);
0713
0714 *val = comp_humidity;
0715 *val2 = 1000;
0716 return IIO_VAL_FRACTIONAL;
0717 }
0718
0719 static int bme680_read_gas(struct bme680_data *data,
0720 int *val)
0721 {
0722 struct device *dev = regmap_get_device(data->regmap);
0723 int ret;
0724 __be16 tmp = 0;
0725 unsigned int check;
0726 u16 adc_gas_res;
0727 u8 gas_range;
0728
0729
0730 ret = bme680_gas_config(data);
0731 if (ret < 0) {
0732 dev_err(dev, "failed to set gas config\n");
0733 return ret;
0734 }
0735
0736
0737 ret = bme680_set_mode(data, true);
0738 if (ret < 0)
0739 return ret;
0740
0741 ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
0742 if (check & BME680_GAS_MEAS_BIT) {
0743 dev_err(dev, "gas measurement incomplete\n");
0744 return -EBUSY;
0745 }
0746
0747 ret = regmap_read(data->regmap, BME680_REG_GAS_R_LSB, &check);
0748 if (ret < 0) {
0749 dev_err(dev, "failed to read gas_r_lsb register\n");
0750 return ret;
0751 }
0752
0753
0754
0755
0756
0757
0758
0759 if ((check & BME680_GAS_STAB_BIT) == 0) {
0760 dev_err(dev, "heater failed to reach the target temperature\n");
0761 return -EINVAL;
0762 }
0763
0764 ret = regmap_bulk_read(data->regmap, BME680_REG_GAS_MSB,
0765 &tmp, sizeof(tmp));
0766 if (ret < 0) {
0767 dev_err(dev, "failed to read gas resistance\n");
0768 return ret;
0769 }
0770
0771 gas_range = check & BME680_GAS_RANGE_MASK;
0772 adc_gas_res = be16_to_cpu(tmp) >> BME680_ADC_GAS_RES_SHIFT;
0773
0774 *val = bme680_compensate_gas(data, adc_gas_res, gas_range);
0775 return IIO_VAL_INT;
0776 }
0777
0778 static int bme680_read_raw(struct iio_dev *indio_dev,
0779 struct iio_chan_spec const *chan,
0780 int *val, int *val2, long mask)
0781 {
0782 struct bme680_data *data = iio_priv(indio_dev);
0783
0784 switch (mask) {
0785 case IIO_CHAN_INFO_PROCESSED:
0786 switch (chan->type) {
0787 case IIO_TEMP:
0788 return bme680_read_temp(data, val);
0789 case IIO_PRESSURE:
0790 return bme680_read_press(data, val, val2);
0791 case IIO_HUMIDITYRELATIVE:
0792 return bme680_read_humid(data, val, val2);
0793 case IIO_RESISTANCE:
0794 return bme680_read_gas(data, val);
0795 default:
0796 return -EINVAL;
0797 }
0798 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
0799 switch (chan->type) {
0800 case IIO_TEMP:
0801 *val = data->oversampling_temp;
0802 return IIO_VAL_INT;
0803 case IIO_PRESSURE:
0804 *val = data->oversampling_press;
0805 return IIO_VAL_INT;
0806 case IIO_HUMIDITYRELATIVE:
0807 *val = data->oversampling_humid;
0808 return IIO_VAL_INT;
0809 default:
0810 return -EINVAL;
0811 }
0812 default:
0813 return -EINVAL;
0814 }
0815 }
0816
0817 static bool bme680_is_valid_oversampling(int rate)
0818 {
0819 return (rate > 0 && rate <= 16 && is_power_of_2(rate));
0820 }
0821
0822 static int bme680_write_raw(struct iio_dev *indio_dev,
0823 struct iio_chan_spec const *chan,
0824 int val, int val2, long mask)
0825 {
0826 struct bme680_data *data = iio_priv(indio_dev);
0827
0828 if (val2 != 0)
0829 return -EINVAL;
0830
0831 switch (mask) {
0832 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
0833 {
0834 if (!bme680_is_valid_oversampling(val))
0835 return -EINVAL;
0836
0837 switch (chan->type) {
0838 case IIO_TEMP:
0839 data->oversampling_temp = val;
0840 break;
0841 case IIO_PRESSURE:
0842 data->oversampling_press = val;
0843 break;
0844 case IIO_HUMIDITYRELATIVE:
0845 data->oversampling_humid = val;
0846 break;
0847 default:
0848 return -EINVAL;
0849 }
0850
0851 return bme680_chip_config(data);
0852 }
0853 default:
0854 return -EINVAL;
0855 }
0856 }
0857
0858 static const char bme680_oversampling_ratio_show[] = "1 2 4 8 16";
0859
0860 static IIO_CONST_ATTR(oversampling_ratio_available,
0861 bme680_oversampling_ratio_show);
0862
0863 static struct attribute *bme680_attributes[] = {
0864 &iio_const_attr_oversampling_ratio_available.dev_attr.attr,
0865 NULL,
0866 };
0867
0868 static const struct attribute_group bme680_attribute_group = {
0869 .attrs = bme680_attributes,
0870 };
0871
0872 static const struct iio_info bme680_info = {
0873 .read_raw = &bme680_read_raw,
0874 .write_raw = &bme680_write_raw,
0875 .attrs = &bme680_attribute_group,
0876 };
0877
0878 static const char *bme680_match_acpi_device(struct device *dev)
0879 {
0880 const struct acpi_device_id *id;
0881
0882 id = acpi_match_device(dev->driver->acpi_match_table, dev);
0883 if (!id)
0884 return NULL;
0885
0886 return dev_name(dev);
0887 }
0888
0889 int bme680_core_probe(struct device *dev, struct regmap *regmap,
0890 const char *name)
0891 {
0892 struct iio_dev *indio_dev;
0893 struct bme680_data *data;
0894 unsigned int val;
0895 int ret;
0896
0897 ret = regmap_write(regmap, BME680_REG_SOFT_RESET,
0898 BME680_CMD_SOFTRESET);
0899 if (ret < 0) {
0900 dev_err(dev, "Failed to reset chip\n");
0901 return ret;
0902 }
0903
0904 ret = regmap_read(regmap, BME680_REG_CHIP_ID, &val);
0905 if (ret < 0) {
0906 dev_err(dev, "Error reading chip ID\n");
0907 return ret;
0908 }
0909
0910 if (val != BME680_CHIP_ID_VAL) {
0911 dev_err(dev, "Wrong chip ID, got %x expected %x\n",
0912 val, BME680_CHIP_ID_VAL);
0913 return -ENODEV;
0914 }
0915
0916 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
0917 if (!indio_dev)
0918 return -ENOMEM;
0919
0920 if (!name && ACPI_HANDLE(dev))
0921 name = bme680_match_acpi_device(dev);
0922
0923 data = iio_priv(indio_dev);
0924 dev_set_drvdata(dev, indio_dev);
0925 data->regmap = regmap;
0926 indio_dev->name = name;
0927 indio_dev->channels = bme680_channels;
0928 indio_dev->num_channels = ARRAY_SIZE(bme680_channels);
0929 indio_dev->info = &bme680_info;
0930 indio_dev->modes = INDIO_DIRECT_MODE;
0931
0932
0933 data->oversampling_humid = 2;
0934 data->oversampling_press = 4;
0935 data->oversampling_temp = 8;
0936 data->heater_temp = 320;
0937 data->heater_dur = 150;
0938
0939 ret = bme680_chip_config(data);
0940 if (ret < 0) {
0941 dev_err(dev, "failed to set chip_config data\n");
0942 return ret;
0943 }
0944
0945 ret = bme680_gas_config(data);
0946 if (ret < 0) {
0947 dev_err(dev, "failed to set gas config data\n");
0948 return ret;
0949 }
0950
0951 ret = bme680_read_calib(data, &data->bme680);
0952 if (ret < 0) {
0953 dev_err(dev,
0954 "failed to read calibration coefficients at probe\n");
0955 return ret;
0956 }
0957
0958 return devm_iio_device_register(dev, indio_dev);
0959 }
0960 EXPORT_SYMBOL_NS_GPL(bme680_core_probe, IIO_BME680);
0961
0962 MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");
0963 MODULE_DESCRIPTION("Bosch BME680 Driver");
0964 MODULE_LICENSE("GPL v2");