diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/staging/iio/trigger.h | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'drivers/staging/iio/trigger.h')
-rw-r--r-- | drivers/staging/iio/trigger.h | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h new file mode 100644 index 00000000000..e0b58ed749b --- /dev/null +++ b/drivers/staging/iio/trigger.h | |||
@@ -0,0 +1,188 @@ | |||
1 | /* The industrial I/O core, trigger handling functions | ||
2 | * | ||
3 | * Copyright (c) 2008 Jonathan Cameron | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License version 2 as published by | ||
7 | * the Free Software Foundation. | ||
8 | */ | ||
9 | #include <linux/irq.h> | ||
10 | |||
11 | #ifndef _IIO_TRIGGER_H_ | ||
12 | #define _IIO_TRIGGER_H_ | ||
13 | |||
14 | struct iio_subirq { | ||
15 | bool enabled; | ||
16 | }; | ||
17 | |||
18 | /** | ||
19 | * struct iio_trigger - industrial I/O trigger device | ||
20 | * | ||
21 | * @id: [INTERN] unique id number | ||
22 | * @name: [DRIVER] unique name | ||
23 | * @dev: [DRIVER] associated device (if relevant) | ||
24 | * @private_data: [DRIVER] device specific data | ||
25 | * @list: [INTERN] used in maintenance of global trigger list | ||
26 | * @alloc_list: [DRIVER] used for driver specific trigger list | ||
27 | * @owner: [DRIVER] used to monitor usage count of the trigger. | ||
28 | * @use_count: use count for the trigger | ||
29 | * @set_trigger_state: [DRIVER] switch on/off the trigger on demand | ||
30 | * @try_reenable: function to reenable the trigger when the | ||
31 | * use count is zero (may be NULL) | ||
32 | * @validate_device: function to validate the device when the | ||
33 | * current trigger gets changed. | ||
34 | * @subirq_chip: [INTERN] associate 'virtual' irq chip. | ||
35 | * @subirq_base: [INTERN] base number for irqs provided by trigger. | ||
36 | * @subirqs: [INTERN] information about the 'child' irqs. | ||
37 | * @pool: [INTERN] bitmap of irqs currently in use. | ||
38 | * @pool_lock: [INTERN] protection of the irq pool. | ||
39 | **/ | ||
40 | struct iio_trigger { | ||
41 | int id; | ||
42 | const char *name; | ||
43 | struct device dev; | ||
44 | |||
45 | void *private_data; | ||
46 | struct list_head list; | ||
47 | struct list_head alloc_list; | ||
48 | struct module *owner; | ||
49 | int use_count; | ||
50 | |||
51 | int (*set_trigger_state)(struct iio_trigger *trig, bool state); | ||
52 | int (*try_reenable)(struct iio_trigger *trig); | ||
53 | int (*validate_device)(struct iio_trigger *trig, | ||
54 | struct iio_dev *indio_dev); | ||
55 | |||
56 | struct irq_chip subirq_chip; | ||
57 | int subirq_base; | ||
58 | |||
59 | struct iio_subirq subirqs[CONFIG_IIO_CONSUMERS_PER_TRIGGER]; | ||
60 | unsigned long pool[BITS_TO_LONGS(CONFIG_IIO_CONSUMERS_PER_TRIGGER)]; | ||
61 | struct mutex pool_lock; | ||
62 | }; | ||
63 | |||
64 | /** | ||
65 | * struct iio_poll_func - poll function pair | ||
66 | * | ||
67 | * @private_data: data specific to device (passed into poll func) | ||
68 | * @h: the function that is actually run on trigger | ||
69 | * @thread: threaded interrupt part | ||
70 | * @type: the type of interrupt (basically if oneshot) | ||
71 | * @name: name used to identify the trigger consumer. | ||
72 | * @irq: the corresponding irq as allocated from the | ||
73 | * trigger pool | ||
74 | * @timestamp: some devices need a timestamp grabbed as soon | ||
75 | * as possible after the trigger - hence handler | ||
76 | * passes it via here. | ||
77 | **/ | ||
78 | struct iio_poll_func { | ||
79 | void *private_data; | ||
80 | irqreturn_t (*h)(int irq, void *p); | ||
81 | irqreturn_t (*thread)(int irq, void *p); | ||
82 | int type; | ||
83 | char *name; | ||
84 | int irq; | ||
85 | s64 timestamp; | ||
86 | }; | ||
87 | |||
88 | static inline struct iio_trigger *to_iio_trigger(struct device *d) | ||
89 | { | ||
90 | return container_of(d, struct iio_trigger, dev); | ||
91 | }; | ||
92 | |||
93 | static inline void iio_put_trigger(struct iio_trigger *trig) | ||
94 | { | ||
95 | put_device(&trig->dev); | ||
96 | module_put(trig->owner); | ||
97 | }; | ||
98 | |||
99 | static inline void iio_get_trigger(struct iio_trigger *trig) | ||
100 | { | ||
101 | __module_get(trig->owner); | ||
102 | get_device(&trig->dev); | ||
103 | }; | ||
104 | |||
105 | /** | ||
106 | * iio_trigger_register() - register a trigger with the IIO core | ||
107 | * @trig_info: trigger to be registered | ||
108 | **/ | ||
109 | int iio_trigger_register(struct iio_trigger *trig_info); | ||
110 | |||
111 | /** | ||
112 | * iio_trigger_unregister() - unregister a trigger from the core | ||
113 | * @trig_info: trigger to be unregistered | ||
114 | **/ | ||
115 | void iio_trigger_unregister(struct iio_trigger *trig_info); | ||
116 | |||
117 | /** | ||
118 | * iio_trigger_attach_poll_func() - add a function pair to be run on trigger | ||
119 | * @trig: trigger to which the function pair are being added | ||
120 | * @pf: poll function pair | ||
121 | **/ | ||
122 | int iio_trigger_attach_poll_func(struct iio_trigger *trig, | ||
123 | struct iio_poll_func *pf); | ||
124 | |||
125 | /** | ||
126 | * iio_trigger_dettach_poll_func() - remove function pair from those to be | ||
127 | * run on trigger | ||
128 | * @trig: trigger from which the function is being removed | ||
129 | * @pf: poll function pair | ||
130 | **/ | ||
131 | int iio_trigger_dettach_poll_func(struct iio_trigger *trig, | ||
132 | struct iio_poll_func *pf); | ||
133 | |||
134 | /** | ||
135 | * iio_trigger_poll() - called on a trigger occurring | ||
136 | * @trig: trigger which occurred | ||
137 | * | ||
138 | * Typically called in relevant hardware interrupt handler. | ||
139 | **/ | ||
140 | void iio_trigger_poll(struct iio_trigger *trig, s64 time); | ||
141 | void iio_trigger_poll_chained(struct iio_trigger *trig, s64 time); | ||
142 | void iio_trigger_notify_done(struct iio_trigger *trig); | ||
143 | |||
144 | irqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private); | ||
145 | |||
146 | static inline int iio_trigger_get_irq(struct iio_trigger *trig) | ||
147 | { | ||
148 | int ret; | ||
149 | mutex_lock(&trig->pool_lock); | ||
150 | ret = bitmap_find_free_region(trig->pool, | ||
151 | CONFIG_IIO_CONSUMERS_PER_TRIGGER, | ||
152 | ilog2(1)); | ||
153 | mutex_unlock(&trig->pool_lock); | ||
154 | if (ret >= 0) | ||
155 | ret += trig->subirq_base; | ||
156 | |||
157 | return ret; | ||
158 | }; | ||
159 | |||
160 | static inline void iio_trigger_put_irq(struct iio_trigger *trig, int irq) | ||
161 | { | ||
162 | mutex_lock(&trig->pool_lock); | ||
163 | clear_bit(irq - trig->subirq_base, trig->pool); | ||
164 | mutex_unlock(&trig->pool_lock); | ||
165 | }; | ||
166 | |||
167 | struct iio_poll_func | ||
168 | *iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p), | ||
169 | irqreturn_t (*thread)(int irq, void *p), | ||
170 | int type, | ||
171 | void *private, | ||
172 | const char *fmt, | ||
173 | ...); | ||
174 | void iio_dealloc_pollfunc(struct iio_poll_func *pf); | ||
175 | irqreturn_t iio_pollfunc_store_time(int irq, void *p); | ||
176 | |||
177 | /* | ||
178 | * Two functions for common case where all that happens is a pollfunc | ||
179 | * is attached and detached from a trigger | ||
180 | */ | ||
181 | int iio_triggered_ring_postenable(struct iio_dev *indio_dev); | ||
182 | int iio_triggered_ring_predisable(struct iio_dev *indio_dev); | ||
183 | |||
184 | struct iio_trigger *iio_allocate_trigger(const char *fmt, ...) | ||
185 | __attribute__((format(printf, 1, 2))); | ||
186 | void iio_free_trigger(struct iio_trigger *trig); | ||
187 | |||
188 | #endif /* _IIO_TRIGGER_H_ */ | ||