diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-09 22:52:01 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-09 22:52:01 -0500 |
commit | fa395aaec823b9d1a5800913a6b5d0e6d1c5ced2 (patch) | |
tree | d599abe9f4f48f1737da50fa9a48dadfd08100e3 /drivers/input/misc | |
parent | 3e7468313758913c5e4d372f35b271b96bad1298 (diff) | |
parent | 1f26978afd123deb22dd3c7dc75771a02f6e03f6 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: (51 commits)
Input: appletouch - give up maintainership
Input: dm355evm_kbd - switch to using sparse keymap library
Input: wistron_btns - switch to using sparse keymap library
Input: add generic support for sparse keymaps
Input: fix memory leak in force feedback core
Input: wistron - remove identification strings from DMI table
Input: psmouse - remove identification strings from DMI tables
Input: atkbd - remove identification strings from DMI table
Input: i8042 - remove identification strings from DMI tables
DMI: allow omitting ident strings in DMI tables
Input: psmouse - do not carry DMI data around
Input: matrix-keypad - switch to using dev_pm_ops
Input: keyboard - fix lack of locking when traversing handler->h_list
Input: gpio_keys - scan gpio state at probe and resume time
Input: keyboard - add locking around event handling
Input: usbtouchscreen - add support for ET&T TC5UH touchscreen controller
Input: xpad - add two new Xbox 360 devices
Input: polled device - do not start polling if interval is zero
Input: polled device - schedule first poll immediately
Input: add S3C24XX touchscreen driver
...
Diffstat (limited to 'drivers/input/misc')
-rw-r--r-- | drivers/input/misc/Kconfig | 2 | ||||
-rw-r--r-- | drivers/input/misc/ati_remote.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/dm355evm_keys.c | 150 | ||||
-rw-r--r-- | drivers/input/misc/powermate.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/wistron_btns.c | 256 |
5 files changed, 143 insertions, 269 deletions
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index a9bb2544b2de..16ec5233441c 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -80,6 +80,7 @@ config INPUT_WISTRON_BTNS | |||
80 | tristate "x86 Wistron laptop button interface" | 80 | tristate "x86 Wistron laptop button interface" |
81 | depends on X86 && !X86_64 | 81 | depends on X86 && !X86_64 |
82 | select INPUT_POLLDEV | 82 | select INPUT_POLLDEV |
83 | select INPUT_SPARSEKMAP | ||
83 | select NEW_LEDS | 84 | select NEW_LEDS |
84 | select LEDS_CLASS | 85 | select LEDS_CLASS |
85 | select CHECK_SIGNATURE | 86 | select CHECK_SIGNATURE |
@@ -281,6 +282,7 @@ config INPUT_RB532_BUTTON | |||
281 | config INPUT_DM355EVM | 282 | config INPUT_DM355EVM |
282 | tristate "TI DaVinci DM355 EVM Keypad and IR Remote" | 283 | tristate "TI DaVinci DM355 EVM Keypad and IR Remote" |
283 | depends on MFD_DM355EVM_MSP | 284 | depends on MFD_DM355EVM_MSP |
285 | select INPUT_SPARSEKMAP | ||
284 | help | 286 | help |
285 | Supports the pushbuttons and IR remote used with | 287 | Supports the pushbuttons and IR remote used with |
286 | the DM355 EVM board. | 288 | the DM355 EVM board. |
diff --git a/drivers/input/misc/ati_remote.c b/drivers/input/misc/ati_remote.c index e290fde35e74..614b65d78fe9 100644 --- a/drivers/input/misc/ati_remote.c +++ b/drivers/input/misc/ati_remote.c | |||
@@ -766,7 +766,7 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de | |||
766 | ati_remote->interface = interface; | 766 | ati_remote->interface = interface; |
767 | 767 | ||
768 | usb_make_path(udev, ati_remote->phys, sizeof(ati_remote->phys)); | 768 | usb_make_path(udev, ati_remote->phys, sizeof(ati_remote->phys)); |
769 | strlcpy(ati_remote->phys, "/input0", sizeof(ati_remote->phys)); | 769 | strlcat(ati_remote->phys, "/input0", sizeof(ati_remote->phys)); |
770 | 770 | ||
771 | if (udev->manufacturer) | 771 | if (udev->manufacturer) |
772 | strlcpy(ati_remote->name, udev->manufacturer, sizeof(ati_remote->name)); | 772 | strlcpy(ati_remote->name, udev->manufacturer, sizeof(ati_remote->name)); |
diff --git a/drivers/input/misc/dm355evm_keys.c b/drivers/input/misc/dm355evm_keys.c index f2b67dc81d80..766c06911f41 100644 --- a/drivers/input/misc/dm355evm_keys.c +++ b/drivers/input/misc/dm355evm_keys.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/input.h> | 13 | #include <linux/input.h> |
14 | #include <linux/input/sparse-keymap.h> | ||
14 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
15 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
16 | 17 | ||
@@ -33,12 +34,8 @@ struct dm355evm_keys { | |||
33 | int irq; | 34 | int irq; |
34 | }; | 35 | }; |
35 | 36 | ||
36 | /* These initial keycodes can be remapped by dm355evm_setkeycode(). */ | 37 | /* These initial keycodes can be remapped */ |
37 | static struct { | 38 | static const struct key_entry dm355evm_keys[] = { |
38 | u16 event; | ||
39 | u16 keycode; | ||
40 | } dm355evm_keys[] = { | ||
41 | |||
42 | /* | 39 | /* |
43 | * Pushbuttons on the EVM board ... note that the labels for these | 40 | * Pushbuttons on the EVM board ... note that the labels for these |
44 | * are SW10/SW11/etc on the PC board. The left/right orientation | 41 | * are SW10/SW11/etc on the PC board. The left/right orientation |
@@ -47,11 +44,11 @@ static struct { | |||
47 | * is to the right. (That is, rotate the board counter-clockwise | 44 | * is to the right. (That is, rotate the board counter-clockwise |
48 | * by 90 degrees from the SW10/etc and "DM355 EVM" labels.) | 45 | * by 90 degrees from the SW10/etc and "DM355 EVM" labels.) |
49 | */ | 46 | */ |
50 | { 0x00d8, KEY_OK, }, /* SW12 */ | 47 | { KE_KEY, 0x00d8, { KEY_OK } }, /* SW12 */ |
51 | { 0x00b8, KEY_UP, }, /* SW13 */ | 48 | { KE_KEY, 0x00b8, { KEY_UP } }, /* SW13 */ |
52 | { 0x00e8, KEY_DOWN, }, /* SW11 */ | 49 | { KE_KEY, 0x00e8, { KEY_DOWN } }, /* SW11 */ |
53 | { 0x0078, KEY_LEFT, }, /* SW14 */ | 50 | { KE_KEY, 0x0078, { KEY_LEFT } }, /* SW14 */ |
54 | { 0x00f0, KEY_RIGHT, }, /* SW10 */ | 51 | { KE_KEY, 0x00f0, { KEY_RIGHT } }, /* SW10 */ |
55 | 52 | ||
56 | /* | 53 | /* |
57 | * IR buttons ... codes assigned to match the universal remote | 54 | * IR buttons ... codes assigned to match the universal remote |
@@ -65,35 +62,35 @@ static struct { | |||
65 | * RC5 codes are 14 bits, with two start bits (0x3 prefix) | 62 | * RC5 codes are 14 bits, with two start bits (0x3 prefix) |
66 | * and a toggle bit (masked out below). | 63 | * and a toggle bit (masked out below). |
67 | */ | 64 | */ |
68 | { 0x300c, KEY_POWER, }, /* NOTE: docs omit this */ | 65 | { KE_KEY, 0x300c, { KEY_POWER } }, /* NOTE: docs omit this */ |
69 | { 0x3000, KEY_NUMERIC_0, }, | 66 | { KE_KEY, 0x3000, { KEY_NUMERIC_0 } }, |
70 | { 0x3001, KEY_NUMERIC_1, }, | 67 | { KE_KEY, 0x3001, { KEY_NUMERIC_1 } }, |
71 | { 0x3002, KEY_NUMERIC_2, }, | 68 | { KE_KEY, 0x3002, { KEY_NUMERIC_2 } }, |
72 | { 0x3003, KEY_NUMERIC_3, }, | 69 | { KE_KEY, 0x3003, { KEY_NUMERIC_3 } }, |
73 | { 0x3004, KEY_NUMERIC_4, }, | 70 | { KE_KEY, 0x3004, { KEY_NUMERIC_4 } }, |
74 | { 0x3005, KEY_NUMERIC_5, }, | 71 | { KE_KEY, 0x3005, { KEY_NUMERIC_5 } }, |
75 | { 0x3006, KEY_NUMERIC_6, }, | 72 | { KE_KEY, 0x3006, { KEY_NUMERIC_6 } }, |
76 | { 0x3007, KEY_NUMERIC_7, }, | 73 | { KE_KEY, 0x3007, { KEY_NUMERIC_7 } }, |
77 | { 0x3008, KEY_NUMERIC_8, }, | 74 | { KE_KEY, 0x3008, { KEY_NUMERIC_8 } }, |
78 | { 0x3009, KEY_NUMERIC_9, }, | 75 | { KE_KEY, 0x3009, { KEY_NUMERIC_9 } }, |
79 | { 0x3022, KEY_ENTER, }, | 76 | { KE_KEY, 0x3022, { KEY_ENTER } }, |
80 | { 0x30ec, KEY_MODE, }, /* "tv/vcr/..." */ | 77 | { KE_KEY, 0x30ec, { KEY_MODE } }, /* "tv/vcr/..." */ |
81 | { 0x300f, KEY_SELECT, }, /* "info" */ | 78 | { KE_KEY, 0x300f, { KEY_SELECT } }, /* "info" */ |
82 | { 0x3020, KEY_CHANNELUP, }, /* "up" */ | 79 | { KE_KEY, 0x3020, { KEY_CHANNELUP } }, /* "up" */ |
83 | { 0x302e, KEY_MENU, }, /* "in/out" */ | 80 | { KE_KEY, 0x302e, { KEY_MENU } }, /* "in/out" */ |
84 | { 0x3011, KEY_VOLUMEDOWN, }, /* "left" */ | 81 | { KE_KEY, 0x3011, { KEY_VOLUMEDOWN } }, /* "left" */ |
85 | { 0x300d, KEY_MUTE, }, /* "ok" */ | 82 | { KE_KEY, 0x300d, { KEY_MUTE } }, /* "ok" */ |
86 | { 0x3010, KEY_VOLUMEUP, }, /* "right" */ | 83 | { KE_KEY, 0x3010, { KEY_VOLUMEUP } }, /* "right" */ |
87 | { 0x301e, KEY_SUBTITLE, }, /* "cc" */ | 84 | { KE_KEY, 0x301e, { KEY_SUBTITLE } }, /* "cc" */ |
88 | { 0x3021, KEY_CHANNELDOWN, }, /* "down" */ | 85 | { KE_KEY, 0x3021, { KEY_CHANNELDOWN } },/* "down" */ |
89 | { 0x3022, KEY_PREVIOUS, }, | 86 | { KE_KEY, 0x3022, { KEY_PREVIOUS } }, |
90 | { 0x3026, KEY_SLEEP, }, | 87 | { KE_KEY, 0x3026, { KEY_SLEEP } }, |
91 | { 0x3172, KEY_REWIND, }, /* NOTE: docs wrongly say 0x30ca */ | 88 | { KE_KEY, 0x3172, { KEY_REWIND } }, /* NOTE: docs wrongly say 0x30ca */ |
92 | { 0x3175, KEY_PLAY, }, | 89 | { KE_KEY, 0x3175, { KEY_PLAY } }, |
93 | { 0x3174, KEY_FASTFORWARD, }, | 90 | { KE_KEY, 0x3174, { KEY_FASTFORWARD } }, |
94 | { 0x3177, KEY_RECORD, }, | 91 | { KE_KEY, 0x3177, { KEY_RECORD } }, |
95 | { 0x3176, KEY_STOP, }, | 92 | { KE_KEY, 0x3176, { KEY_STOP } }, |
96 | { 0x3169, KEY_PAUSE, }, | 93 | { KE_KEY, 0x3169, { KEY_PAUSE } }, |
97 | }; | 94 | }; |
98 | 95 | ||
99 | /* | 96 | /* |
@@ -105,19 +102,18 @@ static struct { | |||
105 | */ | 102 | */ |
106 | static irqreturn_t dm355evm_keys_irq(int irq, void *_keys) | 103 | static irqreturn_t dm355evm_keys_irq(int irq, void *_keys) |
107 | { | 104 | { |
108 | struct dm355evm_keys *keys = _keys; | 105 | static u16 last_event; |
109 | int status; | 106 | struct dm355evm_keys *keys = _keys; |
107 | const struct key_entry *ke; | ||
108 | unsigned int keycode; | ||
109 | int status; | ||
110 | u16 event; | ||
110 | 111 | ||
111 | /* For simplicity we ignore INPUT_COUNT and just read | 112 | /* For simplicity we ignore INPUT_COUNT and just read |
112 | * events until we get the "queue empty" indicator. | 113 | * events until we get the "queue empty" indicator. |
113 | * Reading INPUT_LOW decrements the count. | 114 | * Reading INPUT_LOW decrements the count. |
114 | */ | 115 | */ |
115 | for (;;) { | 116 | for (;;) { |
116 | static u16 last_event; | ||
117 | u16 event; | ||
118 | int keycode; | ||
119 | int i; | ||
120 | |||
121 | status = dm355evm_msp_read(DM355EVM_MSP_INPUT_HIGH); | 117 | status = dm355evm_msp_read(DM355EVM_MSP_INPUT_HIGH); |
122 | if (status < 0) { | 118 | if (status < 0) { |
123 | dev_dbg(keys->dev, "input high err %d\n", | 119 | dev_dbg(keys->dev, "input high err %d\n", |
@@ -156,14 +152,9 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys) | |||
156 | /* ignore the RC5 toggle bit */ | 152 | /* ignore the RC5 toggle bit */ |
157 | event &= ~0x0800; | 153 | event &= ~0x0800; |
158 | 154 | ||
159 | /* find the key, or leave it as unknown */ | 155 | /* find the key, or report it as unknown */ |
160 | keycode = KEY_UNKNOWN; | 156 | ke = sparse_keymap_entry_from_scancode(keys->input, event); |
161 | for (i = 0; i < ARRAY_SIZE(dm355evm_keys); i++) { | 157 | keycode = ke ? ke->keycode : KEY_UNKNOWN; |
162 | if (dm355evm_keys[i].event != event) | ||
163 | continue; | ||
164 | keycode = dm355evm_keys[i].keycode; | ||
165 | break; | ||
166 | } | ||
167 | dev_dbg(keys->dev, | 158 | dev_dbg(keys->dev, |
168 | "input event 0x%04x--> keycode %d\n", | 159 | "input event 0x%04x--> keycode %d\n", |
169 | event, keycode); | 160 | event, keycode); |
@@ -174,36 +165,8 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys) | |||
174 | input_report_key(keys->input, keycode, 0); | 165 | input_report_key(keys->input, keycode, 0); |
175 | input_sync(keys->input); | 166 | input_sync(keys->input); |
176 | } | 167 | } |
177 | return IRQ_HANDLED; | ||
178 | } | ||
179 | 168 | ||
180 | static int dm355evm_setkeycode(struct input_dev *dev, int index, int keycode) | 169 | return IRQ_HANDLED; |
181 | { | ||
182 | u16 old_keycode; | ||
183 | unsigned i; | ||
184 | |||
185 | if (((unsigned)index) >= ARRAY_SIZE(dm355evm_keys)) | ||
186 | return -EINVAL; | ||
187 | |||
188 | old_keycode = dm355evm_keys[index].keycode; | ||
189 | dm355evm_keys[index].keycode = keycode; | ||
190 | set_bit(keycode, dev->keybit); | ||
191 | |||
192 | for (i = 0; i < ARRAY_SIZE(dm355evm_keys); i++) { | ||
193 | if (dm355evm_keys[index].keycode == old_keycode) | ||
194 | goto done; | ||
195 | } | ||
196 | clear_bit(old_keycode, dev->keybit); | ||
197 | done: | ||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | static int dm355evm_getkeycode(struct input_dev *dev, int index, int *keycode) | ||
202 | { | ||
203 | if (((unsigned)index) >= ARRAY_SIZE(dm355evm_keys)) | ||
204 | return -EINVAL; | ||
205 | |||
206 | return dm355evm_keys[index].keycode; | ||
207 | } | 170 | } |
208 | 171 | ||
209 | /*----------------------------------------------------------------------*/ | 172 | /*----------------------------------------------------------------------*/ |
@@ -213,7 +176,6 @@ static int __devinit dm355evm_keys_probe(struct platform_device *pdev) | |||
213 | struct dm355evm_keys *keys; | 176 | struct dm355evm_keys *keys; |
214 | struct input_dev *input; | 177 | struct input_dev *input; |
215 | int status; | 178 | int status; |
216 | int i; | ||
217 | 179 | ||
218 | /* allocate instance struct and input dev */ | 180 | /* allocate instance struct and input dev */ |
219 | keys = kzalloc(sizeof *keys, GFP_KERNEL); | 181 | keys = kzalloc(sizeof *keys, GFP_KERNEL); |
@@ -242,31 +204,30 @@ static int __devinit dm355evm_keys_probe(struct platform_device *pdev) | |||
242 | input->id.product = 0x0355; | 204 | input->id.product = 0x0355; |
243 | input->id.version = dm355evm_msp_read(DM355EVM_MSP_FIRMREV); | 205 | input->id.version = dm355evm_msp_read(DM355EVM_MSP_FIRMREV); |
244 | 206 | ||
245 | input->evbit[0] = BIT(EV_KEY); | 207 | status = sparse_keymap_setup(input, dm355evm_keys, NULL); |
246 | for (i = 0; i < ARRAY_SIZE(dm355evm_keys); i++) | 208 | if (status) |
247 | __set_bit(dm355evm_keys[i].keycode, input->keybit); | 209 | goto fail1; |
248 | |||
249 | input->setkeycode = dm355evm_setkeycode; | ||
250 | input->getkeycode = dm355evm_getkeycode; | ||
251 | 210 | ||
252 | /* REVISIT: flush the event queue? */ | 211 | /* REVISIT: flush the event queue? */ |
253 | 212 | ||
254 | status = request_threaded_irq(keys->irq, NULL, dm355evm_keys_irq, | 213 | status = request_threaded_irq(keys->irq, NULL, dm355evm_keys_irq, |
255 | IRQF_TRIGGER_FALLING, dev_name(&pdev->dev), keys); | 214 | IRQF_TRIGGER_FALLING, dev_name(&pdev->dev), keys); |
256 | if (status < 0) | 215 | if (status < 0) |
257 | goto fail1; | 216 | goto fail2; |
258 | 217 | ||
259 | /* register */ | 218 | /* register */ |
260 | status = input_register_device(input); | 219 | status = input_register_device(input); |
261 | if (status < 0) | 220 | if (status < 0) |
262 | goto fail2; | 221 | goto fail3; |
263 | 222 | ||
264 | platform_set_drvdata(pdev, keys); | 223 | platform_set_drvdata(pdev, keys); |
265 | 224 | ||
266 | return 0; | 225 | return 0; |
267 | 226 | ||
268 | fail2: | 227 | fail3: |
269 | free_irq(keys->irq, keys); | 228 | free_irq(keys->irq, keys); |
229 | fail2: | ||
230 | sparse_keymap_free(input); | ||
270 | fail1: | 231 | fail1: |
271 | input_free_device(input); | 232 | input_free_device(input); |
272 | kfree(keys); | 233 | kfree(keys); |
@@ -280,6 +241,7 @@ static int __devexit dm355evm_keys_remove(struct platform_device *pdev) | |||
280 | struct dm355evm_keys *keys = platform_get_drvdata(pdev); | 241 | struct dm355evm_keys *keys = platform_get_drvdata(pdev); |
281 | 242 | ||
282 | free_irq(keys->irq, keys); | 243 | free_irq(keys->irq, keys); |
244 | sparse_keymap_free(keys->input); | ||
283 | input_unregister_device(keys->input); | 245 | input_unregister_device(keys->input); |
284 | kfree(keys); | 246 | kfree(keys); |
285 | 247 | ||
diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c index a53c4885fbad..668913d12044 100644 --- a/drivers/input/misc/powermate.c +++ b/drivers/input/misc/powermate.c | |||
@@ -338,7 +338,7 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
338 | pm->input = input_dev; | 338 | pm->input = input_dev; |
339 | 339 | ||
340 | usb_make_path(udev, pm->phys, sizeof(pm->phys)); | 340 | usb_make_path(udev, pm->phys, sizeof(pm->phys)); |
341 | strlcpy(pm->phys, "/input0", sizeof(pm->phys)); | 341 | strlcat(pm->phys, "/input0", sizeof(pm->phys)); |
342 | 342 | ||
343 | spin_lock_init(&pm->lock); | 343 | spin_lock_init(&pm->lock); |
344 | 344 | ||
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index a932179c4c9e..38da6ab04384 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/dmi.h> | 21 | #include <linux/dmi.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/input-polldev.h> | 23 | #include <linux/input-polldev.h> |
24 | #include <linux/input/sparse-keymap.h> | ||
24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
25 | #include <linux/jiffies.h> | 26 | #include <linux/jiffies.h> |
26 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
@@ -224,19 +225,8 @@ static void bios_set_state(u8 subsys, int enable) | |||
224 | 225 | ||
225 | /* Hardware database */ | 226 | /* Hardware database */ |
226 | 227 | ||
227 | struct key_entry { | 228 | #define KE_WIFI (KE_LAST + 1) |
228 | char type; /* See KE_* below */ | 229 | #define KE_BLUETOOTH (KE_LAST + 2) |
229 | u8 code; | ||
230 | union { | ||
231 | u16 keycode; /* For KE_KEY */ | ||
232 | struct { /* For KE_SW */ | ||
233 | u8 code; | ||
234 | u8 value; | ||
235 | } sw; | ||
236 | }; | ||
237 | }; | ||
238 | |||
239 | enum { KE_END, KE_KEY, KE_SW, KE_WIFI, KE_BLUETOOTH }; | ||
240 | 230 | ||
241 | #define FE_MAIL_LED 0x01 | 231 | #define FE_MAIL_LED 0x01 |
242 | #define FE_WIFI_LED 0x02 | 232 | #define FE_WIFI_LED 0x02 |
@@ -644,10 +634,10 @@ static struct key_entry keymap_prestigio[] __initdata = { | |||
644 | * a list of buttons and their key codes (reported when loading this module | 634 | * a list of buttons and their key codes (reported when loading this module |
645 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. | 635 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. |
646 | */ | 636 | */ |
647 | static struct dmi_system_id dmi_ids[] __initdata = { | 637 | static const struct dmi_system_id __initconst dmi_ids[] = { |
648 | { | 638 | { |
639 | /* Fujitsu-Siemens Amilo Pro V2000 */ | ||
649 | .callback = dmi_matched, | 640 | .callback = dmi_matched, |
650 | .ident = "Fujitsu-Siemens Amilo Pro V2000", | ||
651 | .matches = { | 641 | .matches = { |
652 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 642 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
653 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"), | 643 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"), |
@@ -655,8 +645,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
655 | .driver_data = keymap_fs_amilo_pro_v2000 | 645 | .driver_data = keymap_fs_amilo_pro_v2000 |
656 | }, | 646 | }, |
657 | { | 647 | { |
648 | /* Fujitsu-Siemens Amilo Pro Edition V3505 */ | ||
658 | .callback = dmi_matched, | 649 | .callback = dmi_matched, |
659 | .ident = "Fujitsu-Siemens Amilo Pro Edition V3505", | ||
660 | .matches = { | 650 | .matches = { |
661 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 651 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
662 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Edition V3505"), | 652 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Edition V3505"), |
@@ -664,8 +654,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
664 | .driver_data = keymap_fs_amilo_pro_v3505 | 654 | .driver_data = keymap_fs_amilo_pro_v3505 |
665 | }, | 655 | }, |
666 | { | 656 | { |
657 | /* Fujitsu-Siemens Amilo M7400 */ | ||
667 | .callback = dmi_matched, | 658 | .callback = dmi_matched, |
668 | .ident = "Fujitsu-Siemens Amilo M7400", | ||
669 | .matches = { | 659 | .matches = { |
670 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 660 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
671 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "), | 661 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "), |
@@ -673,8 +663,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
673 | .driver_data = keymap_fs_amilo_pro_v2000 | 663 | .driver_data = keymap_fs_amilo_pro_v2000 |
674 | }, | 664 | }, |
675 | { | 665 | { |
666 | /* Maxdata Pro 7000 DX */ | ||
676 | .callback = dmi_matched, | 667 | .callback = dmi_matched, |
677 | .ident = "Maxdata Pro 7000 DX", | ||
678 | .matches = { | 668 | .matches = { |
679 | DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"), | 669 | DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"), |
680 | DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"), | 670 | DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"), |
@@ -682,8 +672,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
682 | .driver_data = keymap_fs_amilo_pro_v2000 | 672 | .driver_data = keymap_fs_amilo_pro_v2000 |
683 | }, | 673 | }, |
684 | { | 674 | { |
675 | /* Fujitsu N3510 */ | ||
685 | .callback = dmi_matched, | 676 | .callback = dmi_matched, |
686 | .ident = "Fujitsu N3510", | ||
687 | .matches = { | 677 | .matches = { |
688 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | 678 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
689 | DMI_MATCH(DMI_PRODUCT_NAME, "N3510"), | 679 | DMI_MATCH(DMI_PRODUCT_NAME, "N3510"), |
@@ -691,8 +681,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
691 | .driver_data = keymap_fujitsu_n3510 | 681 | .driver_data = keymap_fujitsu_n3510 |
692 | }, | 682 | }, |
693 | { | 683 | { |
684 | /* Acer Aspire 1500 */ | ||
694 | .callback = dmi_matched, | 685 | .callback = dmi_matched, |
695 | .ident = "Acer Aspire 1500", | ||
696 | .matches = { | 686 | .matches = { |
697 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 687 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
698 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"), | 688 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"), |
@@ -700,8 +690,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
700 | .driver_data = keymap_acer_aspire_1500 | 690 | .driver_data = keymap_acer_aspire_1500 |
701 | }, | 691 | }, |
702 | { | 692 | { |
693 | /* Acer Aspire 1600 */ | ||
703 | .callback = dmi_matched, | 694 | .callback = dmi_matched, |
704 | .ident = "Acer Aspire 1600", | ||
705 | .matches = { | 695 | .matches = { |
706 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 696 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
707 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"), | 697 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"), |
@@ -709,8 +699,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
709 | .driver_data = keymap_acer_aspire_1600 | 699 | .driver_data = keymap_acer_aspire_1600 |
710 | }, | 700 | }, |
711 | { | 701 | { |
702 | /* Acer Aspire 3020 */ | ||
712 | .callback = dmi_matched, | 703 | .callback = dmi_matched, |
713 | .ident = "Acer Aspire 3020", | ||
714 | .matches = { | 704 | .matches = { |
715 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 705 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
716 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"), | 706 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"), |
@@ -718,8 +708,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
718 | .driver_data = keymap_acer_aspire_5020 | 708 | .driver_data = keymap_acer_aspire_5020 |
719 | }, | 709 | }, |
720 | { | 710 | { |
711 | /* Acer Aspire 5020 */ | ||
721 | .callback = dmi_matched, | 712 | .callback = dmi_matched, |
722 | .ident = "Acer Aspire 5020", | ||
723 | .matches = { | 713 | .matches = { |
724 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 714 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
725 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"), | 715 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"), |
@@ -727,8 +717,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
727 | .driver_data = keymap_acer_aspire_5020 | 717 | .driver_data = keymap_acer_aspire_5020 |
728 | }, | 718 | }, |
729 | { | 719 | { |
720 | /* Acer TravelMate 2100 */ | ||
730 | .callback = dmi_matched, | 721 | .callback = dmi_matched, |
731 | .ident = "Acer TravelMate 2100", | ||
732 | .matches = { | 722 | .matches = { |
733 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 723 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
734 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"), | 724 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"), |
@@ -736,8 +726,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
736 | .driver_data = keymap_acer_aspire_5020 | 726 | .driver_data = keymap_acer_aspire_5020 |
737 | }, | 727 | }, |
738 | { | 728 | { |
729 | /* Acer TravelMate 2410 */ | ||
739 | .callback = dmi_matched, | 730 | .callback = dmi_matched, |
740 | .ident = "Acer TravelMate 2410", | ||
741 | .matches = { | 731 | .matches = { |
742 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 732 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
743 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"), | 733 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"), |
@@ -745,8 +735,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
745 | .driver_data = keymap_acer_travelmate_2410 | 735 | .driver_data = keymap_acer_travelmate_2410 |
746 | }, | 736 | }, |
747 | { | 737 | { |
738 | /* Acer TravelMate C300 */ | ||
748 | .callback = dmi_matched, | 739 | .callback = dmi_matched, |
749 | .ident = "Acer TravelMate C300", | ||
750 | .matches = { | 740 | .matches = { |
751 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 741 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
752 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"), | 742 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"), |
@@ -754,8 +744,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
754 | .driver_data = keymap_acer_travelmate_300 | 744 | .driver_data = keymap_acer_travelmate_300 |
755 | }, | 745 | }, |
756 | { | 746 | { |
747 | /* Acer TravelMate C100 */ | ||
757 | .callback = dmi_matched, | 748 | .callback = dmi_matched, |
758 | .ident = "Acer TravelMate C100", | ||
759 | .matches = { | 749 | .matches = { |
760 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 750 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
761 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"), | 751 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"), |
@@ -763,8 +753,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
763 | .driver_data = keymap_acer_travelmate_300 | 753 | .driver_data = keymap_acer_travelmate_300 |
764 | }, | 754 | }, |
765 | { | 755 | { |
756 | /* Acer TravelMate C110 */ | ||
766 | .callback = dmi_matched, | 757 | .callback = dmi_matched, |
767 | .ident = "Acer TravelMate C110", | ||
768 | .matches = { | 758 | .matches = { |
769 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 759 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
770 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"), | 760 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"), |
@@ -772,8 +762,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
772 | .driver_data = keymap_acer_travelmate_110 | 762 | .driver_data = keymap_acer_travelmate_110 |
773 | }, | 763 | }, |
774 | { | 764 | { |
765 | /* Acer TravelMate 380 */ | ||
775 | .callback = dmi_matched, | 766 | .callback = dmi_matched, |
776 | .ident = "Acer TravelMate 380", | ||
777 | .matches = { | 767 | .matches = { |
778 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 768 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
779 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"), | 769 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"), |
@@ -781,8 +771,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
781 | .driver_data = keymap_acer_travelmate_380 | 771 | .driver_data = keymap_acer_travelmate_380 |
782 | }, | 772 | }, |
783 | { | 773 | { |
774 | /* Acer TravelMate 370 */ | ||
784 | .callback = dmi_matched, | 775 | .callback = dmi_matched, |
785 | .ident = "Acer TravelMate 370", | ||
786 | .matches = { | 776 | .matches = { |
787 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 777 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
788 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"), | 778 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"), |
@@ -790,8 +780,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
790 | .driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */ | 780 | .driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */ |
791 | }, | 781 | }, |
792 | { | 782 | { |
783 | /* Acer TravelMate 220 */ | ||
793 | .callback = dmi_matched, | 784 | .callback = dmi_matched, |
794 | .ident = "Acer TravelMate 220", | ||
795 | .matches = { | 785 | .matches = { |
796 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 786 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
797 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"), | 787 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"), |
@@ -799,8 +789,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
799 | .driver_data = keymap_acer_travelmate_220 | 789 | .driver_data = keymap_acer_travelmate_220 |
800 | }, | 790 | }, |
801 | { | 791 | { |
792 | /* Acer TravelMate 260 */ | ||
802 | .callback = dmi_matched, | 793 | .callback = dmi_matched, |
803 | .ident = "Acer TravelMate 260", | ||
804 | .matches = { | 794 | .matches = { |
805 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 795 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
806 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"), | 796 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"), |
@@ -808,8 +798,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
808 | .driver_data = keymap_acer_travelmate_220 | 798 | .driver_data = keymap_acer_travelmate_220 |
809 | }, | 799 | }, |
810 | { | 800 | { |
801 | /* Acer TravelMate 230 */ | ||
811 | .callback = dmi_matched, | 802 | .callback = dmi_matched, |
812 | .ident = "Acer TravelMate 230", | ||
813 | .matches = { | 803 | .matches = { |
814 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 804 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
815 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"), | 805 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"), |
@@ -818,8 +808,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
818 | .driver_data = keymap_acer_travelmate_230 | 808 | .driver_data = keymap_acer_travelmate_230 |
819 | }, | 809 | }, |
820 | { | 810 | { |
811 | /* Acer TravelMate 280 */ | ||
821 | .callback = dmi_matched, | 812 | .callback = dmi_matched, |
822 | .ident = "Acer TravelMate 280", | ||
823 | .matches = { | 813 | .matches = { |
824 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 814 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
825 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"), | 815 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"), |
@@ -827,8 +817,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
827 | .driver_data = keymap_acer_travelmate_230 | 817 | .driver_data = keymap_acer_travelmate_230 |
828 | }, | 818 | }, |
829 | { | 819 | { |
820 | /* Acer TravelMate 240 */ | ||
830 | .callback = dmi_matched, | 821 | .callback = dmi_matched, |
831 | .ident = "Acer TravelMate 240", | ||
832 | .matches = { | 822 | .matches = { |
833 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 823 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
834 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 240"), | 824 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 240"), |
@@ -836,8 +826,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
836 | .driver_data = keymap_acer_travelmate_240 | 826 | .driver_data = keymap_acer_travelmate_240 |
837 | }, | 827 | }, |
838 | { | 828 | { |
829 | /* Acer TravelMate 250 */ | ||
839 | .callback = dmi_matched, | 830 | .callback = dmi_matched, |
840 | .ident = "Acer TravelMate 250", | ||
841 | .matches = { | 831 | .matches = { |
842 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 832 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
843 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"), | 833 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"), |
@@ -845,8 +835,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
845 | .driver_data = keymap_acer_travelmate_240 | 835 | .driver_data = keymap_acer_travelmate_240 |
846 | }, | 836 | }, |
847 | { | 837 | { |
838 | /* Acer TravelMate 2424NWXCi */ | ||
848 | .callback = dmi_matched, | 839 | .callback = dmi_matched, |
849 | .ident = "Acer TravelMate 2424NWXCi", | ||
850 | .matches = { | 840 | .matches = { |
851 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 841 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
852 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2420"), | 842 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2420"), |
@@ -854,8 +844,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
854 | .driver_data = keymap_acer_travelmate_240 | 844 | .driver_data = keymap_acer_travelmate_240 |
855 | }, | 845 | }, |
856 | { | 846 | { |
847 | /* Acer TravelMate 350 */ | ||
857 | .callback = dmi_matched, | 848 | .callback = dmi_matched, |
858 | .ident = "Acer TravelMate 350", | ||
859 | .matches = { | 849 | .matches = { |
860 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 850 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
861 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"), | 851 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"), |
@@ -863,8 +853,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
863 | .driver_data = keymap_acer_travelmate_350 | 853 | .driver_data = keymap_acer_travelmate_350 |
864 | }, | 854 | }, |
865 | { | 855 | { |
856 | /* Acer TravelMate 360 */ | ||
866 | .callback = dmi_matched, | 857 | .callback = dmi_matched, |
867 | .ident = "Acer TravelMate 360", | ||
868 | .matches = { | 858 | .matches = { |
869 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 859 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
870 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), | 860 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), |
@@ -872,8 +862,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
872 | .driver_data = keymap_acer_travelmate_360 | 862 | .driver_data = keymap_acer_travelmate_360 |
873 | }, | 863 | }, |
874 | { | 864 | { |
865 | /* Acer TravelMate 610 */ | ||
875 | .callback = dmi_matched, | 866 | .callback = dmi_matched, |
876 | .ident = "Acer TravelMate 610", | ||
877 | .matches = { | 867 | .matches = { |
878 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), | 868 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), |
879 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 610"), | 869 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 610"), |
@@ -881,8 +871,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
881 | .driver_data = keymap_acer_travelmate_610 | 871 | .driver_data = keymap_acer_travelmate_610 |
882 | }, | 872 | }, |
883 | { | 873 | { |
874 | /* Acer TravelMate 620 */ | ||
884 | .callback = dmi_matched, | 875 | .callback = dmi_matched, |
885 | .ident = "Acer TravelMate 620", | ||
886 | .matches = { | 876 | .matches = { |
887 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 877 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
888 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"), | 878 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"), |
@@ -890,8 +880,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
890 | .driver_data = keymap_acer_travelmate_630 | 880 | .driver_data = keymap_acer_travelmate_630 |
891 | }, | 881 | }, |
892 | { | 882 | { |
883 | /* Acer TravelMate 630 */ | ||
893 | .callback = dmi_matched, | 884 | .callback = dmi_matched, |
894 | .ident = "Acer TravelMate 630", | ||
895 | .matches = { | 885 | .matches = { |
896 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 886 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
897 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"), | 887 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"), |
@@ -899,8 +889,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
899 | .driver_data = keymap_acer_travelmate_630 | 889 | .driver_data = keymap_acer_travelmate_630 |
900 | }, | 890 | }, |
901 | { | 891 | { |
892 | /* AOpen 1559AS */ | ||
902 | .callback = dmi_matched, | 893 | .callback = dmi_matched, |
903 | .ident = "AOpen 1559AS", | ||
904 | .matches = { | 894 | .matches = { |
905 | DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), | 895 | DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), |
906 | DMI_MATCH(DMI_BOARD_NAME, "E2U"), | 896 | DMI_MATCH(DMI_BOARD_NAME, "E2U"), |
@@ -908,8 +898,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
908 | .driver_data = keymap_aopen_1559as | 898 | .driver_data = keymap_aopen_1559as |
909 | }, | 899 | }, |
910 | { | 900 | { |
901 | /* Medion MD 9783 */ | ||
911 | .callback = dmi_matched, | 902 | .callback = dmi_matched, |
912 | .ident = "Medion MD 9783", | ||
913 | .matches = { | 903 | .matches = { |
914 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | 904 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), |
915 | DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), | 905 | DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), |
@@ -917,8 +907,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
917 | .driver_data = keymap_wistron_ms2111 | 907 | .driver_data = keymap_wistron_ms2111 |
918 | }, | 908 | }, |
919 | { | 909 | { |
910 | /* Medion MD 40100 */ | ||
920 | .callback = dmi_matched, | 911 | .callback = dmi_matched, |
921 | .ident = "Medion MD 40100", | ||
922 | .matches = { | 912 | .matches = { |
923 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | 913 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), |
924 | DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"), | 914 | DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"), |
@@ -926,8 +916,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
926 | .driver_data = keymap_wistron_md40100 | 916 | .driver_data = keymap_wistron_md40100 |
927 | }, | 917 | }, |
928 | { | 918 | { |
919 | /* Medion MD 2900 */ | ||
929 | .callback = dmi_matched, | 920 | .callback = dmi_matched, |
930 | .ident = "Medion MD 2900", | ||
931 | .matches = { | 921 | .matches = { |
932 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | 922 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), |
933 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"), | 923 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"), |
@@ -935,8 +925,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
935 | .driver_data = keymap_wistron_md2900 | 925 | .driver_data = keymap_wistron_md2900 |
936 | }, | 926 | }, |
937 | { | 927 | { |
928 | /* Medion MD 42200 */ | ||
938 | .callback = dmi_matched, | 929 | .callback = dmi_matched, |
939 | .ident = "Medion MD 42200", | ||
940 | .matches = { | 930 | .matches = { |
941 | DMI_MATCH(DMI_SYS_VENDOR, "Medion"), | 931 | DMI_MATCH(DMI_SYS_VENDOR, "Medion"), |
942 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"), | 932 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"), |
@@ -944,8 +934,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
944 | .driver_data = keymap_fs_amilo_pro_v2000 | 934 | .driver_data = keymap_fs_amilo_pro_v2000 |
945 | }, | 935 | }, |
946 | { | 936 | { |
937 | /* Medion MD 96500 */ | ||
947 | .callback = dmi_matched, | 938 | .callback = dmi_matched, |
948 | .ident = "Medion MD 96500", | ||
949 | .matches = { | 939 | .matches = { |
950 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | 940 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), |
951 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"), | 941 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"), |
@@ -953,8 +943,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
953 | .driver_data = keymap_wistron_md96500 | 943 | .driver_data = keymap_wistron_md96500 |
954 | }, | 944 | }, |
955 | { | 945 | { |
946 | /* Medion MD 95400 */ | ||
956 | .callback = dmi_matched, | 947 | .callback = dmi_matched, |
957 | .ident = "Medion MD 95400", | ||
958 | .matches = { | 948 | .matches = { |
959 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | 949 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), |
960 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"), | 950 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"), |
@@ -962,8 +952,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
962 | .driver_data = keymap_wistron_md96500 | 952 | .driver_data = keymap_wistron_md96500 |
963 | }, | 953 | }, |
964 | { | 954 | { |
955 | /* Fujitsu Siemens Amilo D7820 */ | ||
965 | .callback = dmi_matched, | 956 | .callback = dmi_matched, |
966 | .ident = "Fujitsu Siemens Amilo D7820", | ||
967 | .matches = { | 957 | .matches = { |
968 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */ | 958 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */ |
969 | DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"), | 959 | DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"), |
@@ -971,8 +961,8 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
971 | .driver_data = keymap_fs_amilo_d88x0 | 961 | .driver_data = keymap_fs_amilo_d88x0 |
972 | }, | 962 | }, |
973 | { | 963 | { |
964 | /* Fujitsu Siemens Amilo D88x0 */ | ||
974 | .callback = dmi_matched, | 965 | .callback = dmi_matched, |
975 | .ident = "Fujitsu Siemens Amilo D88x0", | ||
976 | .matches = { | 966 | .matches = { |
977 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 967 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
978 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"), | 968 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"), |
@@ -1037,21 +1027,6 @@ static unsigned long jiffies_last_press; | |||
1037 | static bool wifi_enabled; | 1027 | static bool wifi_enabled; |
1038 | static bool bluetooth_enabled; | 1028 | static bool bluetooth_enabled; |
1039 | 1029 | ||
1040 | static void report_key(struct input_dev *dev, unsigned int keycode) | ||
1041 | { | ||
1042 | input_report_key(dev, keycode, 1); | ||
1043 | input_sync(dev); | ||
1044 | input_report_key(dev, keycode, 0); | ||
1045 | input_sync(dev); | ||
1046 | } | ||
1047 | |||
1048 | static void report_switch(struct input_dev *dev, unsigned int code, int value) | ||
1049 | { | ||
1050 | input_report_switch(dev, code, value); | ||
1051 | input_sync(dev); | ||
1052 | } | ||
1053 | |||
1054 | |||
1055 | /* led management */ | 1030 | /* led management */ |
1056 | static void wistron_mail_led_set(struct led_classdev *led_cdev, | 1031 | static void wistron_mail_led_set(struct led_classdev *led_cdev, |
1057 | enum led_brightness value) | 1032 | enum led_brightness value) |
@@ -1128,43 +1103,13 @@ static inline void wistron_led_resume(void) | |||
1128 | led_classdev_resume(&wistron_wifi_led); | 1103 | led_classdev_resume(&wistron_wifi_led); |
1129 | } | 1104 | } |
1130 | 1105 | ||
1131 | static struct key_entry *wistron_get_entry_by_scancode(int code) | ||
1132 | { | ||
1133 | struct key_entry *key; | ||
1134 | |||
1135 | for (key = keymap; key->type != KE_END; key++) | ||
1136 | if (code == key->code) | ||
1137 | return key; | ||
1138 | |||
1139 | return NULL; | ||
1140 | } | ||
1141 | |||
1142 | static struct key_entry *wistron_get_entry_by_keycode(int keycode) | ||
1143 | { | ||
1144 | struct key_entry *key; | ||
1145 | |||
1146 | for (key = keymap; key->type != KE_END; key++) | ||
1147 | if (key->type == KE_KEY && keycode == key->keycode) | ||
1148 | return key; | ||
1149 | |||
1150 | return NULL; | ||
1151 | } | ||
1152 | |||
1153 | static void handle_key(u8 code) | 1106 | static void handle_key(u8 code) |
1154 | { | 1107 | { |
1155 | const struct key_entry *key = wistron_get_entry_by_scancode(code); | 1108 | const struct key_entry *key = |
1109 | sparse_keymap_entry_from_scancode(wistron_idev->input, code); | ||
1156 | 1110 | ||
1157 | if (key) { | 1111 | if (key) { |
1158 | switch (key->type) { | 1112 | switch (key->type) { |
1159 | case KE_KEY: | ||
1160 | report_key(wistron_idev->input, key->keycode); | ||
1161 | break; | ||
1162 | |||
1163 | case KE_SW: | ||
1164 | report_switch(wistron_idev->input, | ||
1165 | key->sw.code, key->sw.value); | ||
1166 | break; | ||
1167 | |||
1168 | case KE_WIFI: | 1113 | case KE_WIFI: |
1169 | if (have_wifi) { | 1114 | if (have_wifi) { |
1170 | wifi_enabled = !wifi_enabled; | 1115 | wifi_enabled = !wifi_enabled; |
@@ -1180,7 +1125,9 @@ static void handle_key(u8 code) | |||
1180 | break; | 1125 | break; |
1181 | 1126 | ||
1182 | default: | 1127 | default: |
1183 | BUG(); | 1128 | sparse_keymap_report_entry(wistron_idev->input, |
1129 | key, 1, true); | ||
1130 | break; | ||
1184 | } | 1131 | } |
1185 | jiffies_last_press = jiffies; | 1132 | jiffies_last_press = jiffies; |
1186 | } else | 1133 | } else |
@@ -1220,42 +1167,39 @@ static void wistron_poll(struct input_polled_dev *dev) | |||
1220 | dev->poll_interval = POLL_INTERVAL_DEFAULT; | 1167 | dev->poll_interval = POLL_INTERVAL_DEFAULT; |
1221 | } | 1168 | } |
1222 | 1169 | ||
1223 | static int wistron_getkeycode(struct input_dev *dev, int scancode, int *keycode) | 1170 | static int __devinit wistron_setup_keymap(struct input_dev *dev, |
1171 | struct key_entry *entry) | ||
1224 | { | 1172 | { |
1225 | const struct key_entry *key = wistron_get_entry_by_scancode(scancode); | 1173 | switch (entry->type) { |
1226 | 1174 | ||
1227 | if (key && key->type == KE_KEY) { | 1175 | /* if wifi or bluetooth are not available, create normal keys */ |
1228 | *keycode = key->keycode; | 1176 | case KE_WIFI: |
1229 | return 0; | 1177 | if (!have_wifi) { |
1230 | } | 1178 | entry->type = KE_KEY; |
1231 | 1179 | entry->keycode = KEY_WLAN; | |
1232 | return -EINVAL; | 1180 | } |
1233 | } | 1181 | break; |
1234 | 1182 | ||
1235 | static int wistron_setkeycode(struct input_dev *dev, int scancode, int keycode) | 1183 | case KE_BLUETOOTH: |
1236 | { | 1184 | if (!have_bluetooth) { |
1237 | struct key_entry *key; | 1185 | entry->type = KE_KEY; |
1238 | int old_keycode; | 1186 | entry->keycode = KEY_BLUETOOTH; |
1239 | 1187 | } | |
1240 | if (keycode < 0 || keycode > KEY_MAX) | 1188 | break; |
1241 | return -EINVAL; | 1189 | |
1242 | 1190 | case KE_END: | |
1243 | key = wistron_get_entry_by_scancode(scancode); | 1191 | if (entry->code & FE_UNTESTED) |
1244 | if (key && key->type == KE_KEY) { | 1192 | printk(KERN_WARNING "Untested laptop multimedia keys, " |
1245 | old_keycode = key->keycode; | 1193 | "please report success or failure to " |
1246 | key->keycode = keycode; | 1194 | "eric.piel@tremplin-utc.net\n"); |
1247 | set_bit(keycode, dev->keybit); | 1195 | break; |
1248 | if (!wistron_get_entry_by_keycode(old_keycode)) | ||
1249 | clear_bit(old_keycode, dev->keybit); | ||
1250 | return 0; | ||
1251 | } | 1196 | } |
1252 | 1197 | ||
1253 | return -EINVAL; | 1198 | return 0; |
1254 | } | 1199 | } |
1255 | 1200 | ||
1256 | static int __devinit setup_input_dev(void) | 1201 | static int __devinit setup_input_dev(void) |
1257 | { | 1202 | { |
1258 | struct key_entry *key; | ||
1259 | struct input_dev *input_dev; | 1203 | struct input_dev *input_dev; |
1260 | int error; | 1204 | int error; |
1261 | 1205 | ||
@@ -1263,7 +1207,7 @@ static int __devinit setup_input_dev(void) | |||
1263 | if (!wistron_idev) | 1207 | if (!wistron_idev) |
1264 | return -ENOMEM; | 1208 | return -ENOMEM; |
1265 | 1209 | ||
1266 | wistron_idev->flush = wistron_flush; | 1210 | wistron_idev->open = wistron_flush; |
1267 | wistron_idev->poll = wistron_poll; | 1211 | wistron_idev->poll = wistron_poll; |
1268 | wistron_idev->poll_interval = POLL_INTERVAL_DEFAULT; | 1212 | wistron_idev->poll_interval = POLL_INTERVAL_DEFAULT; |
1269 | 1213 | ||
@@ -1273,56 +1217,21 @@ static int __devinit setup_input_dev(void) | |||
1273 | input_dev->id.bustype = BUS_HOST; | 1217 | input_dev->id.bustype = BUS_HOST; |
1274 | input_dev->dev.parent = &wistron_device->dev; | 1218 | input_dev->dev.parent = &wistron_device->dev; |
1275 | 1219 | ||
1276 | input_dev->getkeycode = wistron_getkeycode; | 1220 | error = sparse_keymap_setup(input_dev, keymap, wistron_setup_keymap); |
1277 | input_dev->setkeycode = wistron_setkeycode; | 1221 | if (error) |
1278 | 1222 | goto err_free_dev; | |
1279 | for (key = keymap; key->type != KE_END; key++) { | ||
1280 | switch (key->type) { | ||
1281 | case KE_KEY: | ||
1282 | set_bit(EV_KEY, input_dev->evbit); | ||
1283 | set_bit(key->keycode, input_dev->keybit); | ||
1284 | break; | ||
1285 | |||
1286 | case KE_SW: | ||
1287 | set_bit(EV_SW, input_dev->evbit); | ||
1288 | set_bit(key->sw.code, input_dev->swbit); | ||
1289 | break; | ||
1290 | |||
1291 | /* if wifi or bluetooth are not available, create normal keys */ | ||
1292 | case KE_WIFI: | ||
1293 | if (!have_wifi) { | ||
1294 | key->type = KE_KEY; | ||
1295 | key->keycode = KEY_WLAN; | ||
1296 | key--; | ||
1297 | } | ||
1298 | break; | ||
1299 | |||
1300 | case KE_BLUETOOTH: | ||
1301 | if (!have_bluetooth) { | ||
1302 | key->type = KE_KEY; | ||
1303 | key->keycode = KEY_BLUETOOTH; | ||
1304 | key--; | ||
1305 | } | ||
1306 | break; | ||
1307 | |||
1308 | default: | ||
1309 | break; | ||
1310 | } | ||
1311 | } | ||
1312 | |||
1313 | /* reads information flags on KE_END */ | ||
1314 | if (key->code & FE_UNTESTED) | ||
1315 | printk(KERN_WARNING "Untested laptop multimedia keys, " | ||
1316 | "please report success or failure to eric.piel" | ||
1317 | "@tremplin-utc.net\n"); | ||
1318 | 1223 | ||
1319 | error = input_register_polled_device(wistron_idev); | 1224 | error = input_register_polled_device(wistron_idev); |
1320 | if (error) { | 1225 | if (error) |
1321 | input_free_polled_device(wistron_idev); | 1226 | goto err_free_keymap; |
1322 | return error; | ||
1323 | } | ||
1324 | 1227 | ||
1325 | return 0; | 1228 | return 0; |
1229 | |||
1230 | err_free_keymap: | ||
1231 | sparse_keymap_free(input_dev); | ||
1232 | err_free_dev: | ||
1233 | input_free_polled_device(wistron_idev); | ||
1234 | return error; | ||
1326 | } | 1235 | } |
1327 | 1236 | ||
1328 | /* Driver core */ | 1237 | /* Driver core */ |
@@ -1371,6 +1280,7 @@ static int __devexit wistron_remove(struct platform_device *dev) | |||
1371 | { | 1280 | { |
1372 | wistron_led_remove(); | 1281 | wistron_led_remove(); |
1373 | input_unregister_polled_device(wistron_idev); | 1282 | input_unregister_polled_device(wistron_idev); |
1283 | sparse_keymap_free(wistron_idev->input); | ||
1374 | input_free_polled_device(wistron_idev); | 1284 | input_free_polled_device(wistron_idev); |
1375 | bios_detach(); | 1285 | bios_detach(); |
1376 | 1286 | ||