diff options
author | David Härdeman <david@hardeman.nu> | 2010-04-02 14:58:29 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-19 11:56:54 -0400 |
commit | a374fef4437abd0a1ee27afe0cca7a55425c1c3c (patch) | |
tree | 652e36573ac29d360d7f59cfb64a160c08390a54 /include/media | |
parent | 354389467b6b2a3b36666b6e933d78bbd9e23577 (diff) |
V4L/DVB: ir-core: improve keyup/keydown logic
Rewrites the keyup/keydown logic in drivers/media/IR/ir-keytable.c.
All knowledge of keystates etc is now internal to ir-keytable.c
and not scattered around ir-raw-event.c and ir-nec-decoder.c (where
it doesn't belong).
In addition, I've changed the API slightly so that ir_input_dev is
passed as the first argument rather than input_dev. If we're ever
going to support multiple keytables we need to move towards making
ir_input_dev the main interface from a driver POV and obscure away
the input_dev as an implementational detail in ir-core.
Signed-off-by: David Härdeman <david@hardeman.nu>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'include/media')
-rw-r--r-- | include/media/ir-core.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/include/media/ir-core.h b/include/media/ir-core.h index 7a0be8d4999d..b452a478c12c 100644 --- a/include/media/ir-core.h +++ b/include/media/ir-core.h | |||
@@ -76,7 +76,6 @@ struct ir_raw_event { | |||
76 | struct ir_raw_event_ctrl { | 76 | struct ir_raw_event_ctrl { |
77 | struct kfifo kfifo; /* fifo for the pulse/space events */ | 77 | struct kfifo kfifo; /* fifo for the pulse/space events */ |
78 | struct timespec last_event; /* when last event occurred */ | 78 | struct timespec last_event; /* when last event occurred */ |
79 | struct timer_list timer_keyup; /* timer for key release */ | ||
80 | }; | 79 | }; |
81 | 80 | ||
82 | struct ir_input_dev { | 81 | struct ir_input_dev { |
@@ -86,10 +85,16 @@ struct ir_input_dev { | |||
86 | unsigned long devno; /* device number */ | 85 | unsigned long devno; /* device number */ |
87 | const struct ir_dev_props *props; /* Device properties */ | 86 | const struct ir_dev_props *props; /* Device properties */ |
88 | struct ir_raw_event_ctrl *raw; /* for raw pulse/space events */ | 87 | struct ir_raw_event_ctrl *raw; /* for raw pulse/space events */ |
88 | struct input_dev *input_dev; /* the input device associated with this device */ | ||
89 | 89 | ||
90 | /* key info - needed by IR keycode handlers */ | 90 | /* key info - needed by IR keycode handlers */ |
91 | u32 keycode; /* linux key code */ | 91 | spinlock_t keylock; /* protects the below members */ |
92 | int keypressed; /* current state */ | 92 | bool keypressed; /* current state */ |
93 | unsigned long keyup_jiffies; /* when should the current keypress be released? */ | ||
94 | struct timer_list timer_keyup; /* timer for releasing a keypress */ | ||
95 | u32 last_keycode; /* keycode of last command */ | ||
96 | u32 last_scancode; /* scancode of last command */ | ||
97 | u8 last_toggle; /* toggle of last command */ | ||
93 | }; | 98 | }; |
94 | 99 | ||
95 | struct ir_raw_handler { | 100 | struct ir_raw_handler { |
@@ -115,8 +120,8 @@ void rc_map_init(void); | |||
115 | 120 | ||
116 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, | 121 | u32 ir_g_keycode_from_table(struct input_dev *input_dev, |
117 | u32 scancode); | 122 | u32 scancode); |
118 | void ir_keyup(struct input_dev *dev); | 123 | void ir_repeat(struct input_dev *dev); |
119 | void ir_keydown(struct input_dev *dev, int scancode); | 124 | void ir_keydown(struct input_dev *dev, int scancode, u8 toggle); |
120 | int __ir_input_register(struct input_dev *dev, | 125 | int __ir_input_register(struct input_dev *dev, |
121 | const struct ir_scancode_table *ir_codes, | 126 | const struct ir_scancode_table *ir_codes, |
122 | const struct ir_dev_props *props, | 127 | const struct ir_dev_props *props, |