fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / input / serio / rpckbd.c
index a2e4be7..49f8431 100644 (file)
@@ -33,6 +33,8 @@
 #include <linux/interrupt.h>
 #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>
@@ -54,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;
@@ -63,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;
 }
@@ -101,25 +103,54 @@ static void rpckbd_close(struct serio *port)
        free_irq(IRQ_KEYBOARDTX, port);
 }
 
-static struct serio rpckbd_port =
+/*
+ * Allocate and initialize serio structure for subsequent registration
+ * with serio core.
+ */
+static int __devinit rpckbd_probe(struct platform_device *dev)
+{
+       struct serio *serio;
+
+       serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
+       if (!serio)
+               return -ENOMEM;
+
+       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 __devexit rpckbd_remove(struct platform_device *dev)
 {
-       .type   = SERIO_8042,
-       .open   = rpckbd_open,
-       .close  = rpckbd_close,
-       .write  = rpckbd_write,
-       .name   = "RiscPC PS/2 kbd port",
-       .phys   = "rpckbd/serio0",
+       struct serio *serio = platform_get_drvdata(dev);
+       serio_unregister_port(serio);
+       return 0;
+}
+
+static struct platform_driver rpckbd_driver = {
+       .probe          = rpckbd_probe,
+       .remove         = __devexit_p(rpckbd_remove),
+       .driver         = {
+               .name   = "kart",
+       },
 };
 
 static int __init rpckbd_init(void)
 {
-       serio_register_port(&rpckbd_port);
-       return 0;
+       return platform_driver_register(&rpckbd_driver);
 }
 
 static void __exit rpckbd_exit(void)
 {
-       serio_unregister_port(&rpckbd_port);
+       platform_driver_unregister(&rpckbd_driver);
 }
 
 module_init(rpckbd_init);