--- linux-2.6.9/drivers/input/serio/i8042.c.old 2004-11-04 10:28:58.000000000 +0100 +++ linux-2.6.9/drivers/input/serio/i8042.c 2004-11-05 15:16:24.000000000 +0100 @@ -61,6 +61,12 @@ MODULE_PARM_DESC(noacpi, "Do not use ACPI to detect controller settings"); #endif +#ifdef CONFIG_PNP +static int i8042_nopnp; +module_param_named(nopnp, i8042_nopnp, bool, 0); +MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings"); +#endif + #define DEBUG #ifdef DEBUG static int i8042_debug; --- linux-2.6.9/drivers/input/serio/i8042-x86ia64io.h.old 2004-11-04 10:29:11.000000000 +0100 +++ linux-2.6.9/drivers/input/serio/i8042-x86ia64io.h 2004-11-05 15:20:03.000000000 +0100 @@ -88,6 +88,116 @@ }; #endif +#ifdef CONFIG_PNP +#include + +static int i8042_pnp_kbd_registered; +static int i8042_pnp_aux_registered; + + +static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) +{ + if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) + i8042_data_reg = pnp_port_start(dev,0); + else + printk(KERN_WARNING "PNP: [%s] has no data port; default is 0x%x\n", + pnp_dev_name(dev), i8042_data_reg); + + if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) + i8042_command_reg = pnp_port_start(dev,1); + else + printk(KERN_WARNING "PNP: [%s] has no command port; default is 0x%x\n", + pnp_dev_name(dev), i8042_command_reg); + + if (pnp_irq_valid(dev,0)) + i8042_kbd_irq = pnp_irq(dev,0); + else + printk(KERN_WARNING "PNP: [%s] has no IRQ; default is %d\n", + pnp_dev_name(dev), i8042_kbd_irq); + + printk("PNP: %s [%s] at I/O 0x%x, 0x%x, irq %d\n", + "PS/2 Keyboard Controller", pnp_dev_name(dev), + i8042_data_reg, i8042_command_reg, i8042_kbd_irq); + + return 0; +} + +static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did) +{ + if (pnp_irq_valid(dev,0)) + i8042_aux_irq = pnp_irq(dev,0); + else + printk(KERN_WARNING "PNP: [%s] has no IRQ; default is %d\n", + pnp_dev_name(dev), i8042_aux_irq); + + printk("PNP: %s [%s] at irq %d\n", + "PS/2 Mouse Controller", pnp_dev_name(dev), i8042_aux_irq); + + return 0; +} + +static struct pnp_device_id pnp_kbd_devids[] = { + { .id = "PNP0303", .driver_data = 0 }, + { .id = "PNP030b", .driver_data = 0 }, + { .id = "", }, +}; + +static struct pnp_driver i8042_pnp_kbd_driver = { + .name = "i8042 kbd", + .id_table = pnp_kbd_devids, + .probe = i8042_pnp_kbd_probe, +}; + +static struct pnp_device_id pnp_aux_devids[] = { + { .id = "PNP0f13", .driver_data = 0 }, + { .id = "SYN0801", .driver_data = 0 }, + { .id = "", }, +}; + +static struct pnp_driver i8042_pnp_aux_driver = { + .name = "i8042 aux", + .id_table = pnp_aux_devids, + .probe = i8042_pnp_aux_probe, +}; + +static int i8042_pnp_init(void) +{ + int result; + + if (i8042_nopnp) { + printk("i8042: PNP detection disabled\n"); + return 0; + } + + result = pnp_register_driver(&i8042_pnp_kbd_driver); + if (result < 0) + return result; + + if (result == 0) { + pnp_unregister_driver(&i8042_pnp_kbd_driver); + return -ENODEV; + } + i8042_pnp_kbd_registered = 1; + + result = pnp_register_driver(&i8042_pnp_aux_driver); + if (result >= 0) + i8042_pnp_aux_registered = 1; + if (result == 0) + i8042_noaux = 1; + + return 0; +} + +static void i8042_pnp_exit(void) +{ + if (i8042_pnp_kbd_registered) + pnp_unregister_driver(&i8042_pnp_kbd_driver); + + if (i8042_pnp_aux_registered) + pnp_unregister_driver(&i8042_pnp_aux_driver); +} +#endif + #ifdef CONFIG_ACPI #include #include @@ -281,6 +391,11 @@ i8042_kbd_irq = I8042_MAP_IRQ(1); i8042_aux_irq = I8042_MAP_IRQ(12); +#ifdef CONFIG_PNP + if (i8042_pnp_init()) + return -1; +#endif + #ifdef CONFIG_ACPI if (i8042_acpi_init()) return -1; @@ -300,6 +415,9 @@ static inline void i8042_platform_exit(void) { +#ifdef CONFIG_PNP + i8042_pnp_exit(); +#endif #ifdef CONFIG_ACPI i8042_acpi_exit(); #endif