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