diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /include/media/ir-core.h | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'include/media/ir-core.h')
-rw-r--r-- | include/media/ir-core.h | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/include/media/ir-core.h b/include/media/ir-core.h deleted file mode 100644 index eb7fddf8f607..000000000000 --- a/include/media/ir-core.h +++ /dev/null | |||
@@ -1,185 +0,0 @@ | |||
1 | /* | ||
2 | * Remote Controller core header | ||
3 | * | ||
4 | * Copyright (C) 2009-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_CORE | ||
17 | #define _IR_CORE | ||
18 | |||
19 | #include <linux/spinlock.h> | ||
20 | #include <linux/kfifo.h> | ||
21 | #include <linux/time.h> | ||
22 | #include <linux/timer.h> | ||
23 | #include <media/rc-map.h> | ||
24 | |||
25 | extern int ir_core_debug; | ||
26 | #define IR_dprintk(level, fmt, arg...) if (ir_core_debug >= level) \ | ||
27 | printk(KERN_DEBUG "%s: " fmt , __func__, ## arg) | ||
28 | |||
29 | enum rc_driver_type { | ||
30 | RC_DRIVER_SCANCODE = 0, /* Driver or hardware generates a scancode */ | ||
31 | RC_DRIVER_IR_RAW, /* Needs a Infra-Red pulse/space decoder */ | ||
32 | }; | ||
33 | |||
34 | /** | ||
35 | * struct ir_dev_props - Allow caller drivers to set special properties | ||
36 | * @driver_type: specifies if the driver or hardware have already a decoder, | ||
37 | * or if it needs to use the IR raw event decoders to produce a scancode | ||
38 | * @allowed_protos: bitmask with the supported IR_TYPE_* protocols | ||
39 | * @scanmask: some hardware decoders are not capable of providing the full | ||
40 | * scancode to the application. As this is a hardware limit, we can't do | ||
41 | * anything with it. Yet, as the same keycode table can be used with other | ||
42 | * devices, a mask is provided to allow its usage. Drivers should generally | ||
43 | * leave this field in blank | ||
44 | * @timeout: optional time after which device stops sending data | ||
45 | * @min_timeout: minimum timeout supported by device | ||
46 | * @max_timeout: maximum timeout supported by device | ||
47 | * @rx_resolution : resolution (in ns) of input sampler | ||
48 | * @tx_resolution: resolution (in ns) of output sampler | ||
49 | * @priv: driver-specific data, to be used on the callbacks | ||
50 | * @change_protocol: allow changing the protocol used on hardware decoders | ||
51 | * @open: callback to allow drivers to enable polling/irq when IR input device | ||
52 | * is opened. | ||
53 | * @close: callback to allow drivers to disable polling/irq when IR input device | ||
54 | * is opened. | ||
55 | * @s_tx_mask: set transmitter mask (for devices with multiple tx outputs) | ||
56 | * @s_tx_carrier: set transmit carrier frequency | ||
57 | * @s_tx_duty_cycle: set transmit duty cycle (0% - 100%) | ||
58 | * @s_rx_carrier: inform driver about carrier it is expected to handle | ||
59 | * @tx_ir: transmit IR | ||
60 | * @s_idle: optional: enable/disable hardware idle mode, upon which, | ||
61 | device doesn't interrupt host until it sees IR pulses | ||
62 | * @s_learning_mode: enable wide band receiver used for learning | ||
63 | */ | ||
64 | struct ir_dev_props { | ||
65 | enum rc_driver_type driver_type; | ||
66 | unsigned long allowed_protos; | ||
67 | u32 scanmask; | ||
68 | |||
69 | u32 timeout; | ||
70 | u32 min_timeout; | ||
71 | u32 max_timeout; | ||
72 | |||
73 | u32 rx_resolution; | ||
74 | u32 tx_resolution; | ||
75 | |||
76 | void *priv; | ||
77 | int (*change_protocol)(void *priv, u64 ir_type); | ||
78 | int (*open)(void *priv); | ||
79 | void (*close)(void *priv); | ||
80 | int (*s_tx_mask)(void *priv, u32 mask); | ||
81 | int (*s_tx_carrier)(void *priv, u32 carrier); | ||
82 | int (*s_tx_duty_cycle)(void *priv, u32 duty_cycle); | ||
83 | int (*s_rx_carrier_range)(void *priv, u32 min, u32 max); | ||
84 | int (*tx_ir)(void *priv, int *txbuf, u32 n); | ||
85 | void (*s_idle)(void *priv, int enable); | ||
86 | int (*s_learning_mode)(void *priv, int enable); | ||
87 | }; | ||
88 | |||
89 | struct ir_input_dev { | ||
90 | struct device dev; /* device */ | ||
91 | char *driver_name; /* Name of the driver module */ | ||
92 | struct ir_scancode_table rc_tab; /* scan/key table */ | ||
93 | unsigned long devno; /* device number */ | ||
94 | struct ir_dev_props *props; /* Device properties */ | ||
95 | struct ir_raw_event_ctrl *raw; /* for raw pulse/space events */ | ||
96 | struct input_dev *input_dev; /* the input device associated with this device */ | ||
97 | bool idle; | ||
98 | |||
99 | /* key info - needed by IR keycode handlers */ | ||
100 | spinlock_t keylock; /* protects the below members */ | ||
101 | bool keypressed; /* current state */ | ||
102 | unsigned long keyup_jiffies; /* when should the current keypress be released? */ | ||
103 | struct timer_list timer_keyup; /* timer for releasing a keypress */ | ||
104 | u32 last_keycode; /* keycode of last command */ | ||
105 | u32 last_scancode; /* scancode of last command */ | ||
106 | u8 last_toggle; /* toggle of last command */ | ||
107 | }; | ||
108 | |||
109 | enum raw_event_type { | ||
110 | IR_SPACE = (1 << 0), | ||
111 | IR_PULSE = (1 << 1), | ||
112 | IR_START_EVENT = (1 << 2), | ||
113 | IR_STOP_EVENT = (1 << 3), | ||
114 | }; | ||
115 | |||
116 | #define to_ir_input_dev(_attr) container_of(_attr, struct ir_input_dev, attr) | ||
117 | |||
118 | /* From ir-keytable.c */ | ||
119 | int __ir_input_register(struct input_dev *dev, | ||
120 | const struct ir_scancode_table *ir_codes, | ||
121 | struct ir_dev_props *props, | ||
122 | const char *driver_name); | ||
123 | |||
124 | static inline int ir_input_register(struct input_dev *dev, | ||
125 | const char *map_name, | ||
126 | struct ir_dev_props *props, | ||
127 | const char *driver_name) { | ||
128 | struct ir_scancode_table *ir_codes; | ||
129 | struct ir_input_dev *ir_dev; | ||
130 | int rc; | ||
131 | |||
132 | if (!map_name) | ||
133 | return -EINVAL; | ||
134 | |||
135 | ir_codes = get_rc_map(map_name); | ||
136 | if (!ir_codes) { | ||
137 | ir_codes = get_rc_map(RC_MAP_EMPTY); | ||
138 | |||
139 | if (!ir_codes) | ||
140 | return -EINVAL; | ||
141 | } | ||
142 | |||
143 | rc = __ir_input_register(dev, ir_codes, props, driver_name); | ||
144 | if (rc < 0) | ||
145 | return -EINVAL; | ||
146 | |||
147 | ir_dev = input_get_drvdata(dev); | ||
148 | |||
149 | if (!rc && ir_dev->props && ir_dev->props->change_protocol) | ||
150 | rc = ir_dev->props->change_protocol(ir_dev->props->priv, | ||
151 | ir_codes->ir_type); | ||
152 | |||
153 | return rc; | ||
154 | } | ||
155 | |||
156 | void ir_input_unregister(struct input_dev *input_dev); | ||
157 | |||
158 | void ir_repeat(struct input_dev *dev); | ||
159 | void ir_keydown(struct input_dev *dev, int scancode, u8 toggle); | ||
160 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, u32 scancode); | ||
161 | |||
162 | /* From ir-raw-event.c */ | ||
163 | |||
164 | struct ir_raw_event { | ||
165 | unsigned pulse:1; | ||
166 | unsigned duration:31; | ||
167 | }; | ||
168 | |||
169 | #define IR_MAX_DURATION 0x7FFFFFFF /* a bit more than 2 seconds */ | ||
170 | |||
171 | void ir_raw_event_handle(struct input_dev *input_dev); | ||
172 | int ir_raw_event_store(struct input_dev *input_dev, struct ir_raw_event *ev); | ||
173 | int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type type); | ||
174 | int ir_raw_event_store_with_filter(struct input_dev *input_dev, | ||
175 | struct ir_raw_event *ev); | ||
176 | void ir_raw_event_set_idle(struct input_dev *input_dev, int idle); | ||
177 | |||
178 | static inline void ir_raw_event_reset(struct input_dev *input_dev) | ||
179 | { | ||
180 | struct ir_raw_event ev = { .pulse = false, .duration = 0 }; | ||
181 | ir_raw_event_store(input_dev, &ev); | ||
182 | ir_raw_event_handle(input_dev); | ||
183 | } | ||
184 | |||
185 | #endif /* _IR_CORE */ | ||