diff options
-rw-r--r-- | drivers/media/IR/ir-core-priv.h | 111 | ||||
-rw-r--r-- | drivers/media/IR/ir-functions.c | 1 | ||||
-rw-r--r-- | drivers/media/IR/ir-keytable.c | 2 | ||||
-rw-r--r-- | drivers/media/IR/ir-nec-decoder.c | 2 | ||||
-rw-r--r-- | drivers/media/IR/ir-raw-event.c | 2 | ||||
-rw-r--r-- | drivers/media/IR/ir-rc5-decoder.c | 2 | ||||
-rw-r--r-- | drivers/media/IR/ir-sysfs.c | 2 | ||||
-rw-r--r-- | include/media/ir-core.h | 87 |
8 files changed, 127 insertions, 82 deletions
diff --git a/drivers/media/IR/ir-core-priv.h b/drivers/media/IR/ir-core-priv.h new file mode 100644 index 000000000000..ea546659e4ce --- /dev/null +++ b/drivers/media/IR/ir-core-priv.h | |||
@@ -0,0 +1,111 @@ | |||
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-keytable.c to be used internally on ir-core and decoders | ||
62 | */ | ||
63 | |||
64 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, | ||
65 | u32 scancode); | ||
66 | |||
67 | /* | ||
68 | * Routines from ir-sysfs.c - Meant to be called only internally inside | ||
69 | * ir-core | ||
70 | */ | ||
71 | |||
72 | int ir_register_class(struct input_dev *input_dev); | ||
73 | void ir_unregister_class(struct input_dev *input_dev); | ||
74 | |||
75 | /* | ||
76 | * Routines from ir-raw-event.c to be used internally and by decoders | ||
77 | */ | ||
78 | int ir_raw_event_register(struct input_dev *input_dev); | ||
79 | void ir_raw_event_unregister(struct input_dev *input_dev); | ||
80 | static inline void ir_raw_event_reset(struct input_dev *input_dev) | ||
81 | { | ||
82 | ir_raw_event_store(input_dev, 0); | ||
83 | ir_raw_event_handle(input_dev); | ||
84 | } | ||
85 | int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler); | ||
86 | void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler); | ||
87 | void ir_raw_init(void); | ||
88 | |||
89 | |||
90 | /* | ||
91 | * Decoder initialization code | ||
92 | * | ||
93 | * Those load logic are called during ir-core init, and automatically | ||
94 | * loads the compiled decoders for their usage with IR raw events | ||
95 | */ | ||
96 | |||
97 | /* from ir-nec-decoder.c */ | ||
98 | #ifdef CONFIG_IR_NEC_DECODER_MODULE | ||
99 | #define load_nec_decode() request_module("ir-nec-decoder") | ||
100 | #else | ||
101 | #define load_nec_decode() 0 | ||
102 | #endif | ||
103 | |||
104 | /* from ir-rc5-decoder.c */ | ||
105 | #ifdef CONFIG_IR_RC5_DECODER_MODULE | ||
106 | #define load_rc5_decode() request_module("ir-rc5-decoder") | ||
107 | #else | ||
108 | #define load_rc5_decode() 0 | ||
109 | #endif | ||
110 | |||
111 | #endif /* _IR_RAW_EVENT */ | ||
diff --git a/drivers/media/IR/ir-functions.c b/drivers/media/IR/ir-functions.c index ab06919ad5fc..db591e421887 100644 --- a/drivers/media/IR/ir-functions.c +++ b/drivers/media/IR/ir-functions.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/string.h> | 24 | #include <linux/string.h> |
25 | #include <linux/jiffies.h> | 25 | #include <linux/jiffies.h> |
26 | #include <media/ir-common.h> | 26 | #include <media/ir-common.h> |
27 | #include "ir-core-priv.h" | ||
27 | 28 | ||
28 | /* -------------------------------------------------------------------------- */ | 29 | /* -------------------------------------------------------------------------- */ |
29 | 30 | ||
diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c index 1fdb528737fe..599e39c34445 100644 --- a/drivers/media/IR/ir-keytable.c +++ b/drivers/media/IR/ir-keytable.c | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/input.h> | 16 | #include <linux/input.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <media/ir-common.h> | 18 | #include "ir-core-priv.h" |
19 | 19 | ||
20 | /* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */ | 20 | /* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */ |
21 | #define IR_TAB_MIN_SIZE 256 | 21 | #define IR_TAB_MIN_SIZE 256 |
diff --git a/drivers/media/IR/ir-nec-decoder.c b/drivers/media/IR/ir-nec-decoder.c index 02682e617fae..4c223f611a5e 100644 --- a/drivers/media/IR/ir-nec-decoder.c +++ b/drivers/media/IR/ir-nec-decoder.c | |||
@@ -12,8 +12,8 @@ | |||
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <media/ir-core.h> | ||
16 | #include <linux/bitrev.h> | 15 | #include <linux/bitrev.h> |
16 | #include "ir-core-priv.h" | ||
17 | 17 | ||
18 | #define NEC_NBITS 32 | 18 | #define NEC_NBITS 32 |
19 | #define NEC_UNIT 562500 /* ns */ | 19 | #define NEC_UNIT 562500 /* ns */ |
diff --git a/drivers/media/IR/ir-raw-event.c b/drivers/media/IR/ir-raw-event.c index e144f1522962..6a4445e5db1a 100644 --- a/drivers/media/IR/ir-raw-event.c +++ b/drivers/media/IR/ir-raw-event.c | |||
@@ -12,10 +12,10 @@ | |||
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <media/ir-core.h> | ||
16 | #include <linux/workqueue.h> | 15 | #include <linux/workqueue.h> |
17 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
18 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include "ir-core-priv.h" | ||
19 | 19 | ||
20 | /* Define the max number of pulse/space transitions to buffer */ | 20 | /* Define the max number of pulse/space transitions to buffer */ |
21 | #define MAX_IR_EVENT_SIZE 512 | 21 | #define MAX_IR_EVENT_SIZE 512 |
diff --git a/drivers/media/IR/ir-rc5-decoder.c b/drivers/media/IR/ir-rc5-decoder.c index 1d0857b69089..d8f0760890fa 100644 --- a/drivers/media/IR/ir-rc5-decoder.c +++ b/drivers/media/IR/ir-rc5-decoder.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * the first two bits are start bits, and a third one is a filing bit | 19 | * the first two bits are start bits, and a third one is a filing bit |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <media/ir-core.h> | 22 | #include "ir-core-priv.h" |
23 | 23 | ||
24 | #define RC5_NBITS 14 | 24 | #define RC5_NBITS 14 |
25 | #define RC5_UNIT 888888 /* ns */ | 25 | #define RC5_UNIT 888888 /* ns */ |
diff --git a/drivers/media/IR/ir-sysfs.c b/drivers/media/IR/ir-sysfs.c index af1edd073b16..57f09c4ca9fb 100644 --- a/drivers/media/IR/ir-sysfs.c +++ b/drivers/media/IR/ir-sysfs.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/input.h> | 16 | #include <linux/input.h> |
17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
18 | #include <media/ir-core.h> | 18 | #include "ir-core-priv.h" |
19 | 19 | ||
20 | #define IRRCV_NUM_DEVICES 256 | 20 | #define IRRCV_NUM_DEVICES 256 |
21 | 21 | ||
diff --git a/include/media/ir-core.h b/include/media/ir-core.h index e9a0cbf67ff6..ab3bd30d43f1 100644 --- a/include/media/ir-core.h +++ b/include/media/ir-core.h | |||
@@ -31,13 +31,6 @@ enum rc_driver_type { | |||
31 | RC_DRIVER_IR_RAW, /* Needs a Infra-Red pulse/space decoder */ | 31 | RC_DRIVER_IR_RAW, /* Needs a Infra-Red pulse/space decoder */ |
32 | }; | 32 | }; |
33 | 33 | ||
34 | enum raw_event_type { | ||
35 | IR_SPACE = (1 << 0), | ||
36 | IR_PULSE = (1 << 1), | ||
37 | IR_START_EVENT = (1 << 2), | ||
38 | IR_STOP_EVENT = (1 << 3), | ||
39 | }; | ||
40 | |||
41 | /** | 34 | /** |
42 | * struct ir_dev_props - Allow caller drivers to set special properties | 35 | * struct ir_dev_props - Allow caller drivers to set special properties |
43 | * @driver_type: specifies if the driver or hardware have already a decoder, | 36 | * @driver_type: specifies if the driver or hardware have already a decoder, |
@@ -65,14 +58,6 @@ struct ir_dev_props { | |||
65 | void (*close)(void *priv); | 58 | void (*close)(void *priv); |
66 | }; | 59 | }; |
67 | 60 | ||
68 | struct ir_raw_event_ctrl { | ||
69 | struct work_struct rx_work; /* for the rx decoding workqueue */ | ||
70 | struct kfifo kfifo; /* fifo for the pulse/space durations */ | ||
71 | ktime_t last_event; /* when last event occurred */ | ||
72 | enum raw_event_type last_type; /* last event type */ | ||
73 | struct input_dev *input_dev; /* pointer to the parent input_dev */ | ||
74 | }; | ||
75 | |||
76 | struct ir_input_dev { | 61 | struct ir_input_dev { |
77 | struct device dev; /* device */ | 62 | struct device dev; /* device */ |
78 | char *driver_name; /* Name of the driver module */ | 63 | char *driver_name; /* Name of the driver module */ |
@@ -92,22 +77,16 @@ struct ir_input_dev { | |||
92 | u8 last_toggle; /* toggle of last command */ | 77 | u8 last_toggle; /* toggle of last command */ |
93 | }; | 78 | }; |
94 | 79 | ||
95 | struct ir_raw_handler { | 80 | enum raw_event_type { |
96 | struct list_head list; | 81 | IR_SPACE = (1 << 0), |
97 | 82 | IR_PULSE = (1 << 1), | |
98 | int (*decode)(struct input_dev *input_dev, s64 duration); | 83 | IR_START_EVENT = (1 << 2), |
99 | int (*raw_register)(struct input_dev *input_dev); | 84 | IR_STOP_EVENT = (1 << 3), |
100 | int (*raw_unregister)(struct input_dev *input_dev); | ||
101 | }; | 85 | }; |
102 | 86 | ||
103 | #define to_ir_input_dev(_attr) container_of(_attr, struct ir_input_dev, attr) | 87 | #define to_ir_input_dev(_attr) container_of(_attr, struct ir_input_dev, attr) |
104 | 88 | ||
105 | /* Routines from ir-keytable.c */ | 89 | /* From ir-keytable.c */ |
106 | |||
107 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, | ||
108 | u32 scancode); | ||
109 | void ir_repeat(struct input_dev *dev); | ||
110 | void ir_keydown(struct input_dev *dev, int scancode, u8 toggle); | ||
111 | int __ir_input_register(struct input_dev *dev, | 90 | int __ir_input_register(struct input_dev *dev, |
112 | const struct ir_scancode_table *ir_codes, | 91 | const struct ir_scancode_table *ir_codes, |
113 | const struct ir_dev_props *props, | 92 | const struct ir_dev_props *props, |
@@ -143,60 +122,14 @@ static inline int ir_input_register(struct input_dev *dev, | |||
143 | 122 | ||
144 | void ir_input_unregister(struct input_dev *input_dev); | 123 | void ir_input_unregister(struct input_dev *input_dev); |
145 | 124 | ||
146 | /* Routines from ir-sysfs.c */ | 125 | void ir_repeat(struct input_dev *dev); |
126 | void ir_keydown(struct input_dev *dev, int scancode, u8 toggle); | ||
147 | 127 | ||
148 | int ir_register_class(struct input_dev *input_dev); | 128 | /* From ir-raw-event.c */ |
149 | void ir_unregister_class(struct input_dev *input_dev); | ||
150 | 129 | ||
151 | /* Routines from ir-raw-event.c */ | ||
152 | int ir_raw_event_register(struct input_dev *input_dev); | ||
153 | void ir_raw_event_unregister(struct input_dev *input_dev); | ||
154 | void ir_raw_event_handle(struct input_dev *input_dev); | 130 | void ir_raw_event_handle(struct input_dev *input_dev); |
155 | int ir_raw_event_store(struct input_dev *input_dev, s64 duration); | 131 | int ir_raw_event_store(struct input_dev *input_dev, s64 duration); |
156 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); | 132 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); |
157 | static inline void ir_raw_event_reset(struct input_dev *input_dev) | 133 | |
158 | { | ||
159 | ir_raw_event_store(input_dev, 0); | ||
160 | ir_raw_event_handle(input_dev); | ||
161 | } | ||
162 | int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler); | ||
163 | void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler); | ||
164 | void ir_raw_init(void); | ||
165 | |||
166 | /* from ir-nec-decoder.c */ | ||
167 | #ifdef CONFIG_IR_NEC_DECODER_MODULE | ||
168 | #define load_nec_decode() request_module("ir-nec-decoder") | ||
169 | #else | ||
170 | #define load_nec_decode() 0 | ||
171 | #endif | ||
172 | |||
173 | /* from ir-rc5-decoder.c */ | ||
174 | #ifdef CONFIG_IR_RC5_DECODER_MODULE | ||
175 | #define load_rc5_decode() request_module("ir-rc5-decoder") | ||
176 | #else | ||
177 | #define load_rc5_decode() 0 | ||
178 | #endif | ||
179 | |||
180 | /* macros for ir decoders */ | ||
181 | #define PULSE(units) ((units)) | ||
182 | #define SPACE(units) (-(units)) | ||
183 | #define IS_RESET(duration) ((duration) == 0) | ||
184 | #define IS_PULSE(duration) ((duration) > 0) | ||
185 | #define IS_SPACE(duration) ((duration) < 0) | ||
186 | #define DURATION(duration) (abs((duration))) | ||
187 | #define IS_TRANSITION(x, y) ((x) * (y) < 0) | ||
188 | #define DECREASE_DURATION(duration, amount) \ | ||
189 | do { \ | ||
190 | if (IS_SPACE(duration)) \ | ||
191 | duration += (amount); \ | ||
192 | else if (IS_PULSE(duration)) \ | ||
193 | duration -= (amount); \ | ||
194 | } while (0) | ||
195 | |||
196 | #define TO_UNITS(duration, unit_len) \ | ||
197 | ((int)((duration) > 0 ? \ | ||
198 | DIV_ROUND_CLOSEST(abs((duration)), (unit_len)) :\ | ||
199 | -DIV_ROUND_CLOSEST(abs((duration)), (unit_len)))) | ||
200 | #define TO_US(duration) ((int)TO_UNITS(duration, 1000)) | ||
201 | 134 | ||
202 | #endif /* _IR_CORE */ | 135 | #endif /* _IR_CORE */ |