GNU Linux-libre 4.14.332-gnu1
[releases.git] / drivers / iio / proximity / as3935.c
1 /*
2  * as3935.c - Support for AS3935 Franklin lightning sensor
3  *
4  * Copyright (C) 2014 Matt Ranostay <mranostay@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 #include <linux/module.h>
19 #include <linux/init.h>
20 #include <linux/interrupt.h>
21 #include <linux/delay.h>
22 #include <linux/workqueue.h>
23 #include <linux/mutex.h>
24 #include <linux/err.h>
25 #include <linux/irq.h>
26 #include <linux/gpio.h>
27 #include <linux/spi/spi.h>
28 #include <linux/iio/iio.h>
29 #include <linux/iio/sysfs.h>
30 #include <linux/iio/trigger.h>
31 #include <linux/iio/trigger_consumer.h>
32 #include <linux/iio/buffer.h>
33 #include <linux/iio/triggered_buffer.h>
34 #include <linux/of_gpio.h>
35
36
37 #define AS3935_AFE_GAIN         0x00
38 #define AS3935_AFE_MASK         0x3F
39 #define AS3935_AFE_GAIN_MAX     0x1F
40 #define AS3935_AFE_PWR_BIT      BIT(0)
41
42 #define AS3935_NFLWDTH          0x01
43 #define AS3935_NFLWDTH_MASK     0x7f
44
45 #define AS3935_INT              0x03
46 #define AS3935_INT_MASK         0x0f
47 #define AS3935_DISTURB_INT      BIT(2)
48 #define AS3935_EVENT_INT        BIT(3)
49 #define AS3935_NOISE_INT        BIT(0)
50
51 #define AS3935_DATA             0x07
52 #define AS3935_DATA_MASK        0x3F
53
54 #define AS3935_TUNE_CAP         0x08
55 #define AS3935_DEFAULTS         0x3C
56 #define AS3935_CALIBRATE        0x3D
57
58 #define AS3935_READ_DATA        BIT(14)
59 #define AS3935_ADDRESS(x)       ((x) << 8)
60
61 #define MAX_PF_CAP              120
62 #define TUNE_CAP_DIV            8
63
64 struct as3935_state {
65         struct spi_device *spi;
66         struct iio_trigger *trig;
67         struct mutex lock;
68         struct delayed_work work;
69
70         unsigned long noise_tripped;
71         u32 tune_cap;
72         u32 nflwdth_reg;
73         /* Ensure timestamp is naturally aligned */
74         struct {
75                 u8 chan;
76                 s64 timestamp __aligned(8);
77         } scan;
78         u8 buf[2] ____cacheline_aligned;
79 };
80
81 static const struct iio_chan_spec as3935_channels[] = {
82         {
83                 .type           = IIO_PROXIMITY,
84                 .info_mask_separate =
85                         BIT(IIO_CHAN_INFO_RAW) |
86                         BIT(IIO_CHAN_INFO_PROCESSED) |
87                         BIT(IIO_CHAN_INFO_SCALE),
88                 .scan_index     = 0,
89                 .scan_type = {
90                         .sign           = 'u',
91                         .realbits       = 6,
92                         .storagebits    = 8,
93                 },
94         },
95         IIO_CHAN_SOFT_TIMESTAMP(1),
96 };
97
98 static int as3935_read(struct as3935_state *st, unsigned int reg, int *val)
99 {
100         u8 cmd;
101         int ret;
102
103         cmd = (AS3935_READ_DATA | AS3935_ADDRESS(reg)) >> 8;
104         ret = spi_w8r8(st->spi, cmd);
105         if (ret < 0)
106                 return ret;
107         *val = ret;
108
109         return 0;
110 }
111
112 static int as3935_write(struct as3935_state *st,
113                                 unsigned int reg,
114                                 unsigned int val)
115 {
116         u8 *buf = st->buf;
117
118         buf[0] = AS3935_ADDRESS(reg) >> 8;
119         buf[1] = val;
120
121         return spi_write(st->spi, buf, 2);
122 }
123
124 static ssize_t as3935_sensor_sensitivity_show(struct device *dev,
125                                         struct device_attribute *attr,
126                                         char *buf)
127 {
128         struct as3935_state *st = iio_priv(dev_to_iio_dev(dev));
129         int val, ret;
130
131         ret = as3935_read(st, AS3935_AFE_GAIN, &val);
132         if (ret)
133                 return ret;
134         val = (val & AS3935_AFE_MASK) >> 1;
135
136         return sprintf(buf, "%d\n", val);
137 }
138
139 static ssize_t as3935_sensor_sensitivity_store(struct device *dev,
140                                         struct device_attribute *attr,
141                                         const char *buf, size_t len)
142 {
143         struct as3935_state *st = iio_priv(dev_to_iio_dev(dev));
144         unsigned long val;
145         int ret;
146
147         ret = kstrtoul((const char *) buf, 10, &val);
148         if (ret)
149                 return -EINVAL;
150
151         if (val > AS3935_AFE_GAIN_MAX)
152                 return -EINVAL;
153
154         as3935_write(st, AS3935_AFE_GAIN, val << 1);
155
156         return len;
157 }
158
159 static ssize_t as3935_noise_level_tripped_show(struct device *dev,
160                                         struct device_attribute *attr,
161                                         char *buf)
162 {
163         struct as3935_state *st = iio_priv(dev_to_iio_dev(dev));
164         int ret;
165
166         mutex_lock(&st->lock);
167         ret = sprintf(buf, "%d\n", !time_after(jiffies, st->noise_tripped + HZ));
168         mutex_unlock(&st->lock);
169
170         return ret;
171 }
172
173 static IIO_DEVICE_ATTR(sensor_sensitivity, S_IRUGO | S_IWUSR,
174         as3935_sensor_sensitivity_show, as3935_sensor_sensitivity_store, 0);
175
176 static IIO_DEVICE_ATTR(noise_level_tripped, S_IRUGO,
177         as3935_noise_level_tripped_show, NULL, 0);
178
179 static struct attribute *as3935_attributes[] = {
180         &iio_dev_attr_sensor_sensitivity.dev_attr.attr,
181         &iio_dev_attr_noise_level_tripped.dev_attr.attr,
182         NULL,
183 };
184
185 static const struct attribute_group as3935_attribute_group = {
186         .attrs = as3935_attributes,
187 };
188
189 static int as3935_read_raw(struct iio_dev *indio_dev,
190                            struct iio_chan_spec const *chan,
191                            int *val,
192                            int *val2,
193                            long m)
194 {
195         struct as3935_state *st = iio_priv(indio_dev);
196         int ret;
197
198
199         switch (m) {
200         case IIO_CHAN_INFO_PROCESSED:
201         case IIO_CHAN_INFO_RAW:
202                 *val2 = 0;
203                 ret = as3935_read(st, AS3935_DATA, val);
204                 if (ret)
205                         return ret;
206
207                 /* storm out of range */
208                 if (*val == AS3935_DATA_MASK)
209                         return -EINVAL;
210
211                 if (m == IIO_CHAN_INFO_RAW)
212                         return IIO_VAL_INT;
213
214                 if (m == IIO_CHAN_INFO_PROCESSED)
215                         *val *= 1000;
216                 break;
217         case IIO_CHAN_INFO_SCALE:
218                 *val = 1000;
219                 break;
220         default:
221                 return -EINVAL;
222         }
223
224         return IIO_VAL_INT;
225 }
226
227 static const struct iio_info as3935_info = {
228         .driver_module = THIS_MODULE,
229         .attrs = &as3935_attribute_group,
230         .read_raw = &as3935_read_raw,
231 };
232
233 static irqreturn_t as3935_trigger_handler(int irq, void *private)
234 {
235         struct iio_poll_func *pf = private;
236         struct iio_dev *indio_dev = pf->indio_dev;
237         struct as3935_state *st = iio_priv(indio_dev);
238         int val, ret;
239
240         ret = as3935_read(st, AS3935_DATA, &val);
241         if (ret)
242                 goto err_read;
243
244         st->scan.chan = val & AS3935_DATA_MASK;
245         iio_push_to_buffers_with_timestamp(indio_dev, &st->scan,
246                                            iio_get_time_ns(indio_dev));
247 err_read:
248         iio_trigger_notify_done(indio_dev->trig);
249
250         return IRQ_HANDLED;
251 }
252
253 static const struct iio_trigger_ops iio_interrupt_trigger_ops = {
254         .owner = THIS_MODULE,
255 };
256
257 static void as3935_event_work(struct work_struct *work)
258 {
259         struct as3935_state *st;
260         int val;
261         int ret;
262
263         st = container_of(work, struct as3935_state, work.work);
264
265         ret = as3935_read(st, AS3935_INT, &val);
266         if (ret) {
267                 dev_warn(&st->spi->dev, "read error\n");
268                 return;
269         }
270
271         val &= AS3935_INT_MASK;
272
273         switch (val) {
274         case AS3935_EVENT_INT:
275                 iio_trigger_poll_chained(st->trig);
276                 break;
277         case AS3935_DISTURB_INT:
278         case AS3935_NOISE_INT:
279                 mutex_lock(&st->lock);
280                 st->noise_tripped = jiffies;
281                 mutex_unlock(&st->lock);
282                 dev_warn(&st->spi->dev, "noise level is too high\n");
283                 break;
284         }
285 }
286
287 static irqreturn_t as3935_interrupt_handler(int irq, void *private)
288 {
289         struct iio_dev *indio_dev = private;
290         struct as3935_state *st = iio_priv(indio_dev);
291
292         /*
293          * Delay work for >2 milliseconds after an interrupt to allow
294          * estimated distance to recalculated.
295          */
296
297         schedule_delayed_work(&st->work, msecs_to_jiffies(3));
298
299         return IRQ_HANDLED;
300 }
301
302 static void calibrate_as3935(struct as3935_state *st)
303 {
304         as3935_write(st, AS3935_DEFAULTS, 0x96);
305         as3935_write(st, AS3935_CALIBRATE, 0x96);
306         as3935_write(st, AS3935_TUNE_CAP,
307                 BIT(5) | (st->tune_cap / TUNE_CAP_DIV));
308
309         mdelay(2);
310         as3935_write(st, AS3935_TUNE_CAP, (st->tune_cap / TUNE_CAP_DIV));
311         as3935_write(st, AS3935_NFLWDTH, st->nflwdth_reg);
312 }
313
314 #ifdef CONFIG_PM_SLEEP
315 static int as3935_suspend(struct device *dev)
316 {
317         struct iio_dev *indio_dev = dev_get_drvdata(dev);
318         struct as3935_state *st = iio_priv(indio_dev);
319         int val, ret;
320
321         mutex_lock(&st->lock);
322         ret = as3935_read(st, AS3935_AFE_GAIN, &val);
323         if (ret)
324                 goto err_suspend;
325         val |= AS3935_AFE_PWR_BIT;
326
327         ret = as3935_write(st, AS3935_AFE_GAIN, val);
328
329 err_suspend:
330         mutex_unlock(&st->lock);
331
332         return ret;
333 }
334
335 static int as3935_resume(struct device *dev)
336 {
337         struct iio_dev *indio_dev = dev_get_drvdata(dev);
338         struct as3935_state *st = iio_priv(indio_dev);
339         int val, ret;
340
341         mutex_lock(&st->lock);
342         ret = as3935_read(st, AS3935_AFE_GAIN, &val);
343         if (ret)
344                 goto err_resume;
345         val &= ~AS3935_AFE_PWR_BIT;
346         ret = as3935_write(st, AS3935_AFE_GAIN, val);
347
348         calibrate_as3935(st);
349
350 err_resume:
351         mutex_unlock(&st->lock);
352
353         return ret;
354 }
355
356 static SIMPLE_DEV_PM_OPS(as3935_pm_ops, as3935_suspend, as3935_resume);
357 #define AS3935_PM_OPS (&as3935_pm_ops)
358
359 #else
360 #define AS3935_PM_OPS NULL
361 #endif
362
363 static int as3935_probe(struct spi_device *spi)
364 {
365         struct iio_dev *indio_dev;
366         struct iio_trigger *trig;
367         struct as3935_state *st;
368         struct device_node *np = spi->dev.of_node;
369         int ret;
370
371         /* Be sure lightning event interrupt is specified */
372         if (!spi->irq) {
373                 dev_err(&spi->dev, "unable to get event interrupt\n");
374                 return -EINVAL;
375         }
376
377         indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
378         if (!indio_dev)
379                 return -ENOMEM;
380
381         st = iio_priv(indio_dev);
382         st->spi = spi;
383
384         spi_set_drvdata(spi, indio_dev);
385         mutex_init(&st->lock);
386         INIT_DELAYED_WORK(&st->work, as3935_event_work);
387
388         ret = of_property_read_u32(np,
389                         "ams,tuning-capacitor-pf", &st->tune_cap);
390         if (ret) {
391                 st->tune_cap = 0;
392                 dev_warn(&spi->dev,
393                         "no tuning-capacitor-pf set, defaulting to %d",
394                         st->tune_cap);
395         }
396
397         if (st->tune_cap > MAX_PF_CAP) {
398                 dev_err(&spi->dev,
399                         "wrong tuning-capacitor-pf setting of %d\n",
400                         st->tune_cap);
401                 return -EINVAL;
402         }
403
404         ret = of_property_read_u32(np,
405                         "ams,nflwdth", &st->nflwdth_reg);
406         if (!ret && st->nflwdth_reg > AS3935_NFLWDTH_MASK) {
407                 dev_err(&spi->dev,
408                         "invalid nflwdth setting of %d\n",
409                         st->nflwdth_reg);
410                 return -EINVAL;
411         }
412
413         indio_dev->dev.parent = &spi->dev;
414         indio_dev->name = spi_get_device_id(spi)->name;
415         indio_dev->channels = as3935_channels;
416         indio_dev->num_channels = ARRAY_SIZE(as3935_channels);
417         indio_dev->modes = INDIO_DIRECT_MODE;
418         indio_dev->info = &as3935_info;
419
420         trig = devm_iio_trigger_alloc(&spi->dev, "%s-dev%d",
421                                       indio_dev->name, indio_dev->id);
422
423         if (!trig)
424                 return -ENOMEM;
425
426         st->trig = trig;
427         st->noise_tripped = jiffies - HZ;
428         trig->dev.parent = indio_dev->dev.parent;
429         iio_trigger_set_drvdata(trig, indio_dev);
430         trig->ops = &iio_interrupt_trigger_ops;
431
432         ret = iio_trigger_register(trig);
433         if (ret) {
434                 dev_err(&spi->dev, "failed to register trigger\n");
435                 return ret;
436         }
437
438         ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time,
439                 &as3935_trigger_handler, NULL);
440
441         if (ret) {
442                 dev_err(&spi->dev, "cannot setup iio trigger\n");
443                 goto unregister_trigger;
444         }
445
446         calibrate_as3935(st);
447
448         ret = devm_request_irq(&spi->dev, spi->irq,
449                                 &as3935_interrupt_handler,
450                                 IRQF_TRIGGER_RISING,
451                                 dev_name(&spi->dev),
452                                 indio_dev);
453
454         if (ret) {
455                 dev_err(&spi->dev, "unable to request irq\n");
456                 goto unregister_buffer;
457         }
458
459         ret = iio_device_register(indio_dev);
460         if (ret < 0) {
461                 dev_err(&spi->dev, "unable to register device\n");
462                 goto unregister_buffer;
463         }
464         return 0;
465
466 unregister_buffer:
467         iio_triggered_buffer_cleanup(indio_dev);
468
469 unregister_trigger:
470         iio_trigger_unregister(st->trig);
471
472         return ret;
473 }
474
475 static int as3935_remove(struct spi_device *spi)
476 {
477         struct iio_dev *indio_dev = spi_get_drvdata(spi);
478         struct as3935_state *st = iio_priv(indio_dev);
479
480         iio_device_unregister(indio_dev);
481         iio_triggered_buffer_cleanup(indio_dev);
482         iio_trigger_unregister(st->trig);
483
484         return 0;
485 }
486
487 static const struct of_device_id as3935_of_match[] = {
488         { .compatible = "ams,as3935", },
489         { /* sentinel */ },
490 };
491 MODULE_DEVICE_TABLE(of, as3935_of_match);
492
493 static const struct spi_device_id as3935_id[] = {
494         {"as3935", 0},
495         {},
496 };
497 MODULE_DEVICE_TABLE(spi, as3935_id);
498
499 static struct spi_driver as3935_driver = {
500         .driver = {
501                 .name   = "as3935",
502                 .of_match_table = of_match_ptr(as3935_of_match),
503                 .pm     = AS3935_PM_OPS,
504         },
505         .probe          = as3935_probe,
506         .remove         = as3935_remove,
507         .id_table       = as3935_id,
508 };
509 module_spi_driver(as3935_driver);
510
511 MODULE_AUTHOR("Matt Ranostay <mranostay@gmail.com>");
512 MODULE_DESCRIPTION("AS3935 lightning sensor");
513 MODULE_LICENSE("GPL");