diff options
Diffstat (limited to 'drivers/media/video/ir-kbd-i2c.c')
-rw-r--r-- | drivers/media/video/ir-kbd-i2c.c | 82 |
1 files changed, 0 insertions, 82 deletions
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index 7b65f5e537f8..a30254bed311 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c | |||
@@ -194,88 +194,6 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
194 | return 1; | 194 | return 1; |
195 | } | 195 | } |
196 | 196 | ||
197 | /* Common (grey or coloured) pinnacle PCTV remote handling | ||
198 | * | ||
199 | */ | ||
200 | static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw, | ||
201 | int parity_offset, int marker, int code_modulo) | ||
202 | { | ||
203 | unsigned char b[4]; | ||
204 | unsigned int start = 0,parity = 0,code = 0; | ||
205 | |||
206 | /* poll IR chip */ | ||
207 | if (4 != i2c_master_recv(&ir->c,b,4)) { | ||
208 | dprintk(2,"read error\n"); | ||
209 | return -EIO; | ||
210 | } | ||
211 | |||
212 | for (start = 0; start < ARRAY_SIZE(b); start++) { | ||
213 | if (b[start] == marker) { | ||
214 | code=b[(start+parity_offset+1)%4]; | ||
215 | parity=b[(start+parity_offset)%4]; | ||
216 | } | ||
217 | } | ||
218 | |||
219 | /* Empty Request */ | ||
220 | if (parity==0) | ||
221 | return 0; | ||
222 | |||
223 | /* Repeating... */ | ||
224 | if (ir->old == parity) | ||
225 | return 0; | ||
226 | |||
227 | ir->old = parity; | ||
228 | |||
229 | /* drop special codes when a key is held down a long time for the grey controller | ||
230 | In this case, the second bit of the code is asserted */ | ||
231 | if (marker == 0xfe && (code & 0x40)) | ||
232 | return 0; | ||
233 | |||
234 | code %= code_modulo; | ||
235 | |||
236 | *ir_raw = code; | ||
237 | *ir_key = code; | ||
238 | |||
239 | dprintk(1,"Pinnacle PCTV key %02x\n", code); | ||
240 | |||
241 | return 1; | ||
242 | } | ||
243 | |||
244 | /* The grey pinnacle PCTV remote | ||
245 | * | ||
246 | * There are one issue with this remote: | ||
247 | * - I2c packet does not change when the same key is pressed quickly. The workaround | ||
248 | * is to hold down each key for about half a second, so that another code is generated | ||
249 | * in the i2c packet, and the function can distinguish key presses. | ||
250 | * | ||
251 | * Sylvain Pasche <sylvain.pasche@gmail.com> | ||
252 | */ | ||
253 | int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | ||
254 | { | ||
255 | |||
256 | return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff); | ||
257 | } | ||
258 | |||
259 | EXPORT_SYMBOL_GPL(get_key_pinnacle_grey); | ||
260 | |||
261 | |||
262 | /* The new pinnacle PCTV remote (with the colored buttons) | ||
263 | * | ||
264 | * Ricardo Cerqueira <v4l@cerqueira.org> | ||
265 | */ | ||
266 | int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | ||
267 | { | ||
268 | /* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE | ||
269 | * | ||
270 | * this is the only value that results in 42 unique | ||
271 | * codes < 128 | ||
272 | */ | ||
273 | |||
274 | return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88); | ||
275 | } | ||
276 | |||
277 | EXPORT_SYMBOL_GPL(get_key_pinnacle_color); | ||
278 | |||
279 | /* ----------------------------------------------------------------------- */ | 197 | /* ----------------------------------------------------------------------- */ |
280 | 198 | ||
281 | static void ir_key_poll(struct IR_i2c *ir) | 199 | static void ir_key_poll(struct IR_i2c *ir) |