1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2018 Google LLC.
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>.
13 #include <linux/bitfield.h>
14 #include <linux/delay.h>
15 #include <linux/i2c.h>
16 #include <linux/interrupt.h>
17 #include <linux/kernel.h>
18 #include <linux/log2.h>
19 #include <linux/mod_devicetable.h>
20 #include <linux/module.h>
22 #include <linux/property.h>
23 #include <linux/regmap.h>
24 #include <linux/iio/iio.h>
26 #include "sx_common.h"
28 /* Register definitions. */
29 #define SX9310_REG_IRQ_SRC SX_COMMON_REG_IRQ_SRC
30 #define SX9310_REG_STAT0 0x01
31 #define SX9310_REG_STAT1 0x02
32 #define SX9310_REG_STAT1_COMPSTAT_MASK GENMASK(3, 0)
33 #define SX9310_REG_IRQ_MSK 0x03
34 #define SX9310_CONVDONE_IRQ BIT(3)
35 #define SX9310_FAR_IRQ BIT(5)
36 #define SX9310_CLOSE_IRQ BIT(6)
37 #define SX9310_REG_IRQ_FUNC 0x04
39 #define SX9310_REG_PROX_CTRL0 0x10
40 #define SX9310_REG_PROX_CTRL0_SENSOREN_MASK GENMASK(3, 0)
41 #define SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK GENMASK(7, 4)
42 #define SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS 0x01
43 #define SX9310_REG_PROX_CTRL1 0x11
44 #define SX9310_REG_PROX_CTRL2 0x12
45 #define SX9310_REG_PROX_CTRL2_COMBMODE_MASK GENMASK(7, 6)
46 #define SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3 (0x03 << 6)
47 #define SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2 (0x02 << 6)
48 #define SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1 (0x01 << 6)
49 #define SX9310_REG_PROX_CTRL2_COMBMODE_CS3 (0x00 << 6)
50 #define SX9310_REG_PROX_CTRL2_SHIELDEN_MASK GENMASK(3, 2)
51 #define SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC (0x01 << 2)
52 #define SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND (0x02 << 2)
53 #define SX9310_REG_PROX_CTRL3 0x13
54 #define SX9310_REG_PROX_CTRL3_GAIN0_MASK GENMASK(3, 2)
55 #define SX9310_REG_PROX_CTRL3_GAIN0_X8 (0x03 << 2)
56 #define SX9310_REG_PROX_CTRL3_GAIN12_MASK GENMASK(1, 0)
57 #define SX9310_REG_PROX_CTRL3_GAIN12_X4 0x02
58 #define SX9310_REG_PROX_CTRL4 0x14
59 #define SX9310_REG_PROX_CTRL4_RESOLUTION_MASK GENMASK(2, 0)
60 #define SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST 0x07
61 #define SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_FINE 0x06
62 #define SX9310_REG_PROX_CTRL4_RESOLUTION_FINE 0x05
63 #define SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM 0x04
64 #define SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM_COARSE 0x03
65 #define SX9310_REG_PROX_CTRL4_RESOLUTION_COARSE 0x02
66 #define SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_COARSE 0x01
67 #define SX9310_REG_PROX_CTRL4_RESOLUTION_COARSEST 0x00
68 #define SX9310_REG_PROX_CTRL5 0x15
69 #define SX9310_REG_PROX_CTRL5_RANGE_SMALL (0x03 << 6)
70 #define SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK GENMASK(3, 2)
71 #define SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 (0x01 << 2)
72 #define SX9310_REG_PROX_CTRL5_RAWFILT_MASK GENMASK(1, 0)
73 #define SX9310_REG_PROX_CTRL5_RAWFILT_SHIFT 0
74 #define SX9310_REG_PROX_CTRL5_RAWFILT_1P25 0x02
75 #define SX9310_REG_PROX_CTRL6 0x16
76 #define SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT 0x20
77 #define SX9310_REG_PROX_CTRL7 0x17
78 #define SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 (0x01 << 3)
79 #define SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK GENMASK(2, 0)
80 #define SX9310_REG_PROX_CTRL7_AVGPOSFILT_SHIFT 0
81 #define SX9310_REG_PROX_CTRL7_AVGPOSFILT_512 0x05
82 #define SX9310_REG_PROX_CTRL8 0x18
83 #define SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK GENMASK(7, 3)
84 #define SX9310_REG_PROX_CTRL9 0x19
85 #define SX9310_REG_PROX_CTRL8_9_PTHRESH_28 (0x08 << 3)
86 #define SX9310_REG_PROX_CTRL8_9_PTHRESH_96 (0x11 << 3)
87 #define SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900 0x03
88 #define SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500 0x05
89 #define SX9310_REG_PROX_CTRL10 0x1a
90 #define SX9310_REG_PROX_CTRL10_HYST_MASK GENMASK(5, 4)
91 #define SX9310_REG_PROX_CTRL10_HYST_6PCT (0x01 << 4)
92 #define SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK GENMASK(3, 2)
93 #define SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK GENMASK(1, 0)
94 #define SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2 0x01
95 #define SX9310_REG_PROX_CTRL11 0x1b
96 #define SX9310_REG_PROX_CTRL12 0x1c
97 #define SX9310_REG_PROX_CTRL13 0x1d
98 #define SX9310_REG_PROX_CTRL14 0x1e
99 #define SX9310_REG_PROX_CTRL15 0x1f
100 #define SX9310_REG_PROX_CTRL16 0x20
101 #define SX9310_REG_PROX_CTRL17 0x21
102 #define SX9310_REG_PROX_CTRL18 0x22
103 #define SX9310_REG_PROX_CTRL19 0x23
104 #define SX9310_REG_SAR_CTRL0 0x2a
105 #define SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES (0x02 << 5)
106 #define SX9310_REG_SAR_CTRL0_SARHYST_8 (0x02 << 3)
107 #define SX9310_REG_SAR_CTRL1 0x2b
108 /* Each increment of the slope register is 0.0078125. */
109 #define SX9310_REG_SAR_CTRL1_SLOPE(_hnslope) (_hnslope / 78125)
110 #define SX9310_REG_SAR_CTRL2 0x2c
111 #define SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT 0x3c
113 #define SX9310_REG_SENSOR_SEL 0x30
114 #define SX9310_REG_USE_MSB 0x31
115 #define SX9310_REG_USE_LSB 0x32
116 #define SX9310_REG_AVG_MSB 0x33
117 #define SX9310_REG_AVG_LSB 0x34
118 #define SX9310_REG_DIFF_MSB 0x35
119 #define SX9310_REG_DIFF_LSB 0x36
120 #define SX9310_REG_OFFSET_MSB 0x37
121 #define SX9310_REG_OFFSET_LSB 0x38
122 #define SX9310_REG_SAR_MSB 0x39
123 #define SX9310_REG_SAR_LSB 0x3a
124 #define SX9310_REG_I2C_ADDR 0x40
125 #define SX9310_REG_PAUSE 0x41
126 #define SX9310_REG_WHOAMI 0x42
127 #define SX9310_WHOAMI_VALUE 0x01
128 #define SX9311_WHOAMI_VALUE 0x02
129 #define SX9310_REG_RESET 0x7f
132 /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
133 #define SX9310_NUM_CHANNELS 4
134 static_assert(SX9310_NUM_CHANNELS <= SX_COMMON_MAX_NUM_CHANNELS);
136 #define SX9310_NAMED_CHANNEL(idx, name) \
138 .type = IIO_PROXIMITY, \
139 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
140 BIT(IIO_CHAN_INFO_HARDWAREGAIN), \
141 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
142 .info_mask_separate_available = \
143 BIT(IIO_CHAN_INFO_HARDWAREGAIN), \
144 .info_mask_shared_by_all_available = \
145 BIT(IIO_CHAN_INFO_SAMP_FREQ), \
148 .extend_name = name, \
149 .address = SX9310_REG_DIFF_MSB, \
150 .event_spec = sx_common_events, \
151 .num_event_specs = ARRAY_SIZE(sx_common_events), \
157 .endianness = IIO_BE, \
160 #define SX9310_CHANNEL(idx) SX9310_NAMED_CHANNEL(idx, NULL)
162 static const struct iio_chan_spec sx9310_channels[] = {
163 SX9310_CHANNEL(0), /* CS0 */
164 SX9310_CHANNEL(1), /* CS1 */
165 SX9310_CHANNEL(2), /* CS2 */
166 SX9310_NAMED_CHANNEL(3, "comb"), /* COMB */
168 IIO_CHAN_SOFT_TIMESTAMP(4),
172 * Each entry contains the integer part (val) and the fractional part, in micro
173 * seconds. It conforms to the IIO output IIO_VAL_INT_PLUS_MICRO.
175 static const struct {
178 } sx9310_samp_freq_table[] = {
179 { 500, 0 }, /* 0000: Min (no idle time) */
180 { 66, 666666 }, /* 0001: 15 ms */
181 { 33, 333333 }, /* 0010: 30 ms (Typ.) */
182 { 22, 222222 }, /* 0011: 45 ms */
183 { 16, 666666 }, /* 0100: 60 ms */
184 { 11, 111111 }, /* 0101: 90 ms */
185 { 8, 333333 }, /* 0110: 120 ms */
186 { 5, 0 }, /* 0111: 200 ms */
187 { 2, 500000 }, /* 1000: 400 ms */
188 { 1, 666666 }, /* 1001: 600 ms */
189 { 1, 250000 }, /* 1010: 800 ms */
190 { 1, 0 }, /* 1011: 1 s */
191 { 0, 500000 }, /* 1100: 2 s */
192 { 0, 333333 }, /* 1101: 3 s */
193 { 0, 250000 }, /* 1110: 4 s */
194 { 0, 200000 }, /* 1111: 5 s */
196 static const unsigned int sx9310_scan_period_table[] = {
197 2, 15, 30, 45, 60, 90, 120, 200,
198 400, 600, 800, 1000, 2000, 3000, 4000, 5000,
201 static const struct regmap_range sx9310_writable_reg_ranges[] = {
202 regmap_reg_range(SX9310_REG_IRQ_MSK, SX9310_REG_IRQ_FUNC),
203 regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
204 regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
205 regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SENSOR_SEL),
206 regmap_reg_range(SX9310_REG_OFFSET_MSB, SX9310_REG_OFFSET_LSB),
207 regmap_reg_range(SX9310_REG_PAUSE, SX9310_REG_PAUSE),
208 regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
211 static const struct regmap_access_table sx9310_writeable_regs = {
212 .yes_ranges = sx9310_writable_reg_ranges,
213 .n_yes_ranges = ARRAY_SIZE(sx9310_writable_reg_ranges),
216 static const struct regmap_range sx9310_readable_reg_ranges[] = {
217 regmap_reg_range(SX9310_REG_IRQ_SRC, SX9310_REG_IRQ_FUNC),
218 regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
219 regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
220 regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SAR_LSB),
221 regmap_reg_range(SX9310_REG_I2C_ADDR, SX9310_REG_WHOAMI),
222 regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
225 static const struct regmap_access_table sx9310_readable_regs = {
226 .yes_ranges = sx9310_readable_reg_ranges,
227 .n_yes_ranges = ARRAY_SIZE(sx9310_readable_reg_ranges),
230 static const struct regmap_range sx9310_volatile_reg_ranges[] = {
231 regmap_reg_range(SX9310_REG_IRQ_SRC, SX9310_REG_STAT1),
232 regmap_reg_range(SX9310_REG_USE_MSB, SX9310_REG_DIFF_LSB),
233 regmap_reg_range(SX9310_REG_SAR_MSB, SX9310_REG_SAR_LSB),
234 regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
237 static const struct regmap_access_table sx9310_volatile_regs = {
238 .yes_ranges = sx9310_volatile_reg_ranges,
239 .n_yes_ranges = ARRAY_SIZE(sx9310_volatile_reg_ranges),
242 static const struct regmap_config sx9310_regmap_config = {
246 .max_register = SX9310_REG_RESET,
247 .cache_type = REGCACHE_RBTREE,
249 .wr_table = &sx9310_writeable_regs,
250 .rd_table = &sx9310_readable_regs,
251 .volatile_table = &sx9310_volatile_regs,
254 static int sx9310_read_prox_data(struct sx_common_data *data,
255 const struct iio_chan_spec *chan, __be16 *val)
259 ret = regmap_write(data->regmap, SX9310_REG_SENSOR_SEL, chan->channel);
263 return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
267 * If we have no interrupt support, we have to wait for a scan period
268 * after enabling a channel to get a result.
270 static int sx9310_wait_for_sample(struct sx_common_data *data)
275 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &val);
279 val = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, val);
281 msleep(sx9310_scan_period_table[val]);
286 static int sx9310_read_gain(struct sx_common_data *data,
287 const struct iio_chan_spec *chan, int *val)
289 unsigned int regval, gain;
292 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL3, ®val);
296 switch (chan->channel) {
299 gain = FIELD_GET(SX9310_REG_PROX_CTRL3_GAIN0_MASK, regval);
303 gain = FIELD_GET(SX9310_REG_PROX_CTRL3_GAIN12_MASK, regval);
314 static int sx9310_read_samp_freq(struct sx_common_data *data, int *val, int *val2)
319 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, ®val);
323 regval = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, regval);
324 *val = sx9310_samp_freq_table[regval].val;
325 *val2 = sx9310_samp_freq_table[regval].val2;
327 return IIO_VAL_INT_PLUS_MICRO;
330 static int sx9310_read_raw(struct iio_dev *indio_dev,
331 const struct iio_chan_spec *chan, int *val,
332 int *val2, long mask)
334 struct sx_common_data *data = iio_priv(indio_dev);
337 if (chan->type != IIO_PROXIMITY)
341 case IIO_CHAN_INFO_RAW:
342 ret = iio_device_claim_direct_mode(indio_dev);
346 ret = sx_common_read_proximity(data, chan, val);
347 iio_device_release_direct_mode(indio_dev);
349 case IIO_CHAN_INFO_HARDWAREGAIN:
350 ret = iio_device_claim_direct_mode(indio_dev);
354 ret = sx9310_read_gain(data, chan, val);
355 iio_device_release_direct_mode(indio_dev);
357 case IIO_CHAN_INFO_SAMP_FREQ:
358 return sx9310_read_samp_freq(data, val, val2);
364 static const int sx9310_gain_vals[] = { 1, 2, 4, 8 };
366 static int sx9310_read_avail(struct iio_dev *indio_dev,
367 struct iio_chan_spec const *chan,
368 const int **vals, int *type, int *length,
371 if (chan->type != IIO_PROXIMITY)
375 case IIO_CHAN_INFO_HARDWAREGAIN:
377 *length = ARRAY_SIZE(sx9310_gain_vals);
378 *vals = sx9310_gain_vals;
379 return IIO_AVAIL_LIST;
380 case IIO_CHAN_INFO_SAMP_FREQ:
381 *type = IIO_VAL_INT_PLUS_MICRO;
382 *length = ARRAY_SIZE(sx9310_samp_freq_table) * 2;
383 *vals = (int *)sx9310_samp_freq_table;
384 return IIO_AVAIL_LIST;
390 static const unsigned int sx9310_pthresh_codes[] = {
391 2, 4, 6, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96, 112,
392 128, 144, 160, 192, 224, 256, 320, 384, 512, 640, 768, 1024, 1536
395 static int sx9310_get_thresh_reg(unsigned int channel)
400 return SX9310_REG_PROX_CTRL8;
403 return SX9310_REG_PROX_CTRL9;
409 static int sx9310_read_thresh(struct sx_common_data *data,
410 const struct iio_chan_spec *chan, int *val)
416 reg = ret = sx9310_get_thresh_reg(chan->channel);
420 ret = regmap_read(data->regmap, reg, ®val);
424 regval = FIELD_GET(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
425 if (regval >= ARRAY_SIZE(sx9310_pthresh_codes))
428 *val = sx9310_pthresh_codes[regval];
432 static int sx9310_read_hysteresis(struct sx_common_data *data,
433 const struct iio_chan_spec *chan, int *val)
435 unsigned int regval, pthresh;
438 ret = sx9310_read_thresh(data, chan, &pthresh);
442 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val);
446 regval = FIELD_GET(SX9310_REG_PROX_CTRL10_HYST_MASK, regval);
450 /* regval is at most 5 */
451 *val = pthresh >> (5 - regval);
456 static int sx9310_read_far_debounce(struct sx_common_data *data, int *val)
461 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val);
465 regval = FIELD_GET(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, regval);
474 static int sx9310_read_close_debounce(struct sx_common_data *data, int *val)
479 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, ®val);
483 regval = FIELD_GET(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, regval);
492 static int sx9310_read_event_val(struct iio_dev *indio_dev,
493 const struct iio_chan_spec *chan,
494 enum iio_event_type type,
495 enum iio_event_direction dir,
496 enum iio_event_info info, int *val, int *val2)
498 struct sx_common_data *data = iio_priv(indio_dev);
500 if (chan->type != IIO_PROXIMITY)
504 case IIO_EV_INFO_VALUE:
505 return sx9310_read_thresh(data, chan, val);
506 case IIO_EV_INFO_PERIOD:
508 case IIO_EV_DIR_RISING:
509 return sx9310_read_far_debounce(data, val);
510 case IIO_EV_DIR_FALLING:
511 return sx9310_read_close_debounce(data, val);
515 case IIO_EV_INFO_HYSTERESIS:
516 return sx9310_read_hysteresis(data, chan, val);
522 static int sx9310_write_thresh(struct sx_common_data *data,
523 const struct iio_chan_spec *chan, int val)
529 reg = ret = sx9310_get_thresh_reg(chan->channel);
533 for (i = 0; i < ARRAY_SIZE(sx9310_pthresh_codes); i++) {
534 if (sx9310_pthresh_codes[i] == val) {
540 if (i == ARRAY_SIZE(sx9310_pthresh_codes))
543 regval = FIELD_PREP(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
544 mutex_lock(&data->mutex);
545 ret = regmap_update_bits(data->regmap, reg,
546 SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
547 mutex_unlock(&data->mutex);
552 static int sx9310_write_hysteresis(struct sx_common_data *data,
553 const struct iio_chan_spec *chan, int _val)
555 unsigned int hyst, val = _val;
558 ret = sx9310_read_thresh(data, chan, &pthresh);
564 else if (val == pthresh >> 2)
566 else if (val == pthresh >> 3)
568 else if (val == pthresh >> 4)
573 hyst = FIELD_PREP(SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
574 mutex_lock(&data->mutex);
575 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
576 SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
577 mutex_unlock(&data->mutex);
582 static int sx9310_write_far_debounce(struct sx_common_data *data, int val)
589 if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val))
592 regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val);
594 mutex_lock(&data->mutex);
595 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
596 SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK,
598 mutex_unlock(&data->mutex);
603 static int sx9310_write_close_debounce(struct sx_common_data *data, int val)
610 if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val))
613 regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val);
615 mutex_lock(&data->mutex);
616 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
617 SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK,
619 mutex_unlock(&data->mutex);
624 static int sx9310_write_event_val(struct iio_dev *indio_dev,
625 const struct iio_chan_spec *chan,
626 enum iio_event_type type,
627 enum iio_event_direction dir,
628 enum iio_event_info info, int val, int val2)
630 struct sx_common_data *data = iio_priv(indio_dev);
632 if (chan->type != IIO_PROXIMITY)
636 case IIO_EV_INFO_VALUE:
637 return sx9310_write_thresh(data, chan, val);
638 case IIO_EV_INFO_PERIOD:
640 case IIO_EV_DIR_RISING:
641 return sx9310_write_far_debounce(data, val);
642 case IIO_EV_DIR_FALLING:
643 return sx9310_write_close_debounce(data, val);
647 case IIO_EV_INFO_HYSTERESIS:
648 return sx9310_write_hysteresis(data, chan, val);
654 static int sx9310_set_samp_freq(struct sx_common_data *data, int val, int val2)
658 for (i = 0; i < ARRAY_SIZE(sx9310_samp_freq_table); i++)
659 if (val == sx9310_samp_freq_table[i].val &&
660 val2 == sx9310_samp_freq_table[i].val2)
663 if (i == ARRAY_SIZE(sx9310_samp_freq_table))
666 mutex_lock(&data->mutex);
668 ret = regmap_update_bits(
669 data->regmap, SX9310_REG_PROX_CTRL0,
670 SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK,
671 FIELD_PREP(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, i));
673 mutex_unlock(&data->mutex);
678 static int sx9310_write_gain(struct sx_common_data *data,
679 const struct iio_chan_spec *chan, int val)
681 unsigned int gain, mask;
686 switch (chan->channel) {
689 mask = SX9310_REG_PROX_CTRL3_GAIN0_MASK;
690 gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN0_MASK, gain);
694 mask = SX9310_REG_PROX_CTRL3_GAIN12_MASK;
695 gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN12_MASK, gain);
701 mutex_lock(&data->mutex);
702 ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL3, mask,
704 mutex_unlock(&data->mutex);
709 static int sx9310_write_raw(struct iio_dev *indio_dev,
710 const struct iio_chan_spec *chan, int val, int val2,
713 struct sx_common_data *data = iio_priv(indio_dev);
715 if (chan->type != IIO_PROXIMITY)
719 case IIO_CHAN_INFO_SAMP_FREQ:
720 return sx9310_set_samp_freq(data, val, val2);
721 case IIO_CHAN_INFO_HARDWAREGAIN:
722 return sx9310_write_gain(data, chan, val);
728 static const struct sx_common_reg_default sx9310_default_regs[] = {
729 { SX9310_REG_IRQ_MSK, 0x00 },
730 { SX9310_REG_IRQ_FUNC, 0x00 },
732 * The lower 4 bits should not be set as it enable sensors measurements.
733 * Turning the detection on before the configuration values are set to
734 * good values can cause the device to return erroneous readings.
736 { SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS },
737 { SX9310_REG_PROX_CTRL1, 0x00 },
738 { SX9310_REG_PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2 |
739 SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC },
740 { SX9310_REG_PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
741 SX9310_REG_PROX_CTRL3_GAIN12_X4 },
742 { SX9310_REG_PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST },
743 { SX9310_REG_PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
744 SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
745 SX9310_REG_PROX_CTRL5_RAWFILT_1P25 },
746 { SX9310_REG_PROX_CTRL6, SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT },
747 { SX9310_REG_PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
748 SX9310_REG_PROX_CTRL7_AVGPOSFILT_512 },
749 { SX9310_REG_PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
750 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500 },
751 { SX9310_REG_PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH_28 |
752 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900 },
753 { SX9310_REG_PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
754 SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2 },
755 { SX9310_REG_PROX_CTRL11, 0x00 },
756 { SX9310_REG_PROX_CTRL12, 0x00 },
757 { SX9310_REG_PROX_CTRL13, 0x00 },
758 { SX9310_REG_PROX_CTRL14, 0x00 },
759 { SX9310_REG_PROX_CTRL15, 0x00 },
760 { SX9310_REG_PROX_CTRL16, 0x00 },
761 { SX9310_REG_PROX_CTRL17, 0x00 },
762 { SX9310_REG_PROX_CTRL18, 0x00 },
763 { SX9310_REG_PROX_CTRL19, 0x00 },
764 { SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
765 SX9310_REG_SAR_CTRL0_SARHYST_8 },
766 { SX9310_REG_SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250) },
767 { SX9310_REG_SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT },
770 /* Activate all channels and perform an initial compensation. */
771 static int sx9310_init_compensation(struct iio_dev *indio_dev)
773 struct sx_common_data *data = iio_priv(indio_dev);
778 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &ctrl0);
782 /* run the compensation phase on all channels */
783 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
784 ctrl0 | SX9310_REG_PROX_CTRL0_SENSOREN_MASK);
788 ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val,
789 !(val & SX9310_REG_STAT1_COMPSTAT_MASK),
794 regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
798 static const struct sx_common_reg_default *
799 sx9310_get_default_reg(struct device *dev, int idx,
800 struct sx_common_reg_default *reg_def)
802 u32 combined[SX9310_NUM_CHANNELS];
803 u32 start = 0, raw = 0, pos = 0;
804 unsigned long comb_mask = 0;
808 memcpy(reg_def, &sx9310_default_regs[idx], sizeof(*reg_def));
809 switch (reg_def->reg) {
810 case SX9310_REG_PROX_CTRL2:
811 if (device_property_read_bool(dev, "semtech,cs0-ground")) {
812 reg_def->def &= ~SX9310_REG_PROX_CTRL2_SHIELDEN_MASK;
813 reg_def->def |= SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND;
816 count = device_property_count_u32(dev, "semtech,combined-sensors");
817 if (count < 0 || count > ARRAY_SIZE(combined))
819 ret = device_property_read_u32_array(dev, "semtech,combined-sensors",
824 for (i = 0; i < count; i++)
825 comb_mask |= BIT(combined[i]);
827 reg_def->def &= ~SX9310_REG_PROX_CTRL2_COMBMODE_MASK;
828 if (comb_mask == (BIT(3) | BIT(2) | BIT(1) | BIT(0)))
829 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3;
830 else if (comb_mask == (BIT(1) | BIT(2)))
831 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2;
832 else if (comb_mask == (BIT(0) | BIT(1)))
833 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1;
834 else if (comb_mask == BIT(3))
835 reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS3;
838 case SX9310_REG_PROX_CTRL4:
839 ret = device_property_read_string(dev, "semtech,resolution", &res);
843 reg_def->def &= ~SX9310_REG_PROX_CTRL4_RESOLUTION_MASK;
844 if (!strcmp(res, "coarsest"))
845 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSEST;
846 else if (!strcmp(res, "very-coarse"))
847 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_COARSE;
848 else if (!strcmp(res, "coarse"))
849 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSE;
850 else if (!strcmp(res, "medium-coarse"))
851 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM_COARSE;
852 else if (!strcmp(res, "medium"))
853 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM;
854 else if (!strcmp(res, "fine"))
855 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINE;
856 else if (!strcmp(res, "very-fine"))
857 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_FINE;
858 else if (!strcmp(res, "finest"))
859 reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST;
862 case SX9310_REG_PROX_CTRL5:
863 ret = device_property_read_u32(dev, "semtech,startup-sensor", &start);
865 start = FIELD_GET(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK,
869 reg_def->def &= ~SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK;
870 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK,
873 ret = device_property_read_u32(dev, "semtech,proxraw-strength", &raw);
875 raw = FIELD_GET(SX9310_REG_PROX_CTRL5_RAWFILT_MASK,
881 reg_def->def &= ~SX9310_REG_PROX_CTRL5_RAWFILT_MASK;
882 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_RAWFILT_MASK,
885 case SX9310_REG_PROX_CTRL7:
886 ret = device_property_read_u32(dev, "semtech,avg-pos-strength", &pos);
890 /* Powers of 2, except for a gap between 16 and 64 */
891 pos = clamp(ilog2(pos), 3, 11) - (pos >= 32 ? 4 : 3);
892 reg_def->def &= ~SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK;
893 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK,
901 static int sx9310_check_whoami(struct device *dev,
902 struct iio_dev *indio_dev)
904 struct sx_common_data *data = iio_priv(indio_dev);
905 unsigned int long ddata;
909 ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &whoami);
913 ddata = (uintptr_t)device_get_match_data(dev);
918 case SX9310_WHOAMI_VALUE:
919 indio_dev->name = "sx9310";
921 case SX9311_WHOAMI_VALUE:
922 indio_dev->name = "sx9311";
931 static const struct sx_common_chip_info sx9310_chip_info = {
932 .reg_stat = SX9310_REG_STAT0,
933 .reg_irq_msk = SX9310_REG_IRQ_MSK,
934 .reg_enable_chan = SX9310_REG_PROX_CTRL0,
935 .reg_reset = SX9310_REG_RESET,
937 .mask_enable_chan = SX9310_REG_STAT1_COMPSTAT_MASK,
939 .num_channels = SX9310_NUM_CHANNELS,
940 .num_default_regs = ARRAY_SIZE(sx9310_default_regs),
943 .read_prox_data = sx9310_read_prox_data,
944 .check_whoami = sx9310_check_whoami,
945 .init_compensation = sx9310_init_compensation,
946 .wait_for_sample = sx9310_wait_for_sample,
947 .get_default_reg = sx9310_get_default_reg,
950 .iio_channels = sx9310_channels,
951 .num_iio_channels = ARRAY_SIZE(sx9310_channels),
953 .read_raw = sx9310_read_raw,
954 .read_avail = sx9310_read_avail,
955 .read_event_value = sx9310_read_event_val,
956 .write_event_value = sx9310_write_event_val,
957 .write_raw = sx9310_write_raw,
958 .read_event_config = sx_common_read_event_config,
959 .write_event_config = sx_common_write_event_config,
963 static int sx9310_probe(struct i2c_client *client)
965 return sx_common_probe(client, &sx9310_chip_info, &sx9310_regmap_config);
968 static int sx9310_suspend(struct device *dev)
970 struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
974 disable_irq_nosync(data->client->irq);
976 mutex_lock(&data->mutex);
977 ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0,
978 &data->suspend_ctrl);
982 ctrl0 = data->suspend_ctrl & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK;
983 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
987 ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 0);
990 mutex_unlock(&data->mutex);
994 static int sx9310_resume(struct device *dev)
996 struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
999 mutex_lock(&data->mutex);
1000 ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1);
1004 ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
1005 data->suspend_ctrl);
1008 mutex_unlock(&data->mutex);
1012 enable_irq(data->client->irq);
1016 static DEFINE_SIMPLE_DEV_PM_OPS(sx9310_pm_ops, sx9310_suspend, sx9310_resume);
1018 static const struct acpi_device_id sx9310_acpi_match[] = {
1019 { "STH9310", SX9310_WHOAMI_VALUE },
1020 { "STH9311", SX9311_WHOAMI_VALUE },
1023 MODULE_DEVICE_TABLE(acpi, sx9310_acpi_match);
1025 static const struct of_device_id sx9310_of_match[] = {
1026 { .compatible = "semtech,sx9310", (void *)SX9310_WHOAMI_VALUE },
1027 { .compatible = "semtech,sx9311", (void *)SX9311_WHOAMI_VALUE },
1030 MODULE_DEVICE_TABLE(of, sx9310_of_match);
1032 static const struct i2c_device_id sx9310_id[] = {
1033 { "sx9310", SX9310_WHOAMI_VALUE },
1034 { "sx9311", SX9311_WHOAMI_VALUE },
1037 MODULE_DEVICE_TABLE(i2c, sx9310_id);
1039 static struct i2c_driver sx9310_driver = {
1042 .acpi_match_table = sx9310_acpi_match,
1043 .of_match_table = sx9310_of_match,
1044 .pm = pm_sleep_ptr(&sx9310_pm_ops),
1047 * Lots of i2c transfers in probe + over 200 ms waiting in
1048 * sx9310_init_compensation() mean a slow probe; prefer async
1049 * so we don't delay boot if we're builtin to the kernel.
1051 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
1053 .probe_new = sx9310_probe,
1054 .id_table = sx9310_id,
1056 module_i2c_driver(sx9310_driver);
1060 MODULE_DESCRIPTION("Driver for Semtech SX9310/SX9311 proximity sensor");
1061 MODULE_LICENSE("GPL v2");
1062 MODULE_IMPORT_NS(SEMTECH_PROX);