Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git] / drivers / media / rc / ir-raw.c
1 /* ir-raw.c - handle IR pulse/space events
2  *
3  * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation version 2 of the License.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  */
14
15 #include <linux/export.h>
16 #include <linux/kthread.h>
17 #include <linux/mutex.h>
18 #include <linux/kmod.h>
19 #include <linux/sched.h>
20 #include <linux/freezer.h>
21 #include "rc-core-priv.h"
22
23 /* Define the max number of pulse/space transitions to buffer */
24 #define MAX_IR_EVENT_SIZE      512
25
26 /* Used to keep track of IR raw clients, protected by ir_raw_handler_lock */
27 static LIST_HEAD(ir_raw_client_list);
28
29 /* Used to handle IR raw handler extensions */
30 static DEFINE_MUTEX(ir_raw_handler_lock);
31 static LIST_HEAD(ir_raw_handler_list);
32 static u64 available_protocols;
33
34 #ifdef MODULE
35 /* Used to load the decoders */
36 static struct work_struct wq_load;
37 #endif
38
39 static int ir_raw_event_thread(void *data)
40 {
41         struct ir_raw_event ev;
42         struct ir_raw_handler *handler;
43         struct ir_raw_event_ctrl *raw = (struct ir_raw_event_ctrl *)data;
44         int retval;
45
46         while (!kthread_should_stop()) {
47
48                 spin_lock_irq(&raw->lock);
49                 retval = kfifo_out(&raw->kfifo, &ev, sizeof(ev));
50
51                 if (!retval) {
52                         set_current_state(TASK_INTERRUPTIBLE);
53
54                         if (kthread_should_stop())
55                                 set_current_state(TASK_RUNNING);
56
57                         spin_unlock_irq(&raw->lock);
58                         schedule();
59                         continue;
60                 }
61
62                 spin_unlock_irq(&raw->lock);
63
64
65                 BUG_ON(retval != sizeof(ev));
66
67                 mutex_lock(&ir_raw_handler_lock);
68                 list_for_each_entry(handler, &ir_raw_handler_list, list)
69                         handler->decode(raw->dev, ev);
70                 raw->prev_ev = ev;
71                 mutex_unlock(&ir_raw_handler_lock);
72         }
73
74         return 0;
75 }
76
77 /**
78  * ir_raw_event_store() - pass a pulse/space duration to the raw ir decoders
79  * @dev:        the struct rc_dev device descriptor
80  * @ev:         the struct ir_raw_event descriptor of the pulse/space
81  *
82  * This routine (which may be called from an interrupt context) stores a
83  * pulse/space duration for the raw ir decoding state machines. Pulses are
84  * signalled as positive values and spaces as negative values. A zero value
85  * will reset the decoding state machines.
86  */
87 int ir_raw_event_store(struct rc_dev *dev, struct ir_raw_event *ev)
88 {
89         if (!dev->raw)
90                 return -EINVAL;
91
92         IR_dprintk(2, "sample: (%05dus %s)\n",
93                    TO_US(ev->duration), TO_STR(ev->pulse));
94
95         if (kfifo_in(&dev->raw->kfifo, ev, sizeof(*ev)) != sizeof(*ev))
96                 return -ENOMEM;
97
98         return 0;
99 }
100 EXPORT_SYMBOL_GPL(ir_raw_event_store);
101
102 /**
103  * ir_raw_event_store_edge() - notify raw ir decoders of the start of a pulse/space
104  * @dev:        the struct rc_dev device descriptor
105  * @type:       the type of the event that has occurred
106  *
107  * This routine (which may be called from an interrupt context) is used to
108  * store the beginning of an ir pulse or space (or the start/end of ir
109  * reception) for the raw ir decoding state machines. This is used by
110  * hardware which does not provide durations directly but only interrupts
111  * (or similar events) on state change.
112  */
113 int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type)
114 {
115         ktime_t                 now;
116         s64                     delta; /* ns */
117         DEFINE_IR_RAW_EVENT(ev);
118         int                     rc = 0;
119         int                     delay;
120
121         if (!dev->raw)
122                 return -EINVAL;
123
124         now = ktime_get();
125         delta = ktime_to_ns(ktime_sub(now, dev->raw->last_event));
126         delay = MS_TO_NS(dev->input_dev->rep[REP_DELAY]);
127
128         /* Check for a long duration since last event or if we're
129          * being called for the first time, note that delta can't
130          * possibly be negative.
131          */
132         if (delta > delay || !dev->raw->last_type)
133                 type |= IR_START_EVENT;
134         else
135                 ev.duration = delta;
136
137         if (type & IR_START_EVENT)
138                 ir_raw_event_reset(dev);
139         else if (dev->raw->last_type & IR_SPACE) {
140                 ev.pulse = false;
141                 rc = ir_raw_event_store(dev, &ev);
142         } else if (dev->raw->last_type & IR_PULSE) {
143                 ev.pulse = true;
144                 rc = ir_raw_event_store(dev, &ev);
145         } else
146                 return 0;
147
148         dev->raw->last_event = now;
149         dev->raw->last_type = type;
150         return rc;
151 }
152 EXPORT_SYMBOL_GPL(ir_raw_event_store_edge);
153
154 /**
155  * ir_raw_event_store_with_filter() - pass next pulse/space to decoders with some processing
156  * @dev:        the struct rc_dev device descriptor
157  * @type:       the type of the event that has occurred
158  *
159  * This routine (which may be called from an interrupt context) works
160  * in similar manner to ir_raw_event_store_edge.
161  * This routine is intended for devices with limited internal buffer
162  * It automerges samples of same type, and handles timeouts
163  */
164 int ir_raw_event_store_with_filter(struct rc_dev *dev, struct ir_raw_event *ev)
165 {
166         if (!dev->raw)
167                 return -EINVAL;
168
169         /* Ignore spaces in idle mode */
170         if (dev->idle && !ev->pulse)
171                 return 0;
172         else if (dev->idle)
173                 ir_raw_event_set_idle(dev, false);
174
175         if (!dev->raw->this_ev.duration)
176                 dev->raw->this_ev = *ev;
177         else if (ev->pulse == dev->raw->this_ev.pulse)
178                 dev->raw->this_ev.duration += ev->duration;
179         else {
180                 ir_raw_event_store(dev, &dev->raw->this_ev);
181                 dev->raw->this_ev = *ev;
182         }
183
184         /* Enter idle mode if nessesary */
185         if (!ev->pulse && dev->timeout &&
186             dev->raw->this_ev.duration >= dev->timeout)
187                 ir_raw_event_set_idle(dev, true);
188
189         return 0;
190 }
191 EXPORT_SYMBOL_GPL(ir_raw_event_store_with_filter);
192
193 /**
194  * ir_raw_event_set_idle() - provide hint to rc-core when the device is idle or not
195  * @dev:        the struct rc_dev device descriptor
196  * @idle:       whether the device is idle or not
197  */
198 void ir_raw_event_set_idle(struct rc_dev *dev, bool idle)
199 {
200         if (!dev->raw)
201                 return;
202
203         IR_dprintk(2, "%s idle mode\n", idle ? "enter" : "leave");
204
205         if (idle) {
206                 dev->raw->this_ev.timeout = true;
207                 ir_raw_event_store(dev, &dev->raw->this_ev);
208                 init_ir_raw_event(&dev->raw->this_ev);
209         }
210
211         if (dev->s_idle)
212                 dev->s_idle(dev, idle);
213
214         dev->idle = idle;
215 }
216 EXPORT_SYMBOL_GPL(ir_raw_event_set_idle);
217
218 /**
219  * ir_raw_event_handle() - schedules the decoding of stored ir data
220  * @dev:        the struct rc_dev device descriptor
221  *
222  * This routine will tell rc-core to start decoding stored ir data.
223  */
224 void ir_raw_event_handle(struct rc_dev *dev)
225 {
226         unsigned long flags;
227
228         if (!dev->raw || !dev->raw->thread)
229                 return;
230
231         spin_lock_irqsave(&dev->raw->lock, flags);
232         wake_up_process(dev->raw->thread);
233         spin_unlock_irqrestore(&dev->raw->lock, flags);
234 }
235 EXPORT_SYMBOL_GPL(ir_raw_event_handle);
236
237 /* used internally by the sysfs interface */
238 u64
239 ir_raw_get_allowed_protocols(void)
240 {
241         u64 protocols;
242         mutex_lock(&ir_raw_handler_lock);
243         protocols = available_protocols;
244         mutex_unlock(&ir_raw_handler_lock);
245         return protocols;
246 }
247
248 /*
249  * Used to (un)register raw event clients
250  */
251 int ir_raw_event_register(struct rc_dev *dev)
252 {
253         int rc;
254         struct ir_raw_handler *handler;
255         struct task_struct *thread;
256
257         if (!dev)
258                 return -EINVAL;
259
260         dev->raw = kzalloc(sizeof(*dev->raw), GFP_KERNEL);
261         if (!dev->raw)
262                 return -ENOMEM;
263
264         dev->raw->dev = dev;
265         dev->raw->enabled_protocols = ~0;
266         rc = kfifo_alloc(&dev->raw->kfifo,
267                          sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE,
268                          GFP_KERNEL);
269         if (rc < 0)
270                 goto out;
271
272         spin_lock_init(&dev->raw->lock);
273         thread = kthread_run(ir_raw_event_thread, dev->raw, "rc%ld",
274                              dev->devno);
275
276         if (IS_ERR(thread)) {
277                 rc = PTR_ERR(thread);
278                 goto out;
279         }
280
281         dev->raw->thread = thread;
282
283         mutex_lock(&ir_raw_handler_lock);
284         list_add_tail(&dev->raw->list, &ir_raw_client_list);
285         list_for_each_entry(handler, &ir_raw_handler_list, list)
286                 if (handler->raw_register)
287                         handler->raw_register(dev);
288         mutex_unlock(&ir_raw_handler_lock);
289
290         return 0;
291
292 out:
293         kfree(dev->raw);
294         dev->raw = NULL;
295         return rc;
296 }
297
298 void ir_raw_event_unregister(struct rc_dev *dev)
299 {
300         struct ir_raw_handler *handler;
301
302         if (!dev || !dev->raw)
303                 return;
304
305         kthread_stop(dev->raw->thread);
306
307         mutex_lock(&ir_raw_handler_lock);
308         list_del(&dev->raw->list);
309         list_for_each_entry(handler, &ir_raw_handler_list, list)
310                 if (handler->raw_unregister)
311                         handler->raw_unregister(dev);
312         mutex_unlock(&ir_raw_handler_lock);
313
314         kfifo_free(&dev->raw->kfifo);
315         kfree(dev->raw);
316         dev->raw = NULL;
317 }
318
319 /*
320  * Extension interface - used to register the IR decoders
321  */
322
323 int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler)
324 {
325         struct ir_raw_event_ctrl *raw;
326
327         mutex_lock(&ir_raw_handler_lock);
328         list_add_tail(&ir_raw_handler->list, &ir_raw_handler_list);
329         if (ir_raw_handler->raw_register)
330                 list_for_each_entry(raw, &ir_raw_client_list, list)
331                         ir_raw_handler->raw_register(raw->dev);
332         available_protocols |= ir_raw_handler->protocols;
333         mutex_unlock(&ir_raw_handler_lock);
334
335         return 0;
336 }
337 EXPORT_SYMBOL(ir_raw_handler_register);
338
339 void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler)
340 {
341         struct ir_raw_event_ctrl *raw;
342
343         mutex_lock(&ir_raw_handler_lock);
344         list_del(&ir_raw_handler->list);
345         if (ir_raw_handler->raw_unregister)
346                 list_for_each_entry(raw, &ir_raw_client_list, list)
347                         ir_raw_handler->raw_unregister(raw->dev);
348         available_protocols &= ~ir_raw_handler->protocols;
349         mutex_unlock(&ir_raw_handler_lock);
350 }
351 EXPORT_SYMBOL(ir_raw_handler_unregister);
352
353 #ifdef MODULE
354 static void init_decoders(struct work_struct *work)
355 {
356         /* Load the decoder modules */
357
358         load_nec_decode();
359         load_rc5_decode();
360         load_rc6_decode();
361         load_jvc_decode();
362         load_sony_decode();
363         load_mce_kbd_decode();
364         load_lirc_codec();
365
366         /* If needed, we may later add some init code. In this case,
367            it is needed to change the CONFIG_MODULE test at rc-core.h
368          */
369 }
370 #endif
371
372 void ir_raw_init(void)
373 {
374 #ifdef MODULE
375         INIT_WORK(&wq_load, init_decoders);
376         schedule_work(&wq_load);
377 #endif
378 }