iio: ltr501: Add ACPI enumeration support
[firefly-linux-kernel-4.4.55.git] / drivers / iio / light / ltr501.c
1 /*
2  * ltr501.c - Support for Lite-On LTR501 ambient light and proximity sensor
3  *
4  * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net>
5  *
6  * This file is subject to the terms and conditions of version 2 of
7  * the GNU General Public License.  See the file COPYING in the main
8  * directory of this archive for more details.
9  *
10  * 7-bit I2C slave address 0x23
11  *
12  * TODO: IR LED characteristics
13  */
14
15 #include <linux/module.h>
16 #include <linux/i2c.h>
17 #include <linux/err.h>
18 #include <linux/delay.h>
19 #include <linux/regmap.h>
20 #include <linux/acpi.h>
21
22 #include <linux/iio/iio.h>
23 #include <linux/iio/events.h>
24 #include <linux/iio/sysfs.h>
25 #include <linux/iio/trigger_consumer.h>
26 #include <linux/iio/buffer.h>
27 #include <linux/iio/triggered_buffer.h>
28
29 #define LTR501_DRV_NAME "ltr501"
30
31 #define LTR501_ALS_CONTR 0x80 /* ALS operation mode, SW reset */
32 #define LTR501_PS_CONTR 0x81 /* PS operation mode */
33 #define LTR501_PS_MEAS_RATE 0x84 /* measurement rate*/
34 #define LTR501_ALS_MEAS_RATE 0x85 /* ALS integ time, measurement rate*/
35 #define LTR501_PART_ID 0x86
36 #define LTR501_MANUFAC_ID 0x87
37 #define LTR501_ALS_DATA1 0x88 /* 16-bit, little endian */
38 #define LTR501_ALS_DATA0 0x8a /* 16-bit, little endian */
39 #define LTR501_ALS_PS_STATUS 0x8c
40 #define LTR501_PS_DATA 0x8d /* 16-bit, little endian */
41 #define LTR501_INTR 0x8f /* output mode, polarity, mode */
42 #define LTR501_PS_THRESH_UP 0x90 /* 11 bit, ps upper threshold */
43 #define LTR501_PS_THRESH_LOW 0x92 /* 11 bit, ps lower threshold */
44 #define LTR501_ALS_THRESH_UP 0x97 /* 16 bit, ALS upper threshold */
45 #define LTR501_ALS_THRESH_LOW 0x99 /* 16 bit, ALS lower threshold */
46 #define LTR501_INTR_PRST 0x9e /* ps thresh, als thresh */
47 #define LTR501_MAX_REG 0x9f
48
49 #define LTR501_ALS_CONTR_SW_RESET BIT(2)
50 #define LTR501_CONTR_PS_GAIN_MASK (BIT(3) | BIT(2))
51 #define LTR501_CONTR_PS_GAIN_SHIFT 2
52 #define LTR501_CONTR_ALS_GAIN_MASK BIT(3)
53 #define LTR501_CONTR_ACTIVE BIT(1)
54
55 #define LTR501_STATUS_ALS_INTR BIT(3)
56 #define LTR501_STATUS_ALS_RDY BIT(2)
57 #define LTR501_STATUS_PS_INTR BIT(1)
58 #define LTR501_STATUS_PS_RDY BIT(0)
59
60 #define LTR501_PS_DATA_MASK 0x7ff
61 #define LTR501_PS_THRESH_MASK 0x7ff
62 #define LTR501_ALS_THRESH_MASK 0xffff
63
64 #define LTR501_ALS_DEF_PERIOD 500000
65 #define LTR501_PS_DEF_PERIOD 100000
66
67 #define LTR501_REGMAP_NAME "ltr501_regmap"
68
69 static const int int_time_mapping[] = {100000, 50000, 200000, 400000};
70
71 static const struct reg_field reg_field_it =
72                                 REG_FIELD(LTR501_ALS_MEAS_RATE, 3, 4);
73 static const struct reg_field reg_field_als_intr =
74                                 REG_FIELD(LTR501_INTR, 0, 0);
75 static const struct reg_field reg_field_ps_intr =
76                                 REG_FIELD(LTR501_INTR, 1, 1);
77 static const struct reg_field reg_field_als_rate =
78                                 REG_FIELD(LTR501_ALS_MEAS_RATE, 0, 2);
79 static const struct reg_field reg_field_ps_rate =
80                                 REG_FIELD(LTR501_PS_MEAS_RATE, 0, 3);
81 static const struct reg_field reg_field_als_prst =
82                                 REG_FIELD(LTR501_INTR_PRST, 0, 3);
83 static const struct reg_field reg_field_ps_prst =
84                                 REG_FIELD(LTR501_INTR_PRST, 4, 7);
85
86 struct ltr501_samp_table {
87         int freq_val;  /* repetition frequency in micro HZ*/
88         int time_val; /* repetition rate in micro seconds */
89 };
90
91 struct ltr501_data {
92         struct i2c_client *client;
93         struct mutex lock_als, lock_ps;
94         u8 als_contr, ps_contr;
95         int als_period, ps_period; /* period in micro seconds */
96         struct regmap *regmap;
97         struct regmap_field *reg_it;
98         struct regmap_field *reg_als_intr;
99         struct regmap_field *reg_ps_intr;
100         struct regmap_field *reg_als_rate;
101         struct regmap_field *reg_ps_rate;
102         struct regmap_field *reg_als_prst;
103         struct regmap_field *reg_ps_prst;
104 };
105
106 static const struct ltr501_samp_table ltr501_als_samp_table[] = {
107                         {20000000, 50000}, {10000000, 100000},
108                         {5000000, 200000}, {2000000, 500000},
109                         {1000000, 1000000}, {500000, 2000000},
110                         {500000, 2000000}, {500000, 2000000}
111 };
112
113 static const struct ltr501_samp_table ltr501_ps_samp_table[] = {
114                         {20000000, 50000}, {14285714, 70000},
115                         {10000000, 100000}, {5000000, 200000},
116                         {2000000, 500000}, {1000000, 1000000},
117                         {500000, 2000000}, {500000, 2000000},
118                         {500000, 2000000}
119 };
120
121 static unsigned int ltr501_match_samp_freq(const struct ltr501_samp_table *tab,
122                                            int len, int val, int val2)
123 {
124         int i, freq;
125
126         freq = val * 1000000 + val2;
127
128         for (i = 0; i < len; i++) {
129                 if (tab[i].freq_val == freq)
130                         return i;
131         }
132
133         return -EINVAL;
134 }
135
136 static int ltr501_als_read_samp_freq(struct ltr501_data *data,
137                                      int *val, int *val2)
138 {
139         int ret, i;
140
141         ret = regmap_field_read(data->reg_als_rate, &i);
142         if (ret < 0)
143                 return ret;
144
145         if (i < 0 || i >= ARRAY_SIZE(ltr501_als_samp_table))
146                 return -EINVAL;
147
148         *val = ltr501_als_samp_table[i].freq_val / 1000000;
149         *val2 = ltr501_als_samp_table[i].freq_val % 1000000;
150
151         return IIO_VAL_INT_PLUS_MICRO;
152 }
153
154 static int ltr501_ps_read_samp_freq(struct ltr501_data *data,
155                                     int *val, int *val2)
156 {
157         int ret, i;
158
159         ret = regmap_field_read(data->reg_ps_rate, &i);
160         if (ret < 0)
161                 return ret;
162
163         if (i < 0 || i >= ARRAY_SIZE(ltr501_ps_samp_table))
164                 return -EINVAL;
165
166         *val = ltr501_ps_samp_table[i].freq_val / 1000000;
167         *val2 = ltr501_ps_samp_table[i].freq_val % 1000000;
168
169         return IIO_VAL_INT_PLUS_MICRO;
170 }
171
172 static int ltr501_als_write_samp_freq(struct ltr501_data *data,
173                                       int val, int val2)
174 {
175         int i, ret;
176
177         i = ltr501_match_samp_freq(ltr501_als_samp_table,
178                                    ARRAY_SIZE(ltr501_als_samp_table),
179                                    val, val2);
180
181         if (i < 0)
182                 return i;
183
184         mutex_lock(&data->lock_als);
185         ret = regmap_field_write(data->reg_als_rate, i);
186         mutex_unlock(&data->lock_als);
187
188         return ret;
189 }
190
191 static int ltr501_ps_write_samp_freq(struct ltr501_data *data,
192                                      int val, int val2)
193 {
194         int i, ret;
195
196         i = ltr501_match_samp_freq(ltr501_ps_samp_table,
197                                    ARRAY_SIZE(ltr501_ps_samp_table),
198                                    val, val2);
199
200         if (i < 0)
201                 return i;
202
203         mutex_lock(&data->lock_ps);
204         ret = regmap_field_write(data->reg_ps_rate, i);
205         mutex_unlock(&data->lock_ps);
206
207         return ret;
208 }
209
210 static int ltr501_als_read_samp_period(struct ltr501_data *data, int *val)
211 {
212         int ret, i;
213
214         ret = regmap_field_read(data->reg_als_rate, &i);
215         if (ret < 0)
216                 return ret;
217
218         if (i < 0 || i >= ARRAY_SIZE(ltr501_als_samp_table))
219                 return -EINVAL;
220
221         *val = ltr501_als_samp_table[i].time_val;
222
223         return IIO_VAL_INT;
224 }
225
226 static int ltr501_ps_read_samp_period(struct ltr501_data *data, int *val)
227 {
228         int ret, i;
229
230         ret = regmap_field_read(data->reg_ps_rate, &i);
231         if (ret < 0)
232                 return ret;
233
234         if (i < 0 || i >= ARRAY_SIZE(ltr501_ps_samp_table))
235                 return -EINVAL;
236
237         *val = ltr501_ps_samp_table[i].time_val;
238
239         return IIO_VAL_INT;
240 }
241
242 static int ltr501_drdy(struct ltr501_data *data, u8 drdy_mask)
243 {
244         int tries = 100;
245         int ret, status;
246
247         while (tries--) {
248                 ret = regmap_read(data->regmap, LTR501_ALS_PS_STATUS, &status);
249                 if (ret < 0)
250                         return ret;
251                 if ((status & drdy_mask) == drdy_mask)
252                         return 0;
253                 msleep(25);
254         }
255
256         dev_err(&data->client->dev, "ltr501_drdy() failed, data not ready\n");
257         return -EIO;
258 }
259
260 static int ltr501_set_it_time(struct ltr501_data *data, int it)
261 {
262         int ret, i, index = -1, status;
263
264         for (i = 0; i < ARRAY_SIZE(int_time_mapping); i++) {
265                 if (int_time_mapping[i] == it) {
266                         index = i;
267                         break;
268                 }
269         }
270         /* Make sure integ time index is valid */
271         if (index < 0)
272                 return -EINVAL;
273
274         ret = regmap_read(data->regmap, LTR501_ALS_CONTR, &status);
275         if (ret < 0)
276                 return ret;
277
278         if (status & LTR501_CONTR_ALS_GAIN_MASK) {
279                 /*
280                  * 200 ms and 400 ms integ time can only be
281                  * used in dynamic range 1
282                  */
283                 if (index > 1)
284                         return -EINVAL;
285         } else
286                 /* 50 ms integ time can only be used in dynamic range 2 */
287                 if (index == 1)
288                         return -EINVAL;
289
290         return regmap_field_write(data->reg_it, index);
291 }
292
293 /* read int time in micro seconds */
294 static int ltr501_read_it_time(struct ltr501_data *data, int *val, int *val2)
295 {
296         int ret, index;
297
298         ret = regmap_field_read(data->reg_it, &index);
299         if (ret < 0)
300                 return ret;
301
302         /* Make sure integ time index is valid */
303         if (index < 0 || index >= ARRAY_SIZE(int_time_mapping))
304                 return -EINVAL;
305
306         *val2 = int_time_mapping[index];
307         *val = 0;
308
309         return IIO_VAL_INT_PLUS_MICRO;
310 }
311
312 static int ltr501_read_als(struct ltr501_data *data, __le16 buf[2])
313 {
314         int ret;
315
316         ret = ltr501_drdy(data, LTR501_STATUS_ALS_RDY);
317         if (ret < 0)
318                 return ret;
319         /* always read both ALS channels in given order */
320         return regmap_bulk_read(data->regmap, LTR501_ALS_DATA1,
321                                 buf, 2 * sizeof(__le16));
322 }
323
324 static int ltr501_read_ps(struct ltr501_data *data)
325 {
326         int ret, status;
327
328         ret = ltr501_drdy(data, LTR501_STATUS_PS_RDY);
329         if (ret < 0)
330                 return ret;
331
332         ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
333                                &status, 2);
334         if (ret < 0)
335                 return ret;
336
337         return status;
338 }
339
340 static int ltr501_read_intr_prst(struct ltr501_data *data,
341                                  enum iio_chan_type type,
342                                  int *val2)
343 {
344         int ret, samp_period, prst;
345
346         switch (type) {
347         case IIO_INTENSITY:
348                 ret = regmap_field_read(data->reg_als_prst, &prst);
349                 if (ret < 0)
350                         return ret;
351
352                 ret = ltr501_als_read_samp_period(data, &samp_period);
353
354                 if (ret < 0)
355                         return ret;
356                 *val2 = samp_period * prst;
357                 return IIO_VAL_INT_PLUS_MICRO;
358         case IIO_PROXIMITY:
359                 ret = regmap_field_read(data->reg_ps_prst, &prst);
360                 if (ret < 0)
361                         return ret;
362
363                 ret = ltr501_ps_read_samp_period(data, &samp_period);
364
365                 if (ret < 0)
366                         return ret;
367
368                 *val2 = samp_period * prst;
369                 return IIO_VAL_INT_PLUS_MICRO;
370         default:
371                 return -EINVAL;
372         }
373
374         return -EINVAL;
375 }
376
377 static int ltr501_write_intr_prst(struct ltr501_data *data,
378                                   enum iio_chan_type type,
379                                   int val, int val2)
380 {
381         int ret, samp_period, new_val;
382         unsigned long period;
383
384         if (val < 0 || val2 < 0)
385                 return -EINVAL;
386
387         /* period in microseconds */
388         period = ((val * 1000000) + val2);
389
390         switch (type) {
391         case IIO_INTENSITY:
392                 ret = ltr501_als_read_samp_period(data, &samp_period);
393                 if (ret < 0)
394                         return ret;
395
396                 /* period should be atleast equal to sampling period */
397                 if (period < samp_period)
398                         return -EINVAL;
399
400                 new_val = DIV_ROUND_UP(period, samp_period);
401                 if (new_val < 0 || new_val > 0x0f)
402                         return -EINVAL;
403
404                 mutex_lock(&data->lock_als);
405                 ret = regmap_field_write(data->reg_als_prst, new_val);
406                 mutex_unlock(&data->lock_als);
407                 if (ret >= 0)
408                         data->als_period = period;
409
410                 return ret;
411         case IIO_PROXIMITY:
412                 ret = ltr501_ps_read_samp_period(data, &samp_period);
413                 if (ret < 0)
414                         return ret;
415
416                 /* period should be atleast equal to rate */
417                 if (period < samp_period)
418                         return -EINVAL;
419
420                 new_val = DIV_ROUND_UP(period, samp_period);
421                 if (new_val < 0 || new_val > 0x0f)
422                         return -EINVAL;
423
424                 mutex_lock(&data->lock_ps);
425                 ret = regmap_field_write(data->reg_ps_prst, new_val);
426                 mutex_unlock(&data->lock_ps);
427                 if (ret >= 0)
428                         data->ps_period = period;
429
430                 return ret;
431         default:
432                 return -EINVAL;
433         }
434
435         return -EINVAL;
436 }
437
438 static const struct iio_event_spec ltr501_als_event_spec[] = {
439         {
440                 .type = IIO_EV_TYPE_THRESH,
441                 .dir = IIO_EV_DIR_RISING,
442                 .mask_separate = BIT(IIO_EV_INFO_VALUE),
443         }, {
444                 .type = IIO_EV_TYPE_THRESH,
445                 .dir = IIO_EV_DIR_FALLING,
446                 .mask_separate = BIT(IIO_EV_INFO_VALUE),
447         }, {
448                 .type = IIO_EV_TYPE_THRESH,
449                 .dir = IIO_EV_DIR_EITHER,
450                 .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
451                                  BIT(IIO_EV_INFO_PERIOD),
452         },
453
454 };
455
456 static const struct iio_event_spec ltr501_pxs_event_spec[] = {
457         {
458                 .type = IIO_EV_TYPE_THRESH,
459                 .dir = IIO_EV_DIR_RISING,
460                 .mask_separate = BIT(IIO_EV_INFO_VALUE),
461         }, {
462                 .type = IIO_EV_TYPE_THRESH,
463                 .dir = IIO_EV_DIR_FALLING,
464                 .mask_separate = BIT(IIO_EV_INFO_VALUE),
465         }, {
466                 .type = IIO_EV_TYPE_THRESH,
467                 .dir = IIO_EV_DIR_EITHER,
468                 .mask_separate = BIT(IIO_EV_INFO_ENABLE) |
469                                  BIT(IIO_EV_INFO_PERIOD),
470         },
471 };
472
473 #define LTR501_INTENSITY_CHANNEL(_idx, _addr, _mod, _shared, \
474                                  _evspec, _evsize) { \
475         .type = IIO_INTENSITY, \
476         .modified = 1, \
477         .address = (_addr), \
478         .channel2 = (_mod), \
479         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
480         .info_mask_shared_by_type = (_shared), \
481         .scan_index = (_idx), \
482         .scan_type = { \
483                 .sign = 'u', \
484                 .realbits = 16, \
485                 .storagebits = 16, \
486                 .endianness = IIO_CPU, \
487         }, \
488         .event_spec = _evspec,\
489         .num_event_specs = _evsize,\
490 }
491
492 static const struct iio_chan_spec ltr501_channels[] = {
493         LTR501_INTENSITY_CHANNEL(0, LTR501_ALS_DATA0, IIO_MOD_LIGHT_BOTH, 0,
494                                  ltr501_als_event_spec,
495                                  ARRAY_SIZE(ltr501_als_event_spec)),
496         LTR501_INTENSITY_CHANNEL(1, LTR501_ALS_DATA1, IIO_MOD_LIGHT_IR,
497                                  BIT(IIO_CHAN_INFO_SCALE) |
498                                  BIT(IIO_CHAN_INFO_INT_TIME) |
499                                  BIT(IIO_CHAN_INFO_SAMP_FREQ),
500                                  NULL, 0),
501         {
502                 .type = IIO_PROXIMITY,
503                 .address = LTR501_PS_DATA,
504                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
505                         BIT(IIO_CHAN_INFO_SCALE),
506                 .scan_index = 2,
507                 .scan_type = {
508                         .sign = 'u',
509                         .realbits = 11,
510                         .storagebits = 16,
511                         .endianness = IIO_CPU,
512                 },
513                 .event_spec = ltr501_pxs_event_spec,
514                 .num_event_specs = ARRAY_SIZE(ltr501_pxs_event_spec),
515         },
516         IIO_CHAN_SOFT_TIMESTAMP(3),
517 };
518
519 static const int ltr501_ps_gain[4][2] = {
520         {1, 0}, {0, 250000}, {0, 125000}, {0, 62500}
521 };
522
523 static int ltr501_read_raw(struct iio_dev *indio_dev,
524                            struct iio_chan_spec const *chan,
525                            int *val, int *val2, long mask)
526 {
527         struct ltr501_data *data = iio_priv(indio_dev);
528         __le16 buf[2];
529         int ret, i;
530
531         switch (mask) {
532         case IIO_CHAN_INFO_RAW:
533                 if (iio_buffer_enabled(indio_dev))
534                         return -EBUSY;
535
536                 switch (chan->type) {
537                 case IIO_INTENSITY:
538                         mutex_lock(&data->lock_als);
539                         ret = ltr501_read_als(data, buf);
540                         mutex_unlock(&data->lock_als);
541                         if (ret < 0)
542                                 return ret;
543                         *val = le16_to_cpu(chan->address == LTR501_ALS_DATA1 ?
544                                            buf[0] : buf[1]);
545                         return IIO_VAL_INT;
546                 case IIO_PROXIMITY:
547                         mutex_lock(&data->lock_ps);
548                         ret = ltr501_read_ps(data);
549                         mutex_unlock(&data->lock_ps);
550                         if (ret < 0)
551                                 return ret;
552                         *val = ret & LTR501_PS_DATA_MASK;
553                         return IIO_VAL_INT;
554                 default:
555                         return -EINVAL;
556                 }
557         case IIO_CHAN_INFO_SCALE:
558                 switch (chan->type) {
559                 case IIO_INTENSITY:
560                         if (data->als_contr & LTR501_CONTR_ALS_GAIN_MASK) {
561                                 *val = 0;
562                                 *val2 = 5000;
563                                 return IIO_VAL_INT_PLUS_MICRO;
564                         }
565                         *val = 1;
566                         *val2 = 0;
567                         return IIO_VAL_INT;
568                 case IIO_PROXIMITY:
569                         i = (data->ps_contr & LTR501_CONTR_PS_GAIN_MASK) >>
570                                 LTR501_CONTR_PS_GAIN_SHIFT;
571                         *val = ltr501_ps_gain[i][0];
572                         *val2 = ltr501_ps_gain[i][1];
573                         return IIO_VAL_INT_PLUS_MICRO;
574                 default:
575                         return -EINVAL;
576                 }
577         case IIO_CHAN_INFO_INT_TIME:
578                 switch (chan->type) {
579                 case IIO_INTENSITY:
580                         return ltr501_read_it_time(data, val, val2);
581                 default:
582                         return -EINVAL;
583                 }
584         case IIO_CHAN_INFO_SAMP_FREQ:
585                 switch (chan->type) {
586                 case IIO_INTENSITY:
587                         return ltr501_als_read_samp_freq(data, val, val2);
588                 case IIO_PROXIMITY:
589                         return ltr501_ps_read_samp_freq(data, val, val2);
590                 default:
591                         return -EINVAL;
592                 }
593         }
594         return -EINVAL;
595 }
596
597 static int ltr501_get_ps_gain_index(int val, int val2)
598 {
599         int i;
600
601         for (i = 0; i < ARRAY_SIZE(ltr501_ps_gain); i++)
602                 if (val == ltr501_ps_gain[i][0] && val2 == ltr501_ps_gain[i][1])
603                         return i;
604
605         return -1;
606 }
607
608 static int ltr501_write_raw(struct iio_dev *indio_dev,
609                             struct iio_chan_spec const *chan,
610                             int val, int val2, long mask)
611 {
612         struct ltr501_data *data = iio_priv(indio_dev);
613         int i, ret, freq_val, freq_val2;
614
615         if (iio_buffer_enabled(indio_dev))
616                 return -EBUSY;
617
618         switch (mask) {
619         case IIO_CHAN_INFO_SCALE:
620                 switch (chan->type) {
621                 case IIO_INTENSITY:
622                         if (val == 0 && val2 == 5000)
623                                 data->als_contr |= LTR501_CONTR_ALS_GAIN_MASK;
624                         else if (val == 1 && val2 == 0)
625                                 data->als_contr &= ~LTR501_CONTR_ALS_GAIN_MASK;
626                         else
627                                 return -EINVAL;
628
629                         return regmap_write(data->regmap, LTR501_ALS_CONTR,
630                                             data->als_contr);
631                 case IIO_PROXIMITY:
632                         i = ltr501_get_ps_gain_index(val, val2);
633                         if (i < 0)
634                                 return -EINVAL;
635                         data->ps_contr &= ~LTR501_CONTR_PS_GAIN_MASK;
636                         data->ps_contr |= i << LTR501_CONTR_PS_GAIN_SHIFT;
637
638                         return regmap_write(data->regmap, LTR501_PS_CONTR,
639                                             data->ps_contr);
640                 default:
641                         return -EINVAL;
642                 }
643         case IIO_CHAN_INFO_INT_TIME:
644                 switch (chan->type) {
645                 case IIO_INTENSITY:
646                         if (val != 0)
647                                 return -EINVAL;
648                         mutex_lock(&data->lock_als);
649                         i = ltr501_set_it_time(data, val2);
650                         mutex_unlock(&data->lock_als);
651                         return i;
652                 default:
653                         return -EINVAL;
654                 }
655         case IIO_CHAN_INFO_SAMP_FREQ:
656                 switch (chan->type) {
657                 case IIO_INTENSITY:
658                         ret = ltr501_als_read_samp_freq(data, &freq_val,
659                                                         &freq_val2);
660                         if (ret < 0)
661                                 return ret;
662
663                         ret = ltr501_als_write_samp_freq(data, val, val2);
664                         if (ret < 0)
665                                 return ret;
666
667                         /* update persistence count when changing frequency */
668                         ret = ltr501_write_intr_prst(data, chan->type,
669                                                      0, data->als_period);
670
671                         if (ret < 0)
672                                 return ltr501_als_write_samp_freq(data,
673                                                                   freq_val,
674                                                                   freq_val2);
675                         return ret;
676                 case IIO_PROXIMITY:
677                         ret = ltr501_ps_read_samp_freq(data, &freq_val,
678                                                        &freq_val2);
679                         if (ret < 0)
680                                 return ret;
681
682                         ret = ltr501_ps_write_samp_freq(data, val, val2);
683                         if (ret < 0)
684                                 return ret;
685
686                         /* update persistence count when changing frequency */
687                         ret = ltr501_write_intr_prst(data, chan->type,
688                                                      0, data->ps_period);
689
690                         if (ret < 0)
691                                 return ltr501_ps_write_samp_freq(data,
692                                                                  freq_val,
693                                                                  freq_val2);
694                         return ret;
695                 default:
696                         return -EINVAL;
697                 }
698         }
699         return -EINVAL;
700 }
701
702 static int ltr501_read_thresh(struct iio_dev *indio_dev,
703                               const struct iio_chan_spec *chan,
704                               enum iio_event_type type,
705                               enum iio_event_direction dir,
706                               enum iio_event_info info,
707                               int *val, int *val2)
708 {
709         struct ltr501_data *data = iio_priv(indio_dev);
710         int ret, thresh_data;
711
712         switch (chan->type) {
713         case IIO_INTENSITY:
714                 switch (dir) {
715                 case IIO_EV_DIR_RISING:
716                         ret = regmap_bulk_read(data->regmap,
717                                                LTR501_ALS_THRESH_UP,
718                                                &thresh_data, 2);
719                         if (ret < 0)
720                                 return ret;
721                         *val = thresh_data & LTR501_ALS_THRESH_MASK;
722                         return IIO_VAL_INT;
723                 case IIO_EV_DIR_FALLING:
724                         ret = regmap_bulk_read(data->regmap,
725                                                LTR501_ALS_THRESH_LOW,
726                                                &thresh_data, 2);
727                         if (ret < 0)
728                                 return ret;
729                         *val = thresh_data & LTR501_ALS_THRESH_MASK;
730                         return IIO_VAL_INT;
731                 default:
732                         return -EINVAL;
733                 }
734         case IIO_PROXIMITY:
735                 switch (dir) {
736                 case IIO_EV_DIR_RISING:
737                         ret = regmap_bulk_read(data->regmap,
738                                                LTR501_PS_THRESH_UP,
739                                                &thresh_data, 2);
740                         if (ret < 0)
741                                 return ret;
742                         *val = thresh_data & LTR501_PS_THRESH_MASK;
743                         return IIO_VAL_INT;
744                 case IIO_EV_DIR_FALLING:
745                         ret = regmap_bulk_read(data->regmap,
746                                                LTR501_PS_THRESH_LOW,
747                                                &thresh_data, 2);
748                         if (ret < 0)
749                                 return ret;
750                         *val = thresh_data & LTR501_PS_THRESH_MASK;
751                         return IIO_VAL_INT;
752                 default:
753                         return -EINVAL;
754                 }
755         default:
756                 return -EINVAL;
757         }
758
759         return -EINVAL;
760 }
761
762 static int ltr501_write_thresh(struct iio_dev *indio_dev,
763                                const struct iio_chan_spec *chan,
764                                enum iio_event_type type,
765                                enum iio_event_direction dir,
766                                enum iio_event_info info,
767                                int val, int val2)
768 {
769         struct ltr501_data *data = iio_priv(indio_dev);
770         int ret;
771
772         if (val < 0)
773                 return -EINVAL;
774
775         switch (chan->type) {
776         case IIO_INTENSITY:
777                 if (val > LTR501_ALS_THRESH_MASK)
778                         return -EINVAL;
779                 switch (dir) {
780                 case IIO_EV_DIR_RISING:
781                         mutex_lock(&data->lock_als);
782                         ret = regmap_bulk_write(data->regmap,
783                                                 LTR501_ALS_THRESH_UP,
784                                                 &val, 2);
785                         mutex_unlock(&data->lock_als);
786                         return ret;
787                 case IIO_EV_DIR_FALLING:
788                         mutex_lock(&data->lock_als);
789                         ret = regmap_bulk_write(data->regmap,
790                                                 LTR501_ALS_THRESH_LOW,
791                                                 &val, 2);
792                         mutex_unlock(&data->lock_als);
793                         return ret;
794                 default:
795                         return -EINVAL;
796                 }
797         case IIO_PROXIMITY:
798                 switch (dir) {
799                 if (val > LTR501_PS_THRESH_MASK)
800                         return -EINVAL;
801                 case IIO_EV_DIR_RISING:
802                         mutex_lock(&data->lock_ps);
803                         ret = regmap_bulk_write(data->regmap,
804                                                 LTR501_PS_THRESH_UP,
805                                                 &val, 2);
806                         mutex_unlock(&data->lock_ps);
807                         return ret;
808                 case IIO_EV_DIR_FALLING:
809                         mutex_lock(&data->lock_ps);
810                         ret = regmap_bulk_write(data->regmap,
811                                                 LTR501_PS_THRESH_LOW,
812                                                 &val, 2);
813                         mutex_unlock(&data->lock_ps);
814                         return ret;
815                 default:
816                         return -EINVAL;
817                 }
818         default:
819                 return -EINVAL;
820         }
821
822         return -EINVAL;
823 }
824
825 static int ltr501_read_event(struct iio_dev *indio_dev,
826                              const struct iio_chan_spec *chan,
827                              enum iio_event_type type,
828                              enum iio_event_direction dir,
829                              enum iio_event_info info,
830                              int *val, int *val2)
831 {
832         int ret;
833
834         switch (info) {
835         case IIO_EV_INFO_VALUE:
836                 return ltr501_read_thresh(indio_dev, chan, type, dir,
837                                           info, val, val2);
838         case IIO_EV_INFO_PERIOD:
839                 ret = ltr501_read_intr_prst(iio_priv(indio_dev),
840                                             chan->type, val2);
841                 *val = *val2 / 1000000;
842                 *val2 = *val2 % 1000000;
843                 return ret;
844         default:
845                 return -EINVAL;
846         }
847
848         return -EINVAL;
849 }
850
851 static int ltr501_write_event(struct iio_dev *indio_dev,
852                               const struct iio_chan_spec *chan,
853                               enum iio_event_type type,
854                               enum iio_event_direction dir,
855                               enum iio_event_info info,
856                               int val, int val2)
857 {
858         switch (info) {
859         case IIO_EV_INFO_VALUE:
860                 if (val2 != 0)
861                         return -EINVAL;
862                 return ltr501_write_thresh(indio_dev, chan, type, dir,
863                                            info, val, val2);
864         case IIO_EV_INFO_PERIOD:
865                 return ltr501_write_intr_prst(iio_priv(indio_dev), chan->type,
866                                               val, val2);
867         default:
868                 return -EINVAL;
869         }
870
871         return -EINVAL;
872 }
873
874 static int ltr501_read_event_config(struct iio_dev *indio_dev,
875                                     const struct iio_chan_spec *chan,
876                                     enum iio_event_type type,
877                                     enum iio_event_direction dir)
878 {
879         struct ltr501_data *data = iio_priv(indio_dev);
880         int ret, status;
881
882         switch (chan->type) {
883         case IIO_INTENSITY:
884                 ret = regmap_field_read(data->reg_als_intr, &status);
885                 if (ret < 0)
886                         return ret;
887                 return status;
888         case IIO_PROXIMITY:
889                 ret = regmap_field_read(data->reg_ps_intr, &status);
890                 if (ret < 0)
891                         return ret;
892                 return status;
893         default:
894                 return -EINVAL;
895         }
896
897         return -EINVAL;
898 }
899
900 static int ltr501_write_event_config(struct iio_dev *indio_dev,
901                                      const struct iio_chan_spec *chan,
902                                      enum iio_event_type type,
903                                      enum iio_event_direction dir, int state)
904 {
905         struct ltr501_data *data = iio_priv(indio_dev);
906         int ret;
907
908         /* only 1 and 0 are valid inputs */
909         if (state != 1  || state != 0)
910                 return -EINVAL;
911
912         switch (chan->type) {
913         case IIO_INTENSITY:
914                 mutex_lock(&data->lock_als);
915                 ret = regmap_field_write(data->reg_als_intr, state);
916                 mutex_unlock(&data->lock_als);
917                 return ret;
918         case IIO_PROXIMITY:
919                 mutex_lock(&data->lock_ps);
920                 ret = regmap_field_write(data->reg_ps_intr, state);
921                 mutex_unlock(&data->lock_ps);
922                 return ret;
923         default:
924                 return -EINVAL;
925         }
926
927         return -EINVAL;
928 }
929
930 static IIO_CONST_ATTR(in_proximity_scale_available, "1 0.25 0.125 0.0625");
931 static IIO_CONST_ATTR(in_intensity_scale_available, "1 0.005");
932 static IIO_CONST_ATTR_INT_TIME_AVAIL("0.05 0.1 0.2 0.4");
933 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("20 10 5 2 1 0.5");
934
935 static struct attribute *ltr501_attributes[] = {
936         &iio_const_attr_in_proximity_scale_available.dev_attr.attr,
937         &iio_const_attr_in_intensity_scale_available.dev_attr.attr,
938         &iio_const_attr_integration_time_available.dev_attr.attr,
939         &iio_const_attr_sampling_frequency_available.dev_attr.attr,
940         NULL
941 };
942
943 static const struct attribute_group ltr501_attribute_group = {
944         .attrs = ltr501_attributes,
945 };
946
947 static const struct iio_info ltr501_info_no_irq = {
948         .read_raw = ltr501_read_raw,
949         .write_raw = ltr501_write_raw,
950         .attrs = &ltr501_attribute_group,
951         .driver_module = THIS_MODULE,
952 };
953
954 static const struct iio_info ltr501_info = {
955         .read_raw = ltr501_read_raw,
956         .write_raw = ltr501_write_raw,
957         .attrs = &ltr501_attribute_group,
958         .read_event_value       = &ltr501_read_event,
959         .write_event_value      = &ltr501_write_event,
960         .read_event_config      = &ltr501_read_event_config,
961         .write_event_config     = &ltr501_write_event_config,
962         .driver_module = THIS_MODULE,
963 };
964
965 static int ltr501_write_contr(struct ltr501_data *data, u8 als_val, u8 ps_val)
966 {
967         int ret;
968
969         ret = regmap_write(data->regmap, LTR501_ALS_CONTR, als_val);
970         if (ret < 0)
971                 return ret;
972
973         return regmap_write(data->regmap, LTR501_PS_CONTR, ps_val);
974 }
975
976 static irqreturn_t ltr501_trigger_handler(int irq, void *p)
977 {
978         struct iio_poll_func *pf = p;
979         struct iio_dev *indio_dev = pf->indio_dev;
980         struct ltr501_data *data = iio_priv(indio_dev);
981         u16 buf[8];
982         __le16 als_buf[2];
983         u8 mask = 0;
984         int j = 0;
985         int ret, psdata;
986
987         memset(buf, 0, sizeof(buf));
988
989         /* figure out which data needs to be ready */
990         if (test_bit(0, indio_dev->active_scan_mask) ||
991             test_bit(1, indio_dev->active_scan_mask))
992                 mask |= LTR501_STATUS_ALS_RDY;
993         if (test_bit(2, indio_dev->active_scan_mask))
994                 mask |= LTR501_STATUS_PS_RDY;
995
996         ret = ltr501_drdy(data, mask);
997         if (ret < 0)
998                 goto done;
999
1000         if (mask & LTR501_STATUS_ALS_RDY) {
1001                 ret = regmap_bulk_read(data->regmap, LTR501_ALS_DATA1,
1002                                        (u8 *)als_buf, sizeof(als_buf));
1003                 if (ret < 0)
1004                         return ret;
1005                 if (test_bit(0, indio_dev->active_scan_mask))
1006                         buf[j++] = le16_to_cpu(als_buf[1]);
1007                 if (test_bit(1, indio_dev->active_scan_mask))
1008                         buf[j++] = le16_to_cpu(als_buf[0]);
1009         }
1010
1011         if (mask & LTR501_STATUS_PS_RDY) {
1012                 ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
1013                                        &psdata, 2);
1014                 if (ret < 0)
1015                         goto done;
1016                 buf[j++] = psdata & LTR501_PS_DATA_MASK;
1017         }
1018
1019         iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns());
1020
1021 done:
1022         iio_trigger_notify_done(indio_dev->trig);
1023
1024         return IRQ_HANDLED;
1025 }
1026
1027 static irqreturn_t ltr501_interrupt_handler(int irq, void *private)
1028 {
1029         struct iio_dev *indio_dev = private;
1030         struct ltr501_data *data = iio_priv(indio_dev);
1031         int ret, status;
1032
1033         ret = regmap_read(data->regmap, LTR501_ALS_PS_STATUS, &status);
1034         if (ret < 0) {
1035                 dev_err(&data->client->dev,
1036                         "irq read int reg failed\n");
1037                 return IRQ_HANDLED;
1038         }
1039
1040         if (status & LTR501_STATUS_ALS_INTR)
1041                 iio_push_event(indio_dev,
1042                                IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0,
1043                                                     IIO_EV_TYPE_THRESH,
1044                                                     IIO_EV_DIR_EITHER),
1045                                iio_get_time_ns());
1046
1047         if (status & LTR501_STATUS_PS_INTR)
1048                 iio_push_event(indio_dev,
1049                                IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0,
1050                                                     IIO_EV_TYPE_THRESH,
1051                                                     IIO_EV_DIR_EITHER),
1052                                iio_get_time_ns());
1053
1054         return IRQ_HANDLED;
1055 }
1056
1057 static int ltr501_init(struct ltr501_data *data)
1058 {
1059         int ret, status;
1060
1061         ret = regmap_read(data->regmap, LTR501_ALS_CONTR, &status);
1062         if (ret < 0)
1063                 return ret;
1064
1065         data->als_contr = status | LTR501_CONTR_ACTIVE;
1066
1067         ret = regmap_read(data->regmap, LTR501_PS_CONTR, &status);
1068         if (ret < 0)
1069                 return ret;
1070
1071         data->ps_contr = status | LTR501_CONTR_ACTIVE;
1072
1073         ret = ltr501_read_intr_prst(data, IIO_INTENSITY, &data->als_period);
1074         if (ret < 0)
1075                 return ret;
1076
1077         ret = ltr501_read_intr_prst(data, IIO_PROXIMITY, &data->ps_period);
1078         if (ret < 0)
1079                 return ret;
1080
1081         return ltr501_write_contr(data, data->als_contr, data->ps_contr);
1082 }
1083
1084 static bool ltr501_is_volatile_reg(struct device *dev, unsigned int reg)
1085 {
1086         switch (reg) {
1087         case LTR501_ALS_DATA1:
1088         case LTR501_ALS_DATA0:
1089         case LTR501_ALS_PS_STATUS:
1090         case LTR501_PS_DATA:
1091                 return true;
1092         default:
1093                 return false;
1094         }
1095 }
1096
1097 static struct regmap_config ltr501_regmap_config = {
1098         .name =  LTR501_REGMAP_NAME,
1099         .reg_bits = 8,
1100         .val_bits = 8,
1101         .max_register = LTR501_MAX_REG,
1102         .cache_type = REGCACHE_RBTREE,
1103         .volatile_reg = ltr501_is_volatile_reg,
1104 };
1105
1106 static int ltr501_powerdown(struct ltr501_data *data)
1107 {
1108         return ltr501_write_contr(data, data->als_contr & ~LTR501_CONTR_ACTIVE,
1109                                   data->ps_contr & ~LTR501_CONTR_ACTIVE);
1110 }
1111
1112 static int ltr501_probe(struct i2c_client *client,
1113                         const struct i2c_device_id *id)
1114 {
1115         struct ltr501_data *data;
1116         struct iio_dev *indio_dev;
1117         struct regmap *regmap;
1118         int ret, partid;
1119
1120         indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1121         if (!indio_dev)
1122                 return -ENOMEM;
1123
1124         regmap = devm_regmap_init_i2c(client, &ltr501_regmap_config);
1125         if (IS_ERR(regmap)) {
1126                 dev_err(&client->dev, "Regmap initialization failed.\n");
1127                 return PTR_ERR(regmap);
1128         }
1129
1130         data = iio_priv(indio_dev);
1131         i2c_set_clientdata(client, indio_dev);
1132         data->client = client;
1133         data->regmap = regmap;
1134         mutex_init(&data->lock_als);
1135         mutex_init(&data->lock_ps);
1136
1137         data->reg_it = devm_regmap_field_alloc(&client->dev, regmap,
1138                                                reg_field_it);
1139         if (IS_ERR(data->reg_it)) {
1140                 dev_err(&client->dev, "Integ time reg field init failed.\n");
1141                 return PTR_ERR(data->reg_it);
1142         }
1143
1144         data->reg_als_intr = devm_regmap_field_alloc(&client->dev, regmap,
1145                                                      reg_field_als_intr);
1146         if (IS_ERR(data->reg_als_intr)) {
1147                 dev_err(&client->dev, "ALS intr mode reg field init failed\n");
1148                 return PTR_ERR(data->reg_als_intr);
1149         }
1150
1151         data->reg_ps_intr = devm_regmap_field_alloc(&client->dev, regmap,
1152                                                     reg_field_ps_intr);
1153         if (IS_ERR(data->reg_ps_intr)) {
1154                 dev_err(&client->dev, "PS intr mode reg field init failed.\n");
1155                 return PTR_ERR(data->reg_ps_intr);
1156         }
1157
1158         data->reg_als_rate = devm_regmap_field_alloc(&client->dev, regmap,
1159                                                      reg_field_als_rate);
1160         if (IS_ERR(data->reg_als_rate)) {
1161                 dev_err(&client->dev, "ALS samp rate field init failed.\n");
1162                 return PTR_ERR(data->reg_als_rate);
1163         }
1164
1165         data->reg_ps_rate = devm_regmap_field_alloc(&client->dev, regmap,
1166                                                     reg_field_ps_rate);
1167         if (IS_ERR(data->reg_ps_rate)) {
1168                 dev_err(&client->dev, "PS samp rate field init failed.\n");
1169                 return PTR_ERR(data->reg_ps_rate);
1170         }
1171
1172         data->reg_als_prst = devm_regmap_field_alloc(&client->dev, regmap,
1173                                                      reg_field_als_prst);
1174         if (IS_ERR(data->reg_als_prst)) {
1175                 dev_err(&client->dev, "ALS prst reg field init failed\n");
1176                 return PTR_ERR(data->reg_als_prst);
1177         }
1178
1179         data->reg_ps_prst = devm_regmap_field_alloc(&client->dev, regmap,
1180                                                     reg_field_ps_prst);
1181         if (IS_ERR(data->reg_ps_prst)) {
1182                 dev_err(&client->dev, "PS prst reg field init failed.\n");
1183                 return PTR_ERR(data->reg_ps_prst);
1184         }
1185
1186         ret = regmap_read(data->regmap, LTR501_PART_ID, &partid);
1187         if (ret < 0)
1188                 return ret;
1189         if ((partid >> 4) != 0x8)
1190                 return -ENODEV;
1191
1192         indio_dev->dev.parent = &client->dev;
1193         indio_dev->channels = ltr501_channels;
1194         indio_dev->num_channels = ARRAY_SIZE(ltr501_channels);
1195         indio_dev->name = LTR501_DRV_NAME;
1196         indio_dev->modes = INDIO_DIRECT_MODE;
1197
1198         ret = ltr501_init(data);
1199         if (ret < 0)
1200                 return ret;
1201
1202         if (client->irq > 0) {
1203                 indio_dev->info = &ltr501_info;
1204                 ret = devm_request_threaded_irq(&client->dev, client->irq,
1205                                                 NULL, ltr501_interrupt_handler,
1206                                                 IRQF_TRIGGER_FALLING |
1207                                                 IRQF_ONESHOT,
1208                                                 "ltr501_thresh_event",
1209                                                 indio_dev);
1210                 if (ret) {
1211                         dev_err(&client->dev, "request irq (%d) failed\n",
1212                                 client->irq);
1213                         return ret;
1214                 }
1215         } else {
1216                 indio_dev->info = &ltr501_info_no_irq;
1217         }
1218
1219         ret = iio_triggered_buffer_setup(indio_dev, NULL,
1220                                          ltr501_trigger_handler, NULL);
1221         if (ret)
1222                 goto powerdown_on_error;
1223
1224         ret = iio_device_register(indio_dev);
1225         if (ret)
1226                 goto error_unreg_buffer;
1227
1228         return 0;
1229
1230 error_unreg_buffer:
1231         iio_triggered_buffer_cleanup(indio_dev);
1232 powerdown_on_error:
1233         ltr501_powerdown(data);
1234         return ret;
1235 }
1236
1237 static int ltr501_remove(struct i2c_client *client)
1238 {
1239         struct iio_dev *indio_dev = i2c_get_clientdata(client);
1240
1241         iio_device_unregister(indio_dev);
1242         iio_triggered_buffer_cleanup(indio_dev);
1243         ltr501_powerdown(iio_priv(indio_dev));
1244
1245         return 0;
1246 }
1247
1248 #ifdef CONFIG_PM_SLEEP
1249 static int ltr501_suspend(struct device *dev)
1250 {
1251         struct ltr501_data *data = iio_priv(i2c_get_clientdata(
1252                                             to_i2c_client(dev)));
1253         return ltr501_powerdown(data);
1254 }
1255
1256 static int ltr501_resume(struct device *dev)
1257 {
1258         struct ltr501_data *data = iio_priv(i2c_get_clientdata(
1259                                             to_i2c_client(dev)));
1260
1261         return ltr501_write_contr(data, data->als_contr,
1262                 data->ps_contr);
1263 }
1264 #endif
1265
1266 static SIMPLE_DEV_PM_OPS(ltr501_pm_ops, ltr501_suspend, ltr501_resume);
1267
1268 static const struct acpi_device_id ltr_acpi_match[] = {
1269         {"LTER0501", 0},
1270         { },
1271 };
1272 MODULE_DEVICE_TABLE(acpi, ltr_acpi_match);
1273
1274 static const struct i2c_device_id ltr501_id[] = {
1275         { "ltr501", 0 },
1276         { }
1277 };
1278 MODULE_DEVICE_TABLE(i2c, ltr501_id);
1279
1280 static struct i2c_driver ltr501_driver = {
1281         .driver = {
1282                 .name   = LTR501_DRV_NAME,
1283                 .pm     = &ltr501_pm_ops,
1284                 .acpi_match_table = ACPI_PTR(ltr_acpi_match),
1285                 .owner  = THIS_MODULE,
1286         },
1287         .probe  = ltr501_probe,
1288         .remove = ltr501_remove,
1289         .id_table = ltr501_id,
1290 };
1291
1292 module_i2c_driver(ltr501_driver);
1293
1294 MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
1295 MODULE_DESCRIPTION("Lite-On LTR501 ambient light and proximity sensor driver");
1296 MODULE_LICENSE("GPL");