Merge branch 'devicetree/arm-next' of git://git.secretlab.ca/git/linux-2.6 into devel...
[deliverable/linux.git] / drivers / staging / iio / accel / adis16209_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 "adis16209.h"
14
15 /**
16 * adis16209_data_rdy_trig_poll() the event handler for the data rdy trig
17 **/
18 static irqreturn_t adis16209_data_rdy_trig_poll(int irq, void *trig)
19 {
20 iio_trigger_poll(trig, iio_get_time_ns());
21 return IRQ_HANDLED;
22 }
23
24 /**
25 * adis16209_data_rdy_trigger_set_state() set datardy interrupt state
26 **/
27 static int adis16209_data_rdy_trigger_set_state(struct iio_trigger *trig,
28 bool state)
29 {
30 struct adis16209_state *st = trig->private_data;
31 struct iio_dev *indio_dev = st->indio_dev;
32
33 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
34 return adis16209_set_irq(st->indio_dev, state);
35 }
36
37 int adis16209_probe_trigger(struct iio_dev *indio_dev)
38 {
39 int ret;
40 struct adis16209_state *st = indio_dev->dev_data;
41
42 st->trig = iio_allocate_trigger("adis16209-dev%d", indio_dev->id);
43 if (st->trig == NULL) {
44 ret = -ENOMEM;
45 goto error_ret;
46 }
47
48 ret = request_irq(st->us->irq,
49 adis16209_data_rdy_trig_poll,
50 IRQF_TRIGGER_RISING,
51 "adis16209",
52 st->trig);
53 if (ret)
54 goto error_free_trig;
55 st->trig->dev.parent = &st->us->dev;
56 st->trig->owner = THIS_MODULE;
57 st->trig->private_data = st;
58 st->trig->set_trigger_state = &adis16209_data_rdy_trigger_set_state;
59 ret = iio_trigger_register(st->trig);
60
61 /* select default trigger */
62 indio_dev->trig = st->trig;
63 if (ret)
64 goto error_free_irq;
65
66 return 0;
67
68 error_free_irq:
69 free_irq(st->us->irq, st->trig);
70 error_free_trig:
71 iio_free_trigger(st->trig);
72 error_ret:
73 return ret;
74 }
75
76 void adis16209_remove_trigger(struct iio_dev *indio_dev)
77 {
78 struct adis16209_state *state = indio_dev->dev_data;
79
80 iio_trigger_unregister(state->trig);
81 free_irq(state->us->irq, state->trig);
82 iio_free_trigger(state->trig);
83 }
This page took 0.032964 seconds and 6 git commands to generate.