GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / iio / light / tsl2563.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * drivers/iio/light/tsl2563.c
4  *
5  * Copyright (C) 2008 Nokia Corporation
6  *
7  * Written by Timo O. Karjalainen <timo.o.karjalainen@nokia.com>
8  * Contact: Amit Kucheria <amit.kucheria@verdurent.com>
9  *
10  * Converted to IIO driver
11  * Amit Kucheria <amit.kucheria@verdurent.com>
12  */
13
14 #include <linux/bits.h>
15 #include <linux/delay.h>
16 #include <linux/err.h>
17 #include <linux/i2c.h>
18 #include <linux/interrupt.h>
19 #include <linux/irq.h>
20 #include <linux/math.h>
21 #include <linux/mod_devicetable.h>
22 #include <linux/module.h>
23 #include <linux/mutex.h>
24 #include <linux/pm.h>
25 #include <linux/property.h>
26 #include <linux/sched.h>
27 #include <linux/slab.h>
28
29 #include <linux/iio/events.h>
30 #include <linux/iio/iio.h>
31 #include <linux/iio/sysfs.h>
32
33 /* Use this many bits for fraction part. */
34 #define ADC_FRAC_BITS           14
35
36 /* Given number of 1/10000's in ADC_FRAC_BITS precision. */
37 #define FRAC10K(f)              (((f) * BIT(ADC_FRAC_BITS)) / (10000))
38
39 /* Bits used for fraction in calibration coefficients.*/
40 #define CALIB_FRAC_BITS         10
41 /* Decimal 10^(digits in sysfs presentation) */
42 #define CALIB_BASE_SYSFS        1000
43
44 #define TSL2563_CMD             BIT(7)
45 #define TSL2563_CLEARINT        BIT(6)
46
47 #define TSL2563_REG_CTRL        0x00
48 #define TSL2563_REG_TIMING      0x01
49 #define TSL2563_REG_LOW         0x02 /* data0 low threshold, 2 bytes */
50 #define TSL2563_REG_HIGH        0x04 /* data0 high threshold, 2 bytes */
51 #define TSL2563_REG_INT         0x06
52 #define TSL2563_REG_ID          0x0a
53 #define TSL2563_REG_DATA0       0x0c /* broadband sensor value, 2 bytes */
54 #define TSL2563_REG_DATA1       0x0e /* infrared sensor value, 2 bytes */
55
56 #define TSL2563_CMD_POWER_ON    0x03
57 #define TSL2563_CMD_POWER_OFF   0x00
58 #define TSL2563_CTRL_POWER_MASK GENMASK(1, 0)
59
60 #define TSL2563_TIMING_13MS     0x00
61 #define TSL2563_TIMING_100MS    0x01
62 #define TSL2563_TIMING_400MS    0x02
63 #define TSL2563_TIMING_MASK     GENMASK(1, 0)
64 #define TSL2563_TIMING_GAIN16   0x10
65 #define TSL2563_TIMING_GAIN1    0x00
66
67 #define TSL2563_INT_DISABLED    0x00
68 #define TSL2563_INT_LEVEL       0x10
69 #define TSL2563_INT_MASK        GENMASK(5, 4)
70 #define TSL2563_INT_PERSIST(n)  ((n) & GENMASK(3, 0))
71
72 struct tsl2563_gainlevel_coeff {
73         u8 gaintime;
74         u16 min;
75         u16 max;
76 };
77
78 static const struct tsl2563_gainlevel_coeff tsl2563_gainlevel_table[] = {
79         {
80                 .gaintime       = TSL2563_TIMING_400MS | TSL2563_TIMING_GAIN16,
81                 .min            = 0,
82                 .max            = 65534,
83         }, {
84                 .gaintime       = TSL2563_TIMING_400MS | TSL2563_TIMING_GAIN1,
85                 .min            = 2048,
86                 .max            = 65534,
87         }, {
88                 .gaintime       = TSL2563_TIMING_100MS | TSL2563_TIMING_GAIN1,
89                 .min            = 4095,
90                 .max            = 37177,
91         }, {
92                 .gaintime       = TSL2563_TIMING_13MS | TSL2563_TIMING_GAIN1,
93                 .min            = 3000,
94                 .max            = 65535,
95         },
96 };
97
98 struct tsl2563_chip {
99         struct mutex            lock;
100         struct i2c_client       *client;
101         struct delayed_work     poweroff_work;
102
103         /* Remember state for suspend and resume functions */
104         bool suspended;
105
106         struct tsl2563_gainlevel_coeff const *gainlevel;
107
108         u16                     low_thres;
109         u16                     high_thres;
110         u8                      intr;
111         bool                    int_enabled;
112
113         /* Calibration coefficients */
114         u32                     calib0;
115         u32                     calib1;
116         int                     cover_comp_gain;
117
118         /* Cache current values, to be returned while suspended */
119         u32                     data0;
120         u32                     data1;
121 };
122
123 static int tsl2563_set_power(struct tsl2563_chip *chip, int on)
124 {
125         struct i2c_client *client = chip->client;
126         u8 cmd;
127
128         cmd = on ? TSL2563_CMD_POWER_ON : TSL2563_CMD_POWER_OFF;
129         return i2c_smbus_write_byte_data(client,
130                                          TSL2563_CMD | TSL2563_REG_CTRL, cmd);
131 }
132
133 /*
134  * Return value is 0 for off, 1 for on, or a negative error
135  * code if reading failed.
136  */
137 static int tsl2563_get_power(struct tsl2563_chip *chip)
138 {
139         struct i2c_client *client = chip->client;
140         int ret;
141
142         ret = i2c_smbus_read_byte_data(client, TSL2563_CMD | TSL2563_REG_CTRL);
143         if (ret < 0)
144                 return ret;
145
146         return (ret & TSL2563_CTRL_POWER_MASK) == TSL2563_CMD_POWER_ON;
147 }
148
149 static int tsl2563_configure(struct tsl2563_chip *chip)
150 {
151         int ret;
152
153         ret = i2c_smbus_write_byte_data(chip->client,
154                         TSL2563_CMD | TSL2563_REG_TIMING,
155                         chip->gainlevel->gaintime);
156         if (ret)
157                 goto error_ret;
158         ret = i2c_smbus_write_word_data(chip->client,
159                         TSL2563_CMD | TSL2563_REG_HIGH,
160                         chip->high_thres);
161         if (ret)
162                 goto error_ret;
163         ret = i2c_smbus_write_word_data(chip->client,
164                         TSL2563_CMD | TSL2563_REG_LOW,
165                         chip->low_thres);
166         if (ret)
167                 goto error_ret;
168 /*
169  * Interrupt register is automatically written anyway if it is relevant
170  * so is not here.
171  */
172 error_ret:
173         return ret;
174 }
175
176 static void tsl2563_poweroff_work(struct work_struct *work)
177 {
178         struct tsl2563_chip *chip =
179                 container_of(work, struct tsl2563_chip, poweroff_work.work);
180         tsl2563_set_power(chip, 0);
181 }
182
183 static int tsl2563_detect(struct tsl2563_chip *chip)
184 {
185         int ret;
186
187         ret = tsl2563_set_power(chip, 1);
188         if (ret)
189                 return ret;
190
191         ret = tsl2563_get_power(chip);
192         if (ret < 0)
193                 return ret;
194
195         return ret ? 0 : -ENODEV;
196 }
197
198 static int tsl2563_read_id(struct tsl2563_chip *chip, u8 *id)
199 {
200         struct i2c_client *client = chip->client;
201         int ret;
202
203         ret = i2c_smbus_read_byte_data(client, TSL2563_CMD | TSL2563_REG_ID);
204         if (ret < 0)
205                 return ret;
206
207         *id = ret;
208
209         return 0;
210 }
211
212 static int tsl2563_configure_irq(struct tsl2563_chip *chip, bool enable)
213 {
214         int ret;
215
216         chip->intr &= ~TSL2563_INT_MASK;
217         if (enable)
218                 chip->intr |= TSL2563_INT_LEVEL;
219
220         ret = i2c_smbus_write_byte_data(chip->client,
221                                         TSL2563_CMD | TSL2563_REG_INT,
222                                         chip->intr);
223         if (ret < 0)
224                 return ret;
225
226         chip->int_enabled = enable;
227         return 0;
228 }
229
230 /*
231  * "Normalized" ADC value is one obtained with 400ms of integration time and
232  * 16x gain. This function returns the number of bits of shift needed to
233  * convert between normalized values and HW values obtained using given
234  * timing and gain settings.
235  */
236 static int tsl2563_adc_shiftbits(u8 timing)
237 {
238         int shift = 0;
239
240         switch (timing & TSL2563_TIMING_MASK) {
241         case TSL2563_TIMING_13MS:
242                 shift += 5;
243                 break;
244         case TSL2563_TIMING_100MS:
245                 shift += 2;
246                 break;
247         case TSL2563_TIMING_400MS:
248                 /* no-op */
249                 break;
250         }
251
252         if (!(timing & TSL2563_TIMING_GAIN16))
253                 shift += 4;
254
255         return shift;
256 }
257
258 /* Convert a HW ADC value to normalized scale. */
259 static u32 tsl2563_normalize_adc(u16 adc, u8 timing)
260 {
261         return adc << tsl2563_adc_shiftbits(timing);
262 }
263
264 static void tsl2563_wait_adc(struct tsl2563_chip *chip)
265 {
266         unsigned int delay;
267
268         switch (chip->gainlevel->gaintime & TSL2563_TIMING_MASK) {
269         case TSL2563_TIMING_13MS:
270                 delay = 14;
271                 break;
272         case TSL2563_TIMING_100MS:
273                 delay = 101;
274                 break;
275         default:
276                 delay = 402;
277         }
278         /*
279          * TODO: Make sure that we wait at least required delay but why we
280          * have to extend it one tick more?
281          */
282         schedule_timeout_interruptible(msecs_to_jiffies(delay) + 2);
283 }
284
285 static int tsl2563_adjust_gainlevel(struct tsl2563_chip *chip, u16 adc)
286 {
287         struct i2c_client *client = chip->client;
288
289         if (adc > chip->gainlevel->max || adc < chip->gainlevel->min) {
290
291                 (adc > chip->gainlevel->max) ?
292                         chip->gainlevel++ : chip->gainlevel--;
293
294                 i2c_smbus_write_byte_data(client,
295                                           TSL2563_CMD | TSL2563_REG_TIMING,
296                                           chip->gainlevel->gaintime);
297
298                 tsl2563_wait_adc(chip);
299                 tsl2563_wait_adc(chip);
300
301                 return 1;
302         } else
303                 return 0;
304 }
305
306 static int tsl2563_get_adc(struct tsl2563_chip *chip)
307 {
308         struct i2c_client *client = chip->client;
309         u16 adc0, adc1;
310         int retry = 1;
311         int ret = 0;
312
313         if (chip->suspended)
314                 goto out;
315
316         if (!chip->int_enabled) {
317                 cancel_delayed_work_sync(&chip->poweroff_work);
318
319                 if (!tsl2563_get_power(chip)) {
320                         ret = tsl2563_set_power(chip, 1);
321                         if (ret)
322                                 goto out;
323                         ret = tsl2563_configure(chip);
324                         if (ret)
325                                 goto out;
326                         tsl2563_wait_adc(chip);
327                 }
328         }
329
330         while (retry) {
331                 ret = i2c_smbus_read_word_data(client,
332                                 TSL2563_CMD | TSL2563_REG_DATA0);
333                 if (ret < 0)
334                         goto out;
335                 adc0 = ret;
336
337                 ret = i2c_smbus_read_word_data(client,
338                                 TSL2563_CMD | TSL2563_REG_DATA1);
339                 if (ret < 0)
340                         goto out;
341                 adc1 = ret;
342
343                 retry = tsl2563_adjust_gainlevel(chip, adc0);
344         }
345
346         chip->data0 = tsl2563_normalize_adc(adc0, chip->gainlevel->gaintime);
347         chip->data1 = tsl2563_normalize_adc(adc1, chip->gainlevel->gaintime);
348
349         if (!chip->int_enabled)
350                 schedule_delayed_work(&chip->poweroff_work, 5 * HZ);
351
352         ret = 0;
353 out:
354         return ret;
355 }
356
357 static inline int tsl2563_calib_to_sysfs(u32 calib)
358 {
359         return (int)DIV_ROUND_CLOSEST(calib * CALIB_BASE_SYSFS, BIT(CALIB_FRAC_BITS));
360 }
361
362 static inline u32 tsl2563_calib_from_sysfs(int value)
363 {
364         /* Make a fraction from a number n that was multiplied with b. */
365         return (((u32) value) << CALIB_FRAC_BITS) / CALIB_BASE_SYSFS;
366 }
367
368 /*
369  * Conversions between lux and ADC values.
370  *
371  * The basic formula is lux = c0 * adc0 - c1 * adc1, where c0 and c1 are
372  * appropriate constants. Different constants are needed for different
373  * kinds of light, determined by the ratio adc1/adc0 (basically the ratio
374  * of the intensities in infrared and visible wavelengths). lux_table below
375  * lists the upper threshold of the adc1/adc0 ratio and the corresponding
376  * constants.
377  */
378
379 struct tsl2563_lux_coeff {
380         unsigned long ch_ratio;
381         unsigned long ch0_coeff;
382         unsigned long ch1_coeff;
383 };
384
385 static const struct tsl2563_lux_coeff lux_table[] = {
386         {
387                 .ch_ratio       = FRAC10K(1300),
388                 .ch0_coeff      = FRAC10K(315),
389                 .ch1_coeff      = FRAC10K(262),
390         }, {
391                 .ch_ratio       = FRAC10K(2600),
392                 .ch0_coeff      = FRAC10K(337),
393                 .ch1_coeff      = FRAC10K(430),
394         }, {
395                 .ch_ratio       = FRAC10K(3900),
396                 .ch0_coeff      = FRAC10K(363),
397                 .ch1_coeff      = FRAC10K(529),
398         }, {
399                 .ch_ratio       = FRAC10K(5200),
400                 .ch0_coeff      = FRAC10K(392),
401                 .ch1_coeff      = FRAC10K(605),
402         }, {
403                 .ch_ratio       = FRAC10K(6500),
404                 .ch0_coeff      = FRAC10K(229),
405                 .ch1_coeff      = FRAC10K(291),
406         }, {
407                 .ch_ratio       = FRAC10K(8000),
408                 .ch0_coeff      = FRAC10K(157),
409                 .ch1_coeff      = FRAC10K(180),
410         }, {
411                 .ch_ratio       = FRAC10K(13000),
412                 .ch0_coeff      = FRAC10K(34),
413                 .ch1_coeff      = FRAC10K(26),
414         }, {
415                 .ch_ratio       = ULONG_MAX,
416                 .ch0_coeff      = 0,
417                 .ch1_coeff      = 0,
418         },
419 };
420
421 /* Convert normalized, scaled ADC values to lux. */
422 static unsigned int tsl2563_adc_to_lux(u32 adc0, u32 adc1)
423 {
424         const struct tsl2563_lux_coeff *lp = lux_table;
425         unsigned long ratio, lux, ch0 = adc0, ch1 = adc1;
426
427         ratio = ch0 ? ((ch1 << ADC_FRAC_BITS) / ch0) : ULONG_MAX;
428
429         while (lp->ch_ratio < ratio)
430                 lp++;
431
432         lux = ch0 * lp->ch0_coeff - ch1 * lp->ch1_coeff;
433
434         return (unsigned int) (lux >> ADC_FRAC_BITS);
435 }
436
437 /* Apply calibration coefficient to ADC count. */
438 static u32 tsl2563_calib_adc(u32 adc, u32 calib)
439 {
440         unsigned long scaled = adc;
441
442         scaled *= calib;
443         scaled >>= CALIB_FRAC_BITS;
444
445         return (u32) scaled;
446 }
447
448 static int tsl2563_write_raw(struct iio_dev *indio_dev,
449                                struct iio_chan_spec const *chan,
450                                int val,
451                                int val2,
452                                long mask)
453 {
454         struct tsl2563_chip *chip = iio_priv(indio_dev);
455
456         if (mask != IIO_CHAN_INFO_CALIBSCALE)
457                 return -EINVAL;
458         if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
459                 chip->calib0 = tsl2563_calib_from_sysfs(val);
460         else if (chan->channel2 == IIO_MOD_LIGHT_IR)
461                 chip->calib1 = tsl2563_calib_from_sysfs(val);
462         else
463                 return -EINVAL;
464
465         return 0;
466 }
467
468 static int tsl2563_read_raw(struct iio_dev *indio_dev,
469                             struct iio_chan_spec const *chan,
470                             int *val,
471                             int *val2,
472                             long mask)
473 {
474         int ret = -EINVAL;
475         u32 calib0, calib1;
476         struct tsl2563_chip *chip = iio_priv(indio_dev);
477
478         mutex_lock(&chip->lock);
479         switch (mask) {
480         case IIO_CHAN_INFO_RAW:
481         case IIO_CHAN_INFO_PROCESSED:
482                 switch (chan->type) {
483                 case IIO_LIGHT:
484                         ret = tsl2563_get_adc(chip);
485                         if (ret)
486                                 goto error_ret;
487                         calib0 = tsl2563_calib_adc(chip->data0, chip->calib0) *
488                                 chip->cover_comp_gain;
489                         calib1 = tsl2563_calib_adc(chip->data1, chip->calib1) *
490                                 chip->cover_comp_gain;
491                         *val = tsl2563_adc_to_lux(calib0, calib1);
492                         ret = IIO_VAL_INT;
493                         break;
494                 case IIO_INTENSITY:
495                         ret = tsl2563_get_adc(chip);
496                         if (ret)
497                                 goto error_ret;
498                         if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
499                                 *val = chip->data0;
500                         else
501                                 *val = chip->data1;
502                         ret = IIO_VAL_INT;
503                         break;
504                 default:
505                         break;
506                 }
507                 break;
508
509         case IIO_CHAN_INFO_CALIBSCALE:
510                 if (chan->channel2 == IIO_MOD_LIGHT_BOTH)
511                         *val = tsl2563_calib_to_sysfs(chip->calib0);
512                 else
513                         *val = tsl2563_calib_to_sysfs(chip->calib1);
514                 ret = IIO_VAL_INT;
515                 break;
516         default:
517                 ret = -EINVAL;
518                 goto error_ret;
519         }
520
521 error_ret:
522         mutex_unlock(&chip->lock);
523         return ret;
524 }
525
526 static const struct iio_event_spec tsl2563_events[] = {
527         {
528                 .type = IIO_EV_TYPE_THRESH,
529                 .dir = IIO_EV_DIR_RISING,
530                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
531                                 BIT(IIO_EV_INFO_ENABLE),
532         }, {
533                 .type = IIO_EV_TYPE_THRESH,
534                 .dir = IIO_EV_DIR_FALLING,
535                 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
536                                 BIT(IIO_EV_INFO_ENABLE),
537         },
538 };
539
540 static const struct iio_chan_spec tsl2563_channels[] = {
541         {
542                 .type = IIO_LIGHT,
543                 .indexed = 1,
544                 .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
545                 .channel = 0,
546         }, {
547                 .type = IIO_INTENSITY,
548                 .modified = 1,
549                 .channel2 = IIO_MOD_LIGHT_BOTH,
550                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
551                 BIT(IIO_CHAN_INFO_CALIBSCALE),
552                 .event_spec = tsl2563_events,
553                 .num_event_specs = ARRAY_SIZE(tsl2563_events),
554         }, {
555                 .type = IIO_INTENSITY,
556                 .modified = 1,
557                 .channel2 = IIO_MOD_LIGHT_IR,
558                 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
559                 BIT(IIO_CHAN_INFO_CALIBSCALE),
560         }
561 };
562
563 static int tsl2563_read_thresh(struct iio_dev *indio_dev,
564         const struct iio_chan_spec *chan, enum iio_event_type type,
565         enum iio_event_direction dir, enum iio_event_info info, int *val,
566         int *val2)
567 {
568         struct tsl2563_chip *chip = iio_priv(indio_dev);
569
570         switch (dir) {
571         case IIO_EV_DIR_RISING:
572                 *val = chip->high_thres;
573                 break;
574         case IIO_EV_DIR_FALLING:
575                 *val = chip->low_thres;
576                 break;
577         default:
578                 return -EINVAL;
579         }
580
581         return IIO_VAL_INT;
582 }
583
584 static int tsl2563_write_thresh(struct iio_dev *indio_dev,
585         const struct iio_chan_spec *chan, enum iio_event_type type,
586         enum iio_event_direction dir, enum iio_event_info info, int val,
587         int val2)
588 {
589         struct tsl2563_chip *chip = iio_priv(indio_dev);
590         int ret;
591
592         mutex_lock(&chip->lock);
593
594         if (dir == IIO_EV_DIR_RISING)
595                 ret = i2c_smbus_write_word_data(chip->client,
596                                                 TSL2563_CMD | TSL2563_REG_HIGH, val);
597         else
598                 ret = i2c_smbus_write_word_data(chip->client,
599                                                 TSL2563_CMD | TSL2563_REG_LOW, val);
600         if (ret)
601                 goto error_ret;
602
603         if (dir == IIO_EV_DIR_RISING)
604                 chip->high_thres = val;
605         else
606                 chip->low_thres = val;
607
608 error_ret:
609         mutex_unlock(&chip->lock);
610
611         return ret;
612 }
613
614 static irqreturn_t tsl2563_event_handler(int irq, void *private)
615 {
616         struct iio_dev *dev_info = private;
617         struct tsl2563_chip *chip = iio_priv(dev_info);
618
619         iio_push_event(dev_info,
620                        IIO_UNMOD_EVENT_CODE(IIO_INTENSITY,
621                                             0,
622                                             IIO_EV_TYPE_THRESH,
623                                             IIO_EV_DIR_EITHER),
624                        iio_get_time_ns(dev_info));
625
626         /* clear the interrupt and push the event */
627         i2c_smbus_write_byte(chip->client, TSL2563_CMD | TSL2563_CLEARINT);
628         return IRQ_HANDLED;
629 }
630
631 static int tsl2563_write_interrupt_config(struct iio_dev *indio_dev,
632         const struct iio_chan_spec *chan, enum iio_event_type type,
633         enum iio_event_direction dir, int state)
634 {
635         struct tsl2563_chip *chip = iio_priv(indio_dev);
636         int ret = 0;
637
638         mutex_lock(&chip->lock);
639         if (state && !(chip->intr & TSL2563_INT_MASK)) {
640                 /* ensure the chip is actually on */
641                 cancel_delayed_work_sync(&chip->poweroff_work);
642                 if (!tsl2563_get_power(chip)) {
643                         ret = tsl2563_set_power(chip, 1);
644                         if (ret)
645                                 goto out;
646                         ret = tsl2563_configure(chip);
647                         if (ret)
648                                 goto out;
649                 }
650                 ret = tsl2563_configure_irq(chip, true);
651         }
652
653         if (!state && (chip->intr & TSL2563_INT_MASK)) {
654                 ret = tsl2563_configure_irq(chip, false);
655                 /* now the interrupt is not enabled, we can go to sleep */
656                 schedule_delayed_work(&chip->poweroff_work, 5 * HZ);
657         }
658 out:
659         mutex_unlock(&chip->lock);
660
661         return ret;
662 }
663
664 static int tsl2563_read_interrupt_config(struct iio_dev *indio_dev,
665         const struct iio_chan_spec *chan, enum iio_event_type type,
666         enum iio_event_direction dir)
667 {
668         struct tsl2563_chip *chip = iio_priv(indio_dev);
669         int ret;
670
671         mutex_lock(&chip->lock);
672         ret = i2c_smbus_read_byte_data(chip->client,
673                                        TSL2563_CMD | TSL2563_REG_INT);
674         mutex_unlock(&chip->lock);
675         if (ret < 0)
676                 return ret;
677
678         return !!(ret & TSL2563_INT_MASK);
679 }
680
681 static const struct iio_info tsl2563_info_no_irq = {
682         .read_raw = &tsl2563_read_raw,
683         .write_raw = &tsl2563_write_raw,
684 };
685
686 static const struct iio_info tsl2563_info = {
687         .read_raw = &tsl2563_read_raw,
688         .write_raw = &tsl2563_write_raw,
689         .read_event_value = &tsl2563_read_thresh,
690         .write_event_value = &tsl2563_write_thresh,
691         .read_event_config = &tsl2563_read_interrupt_config,
692         .write_event_config = &tsl2563_write_interrupt_config,
693 };
694
695 static int tsl2563_probe(struct i2c_client *client)
696 {
697         struct device *dev = &client->dev;
698         struct iio_dev *indio_dev;
699         struct tsl2563_chip *chip;
700         unsigned long irq_flags;
701         u8 id = 0;
702         int err;
703
704         indio_dev = devm_iio_device_alloc(dev, sizeof(*chip));
705         if (!indio_dev)
706                 return -ENOMEM;
707
708         chip = iio_priv(indio_dev);
709
710         i2c_set_clientdata(client, indio_dev);
711         chip->client = client;
712
713         err = tsl2563_detect(chip);
714         if (err)
715                 return dev_err_probe(dev, err, "detect error\n");
716
717         err = tsl2563_read_id(chip, &id);
718         if (err)
719                 return dev_err_probe(dev, err, "read id error\n");
720
721         mutex_init(&chip->lock);
722
723         /* Default values used until userspace says otherwise */
724         chip->low_thres = 0x0;
725         chip->high_thres = 0xffff;
726         chip->gainlevel = tsl2563_gainlevel_table;
727         chip->intr = TSL2563_INT_PERSIST(4);
728         chip->calib0 = tsl2563_calib_from_sysfs(CALIB_BASE_SYSFS);
729         chip->calib1 = tsl2563_calib_from_sysfs(CALIB_BASE_SYSFS);
730
731         chip->cover_comp_gain = 1;
732         device_property_read_u32(dev, "amstaos,cover-comp-gain", &chip->cover_comp_gain);
733
734         dev_info(dev, "model %d, rev. %d\n", id >> 4, id & 0x0f);
735         indio_dev->name = client->name;
736         indio_dev->channels = tsl2563_channels;
737         indio_dev->num_channels = ARRAY_SIZE(tsl2563_channels);
738         indio_dev->modes = INDIO_DIRECT_MODE;
739
740         if (client->irq)
741                 indio_dev->info = &tsl2563_info;
742         else
743                 indio_dev->info = &tsl2563_info_no_irq;
744
745         if (client->irq) {
746                 irq_flags = irq_get_trigger_type(client->irq);
747                 if (irq_flags == IRQF_TRIGGER_NONE)
748                         irq_flags = IRQF_TRIGGER_RISING;
749                 irq_flags |= IRQF_ONESHOT;
750
751                 err = devm_request_threaded_irq(dev, client->irq,
752                                            NULL,
753                                            &tsl2563_event_handler,
754                                            irq_flags,
755                                            "tsl2563_event",
756                                            indio_dev);
757                 if (err)
758                         return dev_err_probe(dev, err, "irq request error\n");
759         }
760
761         err = tsl2563_configure(chip);
762         if (err)
763                 return dev_err_probe(dev, err, "configure error\n");
764
765         INIT_DELAYED_WORK(&chip->poweroff_work, tsl2563_poweroff_work);
766
767         /* The interrupt cannot yet be enabled so this is fine without lock */
768         schedule_delayed_work(&chip->poweroff_work, 5 * HZ);
769
770         err = iio_device_register(indio_dev);
771         if (err) {
772                 dev_err_probe(dev, err, "iio registration error\n");
773                 goto fail;
774         }
775
776         return 0;
777
778 fail:
779         cancel_delayed_work_sync(&chip->poweroff_work);
780         return err;
781 }
782
783 static void tsl2563_remove(struct i2c_client *client)
784 {
785         struct iio_dev *indio_dev = i2c_get_clientdata(client);
786         struct tsl2563_chip *chip = iio_priv(indio_dev);
787
788         iio_device_unregister(indio_dev);
789         if (!chip->int_enabled)
790                 cancel_delayed_work_sync(&chip->poweroff_work);
791         /* Ensure that interrupts are disabled - then flush any bottom halves */
792         tsl2563_configure_irq(chip, false);
793         tsl2563_set_power(chip, 0);
794 }
795
796 static int tsl2563_suspend(struct device *dev)
797 {
798         struct iio_dev *indio_dev = dev_get_drvdata(dev);
799         struct tsl2563_chip *chip = iio_priv(indio_dev);
800         int ret;
801
802         mutex_lock(&chip->lock);
803
804         ret = tsl2563_set_power(chip, 0);
805         if (ret)
806                 goto out;
807
808         chip->suspended = true;
809
810 out:
811         mutex_unlock(&chip->lock);
812         return ret;
813 }
814
815 static int tsl2563_resume(struct device *dev)
816 {
817         struct iio_dev *indio_dev = dev_get_drvdata(dev);
818         struct tsl2563_chip *chip = iio_priv(indio_dev);
819         int ret;
820
821         mutex_lock(&chip->lock);
822
823         ret = tsl2563_set_power(chip, 1);
824         if (ret)
825                 goto out;
826
827         ret = tsl2563_configure(chip);
828         if (ret)
829                 goto out;
830
831         chip->suspended = false;
832
833 out:
834         mutex_unlock(&chip->lock);
835         return ret;
836 }
837
838 static DEFINE_SIMPLE_DEV_PM_OPS(tsl2563_pm_ops, tsl2563_suspend,
839                                 tsl2563_resume);
840
841 static const struct i2c_device_id tsl2563_id[] = {
842         { "tsl2560", 0 },
843         { "tsl2561", 1 },
844         { "tsl2562", 2 },
845         { "tsl2563", 3 },
846         {}
847 };
848 MODULE_DEVICE_TABLE(i2c, tsl2563_id);
849
850 static const struct of_device_id tsl2563_of_match[] = {
851         { .compatible = "amstaos,tsl2560" },
852         { .compatible = "amstaos,tsl2561" },
853         { .compatible = "amstaos,tsl2562" },
854         { .compatible = "amstaos,tsl2563" },
855         {}
856 };
857 MODULE_DEVICE_TABLE(of, tsl2563_of_match);
858
859 static struct i2c_driver tsl2563_i2c_driver = {
860         .driver = {
861                 .name    = "tsl2563",
862                 .of_match_table = tsl2563_of_match,
863                 .pm     = pm_sleep_ptr(&tsl2563_pm_ops),
864         },
865         .probe          = tsl2563_probe,
866         .remove         = tsl2563_remove,
867         .id_table       = tsl2563_id,
868 };
869 module_i2c_driver(tsl2563_i2c_driver);
870
871 MODULE_AUTHOR("Nokia Corporation");
872 MODULE_DESCRIPTION("tsl2563 light sensor driver");
873 MODULE_LICENSE("GPL");