aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/IR/ir-core-priv.h111
-rw-r--r--drivers/media/IR/ir-functions.c1
-rw-r--r--drivers/media/IR/ir-keytable.c2
-rw-r--r--drivers/media/IR/ir-nec-decoder.c2
-rw-r--r--drivers/media/IR/ir-raw-event.c2
-rw-r--r--drivers/media/IR/ir-rc5-decoder.c2
-rw-r--r--drivers/media/IR/ir-sysfs.c2
-rw-r--r--include/media/ir-core.h87
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
22struct 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
30struct 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
64u32 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
72int ir_register_class(struct input_dev *input_dev);
73void 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 */
78int ir_raw_event_register(struct input_dev *input_dev);
79void ir_raw_event_unregister(struct input_dev *input_dev);
80static 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}
85int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler);
86void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler);
87void 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
34enum 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
68struct 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
76struct ir_input_dev { 61struct 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
95struct ir_raw_handler { 80enum 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
107u32 ir_g_keycode_from_table(struct input_dev *input_dev,
108 u32 scancode);
109void ir_repeat(struct input_dev *dev);
110void ir_keydown(struct input_dev *dev, int scancode, u8 toggle);
111int __ir_input_register(struct input_dev *dev, 90int __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
144void ir_input_unregister(struct input_dev *input_dev); 123void ir_input_unregister(struct input_dev *input_dev);
145 124
146/* Routines from ir-sysfs.c */ 125void ir_repeat(struct input_dev *dev);
126void ir_keydown(struct input_dev *dev, int scancode, u8 toggle);
147 127
148int ir_register_class(struct input_dev *input_dev); 128/* From ir-raw-event.c */
149void ir_unregister_class(struct input_dev *input_dev);
150 129
151/* Routines from ir-raw-event.c */
152int ir_raw_event_register(struct input_dev *input_dev);
153void ir_raw_event_unregister(struct input_dev *input_dev);
154void ir_raw_event_handle(struct input_dev *input_dev); 130void ir_raw_event_handle(struct input_dev *input_dev);
155int ir_raw_event_store(struct input_dev *input_dev, s64 duration); 131int ir_raw_event_store(struct input_dev *input_dev, s64 duration);
156int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); 132int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type);
157static 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}
162int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler);
163void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler);
164void 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 */