xref: /linux/drivers/iio/pressure/abp2030pa.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Honeywell ABP2 series pressure sensor driver
4  *
5  * Copyright (c) 2025 Petre Rodan <petre.rodan@subdimension.ro>
6  *
7  * Datasheet: https://prod-edam.honeywell.com/content/dam/honeywell-edam/sps/siot/en-us/products/sensors/pressure-sensors/board-mount-pressure-sensors/basic-abp2-series/documents/sps-siot-abp2-series-datasheet-32350268-en.pdf
8  */
9 
10 #include <linux/array_size.h>
11 #include <linux/bits.h>
12 #include <linux/completion.h>
13 #include <linux/delay.h>
14 #include <linux/dev_printk.h>
15 #include <linux/device.h>
16 #include <linux/errno.h>
17 #include <linux/export.h>
18 #include <linux/gpio/consumer.h>
19 #include <linux/interrupt.h>
20 #include <linux/jiffies.h>
21 #include <linux/math64.h>
22 #include <linux/module.h>
23 #include <linux/property.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/string.h>
26 #include <linux/time.h>
27 #include <linux/types.h>
28 #include <linux/unaligned.h>
29 #include <linux/units.h>
30 
31 #include <linux/iio/buffer.h>
32 #include <linux/iio/iio.h>
33 #include <linux/iio/trigger_consumer.h>
34 #include <linux/iio/triggered_buffer.h>
35 
36 #include "abp2030pa.h"
37 
38 /* Status byte flags */
39 #define ABP2_ST_POWER     BIT(6) /* 1 if device is powered */
40 #define ABP2_ST_BUSY      BIT(5) /* 1 if device is busy */
41 
42 #define ABP2_CMD_NOP      0xf0
43 #define ABP2_CMD_SYNC     0xaa
44 #define ABP2_PKT_SYNC_LEN 3
45 #define ABP2_PKT_NOP_LEN  ABP2_MEASUREMENT_RD_SIZE
46 
47 struct abp2_func_spec {
48 	u32 output_min;
49 	u32 output_max;
50 };
51 
52 /* transfer function A: 10%   to 90%   of 2^24 */
53 static const struct abp2_func_spec abp2_func_spec[] = {
54 	[ABP2_FUNCTION_A] = { .output_min = 1677722, .output_max = 15099494 },
55 };
56 
57 enum abp2_variants {
58 	ABP2001BA, ABP21_6BA, ABP22_5BA, ABP2004BA, ABP2006BA, ABP2008BA,
59 	ABP2010BA, ABP2012BA, ABP2001BD, ABP21_6BD, ABP22_5BD, ABP2004BD,
60 	ABP2001BG, ABP21_6BG, ABP22_5BG, ABP2004BG, ABP2006BG, ABP2008BG,
61 	ABP2010BG, ABP2012BG, ABP2001GG, ABP21_2GG, ABP2100KA, ABP2160KA,
62 	ABP2250KA, ABP2001KD, ABP21_6KD, ABP22_5KD, ABP2004KD, ABP2006KD,
63 	ABP2010KD, ABP2016KD, ABP2025KD, ABP2040KD, ABP2060KD, ABP2100KD,
64 	ABP2160KD, ABP2250KD, ABP2400KD, ABP2001KG, ABP21_6KG, ABP22_5KG,
65 	ABP2004KG, ABP2006KG, ABP2010KG, ABP2016KG, ABP2025KG, ABP2040KG,
66 	ABP2060KG, ABP2100KG, ABP2160KG, ABP2250KG, ABP2400KG, ABP2600KG,
67 	ABP2800KG, ABP2250LD, ABP2600LD, ABP2600LG, ABP22_5MD, ABP2006MD,
68 	ABP2010MD, ABP2016MD, ABP2025MD, ABP2040MD, ABP2060MD, ABP2100MD,
69 	ABP2160MD, ABP2250MD, ABP2400MD, ABP2600MD, ABP2006MG, ABP2010MG,
70 	ABP2016MG, ABP2025MG, ABP2040MG, ABP2060MG, ABP2100MG, ABP2160MG,
71 	ABP2250MG, ABP2400MG, ABP2600MG, ABP2001ND, ABP2002ND, ABP2004ND,
72 	ABP2005ND, ABP2010ND, ABP2020ND, ABP2030ND, ABP2002NG, ABP2004NG,
73 	ABP2005NG, ABP2010NG, ABP2020NG, ABP2030NG, ABP2015PA, ABP2030PA,
74 	ABP2060PA, ABP2100PA, ABP2150PA, ABP2175PA, ABP2001PD, ABP2005PD,
75 	ABP2015PD, ABP2030PD, ABP2060PD, ABP2001PG, ABP2005PG, ABP2015PG,
76 	ABP2030PG, ABP2060PG, ABP2100PG, ABP2150PG, ABP2175PG,
77 };
78 
79 static const char * const abp2_triplet_variants[] = {
80 	[ABP2001BA] = "001BA", [ABP21_6BA] = "1.6BA", [ABP22_5BA] = "2.5BA",
81 	[ABP2004BA] = "004BA", [ABP2006BA] = "006BA", [ABP2008BA] = "008BA",
82 	[ABP2010BA] = "010BA", [ABP2012BA] = "012BA", [ABP2001BD] = "001BD",
83 	[ABP21_6BD] = "1.6BD", [ABP22_5BD] = "2.5BD", [ABP2004BD] = "004BD",
84 	[ABP2001BG] = "001BG", [ABP21_6BG] = "1.6BG", [ABP22_5BG] = "2.5BG",
85 	[ABP2004BG] = "004BG", [ABP2006BG] = "006BG", [ABP2008BG] = "008BG",
86 	[ABP2010BG] = "010BG", [ABP2012BG] = "012BG", [ABP2001GG] = "001GG",
87 	[ABP21_2GG] = "1.2GG", [ABP2100KA] = "100KA", [ABP2160KA] = "160KA",
88 	[ABP2250KA] = "250KA", [ABP2001KD] = "001KD", [ABP21_6KD] = "1.6KD",
89 	[ABP22_5KD] = "2.5KD", [ABP2004KD] = "004KD", [ABP2006KD] = "006KD",
90 	[ABP2010KD] = "010KD", [ABP2016KD] = "016KD", [ABP2025KD] = "025KD",
91 	[ABP2040KD] = "040KD", [ABP2060KD] = "060KD", [ABP2100KD] = "100KD",
92 	[ABP2160KD] = "160KD", [ABP2250KD] = "250KD", [ABP2400KD] = "400KD",
93 	[ABP2001KG] = "001KG", [ABP21_6KG] = "1.6KG", [ABP22_5KG] = "2.5KG",
94 	[ABP2004KG] = "004KG", [ABP2006KG] = "006KG", [ABP2010KG] = "010KG",
95 	[ABP2016KG] = "016KG", [ABP2025KG] = "025KG", [ABP2040KG] = "040KG",
96 	[ABP2060KG] = "060KG", [ABP2100KG] = "100KG", [ABP2160KG] = "160KG",
97 	[ABP2250KG] = "250KG", [ABP2400KG] = "400KG", [ABP2600KG] = "600KG",
98 	[ABP2800KG] = "800KG", [ABP2250LD] = "250LD", [ABP2600LD] = "600LD",
99 	[ABP2600LG] = "600LG", [ABP22_5MD] = "2.5MD", [ABP2006MD] = "006MD",
100 	[ABP2010MD] = "010MD", [ABP2016MD] = "016MD", [ABP2025MD] = "025MD",
101 	[ABP2040MD] = "040MD", [ABP2060MD] = "060MD", [ABP2100MD] = "100MD",
102 	[ABP2160MD] = "160MD", [ABP2250MD] = "250MD", [ABP2400MD] = "400MD",
103 	[ABP2600MD] = "600MD", [ABP2006MG] = "006MG", [ABP2010MG] = "010MG",
104 	[ABP2016MG] = "016MG", [ABP2025MG] = "025MG", [ABP2040MG] = "040MG",
105 	[ABP2060MG] = "060MG", [ABP2100MG] = "100MG", [ABP2160MG] = "160MG",
106 	[ABP2250MG] = "250MG", [ABP2400MG] = "400MG", [ABP2600MG] = "600MG",
107 	[ABP2001ND] = "001ND", [ABP2002ND] = "002ND", [ABP2004ND] = "004ND",
108 	[ABP2005ND] = "005ND", [ABP2010ND] = "010ND", [ABP2020ND] = "020ND",
109 	[ABP2030ND] = "030ND", [ABP2002NG] = "002NG", [ABP2004NG] = "004NG",
110 	[ABP2005NG] = "005NG", [ABP2010NG] = "010NG", [ABP2020NG] = "020NG",
111 	[ABP2030NG] = "030NG", [ABP2015PA] = "015PA", [ABP2030PA] = "030PA",
112 	[ABP2060PA] = "060PA", [ABP2100PA] = "100PA", [ABP2150PA] = "150PA",
113 	[ABP2175PA] = "175PA", [ABP2001PD] = "001PD", [ABP2005PD] = "005PD",
114 	[ABP2015PD] = "015PD", [ABP2030PD] = "030PD", [ABP2060PD] = "060PD",
115 	[ABP2001PG] = "001PG", [ABP2005PG] = "005PG", [ABP2015PG] = "015PG",
116 	[ABP2030PG] = "030PG", [ABP2060PG] = "060PG", [ABP2100PG] = "100PG",
117 	[ABP2150PG] = "150PG", [ABP2175PG] = "175PG",
118 };
119 
120 /**
121  * struct abp2_range_config - list of pressure ranges based on nomenclature
122  * @pmin: lowest pressure that can be measured
123  * @pmax: highest pressure that can be measured
124  */
125 struct abp2_range_config {
126 	s32 pmin;
127 	s32 pmax;
128 };
129 
130 /* All min max limits have been converted to pascals */
131 static const struct abp2_range_config abp2_range_config[] = {
132 	[ABP2001BA] = { .pmin =       0, .pmax =  100000 },
133 	[ABP21_6BA] = { .pmin =       0, .pmax =  160000 },
134 	[ABP22_5BA] = { .pmin =       0, .pmax =  250000 },
135 	[ABP2004BA] = { .pmin =       0, .pmax =  400000 },
136 	[ABP2006BA] = { .pmin =       0, .pmax =  600000 },
137 	[ABP2008BA] = { .pmin =       0, .pmax =  800000 },
138 	[ABP2010BA] = { .pmin =       0, .pmax = 1000000 },
139 	[ABP2012BA] = { .pmin =       0, .pmax = 1200000 },
140 	[ABP2001BD] = { .pmin = -100000, .pmax =  100000 },
141 	[ABP21_6BD] = { .pmin = -160000, .pmax =  160000 },
142 	[ABP22_5BD] = { .pmin = -250000, .pmax =  250000 },
143 	[ABP2004BD] = { .pmin = -400000, .pmax =  400000 },
144 	[ABP2001BG] = { .pmin =       0, .pmax =  100000 },
145 	[ABP21_6BG] = { .pmin =       0, .pmax =  160000 },
146 	[ABP22_5BG] = { .pmin =       0, .pmax =  250000 },
147 	[ABP2004BG] = { .pmin =       0, .pmax =  400000 },
148 	[ABP2006BG] = { .pmin =       0, .pmax =  600000 },
149 	[ABP2008BG] = { .pmin =       0, .pmax =  800000 },
150 	[ABP2010BG] = { .pmin =       0, .pmax = 1000000 },
151 	[ABP2012BG] = { .pmin =       0, .pmax = 1200000 },
152 	[ABP2001GG] = { .pmin =       0, .pmax = 1000000 },
153 	[ABP21_2GG] = { .pmin =       0, .pmax = 1200000 },
154 	[ABP2100KA] = { .pmin =       0, .pmax =  100000 },
155 	[ABP2160KA] = { .pmin =       0, .pmax =  160000 },
156 	[ABP2250KA] = { .pmin =       0, .pmax =  250000 },
157 	[ABP2001KD] = { .pmin =   -1000, .pmax =    1000 },
158 	[ABP21_6KD] = { .pmin =   -1600, .pmax =    1600 },
159 	[ABP22_5KD] = { .pmin =   -2500, .pmax =    2500 },
160 	[ABP2004KD] = { .pmin =   -4000, .pmax =    4000 },
161 	[ABP2006KD] = { .pmin =   -6000, .pmax =    6000 },
162 	[ABP2010KD] = { .pmin =  -10000, .pmax =   10000 },
163 	[ABP2016KD] = { .pmin =  -16000, .pmax =   16000 },
164 	[ABP2025KD] = { .pmin =  -25000, .pmax =   25000 },
165 	[ABP2040KD] = { .pmin =  -40000, .pmax =   40000 },
166 	[ABP2060KD] = { .pmin =  -60000, .pmax =   60000 },
167 	[ABP2100KD] = { .pmin = -100000, .pmax =  100000 },
168 	[ABP2160KD] = { .pmin = -160000, .pmax =  160000 },
169 	[ABP2250KD] = { .pmin = -250000, .pmax =  250000 },
170 	[ABP2400KD] = { .pmin = -400000, .pmax =  400000 },
171 	[ABP2001KG] = { .pmin =       0, .pmax =    1000 },
172 	[ABP21_6KG] = { .pmin =       0, .pmax =    1600 },
173 	[ABP22_5KG] = { .pmin =       0, .pmax =    2500 },
174 	[ABP2004KG] = { .pmin =       0, .pmax =    4000 },
175 	[ABP2006KG] = { .pmin =       0, .pmax =    6000 },
176 	[ABP2010KG] = { .pmin =       0, .pmax =   10000 },
177 	[ABP2016KG] = { .pmin =       0, .pmax =   16000 },
178 	[ABP2025KG] = { .pmin =       0, .pmax =   25000 },
179 	[ABP2040KG] = { .pmin =       0, .pmax =   40000 },
180 	[ABP2060KG] = { .pmin =       0, .pmax =   60000 },
181 	[ABP2100KG] = { .pmin =       0, .pmax =  100000 },
182 	[ABP2160KG] = { .pmin =       0, .pmax =  160000 },
183 	[ABP2250KG] = { .pmin =       0, .pmax =  250000 },
184 	[ABP2400KG] = { .pmin =       0, .pmax =  400000 },
185 	[ABP2600KG] = { .pmin =       0, .pmax =  600000 },
186 	[ABP2800KG] = { .pmin =       0, .pmax =  800000 },
187 	[ABP2250LD] = { .pmin =    -250, .pmax =     250 },
188 	[ABP2600LD] = { .pmin =    -600, .pmax =     600 },
189 	[ABP2600LG] = { .pmin =       0, .pmax =     600 },
190 	[ABP22_5MD] = { .pmin =    -250, .pmax =     250 },
191 	[ABP2006MD] = { .pmin =    -600, .pmax =     600 },
192 	[ABP2010MD] = { .pmin =   -1000, .pmax =    1000 },
193 	[ABP2016MD] = { .pmin =   -1600, .pmax =    1600 },
194 	[ABP2025MD] = { .pmin =   -2500, .pmax =    2500 },
195 	[ABP2040MD] = { .pmin =   -4000, .pmax =    4000 },
196 	[ABP2060MD] = { .pmin =   -6000, .pmax =    6000 },
197 	[ABP2100MD] = { .pmin =  -10000, .pmax =   10000 },
198 	[ABP2160MD] = { .pmin =  -16000, .pmax =   16000 },
199 	[ABP2250MD] = { .pmin =  -25000, .pmax =   25000 },
200 	[ABP2400MD] = { .pmin =  -40000, .pmax =   40000 },
201 	[ABP2600MD] = { .pmin =  -60000, .pmax =   60000 },
202 	[ABP2006MG] = { .pmin =       0, .pmax =     600 },
203 	[ABP2010MG] = { .pmin =       0, .pmax =    1000 },
204 	[ABP2016MG] = { .pmin =       0, .pmax =    1600 },
205 	[ABP2025MG] = { .pmin =       0, .pmax =    2500 },
206 	[ABP2040MG] = { .pmin =       0, .pmax =    4000 },
207 	[ABP2060MG] = { .pmin =       0, .pmax =    6000 },
208 	[ABP2100MG] = { .pmin =       0, .pmax =   10000 },
209 	[ABP2160MG] = { .pmin =       0, .pmax =   16000 },
210 	[ABP2250MG] = { .pmin =       0, .pmax =   25000 },
211 	[ABP2400MG] = { .pmin =       0, .pmax =   40000 },
212 	[ABP2600MG] = { .pmin =       0, .pmax =   60000 },
213 	[ABP2001ND] = { .pmin =    -249, .pmax =     249 },
214 	[ABP2002ND] = { .pmin =    -498, .pmax =     498 },
215 	[ABP2004ND] = { .pmin =    -996, .pmax =     996 },
216 	[ABP2005ND] = { .pmin =   -1245, .pmax =    1245 },
217 	[ABP2010ND] = { .pmin =   -2491, .pmax =    2491 },
218 	[ABP2020ND] = { .pmin =   -4982, .pmax =    4982 },
219 	[ABP2030ND] = { .pmin =   -7473, .pmax =    7473 },
220 	[ABP2002NG] = { .pmin =       0, .pmax =     498 },
221 	[ABP2004NG] = { .pmin =       0, .pmax =     996 },
222 	[ABP2005NG] = { .pmin =       0, .pmax =    1245 },
223 	[ABP2010NG] = { .pmin =       0, .pmax =    2491 },
224 	[ABP2020NG] = { .pmin =       0, .pmax =    4982 },
225 	[ABP2030NG] = { .pmin =       0, .pmax =    7473 },
226 	[ABP2015PA] = { .pmin =       0, .pmax =  103421 },
227 	[ABP2030PA] = { .pmin =       0, .pmax =  206843 },
228 	[ABP2060PA] = { .pmin =       0, .pmax =  413685 },
229 	[ABP2100PA] = { .pmin =       0, .pmax =  689476 },
230 	[ABP2150PA] = { .pmin =       0, .pmax = 1034214 },
231 	[ABP2175PA] = { .pmin =       0, .pmax = 1206583 },
232 	[ABP2001PD] = { .pmin =   -6895, .pmax =    6895 },
233 	[ABP2005PD] = { .pmin =  -34474, .pmax =   34474 },
234 	[ABP2015PD] = { .pmin = -103421, .pmax =  103421 },
235 	[ABP2030PD] = { .pmin = -206843, .pmax =  206843 },
236 	[ABP2060PD] = { .pmin = -413685, .pmax =  413685 },
237 	[ABP2001PG] = { .pmin =       0, .pmax =    6895 },
238 	[ABP2005PG] = { .pmin =       0, .pmax =   34474 },
239 	[ABP2015PG] = { .pmin =       0, .pmax =  103421 },
240 	[ABP2030PG] = { .pmin =       0, .pmax =  206843 },
241 	[ABP2060PG] = { .pmin =       0, .pmax =  413685 },
242 	[ABP2100PG] = { .pmin =       0, .pmax =  689476 },
243 	[ABP2150PG] = { .pmin =       0, .pmax = 1034214 },
244 	[ABP2175PG] = { .pmin =       0, .pmax = 1206583 },
245 };
246 
247 static_assert(ARRAY_SIZE(abp2_triplet_variants) == ARRAY_SIZE(abp2_range_config));
248 
249 static int abp2_get_measurement(struct abp2_data *data)
250 {
251 	struct device *dev = data->dev;
252 	int ret;
253 
254 	reinit_completion(&data->completion);
255 
256 	ret = data->ops->write(data, ABP2_CMD_SYNC, ABP2_PKT_SYNC_LEN);
257 	if (ret < 0)
258 		return ret;
259 
260 	if (data->irq > 0) {
261 		ret = wait_for_completion_timeout(&data->completion, HZ);
262 		if (!ret) {
263 			dev_err(dev, "timeout waiting for EOC interrupt\n");
264 			return -ETIMEDOUT;
265 		}
266 	} else {
267 		fsleep(5 * USEC_PER_MSEC);
268 	}
269 
270 	memset(data->rx_buf, 0, sizeof(data->rx_buf));
271 	ret = data->ops->read(data, ABP2_CMD_NOP, ABP2_PKT_NOP_LEN);
272 	if (ret < 0)
273 		return ret;
274 
275 	/*
276 	 * Status byte flags
277 	 *  bit7 SANITY_CHK     - must always be 0
278 	 *  bit6 ABP2_ST_POWER  - 1 if device is powered
279 	 *  bit5 ABP2_ST_BUSY   - 1 if device has no new conversion ready
280 	 *  bit4 SANITY_CHK     - must always be 0
281 	 *  bit3 SANITY_CHK     - must always be 0
282 	 *  bit2 MEMORY_ERR     - 1 if integrity test has failed
283 	 *  bit1 SANITY_CHK     - must always be 0
284 	 *  bit0 MATH_ERR       - 1 during internal math saturation error
285 	 */
286 
287 	if (data->rx_buf[0] == (ABP2_ST_POWER | ABP2_ST_BUSY))
288 		return -EBUSY;
289 
290 	/*
291 	 * The ABP2 sensor series seem to have a noticeable latch-up sensitivity.
292 	 * A partial latch-up condition manifests as either
293 	 *   - output of invalid status bytes
294 	 *   - zeroed out conversions (despite a normal status byte)
295 	 *   - the MOSI line being pulled low randomly in sync with the SCLK
296 	 * signal (visible during the ABP2_CMD_NOP command).
297 	 * https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1588325/am3358-spi-tx-data-corruption
298 	 */
299 
300 	if (data->rx_buf[0] != ABP2_ST_POWER) {
301 		dev_err(data->dev,
302 			"unexpected status byte 0x%02x\n", data->rx_buf[0]);
303 		return -EIO;
304 	}
305 
306 	return 0;
307 }
308 
309 static irqreturn_t abp2_eoc_handler(int irq, void *private)
310 {
311 	struct abp2_data *data = private;
312 
313 	complete(&data->completion);
314 
315 	return IRQ_HANDLED;
316 }
317 
318 static irqreturn_t abp2_trigger_handler(int irq, void *private)
319 {
320 	int ret;
321 	struct iio_poll_func *pf = private;
322 	struct iio_dev *indio_dev = pf->indio_dev;
323 	struct abp2_data *data = iio_priv(indio_dev);
324 
325 	ret = abp2_get_measurement(data);
326 	if (ret < 0)
327 		goto out_notify_done;
328 
329 	data->scan.chan[0] = get_unaligned_be24(&data->rx_buf[1]);
330 	data->scan.chan[1] = get_unaligned_be24(&data->rx_buf[4]);
331 
332 	iio_push_to_buffers_with_ts(indio_dev, &data->scan, sizeof(data->scan),
333 				    iio_get_time_ns(indio_dev));
334 
335 out_notify_done:
336 	iio_trigger_notify_done(indio_dev->trig);
337 
338 	return IRQ_HANDLED;
339 }
340 
341 /*
342  * IIO ABI expects
343  * value = (conv + offset) * scale
344  *
345  * temp[C] = conv * a + b
346  *   where a = 200/16777215; b = -50
347  *
348  *  temp[C] = (conv + (b/a)) * a * (1000)
349  *  =>
350  *  scale = a * 1000 = .0000119209296 * 1000 = .01192092966562
351  *  offset = b/a = -50 * 16777215 / 200 = -4194303.75
352  *
353  *  pressure = (conv - Omin) * Q + Pmin =
354  *          ((conv - Omin) + Pmin/Q) * Q
355  *  =>
356  *  scale = Q = (Pmax - Pmin) / (Omax - Omin)
357  *  offset = Pmin/Q - Omin = Pmin * (Omax - Omin) / (Pmax - Pmin) - Omin
358  */
359 static int abp2_read_raw(struct iio_dev *indio_dev,
360 			 struct iio_chan_spec const *channel, int *val,
361 			 int *val2, long mask)
362 {
363 	struct abp2_data *data = iio_priv(indio_dev);
364 	int ret;
365 
366 	switch (mask) {
367 	case IIO_CHAN_INFO_RAW:
368 		ret = abp2_get_measurement(data);
369 		if (ret < 0)
370 			return ret;
371 
372 		switch (channel->type) {
373 		case IIO_PRESSURE:
374 			*val = get_unaligned_be24(&data->rx_buf[1]);
375 			return IIO_VAL_INT;
376 		case IIO_TEMP:
377 			*val = get_unaligned_be24(&data->rx_buf[4]);
378 			return IIO_VAL_INT;
379 		default:
380 			return -EINVAL;
381 		}
382 		return IIO_VAL_INT;
383 
384 	case IIO_CHAN_INFO_SCALE:
385 		switch (channel->type) {
386 		case IIO_TEMP:
387 			*val = 0;
388 			*val2 = 11920929;
389 			return IIO_VAL_INT_PLUS_NANO;
390 		case IIO_PRESSURE:
391 			*val = data->p_scale;
392 			*val2 = data->p_scale_dec;
393 			return IIO_VAL_INT_PLUS_NANO;
394 		default:
395 			return -EINVAL;
396 		}
397 
398 	case IIO_CHAN_INFO_OFFSET:
399 		switch (channel->type) {
400 		case IIO_TEMP:
401 			*val = -4194304;
402 			return IIO_VAL_INT;
403 		case IIO_PRESSURE:
404 			*val = data->p_offset;
405 			return IIO_VAL_INT;
406 		default:
407 			return -EINVAL;
408 		}
409 
410 	default:
411 		return -EINVAL;
412 	}
413 }
414 
415 static const struct iio_info abp2_info = {
416 	.read_raw = &abp2_read_raw,
417 };
418 
419 static const unsigned long abp2_scan_masks[] = {0x3, 0};
420 
421 static const struct iio_chan_spec abp2_channels[] = {
422 	{
423 		.type = IIO_PRESSURE,
424 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
425 					BIT(IIO_CHAN_INFO_SCALE) |
426 					BIT(IIO_CHAN_INFO_OFFSET),
427 		.scan_index = 0,
428 		.scan_type = {
429 			.sign = 'u',
430 			.realbits = 24,
431 			.storagebits = 32,
432 			.endianness = IIO_CPU,
433 		},
434 	},
435 	{
436 		.type = IIO_TEMP,
437 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
438 				      BIT(IIO_CHAN_INFO_SCALE) |
439 				      BIT(IIO_CHAN_INFO_OFFSET),
440 		.scan_index = 1,
441 		.scan_type = {
442 			.sign = 'u',
443 			.realbits = 24,
444 			.storagebits = 32,
445 			.endianness = IIO_CPU,
446 		},
447 	},
448 	IIO_CHAN_SOFT_TIMESTAMP(2),
449 };
450 
451 int abp2_common_probe(struct device *dev, const struct abp2_ops *ops, int irq)
452 {
453 	int ret;
454 	struct abp2_data *data;
455 	struct iio_dev *indio_dev;
456 	const char *triplet;
457 	s32 tmp;
458 	s64 odelta, pdelta;
459 
460 	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
461 	if (!indio_dev)
462 		return -ENOMEM;
463 
464 	data = iio_priv(indio_dev);
465 	data->dev = dev;
466 	data->ops = ops;
467 	data->irq = irq;
468 
469 	init_completion(&data->completion);
470 
471 	indio_dev->name = "abp2030pa";
472 	indio_dev->info = &abp2_info;
473 	indio_dev->channels = abp2_channels;
474 	indio_dev->num_channels = ARRAY_SIZE(abp2_channels);
475 	indio_dev->modes = INDIO_DIRECT_MODE;
476 	indio_dev->available_scan_masks = abp2_scan_masks;
477 
478 	ret = devm_regulator_get_enable(dev, "vdd");
479 	if (ret)
480 		return dev_err_probe(dev, ret, "can't get and enable vdd supply\n");
481 
482 	ret = device_property_read_string(dev, "honeywell,pressure-triplet",
483 					  &triplet);
484 	if (ret) {
485 		ret = device_property_read_u32(dev, "honeywell,pmin-pascal",
486 					       &data->pmin);
487 		if (ret)
488 			return dev_err_probe(dev, ret,
489 					     "honeywell,pmin-pascal could not be read\n");
490 
491 		ret = device_property_read_u32(dev, "honeywell,pmax-pascal",
492 					       &data->pmax);
493 		if (ret)
494 			return dev_err_probe(dev, ret,
495 					     "honeywell,pmax-pascal could not be read\n");
496 	} else {
497 		ret = device_property_match_property_string(dev,
498 							    "honeywell,pressure-triplet",
499 							    abp2_triplet_variants,
500 							    ARRAY_SIZE(abp2_triplet_variants));
501 		if (ret < 0)
502 			return dev_err_probe(dev, -EINVAL, "honeywell,pressure-triplet is invalid\n");
503 
504 		data->pmin = abp2_range_config[ret].pmin;
505 		data->pmax = abp2_range_config[ret].pmax;
506 	}
507 
508 	if (data->pmin >= data->pmax)
509 		return dev_err_probe(dev, -EINVAL, "pressure limits are invalid\n");
510 
511 	data->outmin = abp2_func_spec[data->function].output_min;
512 	data->outmax = abp2_func_spec[data->function].output_max;
513 
514 	odelta = data->outmax - data->outmin;
515 	pdelta = data->pmax - data->pmin;
516 
517 	data->p_scale = div_s64_rem(div_s64(pdelta * NANO, odelta), NANO, &tmp);
518 	data->p_scale_dec = tmp;
519 
520 	data->p_offset = div_s64(odelta * data->pmin, pdelta) - data->outmin;
521 
522 	if (data->irq > 0) {
523 		ret = devm_request_irq(dev, irq, abp2_eoc_handler, IRQF_ONESHOT,
524 				       dev_name(dev), data);
525 		if (ret)
526 			return ret;
527 	}
528 
529 	ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
530 					      abp2_trigger_handler, NULL);
531 	if (ret)
532 		return dev_err_probe(dev, ret, "iio triggered buffer setup failed\n");
533 
534 	ret = devm_iio_device_register(dev, indio_dev);
535 	if (ret)
536 		return dev_err_probe(dev, ret, "unable to register iio device\n");
537 
538 	return 0;
539 }
540 EXPORT_SYMBOL_NS_GPL(abp2_common_probe, "IIO_HONEYWELL_ABP2030PA");
541 
542 MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>");
543 MODULE_DESCRIPTION("Honeywell ABP2 pressure sensor core driver");
544 MODULE_LICENSE("GPL");
545