public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] PNP support for i8042 driver
@ 2004-11-13 13:23 matthieu castet
  2004-11-14  6:48 ` Dmitry Torokhov
  2004-11-17 10:07 ` Vojtech Pavlik
  0 siblings, 2 replies; 20+ messages in thread
From: matthieu castet @ 2004-11-13 13:23 UTC (permalink / raw)
  To: linux-kernel; +Cc: Adam Belay, bjorn.helgaas, vojtech

[-- Attachment #1: Type: text/plain, Size: 319 bytes --]

Hi,
this patch add PNP support for the i8042 driver in 2.6.10-rc1-mm5. Acpi 
is try before the pnp driver so if you don't disable ACPI or apply 
others pnpacpi patches, it won't change anything.

Please review it and apply if possible

thanks,

Matthieu CASTET

Signed-Off-By: Matthieu Castet <castet.matthieu@free.fr>

[-- Attachment #2: i8042_pnp_acpi2.patch --]
[-- Type: text/x-patch, Size: 4090 bytes --]

--- linux-2.6.9/drivers/input/serio/i8042.c.old	2004-11-12 23:00:09.000000000 +0100
+++ linux-2.6.9/drivers/input/serio/i8042.c	2004-11-12 23:00:39.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-12 23:00:02.000000000 +0100
+++ linux-2.6.9/drivers/input/serio/i8042-x86ia64io.h	2004-11-13 12:42:09.000000000 +0100
@@ -88,6 +88,116 @@
 };
 #endif
 
+#ifdef CONFIG_PNP
+#include <linux/pnp.h>
+
+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 <linux/acpi.h>
 #include <acpi/acpi_bus.h>
@@ -286,10 +396,17 @@
 	i8042_aux_irq = I8042_MAP_IRQ(12);
 
 #ifdef CONFIG_ACPI
-	if (i8042_acpi_init() < 0)
+	if (i8042_acpi_init() < 0) /*ACPI don't detecte Kdb*/
+#endif
+#ifdef CONFIG_PNP
+		if (i8042_pnp_init())
+			return -1;
+#else
+#ifdef CONFIG_ACPI
 		return -1;
 #endif
-
+#endif
+	
 #if defined(__ia64__)
         i8042_reset = 1;
 #endif
@@ -304,6 +421,9 @@
 
 static inline void i8042_platform_exit(void)
 {
+#ifdef CONFIG_PNP
+	i8042_pnp_exit();
+#endif
 }
 
 #endif /* _I8042_X86IA64IO_H */

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2005-02-05 18:52 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-13 13:23 [PATCH] PNP support for i8042 driver matthieu castet
2004-11-14  6:48 ` Dmitry Torokhov
2004-11-14 12:22   ` matthieu castet
2004-11-15 14:41     ` Dmitry Torokhov
2004-11-15 19:51       ` matthieu castet
2004-11-15 20:28         ` Dmitry Torokhov
2004-11-15 22:52           ` matthieu castet
2004-11-15 23:09             ` matthieu castet
2004-11-16  5:52             ` Adam Belay
2004-11-16  6:27             ` Dmitry Torokhov
2004-11-16  5:37   ` Adam Belay
2004-11-16  5:44     ` Greg KH
2004-11-16  6:06     ` Dmitry Torokhov
2004-11-16  6:24       ` Adam Belay
2004-11-17 10:07 ` Vojtech Pavlik
2005-02-04 17:37   ` matthieu castet
2005-02-04 18:28     ` Vojtech Pavlik
2005-02-04 22:54       ` matthieu castet
2005-02-05 13:48       ` matthieu castet
2005-02-05 18:51         ` Dmitry Torokhov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox