aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/iio/accel
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/iio/accel')
-rw-r--r--drivers/staging/iio/accel/accel.h87
-rw-r--r--drivers/staging/iio/accel/adis16201_ring.c152
-rw-r--r--drivers/staging/iio/accel/adis16201_trigger.c71
-rw-r--r--drivers/staging/iio/accel/adis16203_ring.c158
-rw-r--r--drivers/staging/iio/accel/adis16203_trigger.c74
-rw-r--r--drivers/staging/iio/accel/adis16204_ring.c154
-rw-r--r--drivers/staging/iio/accel/adis16204_trigger.c74
-rw-r--r--drivers/staging/iio/accel/adis16209_ring.c157
-rw-r--r--drivers/staging/iio/accel/adis16209_trigger.c82
-rw-r--r--drivers/staging/iio/accel/adis16240_ring.c152
-rw-r--r--drivers/staging/iio/accel/adis16240_trigger.c83
-rw-r--r--drivers/staging/iio/accel/inclinometer.h25
12 files changed, 1269 insertions, 0 deletions
diff --git a/drivers/staging/iio/accel/accel.h b/drivers/staging/iio/accel/accel.h
new file mode 100644
index 00000000000..50651f835ce
--- /dev/null
+++ b/drivers/staging/iio/accel/accel.h
@@ -0,0 +1,87 @@
1
2#include "../sysfs.h"
3
4/* Accelerometer types of attribute */
5#define IIO_DEV_ATTR_ACCEL_OFFSET(_mode, _show, _store, _addr) \
6 IIO_DEVICE_ATTR(accel_offset, _mode, _show, _store, _addr)
7
8#define IIO_DEV_ATTR_ACCEL_X_OFFSET(_mode, _show, _store, _addr) \
9 IIO_DEVICE_ATTR(accel_x_offset, _mode, _show, _store, _addr)
10
11#define IIO_DEV_ATTR_ACCEL_Y_OFFSET(_mode, _show, _store, _addr) \
12 IIO_DEVICE_ATTR(accel_y_offset, _mode, _show, _store, _addr)
13
14#define IIO_DEV_ATTR_ACCEL_Z_OFFSET(_mode, _show, _store, _addr) \
15 IIO_DEVICE_ATTR(accel_z_offset, _mode, _show, _store, _addr)
16
17#define IIO_CONST_ATTR_ACCEL_SCALE(_string) \
18 IIO_CONST_ATTR(accel_scale, _string)
19
20#define IIO_DEV_ATTR_ACCEL_SCALE(_mode, _show, _store, _addr) \
21 IIO_DEVICE_ATTR(accel_scale, _mode, _show, _store, _addr)
22
23#define IIO_DEV_ATTR_ACCEL_X_SCALE(_mode, _show, _store, _addr) \
24 IIO_DEVICE_ATTR(accel_x_scale, _mode, _show, _store, _addr)
25
26#define IIO_DEV_ATTR_ACCEL_Y_SCALE(_mode, _show, _store, _addr) \
27 IIO_DEVICE_ATTR(accel_y_scale, _mode, _show, _store, _addr)
28
29#define IIO_DEV_ATTR_ACCEL_Z_SCALE(_mode, _show, _store, _addr) \
30 IIO_DEVICE_ATTR(accel_z_scale, _mode, _show, _store, _addr)
31
32#define IIO_DEV_ATTR_ACCEL_CALIBBIAS(_mode, _show, _store, _addr) \
33 IIO_DEVICE_ATTR(accel_calibbias, _mode, _show, _store, _addr)
34
35#define IIO_DEV_ATTR_ACCEL_X_CALIBBIAS(_mode, _show, _store, _addr) \
36 IIO_DEVICE_ATTR(accel_x_calibbias, _mode, _show, _store, _addr)
37
38#define IIO_DEV_ATTR_ACCEL_Y_CALIBBIAS(_mode, _show, _store, _addr) \
39 IIO_DEVICE_ATTR(accel_y_calibbias, _mode, _show, _store, _addr)
40
41#define IIO_DEV_ATTR_ACCEL_Z_CALIBBIAS(_mode, _show, _store, _addr) \
42 IIO_DEVICE_ATTR(accel_z_calibbias, _mode, _show, _store, _addr)
43
44#define IIO_DEV_ATTR_ACCEL_CALIBSCALE(_mode, _show, _store, _addr) \
45 IIO_DEVICE_ATTR(accel_calibscale, _mode, _show, _store, _addr)
46
47#define IIO_DEV_ATTR_ACCEL_X_CALIBSCALE(_mode, _show, _store, _addr) \
48 IIO_DEVICE_ATTR(accel_x_calibscale, _mode, _show, _store, _addr)
49
50#define IIO_DEV_ATTR_ACCEL_Y_CALIBSCALE(_mode, _show, _store, _addr) \
51 IIO_DEVICE_ATTR(accel_y_calibscale, _mode, _show, _store, _addr)
52
53#define IIO_DEV_ATTR_ACCEL_Z_CALIBSCALE(_mode, _show, _store, _addr) \
54 IIO_DEVICE_ATTR(accel_z_calibscale, _mode, _show, _store, _addr)
55
56#define IIO_DEV_ATTR_ACCEL(_show, _addr) \
57 IIO_DEVICE_ATTR(accel_raw, S_IRUGO, _show, NULL, _addr)
58
59#define IIO_DEV_ATTR_ACCEL_X(_show, _addr) \
60 IIO_DEVICE_ATTR(accel_x_raw, S_IRUGO, _show, NULL, _addr)
61
62#define IIO_DEV_ATTR_ACCEL_Y(_show, _addr) \
63 IIO_DEVICE_ATTR(accel_y_raw, S_IRUGO, _show, NULL, _addr)
64
65#define IIO_DEV_ATTR_ACCEL_Z(_show, _addr) \
66 IIO_DEVICE_ATTR(accel_z_raw, S_IRUGO, _show, NULL, _addr)
67
68#define IIO_DEV_ATTR_ACCEL_XY(_show, _addr) \
69 IIO_DEVICE_ATTR(accel_xy, S_IRUGO, _show, NULL, _addr)
70
71#define IIO_DEV_ATTR_ACCEL_PEAK(_show, _addr) \
72 IIO_DEVICE_ATTR(accel_peak, S_IRUGO, _show, NULL, _addr)
73
74#define IIO_DEV_ATTR_ACCEL_XPEAK(_show, _addr) \
75 IIO_DEVICE_ATTR(accel_xpeak, S_IRUGO, _show, NULL, _addr)
76
77#define IIO_DEV_ATTR_ACCEL_YPEAK(_show, _addr) \
78 IIO_DEVICE_ATTR(accel_ypeak, S_IRUGO, _show, NULL, _addr)
79
80#define IIO_DEV_ATTR_ACCEL_ZPEAK(_show, _addr) \
81 IIO_DEVICE_ATTR(accel_zpeak, S_IRUGO, _show, NULL, _addr)
82
83#define IIO_DEV_ATTR_ACCEL_XYPEAK(_show, _addr) \
84 IIO_DEVICE_ATTR(accel_xypeak, S_IRUGO, _show, NULL, _addr)
85
86#define IIO_DEV_ATTR_ACCEL_XYZPEAK(_show, _addr) \
87 IIO_DEVICE_ATTR(accel_xyzpeak, S_IRUGO, _show, NULL, _addr)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
new file mode 100644
index 00000000000..66e708ddf8b
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -0,0 +1,152 @@
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/spi/spi.h>
7#include <linux/slab.h>
8#include <linux/sysfs.h>
9
10#include "../iio.h"
11#include "../sysfs.h"
12#include "../ring_sw.h"
13#include "accel.h"
14#include "../trigger.h"
15#include "adis16201.h"
16
17
18/**
19 * adis16201_read_ring_data() read data registers which will be placed into ring
20 * @dev: device associated with child of actual device (iio_dev or iio_trig)
21 * @rx: somewhere to pass back the value read
22 **/
23static int adis16201_read_ring_data(struct iio_dev *indio_dev, u8 *rx)
24{
25 struct spi_message msg;
26 struct adis16201_state *st = iio_priv(indio_dev);
27 struct spi_transfer xfers[ADIS16201_OUTPUTS + 1];
28 int ret;
29 int i;
30
31 mutex_lock(&st->buf_lock);
32
33 spi_message_init(&msg);
34
35 memset(xfers, 0, sizeof(xfers));
36 for (i = 0; i <= ADIS16201_OUTPUTS; i++) {
37 xfers[i].bits_per_word = 8;
38 xfers[i].cs_change = 1;
39 xfers[i].len = 2;
40 xfers[i].delay_usecs = 20;
41 xfers[i].tx_buf = st->tx + 2 * i;
42 st->tx[2 * i] = ADIS16201_READ_REG(ADIS16201_SUPPLY_OUT +
43 2 * i);
44 st->tx[2 * i + 1] = 0;
45 if (i >= 1)
46 xfers[i].rx_buf = rx + 2 * (i - 1);
47 spi_message_add_tail(&xfers[i], &msg);
48 }
49
50 ret = spi_sync(st->us, &msg);
51 if (ret)
52 dev_err(&st->us->dev, "problem when burst reading");
53
54 mutex_unlock(&st->buf_lock);
55
56 return ret;
57}
58
59/* Whilst this makes a lot of calls to iio_sw_ring functions - it is to device
60 * specific to be rolled into the core.
61 */
62static irqreturn_t adis16201_trigger_handler(int irq, void *p)
63{
64 struct iio_poll_func *pf = p;
65 struct iio_dev *indio_dev = pf->private_data;
66 struct adis16201_state *st = iio_priv(indio_dev);
67 struct iio_ring_buffer *ring = indio_dev->ring;
68
69 int i = 0;
70 s16 *data;
71 size_t datasize = ring->access->get_bytes_per_datum(ring);
72
73 data = kmalloc(datasize, GFP_KERNEL);
74 if (data == NULL) {
75 dev_err(&st->us->dev, "memory alloc failed in ring bh");
76 return -ENOMEM;
77 }
78
79 if (ring->scan_count)
80 if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
81 for (; i < ring->scan_count; i++)
82 data[i] = be16_to_cpup(
83 (__be16 *)&(st->rx[i*2]));
84
85 /* Guaranteed to be aligned with 8 byte boundary */
86 if (ring->scan_timestamp)
87 *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
88
89 ring->access->store_to(ring, (u8 *)data, pf->timestamp);
90
91 iio_trigger_notify_done(indio_dev->trig);
92 kfree(data);
93
94 return IRQ_HANDLED;
95}
96
97void adis16201_unconfigure_ring(struct iio_dev *indio_dev)
98{
99 iio_dealloc_pollfunc(indio_dev->pollfunc);
100 iio_sw_rb_free(indio_dev->ring);
101}
102
103static const struct iio_ring_setup_ops adis16201_ring_setup_ops = {
104 .preenable = &iio_sw_ring_preenable,
105 .postenable = &iio_triggered_ring_postenable,
106 .predisable = &iio_triggered_ring_predisable,
107};
108
109int adis16201_configure_ring(struct iio_dev *indio_dev)
110{
111 int ret = 0;
112 struct iio_ring_buffer *ring;
113
114 ring = iio_sw_rb_allocate(indio_dev);
115 if (!ring) {
116 ret = -ENOMEM;
117 return ret;
118 }
119 indio_dev->ring = ring;
120 /* Effectively select the ring buffer implementation */
121 ring->bpe = 2;
122 ring->scan_timestamp = true;
123 ring->access = &ring_sw_access_funcs;
124 ring->setup_ops = &adis16201_ring_setup_ops;
125 ring->owner = THIS_MODULE;
126
127 /* Set default scan mode */
128 iio_scan_mask_set(ring, ADIS16201_SCAN_SUPPLY);
129 iio_scan_mask_set(ring, ADIS16201_SCAN_ACC_X);
130 iio_scan_mask_set(ring, ADIS16201_SCAN_ACC_Y);
131 iio_scan_mask_set(ring, ADIS16201_SCAN_AUX_ADC);
132 iio_scan_mask_set(ring, ADIS16201_SCAN_TEMP);
133 iio_scan_mask_set(ring, ADIS16201_SCAN_INCLI_X);
134 iio_scan_mask_set(ring, ADIS16201_SCAN_INCLI_Y);
135
136 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
137 &adis16201_trigger_handler,
138 IRQF_ONESHOT,
139 indio_dev,
140 "adis16201_consumer%d",
141 indio_dev->id);
142 if (indio_dev->pollfunc == NULL) {
143 ret = -ENOMEM;
144 goto error_iio_sw_rb_free;
145 }
146
147 indio_dev->modes |= INDIO_RING_TRIGGERED;
148 return 0;
149error_iio_sw_rb_free:
150 iio_sw_rb_free(indio_dev->ring);
151 return ret;
152}
diff --git a/drivers/staging/iio/accel/adis16201_trigger.c b/drivers/staging/iio/accel/adis16201_trigger.c
new file mode 100644
index 00000000000..3a95c083b45
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16201_trigger.c
@@ -0,0 +1,71 @@
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/spi/spi.h>
8
9#include "../iio.h"
10#include "../sysfs.h"
11#include "../trigger.h"
12#include "adis16201.h"
13
14/**
15 * adis16201_data_rdy_trigger_set_state() set datardy interrupt state
16 **/
17static int adis16201_data_rdy_trigger_set_state(struct iio_trigger *trig,
18 bool state)
19{
20 struct iio_dev *indio_dev = trig->private_data;
21
22 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
23 return adis16201_set_irq(indio_dev, state);
24}
25
26int adis16201_probe_trigger(struct iio_dev *indio_dev)
27{
28 int ret;
29 struct adis16201_state *st = iio_priv(indio_dev);
30
31 st->trig = iio_allocate_trigger("adis16201-dev%d", indio_dev->id);
32 if (st->trig == NULL) {
33 ret = -ENOMEM;
34 goto error_ret;
35 }
36 ret = request_irq(st->us->irq,
37 &iio_trigger_generic_data_rdy_poll,
38 IRQF_TRIGGER_RISING,
39 "adis16201",
40 st->trig);
41 if (ret)
42 goto error_free_trig;
43 st->trig->dev.parent = &st->us->dev;
44 st->trig->owner = THIS_MODULE;
45 st->trig->private_data = indio_dev;
46 st->trig->set_trigger_state = &adis16201_data_rdy_trigger_set_state;
47 ret = iio_trigger_register(st->trig);
48
49 /* select default trigger */
50 indio_dev->trig = st->trig;
51 if (ret)
52 goto error_free_irq;
53
54 return 0;
55
56error_free_irq:
57 free_irq(st->us->irq, st->trig);
58error_free_trig:
59 iio_free_trigger(st->trig);
60error_ret:
61 return ret;
62}
63
64void adis16201_remove_trigger(struct iio_dev *indio_dev)
65{
66 struct adis16201_state *state = iio_priv(indio_dev);
67
68 iio_trigger_unregister(state->trig);
69 free_irq(state->us->irq, state->trig);
70 iio_free_trigger(state->trig);
71}
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
new file mode 100644
index 00000000000..d2c07c52746
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -0,0 +1,158 @@
1#include <linux/interrupt.h>
2#include <linux/irq.h>
3#include <linux/gpio.h>
4#include <linux/workqueue.h>
5#include <linux/mutex.h>
6#include <linux/device.h>
7#include <linux/kernel.h>
8#include <linux/spi/spi.h>
9#include <linux/slab.h>
10#include <linux/sysfs.h>
11#include <linux/list.h>
12
13#include "../iio.h"
14#include "../sysfs.h"
15#include "../ring_sw.h"
16#include "accel.h"
17#include "../trigger.h"
18#include "adis16203.h"
19
20/**
21 * adis16203_read_ring_data() read data registers which will be placed into ring
22 * @dev: device associated with child of actual device (iio_dev or iio_trig)
23 * @rx: somewhere to pass back the value read
24 **/
25static int adis16203_read_ring_data(struct device *dev, u8 *rx)
26{
27 struct spi_message msg;
28 struct iio_dev *indio_dev = dev_get_drvdata(dev);
29 struct adis16203_state *st = iio_priv(indio_dev);
30 struct spi_transfer xfers[ADIS16203_OUTPUTS + 1];
31 int ret;
32 int i;
33
34 mutex_lock(&st->buf_lock);
35
36 spi_message_init(&msg);
37
38 memset(xfers, 0, sizeof(xfers));
39 for (i = 0; i <= ADIS16203_OUTPUTS; i++) {
40 xfers[i].bits_per_word = 8;
41 xfers[i].cs_change = 1;
42 xfers[i].len = 2;
43 xfers[i].delay_usecs = 20;
44 xfers[i].tx_buf = st->tx + 2 * i;
45 if (i < 1) /* SUPPLY_OUT: 0x02, AUX_ADC: 0x08 */
46 st->tx[2 * i] = ADIS16203_READ_REG(ADIS16203_SUPPLY_OUT + 2 * i);
47 else
48 st->tx[2 * i] = ADIS16203_READ_REG(ADIS16203_SUPPLY_OUT + 2 * i + 6);
49 st->tx[2 * i + 1] = 0;
50 if (i >= 1)
51 xfers[i].rx_buf = rx + 2 * (i - 1);
52 spi_message_add_tail(&xfers[i], &msg);
53 }
54
55 ret = spi_sync(st->us, &msg);
56 if (ret)
57 dev_err(&st->us->dev, "problem when burst reading");
58
59 mutex_unlock(&st->buf_lock);
60
61 return ret;
62}
63
64/* Whilst this makes a lot of calls to iio_sw_ring functions - it is to device
65 * specific to be rolled into the core.
66 */
67static irqreturn_t adis16203_trigger_handler(int irq, void *p)
68{
69 struct iio_poll_func *pf = p;
70 struct iio_dev *indio_dev = pf->private_data;
71 struct adis16203_state *st = iio_priv(indio_dev);
72 struct iio_ring_buffer *ring = indio_dev->ring;
73
74 int i = 0;
75 s16 *data;
76 size_t datasize = ring->access->get_bytes_per_datum(ring);
77
78 data = kmalloc(datasize, GFP_KERNEL);
79 if (data == NULL) {
80 dev_err(&st->us->dev, "memory alloc failed in ring bh");
81 return -ENOMEM;
82 }
83
84 if (ring->scan_count)
85 if (adis16203_read_ring_data(&indio_dev->dev, st->rx) >= 0)
86 for (; i < ring->scan_count; i++)
87 data[i] = be16_to_cpup(
88 (__be16 *)&(st->rx[i*2]));
89
90 /* Guaranteed to be aligned with 8 byte boundary */
91 if (ring->scan_timestamp)
92 *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
93
94 ring->access->store_to(ring,
95 (u8 *)data,
96 pf->timestamp);
97
98 iio_trigger_notify_done(indio_dev->trig);
99 kfree(data);
100
101 return IRQ_HANDLED;
102}
103
104void adis16203_unconfigure_ring(struct iio_dev *indio_dev)
105{
106 iio_dealloc_pollfunc(indio_dev->pollfunc);
107 iio_sw_rb_free(indio_dev->ring);
108}
109
110static const struct iio_ring_setup_ops adis16203_ring_setup_ops = {
111 .preenable = &iio_sw_ring_preenable,
112 .postenable = &iio_triggered_ring_postenable,
113 .predisable = &iio_triggered_ring_predisable,
114};
115
116int adis16203_configure_ring(struct iio_dev *indio_dev)
117{
118 int ret = 0;
119 struct iio_ring_buffer *ring;
120
121 ring = iio_sw_rb_allocate(indio_dev);
122 if (!ring) {
123 ret = -ENOMEM;
124 return ret;
125 }
126 indio_dev->ring = ring;
127 /* Effectively select the ring buffer implementation */
128 ring->bpe = 2;
129 ring->scan_timestamp = true;
130 ring->access = &ring_sw_access_funcs;
131 ring->setup_ops = &adis16203_ring_setup_ops;
132 ring->owner = THIS_MODULE;
133
134 /* Set default scan mode */
135 iio_scan_mask_set(ring, ADIS16203_SCAN_SUPPLY);
136 iio_scan_mask_set(ring, ADIS16203_SCAN_TEMP);
137 iio_scan_mask_set(ring, ADIS16203_SCAN_AUX_ADC);
138 iio_scan_mask_set(ring, ADIS16203_SCAN_INCLI_X);
139 iio_scan_mask_set(ring, ADIS16203_SCAN_INCLI_Y);
140
141 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
142 &adis16203_trigger_handler,
143 IRQF_ONESHOT,
144 indio_dev,
145 "adis16203_consumer%d",
146 indio_dev->id);
147 if (indio_dev->pollfunc == NULL) {
148 ret = -ENOMEM;
149 goto error_iio_sw_rb_free;
150 }
151
152 indio_dev->modes |= INDIO_RING_TRIGGERED;
153 return 0;
154
155error_iio_sw_rb_free:
156 iio_sw_rb_free(indio_dev->ring);
157 return ret;
158}
diff --git a/drivers/staging/iio/accel/adis16203_trigger.c b/drivers/staging/iio/accel/adis16203_trigger.c
new file mode 100644
index 00000000000..3caf3e8bc9d
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16203_trigger.c
@@ -0,0 +1,74 @@
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 "adis16203.h"
14
15/**
16 * adis16203_data_rdy_trigger_set_state() set datardy interrupt state
17 **/
18static int adis16203_data_rdy_trigger_set_state(struct iio_trigger *trig,
19 bool state)
20{
21 struct iio_dev *indio_dev = trig->private_data;
22
23 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
24 return adis16203_set_irq(indio_dev, state);
25}
26
27int adis16203_probe_trigger(struct iio_dev *indio_dev)
28{
29 int ret;
30 struct adis16203_state *st = iio_priv(indio_dev);
31
32 st->trig = iio_allocate_trigger("adis16203-dev%d", indio_dev->id);
33 if (st->trig == NULL) {
34 ret = -ENOMEM;
35 goto error_ret;
36 }
37
38 ret = request_irq(st->us->irq,
39 &iio_trigger_generic_data_rdy_poll,
40 IRQF_TRIGGER_RISING,
41 "adis16203",
42 st->trig);
43 if (ret)
44 goto error_free_trig;
45
46 st->trig->dev.parent = &st->us->dev;
47 st->trig->owner = THIS_MODULE;
48 st->trig->private_data = indio_dev;
49 st->trig->set_trigger_state = &adis16203_data_rdy_trigger_set_state;
50 ret = iio_trigger_register(st->trig);
51
52 /* select default trigger */
53 indio_dev->trig = st->trig;
54 if (ret)
55 goto error_free_irq;
56
57 return 0;
58
59error_free_irq:
60 free_irq(st->us->irq, st->trig);
61error_free_trig:
62 iio_free_trigger(st->trig);
63error_ret:
64 return ret;
65}
66
67void adis16203_remove_trigger(struct iio_dev *indio_dev)
68{
69 struct adis16203_state *st = iio_priv(indio_dev);
70
71 iio_trigger_unregister(st->trig);
72 free_irq(st->us->irq, st->trig);
73 iio_free_trigger(st->trig);
74}
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
new file mode 100644
index 00000000000..852df06684d
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -0,0 +1,154 @@
1#include <linux/interrupt.h>
2#include <linux/irq.h>
3#include <linux/gpio.h>
4#include <linux/workqueue.h>
5#include <linux/mutex.h>
6#include <linux/device.h>
7#include <linux/kernel.h>
8#include <linux/spi/spi.h>
9#include <linux/slab.h>
10#include <linux/sysfs.h>
11#include <linux/list.h>
12
13#include "../iio.h"
14#include "../sysfs.h"
15#include "../ring_sw.h"
16#include "accel.h"
17#include "../trigger.h"
18#include "adis16204.h"
19
20/**
21 * adis16204_read_ring_data() read data registers which will be placed into ring
22 * @dev: device associated with child of actual device (iio_dev or iio_trig)
23 * @rx: somewhere to pass back the value read
24 **/
25static int adis16204_read_ring_data(struct device *dev, u8 *rx)
26{
27 struct spi_message msg;
28 struct iio_dev *indio_dev = dev_get_drvdata(dev);
29 struct adis16204_state *st = iio_priv(indio_dev);
30 struct spi_transfer xfers[ADIS16204_OUTPUTS + 1];
31 int ret;
32 int i;
33
34 mutex_lock(&st->buf_lock);
35
36 spi_message_init(&msg);
37
38 memset(xfers, 0, sizeof(xfers));
39 for (i = 0; i <= ADIS16204_OUTPUTS; i++) {
40 xfers[i].bits_per_word = 8;
41 xfers[i].cs_change = 1;
42 xfers[i].len = 2;
43 xfers[i].delay_usecs = 20;
44 xfers[i].tx_buf = st->tx + 2 * i;
45 st->tx[2 * i]
46 = ADIS16204_READ_REG(ADIS16204_SUPPLY_OUT + 2 * i);
47 st->tx[2 * i + 1] = 0;
48 if (i >= 1)
49 xfers[i].rx_buf = rx + 2 * (i - 1);
50 spi_message_add_tail(&xfers[i], &msg);
51 }
52
53 ret = spi_sync(st->us, &msg);
54 if (ret)
55 dev_err(&st->us->dev, "problem when burst reading");
56
57 mutex_unlock(&st->buf_lock);
58
59 return ret;
60}
61
62/* Whilst this makes a lot of calls to iio_sw_ring functions - it is to device
63 * specific to be rolled into the core.
64 */
65static irqreturn_t adis16204_trigger_handler(int irq, void *p)
66{
67 struct iio_poll_func *pf = p;
68 struct iio_dev *indio_dev = pf->private_data;
69 struct adis16204_state *st = iio_priv(indio_dev);
70 struct iio_ring_buffer *ring = indio_dev->ring;
71 int i = 0;
72 s16 *data;
73 size_t datasize = ring->access->get_bytes_per_datum(ring);
74
75 data = kmalloc(datasize, GFP_KERNEL);
76 if (data == NULL) {
77 dev_err(&st->us->dev, "memory alloc failed in ring bh");
78 return -ENOMEM;
79 }
80
81 if (ring->scan_count)
82 if (adis16204_read_ring_data(&indio_dev->dev, st->rx) >= 0)
83 for (; i < ring->scan_count; i++)
84 data[i] = be16_to_cpup(
85 (__be16 *)&(st->rx[i*2]));
86
87 /* Guaranteed to be aligned with 8 byte boundary */
88 if (ring->scan_timestamp)
89 *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
90
91 ring->access->store_to(ring, (u8 *)data, pf->timestamp);
92
93 iio_trigger_notify_done(indio_dev->trig);
94 kfree(data);
95
96 return IRQ_HANDLED;
97}
98
99void adis16204_unconfigure_ring(struct iio_dev *indio_dev)
100{
101 iio_dealloc_pollfunc(indio_dev->pollfunc);
102 iio_sw_rb_free(indio_dev->ring);
103}
104
105static const struct iio_ring_setup_ops adis16204_ring_setup_ops = {
106 .preenable = &iio_sw_ring_preenable,
107 .postenable = &iio_triggered_ring_postenable,
108 .predisable = &iio_triggered_ring_predisable,
109};
110
111int adis16204_configure_ring(struct iio_dev *indio_dev)
112{
113 int ret = 0;
114 struct iio_ring_buffer *ring;
115
116 ring = iio_sw_rb_allocate(indio_dev);
117 if (!ring) {
118 ret = -ENOMEM;
119 return ret;
120 }
121 indio_dev->ring = ring;
122 /* Effectively select the ring buffer implementation */
123 ring->access = &ring_sw_access_funcs;
124 ring->bpe = 2;
125 ring->scan_timestamp = true;
126 ring->setup_ops = &adis16204_ring_setup_ops;
127 ring->owner = THIS_MODULE;
128
129 /* Set default scan mode */
130 iio_scan_mask_set(ring, ADIS16204_SCAN_SUPPLY);
131 iio_scan_mask_set(ring, ADIS16204_SCAN_ACC_X);
132 iio_scan_mask_set(ring, ADIS16204_SCAN_ACC_Y);
133 iio_scan_mask_set(ring, ADIS16204_SCAN_AUX_ADC);
134 iio_scan_mask_set(ring, ADIS16204_SCAN_TEMP);
135
136 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
137 &adis16204_trigger_handler,
138 IRQF_ONESHOT,
139 indio_dev,
140 "%s_consumer%d",
141 indio_dev->name,
142 indio_dev->id);
143 if (indio_dev->pollfunc == NULL) {
144 ret = -ENOMEM;
145 goto error_iio_sw_rb_free;
146 }
147
148 indio_dev->modes |= INDIO_RING_TRIGGERED;
149 return 0;
150
151error_iio_sw_rb_free:
152 iio_sw_rb_free(indio_dev->ring);
153 return ret;
154}
diff --git a/drivers/staging/iio/accel/adis16204_trigger.c b/drivers/staging/iio/accel/adis16204_trigger.c
new file mode 100644
index 00000000000..01f73b9b888
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16204_trigger.c
@@ -0,0 +1,74 @@
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 "adis16204.h"
14
15/**
16 * adis16204_data_rdy_trigger_set_state() set datardy interrupt state
17 **/
18static int adis16204_data_rdy_trigger_set_state(struct iio_trigger *trig,
19 bool state)
20{
21 struct iio_dev *indio_dev = trig->private_data;
22
23 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
24 return adis16204_set_irq(indio_dev, state);
25}
26
27int adis16204_probe_trigger(struct iio_dev *indio_dev)
28{
29 int ret;
30 struct adis16204_state *st = iio_priv(indio_dev);
31
32 st->trig = iio_allocate_trigger("adis16204-dev%d", indio_dev->id);
33 if (st->trig == NULL) {
34 ret = -ENOMEM;
35 goto error_ret;
36 }
37
38 ret = request_irq(st->us->irq,
39 &iio_trigger_generic_data_rdy_poll,
40 IRQF_TRIGGER_RISING,
41 "adis16204",
42 st->trig);
43 if (ret)
44 goto error_free_trig;
45
46 st->trig->dev.parent = &st->us->dev;
47 st->trig->owner = THIS_MODULE;
48 st->trig->private_data = indio_dev;
49 st->trig->set_trigger_state = &adis16204_data_rdy_trigger_set_state;
50 ret = iio_trigger_register(st->trig);
51
52 /* select default trigger */
53 indio_dev->trig = st->trig;
54 if (ret)
55 goto error_free_irq;
56
57 return 0;
58
59error_free_irq:
60 free_irq(st->us->irq, st->trig);
61error_free_trig:
62 iio_free_trigger(st->trig);
63error_ret:
64 return ret;
65}
66
67void adis16204_remove_trigger(struct iio_dev *indio_dev)
68{
69 struct adis16204_state *state = iio_priv(indio_dev);
70
71 iio_trigger_unregister(state->trig);
72 free_irq(state->us->irq, state->trig);
73 iio_free_trigger(state->trig);
74}
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
new file mode 100644
index 00000000000..45017d3f02f
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -0,0 +1,157 @@
1#include <linux/interrupt.h>
2#include <linux/irq.h>
3#include <linux/gpio.h>
4#include <linux/workqueue.h>
5#include <linux/mutex.h>
6#include <linux/device.h>
7#include <linux/kernel.h>
8#include <linux/spi/spi.h>
9#include <linux/slab.h>
10#include <linux/sysfs.h>
11#include <linux/list.h>
12
13#include "../iio.h"
14#include "../sysfs.h"
15#include "../ring_sw.h"
16#include "accel.h"
17#include "../trigger.h"
18#include "adis16209.h"
19
20/**
21 * adis16209_read_ring_data() read data registers which will be placed into ring
22 * @dev: device associated with child of actual device (iio_dev or iio_trig)
23 * @rx: somewhere to pass back the value read
24 **/
25static int adis16209_read_ring_data(struct device *dev, u8 *rx)
26{
27 struct spi_message msg;
28 struct iio_dev *indio_dev = dev_get_drvdata(dev);
29 struct adis16209_state *st = iio_priv(indio_dev);
30 struct spi_transfer xfers[ADIS16209_OUTPUTS + 1];
31 int ret;
32 int i;
33
34 mutex_lock(&st->buf_lock);
35
36 spi_message_init(&msg);
37
38 memset(xfers, 0, sizeof(xfers));
39 for (i = 0; i <= ADIS16209_OUTPUTS; i++) {
40 xfers[i].bits_per_word = 8;
41 xfers[i].cs_change = 1;
42 xfers[i].len = 2;
43 xfers[i].delay_usecs = 30;
44 xfers[i].tx_buf = st->tx + 2 * i;
45 st->tx[2 * i]
46 = ADIS16209_READ_REG(ADIS16209_SUPPLY_OUT + 2 * i);
47 st->tx[2 * i + 1] = 0;
48 if (i >= 1)
49 xfers[i].rx_buf = rx + 2 * (i - 1);
50 spi_message_add_tail(&xfers[i], &msg);
51 }
52
53 ret = spi_sync(st->us, &msg);
54 if (ret)
55 dev_err(&st->us->dev, "problem when burst reading");
56
57 mutex_unlock(&st->buf_lock);
58
59 return ret;
60}
61
62/* Whilst this makes a lot of calls to iio_sw_ring functions - it is to device
63 * specific to be rolled into the core.
64 */
65static irqreturn_t adis16209_trigger_handler(int irq, void *p)
66{
67 struct iio_poll_func *pf = p;
68 struct iio_dev *indio_dev = pf->private_data;
69 struct adis16209_state *st = iio_priv(indio_dev);
70 struct iio_ring_buffer *ring = indio_dev->ring;
71
72 int i = 0;
73 s16 *data;
74 size_t datasize = ring->access->get_bytes_per_datum(ring);
75
76 data = kmalloc(datasize , GFP_KERNEL);
77 if (data == NULL) {
78 dev_err(&st->us->dev, "memory alloc failed in ring bh");
79 return -ENOMEM;
80 }
81
82 if (ring->scan_count &&
83 adis16209_read_ring_data(&indio_dev->dev, st->rx) >= 0)
84 for (; i < ring->scan_count; i++)
85 data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
86
87 /* Guaranteed to be aligned with 8 byte boundary */
88 if (ring->scan_timestamp)
89 *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
90
91 ring->access->store_to(ring, (u8 *)data, pf->timestamp);
92
93 iio_trigger_notify_done(indio_dev->trig);
94 kfree(data);
95
96 return IRQ_HANDLED;
97}
98
99void adis16209_unconfigure_ring(struct iio_dev *indio_dev)
100{
101 iio_dealloc_pollfunc(indio_dev->pollfunc);
102 iio_sw_rb_free(indio_dev->ring);
103}
104
105static const struct iio_ring_setup_ops adis16209_ring_setup_ops = {
106 .preenable = &iio_sw_ring_preenable,
107 .postenable = &iio_triggered_ring_postenable,
108 .predisable = &iio_triggered_ring_predisable,
109};
110
111int adis16209_configure_ring(struct iio_dev *indio_dev)
112{
113 int ret = 0;
114 struct iio_ring_buffer *ring;
115
116 ring = iio_sw_rb_allocate(indio_dev);
117 if (!ring) {
118 ret = -ENOMEM;
119 return ret;
120 }
121 indio_dev->ring = ring;
122 /* Effectively select the ring buffer implementation */
123 ring->access = &ring_sw_access_funcs;
124 ring->bpe = 2;
125 ring->scan_timestamp = true;
126 ring->setup_ops = &adis16209_ring_setup_ops;
127 ring->owner = THIS_MODULE;
128
129 /* Set default scan mode */
130 iio_scan_mask_set(ring, ADIS16209_SCAN_SUPPLY);
131 iio_scan_mask_set(ring, ADIS16209_SCAN_ACC_X);
132 iio_scan_mask_set(ring, ADIS16209_SCAN_ACC_Y);
133 iio_scan_mask_set(ring, ADIS16209_SCAN_AUX_ADC);
134 iio_scan_mask_set(ring, ADIS16209_SCAN_TEMP);
135 iio_scan_mask_set(ring, ADIS16209_SCAN_INCLI_X);
136 iio_scan_mask_set(ring, ADIS16209_SCAN_INCLI_Y);
137 iio_scan_mask_set(ring, ADIS16209_SCAN_ROT);
138
139 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
140 &adis16209_trigger_handler,
141 IRQF_ONESHOT,
142 indio_dev,
143 "%s_consumer%d",
144 indio_dev->name,
145 indio_dev->id);
146 if (indio_dev->pollfunc == NULL) {
147 ret = -ENOMEM;
148 goto error_iio_sw_rb_free;
149 }
150
151 indio_dev->modes |= INDIO_RING_TRIGGERED;
152 return 0;
153
154error_iio_sw_rb_free:
155 iio_sw_rb_free(indio_dev->ring);
156 return ret;
157}
diff --git a/drivers/staging/iio/accel/adis16209_trigger.c b/drivers/staging/iio/accel/adis16209_trigger.c
new file mode 100644
index 00000000000..6df7b47ec7b
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16209_trigger.c
@@ -0,0 +1,82 @@
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 **/
18static 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 **/
27static int adis16209_data_rdy_trigger_set_state(struct iio_trigger *trig,
28 bool state)
29{
30 struct iio_dev *indio_dev = trig->private_data;
31
32 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
33 return adis16209_set_irq(indio_dev, state);
34}
35
36int adis16209_probe_trigger(struct iio_dev *indio_dev)
37{
38 int ret;
39 struct adis16209_state *st = iio_priv(indio_dev);
40
41 st->trig = iio_allocate_trigger("adis16209-dev%d", indio_dev->id);
42 if (st->trig == NULL) {
43 ret = -ENOMEM;
44 goto error_ret;
45 }
46
47 ret = request_irq(st->us->irq,
48 adis16209_data_rdy_trig_poll,
49 IRQF_TRIGGER_RISING,
50 "adis16209",
51 st->trig);
52 if (ret)
53 goto error_free_trig;
54 st->trig->dev.parent = &st->us->dev;
55 st->trig->owner = THIS_MODULE;
56 st->trig->private_data = indio_dev;
57 st->trig->set_trigger_state = &adis16209_data_rdy_trigger_set_state;
58 ret = iio_trigger_register(st->trig);
59
60 /* select default trigger */
61 indio_dev->trig = st->trig;
62 if (ret)
63 goto error_free_irq;
64
65 return 0;
66
67error_free_irq:
68 free_irq(st->us->irq, st->trig);
69error_free_trig:
70 iio_free_trigger(st->trig);
71error_ret:
72 return ret;
73}
74
75void adis16209_remove_trigger(struct iio_dev *indio_dev)
76{
77 struct adis16209_state *st = iio_priv(indio_dev);
78
79 iio_trigger_unregister(st->trig);
80 free_irq(st->us->irq, st->trig);
81 iio_free_trigger(st->trig);
82}
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
new file mode 100644
index 00000000000..c812a34daca
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -0,0 +1,152 @@
1#include <linux/interrupt.h>
2#include <linux/irq.h>
3#include <linux/gpio.h>
4#include <linux/workqueue.h>
5#include <linux/mutex.h>
6#include <linux/device.h>
7#include <linux/kernel.h>
8#include <linux/spi/spi.h>
9#include <linux/slab.h>
10#include <linux/sysfs.h>
11#include <linux/list.h>
12
13#include "../iio.h"
14#include "../sysfs.h"
15#include "../ring_sw.h"
16#include "accel.h"
17#include "../trigger.h"
18#include "adis16240.h"
19
20/**
21 * adis16240_read_ring_data() read data registers which will be placed into ring
22 * @dev: device associated with child of actual device (iio_dev or iio_trig)
23 * @rx: somewhere to pass back the value read
24 **/
25static int adis16240_read_ring_data(struct device *dev, u8 *rx)
26{
27 struct spi_message msg;
28 struct iio_dev *indio_dev = dev_get_drvdata(dev);
29 struct adis16240_state *st = iio_priv(indio_dev);
30 struct spi_transfer xfers[ADIS16240_OUTPUTS + 1];
31 int ret;
32 int i;
33
34 mutex_lock(&st->buf_lock);
35
36 spi_message_init(&msg);
37
38 memset(xfers, 0, sizeof(xfers));
39 for (i = 0; i <= ADIS16240_OUTPUTS; i++) {
40 xfers[i].bits_per_word = 8;
41 xfers[i].cs_change = 1;
42 xfers[i].len = 2;
43 xfers[i].delay_usecs = 30;
44 xfers[i].tx_buf = st->tx + 2 * i;
45 st->tx[2 * i]
46 = ADIS16240_READ_REG(ADIS16240_SUPPLY_OUT + 2 * i);
47 st->tx[2 * i + 1] = 0;
48 if (i >= 1)
49 xfers[i].rx_buf = rx + 2 * (i - 1);
50 spi_message_add_tail(&xfers[i], &msg);
51 }
52
53 ret = spi_sync(st->us, &msg);
54 if (ret)
55 dev_err(&st->us->dev, "problem when burst reading");
56
57 mutex_unlock(&st->buf_lock);
58
59 return ret;
60}
61
62static irqreturn_t adis16240_trigger_handler(int irq, void *p)
63{
64 struct iio_poll_func *pf = p;
65 struct iio_dev *indio_dev = pf->private_data;
66 struct adis16240_state *st = iio_priv(indio_dev);
67 struct iio_ring_buffer *ring = indio_dev->ring;
68
69 int i = 0;
70 s16 *data;
71 size_t datasize = ring->access->get_bytes_per_datum(ring);
72
73 data = kmalloc(datasize, GFP_KERNEL);
74 if (data == NULL) {
75 dev_err(&st->us->dev, "memory alloc failed in ring bh");
76 return -ENOMEM;
77 }
78
79 if (ring->scan_count &&
80 adis16240_read_ring_data(&indio_dev->dev, st->rx) >= 0)
81 for (; i < ring->scan_count; i++)
82 data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
83
84 /* Guaranteed to be aligned with 8 byte boundary */
85 if (ring->scan_timestamp)
86 *((s64 *)(data + ((i + 3)/4)*4)) = pf->timestamp;
87
88 ring->access->store_to(ring, (u8 *)data, pf->timestamp);
89
90 iio_trigger_notify_done(indio_dev->trig);
91 kfree(data);
92
93 return IRQ_HANDLED;
94}
95
96void adis16240_unconfigure_ring(struct iio_dev *indio_dev)
97{
98 iio_dealloc_pollfunc(indio_dev->pollfunc);
99 iio_sw_rb_free(indio_dev->ring);
100}
101
102static const struct iio_ring_setup_ops adis16240_ring_setup_ops = {
103 .preenable = &iio_sw_ring_preenable,
104 .postenable = &iio_triggered_ring_postenable,
105 .predisable = &iio_triggered_ring_predisable,
106};
107
108int adis16240_configure_ring(struct iio_dev *indio_dev)
109{
110 int ret = 0;
111 struct iio_ring_buffer *ring;
112
113 ring = iio_sw_rb_allocate(indio_dev);
114 if (!ring) {
115 ret = -ENOMEM;
116 return ret;
117 }
118 indio_dev->ring = ring;
119 /* Effectively select the ring buffer implementation */
120 ring->access = &ring_sw_access_funcs;
121 ring->bpe = 2;
122 ring->scan_timestamp = true;
123 ring->setup_ops = &adis16240_ring_setup_ops;
124 ring->owner = THIS_MODULE;
125
126 /* Set default scan mode */
127 iio_scan_mask_set(ring, ADIS16240_SCAN_SUPPLY);
128 iio_scan_mask_set(ring, ADIS16240_SCAN_ACC_X);
129 iio_scan_mask_set(ring, ADIS16240_SCAN_ACC_Y);
130 iio_scan_mask_set(ring, ADIS16240_SCAN_ACC_Z);
131 iio_scan_mask_set(ring, ADIS16240_SCAN_AUX_ADC);
132 iio_scan_mask_set(ring, ADIS16240_SCAN_TEMP);
133
134 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
135 &adis16240_trigger_handler,
136 IRQF_ONESHOT,
137 indio_dev,
138 "%s_consumer%d",
139 indio_dev->name,
140 indio_dev->id);
141 if (indio_dev->pollfunc == NULL) {
142 ret = -ENOMEM;
143 goto error_iio_sw_rb_free;
144 }
145
146 indio_dev->modes |= INDIO_RING_TRIGGERED;
147 return 0;
148
149error_iio_sw_rb_free:
150 iio_sw_rb_free(indio_dev->ring);
151 return ret;
152}
diff --git a/drivers/staging/iio/accel/adis16240_trigger.c b/drivers/staging/iio/accel/adis16240_trigger.c
new file mode 100644
index 00000000000..17135fc33c9
--- /dev/null
+++ b/drivers/staging/iio/accel/adis16240_trigger.c
@@ -0,0 +1,83 @@
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 "adis16240.h"
14
15/**
16 * adis16240_data_rdy_trig_poll() the event handler for the data rdy trig
17 **/
18static irqreturn_t adis16240_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 * adis16240_data_rdy_trigger_set_state() set datardy interrupt state
26 **/
27static int adis16240_data_rdy_trigger_set_state(struct iio_trigger *trig,
28 bool state)
29{
30 struct iio_dev *indio_dev = trig->private_data;
31
32 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
33 return adis16240_set_irq(indio_dev, state);
34}
35
36int adis16240_probe_trigger(struct iio_dev *indio_dev)
37{
38 int ret;
39 struct adis16240_state *st = iio_priv(indio_dev);
40
41 st->trig = iio_allocate_trigger("adis16240-dev%d", indio_dev->id);
42 if (st->trig == NULL) {
43 ret = -ENOMEM;
44 goto error_ret;
45 }
46
47 ret = request_irq(st->us->irq,
48 adis16240_data_rdy_trig_poll,
49 IRQF_TRIGGER_RISING,
50 "adis16240",
51 st->trig);
52 if (ret)
53 goto error_free_trig;
54
55 st->trig->dev.parent = &st->us->dev;
56 st->trig->owner = THIS_MODULE;
57 st->trig->private_data = indio_dev;
58 st->trig->set_trigger_state = &adis16240_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
68error_free_irq:
69 free_irq(st->us->irq, st->trig);
70error_free_trig:
71 iio_free_trigger(st->trig);
72error_ret:
73 return ret;
74}
75
76void adis16240_remove_trigger(struct iio_dev *indio_dev)
77{
78 struct adis16240_state *st = iio_priv(indio_dev);
79
80 iio_trigger_unregister(st->trig);
81 free_irq(st->us->irq, st->trig);
82 iio_free_trigger(st->trig);
83}
diff --git a/drivers/staging/iio/accel/inclinometer.h b/drivers/staging/iio/accel/inclinometer.h
new file mode 100644
index 00000000000..faf73d7892e
--- /dev/null
+++ b/drivers/staging/iio/accel/inclinometer.h
@@ -0,0 +1,25 @@
1/*
2 * Inclinometer related attributes
3 */
4#include "../sysfs.h"
5
6#define IIO_DEV_ATTR_INCLI_X(_show, _addr) \
7 IIO_DEVICE_ATTR(incli_x_raw, S_IRUGO, _show, NULL, _addr)
8
9#define IIO_DEV_ATTR_INCLI_Y(_show, _addr) \
10 IIO_DEVICE_ATTR(incli_y_raw, S_IRUGO, _show, NULL, _addr)
11
12#define IIO_DEV_ATTR_INCLI_Z(_show, _addr) \
13 IIO_DEVICE_ATTR(incli_z_raw, S_IRUGO, _show, NULL, _addr)
14
15#define IIO_DEV_ATTR_INCLI_X_OFFSET(_mode, _show, _store, _addr) \
16 IIO_DEVICE_ATTR(incli_x_offset, _mode, _show, _store, _addr)
17
18#define IIO_DEV_ATTR_INCLI_Y_OFFSET(_mode, _show, _store, _addr) \
19 IIO_DEVICE_ATTR(incli_y_offset, _mode, _show, _store, _addr)
20
21#define IIO_DEV_ATTR_INCLI_Z_OFFSET(_mode, _show, _store, _addr) \
22 IIO_DEVICE_ATTR(incli_z_offset, _mode, _show, _store, _addr)
23
24#define IIO_CONST_ATTR_INCLI_SCALE(_string) \
25 IIO_CONST_ATTR(incli_scale, _string)