1
#include <linux/interrupt.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>
12
#include "../trigger.h"
13
#include "adis16350.h"
16
* adis16350_data_rdy_trig_poll() the event handler for the data rdy trig
18
static int adis16350_data_rdy_trig_poll(struct iio_dev *dev_info,
23
struct adis16350_state *st = iio_dev_get_devdata(dev_info);
24
struct iio_trigger *trig = st->trig;
26
iio_trigger_poll(trig, timestamp);
31
IIO_EVENT_SH(data_rdy_trig, &adis16350_data_rdy_trig_poll);
33
static IIO_TRIGGER_NAME_ATTR;
35
static struct attribute *adis16350_trigger_attrs[] = {
40
static const struct attribute_group adis16350_trigger_attr_group = {
41
.attrs = adis16350_trigger_attrs,
45
* adis16350_data_rdy_trigger_set_state() set datardy interrupt state
47
static int adis16350_data_rdy_trigger_set_state(struct iio_trigger *trig,
50
struct adis16350_state *st = trig->private_data;
51
struct iio_dev *indio_dev = st->indio_dev;
54
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
55
ret = adis16350_set_irq(&st->indio_dev->dev, state);
57
iio_remove_event_from_list(&iio_event_data_rdy_trig,
58
&indio_dev->interrupts[0]
60
/* possible quirk with handler currently worked around
61
by ensuring the work queue is empty */
62
flush_scheduled_work();
64
iio_add_event_to_list(&iio_event_data_rdy_trig,
65
&indio_dev->interrupts[0]->ev_list);
71
* adis16350_trig_try_reen() try renabling irq for data rdy trigger
72
* @trig: the datardy trigger
74
static int adis16350_trig_try_reen(struct iio_trigger *trig)
76
struct adis16350_state *st = trig->private_data;
77
enable_irq(st->us->irq);
78
/* irq reenabled so success! */
82
int adis16350_probe_trigger(struct iio_dev *indio_dev)
85
struct adis16350_state *st = indio_dev->dev_data;
87
st->trig = iio_allocate_trigger();
88
st->trig->name = kasprintf(GFP_KERNEL,
91
if (!st->trig->name) {
95
st->trig->dev.parent = &st->us->dev;
96
st->trig->owner = THIS_MODULE;
97
st->trig->private_data = st;
98
st->trig->set_trigger_state = &adis16350_data_rdy_trigger_set_state;
99
st->trig->try_reenable = &adis16350_trig_try_reen;
100
st->trig->control_attrs = &adis16350_trigger_attr_group;
101
ret = iio_trigger_register(st->trig);
103
/* select default trigger */
104
indio_dev->trig = st->trig;
106
goto error_free_trig_name;
110
error_free_trig_name:
111
kfree(st->trig->name);
113
iio_free_trigger(st->trig);
118
void adis16350_remove_trigger(struct iio_dev *indio_dev)
120
struct adis16350_state *state = indio_dev->dev_data;
122
iio_trigger_unregister(state->trig);
123
kfree(state->trig->name);
124
iio_free_trigger(state->trig);