Lines Matching +full:assigned +full:- +full:resolution +full:- +full:bits

1 // SPDX-License-Identifier: GPL-2.0-only
12 * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP180-DS000-121.pdf
13 * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP280-DS001-12.pdf
14 * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf
158 struct device *dev = data->dev; in bmp280_read_calib()
163 ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_TEMP_START, in bmp280_read_calib()
166 dev_err(data->dev, in bmp280_read_calib()
174 calib->T1 = le16_to_cpu(t_buf[T1]); in bmp280_read_calib()
175 calib->T2 = le16_to_cpu(t_buf[T2]); in bmp280_read_calib()
176 calib->T3 = le16_to_cpu(t_buf[T3]); in bmp280_read_calib()
179 ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_PRESS_START, in bmp280_read_calib()
182 dev_err(data->dev, in bmp280_read_calib()
190 calib->P1 = le16_to_cpu(p_buf[P1]); in bmp280_read_calib()
191 calib->P2 = le16_to_cpu(p_buf[P2]); in bmp280_read_calib()
192 calib->P3 = le16_to_cpu(p_buf[P3]); in bmp280_read_calib()
193 calib->P4 = le16_to_cpu(p_buf[P4]); in bmp280_read_calib()
194 calib->P5 = le16_to_cpu(p_buf[P5]); in bmp280_read_calib()
195 calib->P6 = le16_to_cpu(p_buf[P6]); in bmp280_read_calib()
196 calib->P7 = le16_to_cpu(p_buf[P7]); in bmp280_read_calib()
197 calib->P8 = le16_to_cpu(p_buf[P8]); in bmp280_read_calib()
198 calib->P9 = le16_to_cpu(p_buf[P9]); in bmp280_read_calib()
210 ret = regmap_read(data->regmap, BMP280_REG_COMP_H1, &tmp); in bmp280_read_calib()
215 calib->H1 = tmp; in bmp280_read_calib()
217 ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_H2, &l16, 2); in bmp280_read_calib()
222 calib->H2 = sign_extend32(le16_to_cpu(l16), 15); in bmp280_read_calib()
224 ret = regmap_read(data->regmap, BMP280_REG_COMP_H3, &tmp); in bmp280_read_calib()
229 calib->H3 = tmp; in bmp280_read_calib()
231 ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_H4, &b16, 2); in bmp280_read_calib()
236 calib->H4 = sign_extend32(((be16_to_cpu(b16) >> 4) & 0xff0) | in bmp280_read_calib()
239 ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_H5, &l16, 2); in bmp280_read_calib()
244 calib->H5 = sign_extend32(((le16_to_cpu(l16) >> 4) & 0xfff), 11); in bmp280_read_calib()
246 ret = regmap_read(data->regmap, BMP280_REG_COMP_H6, &tmp); in bmp280_read_calib()
251 calib->H6 = sign_extend32(tmp, 7); in bmp280_read_calib()
256 * Returns humidity in percent, resolution is 0.01 percent. Output value of
265 struct bmp280_calib *calib = &data->calib.bmp280; in bmp280_compensate_humidity()
267 var = ((s32)data->t_fine) - (s32)76800; in bmp280_compensate_humidity()
268 var = ((((adc_humidity << 14) - (calib->H4 << 20) - (calib->H5 * var)) in bmp280_compensate_humidity()
269 + (s32)16384) >> 15) * (((((((var * calib->H6) >> 10) in bmp280_compensate_humidity()
270 * (((var * (s32)calib->H3) >> 11) + (s32)32768)) >> 10) in bmp280_compensate_humidity()
271 + (s32)2097152) * calib->H2 + 8192) >> 14); in bmp280_compensate_humidity()
272 var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4; in bmp280_compensate_humidity()
280 * Returns temperature in DegC, resolution is 0.01 DegC. Output value of
290 struct bmp280_calib *calib = &data->calib.bmp280; in bmp280_compensate_temp()
292 var1 = (((adc_temp >> 3) - ((s32)calib->T1 << 1)) * in bmp280_compensate_temp()
293 ((s32)calib->T2)) >> 11; in bmp280_compensate_temp()
294 var2 = (((((adc_temp >> 4) - ((s32)calib->T1)) * in bmp280_compensate_temp()
295 ((adc_temp >> 4) - ((s32)calib->T1))) >> 12) * in bmp280_compensate_temp()
296 ((s32)calib->T3)) >> 14; in bmp280_compensate_temp()
297 data->t_fine = var1 + var2; in bmp280_compensate_temp()
299 return (data->t_fine * 5 + 128) >> 8; in bmp280_compensate_temp()
304 * integer bits and 8 fractional bits). Output value of "24674867"
313 struct bmp280_calib *calib = &data->calib.bmp280; in bmp280_compensate_press()
315 var1 = ((s64)data->t_fine) - 128000; in bmp280_compensate_press()
316 var2 = var1 * var1 * (s64)calib->P6; in bmp280_compensate_press()
317 var2 += (var1 * (s64)calib->P5) << 17; in bmp280_compensate_press()
318 var2 += ((s64)calib->P4) << 35; in bmp280_compensate_press()
319 var1 = ((var1 * var1 * (s64)calib->P3) >> 8) + in bmp280_compensate_press()
320 ((var1 * (s64)calib->P2) << 12); in bmp280_compensate_press()
321 var1 = ((((s64)1) << 47) + var1) * ((s64)calib->P1) >> 33; in bmp280_compensate_press()
326 p = ((((s64)1048576 - adc_press) << 31) - var2) * 3125; in bmp280_compensate_press()
328 var1 = (((s64)calib->P9) * (p >> 13) * (p >> 13)) >> 25; in bmp280_compensate_press()
329 var2 = ((s64)(calib->P8) * p) >> 19; in bmp280_compensate_press()
330 p = ((p + var1 + var2) >> 8) + (((s64)calib->P7) << 4); in bmp280_compensate_press()
342 ret = regmap_bulk_read(data->regmap, BMP280_REG_TEMP_MSB, &tmp, 3); in bmp280_read_temp()
344 dev_err(data->dev, "failed to read temperature\n"); in bmp280_read_temp()
351 dev_err(data->dev, "reading temperature skipped\n"); in bmp280_read_temp()
352 return -EIO; in bmp280_read_temp()
381 ret = regmap_bulk_read(data->regmap, BMP280_REG_PRESS_MSB, &tmp, 3); in bmp280_read_press()
383 dev_err(data->dev, "failed to read pressure\n"); in bmp280_read_press()
390 dev_err(data->dev, "reading pressure skipped\n"); in bmp280_read_press()
391 return -EIO; in bmp280_read_press()
413 ret = regmap_bulk_read(data->regmap, BMP280_REG_HUMIDITY_MSB, &tmp, 2); in bmp280_read_humid()
415 dev_err(data->dev, "failed to read humidity\n"); in bmp280_read_humid()
422 dev_err(data->dev, "reading humidity skipped\n"); in bmp280_read_humid()
423 return -EIO; in bmp280_read_humid()
439 pm_runtime_get_sync(data->dev); in bmp280_read_raw()
440 mutex_lock(&data->lock); in bmp280_read_raw()
444 switch (chan->type) { in bmp280_read_raw()
446 ret = data->chip_info->read_humid(data, val, val2); in bmp280_read_raw()
449 ret = data->chip_info->read_press(data, val, val2); in bmp280_read_raw()
452 ret = data->chip_info->read_temp(data, val); in bmp280_read_raw()
455 ret = -EINVAL; in bmp280_read_raw()
460 switch (chan->type) { in bmp280_read_raw()
462 *val = 1 << data->oversampling_humid; in bmp280_read_raw()
466 *val = 1 << data->oversampling_press; in bmp280_read_raw()
470 *val = 1 << data->oversampling_temp; in bmp280_read_raw()
474 ret = -EINVAL; in bmp280_read_raw()
479 ret = -EINVAL; in bmp280_read_raw()
483 mutex_unlock(&data->lock); in bmp280_read_raw()
484 pm_runtime_mark_last_busy(data->dev); in bmp280_read_raw()
485 pm_runtime_put_autosuspend(data->dev); in bmp280_read_raw()
494 const int *avail = data->chip_info->oversampling_humid_avail; in bmp280_write_oversampling_ratio_humid()
495 const int n = data->chip_info->num_oversampling_humid_avail; in bmp280_write_oversampling_ratio_humid()
499 data->oversampling_humid = ilog2(val); in bmp280_write_oversampling_ratio_humid()
501 return data->chip_info->chip_config(data); in bmp280_write_oversampling_ratio_humid()
504 return -EINVAL; in bmp280_write_oversampling_ratio_humid()
511 const int *avail = data->chip_info->oversampling_temp_avail; in bmp280_write_oversampling_ratio_temp()
512 const int n = data->chip_info->num_oversampling_temp_avail; in bmp280_write_oversampling_ratio_temp()
516 data->oversampling_temp = ilog2(val); in bmp280_write_oversampling_ratio_temp()
518 return data->chip_info->chip_config(data); in bmp280_write_oversampling_ratio_temp()
521 return -EINVAL; in bmp280_write_oversampling_ratio_temp()
528 const int *avail = data->chip_info->oversampling_press_avail; in bmp280_write_oversampling_ratio_press()
529 const int n = data->chip_info->num_oversampling_press_avail; in bmp280_write_oversampling_ratio_press()
533 data->oversampling_press = ilog2(val); in bmp280_write_oversampling_ratio_press()
535 return data->chip_info->chip_config(data); in bmp280_write_oversampling_ratio_press()
538 return -EINVAL; in bmp280_write_oversampling_ratio_press()
550 pm_runtime_get_sync(data->dev); in bmp280_write_raw()
551 mutex_lock(&data->lock); in bmp280_write_raw()
552 switch (chan->type) { in bmp280_write_raw()
563 ret = -EINVAL; in bmp280_write_raw()
566 mutex_unlock(&data->lock); in bmp280_write_raw()
567 pm_runtime_mark_last_busy(data->dev); in bmp280_write_raw()
568 pm_runtime_put_autosuspend(data->dev); in bmp280_write_raw()
571 return -EINVAL; in bmp280_write_raw()
586 switch (chan->type) { in bmp280_read_avail()
588 *vals = data->chip_info->oversampling_press_avail; in bmp280_read_avail()
589 *length = data->chip_info->num_oversampling_press_avail; in bmp280_read_avail()
592 *vals = data->chip_info->oversampling_temp_avail; in bmp280_read_avail()
593 *length = data->chip_info->num_oversampling_temp_avail; in bmp280_read_avail()
596 return -EINVAL; in bmp280_read_avail()
601 return -EINVAL; in bmp280_read_avail()
614 u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) | in bmp280_chip_config()
615 BMP280_OSRS_PRESS_X(data->oversampling_press + 1); in bmp280_chip_config()
617 ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS, in bmp280_chip_config()
623 dev_err(data->dev, in bmp280_chip_config()
628 ret = regmap_update_bits(data->regmap, BMP280_REG_CONFIG, in bmp280_chip_config()
632 dev_err(data->dev, in bmp280_chip_config()
657 u8 osrs = BMP280_OSRS_HUMIDITIY_X(data->oversampling_humid + 1); in bme280_chip_config()
663 ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_HUMIDITY, in bme280_chip_config()
695 if (data->use_eoc) in bmp180_measure()
696 reinit_completion(&data->done); in bmp180_measure()
698 ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas); in bmp180_measure()
702 if (data->use_eoc) { in bmp180_measure()
706 * advanced resolution mode. in bmp180_measure()
708 ret = wait_for_completion_timeout(&data->done, in bmp180_measure()
711 dev_err(data->dev, "timeout waiting for completion\n"); in bmp180_measure()
717 conversion_time_max[data->oversampling_press]; in bmp180_measure()
722 ret = regmap_read(data->regmap, BMP280_REG_CTRL_MEAS, &ctrl); in bmp180_measure()
728 return -EIO; in bmp180_measure()
742 ret = regmap_bulk_read(data->regmap, BMP180_REG_OUT_MSB, &tmp, 2); in bmp180_read_adc_temp()
758 ret = regmap_bulk_read(data->regmap, BMP180_REG_CALIB_START, buf, in bmp180_read_calib()
767 return -EIO; in bmp180_read_calib()
773 calib->AC1 = be16_to_cpu(buf[AC1]); in bmp180_read_calib()
774 calib->AC2 = be16_to_cpu(buf[AC2]); in bmp180_read_calib()
775 calib->AC3 = be16_to_cpu(buf[AC3]); in bmp180_read_calib()
776 calib->AC4 = be16_to_cpu(buf[AC4]); in bmp180_read_calib()
777 calib->AC5 = be16_to_cpu(buf[AC5]); in bmp180_read_calib()
778 calib->AC6 = be16_to_cpu(buf[AC6]); in bmp180_read_calib()
779 calib->B1 = be16_to_cpu(buf[B1]); in bmp180_read_calib()
780 calib->B2 = be16_to_cpu(buf[B2]); in bmp180_read_calib()
781 calib->MB = be16_to_cpu(buf[MB]); in bmp180_read_calib()
782 calib->MC = be16_to_cpu(buf[MC]); in bmp180_read_calib()
783 calib->MD = be16_to_cpu(buf[MD]); in bmp180_read_calib()
789 * Returns temperature in DegC, resolution is 0.1 DegC.
797 struct bmp180_calib *calib = &data->calib.bmp180; in bmp180_compensate_temp()
799 x1 = ((adc_temp - calib->AC6) * calib->AC5) >> 15; in bmp180_compensate_temp()
800 x2 = (calib->MC << 11) / (x1 + calib->MD); in bmp180_compensate_temp()
801 data->t_fine = x1 + x2; in bmp180_compensate_temp()
803 return (data->t_fine + 8) >> 4; in bmp180_compensate_temp()
833 u8 oss = data->oversampling_press; in bmp180_read_adc_press()
839 ret = regmap_bulk_read(data->regmap, BMP180_REG_OUT_MSB, &tmp, 3); in bmp180_read_adc_press()
843 *val = (be32_to_cpu(tmp) >> 8) >> (8 - oss); in bmp180_read_adc_press()
849 * Returns pressure in Pa, resolution is 1 Pa.
858 s32 oss = data->oversampling_press; in bmp180_compensate_press()
859 struct bmp180_calib *calib = &data->calib.bmp180; in bmp180_compensate_press()
861 b6 = data->t_fine - 4000; in bmp180_compensate_press()
862 x1 = (calib->B2 * (b6 * b6 >> 12)) >> 11; in bmp180_compensate_press()
863 x2 = calib->AC2 * b6 >> 11; in bmp180_compensate_press()
865 b3 = ((((s32)calib->AC1 * 4 + x3) << oss) + 2) / 4; in bmp180_compensate_press()
866 x1 = calib->AC3 * b6 >> 13; in bmp180_compensate_press()
867 x2 = (calib->B1 * ((b6 * b6) >> 12)) >> 16; in bmp180_compensate_press()
869 b4 = calib->AC4 * (u32)(x3 + 32768) >> 15; in bmp180_compensate_press()
870 b7 = ((u32)adc_press - b3) * (50000 >> oss); in bmp180_compensate_press()
878 x2 = (-7357 * p) >> 16; in bmp180_compensate_press()
933 complete(&data->done); in bmp085_eoc_irq()
948 dev_err(dev, "non-rising trigger given for EOC interrupt, trying to enforce it\n"); in bmp085_fetch_eoc_irq()
952 init_completion(&data->done); in bmp085_fetch_eoc_irq()
967 data->use_eoc = true; in bmp085_fetch_eoc_irq()
1001 return -ENOMEM; in bmp280_common_probe()
1004 mutex_init(&data->lock); in bmp280_common_probe()
1005 data->dev = dev; in bmp280_common_probe()
1007 indio_dev->name = name; in bmp280_common_probe()
1008 indio_dev->channels = bmp280_channels; in bmp280_common_probe()
1009 indio_dev->info = &bmp280_info; in bmp280_common_probe()
1010 indio_dev->modes = INDIO_DIRECT_MODE; in bmp280_common_probe()
1014 indio_dev->num_channels = 2; in bmp280_common_probe()
1015 data->chip_info = &bmp180_chip_info; in bmp280_common_probe()
1016 data->oversampling_press = ilog2(8); in bmp280_common_probe()
1017 data->oversampling_temp = ilog2(1); in bmp280_common_probe()
1018 data->start_up_time = 10000; in bmp280_common_probe()
1021 indio_dev->num_channels = 2; in bmp280_common_probe()
1022 data->chip_info = &bmp280_chip_info; in bmp280_common_probe()
1023 data->oversampling_press = ilog2(16); in bmp280_common_probe()
1024 data->oversampling_temp = ilog2(2); in bmp280_common_probe()
1025 data->start_up_time = 2000; in bmp280_common_probe()
1028 indio_dev->num_channels = 3; in bmp280_common_probe()
1029 data->chip_info = &bme280_chip_info; in bmp280_common_probe()
1030 data->oversampling_press = ilog2(16); in bmp280_common_probe()
1031 data->oversampling_humid = ilog2(16); in bmp280_common_probe()
1032 data->oversampling_temp = ilog2(2); in bmp280_common_probe()
1033 data->start_up_time = 2000; in bmp280_common_probe()
1036 return -EINVAL; in bmp280_common_probe()
1040 regulator_bulk_set_supply_names(data->supplies, in bmp280_common_probe()
1045 BMP280_NUM_SUPPLIES, data->supplies); in bmp280_common_probe()
1051 ret = regulator_bulk_enable(BMP280_NUM_SUPPLIES, data->supplies); in bmp280_common_probe()
1058 data->supplies); in bmp280_common_probe()
1063 usleep_range(data->start_up_time, data->start_up_time + 100); in bmp280_common_probe()
1065 /* Bring chip out of reset if there is an assigned GPIO line */ in bmp280_common_probe()
1073 data->regmap = regmap; in bmp280_common_probe()
1080 return -EINVAL; in bmp280_common_probe()
1083 ret = data->chip_info->chip_config(data); in bmp280_common_probe()
1091 * non-volatile memory during production". Let's read them out at probe in bmp280_common_probe()
1095 ret = bmp180_read_calib(data, &data->calib.bmp180); in bmp280_common_probe()
1097 dev_err(data->dev, in bmp280_common_probe()
1102 ret = bmp280_read_calib(data, &data->calib.bmp280, chip_id); in bmp280_common_probe()
1104 dev_err(data->dev, in bmp280_common_probe()
1111 * Attempt to grab an optional EOC IRQ - only the BMP085 has this in bmp280_common_probe()
1127 * start-up time. in bmp280_common_probe()
1129 pm_runtime_set_autosuspend_delay(dev, data->start_up_time / 10); in bmp280_common_probe()
1147 return regulator_bulk_disable(BMP280_NUM_SUPPLIES, data->supplies); in bmp280_runtime_suspend()
1156 ret = regulator_bulk_enable(BMP280_NUM_SUPPLIES, data->supplies); in bmp280_runtime_resume()
1159 usleep_range(data->start_up_time, data->start_up_time + 100); in bmp280_runtime_resume()
1160 return data->chip_info->chip_config(data); in bmp280_runtime_resume()