]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/iio/meter/ade7758_trigger.c
0adfcc639f2158f1888ecbf250cfe34c7923be31
[karo-tx-linux.git] / drivers / staging / iio / meter / ade7758_trigger.c
1 #include <linux/interrupt.h>
2 #include <linux/irq.h>
3 #include <linux/mutex.h>
4 #include <linux/device.h>
5 #include <linux/kernel.h>
6 #include <linux/sysfs.h>
7 #include <linux/list.h>
8 #include <linux/spi/spi.h>
9
10 #include "../iio.h"
11 #include "../sysfs.h"
12 #include "../trigger.h"
13 #include "ade7758.h"
14
15 /**
16  * ade7758_data_rdy_trig_poll() the event handler for the data rdy trig
17  **/
18 static irqreturn_t ade7758_data_rdy_trig_poll(int irq, void *private)
19 {
20         disable_irq_nosync(irq);
21         iio_trigger_poll(private, iio_get_time_ns());
22         return IRQ_HANDLED;
23 }
24
25 static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
26
27 static struct attribute *ade7758_trigger_attrs[] = {
28         &dev_attr_name.attr,
29         NULL,
30 };
31
32 static const struct attribute_group ade7758_trigger_attr_group = {
33         .attrs = ade7758_trigger_attrs,
34 };
35
36 /**
37  * ade7758_data_rdy_trigger_set_state() set datardy interrupt state
38  **/
39 static int ade7758_data_rdy_trigger_set_state(struct iio_trigger *trig,
40                                                 bool state)
41 {
42         struct ade7758_state *st = trig->private_data;
43         struct iio_dev *indio_dev = st->indio_dev;
44
45         dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
46         return ade7758_set_irq(&indio_dev->dev, state);
47 }
48
49 /**
50  * ade7758_trig_try_reen() try renabling irq for data rdy trigger
51  * @trig:       the datardy trigger
52  **/
53 static int ade7758_trig_try_reen(struct iio_trigger *trig)
54 {
55         struct ade7758_state *st = trig->private_data;
56         enable_irq(st->us->irq);
57         /* irq reenabled so success! */
58         return 0;
59 }
60
61 int ade7758_probe_trigger(struct iio_dev *indio_dev)
62 {
63         int ret;
64         struct ade7758_state *st = indio_dev->dev_data;
65
66
67         st->trig = iio_allocate_trigger();
68         if (st->trig == NULL) {
69                 ret = -ENOMEM;
70                 goto error_ret;
71         }
72         ret = request_irq(st->us->irq,
73                           ade7758_data_rdy_trig_poll,
74                           IRQF_TRIGGER_FALLING, "ade7758",
75                           st->trig);
76         if (ret)
77                 goto error_free_trig;
78
79         st->trig->name = kasprintf(GFP_KERNEL,
80                                 "ade7758-dev%d",
81                                 indio_dev->id);
82         if (!st->trig->name) {
83                 ret = -ENOMEM;
84                 goto error_free_irq;
85         }
86         st->trig->dev.parent = &st->us->dev;
87         st->trig->owner = THIS_MODULE;
88         st->trig->private_data = st;
89         st->trig->set_trigger_state = &ade7758_data_rdy_trigger_set_state;
90         st->trig->try_reenable = &ade7758_trig_try_reen;
91         st->trig->control_attrs = &ade7758_trigger_attr_group;
92         ret = iio_trigger_register(st->trig);
93
94         /* select default trigger */
95         indio_dev->trig = st->trig;
96         if (ret)
97                 goto error_free_trig_name;
98
99         return 0;
100
101 error_free_trig_name:
102         kfree(st->trig->name);
103 error_free_irq:
104         free_irq(st->us->irq, st->trig);
105 error_free_trig:
106         iio_free_trigger(st->trig);
107 error_ret:
108         return ret;
109 }
110
111 void ade7758_remove_trigger(struct iio_dev *indio_dev)
112 {
113         struct ade7758_state *state = indio_dev->dev_data;
114
115         iio_trigger_unregister(state->trig);
116         kfree(state->trig->name);
117         free_irq(state->us->irq, state->trig);
118         iio_free_trigger(state->trig);
119 }