V4L/DVB: ir-core: make ir_g_keycode_from_table a public function
[safe/jmp/linux-2.6] / drivers / media / IR / ir-core-priv.h
1 /*
2  * Remote Controller core raw events header
3  *
4  * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation version 2 of the License.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  */
15
16 #ifndef _IR_RAW_EVENT
17 #define _IR_RAW_EVENT
18
19 #include <linux/slab.h>
20 #include <media/ir-core.h>
21
22 struct ir_raw_handler {
23         struct list_head list;
24
25         int (*decode)(struct input_dev *input_dev, s64 duration);
26         int (*raw_register)(struct input_dev *input_dev);
27         int (*raw_unregister)(struct input_dev *input_dev);
28 };
29
30 struct ir_raw_event_ctrl {
31         struct work_struct              rx_work;        /* for the rx decoding workqueue */
32         struct kfifo                    kfifo;          /* fifo for the pulse/space durations */
33         ktime_t                         last_event;     /* when last event occurred */
34         enum raw_event_type             last_type;      /* last event type */
35         struct input_dev                *input_dev;     /* pointer to the parent input_dev */
36 };
37
38 /* macros for IR decoders */
39 #define PULSE(units)                            ((units))
40 #define SPACE(units)                            (-(units))
41 #define IS_RESET(duration)                      ((duration) == 0)
42 #define IS_PULSE(duration)                      ((duration) > 0)
43 #define IS_SPACE(duration)                      ((duration) < 0)
44 #define DURATION(duration)                      (abs((duration)))
45 #define IS_TRANSITION(x, y)                     ((x) * (y) < 0)
46 #define DECREASE_DURATION(duration, amount)                     \
47         do {                                                    \
48                 if (IS_SPACE(duration))                         \
49                         duration += (amount);                   \
50                 else if (IS_PULSE(duration))                    \
51                         duration -= (amount);                   \
52         } while (0)
53
54 #define TO_UNITS(duration, unit_len)                            \
55         ((int)((duration) > 0 ?                                 \
56                 DIV_ROUND_CLOSEST(abs((duration)), (unit_len)) :\
57                 -DIV_ROUND_CLOSEST(abs((duration)), (unit_len))))
58 #define TO_US(duration)         ((int)TO_UNITS(duration, 1000))
59
60 /*
61  * Routines from ir-sysfs.c - Meant to be called only internally inside
62  * ir-core
63  */
64
65 int ir_register_class(struct input_dev *input_dev);
66 void ir_unregister_class(struct input_dev *input_dev);
67
68 /*
69  * Routines from ir-raw-event.c to be used internally and by decoders
70  */
71 int ir_raw_event_register(struct input_dev *input_dev);
72 void ir_raw_event_unregister(struct input_dev *input_dev);
73 static inline void ir_raw_event_reset(struct input_dev *input_dev)
74 {
75         ir_raw_event_store(input_dev, 0);
76         ir_raw_event_handle(input_dev);
77 }
78 int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler);
79 void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler);
80 void ir_raw_init(void);
81
82
83 /*
84  * Decoder initialization code
85  *
86  * Those load logic are called during ir-core init, and automatically
87  * loads the compiled decoders for their usage with IR raw events
88  */
89
90 /* from ir-nec-decoder.c */
91 #ifdef CONFIG_IR_NEC_DECODER_MODULE
92 #define load_nec_decode()       request_module("ir-nec-decoder")
93 #else
94 #define load_nec_decode()       0
95 #endif
96
97 /* from ir-rc5-decoder.c */
98 #ifdef CONFIG_IR_RC5_DECODER_MODULE
99 #define load_rc5_decode()       request_module("ir-rc5-decoder")
100 #else
101 #define load_rc5_decode()       0
102 #endif
103
104 /* from ir-rc6-decoder.c */
105 #ifdef CONFIG_IR_RC6_DECODER_MODULE
106 #define load_rc6_decode()       request_module("ir-rc6-decoder")
107 #else
108 #define load_rc6_decode()       0
109 #endif
110
111 #endif /* _IR_RAW_EVENT */