1*81ca5979SMatti Vaittinen // SPDX-License-Identifier: GPL-2.0-only
2*81ca5979SMatti Vaittinen /*
3*81ca5979SMatti Vaittinen * BM1390 ROHM pressure sensor
4*81ca5979SMatti Vaittinen *
5*81ca5979SMatti Vaittinen * Copyright (c) 2023, ROHM Semiconductor.
6*81ca5979SMatti Vaittinen * https://fscdn.rohm.com/en/products/databook/datasheet/ic/sensor/pressure/bm1390glv-z-e.pdf
7*81ca5979SMatti Vaittinen */
8*81ca5979SMatti Vaittinen
9*81ca5979SMatti Vaittinen #include <linux/bitfield.h>
10*81ca5979SMatti Vaittinen #include <linux/bits.h>
11*81ca5979SMatti Vaittinen #include <linux/device.h>
12*81ca5979SMatti Vaittinen #include <linux/i2c.h>
13*81ca5979SMatti Vaittinen #include <linux/module.h>
14*81ca5979SMatti Vaittinen #include <linux/regmap.h>
15*81ca5979SMatti Vaittinen #include <linux/regulator/consumer.h>
16*81ca5979SMatti Vaittinen
17*81ca5979SMatti Vaittinen #include <linux/iio/iio.h>
18*81ca5979SMatti Vaittinen #include <linux/iio/trigger.h>
19*81ca5979SMatti Vaittinen #include <linux/iio/trigger_consumer.h>
20*81ca5979SMatti Vaittinen #include <linux/iio/triggered_buffer.h>
21*81ca5979SMatti Vaittinen
22*81ca5979SMatti Vaittinen #define BM1390_REG_MANUFACT_ID 0x0f
23*81ca5979SMatti Vaittinen #define BM1390_REG_PART_ID 0x10
24*81ca5979SMatti Vaittinen #define BM1390_REG_POWER 0x12
25*81ca5979SMatti Vaittinen #define BM1390_MASK_POWER BIT(0)
26*81ca5979SMatti Vaittinen #define BM1390_POWER_ON BM1390_MASK_POWER
27*81ca5979SMatti Vaittinen #define BM1390_POWER_OFF 0x00
28*81ca5979SMatti Vaittinen #define BM1390_REG_RESET 0x13
29*81ca5979SMatti Vaittinen #define BM1390_MASK_RESET BIT(0)
30*81ca5979SMatti Vaittinen #define BM1390_RESET_RELEASE BM1390_MASK_RESET
31*81ca5979SMatti Vaittinen #define BM1390_RESET 0x00
32*81ca5979SMatti Vaittinen #define BM1390_REG_MODE_CTRL 0x14
33*81ca5979SMatti Vaittinen #define BM1390_MASK_MEAS_MODE GENMASK(1, 0)
34*81ca5979SMatti Vaittinen #define BM1390_MASK_DRDY_EN BIT(4)
35*81ca5979SMatti Vaittinen #define BM1390_MASK_WMI_EN BIT(2)
36*81ca5979SMatti Vaittinen #define BM1390_MASK_AVE_NUM GENMASK(7, 5)
37*81ca5979SMatti Vaittinen
38*81ca5979SMatti Vaittinen /*
39*81ca5979SMatti Vaittinen * Data-sheet states that when the IIR is used, the AVE_NUM must be set to
40*81ca5979SMatti Vaittinen * value 110b
41*81ca5979SMatti Vaittinen */
42*81ca5979SMatti Vaittinen #define BM1390_IIR_AVE_NUM 0x06
43*81ca5979SMatti Vaittinen #define BM1390_REG_FIFO_CTRL 0x15
44*81ca5979SMatti Vaittinen #define BM1390_MASK_IIR_MODE GENMASK(1, 0)
45*81ca5979SMatti Vaittinen #define BM1390_IIR_MODE_OFF 0x0
46*81ca5979SMatti Vaittinen #define BM1390_IIR_MODE_WEAK 0x1
47*81ca5979SMatti Vaittinen #define BM1390_IIR_MODE_MID 0x2
48*81ca5979SMatti Vaittinen #define BM1390_IIR_MODE_STRONG 0x3
49*81ca5979SMatti Vaittinen
50*81ca5979SMatti Vaittinen #define BM1390_MASK_FIFO_LEN BIT(6)
51*81ca5979SMatti Vaittinen #define BM1390_MASK_FIFO_EN BIT(7)
52*81ca5979SMatti Vaittinen #define BM1390_WMI_MIN 2
53*81ca5979SMatti Vaittinen #define BM1390_WMI_MAX 3
54*81ca5979SMatti Vaittinen
55*81ca5979SMatti Vaittinen #define BM1390_REG_FIFO_LVL 0x18
56*81ca5979SMatti Vaittinen #define BM1390_MASK_FIFO_LVL GENMASK(2, 0)
57*81ca5979SMatti Vaittinen #define BM1390_REG_STATUS 0x19
58*81ca5979SMatti Vaittinen #define BM1390_REG_PRESSURE_BASE 0x1a
59*81ca5979SMatti Vaittinen #define BM1390_REG_TEMP_HI 0x1d
60*81ca5979SMatti Vaittinen #define BM1390_REG_TEMP_LO 0x1e
61*81ca5979SMatti Vaittinen #define BM1390_MAX_REGISTER BM1390_REG_TEMP_LO
62*81ca5979SMatti Vaittinen
63*81ca5979SMatti Vaittinen #define BM1390_ID 0x34
64*81ca5979SMatti Vaittinen
65*81ca5979SMatti Vaittinen /* Regmap configs */
66*81ca5979SMatti Vaittinen static const struct regmap_range bm1390_volatile_ranges[] = {
67*81ca5979SMatti Vaittinen {
68*81ca5979SMatti Vaittinen .range_min = BM1390_REG_STATUS,
69*81ca5979SMatti Vaittinen .range_max = BM1390_REG_STATUS,
70*81ca5979SMatti Vaittinen },
71*81ca5979SMatti Vaittinen {
72*81ca5979SMatti Vaittinen .range_min = BM1390_REG_FIFO_LVL,
73*81ca5979SMatti Vaittinen .range_max = BM1390_REG_TEMP_LO,
74*81ca5979SMatti Vaittinen },
75*81ca5979SMatti Vaittinen };
76*81ca5979SMatti Vaittinen
77*81ca5979SMatti Vaittinen static const struct regmap_access_table bm1390_volatile_regs = {
78*81ca5979SMatti Vaittinen .yes_ranges = &bm1390_volatile_ranges[0],
79*81ca5979SMatti Vaittinen .n_yes_ranges = ARRAY_SIZE(bm1390_volatile_ranges),
80*81ca5979SMatti Vaittinen };
81*81ca5979SMatti Vaittinen
82*81ca5979SMatti Vaittinen static const struct regmap_range bm1390_precious_ranges[] = {
83*81ca5979SMatti Vaittinen {
84*81ca5979SMatti Vaittinen .range_min = BM1390_REG_STATUS,
85*81ca5979SMatti Vaittinen .range_max = BM1390_REG_STATUS,
86*81ca5979SMatti Vaittinen },
87*81ca5979SMatti Vaittinen };
88*81ca5979SMatti Vaittinen
89*81ca5979SMatti Vaittinen static const struct regmap_access_table bm1390_precious_regs = {
90*81ca5979SMatti Vaittinen .yes_ranges = &bm1390_precious_ranges[0],
91*81ca5979SMatti Vaittinen .n_yes_ranges = ARRAY_SIZE(bm1390_precious_ranges),
92*81ca5979SMatti Vaittinen };
93*81ca5979SMatti Vaittinen
94*81ca5979SMatti Vaittinen static const struct regmap_range bm1390_read_only_ranges[] = {
95*81ca5979SMatti Vaittinen {
96*81ca5979SMatti Vaittinen .range_min = BM1390_REG_MANUFACT_ID,
97*81ca5979SMatti Vaittinen .range_max = BM1390_REG_PART_ID,
98*81ca5979SMatti Vaittinen }, {
99*81ca5979SMatti Vaittinen .range_min = BM1390_REG_FIFO_LVL,
100*81ca5979SMatti Vaittinen .range_max = BM1390_REG_TEMP_LO,
101*81ca5979SMatti Vaittinen },
102*81ca5979SMatti Vaittinen };
103*81ca5979SMatti Vaittinen
104*81ca5979SMatti Vaittinen static const struct regmap_access_table bm1390_ro_regs = {
105*81ca5979SMatti Vaittinen .no_ranges = &bm1390_read_only_ranges[0],
106*81ca5979SMatti Vaittinen .n_no_ranges = ARRAY_SIZE(bm1390_read_only_ranges),
107*81ca5979SMatti Vaittinen };
108*81ca5979SMatti Vaittinen
109*81ca5979SMatti Vaittinen static const struct regmap_range bm1390_noinc_read_ranges[] = {
110*81ca5979SMatti Vaittinen {
111*81ca5979SMatti Vaittinen .range_min = BM1390_REG_PRESSURE_BASE,
112*81ca5979SMatti Vaittinen .range_max = BM1390_REG_TEMP_LO,
113*81ca5979SMatti Vaittinen },
114*81ca5979SMatti Vaittinen };
115*81ca5979SMatti Vaittinen
116*81ca5979SMatti Vaittinen static const struct regmap_access_table bm1390_nir_regs = {
117*81ca5979SMatti Vaittinen .yes_ranges = &bm1390_noinc_read_ranges[0],
118*81ca5979SMatti Vaittinen .n_yes_ranges = ARRAY_SIZE(bm1390_noinc_read_ranges),
119*81ca5979SMatti Vaittinen };
120*81ca5979SMatti Vaittinen
121*81ca5979SMatti Vaittinen static const struct regmap_config bm1390_regmap = {
122*81ca5979SMatti Vaittinen .reg_bits = 8,
123*81ca5979SMatti Vaittinen .val_bits = 8,
124*81ca5979SMatti Vaittinen .volatile_table = &bm1390_volatile_regs,
125*81ca5979SMatti Vaittinen .wr_table = &bm1390_ro_regs,
126*81ca5979SMatti Vaittinen .rd_noinc_table = &bm1390_nir_regs,
127*81ca5979SMatti Vaittinen .precious_table = &bm1390_precious_regs,
128*81ca5979SMatti Vaittinen .max_register = BM1390_MAX_REGISTER,
129*81ca5979SMatti Vaittinen .cache_type = REGCACHE_RBTREE,
130*81ca5979SMatti Vaittinen .disable_locking = true,
131*81ca5979SMatti Vaittinen };
132*81ca5979SMatti Vaittinen
133*81ca5979SMatti Vaittinen enum {
134*81ca5979SMatti Vaittinen BM1390_STATE_SAMPLE,
135*81ca5979SMatti Vaittinen BM1390_STATE_FIFO,
136*81ca5979SMatti Vaittinen };
137*81ca5979SMatti Vaittinen
138*81ca5979SMatti Vaittinen struct bm1390_data_buf {
139*81ca5979SMatti Vaittinen u32 pressure;
140*81ca5979SMatti Vaittinen __be16 temp;
141*81ca5979SMatti Vaittinen s64 ts __aligned(8);
142*81ca5979SMatti Vaittinen };
143*81ca5979SMatti Vaittinen
144*81ca5979SMatti Vaittinen /* BM1390 has FIFO for 4 pressure samples */
145*81ca5979SMatti Vaittinen #define BM1390_FIFO_LENGTH 4
146*81ca5979SMatti Vaittinen
147*81ca5979SMatti Vaittinen struct bm1390_data {
148*81ca5979SMatti Vaittinen s64 timestamp, old_timestamp;
149*81ca5979SMatti Vaittinen struct iio_trigger *trig;
150*81ca5979SMatti Vaittinen struct regmap *regmap;
151*81ca5979SMatti Vaittinen struct device *dev;
152*81ca5979SMatti Vaittinen struct bm1390_data_buf buf;
153*81ca5979SMatti Vaittinen int irq;
154*81ca5979SMatti Vaittinen unsigned int state;
155*81ca5979SMatti Vaittinen bool trigger_enabled;
156*81ca5979SMatti Vaittinen u8 watermark;
157*81ca5979SMatti Vaittinen
158*81ca5979SMatti Vaittinen /* Prevent accessing sensor during FIFO read sequence */
159*81ca5979SMatti Vaittinen struct mutex mutex;
160*81ca5979SMatti Vaittinen };
161*81ca5979SMatti Vaittinen
162*81ca5979SMatti Vaittinen enum {
163*81ca5979SMatti Vaittinen BM1390_CHAN_PRESSURE,
164*81ca5979SMatti Vaittinen BM1390_CHAN_TEMP,
165*81ca5979SMatti Vaittinen };
166*81ca5979SMatti Vaittinen
167*81ca5979SMatti Vaittinen static const struct iio_chan_spec bm1390_channels[] = {
168*81ca5979SMatti Vaittinen {
169*81ca5979SMatti Vaittinen .type = IIO_PRESSURE,
170*81ca5979SMatti Vaittinen .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
171*81ca5979SMatti Vaittinen /*
172*81ca5979SMatti Vaittinen * When IIR is used, we must fix amount of averaged samples.
173*81ca5979SMatti Vaittinen * Thus we don't allow setting oversampling ratio.
174*81ca5979SMatti Vaittinen */
175*81ca5979SMatti Vaittinen .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
176*81ca5979SMatti Vaittinen .scan_index = BM1390_CHAN_PRESSURE,
177*81ca5979SMatti Vaittinen .scan_type = {
178*81ca5979SMatti Vaittinen .sign = 'u',
179*81ca5979SMatti Vaittinen .realbits = 22,
180*81ca5979SMatti Vaittinen .storagebits = 32,
181*81ca5979SMatti Vaittinen .endianness = IIO_LE,
182*81ca5979SMatti Vaittinen },
183*81ca5979SMatti Vaittinen },
184*81ca5979SMatti Vaittinen {
185*81ca5979SMatti Vaittinen .type = IIO_TEMP,
186*81ca5979SMatti Vaittinen .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
187*81ca5979SMatti Vaittinen .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
188*81ca5979SMatti Vaittinen .scan_index = BM1390_CHAN_TEMP,
189*81ca5979SMatti Vaittinen .scan_type = {
190*81ca5979SMatti Vaittinen .sign = 's',
191*81ca5979SMatti Vaittinen .realbits = 16,
192*81ca5979SMatti Vaittinen .storagebits = 16,
193*81ca5979SMatti Vaittinen .endianness = IIO_BE,
194*81ca5979SMatti Vaittinen },
195*81ca5979SMatti Vaittinen },
196*81ca5979SMatti Vaittinen IIO_CHAN_SOFT_TIMESTAMP(2),
197*81ca5979SMatti Vaittinen };
198*81ca5979SMatti Vaittinen
199*81ca5979SMatti Vaittinen /*
200*81ca5979SMatti Vaittinen * We can't skip reading the pressure because the watermark IRQ is acked
201*81ca5979SMatti Vaittinen * only when the pressure data is read from the FIFO.
202*81ca5979SMatti Vaittinen */
203*81ca5979SMatti Vaittinen static const unsigned long bm1390_scan_masks[] = {
204*81ca5979SMatti Vaittinen BIT(BM1390_CHAN_PRESSURE),
205*81ca5979SMatti Vaittinen BIT(BM1390_CHAN_PRESSURE) | BIT(BM1390_CHAN_TEMP),
206*81ca5979SMatti Vaittinen 0
207*81ca5979SMatti Vaittinen };
208*81ca5979SMatti Vaittinen
bm1390_read_temp(struct bm1390_data * data,int * temp)209*81ca5979SMatti Vaittinen static int bm1390_read_temp(struct bm1390_data *data, int *temp)
210*81ca5979SMatti Vaittinen {
211*81ca5979SMatti Vaittinen __be16 temp_raw;
212*81ca5979SMatti Vaittinen int ret;
213*81ca5979SMatti Vaittinen
214*81ca5979SMatti Vaittinen ret = regmap_bulk_read(data->regmap, BM1390_REG_TEMP_HI, &temp_raw,
215*81ca5979SMatti Vaittinen sizeof(temp_raw));
216*81ca5979SMatti Vaittinen if (ret)
217*81ca5979SMatti Vaittinen return ret;
218*81ca5979SMatti Vaittinen
219*81ca5979SMatti Vaittinen *temp = be16_to_cpu(temp_raw);
220*81ca5979SMatti Vaittinen
221*81ca5979SMatti Vaittinen return 0;
222*81ca5979SMatti Vaittinen }
223*81ca5979SMatti Vaittinen
bm1390_pressure_read(struct bm1390_data * data,u32 * pressure)224*81ca5979SMatti Vaittinen static int bm1390_pressure_read(struct bm1390_data *data, u32 *pressure)
225*81ca5979SMatti Vaittinen {
226*81ca5979SMatti Vaittinen /* Pressure data is in 3 8-bit registers */
227*81ca5979SMatti Vaittinen u8 raw[3];
228*81ca5979SMatti Vaittinen int ret;
229*81ca5979SMatti Vaittinen
230*81ca5979SMatti Vaittinen ret = regmap_bulk_read(data->regmap, BM1390_REG_PRESSURE_BASE,
231*81ca5979SMatti Vaittinen raw, sizeof(raw));
232*81ca5979SMatti Vaittinen if (ret < 0)
233*81ca5979SMatti Vaittinen return ret;
234*81ca5979SMatti Vaittinen
235*81ca5979SMatti Vaittinen *pressure = (u32)(raw[2] >> 2 | raw[1] << 6 | raw[0] << 14);
236*81ca5979SMatti Vaittinen
237*81ca5979SMatti Vaittinen return 0;
238*81ca5979SMatti Vaittinen }
239*81ca5979SMatti Vaittinen
240*81ca5979SMatti Vaittinen /* The enum values map directly to register bits */
241*81ca5979SMatti Vaittinen enum bm1390_meas_mode {
242*81ca5979SMatti Vaittinen BM1390_MEAS_MODE_STOP = 0x0,
243*81ca5979SMatti Vaittinen BM1390_MEAS_MODE_1SHOT = 0x1,
244*81ca5979SMatti Vaittinen BM1390_MEAS_MODE_CONTINUOUS = 0x2,
245*81ca5979SMatti Vaittinen };
246*81ca5979SMatti Vaittinen
bm1390_meas_set(struct bm1390_data * data,enum bm1390_meas_mode mode)247*81ca5979SMatti Vaittinen static int bm1390_meas_set(struct bm1390_data *data, enum bm1390_meas_mode mode)
248*81ca5979SMatti Vaittinen {
249*81ca5979SMatti Vaittinen return regmap_update_bits(data->regmap, BM1390_REG_MODE_CTRL,
250*81ca5979SMatti Vaittinen BM1390_MASK_MEAS_MODE, mode);
251*81ca5979SMatti Vaittinen }
252*81ca5979SMatti Vaittinen
253*81ca5979SMatti Vaittinen /*
254*81ca5979SMatti Vaittinen * If the trigger is not used we just wait until the measurement has
255*81ca5979SMatti Vaittinen * completed. The data-sheet says maximum measurement cycle (regardless
256*81ca5979SMatti Vaittinen * the AVE_NUM) is 200 mS so let's just sleep at least that long. If speed
257*81ca5979SMatti Vaittinen * is needed the trigger should be used.
258*81ca5979SMatti Vaittinen */
259*81ca5979SMatti Vaittinen #define BM1390_MAX_MEAS_TIME_MS 205
260*81ca5979SMatti Vaittinen
bm1390_read_data(struct bm1390_data * data,struct iio_chan_spec const * chan,int * val,int * val2)261*81ca5979SMatti Vaittinen static int bm1390_read_data(struct bm1390_data *data,
262*81ca5979SMatti Vaittinen struct iio_chan_spec const *chan, int *val, int *val2)
263*81ca5979SMatti Vaittinen {
264*81ca5979SMatti Vaittinen int ret, warn;
265*81ca5979SMatti Vaittinen
266*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
267*81ca5979SMatti Vaittinen /*
268*81ca5979SMatti Vaittinen * We use 'continuous mode' even for raw read because according to the
269*81ca5979SMatti Vaittinen * data-sheet an one-shot mode can't be used with IIR filter.
270*81ca5979SMatti Vaittinen */
271*81ca5979SMatti Vaittinen ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
272*81ca5979SMatti Vaittinen if (ret)
273*81ca5979SMatti Vaittinen goto unlock_out;
274*81ca5979SMatti Vaittinen
275*81ca5979SMatti Vaittinen switch (chan->type) {
276*81ca5979SMatti Vaittinen case IIO_PRESSURE:
277*81ca5979SMatti Vaittinen msleep(BM1390_MAX_MEAS_TIME_MS);
278*81ca5979SMatti Vaittinen ret = bm1390_pressure_read(data, val);
279*81ca5979SMatti Vaittinen break;
280*81ca5979SMatti Vaittinen case IIO_TEMP:
281*81ca5979SMatti Vaittinen msleep(BM1390_MAX_MEAS_TIME_MS);
282*81ca5979SMatti Vaittinen ret = bm1390_read_temp(data, val);
283*81ca5979SMatti Vaittinen break;
284*81ca5979SMatti Vaittinen default:
285*81ca5979SMatti Vaittinen ret = -EINVAL;
286*81ca5979SMatti Vaittinen }
287*81ca5979SMatti Vaittinen warn = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
288*81ca5979SMatti Vaittinen if (warn)
289*81ca5979SMatti Vaittinen dev_warn(data->dev, "Failed to stop measurement (%d)\n", warn);
290*81ca5979SMatti Vaittinen unlock_out:
291*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
292*81ca5979SMatti Vaittinen
293*81ca5979SMatti Vaittinen return ret;
294*81ca5979SMatti Vaittinen }
295*81ca5979SMatti Vaittinen
bm1390_read_raw(struct iio_dev * idev,struct iio_chan_spec const * chan,int * val,int * val2,long mask)296*81ca5979SMatti Vaittinen static int bm1390_read_raw(struct iio_dev *idev,
297*81ca5979SMatti Vaittinen struct iio_chan_spec const *chan,
298*81ca5979SMatti Vaittinen int *val, int *val2, long mask)
299*81ca5979SMatti Vaittinen {
300*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
301*81ca5979SMatti Vaittinen int ret;
302*81ca5979SMatti Vaittinen
303*81ca5979SMatti Vaittinen switch (mask) {
304*81ca5979SMatti Vaittinen case IIO_CHAN_INFO_SCALE:
305*81ca5979SMatti Vaittinen if (chan->type == IIO_TEMP) {
306*81ca5979SMatti Vaittinen *val = 31;
307*81ca5979SMatti Vaittinen *val2 = 250000;
308*81ca5979SMatti Vaittinen
309*81ca5979SMatti Vaittinen return IIO_VAL_INT_PLUS_MICRO;
310*81ca5979SMatti Vaittinen } else if (chan->type == IIO_PRESSURE) {
311*81ca5979SMatti Vaittinen /*
312*81ca5979SMatti Vaittinen * pressure in hPa is register value divided by 2048.
313*81ca5979SMatti Vaittinen * This means kPa is 1/20480 times the register value,
314*81ca5979SMatti Vaittinen */
315*81ca5979SMatti Vaittinen *val = 1;
316*81ca5979SMatti Vaittinen *val2 = 2048;
317*81ca5979SMatti Vaittinen
318*81ca5979SMatti Vaittinen return IIO_VAL_FRACTIONAL;
319*81ca5979SMatti Vaittinen }
320*81ca5979SMatti Vaittinen
321*81ca5979SMatti Vaittinen return -EINVAL;
322*81ca5979SMatti Vaittinen case IIO_CHAN_INFO_RAW:
323*81ca5979SMatti Vaittinen ret = iio_device_claim_direct_mode(idev);
324*81ca5979SMatti Vaittinen if (ret)
325*81ca5979SMatti Vaittinen return ret;
326*81ca5979SMatti Vaittinen
327*81ca5979SMatti Vaittinen ret = bm1390_read_data(data, chan, val, val2);
328*81ca5979SMatti Vaittinen iio_device_release_direct_mode(idev);
329*81ca5979SMatti Vaittinen if (ret)
330*81ca5979SMatti Vaittinen return ret;
331*81ca5979SMatti Vaittinen
332*81ca5979SMatti Vaittinen return IIO_VAL_INT;
333*81ca5979SMatti Vaittinen default:
334*81ca5979SMatti Vaittinen return -EINVAL;
335*81ca5979SMatti Vaittinen }
336*81ca5979SMatti Vaittinen }
337*81ca5979SMatti Vaittinen
__bm1390_fifo_flush(struct iio_dev * idev,unsigned int samples,s64 timestamp)338*81ca5979SMatti Vaittinen static int __bm1390_fifo_flush(struct iio_dev *idev, unsigned int samples,
339*81ca5979SMatti Vaittinen s64 timestamp)
340*81ca5979SMatti Vaittinen {
341*81ca5979SMatti Vaittinen /* BM1390_FIFO_LENGTH is small so we shouldn't run out of stack */
342*81ca5979SMatti Vaittinen struct bm1390_data_buf buffer[BM1390_FIFO_LENGTH];
343*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
344*81ca5979SMatti Vaittinen int smp_lvl, ret, i, warn, dummy;
345*81ca5979SMatti Vaittinen u64 sample_period;
346*81ca5979SMatti Vaittinen __be16 temp = 0;
347*81ca5979SMatti Vaittinen
348*81ca5979SMatti Vaittinen ret = regmap_read(data->regmap, BM1390_REG_FIFO_LVL, &smp_lvl);
349*81ca5979SMatti Vaittinen if (ret)
350*81ca5979SMatti Vaittinen return ret;
351*81ca5979SMatti Vaittinen
352*81ca5979SMatti Vaittinen smp_lvl = FIELD_GET(BM1390_MASK_FIFO_LVL, smp_lvl);
353*81ca5979SMatti Vaittinen if (!smp_lvl)
354*81ca5979SMatti Vaittinen return 0;
355*81ca5979SMatti Vaittinen
356*81ca5979SMatti Vaittinen if (smp_lvl > BM1390_FIFO_LENGTH) {
357*81ca5979SMatti Vaittinen /*
358*81ca5979SMatti Vaittinen * The fifo holds maximum of 4 samples so valid values
359*81ca5979SMatti Vaittinen * should be 0, 1, 2, 3, 4 - rest are probably bit errors
360*81ca5979SMatti Vaittinen * in I2C line. Don't overflow if this happens.
361*81ca5979SMatti Vaittinen */
362*81ca5979SMatti Vaittinen dev_err(data->dev, "bad FIFO level %d\n", smp_lvl);
363*81ca5979SMatti Vaittinen smp_lvl = BM1390_FIFO_LENGTH;
364*81ca5979SMatti Vaittinen }
365*81ca5979SMatti Vaittinen
366*81ca5979SMatti Vaittinen sample_period = timestamp - data->old_timestamp;
367*81ca5979SMatti Vaittinen do_div(sample_period, smp_lvl);
368*81ca5979SMatti Vaittinen
369*81ca5979SMatti Vaittinen if (samples && smp_lvl > samples)
370*81ca5979SMatti Vaittinen smp_lvl = samples;
371*81ca5979SMatti Vaittinen
372*81ca5979SMatti Vaittinen
373*81ca5979SMatti Vaittinen /*
374*81ca5979SMatti Vaittinen * After some testing it appears that the temperature is not readable
375*81ca5979SMatti Vaittinen * until the FIFO access has been done after the WMI. Thus, we need
376*81ca5979SMatti Vaittinen * to read the all pressure values to memory and read the temperature
377*81ca5979SMatti Vaittinen * only after that.
378*81ca5979SMatti Vaittinen */
379*81ca5979SMatti Vaittinen for (i = 0; i < smp_lvl; i++) {
380*81ca5979SMatti Vaittinen /*
381*81ca5979SMatti Vaittinen * When we start reading data from the FIFO the sensor goes to
382*81ca5979SMatti Vaittinen * special FIFO reading mode. If any other register is accessed
383*81ca5979SMatti Vaittinen * during the FIFO read, samples can be dropped. Prevent access
384*81ca5979SMatti Vaittinen * until FIFO_LVL is read. We have mutex locked and we do also
385*81ca5979SMatti Vaittinen * go performing reading of FIFO_LVL even if this read fails.
386*81ca5979SMatti Vaittinen */
387*81ca5979SMatti Vaittinen if (test_bit(BM1390_CHAN_PRESSURE, idev->active_scan_mask)) {
388*81ca5979SMatti Vaittinen ret = bm1390_pressure_read(data, &buffer[i].pressure);
389*81ca5979SMatti Vaittinen if (ret)
390*81ca5979SMatti Vaittinen break;
391*81ca5979SMatti Vaittinen }
392*81ca5979SMatti Vaittinen
393*81ca5979SMatti Vaittinen /*
394*81ca5979SMatti Vaittinen * Old timestamp is either the previous sample IRQ time,
395*81ca5979SMatti Vaittinen * previous flush-time or, if this was first sample, the enable
396*81ca5979SMatti Vaittinen * time. When we add a sample period to that we should get the
397*81ca5979SMatti Vaittinen * best approximation of the time-stamp we are handling.
398*81ca5979SMatti Vaittinen *
399*81ca5979SMatti Vaittinen * Idea is to always keep the "old_timestamp" matching the
400*81ca5979SMatti Vaittinen * timestamp which we are currently handling.
401*81ca5979SMatti Vaittinen */
402*81ca5979SMatti Vaittinen data->old_timestamp += sample_period;
403*81ca5979SMatti Vaittinen buffer[i].ts = data->old_timestamp;
404*81ca5979SMatti Vaittinen }
405*81ca5979SMatti Vaittinen /* Reading the FIFO_LVL closes the FIFO access sequence */
406*81ca5979SMatti Vaittinen warn = regmap_read(data->regmap, BM1390_REG_FIFO_LVL, &dummy);
407*81ca5979SMatti Vaittinen if (warn)
408*81ca5979SMatti Vaittinen dev_warn(data->dev, "Closing FIFO sequence failed\n");
409*81ca5979SMatti Vaittinen
410*81ca5979SMatti Vaittinen if (ret)
411*81ca5979SMatti Vaittinen return ret;
412*81ca5979SMatti Vaittinen
413*81ca5979SMatti Vaittinen if (test_bit(BM1390_CHAN_TEMP, idev->active_scan_mask)) {
414*81ca5979SMatti Vaittinen ret = regmap_bulk_read(data->regmap, BM1390_REG_TEMP_HI, &temp,
415*81ca5979SMatti Vaittinen sizeof(temp));
416*81ca5979SMatti Vaittinen if (ret)
417*81ca5979SMatti Vaittinen return ret;
418*81ca5979SMatti Vaittinen }
419*81ca5979SMatti Vaittinen
420*81ca5979SMatti Vaittinen if (ret)
421*81ca5979SMatti Vaittinen return ret;
422*81ca5979SMatti Vaittinen
423*81ca5979SMatti Vaittinen for (i = 0; i < smp_lvl; i++) {
424*81ca5979SMatti Vaittinen buffer[i].temp = temp;
425*81ca5979SMatti Vaittinen iio_push_to_buffers(idev, &buffer[i]);
426*81ca5979SMatti Vaittinen }
427*81ca5979SMatti Vaittinen
428*81ca5979SMatti Vaittinen return smp_lvl;
429*81ca5979SMatti Vaittinen }
430*81ca5979SMatti Vaittinen
bm1390_fifo_flush(struct iio_dev * idev,unsigned int samples)431*81ca5979SMatti Vaittinen static int bm1390_fifo_flush(struct iio_dev *idev, unsigned int samples)
432*81ca5979SMatti Vaittinen {
433*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
434*81ca5979SMatti Vaittinen s64 timestamp;
435*81ca5979SMatti Vaittinen int ret;
436*81ca5979SMatti Vaittinen
437*81ca5979SMatti Vaittinen /*
438*81ca5979SMatti Vaittinen * If fifo_flush is being called from IRQ handler we know the stored
439*81ca5979SMatti Vaittinen * timestamp is fairly accurate for the last stored sample. If we are
440*81ca5979SMatti Vaittinen * called as a result of a read operation from userspace and hence
441*81ca5979SMatti Vaittinen * before the watermark interrupt was triggered, take a timestamp
442*81ca5979SMatti Vaittinen * now. We can fall anywhere in between two samples so the error in this
443*81ca5979SMatti Vaittinen * case is at most one sample period.
444*81ca5979SMatti Vaittinen * We need to have the IRQ disabled or we risk of messing-up
445*81ca5979SMatti Vaittinen * the timestamps. If we are ran from IRQ, then the
446*81ca5979SMatti Vaittinen * IRQF_ONESHOT has us covered - but if we are ran by the
447*81ca5979SMatti Vaittinen * user-space read we need to disable the IRQ to be on a safe
448*81ca5979SMatti Vaittinen * side. We do this usng synchronous disable so that if the
449*81ca5979SMatti Vaittinen * IRQ thread is being ran on other CPU we wait for it to be
450*81ca5979SMatti Vaittinen * finished.
451*81ca5979SMatti Vaittinen */
452*81ca5979SMatti Vaittinen
453*81ca5979SMatti Vaittinen timestamp = iio_get_time_ns(idev);
454*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
455*81ca5979SMatti Vaittinen ret = __bm1390_fifo_flush(idev, samples, timestamp);
456*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
457*81ca5979SMatti Vaittinen
458*81ca5979SMatti Vaittinen return ret;
459*81ca5979SMatti Vaittinen }
460*81ca5979SMatti Vaittinen
bm1390_set_watermark(struct iio_dev * idev,unsigned int val)461*81ca5979SMatti Vaittinen static int bm1390_set_watermark(struct iio_dev *idev, unsigned int val)
462*81ca5979SMatti Vaittinen {
463*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
464*81ca5979SMatti Vaittinen
465*81ca5979SMatti Vaittinen if (val < BM1390_WMI_MIN || val > BM1390_WMI_MAX)
466*81ca5979SMatti Vaittinen return -EINVAL;
467*81ca5979SMatti Vaittinen
468*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
469*81ca5979SMatti Vaittinen data->watermark = val;
470*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
471*81ca5979SMatti Vaittinen
472*81ca5979SMatti Vaittinen return 0;
473*81ca5979SMatti Vaittinen }
474*81ca5979SMatti Vaittinen
475*81ca5979SMatti Vaittinen static const struct iio_info bm1390_noirq_info = {
476*81ca5979SMatti Vaittinen .read_raw = &bm1390_read_raw,
477*81ca5979SMatti Vaittinen };
478*81ca5979SMatti Vaittinen
479*81ca5979SMatti Vaittinen static const struct iio_info bm1390_info = {
480*81ca5979SMatti Vaittinen .read_raw = &bm1390_read_raw,
481*81ca5979SMatti Vaittinen .hwfifo_set_watermark = bm1390_set_watermark,
482*81ca5979SMatti Vaittinen .hwfifo_flush_to_buffer = bm1390_fifo_flush,
483*81ca5979SMatti Vaittinen };
484*81ca5979SMatti Vaittinen
bm1390_chip_init(struct bm1390_data * data)485*81ca5979SMatti Vaittinen static int bm1390_chip_init(struct bm1390_data *data)
486*81ca5979SMatti Vaittinen {
487*81ca5979SMatti Vaittinen int ret;
488*81ca5979SMatti Vaittinen
489*81ca5979SMatti Vaittinen ret = regmap_write_bits(data->regmap, BM1390_REG_POWER,
490*81ca5979SMatti Vaittinen BM1390_MASK_POWER, BM1390_POWER_ON);
491*81ca5979SMatti Vaittinen if (ret)
492*81ca5979SMatti Vaittinen return ret;
493*81ca5979SMatti Vaittinen
494*81ca5979SMatti Vaittinen msleep(1);
495*81ca5979SMatti Vaittinen
496*81ca5979SMatti Vaittinen ret = regmap_write_bits(data->regmap, BM1390_REG_RESET,
497*81ca5979SMatti Vaittinen BM1390_MASK_RESET, BM1390_RESET);
498*81ca5979SMatti Vaittinen if (ret)
499*81ca5979SMatti Vaittinen return ret;
500*81ca5979SMatti Vaittinen
501*81ca5979SMatti Vaittinen msleep(1);
502*81ca5979SMatti Vaittinen
503*81ca5979SMatti Vaittinen ret = regmap_write_bits(data->regmap, BM1390_REG_RESET,
504*81ca5979SMatti Vaittinen BM1390_MASK_RESET, BM1390_RESET_RELEASE);
505*81ca5979SMatti Vaittinen if (ret)
506*81ca5979SMatti Vaittinen return ret;
507*81ca5979SMatti Vaittinen
508*81ca5979SMatti Vaittinen msleep(1);
509*81ca5979SMatti Vaittinen
510*81ca5979SMatti Vaittinen ret = regmap_reinit_cache(data->regmap, &bm1390_regmap);
511*81ca5979SMatti Vaittinen if (ret) {
512*81ca5979SMatti Vaittinen dev_err(data->dev, "Failed to reinit reg cache\n");
513*81ca5979SMatti Vaittinen return ret;
514*81ca5979SMatti Vaittinen }
515*81ca5979SMatti Vaittinen
516*81ca5979SMatti Vaittinen /*
517*81ca5979SMatti Vaittinen * Default to use IIR filter in "middle" mode. Also the AVE_NUM must
518*81ca5979SMatti Vaittinen * be fixed when IIR is in use.
519*81ca5979SMatti Vaittinen */
520*81ca5979SMatti Vaittinen ret = regmap_update_bits(data->regmap, BM1390_REG_MODE_CTRL,
521*81ca5979SMatti Vaittinen BM1390_MASK_AVE_NUM, BM1390_IIR_AVE_NUM);
522*81ca5979SMatti Vaittinen if (ret)
523*81ca5979SMatti Vaittinen return ret;
524*81ca5979SMatti Vaittinen
525*81ca5979SMatti Vaittinen return regmap_update_bits(data->regmap, BM1390_REG_FIFO_CTRL,
526*81ca5979SMatti Vaittinen BM1390_MASK_IIR_MODE, BM1390_IIR_MODE_MID);
527*81ca5979SMatti Vaittinen }
528*81ca5979SMatti Vaittinen
bm1390_fifo_set_wmi(struct bm1390_data * data)529*81ca5979SMatti Vaittinen static int bm1390_fifo_set_wmi(struct bm1390_data *data)
530*81ca5979SMatti Vaittinen {
531*81ca5979SMatti Vaittinen u8 regval;
532*81ca5979SMatti Vaittinen
533*81ca5979SMatti Vaittinen regval = FIELD_PREP(BM1390_MASK_FIFO_LEN,
534*81ca5979SMatti Vaittinen data->watermark - BM1390_WMI_MIN);
535*81ca5979SMatti Vaittinen
536*81ca5979SMatti Vaittinen return regmap_update_bits(data->regmap, BM1390_REG_FIFO_CTRL,
537*81ca5979SMatti Vaittinen BM1390_MASK_FIFO_LEN, regval);
538*81ca5979SMatti Vaittinen }
539*81ca5979SMatti Vaittinen
bm1390_fifo_enable(struct iio_dev * idev)540*81ca5979SMatti Vaittinen static int bm1390_fifo_enable(struct iio_dev *idev)
541*81ca5979SMatti Vaittinen {
542*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
543*81ca5979SMatti Vaittinen int ret;
544*81ca5979SMatti Vaittinen
545*81ca5979SMatti Vaittinen /* We can't do buffered stuff without IRQ as we never get WMI */
546*81ca5979SMatti Vaittinen if (data->irq <= 0)
547*81ca5979SMatti Vaittinen return -EINVAL;
548*81ca5979SMatti Vaittinen
549*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
550*81ca5979SMatti Vaittinen if (data->trigger_enabled) {
551*81ca5979SMatti Vaittinen ret = -EBUSY;
552*81ca5979SMatti Vaittinen goto unlock_out;
553*81ca5979SMatti Vaittinen }
554*81ca5979SMatti Vaittinen
555*81ca5979SMatti Vaittinen /* Update watermark to HW */
556*81ca5979SMatti Vaittinen ret = bm1390_fifo_set_wmi(data);
557*81ca5979SMatti Vaittinen if (ret)
558*81ca5979SMatti Vaittinen goto unlock_out;
559*81ca5979SMatti Vaittinen
560*81ca5979SMatti Vaittinen /* Enable WMI_IRQ */
561*81ca5979SMatti Vaittinen ret = regmap_set_bits(data->regmap, BM1390_REG_MODE_CTRL,
562*81ca5979SMatti Vaittinen BM1390_MASK_WMI_EN);
563*81ca5979SMatti Vaittinen if (ret)
564*81ca5979SMatti Vaittinen goto unlock_out;
565*81ca5979SMatti Vaittinen
566*81ca5979SMatti Vaittinen /* Enable FIFO */
567*81ca5979SMatti Vaittinen ret = regmap_set_bits(data->regmap, BM1390_REG_FIFO_CTRL,
568*81ca5979SMatti Vaittinen BM1390_MASK_FIFO_EN);
569*81ca5979SMatti Vaittinen if (ret)
570*81ca5979SMatti Vaittinen goto unlock_out;
571*81ca5979SMatti Vaittinen
572*81ca5979SMatti Vaittinen data->state = BM1390_STATE_FIFO;
573*81ca5979SMatti Vaittinen
574*81ca5979SMatti Vaittinen data->old_timestamp = iio_get_time_ns(idev);
575*81ca5979SMatti Vaittinen ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
576*81ca5979SMatti Vaittinen
577*81ca5979SMatti Vaittinen unlock_out:
578*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
579*81ca5979SMatti Vaittinen
580*81ca5979SMatti Vaittinen return ret;
581*81ca5979SMatti Vaittinen }
582*81ca5979SMatti Vaittinen
bm1390_fifo_disable(struct iio_dev * idev)583*81ca5979SMatti Vaittinen static int bm1390_fifo_disable(struct iio_dev *idev)
584*81ca5979SMatti Vaittinen {
585*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
586*81ca5979SMatti Vaittinen int ret;
587*81ca5979SMatti Vaittinen
588*81ca5979SMatti Vaittinen msleep(1);
589*81ca5979SMatti Vaittinen
590*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
591*81ca5979SMatti Vaittinen ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
592*81ca5979SMatti Vaittinen if (ret)
593*81ca5979SMatti Vaittinen goto unlock_out;
594*81ca5979SMatti Vaittinen
595*81ca5979SMatti Vaittinen /* Disable FIFO */
596*81ca5979SMatti Vaittinen ret = regmap_clear_bits(data->regmap, BM1390_REG_FIFO_CTRL,
597*81ca5979SMatti Vaittinen BM1390_MASK_FIFO_EN);
598*81ca5979SMatti Vaittinen if (ret)
599*81ca5979SMatti Vaittinen goto unlock_out;
600*81ca5979SMatti Vaittinen
601*81ca5979SMatti Vaittinen data->state = BM1390_STATE_SAMPLE;
602*81ca5979SMatti Vaittinen
603*81ca5979SMatti Vaittinen /* Disable WMI_IRQ */
604*81ca5979SMatti Vaittinen ret = regmap_clear_bits(data->regmap, BM1390_REG_MODE_CTRL,
605*81ca5979SMatti Vaittinen BM1390_MASK_WMI_EN);
606*81ca5979SMatti Vaittinen
607*81ca5979SMatti Vaittinen unlock_out:
608*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
609*81ca5979SMatti Vaittinen
610*81ca5979SMatti Vaittinen return ret;
611*81ca5979SMatti Vaittinen }
612*81ca5979SMatti Vaittinen
bm1390_buffer_postenable(struct iio_dev * idev)613*81ca5979SMatti Vaittinen static int bm1390_buffer_postenable(struct iio_dev *idev)
614*81ca5979SMatti Vaittinen {
615*81ca5979SMatti Vaittinen /*
616*81ca5979SMatti Vaittinen * If we use data-ready trigger, then the IRQ masks should be handled by
617*81ca5979SMatti Vaittinen * trigger enable and the hardware buffer is not used but we just update
618*81ca5979SMatti Vaittinen * results to the IIO FIFO when data-ready triggers.
619*81ca5979SMatti Vaittinen */
620*81ca5979SMatti Vaittinen if (iio_device_get_current_mode(idev) == INDIO_BUFFER_TRIGGERED)
621*81ca5979SMatti Vaittinen return 0;
622*81ca5979SMatti Vaittinen
623*81ca5979SMatti Vaittinen return bm1390_fifo_enable(idev);
624*81ca5979SMatti Vaittinen }
625*81ca5979SMatti Vaittinen
bm1390_buffer_predisable(struct iio_dev * idev)626*81ca5979SMatti Vaittinen static int bm1390_buffer_predisable(struct iio_dev *idev)
627*81ca5979SMatti Vaittinen {
628*81ca5979SMatti Vaittinen if (iio_device_get_current_mode(idev) == INDIO_BUFFER_TRIGGERED)
629*81ca5979SMatti Vaittinen return 0;
630*81ca5979SMatti Vaittinen
631*81ca5979SMatti Vaittinen return bm1390_fifo_disable(idev);
632*81ca5979SMatti Vaittinen }
633*81ca5979SMatti Vaittinen
634*81ca5979SMatti Vaittinen static const struct iio_buffer_setup_ops bm1390_buffer_ops = {
635*81ca5979SMatti Vaittinen .postenable = bm1390_buffer_postenable,
636*81ca5979SMatti Vaittinen .predisable = bm1390_buffer_predisable,
637*81ca5979SMatti Vaittinen };
638*81ca5979SMatti Vaittinen
bm1390_trigger_handler(int irq,void * p)639*81ca5979SMatti Vaittinen static irqreturn_t bm1390_trigger_handler(int irq, void *p)
640*81ca5979SMatti Vaittinen {
641*81ca5979SMatti Vaittinen struct iio_poll_func *pf = p;
642*81ca5979SMatti Vaittinen struct iio_dev *idev = pf->indio_dev;
643*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
644*81ca5979SMatti Vaittinen int ret, status;
645*81ca5979SMatti Vaittinen
646*81ca5979SMatti Vaittinen /* DRDY is acked by reading status reg */
647*81ca5979SMatti Vaittinen ret = regmap_read(data->regmap, BM1390_REG_STATUS, &status);
648*81ca5979SMatti Vaittinen if (ret || !status)
649*81ca5979SMatti Vaittinen return IRQ_NONE;
650*81ca5979SMatti Vaittinen
651*81ca5979SMatti Vaittinen dev_dbg(data->dev, "DRDY trig status 0x%x\n", status);
652*81ca5979SMatti Vaittinen
653*81ca5979SMatti Vaittinen if (test_bit(BM1390_CHAN_PRESSURE, idev->active_scan_mask)) {
654*81ca5979SMatti Vaittinen ret = bm1390_pressure_read(data, &data->buf.pressure);
655*81ca5979SMatti Vaittinen if (ret) {
656*81ca5979SMatti Vaittinen dev_warn(data->dev, "sample read failed %d\n", ret);
657*81ca5979SMatti Vaittinen return IRQ_NONE;
658*81ca5979SMatti Vaittinen }
659*81ca5979SMatti Vaittinen }
660*81ca5979SMatti Vaittinen
661*81ca5979SMatti Vaittinen if (test_bit(BM1390_CHAN_TEMP, idev->active_scan_mask)) {
662*81ca5979SMatti Vaittinen ret = regmap_bulk_read(data->regmap, BM1390_REG_TEMP_HI,
663*81ca5979SMatti Vaittinen &data->buf.temp, sizeof(data->buf.temp));
664*81ca5979SMatti Vaittinen if (ret) {
665*81ca5979SMatti Vaittinen dev_warn(data->dev, "temp read failed %d\n", ret);
666*81ca5979SMatti Vaittinen return IRQ_HANDLED;
667*81ca5979SMatti Vaittinen }
668*81ca5979SMatti Vaittinen }
669*81ca5979SMatti Vaittinen
670*81ca5979SMatti Vaittinen iio_push_to_buffers_with_timestamp(idev, &data->buf, data->timestamp);
671*81ca5979SMatti Vaittinen iio_trigger_notify_done(idev->trig);
672*81ca5979SMatti Vaittinen
673*81ca5979SMatti Vaittinen return IRQ_HANDLED;
674*81ca5979SMatti Vaittinen }
675*81ca5979SMatti Vaittinen
676*81ca5979SMatti Vaittinen /* Get timestamps and wake the thread if we need to read data */
bm1390_irq_handler(int irq,void * private)677*81ca5979SMatti Vaittinen static irqreturn_t bm1390_irq_handler(int irq, void *private)
678*81ca5979SMatti Vaittinen {
679*81ca5979SMatti Vaittinen struct iio_dev *idev = private;
680*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
681*81ca5979SMatti Vaittinen
682*81ca5979SMatti Vaittinen data->timestamp = iio_get_time_ns(idev);
683*81ca5979SMatti Vaittinen
684*81ca5979SMatti Vaittinen if (data->state == BM1390_STATE_FIFO || data->trigger_enabled)
685*81ca5979SMatti Vaittinen return IRQ_WAKE_THREAD;
686*81ca5979SMatti Vaittinen
687*81ca5979SMatti Vaittinen return IRQ_NONE;
688*81ca5979SMatti Vaittinen }
689*81ca5979SMatti Vaittinen
bm1390_irq_thread_handler(int irq,void * private)690*81ca5979SMatti Vaittinen static irqreturn_t bm1390_irq_thread_handler(int irq, void *private)
691*81ca5979SMatti Vaittinen {
692*81ca5979SMatti Vaittinen struct iio_dev *idev = private;
693*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_priv(idev);
694*81ca5979SMatti Vaittinen int ret = IRQ_NONE;
695*81ca5979SMatti Vaittinen
696*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
697*81ca5979SMatti Vaittinen
698*81ca5979SMatti Vaittinen if (data->trigger_enabled) {
699*81ca5979SMatti Vaittinen iio_trigger_poll_nested(data->trig);
700*81ca5979SMatti Vaittinen ret = IRQ_HANDLED;
701*81ca5979SMatti Vaittinen } else if (data->state == BM1390_STATE_FIFO) {
702*81ca5979SMatti Vaittinen int ok;
703*81ca5979SMatti Vaittinen
704*81ca5979SMatti Vaittinen ok = __bm1390_fifo_flush(idev, BM1390_FIFO_LENGTH,
705*81ca5979SMatti Vaittinen data->timestamp);
706*81ca5979SMatti Vaittinen if (ok > 0)
707*81ca5979SMatti Vaittinen ret = IRQ_HANDLED;
708*81ca5979SMatti Vaittinen }
709*81ca5979SMatti Vaittinen
710*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
711*81ca5979SMatti Vaittinen
712*81ca5979SMatti Vaittinen return ret;
713*81ca5979SMatti Vaittinen }
714*81ca5979SMatti Vaittinen
bm1390_set_drdy_irq(struct bm1390_data * data,bool en)715*81ca5979SMatti Vaittinen static int bm1390_set_drdy_irq(struct bm1390_data *data, bool en)
716*81ca5979SMatti Vaittinen {
717*81ca5979SMatti Vaittinen if (en)
718*81ca5979SMatti Vaittinen return regmap_set_bits(data->regmap, BM1390_REG_MODE_CTRL,
719*81ca5979SMatti Vaittinen BM1390_MASK_DRDY_EN);
720*81ca5979SMatti Vaittinen return regmap_clear_bits(data->regmap, BM1390_REG_MODE_CTRL,
721*81ca5979SMatti Vaittinen BM1390_MASK_DRDY_EN);
722*81ca5979SMatti Vaittinen }
723*81ca5979SMatti Vaittinen
bm1390_trigger_set_state(struct iio_trigger * trig,bool state)724*81ca5979SMatti Vaittinen static int bm1390_trigger_set_state(struct iio_trigger *trig,
725*81ca5979SMatti Vaittinen bool state)
726*81ca5979SMatti Vaittinen {
727*81ca5979SMatti Vaittinen struct bm1390_data *data = iio_trigger_get_drvdata(trig);
728*81ca5979SMatti Vaittinen int ret = 0;
729*81ca5979SMatti Vaittinen
730*81ca5979SMatti Vaittinen mutex_lock(&data->mutex);
731*81ca5979SMatti Vaittinen
732*81ca5979SMatti Vaittinen if (data->trigger_enabled == state)
733*81ca5979SMatti Vaittinen goto unlock_out;
734*81ca5979SMatti Vaittinen
735*81ca5979SMatti Vaittinen if (data->state == BM1390_STATE_FIFO) {
736*81ca5979SMatti Vaittinen dev_warn(data->dev, "Can't set trigger when FIFO enabled\n");
737*81ca5979SMatti Vaittinen ret = -EBUSY;
738*81ca5979SMatti Vaittinen goto unlock_out;
739*81ca5979SMatti Vaittinen }
740*81ca5979SMatti Vaittinen
741*81ca5979SMatti Vaittinen data->trigger_enabled = state;
742*81ca5979SMatti Vaittinen
743*81ca5979SMatti Vaittinen if (state) {
744*81ca5979SMatti Vaittinen ret = bm1390_meas_set(data, BM1390_MEAS_MODE_CONTINUOUS);
745*81ca5979SMatti Vaittinen if (ret)
746*81ca5979SMatti Vaittinen goto unlock_out;
747*81ca5979SMatti Vaittinen } else {
748*81ca5979SMatti Vaittinen int dummy;
749*81ca5979SMatti Vaittinen
750*81ca5979SMatti Vaittinen ret = bm1390_meas_set(data, BM1390_MEAS_MODE_STOP);
751*81ca5979SMatti Vaittinen if (ret)
752*81ca5979SMatti Vaittinen goto unlock_out;
753*81ca5979SMatti Vaittinen
754*81ca5979SMatti Vaittinen /*
755*81ca5979SMatti Vaittinen * We need to read the status register in order to ACK the
756*81ca5979SMatti Vaittinen * data-ready which may have been generated just before we
757*81ca5979SMatti Vaittinen * disabled the measurement.
758*81ca5979SMatti Vaittinen */
759*81ca5979SMatti Vaittinen ret = regmap_read(data->regmap, BM1390_REG_STATUS, &dummy);
760*81ca5979SMatti Vaittinen if (ret)
761*81ca5979SMatti Vaittinen dev_warn(data->dev, "status read failed\n");
762*81ca5979SMatti Vaittinen }
763*81ca5979SMatti Vaittinen
764*81ca5979SMatti Vaittinen ret = bm1390_set_drdy_irq(data, state);
765*81ca5979SMatti Vaittinen
766*81ca5979SMatti Vaittinen unlock_out:
767*81ca5979SMatti Vaittinen mutex_unlock(&data->mutex);
768*81ca5979SMatti Vaittinen
769*81ca5979SMatti Vaittinen return ret;
770*81ca5979SMatti Vaittinen }
771*81ca5979SMatti Vaittinen
772*81ca5979SMatti Vaittinen static const struct iio_trigger_ops bm1390_trigger_ops = {
773*81ca5979SMatti Vaittinen .set_trigger_state = bm1390_trigger_set_state,
774*81ca5979SMatti Vaittinen };
775*81ca5979SMatti Vaittinen
bm1390_setup_buffer(struct bm1390_data * data,struct iio_dev * idev)776*81ca5979SMatti Vaittinen static int bm1390_setup_buffer(struct bm1390_data *data, struct iio_dev *idev)
777*81ca5979SMatti Vaittinen {
778*81ca5979SMatti Vaittinen int ret;
779*81ca5979SMatti Vaittinen
780*81ca5979SMatti Vaittinen ret = devm_iio_triggered_buffer_setup(data->dev, idev,
781*81ca5979SMatti Vaittinen &iio_pollfunc_store_time,
782*81ca5979SMatti Vaittinen &bm1390_trigger_handler,
783*81ca5979SMatti Vaittinen &bm1390_buffer_ops);
784*81ca5979SMatti Vaittinen
785*81ca5979SMatti Vaittinen if (ret)
786*81ca5979SMatti Vaittinen return dev_err_probe(data->dev, ret,
787*81ca5979SMatti Vaittinen "iio_triggered_buffer_setup FAIL\n");
788*81ca5979SMatti Vaittinen
789*81ca5979SMatti Vaittinen idev->available_scan_masks = bm1390_scan_masks;
790*81ca5979SMatti Vaittinen
791*81ca5979SMatti Vaittinen return 0;
792*81ca5979SMatti Vaittinen }
793*81ca5979SMatti Vaittinen
bm1390_setup_trigger(struct bm1390_data * data,struct iio_dev * idev,int irq)794*81ca5979SMatti Vaittinen static int bm1390_setup_trigger(struct bm1390_data *data, struct iio_dev *idev,
795*81ca5979SMatti Vaittinen int irq)
796*81ca5979SMatti Vaittinen {
797*81ca5979SMatti Vaittinen struct iio_trigger *itrig;
798*81ca5979SMatti Vaittinen char *name;
799*81ca5979SMatti Vaittinen int ret;
800*81ca5979SMatti Vaittinen
801*81ca5979SMatti Vaittinen itrig = devm_iio_trigger_alloc(data->dev, "%sdata-rdy-dev%d", idev->name,
802*81ca5979SMatti Vaittinen iio_device_id(idev));
803*81ca5979SMatti Vaittinen if (!itrig)
804*81ca5979SMatti Vaittinen return -ENOMEM;
805*81ca5979SMatti Vaittinen
806*81ca5979SMatti Vaittinen data->trig = itrig;
807*81ca5979SMatti Vaittinen
808*81ca5979SMatti Vaittinen itrig->ops = &bm1390_trigger_ops;
809*81ca5979SMatti Vaittinen iio_trigger_set_drvdata(itrig, data);
810*81ca5979SMatti Vaittinen
811*81ca5979SMatti Vaittinen name = devm_kasprintf(data->dev, GFP_KERNEL, "%s-bm1390",
812*81ca5979SMatti Vaittinen dev_name(data->dev));
813*81ca5979SMatti Vaittinen if (name == NULL)
814*81ca5979SMatti Vaittinen return -ENOMEM;
815*81ca5979SMatti Vaittinen
816*81ca5979SMatti Vaittinen ret = devm_request_threaded_irq(data->dev, irq, bm1390_irq_handler,
817*81ca5979SMatti Vaittinen &bm1390_irq_thread_handler,
818*81ca5979SMatti Vaittinen IRQF_ONESHOT, name, idev);
819*81ca5979SMatti Vaittinen if (ret)
820*81ca5979SMatti Vaittinen return dev_err_probe(data->dev, ret, "Could not request IRQ\n");
821*81ca5979SMatti Vaittinen
822*81ca5979SMatti Vaittinen
823*81ca5979SMatti Vaittinen ret = devm_iio_trigger_register(data->dev, itrig);
824*81ca5979SMatti Vaittinen if (ret)
825*81ca5979SMatti Vaittinen return dev_err_probe(data->dev, ret,
826*81ca5979SMatti Vaittinen "Trigger registration failed\n");
827*81ca5979SMatti Vaittinen
828*81ca5979SMatti Vaittinen return 0;
829*81ca5979SMatti Vaittinen }
830*81ca5979SMatti Vaittinen
bm1390_probe(struct i2c_client * i2c)831*81ca5979SMatti Vaittinen static int bm1390_probe(struct i2c_client *i2c)
832*81ca5979SMatti Vaittinen {
833*81ca5979SMatti Vaittinen struct bm1390_data *data;
834*81ca5979SMatti Vaittinen struct regmap *regmap;
835*81ca5979SMatti Vaittinen struct iio_dev *idev;
836*81ca5979SMatti Vaittinen struct device *dev;
837*81ca5979SMatti Vaittinen unsigned int part_id;
838*81ca5979SMatti Vaittinen int ret;
839*81ca5979SMatti Vaittinen
840*81ca5979SMatti Vaittinen dev = &i2c->dev;
841*81ca5979SMatti Vaittinen
842*81ca5979SMatti Vaittinen regmap = devm_regmap_init_i2c(i2c, &bm1390_regmap);
843*81ca5979SMatti Vaittinen if (IS_ERR(regmap))
844*81ca5979SMatti Vaittinen return dev_err_probe(dev, PTR_ERR(regmap),
845*81ca5979SMatti Vaittinen "Failed to initialize Regmap\n");
846*81ca5979SMatti Vaittinen
847*81ca5979SMatti Vaittinen ret = devm_regulator_get_enable(dev, "vdd");
848*81ca5979SMatti Vaittinen if (ret)
849*81ca5979SMatti Vaittinen return dev_err_probe(dev, ret, "Failed to get regulator\n");
850*81ca5979SMatti Vaittinen
851*81ca5979SMatti Vaittinen ret = regmap_read(regmap, BM1390_REG_PART_ID, &part_id);
852*81ca5979SMatti Vaittinen if (ret)
853*81ca5979SMatti Vaittinen return dev_err_probe(dev, ret, "Failed to access sensor\n");
854*81ca5979SMatti Vaittinen
855*81ca5979SMatti Vaittinen if (part_id != BM1390_ID)
856*81ca5979SMatti Vaittinen dev_warn(dev, "unknown device 0x%x\n", part_id);
857*81ca5979SMatti Vaittinen
858*81ca5979SMatti Vaittinen idev = devm_iio_device_alloc(dev, sizeof(*data));
859*81ca5979SMatti Vaittinen if (!idev)
860*81ca5979SMatti Vaittinen return -ENOMEM;
861*81ca5979SMatti Vaittinen
862*81ca5979SMatti Vaittinen data = iio_priv(idev);
863*81ca5979SMatti Vaittinen data->regmap = regmap;
864*81ca5979SMatti Vaittinen data->dev = dev;
865*81ca5979SMatti Vaittinen data->irq = i2c->irq;
866*81ca5979SMatti Vaittinen /*
867*81ca5979SMatti Vaittinen * For now we just allow BM1390_WMI_MIN to BM1390_WMI_MAX and
868*81ca5979SMatti Vaittinen * discard every other configuration when triggered mode is not used.
869*81ca5979SMatti Vaittinen */
870*81ca5979SMatti Vaittinen data->watermark = BM1390_WMI_MAX;
871*81ca5979SMatti Vaittinen mutex_init(&data->mutex);
872*81ca5979SMatti Vaittinen
873*81ca5979SMatti Vaittinen idev->channels = bm1390_channels;
874*81ca5979SMatti Vaittinen idev->num_channels = ARRAY_SIZE(bm1390_channels);
875*81ca5979SMatti Vaittinen idev->name = "bm1390";
876*81ca5979SMatti Vaittinen idev->modes = INDIO_DIRECT_MODE;
877*81ca5979SMatti Vaittinen
878*81ca5979SMatti Vaittinen ret = bm1390_chip_init(data);
879*81ca5979SMatti Vaittinen if (ret)
880*81ca5979SMatti Vaittinen return dev_err_probe(dev, ret, "sensor init failed\n");
881*81ca5979SMatti Vaittinen
882*81ca5979SMatti Vaittinen ret = bm1390_setup_buffer(data, idev);
883*81ca5979SMatti Vaittinen if (ret)
884*81ca5979SMatti Vaittinen return ret;
885*81ca5979SMatti Vaittinen
886*81ca5979SMatti Vaittinen /* No trigger if we don't have IRQ for data-ready and WMI */
887*81ca5979SMatti Vaittinen if (i2c->irq > 0) {
888*81ca5979SMatti Vaittinen idev->info = &bm1390_info;
889*81ca5979SMatti Vaittinen idev->modes |= INDIO_BUFFER_SOFTWARE;
890*81ca5979SMatti Vaittinen ret = bm1390_setup_trigger(data, idev, i2c->irq);
891*81ca5979SMatti Vaittinen if (ret)
892*81ca5979SMatti Vaittinen return ret;
893*81ca5979SMatti Vaittinen } else {
894*81ca5979SMatti Vaittinen idev->info = &bm1390_noirq_info;
895*81ca5979SMatti Vaittinen }
896*81ca5979SMatti Vaittinen
897*81ca5979SMatti Vaittinen ret = devm_iio_device_register(dev, idev);
898*81ca5979SMatti Vaittinen if (ret < 0)
899*81ca5979SMatti Vaittinen return dev_err_probe(dev, ret,
900*81ca5979SMatti Vaittinen "Unable to register iio device\n");
901*81ca5979SMatti Vaittinen
902*81ca5979SMatti Vaittinen return 0;
903*81ca5979SMatti Vaittinen }
904*81ca5979SMatti Vaittinen
905*81ca5979SMatti Vaittinen static const struct of_device_id bm1390_of_match[] = {
906*81ca5979SMatti Vaittinen { .compatible = "rohm,bm1390glv-z" },
907*81ca5979SMatti Vaittinen {}
908*81ca5979SMatti Vaittinen };
909*81ca5979SMatti Vaittinen MODULE_DEVICE_TABLE(of, bm1390_of_match);
910*81ca5979SMatti Vaittinen
911*81ca5979SMatti Vaittinen static const struct i2c_device_id bm1390_id[] = {
912*81ca5979SMatti Vaittinen { "bm1390glv-z", },
913*81ca5979SMatti Vaittinen {}
914*81ca5979SMatti Vaittinen };
915*81ca5979SMatti Vaittinen MODULE_DEVICE_TABLE(i2c, bm1390_id);
916*81ca5979SMatti Vaittinen
917*81ca5979SMatti Vaittinen static struct i2c_driver bm1390_driver = {
918*81ca5979SMatti Vaittinen .driver = {
919*81ca5979SMatti Vaittinen .name = "bm1390",
920*81ca5979SMatti Vaittinen .of_match_table = bm1390_of_match,
921*81ca5979SMatti Vaittinen /*
922*81ca5979SMatti Vaittinen * Probing explicitly requires a few millisecond of sleep.
923*81ca5979SMatti Vaittinen * Enabling the VDD regulator may include ramp up rates.
924*81ca5979SMatti Vaittinen */
925*81ca5979SMatti Vaittinen .probe_type = PROBE_PREFER_ASYNCHRONOUS,
926*81ca5979SMatti Vaittinen },
927*81ca5979SMatti Vaittinen .probe = bm1390_probe,
928*81ca5979SMatti Vaittinen .id_table = bm1390_id,
929*81ca5979SMatti Vaittinen };
930*81ca5979SMatti Vaittinen module_i2c_driver(bm1390_driver);
931*81ca5979SMatti Vaittinen
932*81ca5979SMatti Vaittinen MODULE_AUTHOR("Matti Vaittinen <mazziesaccount@gmail.com>");
933*81ca5979SMatti Vaittinen MODULE_DESCRIPTION("Driver for ROHM BM1390 pressure sensor");
934*81ca5979SMatti Vaittinen MODULE_LICENSE("GPL");
935