diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-02-01 00:06:39 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-02-01 00:16:53 -0500 |
commit | f06e6a52ca3dbe927f58653b1e90cbb53f5ceb55 (patch) | |
tree | bdacee321211bdbd29b5fcc6b4ee35d246b2e3b1 /drivers/media/dvb | |
parent | a1f3d4bba8ea395a39d34ade6017afee8be16031 (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.c | 113 |
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 | ||
11 | static unsigned int | ||
12 | legacy_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 | |||
11 | static int legacy_dvb_usb_getkeycode(struct input_dev *dev, | 44 | static 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 | ||
41 | static int legacy_dvb_usb_setkeycode(struct input_dev *dev, | 66 | static 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); |