xref: /openbmc/linux/drivers/iio/proximity/sx9310.c (revision e8ffca61)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright 2018 Google LLC.
4  *
5  * Driver for Semtech's SX9310/SX9311 capacitive proximity/button solution.
6  * Based on SX9500 driver and Semtech driver using the input framework
7  * <https://my.syncplicity.com/share/teouwsim8niiaud/
8  *          linux-driver-SX9310_NoSmartHSensing>.
9  * Reworked in April 2019 by Evan Green <evgreen@chromium.org>
10  * and in January 2020 by Daniel Campello <campello@chromium.org>.
11  */
12 
13 #include <linux/acpi.h>
14 #include <linux/bitfield.h>
15 #include <linux/delay.h>
16 #include <linux/i2c.h>
17 #include <linux/irq.h>
18 #include <linux/kernel.h>
19 #include <linux/log2.h>
20 #include <linux/mod_devicetable.h>
21 #include <linux/module.h>
22 #include <linux/pm.h>
23 #include <linux/property.h>
24 #include <linux/regmap.h>
25 #include <linux/regulator/consumer.h>
26 #include <linux/slab.h>
27 
28 #include <linux/iio/buffer.h>
29 #include <linux/iio/events.h>
30 #include <linux/iio/iio.h>
31 #include <linux/iio/sysfs.h>
32 #include <linux/iio/trigger.h>
33 #include <linux/iio/triggered_buffer.h>
34 #include <linux/iio/trigger_consumer.h>
35 
36 /* Register definitions. */
37 #define SX9310_REG_IRQ_SRC				0x00
38 #define SX9310_REG_STAT0				0x01
39 #define SX9310_REG_STAT1				0x02
40 #define SX9310_REG_STAT1_COMPSTAT_MASK			GENMASK(3, 0)
41 #define SX9310_REG_IRQ_MSK				0x03
42 #define   SX9310_CONVDONE_IRQ				BIT(3)
43 #define   SX9310_FAR_IRQ				BIT(5)
44 #define   SX9310_CLOSE_IRQ				BIT(6)
45 #define SX9310_REG_IRQ_FUNC				0x04
46 
47 #define SX9310_REG_PROX_CTRL0				0x10
48 #define   SX9310_REG_PROX_CTRL0_SENSOREN_MASK		GENMASK(3, 0)
49 #define   SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK		GENMASK(7, 4)
50 #define   SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS		0x01
51 #define SX9310_REG_PROX_CTRL1				0x11
52 #define SX9310_REG_PROX_CTRL2				0x12
53 #define   SX9310_REG_PROX_CTRL2_COMBMODE_MASK		GENMASK(7, 6)
54 #define   SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3 (0x03 << 6)
55 #define   SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2	(0x02 << 6)
56 #define   SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1	(0x01 << 6)
57 #define   SX9310_REG_PROX_CTRL2_COMBMODE_CS3		(0x00 << 6)
58 #define   SX9310_REG_PROX_CTRL2_SHIELDEN_MASK		GENMASK(3, 2)
59 #define   SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC	(0x01 << 2)
60 #define   SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND		(0x02 << 2)
61 #define SX9310_REG_PROX_CTRL3				0x13
62 #define   SX9310_REG_PROX_CTRL3_GAIN0_MASK		GENMASK(3, 2)
63 #define   SX9310_REG_PROX_CTRL3_GAIN0_X8		(0x03 << 2)
64 #define   SX9310_REG_PROX_CTRL3_GAIN12_MASK		GENMASK(1, 0)
65 #define   SX9310_REG_PROX_CTRL3_GAIN12_X4		0x02
66 #define SX9310_REG_PROX_CTRL4				0x14
67 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_MASK		GENMASK(2, 0)
68 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST	0x07
69 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_FINE	0x06
70 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_FINE		0x05
71 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM	0x04
72 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM_COARSE 0x03
73 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_COARSE	0x02
74 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_COARSE	0x01
75 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_COARSEST	0x00
76 #define SX9310_REG_PROX_CTRL5				0x15
77 #define   SX9310_REG_PROX_CTRL5_RANGE_SMALL		(0x03 << 6)
78 #define   SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK	GENMASK(3, 2)
79 #define   SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1		(0x01 << 2)
80 #define   SX9310_REG_PROX_CTRL5_RAWFILT_MASK		GENMASK(1, 0)
81 #define   SX9310_REG_PROX_CTRL5_RAWFILT_SHIFT		0
82 #define   SX9310_REG_PROX_CTRL5_RAWFILT_1P25		0x02
83 #define SX9310_REG_PROX_CTRL6				0x16
84 #define   SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT	0x20
85 #define SX9310_REG_PROX_CTRL7				0x17
86 #define   SX9310_REG_PROX_CTRL7_AVGNEGFILT_2		(0x01 << 3)
87 #define   SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK		GENMASK(2, 0)
88 #define   SX9310_REG_PROX_CTRL7_AVGPOSFILT_SHIFT	0
89 #define   SX9310_REG_PROX_CTRL7_AVGPOSFILT_512		0x05
90 #define SX9310_REG_PROX_CTRL8				0x18
91 #define   SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK		GENMASK(7, 3)
92 #define SX9310_REG_PROX_CTRL9				0x19
93 #define   SX9310_REG_PROX_CTRL8_9_PTHRESH_28		(0x08 << 3)
94 #define   SX9310_REG_PROX_CTRL8_9_PTHRESH_96		(0x11 << 3)
95 #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900	0x03
96 #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500	0x05
97 #define SX9310_REG_PROX_CTRL10				0x1a
98 #define   SX9310_REG_PROX_CTRL10_HYST_MASK		GENMASK(5, 4)
99 #define   SX9310_REG_PROX_CTRL10_HYST_6PCT		(0x01 << 4)
100 #define   SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK	GENMASK(3, 2)
101 #define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK	GENMASK(1, 0)
102 #define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2		0x01
103 #define SX9310_REG_PROX_CTRL11				0x1b
104 #define SX9310_REG_PROX_CTRL12				0x1c
105 #define SX9310_REG_PROX_CTRL13				0x1d
106 #define SX9310_REG_PROX_CTRL14				0x1e
107 #define SX9310_REG_PROX_CTRL15				0x1f
108 #define SX9310_REG_PROX_CTRL16				0x20
109 #define SX9310_REG_PROX_CTRL17				0x21
110 #define SX9310_REG_PROX_CTRL18				0x22
111 #define SX9310_REG_PROX_CTRL19				0x23
112 #define SX9310_REG_SAR_CTRL0				0x2a
113 #define   SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES		(0x02 << 5)
114 #define   SX9310_REG_SAR_CTRL0_SARHYST_8		(0x02 << 3)
115 #define SX9310_REG_SAR_CTRL1				0x2b
116 /* Each increment of the slope register is 0.0078125. */
117 #define   SX9310_REG_SAR_CTRL1_SLOPE(_hnslope)		(_hnslope / 78125)
118 #define SX9310_REG_SAR_CTRL2				0x2c
119 #define   SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT	0x3c
120 
121 #define SX9310_REG_SENSOR_SEL				0x30
122 #define SX9310_REG_USE_MSB				0x31
123 #define SX9310_REG_USE_LSB				0x32
124 #define SX9310_REG_AVG_MSB				0x33
125 #define SX9310_REG_AVG_LSB				0x34
126 #define SX9310_REG_DIFF_MSB				0x35
127 #define SX9310_REG_DIFF_LSB				0x36
128 #define SX9310_REG_OFFSET_MSB				0x37
129 #define SX9310_REG_OFFSET_LSB				0x38
130 #define SX9310_REG_SAR_MSB				0x39
131 #define SX9310_REG_SAR_LSB				0x3a
132 #define SX9310_REG_I2C_ADDR				0x40
133 #define SX9310_REG_PAUSE				0x41
134 #define SX9310_REG_WHOAMI				0x42
135 #define   SX9310_WHOAMI_VALUE				0x01
136 #define   SX9311_WHOAMI_VALUE				0x02
137 #define SX9310_REG_RESET				0x7f
138 #define   SX9310_SOFT_RESET				0xde
139 
140 
141 /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
142 #define SX9310_NUM_CHANNELS				4
143 static_assert(SX9310_NUM_CHANNELS < BITS_PER_LONG);
144 
145 struct sx9310_data {
146 	/* Serialize access to registers and channel configuration */
147 	struct mutex mutex;
148 	struct i2c_client *client;
149 	struct iio_trigger *trig;
150 	struct regmap *regmap;
151 	struct regulator_bulk_data supplies[2];
152 	/*
153 	 * Last reading of the proximity status for each channel.
154 	 * We only send an event to user space when this changes.
155 	 */
156 	unsigned long chan_prox_stat;
157 	bool trigger_enabled;
158 	/* Ensure correct alignment of timestamp when present. */
159 	struct {
160 		__be16 channels[SX9310_NUM_CHANNELS];
161 		s64 ts __aligned(8);
162 	} buffer;
163 	/* Remember enabled channels and sample rate during suspend. */
164 	unsigned int suspend_ctrl0;
165 	struct completion completion;
166 	unsigned long chan_read;
167 	unsigned long chan_event;
168 	unsigned int whoami;
169 };
170 
171 static const struct iio_event_spec sx9310_events[] = {
172 	{
173 		.type = IIO_EV_TYPE_THRESH,
174 		.dir = IIO_EV_DIR_RISING,
175 		.mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD),
176 	},
177 	{
178 		.type = IIO_EV_TYPE_THRESH,
179 		.dir = IIO_EV_DIR_FALLING,
180 		.mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD),
181 	},
182 	{
183 		.type = IIO_EV_TYPE_THRESH,
184 		.dir = IIO_EV_DIR_EITHER,
185 		.mask_separate = BIT(IIO_EV_INFO_ENABLE) |
186 				 BIT(IIO_EV_INFO_HYSTERESIS) |
187 				 BIT(IIO_EV_INFO_VALUE),
188 	},
189 };
190 
191 #define SX9310_NAMED_CHANNEL(idx, name)					 \
192 	{								 \
193 		.type = IIO_PROXIMITY,					 \
194 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |		 \
195 				      BIT(IIO_CHAN_INFO_HARDWAREGAIN),   \
196 		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
197 		.info_mask_separate_available =				 \
198 			BIT(IIO_CHAN_INFO_HARDWAREGAIN),		 \
199 		.indexed = 1,						 \
200 		.channel = idx,						 \
201 		.extend_name = name,					 \
202 		.address = SX9310_REG_DIFF_MSB,				 \
203 		.event_spec = sx9310_events,				 \
204 		.num_event_specs = ARRAY_SIZE(sx9310_events),		 \
205 		.scan_index = idx,					 \
206 		.scan_type = {						 \
207 			.sign = 's',					 \
208 			.realbits = 12,					 \
209 			.storagebits = 16,				 \
210 			.endianness = IIO_BE,				 \
211 		},							 \
212 	}
213 #define SX9310_CHANNEL(idx) SX9310_NAMED_CHANNEL(idx, NULL)
214 
215 static const struct iio_chan_spec sx9310_channels[] = {
216 	SX9310_CHANNEL(0),			/* CS0 */
217 	SX9310_CHANNEL(1),			/* CS1 */
218 	SX9310_CHANNEL(2),			/* CS2 */
219 	SX9310_NAMED_CHANNEL(3, "comb"),	/* COMB */
220 
221 	IIO_CHAN_SOFT_TIMESTAMP(4),
222 };
223 
224 /*
225  * Each entry contains the integer part (val) and the fractional part, in micro
226  * seconds. It conforms to the IIO output IIO_VAL_INT_PLUS_MICRO.
227  */
228 static const struct {
229 	int val;
230 	int val2;
231 } sx9310_samp_freq_table[] = {
232 	{ 500, 0 }, /* 0000: Min (no idle time) */
233 	{ 66, 666666 }, /* 0001: 15 ms */
234 	{ 33, 333333 }, /* 0010: 30 ms (Typ.) */
235 	{ 22, 222222 }, /* 0011: 45 ms */
236 	{ 16, 666666 }, /* 0100: 60 ms */
237 	{ 11, 111111 }, /* 0101: 90 ms */
238 	{ 8, 333333 }, /* 0110: 120 ms */
239 	{ 5, 0 }, /* 0111: 200 ms */
240 	{ 2, 500000 }, /* 1000: 400 ms */
241 	{ 1, 666666 }, /* 1001: 600 ms */
242 	{ 1, 250000 }, /* 1010: 800 ms */
243 	{ 1, 0 }, /* 1011: 1 s */
244 	{ 0, 500000 }, /* 1100: 2 s */
245 	{ 0, 333333 }, /* 1101: 3 s */
246 	{ 0, 250000 }, /* 1110: 4 s */
247 	{ 0, 200000 }, /* 1111: 5 s */
248 };
249 static const unsigned int sx9310_scan_period_table[] = {
250 	2,   15,  30,  45,   60,   90,	 120,  200,
251 	400, 600, 800, 1000, 2000, 3000, 4000, 5000,
252 };
253 
254 static ssize_t sx9310_show_samp_freq_avail(struct device *dev,
255 					   struct device_attribute *attr,
256 					   char *buf)
257 {
258 	size_t len = 0;
259 	int i;
260 
261 	for (i = 0; i < ARRAY_SIZE(sx9310_samp_freq_table); i++)
262 		len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%d ",
263 				 sx9310_samp_freq_table[i].val,
264 				 sx9310_samp_freq_table[i].val2);
265 	buf[len - 1] = '\n';
266 	return len;
267 }
268 static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(sx9310_show_samp_freq_avail);
269 
270 static const struct regmap_range sx9310_writable_reg_ranges[] = {
271 	regmap_reg_range(SX9310_REG_IRQ_MSK, SX9310_REG_IRQ_FUNC),
272 	regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
273 	regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
274 	regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SENSOR_SEL),
275 	regmap_reg_range(SX9310_REG_OFFSET_MSB, SX9310_REG_OFFSET_LSB),
276 	regmap_reg_range(SX9310_REG_PAUSE, SX9310_REG_PAUSE),
277 	regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
278 };
279 
280 static const struct regmap_access_table sx9310_writeable_regs = {
281 	.yes_ranges = sx9310_writable_reg_ranges,
282 	.n_yes_ranges = ARRAY_SIZE(sx9310_writable_reg_ranges),
283 };
284 
285 static const struct regmap_range sx9310_readable_reg_ranges[] = {
286 	regmap_reg_range(SX9310_REG_IRQ_SRC, SX9310_REG_IRQ_FUNC),
287 	regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
288 	regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
289 	regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SAR_LSB),
290 	regmap_reg_range(SX9310_REG_I2C_ADDR, SX9310_REG_WHOAMI),
291 	regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
292 };
293 
294 static const struct regmap_access_table sx9310_readable_regs = {
295 	.yes_ranges = sx9310_readable_reg_ranges,
296 	.n_yes_ranges = ARRAY_SIZE(sx9310_readable_reg_ranges),
297 };
298 
299 static const struct regmap_range sx9310_volatile_reg_ranges[] = {
300 	regmap_reg_range(SX9310_REG_IRQ_SRC, SX9310_REG_STAT1),
301 	regmap_reg_range(SX9310_REG_USE_MSB, SX9310_REG_DIFF_LSB),
302 	regmap_reg_range(SX9310_REG_SAR_MSB, SX9310_REG_SAR_LSB),
303 	regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
304 };
305 
306 static const struct regmap_access_table sx9310_volatile_regs = {
307 	.yes_ranges = sx9310_volatile_reg_ranges,
308 	.n_yes_ranges = ARRAY_SIZE(sx9310_volatile_reg_ranges),
309 };
310 
311 static const struct regmap_config sx9310_regmap_config = {
312 	.reg_bits = 8,
313 	.val_bits = 8,
314 
315 	.max_register = SX9310_REG_RESET,
316 	.cache_type = REGCACHE_RBTREE,
317 
318 	.wr_table = &sx9310_writeable_regs,
319 	.rd_table = &sx9310_readable_regs,
320 	.volatile_table = &sx9310_volatile_regs,
321 };
322 
323 static int sx9310_update_chan_en(struct sx9310_data *data,
324 				 unsigned long chan_read,
325 				 unsigned long chan_event)
326 {
327 	int ret;
328 	unsigned long channels = chan_read | chan_event;
329 
330 	if ((data->chan_read | data->chan_event) != channels) {
331 		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
332 					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
333 					 channels);
334 		if (ret)
335 			return ret;
336 	}
337 	data->chan_read = chan_read;
338 	data->chan_event = chan_event;
339 	return 0;
340 }
341 
342 static int sx9310_get_read_channel(struct sx9310_data *data, int channel)
343 {
344 	return sx9310_update_chan_en(data, data->chan_read | BIT(channel),
345 				     data->chan_event);
346 }
347 
348 static int sx9310_put_read_channel(struct sx9310_data *data, int channel)
349 {
350 	return sx9310_update_chan_en(data, data->chan_read & ~BIT(channel),
351 				     data->chan_event);
352 }
353 
354 static int sx9310_get_event_channel(struct sx9310_data *data, int channel)
355 {
356 	return sx9310_update_chan_en(data, data->chan_read,
357 				     data->chan_event | BIT(channel));
358 }
359 
360 static int sx9310_put_event_channel(struct sx9310_data *data, int channel)
361 {
362 	return sx9310_update_chan_en(data, data->chan_read,
363 				     data->chan_event & ~BIT(channel));
364 }
365 
366 static int sx9310_enable_irq(struct sx9310_data *data, unsigned int irq)
367 {
368 	if (!data->client->irq)
369 		return 0;
370 	return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, irq);
371 }
372 
373 static int sx9310_disable_irq(struct sx9310_data *data, unsigned int irq)
374 {
375 	if (!data->client->irq)
376 		return 0;
377 	return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, 0);
378 }
379 
380 static int sx9310_read_prox_data(struct sx9310_data *data,
381 				 const struct iio_chan_spec *chan, __be16 *val)
382 {
383 	int ret;
384 
385 	ret = regmap_write(data->regmap, SX9310_REG_SENSOR_SEL, chan->channel);
386 	if (ret)
387 		return ret;
388 
389 	return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
390 }
391 
392 /*
393  * If we have no interrupt support, we have to wait for a scan period
394  * after enabling a channel to get a result.
395  */
396 static int sx9310_wait_for_sample(struct sx9310_data *data)
397 {
398 	int ret;
399 	unsigned int val;
400 
401 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &val);
402 	if (ret)
403 		return ret;
404 
405 	val = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, val);
406 
407 	msleep(sx9310_scan_period_table[val]);
408 
409 	return 0;
410 }
411 
412 static int sx9310_read_proximity(struct sx9310_data *data,
413 				 const struct iio_chan_spec *chan, int *val)
414 {
415 	int ret;
416 	__be16 rawval;
417 
418 	mutex_lock(&data->mutex);
419 
420 	ret = sx9310_get_read_channel(data, chan->channel);
421 	if (ret)
422 		goto out;
423 
424 	ret = sx9310_enable_irq(data, SX9310_CONVDONE_IRQ);
425 	if (ret)
426 		goto out_put_channel;
427 
428 	mutex_unlock(&data->mutex);
429 
430 	if (data->client->irq) {
431 		ret = wait_for_completion_interruptible(&data->completion);
432 		reinit_completion(&data->completion);
433 	} else {
434 		ret = sx9310_wait_for_sample(data);
435 	}
436 
437 	mutex_lock(&data->mutex);
438 
439 	if (ret)
440 		goto out_disable_irq;
441 
442 	ret = sx9310_read_prox_data(data, chan, &rawval);
443 	if (ret)
444 		goto out_disable_irq;
445 
446 	*val = sign_extend32(be16_to_cpu(rawval),
447 			     chan->address == SX9310_REG_DIFF_MSB ? 11 : 15);
448 
449 	ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
450 	if (ret)
451 		goto out_put_channel;
452 
453 	ret = sx9310_put_read_channel(data, chan->channel);
454 	if (ret)
455 		goto out;
456 
457 	mutex_unlock(&data->mutex);
458 
459 	return IIO_VAL_INT;
460 
461 out_disable_irq:
462 	sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
463 out_put_channel:
464 	sx9310_put_read_channel(data, chan->channel);
465 out:
466 	mutex_unlock(&data->mutex);
467 
468 	return ret;
469 }
470 
471 static int sx9310_read_gain(struct sx9310_data *data,
472 			    const struct iio_chan_spec *chan, int *val)
473 {
474 	unsigned int regval, gain;
475 	int ret;
476 
477 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL3, &regval);
478 	if (ret)
479 		return ret;
480 
481 	switch (chan->channel) {
482 	case 0:
483 	case 3:
484 		gain = FIELD_GET(SX9310_REG_PROX_CTRL3_GAIN0_MASK, regval);
485 		break;
486 	case 1:
487 	case 2:
488 		gain = FIELD_GET(SX9310_REG_PROX_CTRL3_GAIN12_MASK, regval);
489 		break;
490 	default:
491 		return -EINVAL;
492 	}
493 
494 	*val = 1 << gain;
495 
496 	return IIO_VAL_INT;
497 }
498 
499 static int sx9310_read_samp_freq(struct sx9310_data *data, int *val, int *val2)
500 {
501 	unsigned int regval;
502 	int ret;
503 
504 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &regval);
505 	if (ret)
506 		return ret;
507 
508 	regval = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, regval);
509 	*val = sx9310_samp_freq_table[regval].val;
510 	*val2 = sx9310_samp_freq_table[regval].val2;
511 
512 	return IIO_VAL_INT_PLUS_MICRO;
513 }
514 
515 static int sx9310_read_raw(struct iio_dev *indio_dev,
516 			   const struct iio_chan_spec *chan, int *val,
517 			   int *val2, long mask)
518 {
519 	struct sx9310_data *data = iio_priv(indio_dev);
520 	int ret;
521 
522 	if (chan->type != IIO_PROXIMITY)
523 		return -EINVAL;
524 
525 	switch (mask) {
526 	case IIO_CHAN_INFO_RAW:
527 		ret = iio_device_claim_direct_mode(indio_dev);
528 		if (ret)
529 			return ret;
530 
531 		ret = sx9310_read_proximity(data, chan, val);
532 		iio_device_release_direct_mode(indio_dev);
533 		return ret;
534 	case IIO_CHAN_INFO_HARDWAREGAIN:
535 		ret = iio_device_claim_direct_mode(indio_dev);
536 		if (ret)
537 			return ret;
538 
539 		ret = sx9310_read_gain(data, chan, val);
540 		iio_device_release_direct_mode(indio_dev);
541 		return ret;
542 	case IIO_CHAN_INFO_SAMP_FREQ:
543 		return sx9310_read_samp_freq(data, val, val2);
544 	default:
545 		return -EINVAL;
546 	}
547 }
548 
549 static const int sx9310_gain_vals[] = { 1, 2, 4, 8 };
550 
551 static int sx9310_read_avail(struct iio_dev *indio_dev,
552 			     struct iio_chan_spec const *chan,
553 			     const int **vals, int *type, int *length,
554 			     long mask)
555 {
556 	if (chan->type != IIO_PROXIMITY)
557 		return -EINVAL;
558 
559 	switch (mask) {
560 	case IIO_CHAN_INFO_HARDWAREGAIN:
561 		*type = IIO_VAL_INT;
562 		*length = ARRAY_SIZE(sx9310_gain_vals);
563 		*vals = sx9310_gain_vals;
564 		return IIO_AVAIL_LIST;
565 	}
566 
567 	return -EINVAL;
568 }
569 
570 static const unsigned int sx9310_pthresh_codes[] = {
571 	2, 4, 6, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96, 112,
572 	128, 144, 160, 192, 224, 256, 320, 384, 512, 640, 768, 1024, 1536
573 };
574 
575 static int sx9310_get_thresh_reg(unsigned int channel)
576 {
577 	switch (channel) {
578 	case 0:
579 	case 3:
580 		return SX9310_REG_PROX_CTRL8;
581 	case 1:
582 	case 2:
583 		return SX9310_REG_PROX_CTRL9;
584 	}
585 
586 	return -EINVAL;
587 }
588 
589 static int sx9310_read_thresh(struct sx9310_data *data,
590 			      const struct iio_chan_spec *chan, int *val)
591 {
592 	unsigned int reg;
593 	unsigned int regval;
594 	int ret;
595 
596 	reg = ret = sx9310_get_thresh_reg(chan->channel);
597 	if (ret < 0)
598 		return ret;
599 
600 	ret = regmap_read(data->regmap, reg, &regval);
601 	if (ret)
602 		return ret;
603 
604 	regval = FIELD_GET(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
605 	if (regval >= ARRAY_SIZE(sx9310_pthresh_codes))
606 		return -EINVAL;
607 
608 	*val = sx9310_pthresh_codes[regval];
609 	return IIO_VAL_INT;
610 }
611 
612 static int sx9310_read_hysteresis(struct sx9310_data *data,
613 				  const struct iio_chan_spec *chan, int *val)
614 {
615 	unsigned int regval, pthresh;
616 	int ret;
617 
618 	ret = sx9310_read_thresh(data, chan, &pthresh);
619 	if (ret < 0)
620 		return ret;
621 
622 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, &regval);
623 	if (ret)
624 		return ret;
625 
626 	regval = FIELD_GET(SX9310_REG_PROX_CTRL10_HYST_MASK, regval);
627 	if (!regval)
628 		regval = 5;
629 
630 	/* regval is at most 5 */
631 	*val = pthresh >> (5 - regval);
632 
633 	return IIO_VAL_INT;
634 }
635 
636 static int sx9310_read_far_debounce(struct sx9310_data *data, int *val)
637 {
638 	unsigned int regval;
639 	int ret;
640 
641 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, &regval);
642 	if (ret)
643 		return ret;
644 
645 	regval = FIELD_GET(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, regval);
646 	if (regval)
647 		*val = 1 << regval;
648 	else
649 		*val = 0;
650 
651 	return IIO_VAL_INT;
652 }
653 
654 static int sx9310_read_close_debounce(struct sx9310_data *data, int *val)
655 {
656 	unsigned int regval;
657 	int ret;
658 
659 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, &regval);
660 	if (ret)
661 		return ret;
662 
663 	regval = FIELD_GET(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, regval);
664 	if (regval)
665 		*val = 1 << regval;
666 	else
667 		*val = 0;
668 
669 	return IIO_VAL_INT;
670 }
671 
672 static int sx9310_read_event_val(struct iio_dev *indio_dev,
673 				 const struct iio_chan_spec *chan,
674 				 enum iio_event_type type,
675 				 enum iio_event_direction dir,
676 				 enum iio_event_info info, int *val, int *val2)
677 {
678 	struct sx9310_data *data = iio_priv(indio_dev);
679 
680 	if (chan->type != IIO_PROXIMITY)
681 		return -EINVAL;
682 
683 	switch (info) {
684 	case IIO_EV_INFO_VALUE:
685 		return sx9310_read_thresh(data, chan, val);
686 	case IIO_EV_INFO_PERIOD:
687 		switch (dir) {
688 		case IIO_EV_DIR_RISING:
689 			return sx9310_read_far_debounce(data, val);
690 		case IIO_EV_DIR_FALLING:
691 			return sx9310_read_close_debounce(data, val);
692 		default:
693 			return -EINVAL;
694 		}
695 	case IIO_EV_INFO_HYSTERESIS:
696 		return sx9310_read_hysteresis(data, chan, val);
697 	default:
698 		return -EINVAL;
699 	}
700 }
701 
702 static int sx9310_write_thresh(struct sx9310_data *data,
703 			       const struct iio_chan_spec *chan, int val)
704 {
705 	unsigned int reg;
706 	unsigned int regval;
707 	int ret, i;
708 
709 	reg = ret = sx9310_get_thresh_reg(chan->channel);
710 	if (ret < 0)
711 		return ret;
712 
713 	for (i = 0; i < ARRAY_SIZE(sx9310_pthresh_codes); i++) {
714 		if (sx9310_pthresh_codes[i] == val) {
715 			regval = i;
716 			break;
717 		}
718 	}
719 
720 	if (i == ARRAY_SIZE(sx9310_pthresh_codes))
721 		return -EINVAL;
722 
723 	regval = FIELD_PREP(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
724 	mutex_lock(&data->mutex);
725 	ret = regmap_update_bits(data->regmap, reg,
726 				 SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
727 	mutex_unlock(&data->mutex);
728 
729 	return ret;
730 }
731 
732 static int sx9310_write_hysteresis(struct sx9310_data *data,
733 				   const struct iio_chan_spec *chan, int _val)
734 {
735 	unsigned int hyst, val = _val;
736 	int ret, pthresh;
737 
738 	ret = sx9310_read_thresh(data, chan, &pthresh);
739 	if (ret < 0)
740 		return ret;
741 
742 	if (val == 0)
743 		hyst = 0;
744 	else if (val == pthresh >> 2)
745 		hyst = 3;
746 	else if (val == pthresh >> 3)
747 		hyst = 2;
748 	else if (val == pthresh >> 4)
749 		hyst = 1;
750 	else
751 		return -EINVAL;
752 
753 	hyst = FIELD_PREP(SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
754 	mutex_lock(&data->mutex);
755 	ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
756 				 SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
757 	mutex_unlock(&data->mutex);
758 
759 	return ret;
760 }
761 
762 static int sx9310_write_far_debounce(struct sx9310_data *data, int val)
763 {
764 	int ret;
765 	unsigned int regval;
766 
767 	if (val > 0)
768 		val = ilog2(val);
769 	if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val))
770 		return -EINVAL;
771 
772 	regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val);
773 
774 	mutex_lock(&data->mutex);
775 	ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
776 				 SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK,
777 				 regval);
778 	mutex_unlock(&data->mutex);
779 
780 	return ret;
781 }
782 
783 static int sx9310_write_close_debounce(struct sx9310_data *data, int val)
784 {
785 	int ret;
786 	unsigned int regval;
787 
788 	if (val > 0)
789 		val = ilog2(val);
790 	if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val))
791 		return -EINVAL;
792 
793 	regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val);
794 
795 	mutex_lock(&data->mutex);
796 	ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
797 				 SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK,
798 				 regval);
799 	mutex_unlock(&data->mutex);
800 
801 	return ret;
802 }
803 
804 static int sx9310_write_event_val(struct iio_dev *indio_dev,
805 				  const struct iio_chan_spec *chan,
806 				  enum iio_event_type type,
807 				  enum iio_event_direction dir,
808 				  enum iio_event_info info, int val, int val2)
809 {
810 	struct sx9310_data *data = iio_priv(indio_dev);
811 
812 	if (chan->type != IIO_PROXIMITY)
813 		return -EINVAL;
814 
815 	switch (info) {
816 	case IIO_EV_INFO_VALUE:
817 		return sx9310_write_thresh(data, chan, val);
818 	case IIO_EV_INFO_PERIOD:
819 		switch (dir) {
820 		case IIO_EV_DIR_RISING:
821 			return sx9310_write_far_debounce(data, val);
822 		case IIO_EV_DIR_FALLING:
823 			return sx9310_write_close_debounce(data, val);
824 		default:
825 			return -EINVAL;
826 		}
827 	case IIO_EV_INFO_HYSTERESIS:
828 		return sx9310_write_hysteresis(data, chan, val);
829 	default:
830 		return -EINVAL;
831 	}
832 }
833 
834 static int sx9310_set_samp_freq(struct sx9310_data *data, int val, int val2)
835 {
836 	int i, ret;
837 
838 	for (i = 0; i < ARRAY_SIZE(sx9310_samp_freq_table); i++)
839 		if (val == sx9310_samp_freq_table[i].val &&
840 		    val2 == sx9310_samp_freq_table[i].val2)
841 			break;
842 
843 	if (i == ARRAY_SIZE(sx9310_samp_freq_table))
844 		return -EINVAL;
845 
846 	mutex_lock(&data->mutex);
847 
848 	ret = regmap_update_bits(
849 		data->regmap, SX9310_REG_PROX_CTRL0,
850 		SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK,
851 		FIELD_PREP(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, i));
852 
853 	mutex_unlock(&data->mutex);
854 
855 	return ret;
856 }
857 
858 static int sx9310_write_gain(struct sx9310_data *data,
859 			    const struct iio_chan_spec *chan, int val)
860 {
861 	unsigned int gain, mask;
862 	int ret;
863 
864 	gain = ilog2(val);
865 
866 	switch (chan->channel) {
867 	case 0:
868 	case 3:
869 		mask = SX9310_REG_PROX_CTRL3_GAIN0_MASK;
870 		gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN0_MASK, gain);
871 		break;
872 	case 1:
873 	case 2:
874 		mask = SX9310_REG_PROX_CTRL3_GAIN12_MASK;
875 		gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN12_MASK, gain);
876 		break;
877 	default:
878 		return -EINVAL;
879 	}
880 
881 	mutex_lock(&data->mutex);
882 	ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL3, mask,
883 				 gain);
884 	mutex_unlock(&data->mutex);
885 
886 	return ret;
887 }
888 
889 static int sx9310_write_raw(struct iio_dev *indio_dev,
890 			    const struct iio_chan_spec *chan, int val, int val2,
891 			    long mask)
892 {
893 	struct sx9310_data *data = iio_priv(indio_dev);
894 
895 	if (chan->type != IIO_PROXIMITY)
896 		return -EINVAL;
897 
898 	switch (mask) {
899 	case IIO_CHAN_INFO_SAMP_FREQ:
900 		return sx9310_set_samp_freq(data, val, val2);
901 	case IIO_CHAN_INFO_HARDWAREGAIN:
902 		return sx9310_write_gain(data, chan, val);
903 	}
904 
905 	return -EINVAL;
906 }
907 
908 static irqreturn_t sx9310_irq_handler(int irq, void *private)
909 {
910 	struct iio_dev *indio_dev = private;
911 	struct sx9310_data *data = iio_priv(indio_dev);
912 
913 	if (data->trigger_enabled)
914 		iio_trigger_poll(data->trig);
915 
916 	/*
917 	 * Even if no event is enabled, we need to wake the thread to clear the
918 	 * interrupt state by reading SX9310_REG_IRQ_SRC.
919 	 * It is not possible to do that here because regmap_read takes a mutex.
920 	 */
921 	return IRQ_WAKE_THREAD;
922 }
923 
924 static void sx9310_push_events(struct iio_dev *indio_dev)
925 {
926 	int ret;
927 	unsigned int val, chan;
928 	struct sx9310_data *data = iio_priv(indio_dev);
929 	s64 timestamp = iio_get_time_ns(indio_dev);
930 	unsigned long prox_changed;
931 
932 	/* Read proximity state on all channels */
933 	ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
934 	if (ret) {
935 		dev_err(&data->client->dev, "i2c transfer error in irq\n");
936 		return;
937 	}
938 
939 	/*
940 	 * Only iterate over channels with changes on proximity status that have
941 	 * events enabled.
942 	 */
943 	prox_changed = (data->chan_prox_stat ^ val) & data->chan_event;
944 
945 	for_each_set_bit(chan, &prox_changed, SX9310_NUM_CHANNELS) {
946 		int dir;
947 		u64 ev;
948 
949 		dir = (val & BIT(chan)) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
950 		ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan,
951 					  IIO_EV_TYPE_THRESH, dir);
952 
953 		iio_push_event(indio_dev, ev, timestamp);
954 	}
955 	data->chan_prox_stat = val;
956 }
957 
958 static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
959 {
960 	struct iio_dev *indio_dev = private;
961 	struct sx9310_data *data = iio_priv(indio_dev);
962 	int ret;
963 	unsigned int val;
964 
965 	mutex_lock(&data->mutex);
966 
967 	ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val);
968 	if (ret) {
969 		dev_err(&data->client->dev, "i2c transfer error in irq\n");
970 		goto out;
971 	}
972 
973 	if (val & (SX9310_FAR_IRQ | SX9310_CLOSE_IRQ))
974 		sx9310_push_events(indio_dev);
975 
976 	if (val & SX9310_CONVDONE_IRQ)
977 		complete(&data->completion);
978 
979 out:
980 	mutex_unlock(&data->mutex);
981 
982 	return IRQ_HANDLED;
983 }
984 
985 static int sx9310_read_event_config(struct iio_dev *indio_dev,
986 				    const struct iio_chan_spec *chan,
987 				    enum iio_event_type type,
988 				    enum iio_event_direction dir)
989 {
990 	struct sx9310_data *data = iio_priv(indio_dev);
991 
992 	return !!(data->chan_event & BIT(chan->channel));
993 }
994 
995 static int sx9310_write_event_config(struct iio_dev *indio_dev,
996 				     const struct iio_chan_spec *chan,
997 				     enum iio_event_type type,
998 				     enum iio_event_direction dir, int state)
999 {
1000 	struct sx9310_data *data = iio_priv(indio_dev);
1001 	unsigned int eventirq = SX9310_FAR_IRQ | SX9310_CLOSE_IRQ;
1002 	int ret;
1003 
1004 	/* If the state hasn't changed, there's nothing to do. */
1005 	if (!!(data->chan_event & BIT(chan->channel)) == state)
1006 		return 0;
1007 
1008 	mutex_lock(&data->mutex);
1009 	if (state) {
1010 		ret = sx9310_get_event_channel(data, chan->channel);
1011 		if (ret)
1012 			goto out_unlock;
1013 		if (!(data->chan_event & ~BIT(chan->channel))) {
1014 			ret = sx9310_enable_irq(data, eventirq);
1015 			if (ret)
1016 				sx9310_put_event_channel(data, chan->channel);
1017 		}
1018 	} else {
1019 		ret = sx9310_put_event_channel(data, chan->channel);
1020 		if (ret)
1021 			goto out_unlock;
1022 		if (!data->chan_event) {
1023 			ret = sx9310_disable_irq(data, eventirq);
1024 			if (ret)
1025 				sx9310_get_event_channel(data, chan->channel);
1026 		}
1027 	}
1028 
1029 out_unlock:
1030 	mutex_unlock(&data->mutex);
1031 	return ret;
1032 }
1033 
1034 static struct attribute *sx9310_attributes[] = {
1035 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
1036 	NULL
1037 };
1038 
1039 static const struct attribute_group sx9310_attribute_group = {
1040 	.attrs = sx9310_attributes,
1041 };
1042 
1043 static const struct iio_info sx9310_info = {
1044 	.attrs = &sx9310_attribute_group,
1045 	.read_raw = sx9310_read_raw,
1046 	.read_avail = sx9310_read_avail,
1047 	.read_event_value = sx9310_read_event_val,
1048 	.write_event_value = sx9310_write_event_val,
1049 	.write_raw = sx9310_write_raw,
1050 	.read_event_config = sx9310_read_event_config,
1051 	.write_event_config = sx9310_write_event_config,
1052 };
1053 
1054 static int sx9310_set_trigger_state(struct iio_trigger *trig, bool state)
1055 {
1056 	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
1057 	struct sx9310_data *data = iio_priv(indio_dev);
1058 	int ret = 0;
1059 
1060 	mutex_lock(&data->mutex);
1061 
1062 	if (state)
1063 		ret = sx9310_enable_irq(data, SX9310_CONVDONE_IRQ);
1064 	else if (!data->chan_read)
1065 		ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
1066 	if (ret)
1067 		goto out;
1068 
1069 	data->trigger_enabled = state;
1070 
1071 out:
1072 	mutex_unlock(&data->mutex);
1073 
1074 	return ret;
1075 }
1076 
1077 static const struct iio_trigger_ops sx9310_trigger_ops = {
1078 	.set_trigger_state = sx9310_set_trigger_state,
1079 };
1080 
1081 static irqreturn_t sx9310_trigger_handler(int irq, void *private)
1082 {
1083 	struct iio_poll_func *pf = private;
1084 	struct iio_dev *indio_dev = pf->indio_dev;
1085 	struct sx9310_data *data = iio_priv(indio_dev);
1086 	__be16 val;
1087 	int bit, ret, i = 0;
1088 
1089 	mutex_lock(&data->mutex);
1090 
1091 	for_each_set_bit(bit, indio_dev->active_scan_mask,
1092 			 indio_dev->masklength) {
1093 		ret = sx9310_read_prox_data(data, &indio_dev->channels[bit],
1094 					    &val);
1095 		if (ret)
1096 			goto out;
1097 
1098 		data->buffer.channels[i++] = val;
1099 	}
1100 
1101 	iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
1102 					   pf->timestamp);
1103 
1104 out:
1105 	mutex_unlock(&data->mutex);
1106 
1107 	iio_trigger_notify_done(indio_dev->trig);
1108 
1109 	return IRQ_HANDLED;
1110 }
1111 
1112 static int sx9310_buffer_preenable(struct iio_dev *indio_dev)
1113 {
1114 	struct sx9310_data *data = iio_priv(indio_dev);
1115 	unsigned long channels = 0;
1116 	int bit, ret;
1117 
1118 	mutex_lock(&data->mutex);
1119 	for_each_set_bit(bit, indio_dev->active_scan_mask,
1120 			 indio_dev->masklength)
1121 		__set_bit(indio_dev->channels[bit].channel, &channels);
1122 
1123 	ret = sx9310_update_chan_en(data, channels, data->chan_event);
1124 	mutex_unlock(&data->mutex);
1125 	return ret;
1126 }
1127 
1128 static int sx9310_buffer_postdisable(struct iio_dev *indio_dev)
1129 {
1130 	struct sx9310_data *data = iio_priv(indio_dev);
1131 	int ret;
1132 
1133 	mutex_lock(&data->mutex);
1134 	ret = sx9310_update_chan_en(data, 0, data->chan_event);
1135 	mutex_unlock(&data->mutex);
1136 	return ret;
1137 }
1138 
1139 static const struct iio_buffer_setup_ops sx9310_buffer_setup_ops = {
1140 	.preenable = sx9310_buffer_preenable,
1141 	.postdisable = sx9310_buffer_postdisable,
1142 };
1143 
1144 struct sx9310_reg_default {
1145 	u8 reg;
1146 	u8 def;
1147 };
1148 
1149 static const struct sx9310_reg_default sx9310_default_regs[] = {
1150 	{ SX9310_REG_IRQ_MSK, 0x00 },
1151 	{ SX9310_REG_IRQ_FUNC, 0x00 },
1152 	/*
1153 	 * The lower 4 bits should not be set as it enable sensors measurements.
1154 	 * Turning the detection on before the configuration values are set to
1155 	 * good values can cause the device to return erroneous readings.
1156 	 */
1157 	{ SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS },
1158 	{ SX9310_REG_PROX_CTRL1, 0x00 },
1159 	{ SX9310_REG_PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2 |
1160 				 SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC },
1161 	{ SX9310_REG_PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
1162 				 SX9310_REG_PROX_CTRL3_GAIN12_X4 },
1163 	{ SX9310_REG_PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST },
1164 	{ SX9310_REG_PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
1165 				 SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
1166 				 SX9310_REG_PROX_CTRL5_RAWFILT_1P25 },
1167 	{ SX9310_REG_PROX_CTRL6, SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT },
1168 	{ SX9310_REG_PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
1169 				 SX9310_REG_PROX_CTRL7_AVGPOSFILT_512 },
1170 	{ SX9310_REG_PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
1171 				 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500 },
1172 	{ SX9310_REG_PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH_28 |
1173 				 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900 },
1174 	{ SX9310_REG_PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
1175 				  SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2 },
1176 	{ SX9310_REG_PROX_CTRL11, 0x00 },
1177 	{ SX9310_REG_PROX_CTRL12, 0x00 },
1178 	{ SX9310_REG_PROX_CTRL13, 0x00 },
1179 	{ SX9310_REG_PROX_CTRL14, 0x00 },
1180 	{ SX9310_REG_PROX_CTRL15, 0x00 },
1181 	{ SX9310_REG_PROX_CTRL16, 0x00 },
1182 	{ SX9310_REG_PROX_CTRL17, 0x00 },
1183 	{ SX9310_REG_PROX_CTRL18, 0x00 },
1184 	{ SX9310_REG_PROX_CTRL19, 0x00 },
1185 	{ SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
1186 				SX9310_REG_SAR_CTRL0_SARHYST_8 },
1187 	{ SX9310_REG_SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250) },
1188 	{ SX9310_REG_SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT },
1189 };
1190 
1191 /* Activate all channels and perform an initial compensation. */
1192 static int sx9310_init_compensation(struct iio_dev *indio_dev)
1193 {
1194 	struct sx9310_data *data = iio_priv(indio_dev);
1195 	int ret;
1196 	unsigned int val;
1197 	unsigned int ctrl0;
1198 
1199 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &ctrl0);
1200 	if (ret)
1201 		return ret;
1202 
1203 	/* run the compensation phase on all channels */
1204 	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
1205 			   ctrl0 | SX9310_REG_PROX_CTRL0_SENSOREN_MASK);
1206 	if (ret)
1207 		return ret;
1208 
1209 	ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val,
1210 				       !(val & SX9310_REG_STAT1_COMPSTAT_MASK),
1211 				       20000, 2000000);
1212 	if (ret) {
1213 		if (ret == -ETIMEDOUT)
1214 			dev_err(&data->client->dev,
1215 				"initial compensation timed out: 0x%02x\n",
1216 				val);
1217 		return ret;
1218 	}
1219 
1220 	regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
1221 	return ret;
1222 }
1223 
1224 static const struct sx9310_reg_default *
1225 sx9310_get_default_reg(struct device *dev, int idx,
1226 		       struct sx9310_reg_default *reg_def)
1227 {
1228 	u32 combined[SX9310_NUM_CHANNELS];
1229 	u32 start = 0, raw = 0, pos = 0;
1230 	unsigned long comb_mask = 0;
1231 	int ret, i, count;
1232 	const char *res;
1233 
1234 	memcpy(reg_def, &sx9310_default_regs[idx], sizeof(*reg_def));
1235 	switch (reg_def->reg) {
1236 	case SX9310_REG_PROX_CTRL2:
1237 		if (device_property_read_bool(dev, "semtech,cs0-ground")) {
1238 			reg_def->def &= ~SX9310_REG_PROX_CTRL2_SHIELDEN_MASK;
1239 			reg_def->def |= SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND;
1240 		}
1241 
1242 		count = device_property_count_u32(dev, "semtech,combined-sensors");
1243 		if (count < 0 || count > ARRAY_SIZE(combined))
1244 			break;
1245 		ret = device_property_read_u32_array(dev, "semtech,combined-sensors",
1246 				combined, count);
1247 		if (ret)
1248 			break;
1249 
1250 		for (i = 0; i < count; i++)
1251 			comb_mask |= BIT(combined[i]);
1252 
1253 		reg_def->def &= ~SX9310_REG_PROX_CTRL2_COMBMODE_MASK;
1254 		if (comb_mask == (BIT(3) | BIT(2) | BIT(1) | BIT(0)))
1255 			reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3;
1256 		else if (comb_mask == (BIT(1) | BIT(2)))
1257 			reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2;
1258 		else if (comb_mask == (BIT(0) | BIT(1)))
1259 			reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1;
1260 		else if (comb_mask == BIT(3))
1261 			reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS3;
1262 
1263 		break;
1264 	case SX9310_REG_PROX_CTRL4:
1265 		ret = device_property_read_string(dev, "semtech,resolution", &res);
1266 		if (ret)
1267 			break;
1268 
1269 		reg_def->def &= ~SX9310_REG_PROX_CTRL4_RESOLUTION_MASK;
1270 		if (!strcmp(res, "coarsest"))
1271 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSEST;
1272 		else if (!strcmp(res, "very-coarse"))
1273 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_COARSE;
1274 		else if (!strcmp(res, "coarse"))
1275 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSE;
1276 		else if (!strcmp(res, "medium-coarse"))
1277 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM_COARSE;
1278 		else if (!strcmp(res, "medium"))
1279 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM;
1280 		else if (!strcmp(res, "fine"))
1281 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINE;
1282 		else if (!strcmp(res, "very-fine"))
1283 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_FINE;
1284 		else if (!strcmp(res, "finest"))
1285 			reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST;
1286 
1287 		break;
1288 	case SX9310_REG_PROX_CTRL5:
1289 		ret = device_property_read_u32(dev, "semtech,startup-sensor", &start);
1290 		if (ret) {
1291 			start = FIELD_GET(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK,
1292 					  reg_def->def);
1293 		}
1294 
1295 		reg_def->def &= ~SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK;
1296 		reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK,
1297 					   start);
1298 
1299 		ret = device_property_read_u32(dev, "semtech,proxraw-strength", &raw);
1300 		if (ret) {
1301 			raw = FIELD_GET(SX9310_REG_PROX_CTRL5_RAWFILT_MASK,
1302 					reg_def->def);
1303 		} else {
1304 			raw = ilog2(raw);
1305 		}
1306 
1307 		reg_def->def &= ~SX9310_REG_PROX_CTRL5_RAWFILT_MASK;
1308 		reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_RAWFILT_MASK,
1309 					   raw);
1310 		break;
1311 	case SX9310_REG_PROX_CTRL7:
1312 		ret = device_property_read_u32(dev, "semtech,avg-pos-strength", &pos);
1313 		if (ret)
1314 			break;
1315 
1316 		/* Powers of 2, except for a gap between 16 and 64 */
1317 		pos = clamp(ilog2(pos), 3, 11) - (pos >= 32 ? 4 : 3);
1318 		reg_def->def &= ~SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK;
1319 		reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK,
1320 					   pos);
1321 		break;
1322 	}
1323 
1324 	return reg_def;
1325 }
1326 
1327 static int sx9310_init_device(struct iio_dev *indio_dev)
1328 {
1329 	struct sx9310_data *data = iio_priv(indio_dev);
1330 	struct sx9310_reg_default tmp;
1331 	const struct sx9310_reg_default *initval;
1332 	int ret;
1333 	unsigned int i, val;
1334 
1335 	ret = regmap_write(data->regmap, SX9310_REG_RESET, SX9310_SOFT_RESET);
1336 	if (ret)
1337 		return ret;
1338 
1339 	usleep_range(1000, 2000); /* power-up time is ~1ms. */
1340 
1341 	/* Clear reset interrupt state by reading SX9310_REG_IRQ_SRC. */
1342 	ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val);
1343 	if (ret)
1344 		return ret;
1345 
1346 	/* Program some sane defaults. */
1347 	for (i = 0; i < ARRAY_SIZE(sx9310_default_regs); i++) {
1348 		initval = sx9310_get_default_reg(&indio_dev->dev, i, &tmp);
1349 		ret = regmap_write(data->regmap, initval->reg, initval->def);
1350 		if (ret)
1351 			return ret;
1352 	}
1353 
1354 	return sx9310_init_compensation(indio_dev);
1355 }
1356 
1357 static int sx9310_set_indio_dev_name(struct device *dev,
1358 				     struct iio_dev *indio_dev,
1359 				     unsigned int whoami)
1360 {
1361 	unsigned int long ddata;
1362 
1363 	ddata = (uintptr_t)device_get_match_data(dev);
1364 	if (ddata != whoami) {
1365 		dev_err(dev, "WHOAMI does not match device data: %u\n", whoami);
1366 		return -ENODEV;
1367 	}
1368 
1369 	switch (whoami) {
1370 	case SX9310_WHOAMI_VALUE:
1371 		indio_dev->name = "sx9310";
1372 		break;
1373 	case SX9311_WHOAMI_VALUE:
1374 		indio_dev->name = "sx9311";
1375 		break;
1376 	default:
1377 		dev_err(dev, "unexpected WHOAMI response: %u\n", whoami);
1378 		return -ENODEV;
1379 	}
1380 
1381 	return 0;
1382 }
1383 
1384 static void sx9310_regulator_disable(void *_data)
1385 {
1386 	struct sx9310_data *data = _data;
1387 
1388 	regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies);
1389 }
1390 
1391 static int sx9310_probe(struct i2c_client *client)
1392 {
1393 	int ret;
1394 	struct device *dev = &client->dev;
1395 	struct iio_dev *indio_dev;
1396 	struct sx9310_data *data;
1397 
1398 	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
1399 	if (!indio_dev)
1400 		return -ENOMEM;
1401 
1402 	data = iio_priv(indio_dev);
1403 	data->client = client;
1404 	data->supplies[0].supply = "vdd";
1405 	data->supplies[1].supply = "svdd";
1406 	mutex_init(&data->mutex);
1407 	init_completion(&data->completion);
1408 
1409 	data->regmap = devm_regmap_init_i2c(client, &sx9310_regmap_config);
1410 	if (IS_ERR(data->regmap))
1411 		return PTR_ERR(data->regmap);
1412 
1413 	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
1414 				      data->supplies);
1415 	if (ret)
1416 		return ret;
1417 
1418 	ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies);
1419 	if (ret)
1420 		return ret;
1421 	/* Must wait for Tpor time after initial power up */
1422 	usleep_range(1000, 1100);
1423 
1424 	ret = devm_add_action_or_reset(dev, sx9310_regulator_disable, data);
1425 	if (ret)
1426 		return ret;
1427 
1428 	ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
1429 	if (ret) {
1430 		dev_err(dev, "error in reading WHOAMI register: %d", ret);
1431 		return ret;
1432 	}
1433 
1434 	ret = sx9310_set_indio_dev_name(dev, indio_dev, data->whoami);
1435 	if (ret)
1436 		return ret;
1437 
1438 	ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(dev));
1439 	indio_dev->channels = sx9310_channels;
1440 	indio_dev->num_channels = ARRAY_SIZE(sx9310_channels);
1441 	indio_dev->info = &sx9310_info;
1442 	indio_dev->modes = INDIO_DIRECT_MODE;
1443 	i2c_set_clientdata(client, indio_dev);
1444 
1445 	ret = sx9310_init_device(indio_dev);
1446 	if (ret)
1447 		return ret;
1448 
1449 	if (client->irq) {
1450 		ret = devm_request_threaded_irq(dev, client->irq,
1451 						sx9310_irq_handler,
1452 						sx9310_irq_thread_handler,
1453 						IRQF_ONESHOT,
1454 						"sx9310_event", indio_dev);
1455 		if (ret)
1456 			return ret;
1457 
1458 		data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
1459 						    indio_dev->name,
1460 						    iio_device_id(indio_dev));
1461 		if (!data->trig)
1462 			return -ENOMEM;
1463 
1464 		data->trig->ops = &sx9310_trigger_ops;
1465 		iio_trigger_set_drvdata(data->trig, indio_dev);
1466 
1467 		ret = devm_iio_trigger_register(dev, data->trig);
1468 		if (ret)
1469 			return ret;
1470 	}
1471 
1472 	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
1473 					      iio_pollfunc_store_time,
1474 					      sx9310_trigger_handler,
1475 					      &sx9310_buffer_setup_ops);
1476 	if (ret)
1477 		return ret;
1478 
1479 	return devm_iio_device_register(dev, indio_dev);
1480 }
1481 
1482 static int __maybe_unused sx9310_suspend(struct device *dev)
1483 {
1484 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1485 	struct sx9310_data *data = iio_priv(indio_dev);
1486 	u8 ctrl0;
1487 	int ret;
1488 
1489 	disable_irq_nosync(data->client->irq);
1490 
1491 	mutex_lock(&data->mutex);
1492 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0,
1493 			  &data->suspend_ctrl0);
1494 	if (ret)
1495 		goto out;
1496 
1497 	ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK;
1498 	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
1499 	if (ret)
1500 		goto out;
1501 
1502 	ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 0);
1503 
1504 out:
1505 	mutex_unlock(&data->mutex);
1506 	return ret;
1507 }
1508 
1509 static int __maybe_unused sx9310_resume(struct device *dev)
1510 {
1511 	struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1512 	struct sx9310_data *data = iio_priv(indio_dev);
1513 	int ret;
1514 
1515 	mutex_lock(&data->mutex);
1516 	ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1);
1517 	if (ret)
1518 		goto out;
1519 
1520 	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
1521 			   data->suspend_ctrl0);
1522 
1523 out:
1524 	mutex_unlock(&data->mutex);
1525 	if (ret)
1526 		return ret;
1527 
1528 	enable_irq(data->client->irq);
1529 	return 0;
1530 }
1531 
1532 static const struct dev_pm_ops sx9310_pm_ops = {
1533 	SET_SYSTEM_SLEEP_PM_OPS(sx9310_suspend, sx9310_resume)
1534 };
1535 
1536 static const struct acpi_device_id sx9310_acpi_match[] = {
1537 	{ "STH9310", SX9310_WHOAMI_VALUE },
1538 	{ "STH9311", SX9311_WHOAMI_VALUE },
1539 	{}
1540 };
1541 MODULE_DEVICE_TABLE(acpi, sx9310_acpi_match);
1542 
1543 static const struct of_device_id sx9310_of_match[] = {
1544 	{ .compatible = "semtech,sx9310", (void *)SX9310_WHOAMI_VALUE },
1545 	{ .compatible = "semtech,sx9311", (void *)SX9311_WHOAMI_VALUE },
1546 	{}
1547 };
1548 MODULE_DEVICE_TABLE(of, sx9310_of_match);
1549 
1550 static const struct i2c_device_id sx9310_id[] = {
1551 	{ "sx9310", SX9310_WHOAMI_VALUE },
1552 	{ "sx9311", SX9311_WHOAMI_VALUE },
1553 	{}
1554 };
1555 MODULE_DEVICE_TABLE(i2c, sx9310_id);
1556 
1557 static struct i2c_driver sx9310_driver = {
1558 	.driver = {
1559 		.name	= "sx9310",
1560 		.acpi_match_table = sx9310_acpi_match,
1561 		.of_match_table = sx9310_of_match,
1562 		.pm = &sx9310_pm_ops,
1563 
1564 		/*
1565 		 * Lots of i2c transfers in probe + over 200 ms waiting in
1566 		 * sx9310_init_compensation() mean a slow probe; prefer async
1567 		 * so we don't delay boot if we're builtin to the kernel.
1568 		 */
1569 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1570 	},
1571 	.probe_new	= sx9310_probe,
1572 	.id_table	= sx9310_id,
1573 };
1574 module_i2c_driver(sx9310_driver);
1575 
1576 MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>");
1577 MODULE_AUTHOR("Daniel Campello <campello@chromium.org>");
1578 MODULE_DESCRIPTION("Driver for Semtech SX9310/SX9311 proximity sensor");
1579 MODULE_LICENSE("GPL v2");
1580