vserver 2.0 rc7
[linux-2.6.git] / drivers / input / keyboard / xtkbd.c
index 4c1c316..19eaec7 100644 (file)
@@ -65,10 +65,10 @@ struct xtkbd {
        char phys[32];
 };
 
-irqreturn_t xtkbd_interrupt(struct serio *serio,
+static irqreturn_t xtkbd_interrupt(struct serio *serio,
        unsigned char data, unsigned int flags, struct pt_regs *regs)
 {
-       struct xtkbd *xtkbd = serio->private;
+       struct xtkbd *xtkbd = serio_get_drvdata(serio);
 
        switch (data) {
                case XTKBD_EMUL0:
@@ -88,16 +88,14 @@ irqreturn_t xtkbd_interrupt(struct serio *serio,
        return IRQ_HANDLED;
 }
 
-void xtkbd_connect(struct serio *serio, struct serio_driver *drv)
+static int xtkbd_connect(struct serio *serio, struct serio_driver *drv)
 {
        struct xtkbd *xtkbd;
        int i;
-
-       if ((serio->type & SERIO_TYPE) != SERIO_XT)
-               return;
+       int err;
 
        if (!(xtkbd = kmalloc(sizeof(struct xtkbd), GFP_KERNEL)))
-               return;
+               return -ENOMEM;
 
        memset(xtkbd, 0, sizeof(struct xtkbd));
 
@@ -111,11 +109,13 @@ void xtkbd_connect(struct serio *serio, struct serio_driver *drv)
        xtkbd->dev.keycodemax = ARRAY_SIZE(xtkbd_keycode);
        xtkbd->dev.private = xtkbd;
 
-       serio->private = xtkbd;
+       serio_set_drvdata(serio, xtkbd);
 
-       if (serio_open(serio, drv)) {
+       err = serio_open(serio, drv);
+       if (err) {
+               serio_set_drvdata(serio, NULL);
                kfree(xtkbd);
-               return;
+               return err;
        }
 
        memcpy(xtkbd->keycode, xtkbd_keycode, sizeof(xtkbd->keycode));
@@ -136,33 +136,50 @@ void xtkbd_connect(struct serio *serio, struct serio_driver *drv)
        input_register_device(&xtkbd->dev);
 
        printk(KERN_INFO "input: %s on %s\n", xtkbd_name, serio->phys);
+
+       return 0;
 }
 
-void xtkbd_disconnect(struct serio *serio)
+static void xtkbd_disconnect(struct serio *serio)
 {
-       struct xtkbd *xtkbd = serio->private;
+       struct xtkbd *xtkbd = serio_get_drvdata(serio);
+
        input_unregister_device(&xtkbd->dev);
        serio_close(serio);
+       serio_set_drvdata(serio, NULL);
        kfree(xtkbd);
 }
 
-struct serio_driver xtkbd_drv = {
+static struct serio_device_id xtkbd_serio_ids[] = {
+       {
+               .type   = SERIO_XT,
+               .proto  = SERIO_ANY,
+               .id     = SERIO_ANY,
+               .extra  = SERIO_ANY,
+       },
+       { 0 }
+};
+
+MODULE_DEVICE_TABLE(serio, xtkbd_serio_ids);
+
+static struct serio_driver xtkbd_drv = {
        .driver         = {
                .name   = "xtkbd",
        },
        .description    = DRIVER_DESC,
+       .id_table       = xtkbd_serio_ids,
        .interrupt      = xtkbd_interrupt,
        .connect        = xtkbd_connect,
        .disconnect     = xtkbd_disconnect,
 };
 
-int __init xtkbd_init(void)
+static int __init xtkbd_init(void)
 {
        serio_register_driver(&xtkbd_drv);
        return 0;
 }
 
-void __exit xtkbd_exit(void)
+static void __exit xtkbd_exit(void)
 {
        serio_unregister_driver(&xtkbd_drv);
 }