|
@@ -23,7 +23,7 @@
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/spinlock.h>
|
|
|
-#include <linux/smp_lock.h>
|
|
|
+#include <linux/mutex.h>
|
|
|
|
|
|
#include <asm/etraxgpio.h>
|
|
|
#include <hwregs/reg_map.h>
|
|
@@ -66,6 +66,7 @@ static int dp_cnt;
|
|
|
#define DP(x)
|
|
|
#endif
|
|
|
|
|
|
+static DEFINE_MUTEX(gpio_mutex);
|
|
|
static char gpio_name[] = "etrax gpio";
|
|
|
|
|
|
#ifdef CONFIG_ETRAX_VIRTUAL_GPIO
|
|
@@ -391,7 +392,7 @@ static int gpio_open(struct inode *inode, struct file *filp)
|
|
|
if (!priv)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- lock_kernel();
|
|
|
+ mutex_lock(&gpio_mutex);
|
|
|
memset(priv, 0, sizeof(*priv));
|
|
|
|
|
|
priv->minor = p;
|
|
@@ -414,7 +415,7 @@ static int gpio_open(struct inode *inode, struct file *filp)
|
|
|
spin_unlock_irq(&gpio_lock);
|
|
|
}
|
|
|
|
|
|
- unlock_kernel();
|
|
|
+ mutex_unlock(&gpio_mutex);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -667,9 +668,9 @@ static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
long ret;
|
|
|
|
|
|
- lock_kernel();
|
|
|
+ mutex_lock(&gpio_mutex);
|
|
|
ret = gpio_ioctl_unlocked(file, cmd, arg);
|
|
|
- unlock_kernel();
|
|
|
+ mutex_unlock(&gpio_mutex);
|
|
|
|
|
|
return ret;
|
|
|
}
|