Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
[sfrench/cifs-2.6.git] / 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         u64 protocols; /* which are handled by this handler */
26         int (*decode)(struct input_dev *input_dev, struct ir_raw_event event);
27
28         /* These two should only be used by the lirc decoder */
29         int (*raw_register)(struct input_dev *input_dev);
30         int (*raw_unregister)(struct input_dev *input_dev);
31 };
32
33 struct ir_raw_event_ctrl {
34         struct list_head                list;           /* to keep track of raw clients */
35         struct task_struct              *thread;
36         struct kfifo                    kfifo;          /* fifo for the pulse/space durations */
37         ktime_t                         last_event;     /* when last event occurred */
38         enum raw_event_type             last_type;      /* last event type */
39         struct input_dev                *input_dev;     /* pointer to the parent input_dev */
40         u64                             enabled_protocols; /* enabled raw protocol decoders */
41
42         /* raw decoder state follows */
43         struct ir_raw_event prev_ev;
44         struct ir_raw_event this_ev;
45         struct nec_dec {
46                 int state;
47                 unsigned count;
48                 u32 bits;
49                 bool is_nec_x;
50                 bool necx_repeat;
51         } nec;
52         struct rc5_dec {
53                 int state;
54                 u32 bits;
55                 unsigned count;
56                 unsigned wanted_bits;
57         } rc5;
58         struct rc6_dec {
59                 int state;
60                 u8 header;
61                 u32 body;
62                 bool toggle;
63                 unsigned count;
64                 unsigned wanted_bits;
65         } rc6;
66         struct sony_dec {
67                 int state;
68                 u32 bits;
69                 unsigned count;
70         } sony;
71         struct jvc_dec {
72                 int state;
73                 u16 bits;
74                 u16 old_bits;
75                 unsigned count;
76                 bool first;
77                 bool toggle;
78         } jvc;
79         struct lirc_codec {
80                 struct ir_input_dev *ir_dev;
81                 struct lirc_driver *drv;
82                 int carrier_low;
83         } lirc;
84 };
85
86 /* macros for IR decoders */
87 static inline bool geq_margin(unsigned d1, unsigned d2, unsigned margin)
88 {
89         return d1 > (d2 - margin);
90 }
91
92 static inline bool eq_margin(unsigned d1, unsigned d2, unsigned margin)
93 {
94         return ((d1 > (d2 - margin)) && (d1 < (d2 + margin)));
95 }
96
97 static inline bool is_transition(struct ir_raw_event *x, struct ir_raw_event *y)
98 {
99         return x->pulse != y->pulse;
100 }
101
102 static inline void decrease_duration(struct ir_raw_event *ev, unsigned duration)
103 {
104         if (duration > ev->duration)
105                 ev->duration = 0;
106         else
107                 ev->duration -= duration;
108 }
109
110 #define TO_US(duration)                 DIV_ROUND_CLOSEST((duration), 1000)
111 #define TO_STR(is_pulse)                ((is_pulse) ? "pulse" : "space")
112 #define IS_RESET(ev)                    (ev.duration == 0)
113 /*
114  * Routines from ir-sysfs.c - Meant to be called only internally inside
115  * ir-core
116  */
117
118 int ir_register_class(struct input_dev *input_dev);
119 void ir_unregister_class(struct input_dev *input_dev);
120
121 /*
122  * Routines from ir-raw-event.c to be used internally and by decoders
123  */
124 u64 ir_raw_get_allowed_protocols(void);
125 int ir_raw_event_register(struct input_dev *input_dev);
126 void ir_raw_event_unregister(struct input_dev *input_dev);
127 int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler);
128 void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler);
129 void ir_raw_init(void);
130
131 int ir_rcmap_init(void);
132 void ir_rcmap_cleanup(void);
133 /*
134  * Decoder initialization code
135  *
136  * Those load logic are called during ir-core init, and automatically
137  * loads the compiled decoders for their usage with IR raw events
138  */
139
140 /* from ir-nec-decoder.c */
141 #ifdef CONFIG_IR_NEC_DECODER_MODULE
142 #define load_nec_decode()       request_module("ir-nec-decoder")
143 #else
144 #define load_nec_decode()       0
145 #endif
146
147 /* from ir-rc5-decoder.c */
148 #ifdef CONFIG_IR_RC5_DECODER_MODULE
149 #define load_rc5_decode()       request_module("ir-rc5-decoder")
150 #else
151 #define load_rc5_decode()       0
152 #endif
153
154 /* from ir-rc6-decoder.c */
155 #ifdef CONFIG_IR_RC6_DECODER_MODULE
156 #define load_rc6_decode()       request_module("ir-rc6-decoder")
157 #else
158 #define load_rc6_decode()       0
159 #endif
160
161 /* from ir-jvc-decoder.c */
162 #ifdef CONFIG_IR_JVC_DECODER_MODULE
163 #define load_jvc_decode()       request_module("ir-jvc-decoder")
164 #else
165 #define load_jvc_decode()       0
166 #endif
167
168 /* from ir-sony-decoder.c */
169 #ifdef CONFIG_IR_SONY_DECODER_MODULE
170 #define load_sony_decode()      request_module("ir-sony-decoder")
171 #else
172 #define load_sony_decode()      0
173 #endif
174
175 /* from ir-lirc-codec.c */
176 #ifdef CONFIG_IR_LIRC_CODEC_MODULE
177 #define load_lirc_codec()       request_module("ir-lirc-codec")
178 #else
179 #define load_lirc_codec()       0
180 #endif
181
182
183 #endif /* _IR_RAW_EVENT */