Index: drivers/input/serio/i8042-x86ia64io.h =================================================================== RCS file: /home/mat/dev/linux-cvs-rep/linux-cvs/drivers/input/serio/i8042-x86ia64io.h,v retrieving revision 1.2 diff -u -u -r1.2 i8042-x86ia64io.h --- drivers/input/serio/i8042-x86ia64io.h 4 Jan 2005 08:06:19 -0000 1.2 +++ drivers/input/serio/i8042-x86ia64io.h 4 Feb 2005 22:50:02 -0000 @@ -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 @@ -282,8 +392,13 @@ i8042_aux_irq = I8042_MAP_IRQ(12); #ifdef CONFIG_ACPI - if (i8042_acpi_init()) - return -1; + if (i8042_acpi_init() < 0) /*ACPI don't detecte Kdb*/ +#endif +#ifdef CONFIG_PNP + if (i8042_pnp_init()) +#endif +#if defined(CONFIG_ACPI) || defined(CONFIG_PNP) + return -1; #endif #if defined(__ia64__) @@ -303,6 +418,9 @@ #ifdef CONFIG_ACPI i8042_acpi_exit(); #endif +#ifdef CONFIG_PNP + i8042_pnp_exit(); +#endif } #endif /* _I8042_X86IA64IO_H */ Index: drivers/input/serio/i8042.c =================================================================== RCS file: /home/mat/dev/linux-cvs-rep/linux-cvs/drivers/input/serio/i8042.c,v retrieving revision 1.45 diff -u -u -r1.45 i8042.c --- drivers/input/serio/i8042.c 3 Feb 2005 00:21:36 -0000 1.45 +++ drivers/input/serio/i8042.c 4 Feb 2005 22:45:07 -0000 @@ -60,6 +60,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;