aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2010-04-08 14:10:27 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-19 11:57:04 -0400
commit3f113e36106f133752de47208816b28aa8e60f88 (patch)
treedd089c1f3ec2f179338f3f4383e81b643312789c
parent724e2495502a98aaa3f93c404472a991da8ff857 (diff)
V4L/DVB: ir-core: move subsystem internal calls to ir-core-priv.h
ir-core.h has the kABI to be used by the bridge drivers, when needing to register IR protocols and pass IR events. However, the same file also contains IR subsystem internal calls, meant to be used inside ir-core and between ir-core and the raw decoders. Better to move those functions to an internal header, for some reasons: 1) Header will be a little more cleaner; 2) It avoids the need of recompile everything (bridge/hardware drivers, etc), just because a new decoder were added, or some other internal change were needed; 3) Better organize the ir-core API, splitting the functions that are internal to IR core and the ancillary drivers (decoders, lirc_dev) from the features that should be exported to IR subsystem clients. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-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 */