GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / iio / proximity / sx9310.c
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/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>
21 #include <linux/pm.h>
22 #include <linux/property.h>
23 #include <linux/regmap.h>
24 #include <linux/iio/iio.h>
25
26 #include "sx_common.h"
27
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
38
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
112
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
130
131
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);
135
136 #define SX9310_NAMED_CHANNEL(idx, name)                          \
137 {                                                                \
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),                    \
146         .indexed = 1,                                            \
147         .channel = idx,                                          \
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),         \
152         .scan_index = idx,                                       \
153         .scan_type = {                                           \
154                 .sign = 's',                                     \
155                 .realbits = 12,                                  \
156                 .storagebits = 16,                               \
157                 .endianness = IIO_BE,                            \
158         },                                                       \
159 }
160 #define SX9310_CHANNEL(idx) SX9310_NAMED_CHANNEL(idx, NULL)
161
162 struct sx931x_info {
163         const char *name;
164         unsigned int whoami;
165 };
166
167 static const struct iio_chan_spec sx9310_channels[] = {
168         SX9310_CHANNEL(0),                      /* CS0 */
169         SX9310_CHANNEL(1),                      /* CS1 */
170         SX9310_CHANNEL(2),                      /* CS2 */
171         SX9310_NAMED_CHANNEL(3, "comb"),        /* COMB */
172
173         IIO_CHAN_SOFT_TIMESTAMP(4),
174 };
175
176 /*
177  * Each entry contains the integer part (val) and the fractional part, in micro
178  * seconds. It conforms to the IIO output IIO_VAL_INT_PLUS_MICRO.
179  */
180 static const struct {
181         int val;
182         int val2;
183 } sx9310_samp_freq_table[] = {
184         { 500, 0 }, /* 0000: Min (no idle time) */
185         { 66, 666666 }, /* 0001: 15 ms */
186         { 33, 333333 }, /* 0010: 30 ms (Typ.) */
187         { 22, 222222 }, /* 0011: 45 ms */
188         { 16, 666666 }, /* 0100: 60 ms */
189         { 11, 111111 }, /* 0101: 90 ms */
190         { 8, 333333 }, /* 0110: 120 ms */
191         { 5, 0 }, /* 0111: 200 ms */
192         { 2, 500000 }, /* 1000: 400 ms */
193         { 1, 666666 }, /* 1001: 600 ms */
194         { 1, 250000 }, /* 1010: 800 ms */
195         { 1, 0 }, /* 1011: 1 s */
196         { 0, 500000 }, /* 1100: 2 s */
197         { 0, 333333 }, /* 1101: 3 s */
198         { 0, 250000 }, /* 1110: 4 s */
199         { 0, 200000 }, /* 1111: 5 s */
200 };
201 static const unsigned int sx9310_scan_period_table[] = {
202         2,   15,  30,  45,   60,   90,   120,  200,
203         400, 600, 800, 1000, 2000, 3000, 4000, 5000,
204 };
205
206 static const struct regmap_range sx9310_writable_reg_ranges[] = {
207         regmap_reg_range(SX9310_REG_IRQ_MSK, SX9310_REG_IRQ_FUNC),
208         regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
209         regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
210         regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SENSOR_SEL),
211         regmap_reg_range(SX9310_REG_OFFSET_MSB, SX9310_REG_OFFSET_LSB),
212         regmap_reg_range(SX9310_REG_PAUSE, SX9310_REG_PAUSE),
213         regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
214 };
215
216 static const struct regmap_access_table sx9310_writeable_regs = {
217         .yes_ranges = sx9310_writable_reg_ranges,
218         .n_yes_ranges = ARRAY_SIZE(sx9310_writable_reg_ranges),
219 };
220
221 static const struct regmap_range sx9310_readable_reg_ranges[] = {
222         regmap_reg_range(SX9310_REG_IRQ_SRC, SX9310_REG_IRQ_FUNC),
223         regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
224         regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
225         regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SAR_LSB),
226         regmap_reg_range(SX9310_REG_I2C_ADDR, SX9310_REG_WHOAMI),
227         regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
228 };
229
230 static const struct regmap_access_table sx9310_readable_regs = {
231         .yes_ranges = sx9310_readable_reg_ranges,
232         .n_yes_ranges = ARRAY_SIZE(sx9310_readable_reg_ranges),
233 };
234
235 static const struct regmap_range sx9310_volatile_reg_ranges[] = {
236         regmap_reg_range(SX9310_REG_IRQ_SRC, SX9310_REG_STAT1),
237         regmap_reg_range(SX9310_REG_USE_MSB, SX9310_REG_DIFF_LSB),
238         regmap_reg_range(SX9310_REG_SAR_MSB, SX9310_REG_SAR_LSB),
239         regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
240 };
241
242 static const struct regmap_access_table sx9310_volatile_regs = {
243         .yes_ranges = sx9310_volatile_reg_ranges,
244         .n_yes_ranges = ARRAY_SIZE(sx9310_volatile_reg_ranges),
245 };
246
247 static const struct regmap_config sx9310_regmap_config = {
248         .reg_bits = 8,
249         .val_bits = 8,
250
251         .max_register = SX9310_REG_RESET,
252         .cache_type = REGCACHE_RBTREE,
253
254         .wr_table = &sx9310_writeable_regs,
255         .rd_table = &sx9310_readable_regs,
256         .volatile_table = &sx9310_volatile_regs,
257 };
258
259 static int sx9310_read_prox_data(struct sx_common_data *data,
260                                  const struct iio_chan_spec *chan, __be16 *val)
261 {
262         int ret;
263
264         ret = regmap_write(data->regmap, SX9310_REG_SENSOR_SEL, chan->channel);
265         if (ret)
266                 return ret;
267
268         return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
269 }
270
271 /*
272  * If we have no interrupt support, we have to wait for a scan period
273  * after enabling a channel to get a result.
274  */
275 static int sx9310_wait_for_sample(struct sx_common_data *data)
276 {
277         int ret;
278         unsigned int val;
279
280         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &val);
281         if (ret)
282                 return ret;
283
284         val = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, val);
285
286         msleep(sx9310_scan_period_table[val]);
287
288         return 0;
289 }
290
291 static int sx9310_read_gain(struct sx_common_data *data,
292                             const struct iio_chan_spec *chan, int *val)
293 {
294         unsigned int regval, gain;
295         int ret;
296
297         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL3, &regval);
298         if (ret)
299                 return ret;
300
301         switch (chan->channel) {
302         case 0:
303         case 3:
304                 gain = FIELD_GET(SX9310_REG_PROX_CTRL3_GAIN0_MASK, regval);
305                 break;
306         case 1:
307         case 2:
308                 gain = FIELD_GET(SX9310_REG_PROX_CTRL3_GAIN12_MASK, regval);
309                 break;
310         default:
311                 return -EINVAL;
312         }
313
314         *val = 1 << gain;
315
316         return IIO_VAL_INT;
317 }
318
319 static int sx9310_read_samp_freq(struct sx_common_data *data, int *val, int *val2)
320 {
321         unsigned int regval;
322         int ret;
323
324         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &regval);
325         if (ret)
326                 return ret;
327
328         regval = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, regval);
329         *val = sx9310_samp_freq_table[regval].val;
330         *val2 = sx9310_samp_freq_table[regval].val2;
331
332         return IIO_VAL_INT_PLUS_MICRO;
333 }
334
335 static int sx9310_read_raw(struct iio_dev *indio_dev,
336                            const struct iio_chan_spec *chan, int *val,
337                            int *val2, long mask)
338 {
339         struct sx_common_data *data = iio_priv(indio_dev);
340         int ret;
341
342         if (chan->type != IIO_PROXIMITY)
343                 return -EINVAL;
344
345         switch (mask) {
346         case IIO_CHAN_INFO_RAW:
347                 ret = iio_device_claim_direct_mode(indio_dev);
348                 if (ret)
349                         return ret;
350
351                 ret = sx_common_read_proximity(data, chan, val);
352                 iio_device_release_direct_mode(indio_dev);
353                 return ret;
354         case IIO_CHAN_INFO_HARDWAREGAIN:
355                 ret = iio_device_claim_direct_mode(indio_dev);
356                 if (ret)
357                         return ret;
358
359                 ret = sx9310_read_gain(data, chan, val);
360                 iio_device_release_direct_mode(indio_dev);
361                 return ret;
362         case IIO_CHAN_INFO_SAMP_FREQ:
363                 return sx9310_read_samp_freq(data, val, val2);
364         default:
365                 return -EINVAL;
366         }
367 }
368
369 static const int sx9310_gain_vals[] = { 1, 2, 4, 8 };
370
371 static int sx9310_read_avail(struct iio_dev *indio_dev,
372                              struct iio_chan_spec const *chan,
373                              const int **vals, int *type, int *length,
374                              long mask)
375 {
376         if (chan->type != IIO_PROXIMITY)
377                 return -EINVAL;
378
379         switch (mask) {
380         case IIO_CHAN_INFO_HARDWAREGAIN:
381                 *type = IIO_VAL_INT;
382                 *length = ARRAY_SIZE(sx9310_gain_vals);
383                 *vals = sx9310_gain_vals;
384                 return IIO_AVAIL_LIST;
385         case IIO_CHAN_INFO_SAMP_FREQ:
386                 *type = IIO_VAL_INT_PLUS_MICRO;
387                 *length = ARRAY_SIZE(sx9310_samp_freq_table) * 2;
388                 *vals = (int *)sx9310_samp_freq_table;
389                 return IIO_AVAIL_LIST;
390         default:
391                 return -EINVAL;
392         }
393 }
394
395 static const unsigned int sx9310_pthresh_codes[] = {
396         2, 4, 6, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96, 112,
397         128, 144, 160, 192, 224, 256, 320, 384, 512, 640, 768, 1024, 1536
398 };
399
400 static int sx9310_get_thresh_reg(unsigned int channel)
401 {
402         switch (channel) {
403         case 0:
404         case 3:
405                 return SX9310_REG_PROX_CTRL8;
406         case 1:
407         case 2:
408                 return SX9310_REG_PROX_CTRL9;
409         default:
410                 return -EINVAL;
411         }
412 }
413
414 static int sx9310_read_thresh(struct sx_common_data *data,
415                               const struct iio_chan_spec *chan, int *val)
416 {
417         unsigned int reg;
418         unsigned int regval;
419         int ret;
420
421         reg = ret = sx9310_get_thresh_reg(chan->channel);
422         if (ret < 0)
423                 return ret;
424
425         ret = regmap_read(data->regmap, reg, &regval);
426         if (ret)
427                 return ret;
428
429         regval = FIELD_GET(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
430         if (regval >= ARRAY_SIZE(sx9310_pthresh_codes))
431                 return -EINVAL;
432
433         *val = sx9310_pthresh_codes[regval];
434         return IIO_VAL_INT;
435 }
436
437 static int sx9310_read_hysteresis(struct sx_common_data *data,
438                                   const struct iio_chan_spec *chan, int *val)
439 {
440         unsigned int regval, pthresh;
441         int ret;
442
443         ret = sx9310_read_thresh(data, chan, &pthresh);
444         if (ret < 0)
445                 return ret;
446
447         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, &regval);
448         if (ret)
449                 return ret;
450
451         regval = FIELD_GET(SX9310_REG_PROX_CTRL10_HYST_MASK, regval);
452         if (!regval)
453                 regval = 5;
454
455         /* regval is at most 5 */
456         *val = pthresh >> (5 - regval);
457
458         return IIO_VAL_INT;
459 }
460
461 static int sx9310_read_far_debounce(struct sx_common_data *data, int *val)
462 {
463         unsigned int regval;
464         int ret;
465
466         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, &regval);
467         if (ret)
468                 return ret;
469
470         regval = FIELD_GET(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, regval);
471         if (regval)
472                 *val = 1 << regval;
473         else
474                 *val = 0;
475
476         return IIO_VAL_INT;
477 }
478
479 static int sx9310_read_close_debounce(struct sx_common_data *data, int *val)
480 {
481         unsigned int regval;
482         int ret;
483
484         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL10, &regval);
485         if (ret)
486                 return ret;
487
488         regval = FIELD_GET(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, regval);
489         if (regval)
490                 *val = 1 << regval;
491         else
492                 *val = 0;
493
494         return IIO_VAL_INT;
495 }
496
497 static int sx9310_read_event_val(struct iio_dev *indio_dev,
498                                  const struct iio_chan_spec *chan,
499                                  enum iio_event_type type,
500                                  enum iio_event_direction dir,
501                                  enum iio_event_info info, int *val, int *val2)
502 {
503         struct sx_common_data *data = iio_priv(indio_dev);
504
505         if (chan->type != IIO_PROXIMITY)
506                 return -EINVAL;
507
508         switch (info) {
509         case IIO_EV_INFO_VALUE:
510                 return sx9310_read_thresh(data, chan, val);
511         case IIO_EV_INFO_PERIOD:
512                 switch (dir) {
513                 case IIO_EV_DIR_RISING:
514                         return sx9310_read_far_debounce(data, val);
515                 case IIO_EV_DIR_FALLING:
516                         return sx9310_read_close_debounce(data, val);
517                 default:
518                         return -EINVAL;
519                 }
520         case IIO_EV_INFO_HYSTERESIS:
521                 return sx9310_read_hysteresis(data, chan, val);
522         default:
523                 return -EINVAL;
524         }
525 }
526
527 static int sx9310_write_thresh(struct sx_common_data *data,
528                                const struct iio_chan_spec *chan, int val)
529 {
530         unsigned int reg;
531         unsigned int regval;
532         int ret, i;
533
534         reg = ret = sx9310_get_thresh_reg(chan->channel);
535         if (ret < 0)
536                 return ret;
537
538         for (i = 0; i < ARRAY_SIZE(sx9310_pthresh_codes); i++) {
539                 if (sx9310_pthresh_codes[i] == val) {
540                         regval = i;
541                         break;
542                 }
543         }
544
545         if (i == ARRAY_SIZE(sx9310_pthresh_codes))
546                 return -EINVAL;
547
548         regval = FIELD_PREP(SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
549         mutex_lock(&data->mutex);
550         ret = regmap_update_bits(data->regmap, reg,
551                                  SX9310_REG_PROX_CTRL8_9_PTHRESH_MASK, regval);
552         mutex_unlock(&data->mutex);
553
554         return ret;
555 }
556
557 static int sx9310_write_hysteresis(struct sx_common_data *data,
558                                    const struct iio_chan_spec *chan, int _val)
559 {
560         unsigned int hyst, val = _val;
561         int ret, pthresh;
562
563         ret = sx9310_read_thresh(data, chan, &pthresh);
564         if (ret < 0)
565                 return ret;
566
567         if (val == 0)
568                 hyst = 0;
569         else if (val == pthresh >> 2)
570                 hyst = 3;
571         else if (val == pthresh >> 3)
572                 hyst = 2;
573         else if (val == pthresh >> 4)
574                 hyst = 1;
575         else
576                 return -EINVAL;
577
578         hyst = FIELD_PREP(SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
579         mutex_lock(&data->mutex);
580         ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
581                                  SX9310_REG_PROX_CTRL10_HYST_MASK, hyst);
582         mutex_unlock(&data->mutex);
583
584         return ret;
585 }
586
587 static int sx9310_write_far_debounce(struct sx_common_data *data, int val)
588 {
589         int ret;
590         unsigned int regval;
591
592         if (val > 0)
593                 val = ilog2(val);
594         if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val))
595                 return -EINVAL;
596
597         regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val);
598
599         mutex_lock(&data->mutex);
600         ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
601                                  SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK,
602                                  regval);
603         mutex_unlock(&data->mutex);
604
605         return ret;
606 }
607
608 static int sx9310_write_close_debounce(struct sx_common_data *data, int val)
609 {
610         int ret;
611         unsigned int regval;
612
613         if (val > 0)
614                 val = ilog2(val);
615         if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val))
616                 return -EINVAL;
617
618         regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val);
619
620         mutex_lock(&data->mutex);
621         ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL10,
622                                  SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK,
623                                  regval);
624         mutex_unlock(&data->mutex);
625
626         return ret;
627 }
628
629 static int sx9310_write_event_val(struct iio_dev *indio_dev,
630                                   const struct iio_chan_spec *chan,
631                                   enum iio_event_type type,
632                                   enum iio_event_direction dir,
633                                   enum iio_event_info info, int val, int val2)
634 {
635         struct sx_common_data *data = iio_priv(indio_dev);
636
637         if (chan->type != IIO_PROXIMITY)
638                 return -EINVAL;
639
640         switch (info) {
641         case IIO_EV_INFO_VALUE:
642                 return sx9310_write_thresh(data, chan, val);
643         case IIO_EV_INFO_PERIOD:
644                 switch (dir) {
645                 case IIO_EV_DIR_RISING:
646                         return sx9310_write_far_debounce(data, val);
647                 case IIO_EV_DIR_FALLING:
648                         return sx9310_write_close_debounce(data, val);
649                 default:
650                         return -EINVAL;
651                 }
652         case IIO_EV_INFO_HYSTERESIS:
653                 return sx9310_write_hysteresis(data, chan, val);
654         default:
655                 return -EINVAL;
656         }
657 }
658
659 static int sx9310_set_samp_freq(struct sx_common_data *data, int val, int val2)
660 {
661         int i, ret;
662
663         for (i = 0; i < ARRAY_SIZE(sx9310_samp_freq_table); i++)
664                 if (val == sx9310_samp_freq_table[i].val &&
665                     val2 == sx9310_samp_freq_table[i].val2)
666                         break;
667
668         if (i == ARRAY_SIZE(sx9310_samp_freq_table))
669                 return -EINVAL;
670
671         mutex_lock(&data->mutex);
672
673         ret = regmap_update_bits(
674                 data->regmap, SX9310_REG_PROX_CTRL0,
675                 SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK,
676                 FIELD_PREP(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, i));
677
678         mutex_unlock(&data->mutex);
679
680         return ret;
681 }
682
683 static int sx9310_write_gain(struct sx_common_data *data,
684                              const struct iio_chan_spec *chan, int val)
685 {
686         unsigned int gain, mask;
687         int ret;
688
689         gain = ilog2(val);
690
691         switch (chan->channel) {
692         case 0:
693         case 3:
694                 mask = SX9310_REG_PROX_CTRL3_GAIN0_MASK;
695                 gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN0_MASK, gain);
696                 break;
697         case 1:
698         case 2:
699                 mask = SX9310_REG_PROX_CTRL3_GAIN12_MASK;
700                 gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN12_MASK, gain);
701                 break;
702         default:
703                 return -EINVAL;
704         }
705
706         mutex_lock(&data->mutex);
707         ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL3, mask,
708                                  gain);
709         mutex_unlock(&data->mutex);
710
711         return ret;
712 }
713
714 static int sx9310_write_raw(struct iio_dev *indio_dev,
715                             const struct iio_chan_spec *chan, int val, int val2,
716                             long mask)
717 {
718         struct sx_common_data *data = iio_priv(indio_dev);
719
720         if (chan->type != IIO_PROXIMITY)
721                 return -EINVAL;
722
723         switch (mask) {
724         case IIO_CHAN_INFO_SAMP_FREQ:
725                 return sx9310_set_samp_freq(data, val, val2);
726         case IIO_CHAN_INFO_HARDWAREGAIN:
727                 return sx9310_write_gain(data, chan, val);
728         default:
729                 return -EINVAL;
730         }
731 }
732
733 static const struct sx_common_reg_default sx9310_default_regs[] = {
734         { SX9310_REG_IRQ_MSK, 0x00 },
735         { SX9310_REG_IRQ_FUNC, 0x00 },
736         /*
737          * The lower 4 bits should not be set as it enable sensors measurements.
738          * Turning the detection on before the configuration values are set to
739          * good values can cause the device to return erroneous readings.
740          */
741         { SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS },
742         { SX9310_REG_PROX_CTRL1, 0x00 },
743         { SX9310_REG_PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2 |
744                                  SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC },
745         { SX9310_REG_PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
746                                  SX9310_REG_PROX_CTRL3_GAIN12_X4 },
747         { SX9310_REG_PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST },
748         { SX9310_REG_PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
749                                  SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
750                                  SX9310_REG_PROX_CTRL5_RAWFILT_1P25 },
751         { SX9310_REG_PROX_CTRL6, SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT },
752         { SX9310_REG_PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
753                                  SX9310_REG_PROX_CTRL7_AVGPOSFILT_512 },
754         { SX9310_REG_PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
755                                  SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500 },
756         { SX9310_REG_PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH_28 |
757                                  SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900 },
758         { SX9310_REG_PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
759                                   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2 },
760         { SX9310_REG_PROX_CTRL11, 0x00 },
761         { SX9310_REG_PROX_CTRL12, 0x00 },
762         { SX9310_REG_PROX_CTRL13, 0x00 },
763         { SX9310_REG_PROX_CTRL14, 0x00 },
764         { SX9310_REG_PROX_CTRL15, 0x00 },
765         { SX9310_REG_PROX_CTRL16, 0x00 },
766         { SX9310_REG_PROX_CTRL17, 0x00 },
767         { SX9310_REG_PROX_CTRL18, 0x00 },
768         { SX9310_REG_PROX_CTRL19, 0x00 },
769         { SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
770                                 SX9310_REG_SAR_CTRL0_SARHYST_8 },
771         { SX9310_REG_SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250) },
772         { SX9310_REG_SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT },
773 };
774
775 /* Activate all channels and perform an initial compensation. */
776 static int sx9310_init_compensation(struct iio_dev *indio_dev)
777 {
778         struct sx_common_data *data = iio_priv(indio_dev);
779         int ret;
780         unsigned int val;
781         unsigned int ctrl0;
782
783         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &ctrl0);
784         if (ret)
785                 return ret;
786
787         /* run the compensation phase on all channels */
788         ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
789                            ctrl0 | SX9310_REG_PROX_CTRL0_SENSOREN_MASK);
790         if (ret)
791                 return ret;
792
793         ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val,
794                                        !(val & SX9310_REG_STAT1_COMPSTAT_MASK),
795                                        20000, 2000000);
796         if (ret)
797                 return ret;
798
799         regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
800         return ret;
801 }
802
803 static const struct sx_common_reg_default *
804 sx9310_get_default_reg(struct device *dev, int idx,
805                        struct sx_common_reg_default *reg_def)
806 {
807         u32 combined[SX9310_NUM_CHANNELS];
808         u32 start = 0, raw = 0, pos = 0;
809         unsigned long comb_mask = 0;
810         int ret, i, count;
811         const char *res;
812
813         memcpy(reg_def, &sx9310_default_regs[idx], sizeof(*reg_def));
814         switch (reg_def->reg) {
815         case SX9310_REG_PROX_CTRL2:
816                 if (device_property_read_bool(dev, "semtech,cs0-ground")) {
817                         reg_def->def &= ~SX9310_REG_PROX_CTRL2_SHIELDEN_MASK;
818                         reg_def->def |= SX9310_REG_PROX_CTRL2_SHIELDEN_GROUND;
819                 }
820
821                 count = device_property_count_u32(dev, "semtech,combined-sensors");
822                 if (count < 0 || count > ARRAY_SIZE(combined))
823                         break;
824                 ret = device_property_read_u32_array(dev, "semtech,combined-sensors",
825                                 combined, count);
826                 if (ret)
827                         break;
828
829                 for (i = 0; i < count; i++)
830                         comb_mask |= BIT(combined[i]);
831
832                 reg_def->def &= ~SX9310_REG_PROX_CTRL2_COMBMODE_MASK;
833                 if (comb_mask == (BIT(3) | BIT(2) | BIT(1) | BIT(0)))
834                         reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1_CS2_CS3;
835                 else if (comb_mask == (BIT(1) | BIT(2)))
836                         reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2;
837                 else if (comb_mask == (BIT(0) | BIT(1)))
838                         reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS0_CS1;
839                 else if (comb_mask == BIT(3))
840                         reg_def->def |= SX9310_REG_PROX_CTRL2_COMBMODE_CS3;
841
842                 break;
843         case SX9310_REG_PROX_CTRL4:
844                 ret = device_property_read_string(dev, "semtech,resolution", &res);
845                 if (ret)
846                         break;
847
848                 reg_def->def &= ~SX9310_REG_PROX_CTRL4_RESOLUTION_MASK;
849                 if (!strcmp(res, "coarsest"))
850                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSEST;
851                 else if (!strcmp(res, "very-coarse"))
852                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_COARSE;
853                 else if (!strcmp(res, "coarse"))
854                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_COARSE;
855                 else if (!strcmp(res, "medium-coarse"))
856                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM_COARSE;
857                 else if (!strcmp(res, "medium"))
858                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_MEDIUM;
859                 else if (!strcmp(res, "fine"))
860                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINE;
861                 else if (!strcmp(res, "very-fine"))
862                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_VERY_FINE;
863                 else if (!strcmp(res, "finest"))
864                         reg_def->def |= SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST;
865
866                 break;
867         case SX9310_REG_PROX_CTRL5:
868                 ret = device_property_read_u32(dev, "semtech,startup-sensor", &start);
869                 if (ret) {
870                         start = FIELD_GET(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK,
871                                           reg_def->def);
872                 }
873
874                 reg_def->def &= ~SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK;
875                 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_STARTUPSENS_MASK,
876                                            start);
877
878                 ret = device_property_read_u32(dev, "semtech,proxraw-strength", &raw);
879                 if (ret) {
880                         raw = FIELD_GET(SX9310_REG_PROX_CTRL5_RAWFILT_MASK,
881                                         reg_def->def);
882                 } else {
883                         raw = ilog2(raw);
884                 }
885
886                 reg_def->def &= ~SX9310_REG_PROX_CTRL5_RAWFILT_MASK;
887                 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL5_RAWFILT_MASK,
888                                            raw);
889                 break;
890         case SX9310_REG_PROX_CTRL7:
891                 ret = device_property_read_u32(dev, "semtech,avg-pos-strength", &pos);
892                 if (ret)
893                         break;
894
895                 /* Powers of 2, except for a gap between 16 and 64 */
896                 pos = clamp(ilog2(pos), 3, 11) - (pos >= 32 ? 4 : 3);
897                 reg_def->def &= ~SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK;
898                 reg_def->def |= FIELD_PREP(SX9310_REG_PROX_CTRL7_AVGPOSFILT_MASK,
899                                            pos);
900                 break;
901         }
902
903         return reg_def;
904 }
905
906 static int sx9310_check_whoami(struct device *dev,
907                                struct iio_dev *indio_dev)
908 {
909         struct sx_common_data *data = iio_priv(indio_dev);
910         const struct sx931x_info *ddata;
911         unsigned int whoami;
912         int ret;
913
914         ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &whoami);
915         if (ret)
916                 return ret;
917
918         ddata = device_get_match_data(dev);
919         if (ddata->whoami != whoami)
920                 return -ENODEV;
921
922         indio_dev->name = ddata->name;
923
924         return 0;
925 }
926
927 static const struct sx_common_chip_info sx9310_chip_info = {
928         .reg_stat = SX9310_REG_STAT0,
929         .reg_irq_msk = SX9310_REG_IRQ_MSK,
930         .reg_enable_chan = SX9310_REG_PROX_CTRL0,
931         .reg_reset = SX9310_REG_RESET,
932
933         .mask_enable_chan = SX9310_REG_STAT1_COMPSTAT_MASK,
934         .irq_msk_offset = 3,
935         .num_channels = SX9310_NUM_CHANNELS,
936         .num_default_regs = ARRAY_SIZE(sx9310_default_regs),
937
938         .ops = {
939                 .read_prox_data = sx9310_read_prox_data,
940                 .check_whoami = sx9310_check_whoami,
941                 .init_compensation = sx9310_init_compensation,
942                 .wait_for_sample = sx9310_wait_for_sample,
943                 .get_default_reg = sx9310_get_default_reg,
944         },
945
946         .iio_channels = sx9310_channels,
947         .num_iio_channels = ARRAY_SIZE(sx9310_channels),
948         .iio_info =  {
949                 .read_raw = sx9310_read_raw,
950                 .read_avail = sx9310_read_avail,
951                 .read_event_value = sx9310_read_event_val,
952                 .write_event_value = sx9310_write_event_val,
953                 .write_raw = sx9310_write_raw,
954                 .read_event_config = sx_common_read_event_config,
955                 .write_event_config = sx_common_write_event_config,
956         },
957 };
958
959 static int sx9310_probe(struct i2c_client *client)
960 {
961         return sx_common_probe(client, &sx9310_chip_info, &sx9310_regmap_config);
962 }
963
964 static int sx9310_suspend(struct device *dev)
965 {
966         struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
967         u8 ctrl0;
968         int ret;
969
970         disable_irq_nosync(data->client->irq);
971
972         mutex_lock(&data->mutex);
973         ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0,
974                           &data->suspend_ctrl);
975         if (ret)
976                 goto out;
977
978         ctrl0 = data->suspend_ctrl & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK;
979         ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
980         if (ret)
981                 goto out;
982
983         ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 0);
984
985 out:
986         mutex_unlock(&data->mutex);
987         return ret;
988 }
989
990 static int sx9310_resume(struct device *dev)
991 {
992         struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
993         int ret;
994
995         mutex_lock(&data->mutex);
996         ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1);
997         if (ret)
998                 goto out;
999
1000         ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
1001                            data->suspend_ctrl);
1002
1003 out:
1004         mutex_unlock(&data->mutex);
1005         if (ret)
1006                 return ret;
1007
1008         enable_irq(data->client->irq);
1009         return 0;
1010 }
1011
1012 static DEFINE_SIMPLE_DEV_PM_OPS(sx9310_pm_ops, sx9310_suspend, sx9310_resume);
1013
1014 static const struct sx931x_info sx9310_info = {
1015         .name = "sx9310",
1016         .whoami = SX9310_WHOAMI_VALUE,
1017 };
1018
1019 static const struct sx931x_info sx9311_info = {
1020         .name = "sx9311",
1021         .whoami = SX9311_WHOAMI_VALUE,
1022 };
1023
1024 static const struct acpi_device_id sx9310_acpi_match[] = {
1025         { "STH9310", (kernel_ulong_t)&sx9310_info },
1026         { "STH9311", (kernel_ulong_t)&sx9311_info },
1027         {}
1028 };
1029 MODULE_DEVICE_TABLE(acpi, sx9310_acpi_match);
1030
1031 static const struct of_device_id sx9310_of_match[] = {
1032         { .compatible = "semtech,sx9310", &sx9310_info },
1033         { .compatible = "semtech,sx9311", &sx9311_info },
1034         {}
1035 };
1036 MODULE_DEVICE_TABLE(of, sx9310_of_match);
1037
1038 static const struct i2c_device_id sx9310_id[] = {
1039         { "sx9310", (kernel_ulong_t)&sx9310_info },
1040         { "sx9311", (kernel_ulong_t)&sx9311_info },
1041         {}
1042 };
1043 MODULE_DEVICE_TABLE(i2c, sx9310_id);
1044
1045 static struct i2c_driver sx9310_driver = {
1046         .driver = {
1047                 .name   = "sx9310",
1048                 .acpi_match_table = sx9310_acpi_match,
1049                 .of_match_table = sx9310_of_match,
1050                 .pm = pm_sleep_ptr(&sx9310_pm_ops),
1051
1052                 /*
1053                  * Lots of i2c transfers in probe + over 200 ms waiting in
1054                  * sx9310_init_compensation() mean a slow probe; prefer async
1055                  * so we don't delay boot if we're builtin to the kernel.
1056                  */
1057                 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
1058         },
1059         .probe          = sx9310_probe,
1060         .id_table       = sx9310_id,
1061 };
1062 module_i2c_driver(sx9310_driver);
1063
1064 MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>");
1065 MODULE_AUTHOR("Daniel Campello <campello@chromium.org>");
1066 MODULE_DESCRIPTION("Driver for Semtech SX9310/SX9311 proximity sensor");
1067 MODULE_LICENSE("GPL v2");
1068 MODULE_IMPORT_NS(SEMTECH_PROX);