#include <linux/poll.h>
#include <linux/list.h>
#include <linux/spinlock.h>
+#include <linux/mutex.h>
#include <asm/uaccess.h>
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[] = {
{
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;
unsigned int cmd, unsigned long arg)
{
struct retu_tahvo_write_parms par;
+ int ret;
switch (cmd) {
case URT_IOCT_IRQ_SUBSCR:
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);
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;
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);