1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Honeywell TruStability HSC Series pressure/temperature sensor |
4 | * |
5 | * Copyright (c) 2023 Petre Rodan <petre.rodan@subdimension.ro> |
6 | */ |
7 | |
8 | #ifndef _HSC030PA_H |
9 | #define _HSC030PA_H |
10 | |
11 | #include <linux/types.h> |
12 | |
13 | #include <linux/iio/iio.h> |
14 | |
15 | #define HSC_REG_MEASUREMENT_RD_SIZE 4 |
16 | #define HSC_RESP_TIME_MS 2 |
17 | |
18 | struct device; |
19 | |
20 | struct iio_chan_spec; |
21 | struct iio_dev; |
22 | |
23 | struct hsc_data; |
24 | struct hsc_chip_data; |
25 | |
26 | typedef int (*hsc_recv_fn)(struct hsc_data *); |
27 | |
28 | /** |
29 | * struct hsc_data |
30 | * @dev: current device structure |
31 | * @chip: structure containing chip's channel properties |
32 | * @recv_cb: function that implements the chip reads |
33 | * @is_valid: true if last transfer has been validated |
34 | * @pmin: minimum measurable pressure limit |
35 | * @pmax: maximum measurable pressure limit |
36 | * @outmin: minimum raw pressure in counts (based on transfer function) |
37 | * @outmax: maximum raw pressure in counts (based on transfer function) |
38 | * @function: transfer function |
39 | * @p_scale: pressure scale |
40 | * @p_scale_dec: pressure scale, decimal places |
41 | * @p_offset: pressure offset |
42 | * @p_offset_dec: pressure offset, decimal places |
43 | * @buffer: raw conversion data |
44 | */ |
45 | struct hsc_data { |
46 | struct device *dev; |
47 | const struct hsc_chip_data *chip; |
48 | hsc_recv_fn recv_cb; |
49 | bool is_valid; |
50 | s32 pmin; |
51 | s32 pmax; |
52 | u32 outmin; |
53 | u32 outmax; |
54 | u32 function; |
55 | s64 p_scale; |
56 | s32 p_scale_dec; |
57 | s64 p_offset; |
58 | s32 p_offset_dec; |
59 | struct { |
60 | __be16 chan[2]; |
61 | s64 timestamp __aligned(8); |
62 | } scan; |
63 | u8 buffer[HSC_REG_MEASUREMENT_RD_SIZE] __aligned(IIO_DMA_MINALIGN); |
64 | }; |
65 | |
66 | struct hsc_chip_data { |
67 | bool (*valid)(struct hsc_data *data); |
68 | const struct iio_chan_spec *channels; |
69 | u8 num_channels; |
70 | }; |
71 | |
72 | enum hsc_func_id { |
73 | HSC_FUNCTION_A, |
74 | HSC_FUNCTION_B, |
75 | HSC_FUNCTION_C, |
76 | HSC_FUNCTION_F, |
77 | }; |
78 | |
79 | int hsc_common_probe(struct device *dev, hsc_recv_fn recv); |
80 | |
81 | #endif |
82 | |