diff -ur linux-2.6.1-vanilla/drivers/input/serio/serio.c linux/drivers/input/serio/serio.c
--- linux-2.6.1-vanilla/drivers/input/serio/serio.c	2004-01-09 04:59:05.000000000 -0200
+++ linux/drivers/input/serio/serio.c	2004-01-29 17:22:28.000000000 -0200
@@ -102,6 +102,59 @@
 			event->serio = NULL;
 }
 
+#ifdef CONFIG_HOTPLUG
+unsigned int serio_hotplug_seq;		/* sequence number for hotplug */
+void serio_hotplug(struct serio *serio, char *verb)
+{
+	int		i = 0;
+	char		*argv[3],
+			*envp[6],
+			*buff;
+
+	if (!hotplug_path[0]) {
+		printk(KERN_ERR "serio.c: calling hotplug without a hotplug agent defined\n");
+		return;
+	}
+	if (in_interrupt()) {
+		printk(KERN_ERR "serio.c: calling hotplug from interrupt\n");
+		return; 
+	}
+	if (!current->fs->root) {
+		printk(KERN_WARNING "serio.c: calling hotplug without valid filesystem\n");
+		return; 
+	}
+	if (!(buff = kmalloc(1024, GFP_KERNEL))) {
+		printk(KERN_ERR "serio.c: not enough memory allocating hotplug environment\n");
+		return;
+	}
+
+	argv[0] = hotplug_path;
+	argv[1] = "serio";
+	argv[2] = 0;
+
+	envp[i++] = "HOME=/";
+	envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
+
+	envp[i++] = buff;
+	buff += sprintf(buff, "ACTION=%s", verb) + 1;
+
+	envp[i++] = buff;
+	buff += sprintf(buff, "SEQNUM=%i", ++serio_hotplug_seq) + 1;
+
+	envp[i++] = buff;
+	buff += sprintf(buff, "TYPE=%lx", serio->type) + 1;
+
+	envp[i++] = 0;
+
+	call_usermodehelper(argv[0], argv, envp, 0);
+
+	buff = envp[2];
+	kfree(buff);
+}
+#else	/* CONFIG_HOTPLUG */
+inline void serio_hotplug(struct serio *serio) { }
+#endif	/* CONFIG_HOTPLUG */
+
 void serio_handle_events(void)
 {
 	struct list_head *node, *next;
@@ -227,6 +280,7 @@
 void __serio_register_port(struct serio *serio)
 {
 	list_add_tail(&serio->node, &serio_list);
+	serio_hotplug(serio, "add");
 	serio_find_dev(serio);
 }
 
@@ -255,6 +309,7 @@
 void __serio_unregister_port(struct serio *serio)
 {
 	serio_invalidate_pending_events(serio);
+	serio_hotplug(serio, "remove");
 	list_del_init(&serio->node);
 	if (serio->dev && serio->dev->disconnect)
 		serio->dev->disconnect(serio);
diff -ur linux-2.6.1-vanilla/include/linux/serio.h linux/include/linux/serio.h
--- linux-2.6.1-vanilla/include/linux/serio.h	2004-01-09 04:59:44.000000000 -0200
+++ linux/include/linux/serio.h	2004-01-30 12:11:33.000000000 -0200
@@ -41,6 +41,10 @@
 	struct list_head node;
 };
 
+struct serio_device_id {
+	unsigned long type;
+};
+
 struct serio_dev {
 	void *private;
 	char *name;
@@ -53,6 +57,7 @@
 	void (*disconnect)(struct serio *);
 	void (*cleanup)(struct serio *);
 
+	const struct serio_device_id *id_table;
 	struct list_head node;
 };
 
@@ -62,6 +67,7 @@
 void serio_reconnect(struct serio *serio);
 irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs);
 
+void serio_hotplug(struct serio *serio, char *verb);
 void serio_register_port(struct serio *serio);
 void serio_register_port_delayed(struct serio *serio);
 void __serio_register_port(struct serio *serio);
