X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Finput%2Fkeyboard%2Fxtkbd.c;h=19eaec7789d1d00f7957d807fc944cb7cdae70d9;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=4c1c31642ef4657c427754d4be1e9bec219abb95;hpb=e3f6fb6212a7102bdb56ba38fa1e98fe72950475;p=linux-2.6.git diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c index 4c1c31642..19eaec778 100644 --- a/drivers/input/keyboard/xtkbd.c +++ b/drivers/input/keyboard/xtkbd.c @@ -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); }