diff options
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/serio/i8042-x86ia64io.h | 49 | ||||
-rw-r--r-- | drivers/input/serio/i8042.c | 14 |
2 files changed, 63 insertions, 0 deletions
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index c5e68dcd88ac..4f6384d8e090 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -277,6 +277,50 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
277 | 277 | ||
278 | #endif | 278 | #endif |
279 | 279 | ||
280 | #ifdef CONFIG_X86 | ||
281 | |||
282 | #include <linux/dmi.h> | ||
283 | |||
284 | /* | ||
285 | * Some Wistron based laptops need us to explicitly enable the 'Dritek | ||
286 | * keyboard extension' to make their extra keys start generating scancodes. | ||
287 | * Originally, this was just confined to older laptops, but a few Acer laptops | ||
288 | * have turned up in 2007 that also need this again. | ||
289 | */ | ||
290 | static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { | ||
291 | { | ||
292 | .ident = "Acer Aspire 5630", | ||
293 | .matches = { | ||
294 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
295 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"), | ||
296 | }, | ||
297 | }, | ||
298 | { | ||
299 | .ident = "Acer Aspire 5650", | ||
300 | .matches = { | ||
301 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
302 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"), | ||
303 | }, | ||
304 | }, | ||
305 | { | ||
306 | .ident = "Acer Aspire 5680", | ||
307 | .matches = { | ||
308 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
309 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"), | ||
310 | }, | ||
311 | }, | ||
312 | { | ||
313 | .ident = "Acer TravelMate 2490", | ||
314 | .matches = { | ||
315 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
316 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), | ||
317 | }, | ||
318 | }, | ||
319 | { } | ||
320 | }; | ||
321 | |||
322 | #endif /* CONFIG_X86 */ | ||
323 | |||
280 | 324 | ||
281 | #ifdef CONFIG_PNP | 325 | #ifdef CONFIG_PNP |
282 | #include <linux/pnp.h> | 326 | #include <linux/pnp.h> |
@@ -520,6 +564,11 @@ static int __init i8042_platform_init(void) | |||
520 | i8042_nomux = 1; | 564 | i8042_nomux = 1; |
521 | #endif | 565 | #endif |
522 | 566 | ||
567 | #ifdef CONFIG_X86 | ||
568 | if (dmi_check_system(i8042_dmi_dritek_table)) | ||
569 | i8042_dritek = 1; | ||
570 | #endif /* CONFIG_X86 */ | ||
571 | |||
523 | return retval; | 572 | return retval; |
524 | } | 573 | } |
525 | 574 | ||
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index cbe83bf294c9..1f73cf72a7c5 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -63,6 +63,12 @@ static unsigned int i8042_blink_frequency = 500; | |||
63 | module_param_named(panicblink, i8042_blink_frequency, uint, 0600); | 63 | module_param_named(panicblink, i8042_blink_frequency, uint, 0600); |
64 | MODULE_PARM_DESC(panicblink, "Frequency with which keyboard LEDs should blink when kernel panics"); | 64 | MODULE_PARM_DESC(panicblink, "Frequency with which keyboard LEDs should blink when kernel panics"); |
65 | 65 | ||
66 | #ifdef CONFIG_X86 | ||
67 | static unsigned int i8042_dritek; | ||
68 | module_param_named(dritek, i8042_dritek, bool, 0); | ||
69 | MODULE_PARM_DESC(dritek, "Force enable the Dritek keyboard extension"); | ||
70 | #endif | ||
71 | |||
66 | #ifdef CONFIG_PNP | 72 | #ifdef CONFIG_PNP |
67 | static int i8042_nopnp; | 73 | static int i8042_nopnp; |
68 | module_param_named(nopnp, i8042_nopnp, bool, 0); | 74 | module_param_named(nopnp, i8042_nopnp, bool, 0); |
@@ -1145,6 +1151,7 @@ static int __devinit i8042_setup_kbd(void) | |||
1145 | static int __devinit i8042_probe(struct platform_device *dev) | 1151 | static int __devinit i8042_probe(struct platform_device *dev) |
1146 | { | 1152 | { |
1147 | int error; | 1153 | int error; |
1154 | char param; | ||
1148 | 1155 | ||
1149 | error = i8042_controller_selftest(); | 1156 | error = i8042_controller_selftest(); |
1150 | if (error) | 1157 | if (error) |
@@ -1166,6 +1173,13 @@ static int __devinit i8042_probe(struct platform_device *dev) | |||
1166 | goto out_fail; | 1173 | goto out_fail; |
1167 | } | 1174 | } |
1168 | 1175 | ||
1176 | if (i8042_dritek) { | ||
1177 | param = 0x90; | ||
1178 | error = i8042_command(¶m, 0x1059); | ||
1179 | if (error) | ||
1180 | goto out_fail; | ||
1181 | } | ||
1182 | |||
1169 | /* | 1183 | /* |
1170 | * Ok, everything is ready, let's register all serio ports | 1184 | * Ok, everything is ready, let's register all serio ports |
1171 | */ | 1185 | */ |