1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright 2021 Google LLC. |
4 | * |
5 | * Code shared between most Semtech SAR sensor driver. |
6 | */ |
7 | |
8 | #ifndef IIO_SX_COMMON_H |
9 | #define IIO_SX_COMMON_H |
10 | |
11 | #include <linux/acpi.h> |
12 | #include <linux/iio/iio.h> |
13 | #include <linux/iio/types.h> |
14 | #include <linux/regulator/consumer.h> |
15 | #include <linux/types.h> |
16 | |
17 | struct device; |
18 | struct i2c_client; |
19 | struct regmap_config; |
20 | struct sx_common_data; |
21 | |
22 | #define SX_COMMON_REG_IRQ_SRC 0x00 |
23 | |
24 | #define SX_COMMON_MAX_NUM_CHANNELS 4 |
25 | static_assert(SX_COMMON_MAX_NUM_CHANNELS < BITS_PER_LONG); |
26 | |
27 | struct sx_common_reg_default { |
28 | u8 reg; |
29 | u8 def; |
30 | const char *property; |
31 | }; |
32 | |
33 | /** |
34 | * struct sx_common_ops: function pointers needed by common code |
35 | * |
36 | * List functions needed by common code to gather information or configure |
37 | * the sensor. |
38 | * |
39 | * @read_prox_data: Function to read raw proximity data. |
40 | * @check_whoami: Set device name based on whoami register. |
41 | * @init_compensation: Function to set initial compensation. |
42 | * @wait_for_sample: When there are no physical IRQ, function to wait for a |
43 | * sample to be ready. |
44 | * @get_default_reg: Populate the initial value for a given register. |
45 | */ |
46 | struct sx_common_ops { |
47 | int (*read_prox_data)(struct sx_common_data *data, |
48 | const struct iio_chan_spec *chan, __be16 *val); |
49 | int (*check_whoami)(struct device *dev, struct iio_dev *indio_dev); |
50 | int (*init_compensation)(struct iio_dev *indio_dev); |
51 | int (*wait_for_sample)(struct sx_common_data *data); |
52 | const struct sx_common_reg_default * |
53 | (*get_default_reg)(struct device *dev, int idx, |
54 | struct sx_common_reg_default *reg_def); |
55 | }; |
56 | |
57 | /** |
58 | * struct sx_common_chip_info: Semtech Sensor private chip information |
59 | * |
60 | * @reg_stat: Main status register address. |
61 | * @reg_irq_msk: IRQ mask register address. |
62 | * @reg_enable_chan: Address to enable/disable channels. |
63 | * Each phase presented by the sensor is an IIO channel.. |
64 | * @reg_reset: Reset register address. |
65 | * @mask_enable_chan: Mask over the channels bits in the enable channel |
66 | * register. |
67 | * @stat_offset: Offset to check phase status. |
68 | * @irq_msk_offset: Offset to enable interrupt in the IRQ mask |
69 | * register. |
70 | * @num_channels: Number of channels. |
71 | * @num_default_regs: Number of internal registers that can be configured. |
72 | * |
73 | * @ops: Private functions pointers. |
74 | * @iio_channels: Description of exposed iio channels. |
75 | * @num_iio_channels: Number of iio_channels. |
76 | * @iio_info: iio_info structure for this driver. |
77 | */ |
78 | struct sx_common_chip_info { |
79 | unsigned int reg_stat; |
80 | unsigned int reg_irq_msk; |
81 | unsigned int reg_enable_chan; |
82 | unsigned int reg_reset; |
83 | |
84 | unsigned int mask_enable_chan; |
85 | unsigned int stat_offset; |
86 | unsigned int irq_msk_offset; |
87 | unsigned int num_channels; |
88 | int num_default_regs; |
89 | |
90 | struct sx_common_ops ops; |
91 | |
92 | const struct iio_chan_spec *iio_channels; |
93 | int num_iio_channels; |
94 | struct iio_info iio_info; |
95 | }; |
96 | |
97 | /** |
98 | * struct sx_common_data: Semtech Sensor private data structure. |
99 | * |
100 | * @chip_info: Structure defining sensor internals. |
101 | * @mutex: Serialize access to registers and channel configuration. |
102 | * @completion: completion object to wait for data acquisition. |
103 | * @client: I2C client structure. |
104 | * @trig: IIO trigger object. |
105 | * @regmap: Register map. |
106 | * @chan_prox_stat: Last reading of the proximity status for each channel. |
107 | * We only send an event to user space when this changes. |
108 | * @trigger_enabled: True when the device trigger is enabled. |
109 | * @buffer: Buffer to store raw samples. |
110 | * @suspend_ctrl: Remember enabled channels and sample rate during suspend. |
111 | * @chan_read: Bit field for each raw channel enabled. |
112 | * @chan_event: Bit field for each event enabled. |
113 | */ |
114 | struct sx_common_data { |
115 | const struct sx_common_chip_info *chip_info; |
116 | |
117 | struct mutex mutex; |
118 | struct completion completion; |
119 | struct i2c_client *client; |
120 | struct iio_trigger *trig; |
121 | struct regmap *regmap; |
122 | |
123 | unsigned long chan_prox_stat; |
124 | bool trigger_enabled; |
125 | |
126 | /* Ensure correct alignment of timestamp when present. */ |
127 | struct { |
128 | __be16 channels[SX_COMMON_MAX_NUM_CHANNELS]; |
129 | s64 ts __aligned(8); |
130 | } buffer; |
131 | |
132 | unsigned int suspend_ctrl; |
133 | unsigned long chan_read; |
134 | unsigned long chan_event; |
135 | }; |
136 | |
137 | int sx_common_read_proximity(struct sx_common_data *data, |
138 | const struct iio_chan_spec *chan, int *val); |
139 | |
140 | int sx_common_read_event_config(struct iio_dev *indio_dev, |
141 | const struct iio_chan_spec *chan, |
142 | enum iio_event_type type, |
143 | enum iio_event_direction dir); |
144 | int sx_common_write_event_config(struct iio_dev *indio_dev, |
145 | const struct iio_chan_spec *chan, |
146 | enum iio_event_type type, |
147 | enum iio_event_direction dir, int state); |
148 | |
149 | int sx_common_probe(struct i2c_client *client, |
150 | const struct sx_common_chip_info *chip_info, |
151 | const struct regmap_config *regmap_config); |
152 | |
153 | void sx_common_get_raw_register_config(struct device *dev, |
154 | struct sx_common_reg_default *reg_def); |
155 | |
156 | /* 3 is the number of events defined by a single phase. */ |
157 | extern const struct iio_event_spec sx_common_events[3]; |
158 | |
159 | #endif /* IIO_SX_COMMON_H */ |
160 | |