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