From: Dmitry Torokhov <dtor_core@ameritech.net>

  Input: integrate ct82c710, maceps2, q40kbd and rpckbd with sysfs
         as platform devices so their serio ports have proper parents
  
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/input/serio/ct82c710.c |   50 ++++++++++++++++++---------------
 25-akpm/drivers/input/serio/maceps2.c  |   19 +++++++++---
 25-akpm/drivers/input/serio/q40kbd.c   |   18 +++++++++--
 25-akpm/drivers/input/serio/rpckbd.c   |   20 +++++++++----
 4 files changed, 71 insertions(+), 36 deletions(-)

diff -puN drivers/input/serio/ct82c710.c~input-more-platform-device-conversions drivers/input/serio/ct82c710.c
--- 25/drivers/input/serio/ct82c710.c~input-more-platform-device-conversions	2004-06-27 22:51:06.691177848 -0700
+++ 25-akpm/drivers/input/serio/ct82c710.c	2004-06-27 22:51:06.700176480 -0700
@@ -36,6 +36,7 @@
 #include <linux/interrupt.h>
 #include <linux/serio.h>
 #include <linux/errno.h>
+#include <linux/err.h>
 
 #include <asm/io.h>
 
@@ -58,10 +59,12 @@ MODULE_LICENSE("GPL");
 
 #define CT82C710_IRQ          12
 
-static struct serio *ct82c710_port;
-static int ct82c710_data;
-static int ct82c710_status;
+#define CT82C710_DATA         ct82c710_iores.start
+#define CT82C710_STATUS       (ct82c710_iores.start + 1)
 
+static struct serio *ct82c710_port;
+static struct platform_device *ct82c710_device;
+static struct resource ct82c710_iores;
 
 /*
  * Interrupt handler for the 82C710 mouse port. A character
@@ -70,7 +73,7 @@ static int ct82c710_status;
 
 static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs)
 {
-	return serio_interrupt(ct82c710_port, inb(ct82c710_data), 0, regs);
+	return serio_interrupt(ct82c710_port, inb(CT82C710_DATA), 0, regs);
 }
 
 /*
@@ -81,10 +84,10 @@ static int ct82c170_wait(void)
 {
 	int timeout = 60000;
 
-	while ((inb(ct82c710_status) & (CT82C710_RX_FULL | CT82C710_TX_IDLE | CT82C710_DEV_IDLE))
+	while ((inb(CT82C710_STATUS) & (CT82C710_RX_FULL | CT82C710_TX_IDLE | CT82C710_DEV_IDLE))
 		       != (CT82C710_DEV_IDLE | CT82C710_TX_IDLE) && timeout) {
 
-		if (inb_p(ct82c710_status) & CT82C710_RX_FULL) inb_p(ct82c710_data);
+		if (inb_p(CT82C710_STATUS) & CT82C710_RX_FULL) inb_p(CT82C710_DATA);
 
 		udelay(1);
 		timeout--;
@@ -98,7 +101,7 @@ static void ct82c710_close(struct serio 
 	if (ct82c170_wait())
 		printk(KERN_WARNING "ct82c710.c: Device busy in close()\n");
 
-	outb_p(inb_p(ct82c710_status) & ~(CT82C710_ENABLE | CT82C710_INTS_ON), ct82c710_status);
+	outb_p(inb_p(CT82C710_STATUS) & ~(CT82C710_ENABLE | CT82C710_INTS_ON), CT82C710_STATUS);
 
 	if (ct82c170_wait())
 		printk(KERN_WARNING "ct82c710.c: Device busy in close()\n");
@@ -113,21 +116,21 @@ static int ct82c710_open(struct serio *s
 	if (request_irq(CT82C710_IRQ, ct82c710_interrupt, 0, "ct82c710", NULL))
 		return -1;
 
-	status = inb_p(ct82c710_status);
+	status = inb_p(CT82C710_STATUS);
 
 	status |= (CT82C710_ENABLE | CT82C710_RESET);
-	outb_p(status, ct82c710_status);
+	outb_p(status, CT82C710_STATUS);
 
 	status &= ~(CT82C710_RESET);
-	outb_p(status, ct82c710_status);
+	outb_p(status, CT82C710_STATUS);
 
 	status |= CT82C710_INTS_ON;
-	outb_p(status, ct82c710_status);	/* Enable interrupts */
+	outb_p(status, CT82C710_STATUS);	/* Enable interrupts */
 
 	while (ct82c170_wait()) {
 		printk(KERN_ERR "ct82c710: Device busy in open()\n");
 		status &= ~(CT82C710_ENABLE | CT82C710_INTS_ON);
-		outb_p(status, ct82c710_status);
+		outb_p(status, CT82C710_STATUS);
 		free_irq(CT82C710_IRQ, NULL);
 		return -1;
 	}
@@ -142,7 +145,7 @@ static int ct82c710_open(struct serio *s
 static int ct82c710_write(struct serio *port, unsigned char c)
 {
 	if (ct82c170_wait()) return -1;
-	outb_p(c, ct82c710_data);
+	outb_p(c, CT82C710_DATA);
 	return 0;
 }
 
@@ -162,8 +165,9 @@ static int __init ct82c710_probe(void)
 		return -1;				/* No: no 82C710 here */
 
 	outb_p(0x0d, 0x390);				/* Write index */
-	ct82c710_data = inb_p(0x391) << 2;		/* Get mouse I/O address */
-	ct82c710_status = ct82c710_data + 1;
+	ct82c710_iores.start = inb_p(0x391) << 2;	/* Get mouse I/O address */
+	ct82c710_iores.end = ct82c710_iores.start + 1;
+	ct82c710_iores.flags = IORESOURCE_IO;
 	outb_p(0x0f, 0x390);
 	outb_p(0x0f, 0x391);				/* Close config mode */
 
@@ -181,8 +185,9 @@ static struct serio * __init ct82c710_al
 		serio->open = ct82c710_open;
 		serio->close = ct82c710_close;
 		serio->write = ct82c710_write;
+		serio->dev.parent = &ct82c710_device->dev;
 		strlcpy(serio->name, "C&T 82c710 mouse port", sizeof(serio->name));
-		snprintf(serio->phys, sizeof(serio->phys), "isa%04x/serio0", ct82c710_data);
+		snprintf(serio->phys, sizeof(serio->phys), "isa%04lx/serio0", CT82C710_DATA);
 	}
 
 	return serio;
@@ -193,18 +198,19 @@ int __init ct82c710_init(void)
 	if (ct82c710_probe())
 		return -ENODEV;
 
-	if (request_region(ct82c710_data, 2, "ct82c710"))
-		return -EBUSY;
+	ct82c710_device = platform_device_register_simple("ct82c710", -1, &ct82c710_iores, 1);
+	if (IS_ERR(ct82c710_device))
+		return PTR_ERR(ct82c710_device);
 
 	if (!(ct82c710_port = ct82c710_allocate_port())) {
-		release_region(ct82c710_data, 2);
+		platform_device_unregister(ct82c710_device);
 		return -ENOMEM;
 	}
 
 	serio_register_port(ct82c710_port);
 
-	printk(KERN_INFO "serio: C&T 82c710 mouse port at %#x irq %d\n",
-		ct82c710_data, CT82C710_IRQ);
+	printk(KERN_INFO "serio: C&T 82c710 mouse port at %#lx irq %d\n",
+		CT82C710_DATA, CT82C710_IRQ);
 
 	return 0;
 }
@@ -212,7 +218,7 @@ int __init ct82c710_init(void)
 void __exit ct82c710_exit(void)
 {
 	serio_unregister_port(ct82c710_port);
-	release_region(ct82c710_data, 2);
+	platform_device_unregister(ct82c710_device);
 }
 
 module_init(ct82c710_init);
diff -puN drivers/input/serio/maceps2.c~input-more-platform-device-conversions drivers/input/serio/maceps2.c
--- 25/drivers/input/serio/maceps2.c~input-more-platform-device-conversions	2004-06-27 22:51:06.693177544 -0700
+++ 25-akpm/drivers/input/serio/maceps2.c	2004-06-27 22:51:06.701176328 -0700
@@ -17,6 +17,7 @@
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
+#include <linux/err.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -53,6 +54,7 @@ struct maceps2_data {
 
 static struct maceps2_data port_data[2];
 static struct serio *maceps2_port[2];
+static struct platform_device *maceps2_device;
 
 static int maceps2_write(struct serio *dev, unsigned char val)
 {
@@ -123,13 +125,14 @@ static struct serio * __init maceps2_all
 	serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
 	if (serio) {
 		memset(serio, 0, sizeof(struct serio));
-		serio->type	= SERIO_8042;
-		serio->write	= maceps2_write;
-		serio->open	= maceps2_open;
-		serio->close	= maceps2_close;
+		serio->type		= SERIO_8042;
+		serio->write		= maceps2_write;
+		serio->open		= maceps2_open;
+		serio->close		= maceps2_close;
 		snprintf(serio->name, sizeof(serio->name), "MACE PS/2 port%d", idx);
 		snprintf(serio->phys, sizeof(serio->phys), "mace/serio%d", idx);
-		serio->port_data = &port_data[idx];
+		serio->port_data	= &port_data[idx];
+		serio->dev.parent	= &maceps2_device->dev;
 	}
 
 	return serio;
@@ -138,6 +141,10 @@ static struct serio * __init maceps2_all
 
 static int __init maceps2_init(void)
 {
+	maceps2_device = platform_device_register_simple("maceps2", -1, NULL, 0);
+	if (IS_ERR(maceps2_device))
+		return PTR_ERR(maceps2_device);
+
 	port_data[0].port = &mace->perif.ps2.keyb;
 	port_data[0].irq  = MACEISA_KEYB_IRQ;
 	port_data[1].port = &mace->perif.ps2.mouse;
@@ -148,6 +155,7 @@ static int __init maceps2_init(void)
 	if (!maceps2_port[0] || !maceps2_port[1]) {
 		kfree(maceps2_port[0]);
 		kfree(maceps2_port[1]);
+		platform_device_unregister(maceps2_device);
 		return -ENOMEM;
 	}
 
@@ -161,6 +169,7 @@ static void __exit maceps2_exit(void)
 {
 	serio_unregister_port(maceps2_port[0]);
 	serio_unregister_port(maceps2_port[1]);
+	platform_device_unregister(maceps2_device);
 }
 
 module_init(maceps2_init);
diff -puN drivers/input/serio/q40kbd.c~input-more-platform-device-conversions drivers/input/serio/q40kbd.c
--- 25/drivers/input/serio/q40kbd.c~input-more-platform-device-conversions	2004-06-27 22:51:06.694177392 -0700
+++ 25-akpm/drivers/input/serio/q40kbd.c	2004-06-27 22:51:06.702176176 -0700
@@ -35,6 +35,7 @@
 #include <linux/init.h>
 #include <linux/serio.h>
 #include <linux/interrupt.h>
+#include <linux/err.h>
 
 #include <asm/bitops.h>
 #include <asm/io.h>
@@ -49,6 +50,7 @@ MODULE_LICENSE("GPL");
 
 spinlock_t q40kbd_lock = SPIN_LOCK_UNLOCKED;
 static struct serio *q40kbd_port;
+static struct platform_device *q40kbd_device;
 
 static irqreturn_t q40kbd_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
@@ -120,9 +122,10 @@ static struct serio * __init q40kbd_allo
 	serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
 	if (serio) {
 		memset(serio, 0, sizeof(struct serio));
-		serio->type	= SERIO_8042;
-		serio->open	= q40kbd_open;
-		serio->close	= q40kbd_close;
+		serio->type		= SERIO_8042;
+		serio->open		= q40kbd_open;
+		serio->close		= q40kbd_close;
+		serio->dev.parent	= &q40kbd_device->dev;
 		strlcpy(serio->name, "Q40 Kbd Port", sizeof(serio->name));
 		strlcpy(serio->phys, "Q40", sizeof(serio->phys));
 	}
@@ -135,8 +138,14 @@ static int __init q40kbd_init(void)
 	if (!MACH_IS_Q40)
 		return -EIO;
 
-	if (!(q40kbd_port = q40kbd_allocate_port()))
+	q40kbd_device = platform_device_register_simple("q40kbd", -1, NULL, 0);
+	if (IS_ERR(q40kbd_device))
+		return PTR_ERR(q40kbd_device);
+
+	if (!(q40kbd_port = q40kbd_allocate_port())) {
+		platform_device_unregister(q40kbd_device);
 		return -ENOMEM;
+	}
 
 	serio_register_port(q40kbd_port);
 	printk(KERN_INFO "serio: Q40 kbd registered\n");
@@ -147,6 +156,7 @@ static int __init q40kbd_init(void)
 static void __exit q40kbd_exit(void)
 {
 	serio_unregister_port(q40kbd_port);
+	platform_device_unregister(q40kbd_device);
 }
 
 module_init(q40kbd_init);
diff -puN drivers/input/serio/rpckbd.c~input-more-platform-device-conversions drivers/input/serio/rpckbd.c
--- 25/drivers/input/serio/rpckbd.c~input-more-platform-device-conversions	2004-06-27 22:51:06.696177088 -0700
+++ 25-akpm/drivers/input/serio/rpckbd.c	2004-06-27 22:51:06.702176176 -0700
@@ -33,6 +33,7 @@
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/serio.h>
+#include <linux/err.h>
 
 #include <asm/irq.h>
 #include <asm/hardware.h>
@@ -45,6 +46,7 @@ MODULE_DESCRIPTION("Acorn RiscPC PS/2 ke
 MODULE_LICENSE("GPL");
 
 static struct serio *rpckbd_port;
+static struct platform_device *rpckbd_device;
 
 static int rpckbd_write(struct serio *port, unsigned char val)
 {
@@ -115,10 +117,11 @@ static struct serio * __init rpckbd_allo
 	serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
 	if (serio) {
 		memset(serio, 0, sizeof(struct serio));
-		serio->type	= SERIO_8042;
-		serio->write	= rpckbd_write;
-		serio->open	= rpckbd_open;
-		serio->close	= rpckbd_close;
+		serio->type		= SERIO_8042;
+		serio->write		= rpckbd_write;
+		serio->open		= rpckbd_open;
+		serio->close		= rpckbd_close;
+		serio->dev.parent	= &rpckbd_device->dev;
 		strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
 		strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
 	}
@@ -128,8 +131,14 @@ static struct serio * __init rpckbd_allo
 
 static int __init rpckbd_init(void)
 {
-	if (!(rpckbd_port = rpckbd_allocate_port()))
+	rpckbd_device = platform_device_register_simple("rpckbd", -1, NULL, 0);
+	if (IS_ERR(rpckbd_device))
+		return PTR_ERR(rpckbd_device);
+
+	if (!(rpckbd_port = rpckbd_allocate_port())) {
+		platform_device_unregister(rpckbd_device);
 		return -ENOMEM;
+	}
 
 	serio_register_port(rpckbd_port);
 	return 0;
@@ -138,6 +147,7 @@ static int __init rpckbd_init(void)
 static void __exit rpckbd_exit(void)
 {
 	serio_unregister_port(rpckbd_port);
+	platform_device_unregister(rpckbd_device);
 }
 
 module_init(rpckbd_init);
_