Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 831c70fc authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Greg Kroah-Hartman
Browse files

USB: use mutex instead of semaphore in the USB gadget serial driver



The USB gadget serial driver uses a semaphore as mutex. Use the
mutex API instead of the (binary) semaphore.

Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
Acked-by: default avatarDavid Brownell <david-b@pacbell.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 64fb98fc
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -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>
@@ -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;
@@ -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) {
@@ -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;
@@ -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;
	}
@@ -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;

}
@@ -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");
@@ -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);

@@ -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);
}

/*