xref: /linux/drivers/iio/pressure/rohm-bm1390.c (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
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