xref: /linux/drivers/iio/pressure/mprls0025pa.h (revision daa2be74b1b2302004945b2a5e32424e177cc7da)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * MPRLS0025PA - Honeywell MicroPressure pressure sensor series driver
4  *
5  * Copyright (c) Andreas Klinger <ak@it-klinger.de>
6  *
7  * Data sheet:
8  *  https://prod-edam.honeywell.com/content/dam/honeywell-edam/sps/siot/en-us/products/sensors/pressure-sensors/board-mount-pressure-sensors/micropressure-mpr-series/documents/sps-siot-mpr-series-datasheet-32332628-ciid-172626.pdf
9  */
10 
11 #ifndef _MPRLS0025PA_H
12 #define _MPRLS0025PA_H
13 
14 #include <linux/completion.h>
15 #include <linux/delay.h>
16 #include <linux/device.h>
17 #include <linux/mutex.h>
18 #include <linux/stddef.h>
19 #include <linux/types.h>
20 
21 #include <linux/iio/iio.h>
22 
23 #define MPR_MEASUREMENT_RD_SIZE 4
24 #define MPR_CMD_NOP      0xf0
25 #define MPR_CMD_SYNC     0xaa
26 #define MPR_PKT_NOP_LEN  MPR_MEASUREMENT_RD_SIZE
27 #define MPR_PKT_SYNC_LEN 3
28 
29 struct device;
30 
31 struct iio_chan_spec;
32 struct iio_dev;
33 
34 struct mpr_data;
35 struct mpr_ops;
36 
37 /**
38  * struct mpr_chan
39  * @pres: pressure value
40  * @ts: timestamp
41  */
42 struct mpr_chan {
43 	s32 pres;
44 	s64 ts;
45 };
46 
47 enum mpr_func_id {
48 	MPR_FUNCTION_A,
49 	MPR_FUNCTION_B,
50 	MPR_FUNCTION_C,
51 };
52 
53 /**
54  * struct mpr_data
55  * @dev: current device structure
56  * @ops: functions that implement the sensor reads/writes, bus init
57  * @lock: access to device during read
58  * @pmin: minimal pressure in pascal
59  * @pmax: maximal pressure in pascal
60  * @function: transfer function
61  * @outmin: minimum raw pressure in counts (based on transfer function)
62  * @outmax: maximum raw pressure in counts (based on transfer function)
63  * @scale: pressure scale
64  * @scale2: pressure scale, decimal number
65  * @offset: pressure offset
66  * @offset2: pressure offset, decimal number
67  * @gpiod_reset: reset
68  * @irq: end of conversion irq. used to distinguish between irq mode and
69  *       reading in a loop until data is ready
70  * @completion: handshake from irq to read
71  * @chan: channel values for buffered mode
72  * @buffer: raw conversion data
73  */
74 struct mpr_data {
75 	struct device		*dev;
76 	const struct mpr_ops	*ops;
77 	struct mutex		lock;
78 	u32			pmin;
79 	u32			pmax;
80 	enum mpr_func_id	function;
81 	u32			outmin;
82 	u32			outmax;
83 	int			scale;
84 	int			scale2;
85 	int			offset;
86 	int			offset2;
87 	struct gpio_desc	*gpiod_reset;
88 	int			irq;
89 	struct completion	completion;
90 	struct mpr_chan		chan;
91 	u8	    buffer[MPR_MEASUREMENT_RD_SIZE] __aligned(IIO_DMA_MINALIGN);
92 };
93 
94 struct mpr_ops {
95 	int (*init)(struct device *dev);
96 	int (*read)(struct mpr_data *data, const u8 cmd, const u8 cnt);
97 	int (*write)(struct mpr_data *data, const u8 cmd, const u8 cnt);
98 };
99 
100 int mpr_common_probe(struct device *dev, const struct mpr_ops *ops, int irq);
101 
102 #endif
103