Commit | Line | Data |
---|---|---|
f7fe1d1d | 1 | #include <linux/interrupt.h> |
f7fe1d1d | 2 | #include <linux/kernel.h> |
f7fe1d1d | 3 | #include <linux/spi/spi.h> |
8e336a72 | 4 | #include <linux/export.h> |
f7fe1d1d | 5 | |
06458e27 JC |
6 | #include <linux/iio/iio.h> |
7 | #include <linux/iio/trigger.h> | |
f7fe1d1d BS |
8 | #include "adis16201.h" |
9 | ||
f7fe1d1d BS |
10 | /** |
11 | * adis16201_data_rdy_trigger_set_state() set datardy interrupt state | |
12 | **/ | |
13 | static int adis16201_data_rdy_trigger_set_state(struct iio_trigger *trig, | |
14 | bool state) | |
15 | { | |
d31907f3 | 16 | struct iio_dev *indio_dev = trig->private_data; |
f7fe1d1d BS |
17 | |
18 | dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); | |
d31907f3 | 19 | return adis16201_set_irq(indio_dev, state); |
f7fe1d1d BS |
20 | } |
21 | ||
d29f73db JC |
22 | static const struct iio_trigger_ops adis16201_trigger_ops = { |
23 | .owner = THIS_MODULE, | |
24 | .set_trigger_state = &adis16201_data_rdy_trigger_set_state, | |
25 | }; | |
26 | ||
f7fe1d1d BS |
27 | int adis16201_probe_trigger(struct iio_dev *indio_dev) |
28 | { | |
29 | int ret; | |
d31907f3 | 30 | struct adis16201_state *st = iio_priv(indio_dev); |
f7fe1d1d | 31 | |
59c85e82 | 32 | st->trig = iio_allocate_trigger("adis16201-dev%d", indio_dev->id); |
05c2858d JC |
33 | if (st->trig == NULL) { |
34 | ret = -ENOMEM; | |
59c85e82 | 35 | goto error_ret; |
05c2858d | 36 | } |
80782446 | 37 | ret = request_irq(st->us->irq, |
05c2858d | 38 | &iio_trigger_generic_data_rdy_poll, |
80782446 JC |
39 | IRQF_TRIGGER_RISING, |
40 | "adis16201", | |
41 | st->trig); | |
42 | if (ret) | |
43 | goto error_free_trig; | |
f7fe1d1d | 44 | st->trig->dev.parent = &st->us->dev; |
d29f73db | 45 | st->trig->ops = &adis16201_trigger_ops; |
d31907f3 | 46 | st->trig->private_data = indio_dev; |
f7fe1d1d BS |
47 | ret = iio_trigger_register(st->trig); |
48 | ||
49 | /* select default trigger */ | |
50 | indio_dev->trig = st->trig; | |
51 | if (ret) | |
05c2858d | 52 | goto error_free_irq; |
f7fe1d1d BS |
53 | |
54 | return 0; | |
55 | ||
80782446 JC |
56 | error_free_irq: |
57 | free_irq(st->us->irq, st->trig); | |
f7fe1d1d BS |
58 | error_free_trig: |
59 | iio_free_trigger(st->trig); | |
80782446 | 60 | error_ret: |
f7fe1d1d BS |
61 | return ret; |
62 | } | |
63 | ||
64 | void adis16201_remove_trigger(struct iio_dev *indio_dev) | |
65 | { | |
d31907f3 | 66 | struct adis16201_state *state = iio_priv(indio_dev); |
f7fe1d1d BS |
67 | |
68 | iio_trigger_unregister(state->trig); | |
80782446 | 69 | free_irq(state->us->irq, state->trig); |
f7fe1d1d BS |
70 | iio_free_trigger(state->trig); |
71 | } |