]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/cbus/retu-user.c
Merge current mainline tree into linux-omap tree
[linux-2.6-omap-h63xx.git] / drivers / cbus / retu-user.c
index 69d1be966de80f5c32a062b38e1ac1c878875e12..74a7d612e7ec677c9432fe1d1cf31a395ec9ef02 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/poll.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
+#include <linux/mutex.h>
 
 #include <asm/uaccess.h>
 
@@ -64,7 +65,7 @@ static LIST_HEAD(retu_irqs_reserve);
 DECLARE_WAIT_QUEUE_HEAD(retu_user_waitqueue);
 
 /* Semaphore to protect irq subscription sequence */
-static struct semaphore retu_sem;
+static struct mutex retu_mutex;
 
 /* This array specifies RETU register types (read/write/toggle) */
 static const u8 retu_access_bits[] = {
@@ -135,14 +136,14 @@ static int retu_user_subscribe_to_irq(int id, struct file *filp)
 {
        int ret;
 
-       down(&retu_sem);
+       mutex_lock(&retu_mutex);
        if ((retu_irq_subscr != NULL) && (retu_irq_subscr != filp)) {
-               up(&retu_sem);
+               mutex_unlock(&retu_mutex);
                return -EBUSY;
        }
        /* Store the file pointer of the first user process registering IRQs */
        retu_irq_subscr = filp;
-       up(&retu_sem);
+       mutex_unlock(&retu_mutex);
 
        if (retu_irq_bits & (1 << id))
                return 0;
@@ -271,6 +272,7 @@ static int retu_ioctl(struct inode *inode, struct file *filp,
                      unsigned int cmd, unsigned long arg)
 {
        struct retu_tahvo_write_parms par;
+       int ret;
 
        switch (cmd) {
        case URT_IOCT_IRQ_SUBSCR:
@@ -278,9 +280,13 @@ static int retu_ioctl(struct inode *inode, struct file *filp,
        case RETU_IOCH_READ:
                return retu_user_read_with_mask(arg);
        case RETU_IOCX_WRITE:
-               copy_from_user(&par, (void __user *) arg, sizeof(par));
+               ret = copy_from_user(&par, (void __user *) arg, sizeof(par));
+               if (ret)
+                       printk(KERN_ERR "copy_from_user failed: %d\n", ret);
                par.result = retu_user_write_with_mask(par.field, par.value);
-               copy_to_user((void __user *) arg, &par, sizeof(par));
+               ret = copy_to_user((void __user *) arg, &par, sizeof(par));
+               if (ret)
+                       printk(KERN_ERR "copy_to_user failed: %d\n", ret);
                break;
        case RETU_IOCH_ADC_READ:
                return retu_read_adc(arg);
@@ -325,8 +331,10 @@ static ssize_t retu_read(struct file *filp, char *buf, size_t count,
                list_move(&irq->node, &retu_irqs_reserve);
                spin_unlock_irqrestore(&retu_irqs_lock, flags);
 
-               copy_to_user(buf + i * sizeof(irq_id), &irq_id, sizeof(irq_id));
-
+               ret = copy_to_user(buf + i * sizeof(irq_id), &irq_id,
+                                  sizeof(irq_id));
+               if (ret)
+                       printk(KERN_ERR "copy_to_user failed: %d\n", ret);
        }
 
        return count;
@@ -384,7 +392,7 @@ int retu_user_init(void)
        retu_irq_block = irq;
 
        spin_lock_init(&retu_irqs_lock);
-       sema_init(&retu_sem, 1);
+       mutex_init(&retu_mutex);
 
        /* Request a misc device */
        res = misc_register(&retu_device);