1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2010 Christoph Mair <christoph.mair@gmail.com>
4*4882a593Smuzhiyun * Copyright (c) 2012 Bosch Sensortec GmbH
5*4882a593Smuzhiyun * Copyright (c) 2012 Unixphere AB
6*4882a593Smuzhiyun * Copyright (c) 2014 Intel Corporation
7*4882a593Smuzhiyun * Copyright (c) 2016 Linus Walleij <linus.walleij@linaro.org>
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Driver for Bosch Sensortec BMP180 and BMP280 digital pressure sensor.
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Datasheet:
12*4882a593Smuzhiyun * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP180-DS000-121.pdf
13*4882a593Smuzhiyun * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP280-DS001-12.pdf
14*4882a593Smuzhiyun * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define pr_fmt(fmt) "bmp280: " fmt
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include <linux/device.h>
20*4882a593Smuzhiyun #include <linux/module.h>
21*4882a593Smuzhiyun #include <linux/regmap.h>
22*4882a593Smuzhiyun #include <linux/delay.h>
23*4882a593Smuzhiyun #include <linux/iio/iio.h>
24*4882a593Smuzhiyun #include <linux/iio/sysfs.h>
25*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
26*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
27*4882a593Smuzhiyun #include <linux/interrupt.h>
28*4882a593Smuzhiyun #include <linux/irq.h> /* For irq_get_irq_data() */
29*4882a593Smuzhiyun #include <linux/completion.h>
30*4882a593Smuzhiyun #include <linux/pm_runtime.h>
31*4882a593Smuzhiyun #include <linux/random.h>
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #include "bmp280.h"
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun /*
36*4882a593Smuzhiyun * These enums are used for indexing into the array of calibration
37*4882a593Smuzhiyun * coefficients for BMP180.
38*4882a593Smuzhiyun */
39*4882a593Smuzhiyun enum { AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD };
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun struct bmp180_calib {
42*4882a593Smuzhiyun s16 AC1;
43*4882a593Smuzhiyun s16 AC2;
44*4882a593Smuzhiyun s16 AC3;
45*4882a593Smuzhiyun u16 AC4;
46*4882a593Smuzhiyun u16 AC5;
47*4882a593Smuzhiyun u16 AC6;
48*4882a593Smuzhiyun s16 B1;
49*4882a593Smuzhiyun s16 B2;
50*4882a593Smuzhiyun s16 MB;
51*4882a593Smuzhiyun s16 MC;
52*4882a593Smuzhiyun s16 MD;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /* See datasheet Section 4.2.2. */
56*4882a593Smuzhiyun struct bmp280_calib {
57*4882a593Smuzhiyun u16 T1;
58*4882a593Smuzhiyun s16 T2;
59*4882a593Smuzhiyun s16 T3;
60*4882a593Smuzhiyun u16 P1;
61*4882a593Smuzhiyun s16 P2;
62*4882a593Smuzhiyun s16 P3;
63*4882a593Smuzhiyun s16 P4;
64*4882a593Smuzhiyun s16 P5;
65*4882a593Smuzhiyun s16 P6;
66*4882a593Smuzhiyun s16 P7;
67*4882a593Smuzhiyun s16 P8;
68*4882a593Smuzhiyun s16 P9;
69*4882a593Smuzhiyun u8 H1;
70*4882a593Smuzhiyun s16 H2;
71*4882a593Smuzhiyun u8 H3;
72*4882a593Smuzhiyun s16 H4;
73*4882a593Smuzhiyun s16 H5;
74*4882a593Smuzhiyun s8 H6;
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun static const char *const bmp280_supply_names[] = {
78*4882a593Smuzhiyun "vddd", "vdda"
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #define BMP280_NUM_SUPPLIES ARRAY_SIZE(bmp280_supply_names)
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun struct bmp280_data {
84*4882a593Smuzhiyun struct device *dev;
85*4882a593Smuzhiyun struct mutex lock;
86*4882a593Smuzhiyun struct regmap *regmap;
87*4882a593Smuzhiyun struct completion done;
88*4882a593Smuzhiyun bool use_eoc;
89*4882a593Smuzhiyun const struct bmp280_chip_info *chip_info;
90*4882a593Smuzhiyun union {
91*4882a593Smuzhiyun struct bmp180_calib bmp180;
92*4882a593Smuzhiyun struct bmp280_calib bmp280;
93*4882a593Smuzhiyun } calib;
94*4882a593Smuzhiyun struct regulator_bulk_data supplies[BMP280_NUM_SUPPLIES];
95*4882a593Smuzhiyun unsigned int start_up_time; /* in microseconds */
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /* log of base 2 of oversampling rate */
98*4882a593Smuzhiyun u8 oversampling_press;
99*4882a593Smuzhiyun u8 oversampling_temp;
100*4882a593Smuzhiyun u8 oversampling_humid;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun /*
103*4882a593Smuzhiyun * Carryover value from temperature conversion, used in pressure
104*4882a593Smuzhiyun * calculation.
105*4882a593Smuzhiyun */
106*4882a593Smuzhiyun s32 t_fine;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun struct bmp280_chip_info {
110*4882a593Smuzhiyun const int *oversampling_temp_avail;
111*4882a593Smuzhiyun int num_oversampling_temp_avail;
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun const int *oversampling_press_avail;
114*4882a593Smuzhiyun int num_oversampling_press_avail;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun const int *oversampling_humid_avail;
117*4882a593Smuzhiyun int num_oversampling_humid_avail;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun int (*chip_config)(struct bmp280_data *);
120*4882a593Smuzhiyun int (*read_temp)(struct bmp280_data *, int *);
121*4882a593Smuzhiyun int (*read_press)(struct bmp280_data *, int *, int *);
122*4882a593Smuzhiyun int (*read_humid)(struct bmp280_data *, int *, int *);
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun /*
126*4882a593Smuzhiyun * These enums are used for indexing into the array of compensation
127*4882a593Smuzhiyun * parameters for BMP280.
128*4882a593Smuzhiyun */
129*4882a593Smuzhiyun enum { T1, T2, T3 };
130*4882a593Smuzhiyun enum { P1, P2, P3, P4, P5, P6, P7, P8, P9 };
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun static const struct iio_chan_spec bmp280_channels[] = {
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun .type = IIO_PRESSURE,
135*4882a593Smuzhiyun .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
136*4882a593Smuzhiyun BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
137*4882a593Smuzhiyun },
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun .type = IIO_TEMP,
140*4882a593Smuzhiyun .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
141*4882a593Smuzhiyun BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
142*4882a593Smuzhiyun },
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun .type = IIO_HUMIDITYRELATIVE,
145*4882a593Smuzhiyun .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
146*4882a593Smuzhiyun BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
147*4882a593Smuzhiyun },
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun
bmp280_read_calib(struct bmp280_data * data,struct bmp280_calib * calib,unsigned int chip)150*4882a593Smuzhiyun static int bmp280_read_calib(struct bmp280_data *data,
151*4882a593Smuzhiyun struct bmp280_calib *calib,
152*4882a593Smuzhiyun unsigned int chip)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun int ret;
155*4882a593Smuzhiyun unsigned int tmp;
156*4882a593Smuzhiyun __le16 l16;
157*4882a593Smuzhiyun __be16 b16;
158*4882a593Smuzhiyun struct device *dev = data->dev;
159*4882a593Smuzhiyun __le16 t_buf[BMP280_COMP_TEMP_REG_COUNT / 2];
160*4882a593Smuzhiyun __le16 p_buf[BMP280_COMP_PRESS_REG_COUNT / 2];
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /* Read temperature calibration values. */
163*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_TEMP_START,
164*4882a593Smuzhiyun t_buf, BMP280_COMP_TEMP_REG_COUNT);
165*4882a593Smuzhiyun if (ret < 0) {
166*4882a593Smuzhiyun dev_err(data->dev,
167*4882a593Smuzhiyun "failed to read temperature calibration parameters\n");
168*4882a593Smuzhiyun return ret;
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun /* Toss the temperature calibration data into the entropy pool */
172*4882a593Smuzhiyun add_device_randomness(t_buf, sizeof(t_buf));
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun calib->T1 = le16_to_cpu(t_buf[T1]);
175*4882a593Smuzhiyun calib->T2 = le16_to_cpu(t_buf[T2]);
176*4882a593Smuzhiyun calib->T3 = le16_to_cpu(t_buf[T3]);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /* Read pressure calibration values. */
179*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_PRESS_START,
180*4882a593Smuzhiyun p_buf, BMP280_COMP_PRESS_REG_COUNT);
181*4882a593Smuzhiyun if (ret < 0) {
182*4882a593Smuzhiyun dev_err(data->dev,
183*4882a593Smuzhiyun "failed to read pressure calibration parameters\n");
184*4882a593Smuzhiyun return ret;
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /* Toss the pressure calibration data into the entropy pool */
188*4882a593Smuzhiyun add_device_randomness(p_buf, sizeof(p_buf));
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun calib->P1 = le16_to_cpu(p_buf[P1]);
191*4882a593Smuzhiyun calib->P2 = le16_to_cpu(p_buf[P2]);
192*4882a593Smuzhiyun calib->P3 = le16_to_cpu(p_buf[P3]);
193*4882a593Smuzhiyun calib->P4 = le16_to_cpu(p_buf[P4]);
194*4882a593Smuzhiyun calib->P5 = le16_to_cpu(p_buf[P5]);
195*4882a593Smuzhiyun calib->P6 = le16_to_cpu(p_buf[P6]);
196*4882a593Smuzhiyun calib->P7 = le16_to_cpu(p_buf[P7]);
197*4882a593Smuzhiyun calib->P8 = le16_to_cpu(p_buf[P8]);
198*4882a593Smuzhiyun calib->P9 = le16_to_cpu(p_buf[P9]);
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun /*
201*4882a593Smuzhiyun * Read humidity calibration values.
202*4882a593Smuzhiyun * Due to some odd register addressing we cannot just
203*4882a593Smuzhiyun * do a big bulk read. Instead, we have to read each Hx
204*4882a593Smuzhiyun * value separately and sometimes do some bit shifting...
205*4882a593Smuzhiyun * Humidity data is only available on BME280.
206*4882a593Smuzhiyun */
207*4882a593Smuzhiyun if (chip != BME280_CHIP_ID)
208*4882a593Smuzhiyun return 0;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun ret = regmap_read(data->regmap, BMP280_REG_COMP_H1, &tmp);
211*4882a593Smuzhiyun if (ret < 0) {
212*4882a593Smuzhiyun dev_err(dev, "failed to read H1 comp value\n");
213*4882a593Smuzhiyun return ret;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun calib->H1 = tmp;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_H2, &l16, 2);
218*4882a593Smuzhiyun if (ret < 0) {
219*4882a593Smuzhiyun dev_err(dev, "failed to read H2 comp value\n");
220*4882a593Smuzhiyun return ret;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun calib->H2 = sign_extend32(le16_to_cpu(l16), 15);
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun ret = regmap_read(data->regmap, BMP280_REG_COMP_H3, &tmp);
225*4882a593Smuzhiyun if (ret < 0) {
226*4882a593Smuzhiyun dev_err(dev, "failed to read H3 comp value\n");
227*4882a593Smuzhiyun return ret;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun calib->H3 = tmp;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_H4, &b16, 2);
232*4882a593Smuzhiyun if (ret < 0) {
233*4882a593Smuzhiyun dev_err(dev, "failed to read H4 comp value\n");
234*4882a593Smuzhiyun return ret;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun calib->H4 = sign_extend32(((be16_to_cpu(b16) >> 4) & 0xff0) |
237*4882a593Smuzhiyun (be16_to_cpu(b16) & 0xf), 11);
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_H5, &l16, 2);
240*4882a593Smuzhiyun if (ret < 0) {
241*4882a593Smuzhiyun dev_err(dev, "failed to read H5 comp value\n");
242*4882a593Smuzhiyun return ret;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun calib->H5 = sign_extend32(((le16_to_cpu(l16) >> 4) & 0xfff), 11);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun ret = regmap_read(data->regmap, BMP280_REG_COMP_H6, &tmp);
247*4882a593Smuzhiyun if (ret < 0) {
248*4882a593Smuzhiyun dev_err(dev, "failed to read H6 comp value\n");
249*4882a593Smuzhiyun return ret;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun calib->H6 = sign_extend32(tmp, 7);
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun return 0;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun /*
256*4882a593Smuzhiyun * Returns humidity in percent, resolution is 0.01 percent. Output value of
257*4882a593Smuzhiyun * "47445" represents 47445/1024 = 46.333 %RH.
258*4882a593Smuzhiyun *
259*4882a593Smuzhiyun * Taken from BME280 datasheet, Section 4.2.3, "Compensation formula".
260*4882a593Smuzhiyun */
bmp280_compensate_humidity(struct bmp280_data * data,s32 adc_humidity)261*4882a593Smuzhiyun static u32 bmp280_compensate_humidity(struct bmp280_data *data,
262*4882a593Smuzhiyun s32 adc_humidity)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun s32 var;
265*4882a593Smuzhiyun struct bmp280_calib *calib = &data->calib.bmp280;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun var = ((s32)data->t_fine) - (s32)76800;
268*4882a593Smuzhiyun var = ((((adc_humidity << 14) - (calib->H4 << 20) - (calib->H5 * var))
269*4882a593Smuzhiyun + (s32)16384) >> 15) * (((((((var * calib->H6) >> 10)
270*4882a593Smuzhiyun * (((var * (s32)calib->H3) >> 11) + (s32)32768)) >> 10)
271*4882a593Smuzhiyun + (s32)2097152) * calib->H2 + 8192) >> 14);
272*4882a593Smuzhiyun var -= ((((var >> 15) * (var >> 15)) >> 7) * (s32)calib->H1) >> 4;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun var = clamp_val(var, 0, 419430400);
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun return var >> 12;
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun /*
280*4882a593Smuzhiyun * Returns temperature in DegC, resolution is 0.01 DegC. Output value of
281*4882a593Smuzhiyun * "5123" equals 51.23 DegC. t_fine carries fine temperature as global
282*4882a593Smuzhiyun * value.
283*4882a593Smuzhiyun *
284*4882a593Smuzhiyun * Taken from datasheet, Section 3.11.3, "Compensation formula".
285*4882a593Smuzhiyun */
bmp280_compensate_temp(struct bmp280_data * data,s32 adc_temp)286*4882a593Smuzhiyun static s32 bmp280_compensate_temp(struct bmp280_data *data,
287*4882a593Smuzhiyun s32 adc_temp)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun s32 var1, var2;
290*4882a593Smuzhiyun struct bmp280_calib *calib = &data->calib.bmp280;
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun var1 = (((adc_temp >> 3) - ((s32)calib->T1 << 1)) *
293*4882a593Smuzhiyun ((s32)calib->T2)) >> 11;
294*4882a593Smuzhiyun var2 = (((((adc_temp >> 4) - ((s32)calib->T1)) *
295*4882a593Smuzhiyun ((adc_temp >> 4) - ((s32)calib->T1))) >> 12) *
296*4882a593Smuzhiyun ((s32)calib->T3)) >> 14;
297*4882a593Smuzhiyun data->t_fine = var1 + var2;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun return (data->t_fine * 5 + 128) >> 8;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /*
303*4882a593Smuzhiyun * Returns pressure in Pa as unsigned 32 bit integer in Q24.8 format (24
304*4882a593Smuzhiyun * integer bits and 8 fractional bits). Output value of "24674867"
305*4882a593Smuzhiyun * represents 24674867/256 = 96386.2 Pa = 963.862 hPa
306*4882a593Smuzhiyun *
307*4882a593Smuzhiyun * Taken from datasheet, Section 3.11.3, "Compensation formula".
308*4882a593Smuzhiyun */
bmp280_compensate_press(struct bmp280_data * data,s32 adc_press)309*4882a593Smuzhiyun static u32 bmp280_compensate_press(struct bmp280_data *data,
310*4882a593Smuzhiyun s32 adc_press)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun s64 var1, var2, p;
313*4882a593Smuzhiyun struct bmp280_calib *calib = &data->calib.bmp280;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun var1 = ((s64)data->t_fine) - 128000;
316*4882a593Smuzhiyun var2 = var1 * var1 * (s64)calib->P6;
317*4882a593Smuzhiyun var2 += (var1 * (s64)calib->P5) << 17;
318*4882a593Smuzhiyun var2 += ((s64)calib->P4) << 35;
319*4882a593Smuzhiyun var1 = ((var1 * var1 * (s64)calib->P3) >> 8) +
320*4882a593Smuzhiyun ((var1 * (s64)calib->P2) << 12);
321*4882a593Smuzhiyun var1 = ((((s64)1) << 47) + var1) * ((s64)calib->P1) >> 33;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun if (var1 == 0)
324*4882a593Smuzhiyun return 0;
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun p = ((((s64)1048576 - adc_press) << 31) - var2) * 3125;
327*4882a593Smuzhiyun p = div64_s64(p, var1);
328*4882a593Smuzhiyun var1 = (((s64)calib->P9) * (p >> 13) * (p >> 13)) >> 25;
329*4882a593Smuzhiyun var2 = ((s64)(calib->P8) * p) >> 19;
330*4882a593Smuzhiyun p = ((p + var1 + var2) >> 8) + (((s64)calib->P7) << 4);
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun return (u32)p;
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun
bmp280_read_temp(struct bmp280_data * data,int * val)335*4882a593Smuzhiyun static int bmp280_read_temp(struct bmp280_data *data,
336*4882a593Smuzhiyun int *val)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun int ret;
339*4882a593Smuzhiyun __be32 tmp = 0;
340*4882a593Smuzhiyun s32 adc_temp, comp_temp;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_TEMP_MSB, &tmp, 3);
343*4882a593Smuzhiyun if (ret < 0) {
344*4882a593Smuzhiyun dev_err(data->dev, "failed to read temperature\n");
345*4882a593Smuzhiyun return ret;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun adc_temp = be32_to_cpu(tmp) >> 12;
349*4882a593Smuzhiyun if (adc_temp == BMP280_TEMP_SKIPPED) {
350*4882a593Smuzhiyun /* reading was skipped */
351*4882a593Smuzhiyun dev_err(data->dev, "reading temperature skipped\n");
352*4882a593Smuzhiyun return -EIO;
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun comp_temp = bmp280_compensate_temp(data, adc_temp);
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun /*
357*4882a593Smuzhiyun * val might be NULL if we're called by the read_press routine,
358*4882a593Smuzhiyun * who only cares about the carry over t_fine value.
359*4882a593Smuzhiyun */
360*4882a593Smuzhiyun if (val) {
361*4882a593Smuzhiyun *val = comp_temp * 10;
362*4882a593Smuzhiyun return IIO_VAL_INT;
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun return 0;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
bmp280_read_press(struct bmp280_data * data,int * val,int * val2)368*4882a593Smuzhiyun static int bmp280_read_press(struct bmp280_data *data,
369*4882a593Smuzhiyun int *val, int *val2)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun int ret;
372*4882a593Smuzhiyun __be32 tmp = 0;
373*4882a593Smuzhiyun s32 adc_press;
374*4882a593Smuzhiyun u32 comp_press;
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun /* Read and compensate temperature so we get a reading of t_fine. */
377*4882a593Smuzhiyun ret = bmp280_read_temp(data, NULL);
378*4882a593Smuzhiyun if (ret < 0)
379*4882a593Smuzhiyun return ret;
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_PRESS_MSB, &tmp, 3);
382*4882a593Smuzhiyun if (ret < 0) {
383*4882a593Smuzhiyun dev_err(data->dev, "failed to read pressure\n");
384*4882a593Smuzhiyun return ret;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun adc_press = be32_to_cpu(tmp) >> 12;
388*4882a593Smuzhiyun if (adc_press == BMP280_PRESS_SKIPPED) {
389*4882a593Smuzhiyun /* reading was skipped */
390*4882a593Smuzhiyun dev_err(data->dev, "reading pressure skipped\n");
391*4882a593Smuzhiyun return -EIO;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun comp_press = bmp280_compensate_press(data, adc_press);
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun *val = comp_press;
396*4882a593Smuzhiyun *val2 = 256000;
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun return IIO_VAL_FRACTIONAL;
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun
bmp280_read_humid(struct bmp280_data * data,int * val,int * val2)401*4882a593Smuzhiyun static int bmp280_read_humid(struct bmp280_data *data, int *val, int *val2)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun __be16 tmp;
404*4882a593Smuzhiyun int ret;
405*4882a593Smuzhiyun s32 adc_humidity;
406*4882a593Smuzhiyun u32 comp_humidity;
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun /* Read and compensate temperature so we get a reading of t_fine. */
409*4882a593Smuzhiyun ret = bmp280_read_temp(data, NULL);
410*4882a593Smuzhiyun if (ret < 0)
411*4882a593Smuzhiyun return ret;
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP280_REG_HUMIDITY_MSB, &tmp, 2);
414*4882a593Smuzhiyun if (ret < 0) {
415*4882a593Smuzhiyun dev_err(data->dev, "failed to read humidity\n");
416*4882a593Smuzhiyun return ret;
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun adc_humidity = be16_to_cpu(tmp);
420*4882a593Smuzhiyun if (adc_humidity == BMP280_HUMIDITY_SKIPPED) {
421*4882a593Smuzhiyun /* reading was skipped */
422*4882a593Smuzhiyun dev_err(data->dev, "reading humidity skipped\n");
423*4882a593Smuzhiyun return -EIO;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun comp_humidity = bmp280_compensate_humidity(data, adc_humidity);
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun *val = comp_humidity * 1000 / 1024;
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun return IIO_VAL_INT;
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun
bmp280_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)432*4882a593Smuzhiyun static int bmp280_read_raw(struct iio_dev *indio_dev,
433*4882a593Smuzhiyun struct iio_chan_spec const *chan,
434*4882a593Smuzhiyun int *val, int *val2, long mask)
435*4882a593Smuzhiyun {
436*4882a593Smuzhiyun int ret;
437*4882a593Smuzhiyun struct bmp280_data *data = iio_priv(indio_dev);
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun pm_runtime_get_sync(data->dev);
440*4882a593Smuzhiyun mutex_lock(&data->lock);
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun switch (mask) {
443*4882a593Smuzhiyun case IIO_CHAN_INFO_PROCESSED:
444*4882a593Smuzhiyun switch (chan->type) {
445*4882a593Smuzhiyun case IIO_HUMIDITYRELATIVE:
446*4882a593Smuzhiyun ret = data->chip_info->read_humid(data, val, val2);
447*4882a593Smuzhiyun break;
448*4882a593Smuzhiyun case IIO_PRESSURE:
449*4882a593Smuzhiyun ret = data->chip_info->read_press(data, val, val2);
450*4882a593Smuzhiyun break;
451*4882a593Smuzhiyun case IIO_TEMP:
452*4882a593Smuzhiyun ret = data->chip_info->read_temp(data, val);
453*4882a593Smuzhiyun break;
454*4882a593Smuzhiyun default:
455*4882a593Smuzhiyun ret = -EINVAL;
456*4882a593Smuzhiyun break;
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun break;
459*4882a593Smuzhiyun case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
460*4882a593Smuzhiyun switch (chan->type) {
461*4882a593Smuzhiyun case IIO_HUMIDITYRELATIVE:
462*4882a593Smuzhiyun *val = 1 << data->oversampling_humid;
463*4882a593Smuzhiyun ret = IIO_VAL_INT;
464*4882a593Smuzhiyun break;
465*4882a593Smuzhiyun case IIO_PRESSURE:
466*4882a593Smuzhiyun *val = 1 << data->oversampling_press;
467*4882a593Smuzhiyun ret = IIO_VAL_INT;
468*4882a593Smuzhiyun break;
469*4882a593Smuzhiyun case IIO_TEMP:
470*4882a593Smuzhiyun *val = 1 << data->oversampling_temp;
471*4882a593Smuzhiyun ret = IIO_VAL_INT;
472*4882a593Smuzhiyun break;
473*4882a593Smuzhiyun default:
474*4882a593Smuzhiyun ret = -EINVAL;
475*4882a593Smuzhiyun break;
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun break;
478*4882a593Smuzhiyun default:
479*4882a593Smuzhiyun ret = -EINVAL;
480*4882a593Smuzhiyun break;
481*4882a593Smuzhiyun }
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun mutex_unlock(&data->lock);
484*4882a593Smuzhiyun pm_runtime_mark_last_busy(data->dev);
485*4882a593Smuzhiyun pm_runtime_put_autosuspend(data->dev);
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun return ret;
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun
bmp280_write_oversampling_ratio_humid(struct bmp280_data * data,int val)490*4882a593Smuzhiyun static int bmp280_write_oversampling_ratio_humid(struct bmp280_data *data,
491*4882a593Smuzhiyun int val)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun int i;
494*4882a593Smuzhiyun const int *avail = data->chip_info->oversampling_humid_avail;
495*4882a593Smuzhiyun const int n = data->chip_info->num_oversampling_humid_avail;
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun for (i = 0; i < n; i++) {
498*4882a593Smuzhiyun if (avail[i] == val) {
499*4882a593Smuzhiyun data->oversampling_humid = ilog2(val);
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun return data->chip_info->chip_config(data);
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun return -EINVAL;
505*4882a593Smuzhiyun }
506*4882a593Smuzhiyun
bmp280_write_oversampling_ratio_temp(struct bmp280_data * data,int val)507*4882a593Smuzhiyun static int bmp280_write_oversampling_ratio_temp(struct bmp280_data *data,
508*4882a593Smuzhiyun int val)
509*4882a593Smuzhiyun {
510*4882a593Smuzhiyun int i;
511*4882a593Smuzhiyun const int *avail = data->chip_info->oversampling_temp_avail;
512*4882a593Smuzhiyun const int n = data->chip_info->num_oversampling_temp_avail;
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun for (i = 0; i < n; i++) {
515*4882a593Smuzhiyun if (avail[i] == val) {
516*4882a593Smuzhiyun data->oversampling_temp = ilog2(val);
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun return data->chip_info->chip_config(data);
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun return -EINVAL;
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun
bmp280_write_oversampling_ratio_press(struct bmp280_data * data,int val)524*4882a593Smuzhiyun static int bmp280_write_oversampling_ratio_press(struct bmp280_data *data,
525*4882a593Smuzhiyun int val)
526*4882a593Smuzhiyun {
527*4882a593Smuzhiyun int i;
528*4882a593Smuzhiyun const int *avail = data->chip_info->oversampling_press_avail;
529*4882a593Smuzhiyun const int n = data->chip_info->num_oversampling_press_avail;
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun for (i = 0; i < n; i++) {
532*4882a593Smuzhiyun if (avail[i] == val) {
533*4882a593Smuzhiyun data->oversampling_press = ilog2(val);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun return data->chip_info->chip_config(data);
536*4882a593Smuzhiyun }
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun return -EINVAL;
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun
bmp280_write_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int val,int val2,long mask)541*4882a593Smuzhiyun static int bmp280_write_raw(struct iio_dev *indio_dev,
542*4882a593Smuzhiyun struct iio_chan_spec const *chan,
543*4882a593Smuzhiyun int val, int val2, long mask)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun int ret = 0;
546*4882a593Smuzhiyun struct bmp280_data *data = iio_priv(indio_dev);
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun switch (mask) {
549*4882a593Smuzhiyun case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
550*4882a593Smuzhiyun pm_runtime_get_sync(data->dev);
551*4882a593Smuzhiyun mutex_lock(&data->lock);
552*4882a593Smuzhiyun switch (chan->type) {
553*4882a593Smuzhiyun case IIO_HUMIDITYRELATIVE:
554*4882a593Smuzhiyun ret = bmp280_write_oversampling_ratio_humid(data, val);
555*4882a593Smuzhiyun break;
556*4882a593Smuzhiyun case IIO_PRESSURE:
557*4882a593Smuzhiyun ret = bmp280_write_oversampling_ratio_press(data, val);
558*4882a593Smuzhiyun break;
559*4882a593Smuzhiyun case IIO_TEMP:
560*4882a593Smuzhiyun ret = bmp280_write_oversampling_ratio_temp(data, val);
561*4882a593Smuzhiyun break;
562*4882a593Smuzhiyun default:
563*4882a593Smuzhiyun ret = -EINVAL;
564*4882a593Smuzhiyun break;
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun mutex_unlock(&data->lock);
567*4882a593Smuzhiyun pm_runtime_mark_last_busy(data->dev);
568*4882a593Smuzhiyun pm_runtime_put_autosuspend(data->dev);
569*4882a593Smuzhiyun break;
570*4882a593Smuzhiyun default:
571*4882a593Smuzhiyun return -EINVAL;
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun return ret;
575*4882a593Smuzhiyun }
576*4882a593Smuzhiyun
bmp280_read_avail(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,const int ** vals,int * type,int * length,long mask)577*4882a593Smuzhiyun static int bmp280_read_avail(struct iio_dev *indio_dev,
578*4882a593Smuzhiyun struct iio_chan_spec const *chan,
579*4882a593Smuzhiyun const int **vals, int *type, int *length,
580*4882a593Smuzhiyun long mask)
581*4882a593Smuzhiyun {
582*4882a593Smuzhiyun struct bmp280_data *data = iio_priv(indio_dev);
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun switch (mask) {
585*4882a593Smuzhiyun case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
586*4882a593Smuzhiyun switch (chan->type) {
587*4882a593Smuzhiyun case IIO_PRESSURE:
588*4882a593Smuzhiyun *vals = data->chip_info->oversampling_press_avail;
589*4882a593Smuzhiyun *length = data->chip_info->num_oversampling_press_avail;
590*4882a593Smuzhiyun break;
591*4882a593Smuzhiyun case IIO_TEMP:
592*4882a593Smuzhiyun *vals = data->chip_info->oversampling_temp_avail;
593*4882a593Smuzhiyun *length = data->chip_info->num_oversampling_temp_avail;
594*4882a593Smuzhiyun break;
595*4882a593Smuzhiyun default:
596*4882a593Smuzhiyun return -EINVAL;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun *type = IIO_VAL_INT;
599*4882a593Smuzhiyun return IIO_AVAIL_LIST;
600*4882a593Smuzhiyun default:
601*4882a593Smuzhiyun return -EINVAL;
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun static const struct iio_info bmp280_info = {
606*4882a593Smuzhiyun .read_raw = &bmp280_read_raw,
607*4882a593Smuzhiyun .read_avail = &bmp280_read_avail,
608*4882a593Smuzhiyun .write_raw = &bmp280_write_raw,
609*4882a593Smuzhiyun };
610*4882a593Smuzhiyun
bmp280_chip_config(struct bmp280_data * data)611*4882a593Smuzhiyun static int bmp280_chip_config(struct bmp280_data *data)
612*4882a593Smuzhiyun {
613*4882a593Smuzhiyun int ret;
614*4882a593Smuzhiyun u8 osrs = BMP280_OSRS_TEMP_X(data->oversampling_temp + 1) |
615*4882a593Smuzhiyun BMP280_OSRS_PRESS_X(data->oversampling_press + 1);
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun ret = regmap_write_bits(data->regmap, BMP280_REG_CTRL_MEAS,
618*4882a593Smuzhiyun BMP280_OSRS_TEMP_MASK |
619*4882a593Smuzhiyun BMP280_OSRS_PRESS_MASK |
620*4882a593Smuzhiyun BMP280_MODE_MASK,
621*4882a593Smuzhiyun osrs | BMP280_MODE_NORMAL);
622*4882a593Smuzhiyun if (ret < 0) {
623*4882a593Smuzhiyun dev_err(data->dev,
624*4882a593Smuzhiyun "failed to write ctrl_meas register\n");
625*4882a593Smuzhiyun return ret;
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun ret = regmap_update_bits(data->regmap, BMP280_REG_CONFIG,
629*4882a593Smuzhiyun BMP280_FILTER_MASK,
630*4882a593Smuzhiyun BMP280_FILTER_4X);
631*4882a593Smuzhiyun if (ret < 0) {
632*4882a593Smuzhiyun dev_err(data->dev,
633*4882a593Smuzhiyun "failed to write config register\n");
634*4882a593Smuzhiyun return ret;
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun return ret;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun static const int bmp280_oversampling_avail[] = { 1, 2, 4, 8, 16 };
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun static const struct bmp280_chip_info bmp280_chip_info = {
643*4882a593Smuzhiyun .oversampling_temp_avail = bmp280_oversampling_avail,
644*4882a593Smuzhiyun .num_oversampling_temp_avail = ARRAY_SIZE(bmp280_oversampling_avail),
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun .oversampling_press_avail = bmp280_oversampling_avail,
647*4882a593Smuzhiyun .num_oversampling_press_avail = ARRAY_SIZE(bmp280_oversampling_avail),
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun .chip_config = bmp280_chip_config,
650*4882a593Smuzhiyun .read_temp = bmp280_read_temp,
651*4882a593Smuzhiyun .read_press = bmp280_read_press,
652*4882a593Smuzhiyun };
653*4882a593Smuzhiyun
bme280_chip_config(struct bmp280_data * data)654*4882a593Smuzhiyun static int bme280_chip_config(struct bmp280_data *data)
655*4882a593Smuzhiyun {
656*4882a593Smuzhiyun int ret;
657*4882a593Smuzhiyun u8 osrs = BMP280_OSRS_HUMIDITIY_X(data->oversampling_humid + 1);
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun /*
660*4882a593Smuzhiyun * Oversampling of humidity must be set before oversampling of
661*4882a593Smuzhiyun * temperature/pressure is set to become effective.
662*4882a593Smuzhiyun */
663*4882a593Smuzhiyun ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_HUMIDITY,
664*4882a593Smuzhiyun BMP280_OSRS_HUMIDITY_MASK, osrs);
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun if (ret < 0)
667*4882a593Smuzhiyun return ret;
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun return bmp280_chip_config(data);
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun static const struct bmp280_chip_info bme280_chip_info = {
673*4882a593Smuzhiyun .oversampling_temp_avail = bmp280_oversampling_avail,
674*4882a593Smuzhiyun .num_oversampling_temp_avail = ARRAY_SIZE(bmp280_oversampling_avail),
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun .oversampling_press_avail = bmp280_oversampling_avail,
677*4882a593Smuzhiyun .num_oversampling_press_avail = ARRAY_SIZE(bmp280_oversampling_avail),
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun .oversampling_humid_avail = bmp280_oversampling_avail,
680*4882a593Smuzhiyun .num_oversampling_humid_avail = ARRAY_SIZE(bmp280_oversampling_avail),
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun .chip_config = bme280_chip_config,
683*4882a593Smuzhiyun .read_temp = bmp280_read_temp,
684*4882a593Smuzhiyun .read_press = bmp280_read_press,
685*4882a593Smuzhiyun .read_humid = bmp280_read_humid,
686*4882a593Smuzhiyun };
687*4882a593Smuzhiyun
bmp180_measure(struct bmp280_data * data,u8 ctrl_meas)688*4882a593Smuzhiyun static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun int ret;
691*4882a593Smuzhiyun const int conversion_time_max[] = { 4500, 7500, 13500, 25500 };
692*4882a593Smuzhiyun unsigned int delay_us;
693*4882a593Smuzhiyun unsigned int ctrl;
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun if (data->use_eoc)
696*4882a593Smuzhiyun reinit_completion(&data->done);
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun ret = regmap_write(data->regmap, BMP280_REG_CTRL_MEAS, ctrl_meas);
699*4882a593Smuzhiyun if (ret)
700*4882a593Smuzhiyun return ret;
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun if (data->use_eoc) {
703*4882a593Smuzhiyun /*
704*4882a593Smuzhiyun * If we have a completion interrupt, use it, wait up to
705*4882a593Smuzhiyun * 100ms. The longest conversion time listed is 76.5 ms for
706*4882a593Smuzhiyun * advanced resolution mode.
707*4882a593Smuzhiyun */
708*4882a593Smuzhiyun ret = wait_for_completion_timeout(&data->done,
709*4882a593Smuzhiyun 1 + msecs_to_jiffies(100));
710*4882a593Smuzhiyun if (!ret)
711*4882a593Smuzhiyun dev_err(data->dev, "timeout waiting for completion\n");
712*4882a593Smuzhiyun } else {
713*4882a593Smuzhiyun if (ctrl_meas == BMP180_MEAS_TEMP)
714*4882a593Smuzhiyun delay_us = 4500;
715*4882a593Smuzhiyun else
716*4882a593Smuzhiyun delay_us =
717*4882a593Smuzhiyun conversion_time_max[data->oversampling_press];
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun usleep_range(delay_us, delay_us + 1000);
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun ret = regmap_read(data->regmap, BMP280_REG_CTRL_MEAS, &ctrl);
723*4882a593Smuzhiyun if (ret)
724*4882a593Smuzhiyun return ret;
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun /* The value of this bit reset to "0" after conversion is complete */
727*4882a593Smuzhiyun if (ctrl & BMP180_MEAS_SCO)
728*4882a593Smuzhiyun return -EIO;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun return 0;
731*4882a593Smuzhiyun }
732*4882a593Smuzhiyun
bmp180_read_adc_temp(struct bmp280_data * data,int * val)733*4882a593Smuzhiyun static int bmp180_read_adc_temp(struct bmp280_data *data, int *val)
734*4882a593Smuzhiyun {
735*4882a593Smuzhiyun __be16 tmp;
736*4882a593Smuzhiyun int ret;
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun ret = bmp180_measure(data, BMP180_MEAS_TEMP);
739*4882a593Smuzhiyun if (ret)
740*4882a593Smuzhiyun return ret;
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP180_REG_OUT_MSB, &tmp, 2);
743*4882a593Smuzhiyun if (ret)
744*4882a593Smuzhiyun return ret;
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun *val = be16_to_cpu(tmp);
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun return 0;
749*4882a593Smuzhiyun }
750*4882a593Smuzhiyun
bmp180_read_calib(struct bmp280_data * data,struct bmp180_calib * calib)751*4882a593Smuzhiyun static int bmp180_read_calib(struct bmp280_data *data,
752*4882a593Smuzhiyun struct bmp180_calib *calib)
753*4882a593Smuzhiyun {
754*4882a593Smuzhiyun int ret;
755*4882a593Smuzhiyun int i;
756*4882a593Smuzhiyun __be16 buf[BMP180_REG_CALIB_COUNT / 2];
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP180_REG_CALIB_START, buf,
759*4882a593Smuzhiyun sizeof(buf));
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun if (ret < 0)
762*4882a593Smuzhiyun return ret;
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun /* None of the words has the value 0 or 0xFFFF */
765*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(buf); i++) {
766*4882a593Smuzhiyun if (buf[i] == cpu_to_be16(0) || buf[i] == cpu_to_be16(0xffff))
767*4882a593Smuzhiyun return -EIO;
768*4882a593Smuzhiyun }
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun /* Toss the calibration data into the entropy pool */
771*4882a593Smuzhiyun add_device_randomness(buf, sizeof(buf));
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun calib->AC1 = be16_to_cpu(buf[AC1]);
774*4882a593Smuzhiyun calib->AC2 = be16_to_cpu(buf[AC2]);
775*4882a593Smuzhiyun calib->AC3 = be16_to_cpu(buf[AC3]);
776*4882a593Smuzhiyun calib->AC4 = be16_to_cpu(buf[AC4]);
777*4882a593Smuzhiyun calib->AC5 = be16_to_cpu(buf[AC5]);
778*4882a593Smuzhiyun calib->AC6 = be16_to_cpu(buf[AC6]);
779*4882a593Smuzhiyun calib->B1 = be16_to_cpu(buf[B1]);
780*4882a593Smuzhiyun calib->B2 = be16_to_cpu(buf[B2]);
781*4882a593Smuzhiyun calib->MB = be16_to_cpu(buf[MB]);
782*4882a593Smuzhiyun calib->MC = be16_to_cpu(buf[MC]);
783*4882a593Smuzhiyun calib->MD = be16_to_cpu(buf[MD]);
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun return 0;
786*4882a593Smuzhiyun }
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun /*
789*4882a593Smuzhiyun * Returns temperature in DegC, resolution is 0.1 DegC.
790*4882a593Smuzhiyun * t_fine carries fine temperature as global value.
791*4882a593Smuzhiyun *
792*4882a593Smuzhiyun * Taken from datasheet, Section 3.5, "Calculating pressure and temperature".
793*4882a593Smuzhiyun */
bmp180_compensate_temp(struct bmp280_data * data,s32 adc_temp)794*4882a593Smuzhiyun static s32 bmp180_compensate_temp(struct bmp280_data *data, s32 adc_temp)
795*4882a593Smuzhiyun {
796*4882a593Smuzhiyun s32 x1, x2;
797*4882a593Smuzhiyun struct bmp180_calib *calib = &data->calib.bmp180;
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun x1 = ((adc_temp - calib->AC6) * calib->AC5) >> 15;
800*4882a593Smuzhiyun x2 = (calib->MC << 11) / (x1 + calib->MD);
801*4882a593Smuzhiyun data->t_fine = x1 + x2;
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun return (data->t_fine + 8) >> 4;
804*4882a593Smuzhiyun }
805*4882a593Smuzhiyun
bmp180_read_temp(struct bmp280_data * data,int * val)806*4882a593Smuzhiyun static int bmp180_read_temp(struct bmp280_data *data, int *val)
807*4882a593Smuzhiyun {
808*4882a593Smuzhiyun int ret;
809*4882a593Smuzhiyun s32 adc_temp, comp_temp;
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun ret = bmp180_read_adc_temp(data, &adc_temp);
812*4882a593Smuzhiyun if (ret)
813*4882a593Smuzhiyun return ret;
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun comp_temp = bmp180_compensate_temp(data, adc_temp);
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun /*
818*4882a593Smuzhiyun * val might be NULL if we're called by the read_press routine,
819*4882a593Smuzhiyun * who only cares about the carry over t_fine value.
820*4882a593Smuzhiyun */
821*4882a593Smuzhiyun if (val) {
822*4882a593Smuzhiyun *val = comp_temp * 100;
823*4882a593Smuzhiyun return IIO_VAL_INT;
824*4882a593Smuzhiyun }
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun return 0;
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun
bmp180_read_adc_press(struct bmp280_data * data,int * val)829*4882a593Smuzhiyun static int bmp180_read_adc_press(struct bmp280_data *data, int *val)
830*4882a593Smuzhiyun {
831*4882a593Smuzhiyun int ret;
832*4882a593Smuzhiyun __be32 tmp = 0;
833*4882a593Smuzhiyun u8 oss = data->oversampling_press;
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun ret = bmp180_measure(data, BMP180_MEAS_PRESS_X(oss));
836*4882a593Smuzhiyun if (ret)
837*4882a593Smuzhiyun return ret;
838*4882a593Smuzhiyun
839*4882a593Smuzhiyun ret = regmap_bulk_read(data->regmap, BMP180_REG_OUT_MSB, &tmp, 3);
840*4882a593Smuzhiyun if (ret)
841*4882a593Smuzhiyun return ret;
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun *val = (be32_to_cpu(tmp) >> 8) >> (8 - oss);
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun return 0;
846*4882a593Smuzhiyun }
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun /*
849*4882a593Smuzhiyun * Returns pressure in Pa, resolution is 1 Pa.
850*4882a593Smuzhiyun *
851*4882a593Smuzhiyun * Taken from datasheet, Section 3.5, "Calculating pressure and temperature".
852*4882a593Smuzhiyun */
bmp180_compensate_press(struct bmp280_data * data,s32 adc_press)853*4882a593Smuzhiyun static u32 bmp180_compensate_press(struct bmp280_data *data, s32 adc_press)
854*4882a593Smuzhiyun {
855*4882a593Smuzhiyun s32 x1, x2, x3, p;
856*4882a593Smuzhiyun s32 b3, b6;
857*4882a593Smuzhiyun u32 b4, b7;
858*4882a593Smuzhiyun s32 oss = data->oversampling_press;
859*4882a593Smuzhiyun struct bmp180_calib *calib = &data->calib.bmp180;
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun b6 = data->t_fine - 4000;
862*4882a593Smuzhiyun x1 = (calib->B2 * (b6 * b6 >> 12)) >> 11;
863*4882a593Smuzhiyun x2 = calib->AC2 * b6 >> 11;
864*4882a593Smuzhiyun x3 = x1 + x2;
865*4882a593Smuzhiyun b3 = ((((s32)calib->AC1 * 4 + x3) << oss) + 2) / 4;
866*4882a593Smuzhiyun x1 = calib->AC3 * b6 >> 13;
867*4882a593Smuzhiyun x2 = (calib->B1 * ((b6 * b6) >> 12)) >> 16;
868*4882a593Smuzhiyun x3 = (x1 + x2 + 2) >> 2;
869*4882a593Smuzhiyun b4 = calib->AC4 * (u32)(x3 + 32768) >> 15;
870*4882a593Smuzhiyun b7 = ((u32)adc_press - b3) * (50000 >> oss);
871*4882a593Smuzhiyun if (b7 < 0x80000000)
872*4882a593Smuzhiyun p = (b7 * 2) / b4;
873*4882a593Smuzhiyun else
874*4882a593Smuzhiyun p = (b7 / b4) * 2;
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun x1 = (p >> 8) * (p >> 8);
877*4882a593Smuzhiyun x1 = (x1 * 3038) >> 16;
878*4882a593Smuzhiyun x2 = (-7357 * p) >> 16;
879*4882a593Smuzhiyun
880*4882a593Smuzhiyun return p + ((x1 + x2 + 3791) >> 4);
881*4882a593Smuzhiyun }
882*4882a593Smuzhiyun
bmp180_read_press(struct bmp280_data * data,int * val,int * val2)883*4882a593Smuzhiyun static int bmp180_read_press(struct bmp280_data *data,
884*4882a593Smuzhiyun int *val, int *val2)
885*4882a593Smuzhiyun {
886*4882a593Smuzhiyun int ret;
887*4882a593Smuzhiyun s32 adc_press;
888*4882a593Smuzhiyun u32 comp_press;
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun /* Read and compensate temperature so we get a reading of t_fine. */
891*4882a593Smuzhiyun ret = bmp180_read_temp(data, NULL);
892*4882a593Smuzhiyun if (ret)
893*4882a593Smuzhiyun return ret;
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun ret = bmp180_read_adc_press(data, &adc_press);
896*4882a593Smuzhiyun if (ret)
897*4882a593Smuzhiyun return ret;
898*4882a593Smuzhiyun
899*4882a593Smuzhiyun comp_press = bmp180_compensate_press(data, adc_press);
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun *val = comp_press;
902*4882a593Smuzhiyun *val2 = 1000;
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun return IIO_VAL_FRACTIONAL;
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun
bmp180_chip_config(struct bmp280_data * data)907*4882a593Smuzhiyun static int bmp180_chip_config(struct bmp280_data *data)
908*4882a593Smuzhiyun {
909*4882a593Smuzhiyun return 0;
910*4882a593Smuzhiyun }
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun static const int bmp180_oversampling_temp_avail[] = { 1 };
913*4882a593Smuzhiyun static const int bmp180_oversampling_press_avail[] = { 1, 2, 4, 8 };
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun static const struct bmp280_chip_info bmp180_chip_info = {
916*4882a593Smuzhiyun .oversampling_temp_avail = bmp180_oversampling_temp_avail,
917*4882a593Smuzhiyun .num_oversampling_temp_avail =
918*4882a593Smuzhiyun ARRAY_SIZE(bmp180_oversampling_temp_avail),
919*4882a593Smuzhiyun
920*4882a593Smuzhiyun .oversampling_press_avail = bmp180_oversampling_press_avail,
921*4882a593Smuzhiyun .num_oversampling_press_avail =
922*4882a593Smuzhiyun ARRAY_SIZE(bmp180_oversampling_press_avail),
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun .chip_config = bmp180_chip_config,
925*4882a593Smuzhiyun .read_temp = bmp180_read_temp,
926*4882a593Smuzhiyun .read_press = bmp180_read_press,
927*4882a593Smuzhiyun };
928*4882a593Smuzhiyun
bmp085_eoc_irq(int irq,void * d)929*4882a593Smuzhiyun static irqreturn_t bmp085_eoc_irq(int irq, void *d)
930*4882a593Smuzhiyun {
931*4882a593Smuzhiyun struct bmp280_data *data = d;
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun complete(&data->done);
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun return IRQ_HANDLED;
936*4882a593Smuzhiyun }
937*4882a593Smuzhiyun
bmp085_fetch_eoc_irq(struct device * dev,const char * name,int irq,struct bmp280_data * data)938*4882a593Smuzhiyun static int bmp085_fetch_eoc_irq(struct device *dev,
939*4882a593Smuzhiyun const char *name,
940*4882a593Smuzhiyun int irq,
941*4882a593Smuzhiyun struct bmp280_data *data)
942*4882a593Smuzhiyun {
943*4882a593Smuzhiyun unsigned long irq_trig;
944*4882a593Smuzhiyun int ret;
945*4882a593Smuzhiyun
946*4882a593Smuzhiyun irq_trig = irqd_get_trigger_type(irq_get_irq_data(irq));
947*4882a593Smuzhiyun if (irq_trig != IRQF_TRIGGER_RISING) {
948*4882a593Smuzhiyun dev_err(dev, "non-rising trigger given for EOC interrupt, trying to enforce it\n");
949*4882a593Smuzhiyun irq_trig = IRQF_TRIGGER_RISING;
950*4882a593Smuzhiyun }
951*4882a593Smuzhiyun
952*4882a593Smuzhiyun init_completion(&data->done);
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun ret = devm_request_threaded_irq(dev,
955*4882a593Smuzhiyun irq,
956*4882a593Smuzhiyun bmp085_eoc_irq,
957*4882a593Smuzhiyun NULL,
958*4882a593Smuzhiyun irq_trig,
959*4882a593Smuzhiyun name,
960*4882a593Smuzhiyun data);
961*4882a593Smuzhiyun if (ret) {
962*4882a593Smuzhiyun /* Bail out without IRQ but keep the driver in place */
963*4882a593Smuzhiyun dev_err(dev, "unable to request DRDY IRQ\n");
964*4882a593Smuzhiyun return 0;
965*4882a593Smuzhiyun }
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun data->use_eoc = true;
968*4882a593Smuzhiyun return 0;
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun
bmp280_pm_disable(void * data)971*4882a593Smuzhiyun static void bmp280_pm_disable(void *data)
972*4882a593Smuzhiyun {
973*4882a593Smuzhiyun struct device *dev = data;
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun pm_runtime_get_sync(dev);
976*4882a593Smuzhiyun pm_runtime_put_noidle(dev);
977*4882a593Smuzhiyun pm_runtime_disable(dev);
978*4882a593Smuzhiyun }
979*4882a593Smuzhiyun
bmp280_regulators_disable(void * data)980*4882a593Smuzhiyun static void bmp280_regulators_disable(void *data)
981*4882a593Smuzhiyun {
982*4882a593Smuzhiyun struct regulator_bulk_data *supplies = data;
983*4882a593Smuzhiyun
984*4882a593Smuzhiyun regulator_bulk_disable(BMP280_NUM_SUPPLIES, supplies);
985*4882a593Smuzhiyun }
986*4882a593Smuzhiyun
bmp280_common_probe(struct device * dev,struct regmap * regmap,unsigned int chip,const char * name,int irq)987*4882a593Smuzhiyun int bmp280_common_probe(struct device *dev,
988*4882a593Smuzhiyun struct regmap *regmap,
989*4882a593Smuzhiyun unsigned int chip,
990*4882a593Smuzhiyun const char *name,
991*4882a593Smuzhiyun int irq)
992*4882a593Smuzhiyun {
993*4882a593Smuzhiyun int ret;
994*4882a593Smuzhiyun struct iio_dev *indio_dev;
995*4882a593Smuzhiyun struct bmp280_data *data;
996*4882a593Smuzhiyun unsigned int chip_id;
997*4882a593Smuzhiyun struct gpio_desc *gpiod;
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
1000*4882a593Smuzhiyun if (!indio_dev)
1001*4882a593Smuzhiyun return -ENOMEM;
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun data = iio_priv(indio_dev);
1004*4882a593Smuzhiyun mutex_init(&data->lock);
1005*4882a593Smuzhiyun data->dev = dev;
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun indio_dev->name = name;
1008*4882a593Smuzhiyun indio_dev->channels = bmp280_channels;
1009*4882a593Smuzhiyun indio_dev->info = &bmp280_info;
1010*4882a593Smuzhiyun indio_dev->modes = INDIO_DIRECT_MODE;
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun switch (chip) {
1013*4882a593Smuzhiyun case BMP180_CHIP_ID:
1014*4882a593Smuzhiyun indio_dev->num_channels = 2;
1015*4882a593Smuzhiyun data->chip_info = &bmp180_chip_info;
1016*4882a593Smuzhiyun data->oversampling_press = ilog2(8);
1017*4882a593Smuzhiyun data->oversampling_temp = ilog2(1);
1018*4882a593Smuzhiyun data->start_up_time = 10000;
1019*4882a593Smuzhiyun break;
1020*4882a593Smuzhiyun case BMP280_CHIP_ID:
1021*4882a593Smuzhiyun indio_dev->num_channels = 2;
1022*4882a593Smuzhiyun data->chip_info = &bmp280_chip_info;
1023*4882a593Smuzhiyun data->oversampling_press = ilog2(16);
1024*4882a593Smuzhiyun data->oversampling_temp = ilog2(2);
1025*4882a593Smuzhiyun data->start_up_time = 2000;
1026*4882a593Smuzhiyun break;
1027*4882a593Smuzhiyun case BME280_CHIP_ID:
1028*4882a593Smuzhiyun indio_dev->num_channels = 3;
1029*4882a593Smuzhiyun data->chip_info = &bme280_chip_info;
1030*4882a593Smuzhiyun data->oversampling_press = ilog2(16);
1031*4882a593Smuzhiyun data->oversampling_humid = ilog2(16);
1032*4882a593Smuzhiyun data->oversampling_temp = ilog2(2);
1033*4882a593Smuzhiyun data->start_up_time = 2000;
1034*4882a593Smuzhiyun break;
1035*4882a593Smuzhiyun default:
1036*4882a593Smuzhiyun return -EINVAL;
1037*4882a593Smuzhiyun }
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun /* Bring up regulators */
1040*4882a593Smuzhiyun regulator_bulk_set_supply_names(data->supplies,
1041*4882a593Smuzhiyun bmp280_supply_names,
1042*4882a593Smuzhiyun BMP280_NUM_SUPPLIES);
1043*4882a593Smuzhiyun
1044*4882a593Smuzhiyun ret = devm_regulator_bulk_get(dev,
1045*4882a593Smuzhiyun BMP280_NUM_SUPPLIES, data->supplies);
1046*4882a593Smuzhiyun if (ret) {
1047*4882a593Smuzhiyun dev_err(dev, "failed to get regulators\n");
1048*4882a593Smuzhiyun return ret;
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun ret = regulator_bulk_enable(BMP280_NUM_SUPPLIES, data->supplies);
1052*4882a593Smuzhiyun if (ret) {
1053*4882a593Smuzhiyun dev_err(dev, "failed to enable regulators\n");
1054*4882a593Smuzhiyun return ret;
1055*4882a593Smuzhiyun }
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun ret = devm_add_action_or_reset(dev, bmp280_regulators_disable,
1058*4882a593Smuzhiyun data->supplies);
1059*4882a593Smuzhiyun if (ret)
1060*4882a593Smuzhiyun return ret;
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun /* Wait to make sure we started up properly */
1063*4882a593Smuzhiyun usleep_range(data->start_up_time, data->start_up_time + 100);
1064*4882a593Smuzhiyun
1065*4882a593Smuzhiyun /* Bring chip out of reset if there is an assigned GPIO line */
1066*4882a593Smuzhiyun gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
1067*4882a593Smuzhiyun /* Deassert the signal */
1068*4882a593Smuzhiyun if (gpiod) {
1069*4882a593Smuzhiyun dev_info(dev, "release reset\n");
1070*4882a593Smuzhiyun gpiod_set_value(gpiod, 0);
1071*4882a593Smuzhiyun }
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun data->regmap = regmap;
1074*4882a593Smuzhiyun ret = regmap_read(regmap, BMP280_REG_ID, &chip_id);
1075*4882a593Smuzhiyun if (ret < 0)
1076*4882a593Smuzhiyun return ret;
1077*4882a593Smuzhiyun if (chip_id != chip) {
1078*4882a593Smuzhiyun dev_err(dev, "bad chip id: expected %x got %x\n",
1079*4882a593Smuzhiyun chip, chip_id);
1080*4882a593Smuzhiyun return -EINVAL;
1081*4882a593Smuzhiyun }
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun ret = data->chip_info->chip_config(data);
1084*4882a593Smuzhiyun if (ret < 0)
1085*4882a593Smuzhiyun return ret;
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun dev_set_drvdata(dev, indio_dev);
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun /*
1090*4882a593Smuzhiyun * Some chips have calibration parameters "programmed into the devices'
1091*4882a593Smuzhiyun * non-volatile memory during production". Let's read them out at probe
1092*4882a593Smuzhiyun * time once. They will not change.
1093*4882a593Smuzhiyun */
1094*4882a593Smuzhiyun if (chip_id == BMP180_CHIP_ID) {
1095*4882a593Smuzhiyun ret = bmp180_read_calib(data, &data->calib.bmp180);
1096*4882a593Smuzhiyun if (ret < 0) {
1097*4882a593Smuzhiyun dev_err(data->dev,
1098*4882a593Smuzhiyun "failed to read calibration coefficients\n");
1099*4882a593Smuzhiyun return ret;
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun } else if (chip_id == BMP280_CHIP_ID || chip_id == BME280_CHIP_ID) {
1102*4882a593Smuzhiyun ret = bmp280_read_calib(data, &data->calib.bmp280, chip_id);
1103*4882a593Smuzhiyun if (ret < 0) {
1104*4882a593Smuzhiyun dev_err(data->dev,
1105*4882a593Smuzhiyun "failed to read calibration coefficients\n");
1106*4882a593Smuzhiyun return ret;
1107*4882a593Smuzhiyun }
1108*4882a593Smuzhiyun }
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun /*
1111*4882a593Smuzhiyun * Attempt to grab an optional EOC IRQ - only the BMP085 has this
1112*4882a593Smuzhiyun * however as it happens, the BMP085 shares the chip ID of BMP180
1113*4882a593Smuzhiyun * so we look for an IRQ if we have that.
1114*4882a593Smuzhiyun */
1115*4882a593Smuzhiyun if (irq > 0 || (chip_id == BMP180_CHIP_ID)) {
1116*4882a593Smuzhiyun ret = bmp085_fetch_eoc_irq(dev, name, irq, data);
1117*4882a593Smuzhiyun if (ret)
1118*4882a593Smuzhiyun return ret;
1119*4882a593Smuzhiyun }
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun /* Enable runtime PM */
1122*4882a593Smuzhiyun pm_runtime_get_noresume(dev);
1123*4882a593Smuzhiyun pm_runtime_set_active(dev);
1124*4882a593Smuzhiyun pm_runtime_enable(dev);
1125*4882a593Smuzhiyun /*
1126*4882a593Smuzhiyun * Set autosuspend to two orders of magnitude larger than the
1127*4882a593Smuzhiyun * start-up time.
1128*4882a593Smuzhiyun */
1129*4882a593Smuzhiyun pm_runtime_set_autosuspend_delay(dev, data->start_up_time / 10);
1130*4882a593Smuzhiyun pm_runtime_use_autosuspend(dev);
1131*4882a593Smuzhiyun pm_runtime_put(dev);
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun ret = devm_add_action_or_reset(dev, bmp280_pm_disable, dev);
1134*4882a593Smuzhiyun if (ret)
1135*4882a593Smuzhiyun return ret;
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun return devm_iio_device_register(dev, indio_dev);
1138*4882a593Smuzhiyun }
1139*4882a593Smuzhiyun EXPORT_SYMBOL(bmp280_common_probe);
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun #ifdef CONFIG_PM
bmp280_runtime_suspend(struct device * dev)1142*4882a593Smuzhiyun static int bmp280_runtime_suspend(struct device *dev)
1143*4882a593Smuzhiyun {
1144*4882a593Smuzhiyun struct iio_dev *indio_dev = dev_get_drvdata(dev);
1145*4882a593Smuzhiyun struct bmp280_data *data = iio_priv(indio_dev);
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun return regulator_bulk_disable(BMP280_NUM_SUPPLIES, data->supplies);
1148*4882a593Smuzhiyun }
1149*4882a593Smuzhiyun
bmp280_runtime_resume(struct device * dev)1150*4882a593Smuzhiyun static int bmp280_runtime_resume(struct device *dev)
1151*4882a593Smuzhiyun {
1152*4882a593Smuzhiyun struct iio_dev *indio_dev = dev_get_drvdata(dev);
1153*4882a593Smuzhiyun struct bmp280_data *data = iio_priv(indio_dev);
1154*4882a593Smuzhiyun int ret;
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyun ret = regulator_bulk_enable(BMP280_NUM_SUPPLIES, data->supplies);
1157*4882a593Smuzhiyun if (ret)
1158*4882a593Smuzhiyun return ret;
1159*4882a593Smuzhiyun usleep_range(data->start_up_time, data->start_up_time + 100);
1160*4882a593Smuzhiyun return data->chip_info->chip_config(data);
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun #endif /* CONFIG_PM */
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun const struct dev_pm_ops bmp280_dev_pm_ops = {
1165*4882a593Smuzhiyun SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
1166*4882a593Smuzhiyun pm_runtime_force_resume)
1167*4882a593Smuzhiyun SET_RUNTIME_PM_OPS(bmp280_runtime_suspend,
1168*4882a593Smuzhiyun bmp280_runtime_resume, NULL)
1169*4882a593Smuzhiyun };
1170*4882a593Smuzhiyun EXPORT_SYMBOL(bmp280_dev_pm_ops);
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>");
1173*4882a593Smuzhiyun MODULE_DESCRIPTION("Driver for Bosch Sensortec BMP180/BMP280 pressure and temperature sensor");
1174*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1175