fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / input / serio / rpckbd.c
index b25d2e3..49f8431 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/init.h>
 #include <linux/serio.h>
 #include <linux/err.h>
+#include <linux/platform_device.h>
 
 #include <asm/irq.h>
 #include <asm/hardware.h>
@@ -45,9 +46,6 @@ MODULE_AUTHOR("Vojtech Pavlik, Russell King");
 MODULE_DESCRIPTION("Acorn RiscPC PS/2 keyboard controller driver");
 MODULE_LICENSE("GPL");
 
-static struct serio *rpckbd_port;
-static struct platform_device *rpckbd_device;
-
 static int rpckbd_write(struct serio *port, unsigned char val)
 {
        while (!(iomd_readb(IOMD_KCTRL) & (1 << 7)))
@@ -58,7 +56,7 @@ static int rpckbd_write(struct serio *port, unsigned char val)
        return 0;
 }
 
-static irqreturn_t rpckbd_rx(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t rpckbd_rx(int irq, void *dev_id)
 {
        struct serio *port = dev_id;
        unsigned int byte;
@@ -67,13 +65,13 @@ static irqreturn_t rpckbd_rx(int irq, void *dev_id, struct pt_regs *regs)
        while (iomd_readb(IOMD_KCTRL) & (1 << 5)) {
                byte = iomd_readb(IOMD_KARTRX);
 
-               serio_interrupt(port, byte, 0, regs);
+               serio_interrupt(port, byte, 0);
                handled = IRQ_HANDLED;
        }
        return handled;
 }
 
-static irqreturn_t rpckbd_tx(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t rpckbd_tx(int irq, void *dev_id)
 {
        return IRQ_HANDLED;
 }
@@ -109,45 +107,50 @@ static void rpckbd_close(struct serio *port)
  * Allocate and initialize serio structure for subsequent registration
  * with serio core.
  */
-
-static struct serio * __init rpckbd_allocate_port(void)
+static int __devinit rpckbd_probe(struct platform_device *dev)
 {
        struct serio *serio;
 
-       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->dev.parent       = &rpckbd_device->dev;
-               strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
-               strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
-       }
+       serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
+       if (!serio)
+               return -ENOMEM;
 
-       return serio;
+       serio->id.type          = SERIO_8042;
+       serio->write            = rpckbd_write;
+       serio->open             = rpckbd_open;
+       serio->close            = rpckbd_close;
+       serio->dev.parent       = &dev->dev;
+       strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name));
+       strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys));
+
+       platform_set_drvdata(dev, serio);
+       serio_register_port(serio);
+       return 0;
 }
 
-static int __init rpckbd_init(void)
+static int __devexit rpckbd_remove(struct platform_device *dev)
 {
-       rpckbd_device = platform_device_register_simple("rpckbd", -1, NULL, 0);
-       if (IS_ERR(rpckbd_device))
-               return PTR_ERR(rpckbd_device);
+       struct serio *serio = platform_get_drvdata(dev);
+       serio_unregister_port(serio);
+       return 0;
+}
 
-       if (!(rpckbd_port = rpckbd_allocate_port())) {
-               platform_device_unregister(rpckbd_device);
-               return -ENOMEM;
-       }
+static struct platform_driver rpckbd_driver = {
+       .probe          = rpckbd_probe,
+       .remove         = __devexit_p(rpckbd_remove),
+       .driver         = {
+               .name   = "kart",
+       },
+};
 
-       serio_register_port(rpckbd_port);
-       return 0;
+static int __init rpckbd_init(void)
+{
+       return platform_driver_register(&rpckbd_driver);
 }
 
 static void __exit rpckbd_exit(void)
 {
-       serio_unregister_port(rpckbd_port);
-       platform_device_unregister(rpckbd_device);
+       platform_driver_unregister(&rpckbd_driver);
 }
 
 module_init(rpckbd_init);