Skip to content

Commit

Permalink
USB: use mutex instead of semaphore in the USB gadget serial driver
Browse files Browse the repository at this point in the history
The USB gadget serial driver uses a semaphore as mutex. Use the
mutex API instead of the (binary) semaphore.

Signed-off-by: Matthias Kaehlcke <matthias.kaehlcke@gmail.com>
Acked-by: David Brownell <david-b@pacbell.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Matthias Kaehlcke authored and Greg Kroah-Hartman committed Jul 20, 2007
1 parent 64fb98f commit 831c70f
Showing 1 changed file with 13 additions and 12 deletions.
25 changes: 13 additions & 12 deletions drivers/usb/gadget/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/mutex.h>

#include <asm/byteorder.h>
#include <asm/io.h>
Expand Down Expand Up @@ -258,7 +259,7 @@ static const char *EP_IN_NAME;
static const char *EP_OUT_NAME;
static const char *EP_NOTIFY_NAME;

static struct semaphore gs_open_close_sem[GS_NUM_PORTS];
static struct mutex gs_open_close_lock[GS_NUM_PORTS];

static unsigned int read_q_size = GS_DEFAULT_READ_Q_SIZE;
static unsigned int write_q_size = GS_DEFAULT_WRITE_Q_SIZE;
Expand Down Expand Up @@ -595,7 +596,7 @@ static int __init gs_module_init(void)
tty_set_operations(gs_tty_driver, &gs_tty_ops);

for (i=0; i < GS_NUM_PORTS; i++)
sema_init(&gs_open_close_sem[i], 1);
mutex_init(&gs_open_close_lock[i]);

retval = tty_register_driver(gs_tty_driver);
if (retval) {
Expand Down Expand Up @@ -635,7 +636,7 @@ static int gs_open(struct tty_struct *tty, struct file *file)
struct gs_port *port;
struct gs_dev *dev;
struct gs_buf *buf;
struct semaphore *sem;
struct mutex *mtx;
int ret;

port_num = tty->index;
Expand All @@ -656,10 +657,10 @@ static int gs_open(struct tty_struct *tty, struct file *file)
return -ENODEV;
}

sem = &gs_open_close_sem[port_num];
if (down_interruptible(sem)) {
mtx = &gs_open_close_lock[port_num];
if (mutex_lock_interruptible(mtx)) {
printk(KERN_ERR
"gs_open: (%d,%p,%p) interrupted waiting for semaphore\n",
"gs_open: (%d,%p,%p) interrupted waiting for mutex\n",
port_num, tty, file);
return -ERESTARTSYS;
}
Expand Down Expand Up @@ -754,12 +755,12 @@ static int gs_open(struct tty_struct *tty, struct file *file)

exit_unlock_port:
spin_unlock_irqrestore(&port->port_lock, flags);
up(sem);
mutex_unlock(mtx);
return ret;

exit_unlock_dev:
spin_unlock_irqrestore(&dev->dev_lock, flags);
up(sem);
mutex_unlock(mtx);
return ret;

}
Expand All @@ -781,7 +782,7 @@ static int gs_open(struct tty_struct *tty, struct file *file)
static void gs_close(struct tty_struct *tty, struct file *file)
{
struct gs_port *port = tty->driver_data;
struct semaphore *sem;
struct mutex *mtx;

if (port == NULL) {
printk(KERN_ERR "gs_close: NULL port pointer\n");
Expand All @@ -790,8 +791,8 @@ static void gs_close(struct tty_struct *tty, struct file *file)

gs_debug("gs_close: (%d,%p,%p)\n", port->port_num, tty, file);

sem = &gs_open_close_sem[port->port_num];
down(sem);
mtx = &gs_open_close_lock[port->port_num];
mutex_lock(mtx);

spin_lock_irq(&port->port_lock);

Expand Down Expand Up @@ -846,7 +847,7 @@ static void gs_close(struct tty_struct *tty, struct file *file)

exit:
spin_unlock_irq(&port->port_lock);
up(sem);
mutex_unlock(mtx);
}

/*
Expand Down

0 comments on commit 831c70f

Please sign in to comment.