diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/serial/ti_usb_3410_5052.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 1f0149495fb4..995fdf3c4898 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -80,6 +80,7 @@ | |||
80 | #include <linux/ioctl.h> | 80 | #include <linux/ioctl.h> |
81 | #include <linux/serial.h> | 81 | #include <linux/serial.h> |
82 | #include <linux/circ_buf.h> | 82 | #include <linux/circ_buf.h> |
83 | #include <linux/mutex.h> | ||
83 | #include <asm/uaccess.h> | 84 | #include <asm/uaccess.h> |
84 | #include <asm/semaphore.h> | 85 | #include <asm/semaphore.h> |
85 | #include <linux/usb.h> | 86 | #include <linux/usb.h> |
@@ -139,7 +140,7 @@ struct ti_port { | |||
139 | }; | 140 | }; |
140 | 141 | ||
141 | struct ti_device { | 142 | struct ti_device { |
142 | struct semaphore td_open_close_sem; | 143 | struct mutex td_open_close_lock; |
143 | int td_open_port_count; | 144 | int td_open_port_count; |
144 | struct usb_serial *td_serial; | 145 | struct usb_serial *td_serial; |
145 | int td_is_3410; | 146 | int td_is_3410; |
@@ -424,7 +425,7 @@ static int ti_startup(struct usb_serial *serial) | |||
424 | dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); | 425 | dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); |
425 | return -ENOMEM; | 426 | return -ENOMEM; |
426 | } | 427 | } |
427 | sema_init(&tdev->td_open_close_sem, 1); | 428 | mutex_init(&tdev->td_open_close_lock); |
428 | tdev->td_serial = serial; | 429 | tdev->td_serial = serial; |
429 | usb_set_serial_data(serial, tdev); | 430 | usb_set_serial_data(serial, tdev); |
430 | 431 | ||
@@ -547,7 +548,7 @@ static int ti_open(struct usb_serial_port *port, struct file *file) | |||
547 | tdev = tport->tp_tdev; | 548 | tdev = tport->tp_tdev; |
548 | 549 | ||
549 | /* only one open on any port on a device at a time */ | 550 | /* only one open on any port on a device at a time */ |
550 | if (down_interruptible(&tdev->td_open_close_sem)) | 551 | if (mutex_lock_interruptible(&tdev->td_open_close_lock)) |
551 | return -ERESTARTSYS; | 552 | return -ERESTARTSYS; |
552 | 553 | ||
553 | if (port->tty) | 554 | if (port->tty) |
@@ -568,7 +569,7 @@ static int ti_open(struct usb_serial_port *port, struct file *file) | |||
568 | if (!urb) { | 569 | if (!urb) { |
569 | dev_err(&port->dev, "%s - no interrupt urb\n", __FUNCTION__); | 570 | dev_err(&port->dev, "%s - no interrupt urb\n", __FUNCTION__); |
570 | status = -EINVAL; | 571 | status = -EINVAL; |
571 | goto up_sem; | 572 | goto release_lock; |
572 | } | 573 | } |
573 | urb->complete = ti_interrupt_callback; | 574 | urb->complete = ti_interrupt_callback; |
574 | urb->context = tdev; | 575 | urb->context = tdev; |
@@ -576,7 +577,7 @@ static int ti_open(struct usb_serial_port *port, struct file *file) | |||
576 | status = usb_submit_urb(urb, GFP_KERNEL); | 577 | status = usb_submit_urb(urb, GFP_KERNEL); |
577 | if (status) { | 578 | if (status) { |
578 | dev_err(&port->dev, "%s - submit interrupt urb failed, %d\n", __FUNCTION__, status); | 579 | dev_err(&port->dev, "%s - submit interrupt urb failed, %d\n", __FUNCTION__, status); |
579 | goto up_sem; | 580 | goto release_lock; |
580 | } | 581 | } |
581 | } | 582 | } |
582 | 583 | ||
@@ -656,13 +657,13 @@ static int ti_open(struct usb_serial_port *port, struct file *file) | |||
656 | tport->tp_is_open = 1; | 657 | tport->tp_is_open = 1; |
657 | ++tdev->td_open_port_count; | 658 | ++tdev->td_open_port_count; |
658 | 659 | ||
659 | goto up_sem; | 660 | goto release_lock; |
660 | 661 | ||
661 | unlink_int_urb: | 662 | unlink_int_urb: |
662 | if (tdev->td_open_port_count == 0) | 663 | if (tdev->td_open_port_count == 0) |
663 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); | 664 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); |
664 | up_sem: | 665 | release_lock: |
665 | up(&tdev->td_open_close_sem); | 666 | mutex_unlock(&tdev->td_open_close_lock); |
666 | dbg("%s - exit %d", __FUNCTION__, status); | 667 | dbg("%s - exit %d", __FUNCTION__, status); |
667 | return status; | 668 | return status; |
668 | } | 669 | } |
@@ -674,7 +675,7 @@ static void ti_close(struct usb_serial_port *port, struct file *file) | |||
674 | struct ti_port *tport; | 675 | struct ti_port *tport; |
675 | int port_number; | 676 | int port_number; |
676 | int status; | 677 | int status; |
677 | int do_up; | 678 | int do_unlock; |
678 | 679 | ||
679 | dbg("%s - port %d", __FUNCTION__, port->number); | 680 | dbg("%s - port %d", __FUNCTION__, port->number); |
680 | 681 | ||
@@ -699,16 +700,16 @@ static void ti_close(struct usb_serial_port *port, struct file *file) | |||
699 | if (status) | 700 | if (status) |
700 | dev_err(&port->dev, "%s - cannot send close port command, %d\n" , __FUNCTION__, status); | 701 | dev_err(&port->dev, "%s - cannot send close port command, %d\n" , __FUNCTION__, status); |
701 | 702 | ||
702 | /* if down is interrupted, continue anyway */ | 703 | /* if mutex_lock is interrupted, continue anyway */ |
703 | do_up = !down_interruptible(&tdev->td_open_close_sem); | 704 | do_unlock = !mutex_lock_interruptible(&tdev->td_open_close_lock); |
704 | --tport->tp_tdev->td_open_port_count; | 705 | --tport->tp_tdev->td_open_port_count; |
705 | if (tport->tp_tdev->td_open_port_count <= 0) { | 706 | if (tport->tp_tdev->td_open_port_count <= 0) { |
706 | /* last port is closed, shut down interrupt urb */ | 707 | /* last port is closed, shut down interrupt urb */ |
707 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); | 708 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); |
708 | tport->tp_tdev->td_open_port_count = 0; | 709 | tport->tp_tdev->td_open_port_count = 0; |
709 | } | 710 | } |
710 | if (do_up) | 711 | if (do_unlock) |
711 | up(&tdev->td_open_close_sem); | 712 | mutex_unlock(&tdev->td_open_close_lock); |
712 | 713 | ||
713 | dbg("%s - exit", __FUNCTION__); | 714 | dbg("%s - exit", __FUNCTION__); |
714 | } | 715 | } |