]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/char/ppdev.c
Merge branch 'master' into csb1725
[mv-sheeva.git] / drivers / char / ppdev.c
index 02abfddce45a192ceccae3d71f3008ba7d329767..f176dbaeb15adfaaceda46ad6bd97e030065ccd8 100644 (file)
@@ -67,7 +67,7 @@
 #include <linux/slab.h>
 #include <linux/major.h>
 #include <linux/ppdev.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/uaccess.h>
 
 #define PP_VERSION "ppdev: user-space parallel port driver"
@@ -97,6 +97,7 @@ struct pp_struct {
 /* ROUND_UP macro from fs/select.c */
 #define ROUND_UP(x,y) (((x)+(y)-1)/(y))
 
+static DEFINE_MUTEX(pp_do_mutex);
 static inline void pp_enable_irq (struct pp_struct *pp)
 {
        struct parport *port = pp->pdev->port;
@@ -612,6 +613,7 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 
        case PPGETTIME:
                to_jiffies = pp->pdev->timeout;
+               memset(&par_timeout, 0, sizeof(par_timeout));
                par_timeout.tv_sec = to_jiffies / HZ;
                par_timeout.tv_usec = (to_jiffies % (long)HZ) * (1000000/HZ);
                if (copy_to_user (argp, &par_timeout, sizeof(struct timeval)))
@@ -630,9 +632,9 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 static long pp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        long ret;
-       lock_kernel();
+       mutex_lock(&pp_do_mutex);
        ret = pp_do_ioctl(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&pp_do_mutex);
        return ret;
 }
 
@@ -641,7 +643,6 @@ static int pp_open (struct inode * inode, struct file * file)
        unsigned int minor = iminor(inode);
        struct pp_struct *pp;
 
-       cycle_kernel_lock();
        if (minor >= PARPORT_MAX)
                return -ENXIO;