aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/serio/i8042-x86ia64io.h49
-rw-r--r--drivers/input/serio/i8042.c14
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 */
290static 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;
63module_param_named(panicblink, i8042_blink_frequency, uint, 0600); 63module_param_named(panicblink, i8042_blink_frequency, uint, 0600);
64MODULE_PARM_DESC(panicblink, "Frequency with which keyboard LEDs should blink when kernel panics"); 64MODULE_PARM_DESC(panicblink, "Frequency with which keyboard LEDs should blink when kernel panics");
65 65
66#ifdef CONFIG_X86
67static unsigned int i8042_dritek;
68module_param_named(dritek, i8042_dritek, bool, 0);
69MODULE_PARM_DESC(dritek, "Force enable the Dritek keyboard extension");
70#endif
71
66#ifdef CONFIG_PNP 72#ifdef CONFIG_PNP
67static int i8042_nopnp; 73static int i8042_nopnp;
68module_param_named(nopnp, i8042_nopnp, bool, 0); 74module_param_named(nopnp, i8042_nopnp, bool, 0);
@@ -1145,6 +1151,7 @@ static int __devinit i8042_setup_kbd(void)
1145static int __devinit i8042_probe(struct platform_device *dev) 1151static 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(&param, 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 */