aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2011-02-01 00:06:39 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2011-02-01 00:16:53 -0500
commitf06e6a52ca3dbe927f58653b1e90cbb53f5ceb55 (patch)
treebdacee321211bdbd29b5fcc6b4ee35d246b2e3b1 /drivers/media/dvb
parenta1f3d4bba8ea395a39d34ade6017afee8be16031 (diff)
Input: dvb-usb-remote - convert to new style of get/setkeycode
Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-remote.c113
1 files changed, 70 insertions, 43 deletions
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
index 23005b3cf30b..347fbd4e2d56 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
@@ -8,60 +8,71 @@
8#include "dvb-usb-common.h" 8#include "dvb-usb-common.h"
9#include <linux/usb/input.h> 9#include <linux/usb/input.h>
10 10
11static unsigned int
12legacy_dvb_usb_get_keymap_index(const struct input_keymap_entry *ke,
13 struct rc_map_table *keymap,
14 unsigned int keymap_size)
15{
16 unsigned int index;
17 unsigned int scancode;
18
19 if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
20 index = ke->index;
21 } else {
22 if (input_scancode_to_scalar(ke, &scancode))
23 return keymap_size;
24
25 /* See if we can match the raw key code. */
26 for (index = 0; index < keymap_size; index++)
27 if (keymap[index].scancode == scancode)
28 break;
29
30 /* See if there is an unused hole in the map */
31 if (index >= keymap_size) {
32 for (index = 0; index < keymap_size; index++) {
33 if (keymap[index].keycode == KEY_RESERVED ||
34 keymap[index].keycode == KEY_UNKNOWN) {
35 break;
36 }
37 }
38 }
39 }
40
41 return index;
42}
43
11static int legacy_dvb_usb_getkeycode(struct input_dev *dev, 44static int legacy_dvb_usb_getkeycode(struct input_dev *dev,
12 unsigned int scancode, unsigned int *keycode) 45 struct input_keymap_entry *ke)
13{ 46{
14 struct dvb_usb_device *d = input_get_drvdata(dev); 47 struct dvb_usb_device *d = input_get_drvdata(dev);
15
16 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table; 48 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
17 int i; 49 unsigned int keymap_size = d->props.rc.legacy.rc_map_size;
50 unsigned int index;
18 51
19 /* See if we can match the raw key code. */ 52 index = legacy_dvb_usb_get_keymap_index(ke, keymap, keymap_size);
20 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) 53 if (index >= keymap_size)
21 if (keymap[i].scancode == scancode) { 54 return -EINVAL;
22 *keycode = keymap[i].keycode;
23 return 0;
24 }
25 55
26 /* 56 ke->keycode = keymap[index].keycode;
27 * If is there extra space, returns KEY_RESERVED, 57 if (ke->keycode == KEY_UNKNOWN)
28 * otherwise, input core won't let legacy_dvb_usb_setkeycode 58 ke->keycode = KEY_RESERVED;
29 * to work 59 ke->len = sizeof(keymap[index].scancode);
30 */ 60 memcpy(&ke->scancode, &keymap[index].scancode, ke->len);
31 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) 61 ke->index = index;
32 if (keymap[i].keycode == KEY_RESERVED ||
33 keymap[i].keycode == KEY_UNKNOWN) {
34 *keycode = KEY_RESERVED;
35 return 0;
36 }
37 62
38 return -EINVAL; 63 return 0;
39} 64}
40 65
41static int legacy_dvb_usb_setkeycode(struct input_dev *dev, 66static int legacy_dvb_usb_setkeycode(struct input_dev *dev,
42 unsigned int scancode, unsigned int keycode) 67 const struct input_keymap_entry *ke,
68 unsigned int *old_keycode)
43{ 69{
44 struct dvb_usb_device *d = input_get_drvdata(dev); 70 struct dvb_usb_device *d = input_get_drvdata(dev);
45
46 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table; 71 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
47 int i; 72 unsigned int keymap_size = d->props.rc.legacy.rc_map_size;
48 73 unsigned int index;
49 /* Search if it is replacing an existing keycode */
50 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
51 if (keymap[i].scancode == scancode) {
52 keymap[i].keycode = keycode;
53 return 0;
54 }
55
56 /* Search if is there a clean entry. If so, use it */
57 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
58 if (keymap[i].keycode == KEY_RESERVED ||
59 keymap[i].keycode == KEY_UNKNOWN) {
60 keymap[i].scancode = scancode;
61 keymap[i].keycode = keycode;
62 return 0;
63 }
64 74
75 index = legacy_dvb_usb_get_keymap_index(ke, keymap, keymap_size);
65 /* 76 /*
66 * FIXME: Currently, it is not possible to increase the size of 77 * FIXME: Currently, it is not possible to increase the size of
67 * scancode table. For it to happen, one possibility 78 * scancode table. For it to happen, one possibility
@@ -69,8 +80,24 @@ static int legacy_dvb_usb_setkeycode(struct input_dev *dev,
69 * copying data, appending the new key on it, and freeing 80 * copying data, appending the new key on it, and freeing
70 * the old one - or maybe just allocating some spare space 81 * the old one - or maybe just allocating some spare space
71 */ 82 */
83 if (index >= keymap_size)
84 return -EINVAL;
85
86 *old_keycode = keymap[index].keycode;
87 keymap->keycode = ke->keycode;
88 __set_bit(ke->keycode, dev->keybit);
89
90 if (*old_keycode != KEY_RESERVED) {
91 __clear_bit(*old_keycode, dev->keybit);
92 for (index = 0; index < keymap_size; index++) {
93 if (keymap[index].keycode == *old_keycode) {
94 __set_bit(*old_keycode, dev->keybit);
95 break;
96 }
97 }
98 }
72 99
73 return -EINVAL; 100 return 0;
74} 101}
75 102
76/* Remote-control poll function - called every dib->rc_query_interval ms to see 103/* Remote-control poll function - called every dib->rc_query_interval ms to see
@@ -171,8 +198,8 @@ static int legacy_dvb_usb_remote_init(struct dvb_usb_device *d)
171 d->input_dev = input_dev; 198 d->input_dev = input_dev;
172 d->rc_dev = NULL; 199 d->rc_dev = NULL;
173 200
174 input_dev->getkeycode = legacy_dvb_usb_getkeycode; 201 input_dev->getkeycode_new = legacy_dvb_usb_getkeycode;
175 input_dev->setkeycode = legacy_dvb_usb_setkeycode; 202 input_dev->setkeycode_new = legacy_dvb_usb_setkeycode;
176 203
177 /* set the bits for the keys */ 204 /* set the bits for the keys */
178 deb_rc("key map size: %d\n", d->props.rc.legacy.rc_map_size); 205 deb_rc("key map size: %d\n", d->props.rc.legacy.rc_map_size);