1 // SPDX-License-Identifier: GPL-2.0
3 * Bosch BME680 - Temperature, Pressure, Humidity & Gas Sensor
5 * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
6 * Copyright (C) 2018 Himanshu Jha <himanshujha199640@gmail.com>
9 * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
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>
52 struct regmap *regmap;
53 struct bme680_calib bme680;
55 u8 oversampling_press;
56 u8 oversampling_humid;
60 * Carryover value from temperature conversion, used in pressure
61 * and humidity compensation calculations.
66 static 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),
72 static const struct regmap_access_table bme680_volatile_table = {
73 .yes_ranges = bme680_volatile_ranges,
74 .n_yes_ranges = ARRAY_SIZE(bme680_volatile_ranges),
77 const struct regmap_config bme680_regmap_config = {
81 .volatile_table = &bme680_volatile_table,
82 .cache_type = REGCACHE_RBTREE,
84 EXPORT_SYMBOL(bme680_regmap_config);
86 static const struct iio_chan_spec bme680_channels[] = {
89 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
90 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
94 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
95 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
98 .type = IIO_HUMIDITYRELATIVE,
99 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
100 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
103 .type = IIO_RESISTANCE,
104 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
108 static const int bme680_oversampling_avail[] = { 1, 2, 4, 8, 16 };
110 static int bme680_read_calib(struct bme680_data *data,
111 struct bme680_calib *calib)
113 struct device *dev = regmap_get_device(data->regmap);
114 unsigned int tmp, tmp_msb, tmp_lsb;
118 /* Temperature related coefficients */
119 ret = regmap_bulk_read(data->regmap, BME680_T1_LSB_REG,
122 dev_err(dev, "failed to read BME680_T1_LSB_REG\n");
125 calib->par_t1 = le16_to_cpu(buf);
127 ret = regmap_bulk_read(data->regmap, BME680_T2_LSB_REG,
130 dev_err(dev, "failed to read BME680_T2_LSB_REG\n");
133 calib->par_t2 = le16_to_cpu(buf);
135 ret = regmap_read(data->regmap, BME680_T3_REG, &tmp);
137 dev_err(dev, "failed to read BME680_T3_REG\n");
142 /* Pressure related coefficients */
143 ret = regmap_bulk_read(data->regmap, BME680_P1_LSB_REG,
146 dev_err(dev, "failed to read BME680_P1_LSB_REG\n");
149 calib->par_p1 = le16_to_cpu(buf);
151 ret = regmap_bulk_read(data->regmap, BME680_P2_LSB_REG,
154 dev_err(dev, "failed to read BME680_P2_LSB_REG\n");
157 calib->par_p2 = le16_to_cpu(buf);
159 ret = regmap_read(data->regmap, BME680_P3_REG, &tmp);
161 dev_err(dev, "failed to read BME680_P3_REG\n");
166 ret = regmap_bulk_read(data->regmap, BME680_P4_LSB_REG,
169 dev_err(dev, "failed to read BME680_P4_LSB_REG\n");
172 calib->par_p4 = le16_to_cpu(buf);
174 ret = regmap_bulk_read(data->regmap, BME680_P5_LSB_REG,
177 dev_err(dev, "failed to read BME680_P5_LSB_REG\n");
180 calib->par_p5 = le16_to_cpu(buf);
182 ret = regmap_read(data->regmap, BME680_P6_REG, &tmp);
184 dev_err(dev, "failed to read BME680_P6_REG\n");
189 ret = regmap_read(data->regmap, BME680_P7_REG, &tmp);
191 dev_err(dev, "failed to read BME680_P7_REG\n");
196 ret = regmap_bulk_read(data->regmap, BME680_P8_LSB_REG,
199 dev_err(dev, "failed to read BME680_P8_LSB_REG\n");
202 calib->par_p8 = le16_to_cpu(buf);
204 ret = regmap_bulk_read(data->regmap, BME680_P9_LSB_REG,
207 dev_err(dev, "failed to read BME680_P9_LSB_REG\n");
210 calib->par_p9 = le16_to_cpu(buf);
212 ret = regmap_read(data->regmap, BME680_P10_REG, &tmp);
214 dev_err(dev, "failed to read BME680_P10_REG\n");
217 calib->par_p10 = tmp;
219 /* Humidity related coefficients */
220 ret = regmap_read(data->regmap, BME680_H1_MSB_REG, &tmp_msb);
222 dev_err(dev, "failed to read BME680_H1_MSB_REG\n");
226 ret = regmap_read(data->regmap, BME680_H1_LSB_REG, &tmp_lsb);
228 dev_err(dev, "failed to read BME680_H1_LSB_REG\n");
232 calib->par_h1 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
233 (tmp_lsb & BME680_BIT_H1_DATA_MSK);
235 ret = regmap_read(data->regmap, BME680_H2_MSB_REG, &tmp_msb);
237 dev_err(dev, "failed to read BME680_H2_MSB_REG\n");
241 ret = regmap_read(data->regmap, BME680_H2_LSB_REG, &tmp_lsb);
243 dev_err(dev, "failed to read BME680_H2_LSB_REG\n");
247 calib->par_h2 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
248 (tmp_lsb >> BME680_HUM_REG_SHIFT_VAL);
250 ret = regmap_read(data->regmap, BME680_H3_REG, &tmp);
252 dev_err(dev, "failed to read BME680_H3_REG\n");
257 ret = regmap_read(data->regmap, BME680_H4_REG, &tmp);
259 dev_err(dev, "failed to read BME680_H4_REG\n");
264 ret = regmap_read(data->regmap, BME680_H5_REG, &tmp);
266 dev_err(dev, "failed to read BME680_H5_REG\n");
271 ret = regmap_read(data->regmap, BME680_H6_REG, &tmp);
273 dev_err(dev, "failed to read BME680_H6_REG\n");
278 ret = regmap_read(data->regmap, BME680_H7_REG, &tmp);
280 dev_err(dev, "failed to read BME680_H7_REG\n");
285 /* Gas heater related coefficients */
286 ret = regmap_read(data->regmap, BME680_GH1_REG, &tmp);
288 dev_err(dev, "failed to read BME680_GH1_REG\n");
291 calib->par_gh1 = tmp;
293 ret = regmap_bulk_read(data->regmap, BME680_GH2_LSB_REG,
296 dev_err(dev, "failed to read BME680_GH2_LSB_REG\n");
299 calib->par_gh2 = le16_to_cpu(buf);
301 ret = regmap_read(data->regmap, BME680_GH3_REG, &tmp);
303 dev_err(dev, "failed to read BME680_GH3_REG\n");
306 calib->par_gh3 = tmp;
308 /* Other coefficients */
309 ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_RANGE, &tmp);
311 dev_err(dev, "failed to read resistance heat range\n");
314 calib->res_heat_range = (tmp & BME680_RHRANGE_MSK) / 16;
316 ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_VAL, &tmp);
318 dev_err(dev, "failed to read resistance heat value\n");
321 calib->res_heat_val = tmp;
323 ret = regmap_read(data->regmap, BME680_REG_RANGE_SW_ERR, &tmp);
325 dev_err(dev, "failed to read range software error\n");
328 calib->range_sw_err = (tmp & BME680_RSERROR_MSK) / 16;
334 * Taken from Bosch BME680 API:
335 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L876
337 * Returns temperature measurement in DegC, resolutions is 0.01 DegC. Therefore,
338 * output value of "3233" represents 32.33 DegC.
340 static s16 bme680_compensate_temp(struct bme680_data *data,
343 struct bme680_calib *calib = &data->bme680;
344 s64 var1, var2, var3;
347 /* If the calibration is invalid, attempt to reload it */
349 bme680_read_calib(data, calib);
351 var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
352 var2 = (var1 * calib->par_t2) >> 11;
353 var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
354 var3 = (var3 * (calib->par_t3 << 4)) >> 14;
355 data->t_fine = var2 + var3;
356 calc_temp = (data->t_fine * 5 + 128) >> 8;
362 * Taken from Bosch BME680 API:
363 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L896
365 * Returns pressure measurement in Pa. Output value of "97356" represents
366 * 97356 Pa = 973.56 hPa.
368 static u32 bme680_compensate_press(struct bme680_data *data,
371 struct bme680_calib *calib = &data->bme680;
372 s32 var1, var2, var3, press_comp;
374 var1 = (data->t_fine >> 1) - 64000;
375 var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
376 var2 = var2 + (var1 * calib->par_p5 << 1);
377 var2 = (var2 >> 2) + (calib->par_p4 << 16);
378 var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
379 (calib->par_p3 << 5)) >> 3) +
380 ((calib->par_p2 * var1) >> 1);
382 var1 = ((32768 + var1) * calib->par_p1) >> 15;
383 press_comp = 1048576 - adc_press;
384 press_comp = ((press_comp - (var2 >> 12)) * 3125);
386 if (press_comp >= BME680_MAX_OVERFLOW_VAL)
387 press_comp = ((press_comp / (u32)var1) << 1);
389 press_comp = ((press_comp << 1) / (u32)var1);
391 var1 = (calib->par_p9 * (((press_comp >> 3) *
392 (press_comp >> 3)) >> 13)) >> 12;
393 var2 = ((press_comp >> 2) * calib->par_p8) >> 13;
394 var3 = ((press_comp >> 8) * (press_comp >> 8) *
395 (press_comp >> 8) * calib->par_p10) >> 17;
397 press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
403 * Taken from Bosch BME680 API:
404 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L937
406 * Returns humidity measurement in percent, resolution is 0.001 percent. Output
407 * value of "43215" represents 43.215 %rH.
409 static u32 bme680_compensate_humid(struct bme680_data *data,
412 struct bme680_calib *calib = &data->bme680;
413 s32 var1, var2, var3, var4, var5, var6, temp_scaled, calc_hum;
415 temp_scaled = (data->t_fine * 5 + 128) >> 8;
416 var1 = (adc_humid - ((s32) ((s32) calib->par_h1 * 16))) -
417 (((temp_scaled * (s32) calib->par_h3) / 100) >> 1);
418 var2 = ((s32) calib->par_h2 *
419 (((temp_scaled * calib->par_h4) / 100) +
420 (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
421 >> 6) / 100) + (1 << 14))) >> 10;
423 var4 = calib->par_h6 << 7;
424 var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
425 var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
426 var6 = (var4 * var5) >> 1;
427 calc_hum = (((var3 + var6) >> 10) * 1000) >> 12;
429 if (calc_hum > 100000) /* Cap at 100%rH */
431 else if (calc_hum < 0)
438 * Taken from Bosch BME680 API:
439 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L973
441 * Returns gas measurement in Ohm. Output value of "82986" represent 82986 ohms.
443 static u32 bme680_compensate_gas(struct bme680_data *data, u16 gas_res_adc,
446 struct bme680_calib *calib = &data->bme680;
452 /* Look up table for the possible gas range values */
453 const u32 lookupTable[16] = {2147483647u, 2147483647u,
454 2147483647u, 2147483647u, 2147483647u,
455 2126008810u, 2147483647u, 2130303777u,
456 2147483647u, 2147483647u, 2143188679u,
457 2136746228u, 2147483647u, 2126008810u,
458 2147483647u, 2147483647u};
460 var1 = ((1340 + (5 * (s64) calib->range_sw_err)) *
461 ((s64) lookupTable[gas_range])) >> 16;
462 var2 = ((gas_res_adc << 15) - 16777216) + var1;
463 var3 = ((125000 << (15 - gas_range)) * var1) >> 9;
465 calc_gas_res = div64_s64(var3, (s64) var2);
471 * Taken from Bosch BME680 API:
472 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L1002
474 static u8 bme680_calc_heater_res(struct bme680_data *data, u16 temp)
476 struct bme680_calib *calib = &data->bme680;
477 s32 var1, var2, var3, var4, var5, heatr_res_x100;
480 if (temp > 400) /* Cap temperature */
483 var1 = (((s32) BME680_AMB_TEMP * calib->par_gh3) / 1000) * 256;
484 var2 = (calib->par_gh1 + 784) * (((((calib->par_gh2 + 154009) *
487 var3 = var1 + (var2 / 2);
488 var4 = (var3 / (calib->res_heat_range + 4));
489 var5 = 131 * calib->res_heat_val + 65536;
490 heatr_res_x100 = ((var4 / var5) - 250) * 34;
491 heatr_res = (heatr_res_x100 + 50) / 100;
497 * Taken from Bosch BME680 API:
498 * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L1188
500 static u8 bme680_calc_heater_dur(u16 dur)
502 u8 durval, factor = 0;
505 durval = 0xff; /* Max duration */
511 durval = dur + (factor * 64);
517 static int bme680_set_mode(struct bme680_data *data, bool mode)
519 struct device *dev = regmap_get_device(data->regmap);
523 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
524 BME680_MODE_MASK, BME680_MODE_FORCED);
526 dev_err(dev, "failed to set forced mode\n");
529 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
530 BME680_MODE_MASK, BME680_MODE_SLEEP);
532 dev_err(dev, "failed to set sleep mode\n");
539 static int bme680_chip_config(struct bme680_data *data)
541 struct device *dev = regmap_get_device(data->regmap);
543 u8 osrs = FIELD_PREP(BME680_OSRS_HUMIDITY_MASK,
544 data->oversampling_humid + 1);
546 * Highly recommended to set oversampling of humidity before
547 * temperature/pressure oversampling.
549 ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_HUMIDITY,
550 BME680_OSRS_HUMIDITY_MASK, osrs);
552 dev_err(dev, "failed to write ctrl_hum register\n");
556 /* IIR filter settings */
557 ret = regmap_update_bits(data->regmap, BME680_REG_CONFIG,
559 BME680_FILTER_COEFF_VAL);
561 dev_err(dev, "failed to write config register\n");
565 osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK, data->oversampling_temp + 1) |
566 FIELD_PREP(BME680_OSRS_PRESS_MASK, data->oversampling_press + 1);
568 ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
569 BME680_OSRS_TEMP_MASK |
570 BME680_OSRS_PRESS_MASK,
573 dev_err(dev, "failed to write ctrl_meas register\n");
578 static int bme680_gas_config(struct bme680_data *data)
580 struct device *dev = regmap_get_device(data->regmap);
582 u8 heatr_res, heatr_dur;
584 heatr_res = bme680_calc_heater_res(data, data->heater_temp);
586 /* set target heater temperature */
587 ret = regmap_write(data->regmap, BME680_REG_RES_HEAT_0, heatr_res);
589 dev_err(dev, "failed to write res_heat_0 register\n");
593 heatr_dur = bme680_calc_heater_dur(data->heater_dur);
595 /* set target heating duration */
596 ret = regmap_write(data->regmap, BME680_REG_GAS_WAIT_0, heatr_dur);
598 dev_err(dev, "failted to write gas_wait_0 register\n");
602 /* Selecting the runGas and NB conversion settings for the sensor */
603 ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_GAS_1,
604 BME680_RUN_GAS_MASK | BME680_NB_CONV_MASK,
605 BME680_RUN_GAS_EN_BIT | BME680_NB_CONV_0_VAL);
607 dev_err(dev, "failed to write ctrl_gas_1 register\n");
612 static int bme680_read_temp(struct bme680_data *data, int *val)
614 struct device *dev = regmap_get_device(data->regmap);
620 /* set forced mode to trigger measurement */
621 ret = bme680_set_mode(data, true);
625 ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
628 dev_err(dev, "failed to read temperature\n");
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");
638 comp_temp = bme680_compensate_temp(data, adc_temp);
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.
646 *val = comp_temp * 10; /* Centidegrees to millidegrees */
653 static int bme680_read_press(struct bme680_data *data,
656 struct device *dev = regmap_get_device(data->regmap);
661 /* Read and compensate temperature to get a reading of t_fine */
662 ret = bme680_read_temp(data, NULL);
666 ret = regmap_bulk_read(data->regmap, BME680_REG_PRESS_MSB,
669 dev_err(dev, "failed to read pressure\n");
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");
680 *val = bme680_compensate_press(data, adc_press);
682 return IIO_VAL_FRACTIONAL;
685 static int bme680_read_humid(struct bme680_data *data,
688 struct device *dev = regmap_get_device(data->regmap);
694 /* Read and compensate temperature to get a reading of t_fine */
695 ret = bme680_read_temp(data, NULL);
699 ret = regmap_bulk_read(data->regmap, BM6880_REG_HUMIDITY_MSB,
702 dev_err(dev, "failed to read humidity\n");
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");
712 comp_humidity = bme680_compensate_humid(data, adc_humidity);
714 *val = comp_humidity;
716 return IIO_VAL_FRACTIONAL;
719 static int bme680_read_gas(struct bme680_data *data,
722 struct device *dev = regmap_get_device(data->regmap);
729 /* Set heater settings */
730 ret = bme680_gas_config(data);
732 dev_err(dev, "failed to set gas config\n");
736 /* set forced mode to trigger measurement */
737 ret = bme680_set_mode(data, true);
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");
747 ret = regmap_read(data->regmap, BME680_REG_GAS_R_LSB, &check);
749 dev_err(dev, "failed to read gas_r_lsb register\n");
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
759 if ((check & BME680_GAS_STAB_BIT) == 0) {
760 dev_err(dev, "heater failed to reach the target temperature\n");
764 ret = regmap_bulk_read(data->regmap, BME680_REG_GAS_MSB,
767 dev_err(dev, "failed to read gas resistance\n");
771 gas_range = check & BME680_GAS_RANGE_MASK;
772 adc_gas_res = be16_to_cpu(tmp) >> BME680_ADC_GAS_RES_SHIFT;
774 *val = bme680_compensate_gas(data, adc_gas_res, gas_range);
778 static int bme680_read_raw(struct iio_dev *indio_dev,
779 struct iio_chan_spec const *chan,
780 int *val, int *val2, long mask)
782 struct bme680_data *data = iio_priv(indio_dev);
785 case IIO_CHAN_INFO_PROCESSED:
786 switch (chan->type) {
788 return bme680_read_temp(data, val);
790 return bme680_read_press(data, val, val2);
791 case IIO_HUMIDITYRELATIVE:
792 return bme680_read_humid(data, val, val2);
794 return bme680_read_gas(data, val);
798 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
799 switch (chan->type) {
801 *val = 1 << data->oversampling_temp;
804 *val = 1 << data->oversampling_press;
806 case IIO_HUMIDITYRELATIVE:
807 *val = 1 << data->oversampling_humid;
817 static int bme680_write_oversampling_ratio_temp(struct bme680_data *data,
822 for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
823 if (bme680_oversampling_avail[i] == val) {
824 data->oversampling_temp = ilog2(val);
826 return bme680_chip_config(data);
833 static int bme680_write_oversampling_ratio_press(struct bme680_data *data,
838 for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
839 if (bme680_oversampling_avail[i] == val) {
840 data->oversampling_press = ilog2(val);
842 return bme680_chip_config(data);
849 static int bme680_write_oversampling_ratio_humid(struct bme680_data *data,
854 for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
855 if (bme680_oversampling_avail[i] == val) {
856 data->oversampling_humid = ilog2(val);
858 return bme680_chip_config(data);
865 static int bme680_write_raw(struct iio_dev *indio_dev,
866 struct iio_chan_spec const *chan,
867 int val, int val2, long mask)
869 struct bme680_data *data = iio_priv(indio_dev);
872 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
873 switch (chan->type) {
875 return bme680_write_oversampling_ratio_temp(data, val);
877 return bme680_write_oversampling_ratio_press(data, val);
878 case IIO_HUMIDITYRELATIVE:
879 return bme680_write_oversampling_ratio_humid(data, val);
888 static const char bme680_oversampling_ratio_show[] = "1 2 4 8 16";
890 static IIO_CONST_ATTR(oversampling_ratio_available,
891 bme680_oversampling_ratio_show);
893 static struct attribute *bme680_attributes[] = {
894 &iio_const_attr_oversampling_ratio_available.dev_attr.attr,
898 static const struct attribute_group bme680_attribute_group = {
899 .attrs = bme680_attributes,
902 static const struct iio_info bme680_info = {
903 .read_raw = &bme680_read_raw,
904 .write_raw = &bme680_write_raw,
905 .attrs = &bme680_attribute_group,
908 static const char *bme680_match_acpi_device(struct device *dev)
910 const struct acpi_device_id *id;
912 id = acpi_match_device(dev->driver->acpi_match_table, dev);
916 return dev_name(dev);
919 int bme680_core_probe(struct device *dev, struct regmap *regmap,
922 struct iio_dev *indio_dev;
923 struct bme680_data *data;
927 ret = regmap_write(regmap, BME680_REG_SOFT_RESET,
928 BME680_CMD_SOFTRESET);
930 dev_err(dev, "Failed to reset chip\n");
934 ret = regmap_read(regmap, BME680_REG_CHIP_ID, &val);
936 dev_err(dev, "Error reading chip ID\n");
940 if (val != BME680_CHIP_ID_VAL) {
941 dev_err(dev, "Wrong chip ID, got %x expected %x\n",
942 val, BME680_CHIP_ID_VAL);
946 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
950 if (!name && ACPI_HANDLE(dev))
951 name = bme680_match_acpi_device(dev);
953 data = iio_priv(indio_dev);
954 dev_set_drvdata(dev, indio_dev);
955 data->regmap = regmap;
956 indio_dev->dev.parent = dev;
957 indio_dev->name = name;
958 indio_dev->channels = bme680_channels;
959 indio_dev->num_channels = ARRAY_SIZE(bme680_channels);
960 indio_dev->info = &bme680_info;
961 indio_dev->modes = INDIO_DIRECT_MODE;
963 /* default values for the sensor */
964 data->oversampling_humid = ilog2(2); /* 2X oversampling rate */
965 data->oversampling_press = ilog2(4); /* 4X oversampling rate */
966 data->oversampling_temp = ilog2(8); /* 8X oversampling rate */
967 data->heater_temp = 320; /* degree Celsius */
968 data->heater_dur = 150; /* milliseconds */
970 ret = bme680_chip_config(data);
972 dev_err(dev, "failed to set chip_config data\n");
976 ret = bme680_gas_config(data);
978 dev_err(dev, "failed to set gas config data\n");
982 ret = bme680_read_calib(data, &data->bme680);
985 "failed to read calibration coefficients at probe\n");
989 return devm_iio_device_register(dev, indio_dev);
991 EXPORT_SYMBOL_GPL(bme680_core_probe);
993 MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");
994 MODULE_DESCRIPTION("Bosch BME680 Driver");
995 MODULE_LICENSE("GPL v2");