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

Commit 3ad2e318 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull USB fixes from Greg Kroah-Hartman:
 "Here are some small USB driver fixes that resolve some reported
  problems for 3.10-rc6

  Nothing major, just 3 USB serial driver fixes, and two chipidea fixes"

* tag 'usb-3.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  usb: chipidea: fix id change handling
  usb: chipidea: fix no transceiver case
  USB: pl2303: fix device initialisation at open
  USB: spcp8x5: fix device initialisation at open
  USB: f81232: fix device initialisation at open
parents a2648ebb 0c3f3dc6
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -276,8 +276,9 @@ static void ci_role_work(struct work_struct *work)

		ci_role_stop(ci);
		ci_role_start(ci, role);
		enable_irq(ci->irq);
	}

	enable_irq(ci->irq);
}

static irqreturn_t ci_irq(int irq, void *data)
+8 −5
Original line number Diff line number Diff line
@@ -1678,8 +1678,11 @@ static int udc_start(struct ci13xxx *ci)

	ci->gadget.ep0 = &ci->ep0in->ep;

	if (ci->global_phy)
	if (ci->global_phy) {
		ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
		if (IS_ERR(ci->transceiver))
			ci->transceiver = NULL;
	}

	if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
		if (ci->transceiver == NULL) {
@@ -1694,7 +1697,7 @@ static int udc_start(struct ci13xxx *ci)
			goto put_transceiver;
	}

	if (!IS_ERR_OR_NULL(ci->transceiver)) {
	if (ci->transceiver) {
		retval = otg_set_peripheral(ci->transceiver->otg,
						&ci->gadget);
		if (retval)
@@ -1711,7 +1714,7 @@ static int udc_start(struct ci13xxx *ci)
	return retval;

remove_trans:
	if (!IS_ERR_OR_NULL(ci->transceiver)) {
	if (ci->transceiver) {
		otg_set_peripheral(ci->transceiver->otg, NULL);
		if (ci->global_phy)
			usb_put_phy(ci->transceiver);
@@ -1719,7 +1722,7 @@ remove_trans:

	dev_err(dev, "error = %i\n", retval);
put_transceiver:
	if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy)
	if (ci->transceiver && ci->global_phy)
		usb_put_phy(ci->transceiver);
destroy_eps:
	destroy_eps(ci);
@@ -1747,7 +1750,7 @@ static void udc_stop(struct ci13xxx *ci)
	dma_pool_destroy(ci->td_pool);
	dma_pool_destroy(ci->qh_pool);

	if (!IS_ERR_OR_NULL(ci->transceiver)) {
	if (ci->transceiver) {
		otg_set_peripheral(ci->transceiver->otg, NULL);
		if (ci->global_phy)
			usb_put_phy(ci->transceiver);
+4 −4
Original line number Diff line number Diff line
@@ -165,10 +165,11 @@ static void f81232_set_termios(struct tty_struct *tty,
	/* FIXME - Stubbed out for now */

	/* Don't change anything if nothing has changed */
	if (!tty_termios_hw_change(&tty->termios, old_termios))
	if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
		return;

	/* Do the real work here... */
	if (old_termios)
		tty_termios_copy_hw(&tty->termios, old_termios);
}

@@ -187,12 +188,11 @@ static int f81232_tiocmset(struct tty_struct *tty,

static int f81232_open(struct tty_struct *tty, struct usb_serial_port *port)
{
	struct ktermios tmp_termios;
	int result;

	/* Setup termios */
	if (tty)
		f81232_set_termios(tty, port, &tmp_termios);
		f81232_set_termios(tty, port, NULL);

	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
	if (result) {
+5 −5
Original line number Diff line number Diff line
@@ -284,7 +284,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
	   serial settings even to the same values as before. Thus
	   we actually need to filter in this specific case */

	if (!tty_termios_hw_change(&tty->termios, old_termios))
	if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
		return;

	cflag = tty->termios.c_cflag;
@@ -293,6 +293,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
	if (!buf) {
		dev_err(&port->dev, "%s - out of memory.\n", __func__);
		/* Report back no change occurred */
		if (old_termios)
			tty->termios = *old_termios;
		return;
	}
@@ -433,7 +434,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
	control = priv->line_control;
	if ((cflag & CBAUD) == B0)
		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
	else if ((old_termios->c_cflag & CBAUD) == B0)
	else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
	if (control != priv->line_control) {
		control = priv->line_control;
@@ -492,7 +493,6 @@ static void pl2303_close(struct usb_serial_port *port)

static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
{
	struct ktermios tmp_termios;
	struct usb_serial *serial = port->serial;
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
	int result;
@@ -508,7 +508,7 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)

	/* Setup termios */
	if (tty)
		pl2303_set_termios(tty, port, &tmp_termios);
		pl2303_set_termios(tty, port, NULL);

	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
	if (result) {
+4 −6
Original line number Diff line number Diff line
@@ -291,7 +291,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
	struct spcp8x5_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	unsigned int cflag = tty->termios.c_cflag;
	unsigned int old_cflag = old_termios->c_cflag;
	unsigned short uartdata;
	unsigned char buf[2] = {0, 0};
	int baud;
@@ -299,15 +298,15 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
	u8 control;

	/* check that they really want us to change something */
	if (!tty_termios_hw_change(&tty->termios, old_termios))
	if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
		return;

	/* set DTR/RTS active */
	spin_lock_irqsave(&priv->lock, flags);
	control = priv->line_control;
	if ((old_cflag & CBAUD) == B0) {
	if (old_termios && (old_termios->c_cflag & CBAUD) == B0) {
		priv->line_control |= MCR_DTR;
		if (!(old_cflag & CRTSCTS))
		if (!(old_termios->c_cflag & CRTSCTS))
			priv->line_control |= MCR_RTS;
	}
	if (control != priv->line_control) {
@@ -394,7 +393,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty,

static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port)
{
	struct ktermios tmp_termios;
	struct usb_serial *serial = port->serial;
	struct spcp8x5_private *priv = usb_get_serial_port_data(port);
	int ret;
@@ -411,7 +409,7 @@ static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port)
	spcp8x5_set_ctrl_line(port, priv->line_control);

	if (tty)
		spcp8x5_set_termios(tty, port, &tmp_termios);
		spcp8x5_set_termios(tty, port, NULL);

	port->port.drain_delay = 256;