xref: /linux/drivers/iio/pressure/abp2030pa.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*47d323ceSPetre Rodan /* SPDX-License-Identifier: GPL-2.0 */
2*47d323ceSPetre Rodan /*
3*47d323ceSPetre Rodan  * Honeywell ABP2 series pressure sensor driver
4*47d323ceSPetre Rodan  *
5*47d323ceSPetre Rodan  * Copyright (c) 2025 Petre Rodan <petre.rodan@subdimension.ro>
6*47d323ceSPetre Rodan  */
7*47d323ceSPetre Rodan 
8*47d323ceSPetre Rodan #ifndef _ABP2030PA_H
9*47d323ceSPetre Rodan #define _ABP2030PA_H
10*47d323ceSPetre Rodan 
11*47d323ceSPetre Rodan #include <linux/completion.h>
12*47d323ceSPetre Rodan #include <linux/types.h>
13*47d323ceSPetre Rodan 
14*47d323ceSPetre Rodan #include <linux/iio/iio.h>
15*47d323ceSPetre Rodan 
16*47d323ceSPetre Rodan #define ABP2_MEASUREMENT_RD_SIZE 7
17*47d323ceSPetre Rodan 
18*47d323ceSPetre Rodan struct device;
19*47d323ceSPetre Rodan 
20*47d323ceSPetre Rodan struct abp2_data;
21*47d323ceSPetre Rodan struct abp2_ops;
22*47d323ceSPetre Rodan 
23*47d323ceSPetre Rodan enum abp2_func_id {
24*47d323ceSPetre Rodan 	ABP2_FUNCTION_A,
25*47d323ceSPetre Rodan };
26*47d323ceSPetre Rodan 
27*47d323ceSPetre Rodan /**
28*47d323ceSPetre Rodan  * struct abp2_data
29*47d323ceSPetre Rodan  * @dev: current device structure
30*47d323ceSPetre Rodan  * @ops: pointers for bus specific read and write functions
31*47d323ceSPetre Rodan  * @pmin: minimal pressure in pascal
32*47d323ceSPetre Rodan  * @pmax: maximal pressure in pascal
33*47d323ceSPetre Rodan  * @outmin: minimum raw pressure in counts (based on transfer function)
34*47d323ceSPetre Rodan  * @outmax: maximum raw pressure in counts (based on transfer function)
35*47d323ceSPetre Rodan  * @function: transfer function
36*47d323ceSPetre Rodan  * @p_scale: pressure scale
37*47d323ceSPetre Rodan  * @p_scale_dec: pressure scale, decimal number
38*47d323ceSPetre Rodan  * @p_offset: pressure offset
39*47d323ceSPetre Rodan  * @irq: end of conversion - applies only to the i2c sensor
40*47d323ceSPetre Rodan  * @completion: handshake from irq to read
41*47d323ceSPetre Rodan  * @scan: channel values for buffered mode
42*47d323ceSPetre Rodan  * @tx_buf: transmit buffer used during the SPI communication
43*47d323ceSPetre Rodan  * @rx_buf: raw data provided by sensor
44*47d323ceSPetre Rodan  */
45*47d323ceSPetre Rodan struct abp2_data {
46*47d323ceSPetre Rodan 	struct device *dev;
47*47d323ceSPetre Rodan 	const struct abp2_ops *ops;
48*47d323ceSPetre Rodan 	s32 pmin;
49*47d323ceSPetre Rodan 	s32 pmax;
50*47d323ceSPetre Rodan 	u32 outmin;
51*47d323ceSPetre Rodan 	u32 outmax;
52*47d323ceSPetre Rodan 	enum abp2_func_id function;
53*47d323ceSPetre Rodan 	int p_scale;
54*47d323ceSPetre Rodan 	int p_scale_dec;
55*47d323ceSPetre Rodan 	int p_offset;
56*47d323ceSPetre Rodan 	int irq;
57*47d323ceSPetre Rodan 	struct completion completion;
58*47d323ceSPetre Rodan 	struct {
59*47d323ceSPetre Rodan 		u32 chan[2];
60*47d323ceSPetre Rodan 		aligned_s64 timestamp;
61*47d323ceSPetre Rodan 	} scan;
62*47d323ceSPetre Rodan 	u8 rx_buf[ABP2_MEASUREMENT_RD_SIZE] __aligned(IIO_DMA_MINALIGN);
63*47d323ceSPetre Rodan 	u8 tx_buf[ABP2_MEASUREMENT_RD_SIZE];
64*47d323ceSPetre Rodan };
65*47d323ceSPetre Rodan 
66*47d323ceSPetre Rodan struct abp2_ops {
67*47d323ceSPetre Rodan 	int (*read)(struct abp2_data *data, u8 cmd, u8 nbytes);
68*47d323ceSPetre Rodan 	int (*write)(struct abp2_data *data, u8 cmd, u8 nbytes);
69*47d323ceSPetre Rodan };
70*47d323ceSPetre Rodan 
71*47d323ceSPetre Rodan int abp2_common_probe(struct device *dev, const struct abp2_ops *ops, int irq);
72*47d323ceSPetre Rodan 
73*47d323ceSPetre Rodan #endif
74