]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/serial/usb-serial.c
[PATCH] USB serial: Converts port semaphore to mutexes.
[karo-tx-linux.git] / drivers / usb / serial / usb-serial.c
index 4dd6865d32b0b919418bfc14722d9f7297973a4c..071f86a59c086222ecf89c8705080b064b4d8fdc 100644 (file)
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <linux/list.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
-#include <asm/semaphore.h>
 #include <linux/usb.h>
 #include "usb-serial.h"
 #include "pl2303.h"
@@ -192,7 +192,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
        if (!port)
                return -ENODEV;
 
-       if (down_interruptible(&port->sem))
+       if (mutex_lock_interruptible(&port->mutex))
                return -ERESTARTSYS;
         
        ++port->open_count;
@@ -219,7 +219,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp)
                        goto bailout_module_put;
        }
 
-       up(&port->sem);
+       mutex_unlock(&port->mutex);
        return 0;
 
 bailout_module_put:
@@ -227,7 +227,7 @@ bailout_module_put:
 bailout_kref_put:
        kref_put(&serial->kref, destroy_serial);
        port->open_count = 0;
-       up(&port->sem);
+       mutex_unlock(&port->mutex);
        return retval;
 }
 
@@ -240,10 +240,12 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
-       down(&port->sem);
+       mutex_lock(&port->mutex);
 
-       if (port->open_count == 0)
-               goto out;
+       if (port->open_count == 0) {
+               mutex_unlock(&port->mutex);
+               return;
+       }
 
        --port->open_count;
        if (port->open_count == 0) {
@@ -260,10 +262,8 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
                module_put(port->serial->type->driver.owner);
        }
 
+       mutex_unlock(&port->mutex);
        kref_put(&port->serial->kref, destroy_serial);
-
-out:
-       up(&port->sem);
 }
 
 static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count)
@@ -564,12 +564,11 @@ static struct usb_serial * create_serial (struct usb_device *dev,
 {
        struct usb_serial *serial;
 
-       serial = kmalloc (sizeof (*serial), GFP_KERNEL);
+       serial = kzalloc(sizeof(*serial), GFP_KERNEL);
        if (!serial) {
                dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__);
                return NULL;
        }
-       memset (serial, 0, sizeof(*serial));
        serial->dev = usb_get_dev(dev);
        serial->type = driver;
        serial->interface = interface;
@@ -778,14 +777,13 @@ int usb_serial_probe(struct usb_interface *interface,
        serial->num_port_pointers = max_endpoints;
        dbg("%s - setting up %d port structures for this device", __FUNCTION__, max_endpoints);
        for (i = 0; i < max_endpoints; ++i) {
-               port = kmalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
+               port = kzalloc(sizeof(struct usb_serial_port), GFP_KERNEL);
                if (!port)
                        goto probe_error;
-               memset(port, 0x00, sizeof(struct usb_serial_port));
                port->number = i + serial->minor;
                port->serial = serial;
                spin_lock_init(&port->lock);
-               sema_init(&port->sem, 1);
+               mutex_init(&port->mutex);
                INIT_WORK(&port->work, usb_serial_port_softint, port);
                serial->port[i] = port;
        }