linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / input / serio / serio_raw.c
index 71a8eea..47e08de 100644 (file)
@@ -16,9 +16,9 @@
 #include <linux/init.h>
 #include <linux/major.h>
 #include <linux/device.h>
+#include <linux/devfs_fs_kernel.h>
 #include <linux/miscdevice.h>
 #include <linux/wait.h>
-#include <linux/mutex.h>
 
 #define DRIVER_DESC    "Raw serio driver"
 
@@ -46,7 +46,7 @@ struct serio_raw_list {
        struct list_head node;
 };
 
-static DEFINE_MUTEX(serio_raw_mutex);
+static DECLARE_MUTEX(serio_raw_sem);
 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 = mutex_lock_interruptible(&serio_raw_mutex);
+       retval = down_interruptible(&serio_raw_sem);
        if (retval)
                return retval;
 
@@ -95,11 +95,12 @@ static int serio_raw_open(struct inode *inode, struct file *file)
                goto out;
        }
 
-       if (!(list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) {
+       if (!(list = kmalloc(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;
 
@@ -107,7 +108,7 @@ static int serio_raw_open(struct inode *inode, struct file *file)
        list_add_tail(&list->node, &serio_raw->list);
 
 out:
-       mutex_unlock(&serio_raw_mutex);
+       up(&serio_raw_sem);
        return retval;
 }
 
@@ -129,12 +130,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;
 
-       mutex_lock(&serio_raw_mutex);
+       down(&serio_raw_sem);
 
        serio_raw_fasync(-1, file, 0);
        serio_raw_cleanup(serio_raw);
 
-       mutex_unlock(&serio_raw_mutex);
+       up(&serio_raw_sem);
        return 0;
 }
 
@@ -193,7 +194,7 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, siz
        int retval;
        unsigned char c;
 
-       retval = mutex_lock_interruptible(&serio_raw_mutex);
+       retval = down_interruptible(&serio_raw_sem);
        if (retval)
                return retval;
 
@@ -218,7 +219,7 @@ static ssize_t serio_raw_write(struct file *file, const char __user *buffer, siz
        };
 
 out:
-       mutex_unlock(&serio_raw_mutex);
+       up(&serio_raw_sem);
        return written;
 }
 
@@ -274,13 +275,14 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv)
        struct serio_raw *serio_raw;
        int err;
 
-       if (!(serio_raw = kzalloc(sizeof(struct serio_raw), GFP_KERNEL))) {
+       if (!(serio_raw = kmalloc(sizeof(struct serio_raw), GFP_KERNEL))) {
                printk(KERN_ERR "serio_raw.c: can't allocate memory for a device\n");
                return -ENOMEM;
        }
 
-       mutex_lock(&serio_raw_mutex);
+       down(&serio_raw_sem);
 
+       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;
@@ -323,7 +325,7 @@ out_free:
        serio_set_drvdata(serio, NULL);
        kfree(serio_raw);
 out:
-       mutex_unlock(&serio_raw_mutex);
+       up(&serio_raw_sem);
        return err;
 }
 
@@ -348,7 +350,7 @@ static void serio_raw_disconnect(struct serio *serio)
 {
        struct serio_raw *serio_raw;
 
-       mutex_lock(&serio_raw_mutex);
+       down(&serio_raw_sem);
 
        serio_raw = serio_get_drvdata(serio);
 
@@ -359,7 +361,7 @@ static void serio_raw_disconnect(struct serio *serio)
        if (!serio_raw_cleanup(serio_raw))
                wake_up_interruptible(&serio_raw->wait);
 
-       mutex_unlock(&serio_raw_mutex);
+       up(&serio_raw_sem);
 }
 
 static struct serio_device_id serio_raw_serio_ids[] = {