From 96171b06c5d670649fa1ef9158ab525f6cf7665c Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sun, 21 Mar 2010 12:15:16 -0300 Subject: [PATCH] --- yaml --- r: 192895 b: refs/heads/master c: 6660de568d164e4eda6617dadcb999c96e62203f h: refs/heads/master i: 192893: 6f3847b6a983e91fc8223af2211f533fcc03bdde 192891: 0b40292bc2f198b30a921977e83996fff021396c 192887: b375207a0c1b190190ce956e569e874ddaf17888 192879: 2b55d39e5c3be74429969d2ce819a84be3bc2e2f 192863: e4d1429e49f520d08c836df7559109562f65282a 192831: 7a5fe2f4227da7aedd1507d281774af23314a5cc 192767: 09a5654fad59edc0e44e23c367d9f3c0e3897b9a v: v3 --- [refs] | 2 +- trunk/drivers/media/IR/ir-keytable.c | 57 +++++++++++++++++++++++++++- trunk/include/media/ir-core.h | 4 ++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index eadc79eaad3a..ab839fb2194b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a3572c34da8dacc78a629211a91cf34e9b408701 +refs/heads/master: 6660de568d164e4eda6617dadcb999c96e62203f diff --git a/trunk/drivers/media/IR/ir-keytable.c b/trunk/drivers/media/IR/ir-keytable.c index 73fe4bec83bc..e59290febf81 100644 --- a/trunk/drivers/media/IR/ir-keytable.c +++ b/trunk/drivers/media/IR/ir-keytable.c @@ -365,7 +365,7 @@ static int ir_setkeycode(struct input_dev *dev, * * This routine is used by the input routines when a key is pressed at the * IR. The scancode is received and needs to be converted into a keycode. - * If the key is not found, it returns KEY_UNKNOWN. Otherwise, returns the + * If the key is not found, it returns KEY_RESERVED. Otherwise, returns the * corresponding keycode from the table. */ u32 ir_g_keycode_from_table(struct input_dev *dev, u32 scancode) @@ -391,6 +391,61 @@ u32 ir_g_keycode_from_table(struct input_dev *dev, u32 scancode) } EXPORT_SYMBOL_GPL(ir_g_keycode_from_table); +/** + * ir_keyup() - generates input event to cleanup a key press + * @input_dev: the struct input_dev descriptor of the device + * + * This routine is used by the input routines when a key is pressed at the + * IR. It reports a keyup input event via input_report_key(). + */ +void ir_keyup(struct input_dev *dev) +{ + struct ir_input_dev *ir = input_get_drvdata(dev); + + if (!ir->keypressed) + return; + + input_report_key(dev, ir->keycode, 0); + input_sync(dev); + ir->keypressed = 0; +} +EXPORT_SYMBOL_GPL(ir_keyup); + +/** + * ir_keydown() - generates input event for a key press + * @input_dev: the struct input_dev descriptor of the device + * @scancode: the scancode that we're seeking + * + * This routine is used by the input routines when a key is pressed at the + * IR. It gets the keycode for a scancode and reports an input event via + * input_report_key(). + */ +void ir_keydown(struct input_dev *dev, int scancode) +{ + struct ir_input_dev *ir = input_get_drvdata(dev); + + u32 keycode = ir_g_keycode_from_table(dev, scancode); + + /* If already sent a keydown, do a keyup */ + if (ir->keypressed) + ir_keyup(dev); + + if (KEY_RESERVED == keycode) + return; + + ir->keycode = keycode; + ir->keypressed = 1; + + IR_dprintk(1, "%s: key down event, key 0x%04x, scancode 0x%04x\n", + dev->name, keycode, scancode); + + input_report_key(dev, ir->keycode, 1); + input_sync(dev); + +} +EXPORT_SYMBOL_GPL(ir_keydown); + + /** * ir_input_register() - sets the IR keycode table and add the handlers * for keymap table get/set diff --git a/trunk/include/media/ir-core.h b/trunk/include/media/ir-core.h index 369969d90779..198fd61f0da9 100644 --- a/trunk/include/media/ir-core.h +++ b/trunk/include/media/ir-core.h @@ -72,6 +72,10 @@ struct ir_input_dev { unsigned long devno; /* device number */ const struct ir_dev_props *props; /* Device properties */ struct ir_raw_event_ctrl *raw; /* for raw pulse/space events */ + + /* key info - needed by IR keycode handlers */ + u32 keycode; /* linux key code */ + int keypressed; /* current state */ }; #define to_ir_input_dev(_attr) container_of(_attr, struct ir_input_dev, attr)