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