X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Finput%2Fserio%2Fserio_raw.c;h=088ebc348ba31da45ddefa6b10a51aabf168185f;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=f424fdf19e7d604a90cc6e096eadd3c8610ea8ab;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index f424fdf19..088ebc348 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c @@ -16,9 +16,9 @@ #include #include #include -#include #include #include +#include #define DRIVER_DESC "Raw serio driver" @@ -46,7 +46,7 @@ struct serio_raw_list { struct list_head node; }; -static DECLARE_MUTEX(serio_raw_sem); +static DEFINE_MUTEX(serio_raw_mutex); static LIST_HEAD(serio_raw_list); static unsigned int serio_raw_no; @@ -81,7 +81,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) struct serio_raw_list *list; int retval = 0; - retval = down_interruptible(&serio_raw_sem); + retval = mutex_lock_interruptible(&serio_raw_mutex); if (retval) return retval; @@ -95,12 +95,11 @@ static int serio_raw_open(struct inode *inode, struct file *file) goto out; } - if (!(list = kmalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) { + if (!(list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) { retval = -ENOMEM; goto out; } - memset(list, 0, sizeof(struct serio_raw_list)); list->serio_raw = serio_raw; file->private_data = list; @@ -108,7 +107,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) list_add_tail(&list->node, &serio_raw->list); out: - up(&serio_raw_sem); + mutex_unlock(&serio_raw_mutex); return retval; } @@ -130,12 +129,12 @@ static int serio_raw_release(struct inode *inode, struct file *file) struct serio_raw_list *list = file->private_data; struct serio_raw *serio_raw = list->serio_raw; - down(&serio_raw_sem); + mutex_lock(&serio_raw_mutex); serio_raw_fasync(-1, file, 0); serio_raw_cleanup(serio_raw); - up(&serio_raw_sem); + mutex_unlock(&serio_raw_mutex); return 0; } @@ -194,7 +193,7 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, siz int retval; unsigned char c; - retval = down_interruptible(&serio_raw_sem); + retval = mutex_lock_interruptible(&serio_raw_mutex); if (retval) return retval; @@ -219,7 +218,7 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, siz }; out: - up(&serio_raw_sem); + mutex_unlock(&serio_raw_mutex); return written; } @@ -235,7 +234,7 @@ static unsigned int serio_raw_poll(struct file *file, poll_table *wait) return 0; } -struct file_operations serio_raw_fops = { +static struct file_operations serio_raw_fops = { .owner = THIS_MODULE, .open = serio_raw_open, .release = serio_raw_release, @@ -251,9 +250,9 @@ struct file_operations serio_raw_fops = { *********************************************************************/ static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data, - unsigned int dfl, struct pt_regs *regs) + unsigned int dfl) { - struct serio_raw *serio_raw = serio->private; + struct serio_raw *serio_raw = serio_get_drvdata(serio); struct serio_raw_list *list; unsigned int head = serio_raw->head; @@ -270,36 +269,35 @@ static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data, return IRQ_HANDLED; } -static void serio_raw_connect(struct serio *serio, struct serio_driver *drv) +static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) { struct serio_raw *serio_raw; int err; - if ((serio->type & SERIO_TYPE) != SERIO_8042) - return; - - if (!(serio_raw = kmalloc(sizeof(struct serio_raw), GFP_KERNEL))) { + if (!(serio_raw = kzalloc(sizeof(struct serio_raw), GFP_KERNEL))) { printk(KERN_ERR "serio_raw.c: can't allocate memory for a device\n"); - return; + return -ENOMEM; } - down(&serio_raw_sem); + mutex_lock(&serio_raw_mutex); - memset(serio_raw, 0, sizeof(struct serio_raw)); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); serio_raw->refcnt = 1; serio_raw->serio = serio; INIT_LIST_HEAD(&serio_raw->list); init_waitqueue_head(&serio_raw->wait); - serio->private = serio_raw; - if (serio_open(serio, drv)) + serio_set_drvdata(serio, serio_raw); + + err = serio_open(serio, drv); + if (err) goto out_free; list_add_tail(&serio_raw->node, &serio_raw_list); serio_raw->dev.minor = PSMOUSE_MINOR; serio_raw->dev.name = serio_raw->name; + serio_raw->dev.parent = &serio->dev; serio_raw->dev.fops = &serio_raw_fops; err = misc_register(&serio_raw->dev); @@ -322,15 +320,16 @@ out_close: serio_close(serio); list_del_init(&serio_raw->node); out_free: - serio->private = NULL; + serio_set_drvdata(serio, NULL); kfree(serio_raw); out: - up(&serio_raw_sem); + mutex_unlock(&serio_raw_mutex); + return err; } static int serio_raw_reconnect(struct serio *serio) { - struct serio_raw *serio_raw = serio->private; + struct serio_raw *serio_raw = serio_get_drvdata(serio); struct serio_driver *drv = serio->drv; if (!drv || !serio_raw) { @@ -349,25 +348,38 @@ static void serio_raw_disconnect(struct serio *serio) { struct serio_raw *serio_raw; - down(&serio_raw_sem); + mutex_lock(&serio_raw_mutex); - serio_raw = serio->private; + serio_raw = serio_get_drvdata(serio); serio_close(serio); - serio->private = NULL; + serio_set_drvdata(serio, NULL); serio_raw->serio = NULL; if (!serio_raw_cleanup(serio_raw)) wake_up_interruptible(&serio_raw->wait); - up(&serio_raw_sem); + mutex_unlock(&serio_raw_mutex); } +static struct serio_device_id serio_raw_serio_ids[] = { + { + .type = SERIO_8042, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, serio_raw_serio_ids); + static struct serio_driver serio_raw_drv = { .driver = { .name = "serio_raw", }, .description = DRIVER_DESC, + .id_table = serio_raw_serio_ids, .interrupt = serio_raw_interrupt, .connect = serio_raw_connect, .reconnect = serio_raw_reconnect, @@ -375,13 +387,12 @@ static struct serio_driver serio_raw_drv = { .manual_bind = 1, }; -int __init serio_raw_init(void) +static int __init serio_raw_init(void) { - serio_register_driver(&serio_raw_drv); - return 0; + return serio_register_driver(&serio_raw_drv); } -void __exit serio_raw_exit(void) +static void __exit serio_raw_exit(void) { serio_unregister_driver(&serio_raw_drv); }