Merge branch 'for-usb-next' of git+ssh://master.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-next

* 'for-usb-next' of git+ssh://master.kernel.org/pub/scm/linux/kernel/git/sarah/xhci:
  xhci: Fix bug in control transfer cancellation.
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 58754b5..395a347 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -853,7 +853,7 @@
 	u8 ac_management_function = 0;
 	u8 call_management_function = 0;
 	int call_interface_num = -1;
-	int data_interface_num;
+	int data_interface_num = -1;
 	unsigned long quirks;
 	int num_rx_buf;
 	int i;
@@ -937,7 +937,11 @@
 	if (!union_header) {
 		if (call_interface_num > 0) {
 			dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n");
-			data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
+			/* quirks for Droids MuIn LCD */
+			if (quirks & NO_DATA_INTERFACE)
+				data_interface = usb_ifnum_to_if(usb_dev, 0);
+			else
+				data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
 			control_interface = intf;
 		} else {
 			if (intf->cur_altsetting->desc.bNumEndpoints != 3) {
@@ -1535,6 +1539,11 @@
 	.driver_info = NOT_A_MODEM,
 	},
 
+	/* Support for Droids MuIn LCD */
+	{ USB_DEVICE(0x04d8, 0x000b),
+	.driver_info = NO_DATA_INTERFACE,
+	},
+
 	/* control interfaces without any protocol set */
 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
 		USB_CDC_PROTO_NONE) },
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h
index 7b5c0bd..ca7937f 100644
--- a/drivers/usb/class/cdc-acm.h
+++ b/drivers/usb/class/cdc-acm.h
@@ -126,3 +126,4 @@
 #define SINGLE_RX_URB			2
 #define NO_CAP_LINE			4
 #define NOT_A_MODEM			8
+#define NO_DATA_INTERFACE		16
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c
index 34e68e0..f3664d6 100644
--- a/drivers/usb/renesas_usbhs/common.c
+++ b/drivers/usb/renesas_usbhs/common.c
@@ -321,11 +321,11 @@
 	/* call pipe and module init */
 	ret = usbhs_pipe_probe(priv);
 	if (ret < 0)
-		goto probe_end_mod_exit;
+		goto probe_end_iounmap;
 
 	ret = usbhs_mod_probe(priv);
 	if (ret < 0)
-		goto probe_end_iounmap;
+		goto probe_end_pipe_exit;
 
 	/* dev_set_drvdata should be called after usbhs_mod_init */
 	dev_set_drvdata(&pdev->dev, priv);
@@ -346,7 +346,7 @@
 	ret = usbhs_platform_call(priv, hardware_init, pdev);
 	if (ret < 0) {
 		dev_err(&pdev->dev, "platform prove failed.\n");
-		goto probe_end_pipe_exit;
+		goto probe_end_mod_exit;
 	}
 
 	/* reset phy for connection */
@@ -372,10 +372,10 @@
 
 probe_end_call_remove:
 	usbhs_platform_call(priv, hardware_exit, pdev);
-probe_end_pipe_exit:
-	usbhs_pipe_remove(priv);
 probe_end_mod_exit:
 	usbhs_mod_remove(priv);
+probe_end_pipe_exit:
+	usbhs_pipe_remove(priv);
 probe_end_iounmap:
 	iounmap(priv->base);
 probe_end_kfree:
@@ -403,8 +403,8 @@
 	pm_runtime_disable(&pdev->dev);
 
 	usbhs_platform_call(priv, hardware_exit, pdev);
-	usbhs_pipe_remove(priv);
 	usbhs_mod_remove(priv);
+	usbhs_pipe_remove(priv);
 	iounmap(priv->base);
 	kfree(priv);
 
diff --git a/drivers/usb/renesas_usbhs/pipe.c b/drivers/usb/renesas_usbhs/pipe.c
index 5897dda..bc4521c 100644
--- a/drivers/usb/renesas_usbhs/pipe.c
+++ b/drivers/usb/renesas_usbhs/pipe.c
@@ -183,7 +183,6 @@
 static int usbhsp_pipe_barrier(struct usbhs_pipe *pipe)
 {
 	struct usbhs_priv *priv = usbhsp_pipe_to_priv(pipe);
-	struct device *dev = usbhs_priv_to_dev(priv);
 	int timeout = 1024;
 	u16 val;
 
@@ -206,6 +205,7 @@
 	 *   - "Pipe Control Registers Switching Procedure"
 	 */
 	usbhs_write(priv, CFIFOSEL, 0);
+	usbhs_fifo_disable(pipe);
 
 	do {
 		val  = usbhsp_pipectrl_get(pipe);
@@ -217,21 +217,6 @@
 
 	} while (timeout--);
 
-	/*
-	 * force NAK
-	 */
-	timeout = 1024;
-	usbhs_fifo_disable(pipe);
-	do {
-		val  = usbhsp_pipectrl_get(pipe);
-		val &= PBUSY;
-		if (!val)
-			return 0;
-
-	} while (timeout--);
-
-	dev_err(dev, "pipe barrier failed\n");
-
 	return -EBUSY;
 }
 
@@ -270,10 +255,22 @@
 
 void usbhs_fifo_disable(struct usbhs_pipe *pipe)
 {
+	int timeout = 1024;
+	u16 val;
+
 	/* see "Pipe n Control Register" - "PID" */
 	__usbhsp_pid_try_nak_if_stall(pipe);
 
 	usbhsp_pipectrl_set(pipe, PID_MASK, PID_NAK);
+
+	do {
+		val  = usbhsp_pipectrl_get(pipe);
+		val &= PBUSY;
+		if (!val)
+			break;
+
+		udelay(10);
+	} while (timeout--);
 }
 
 void usbhs_fifo_enable(struct usbhs_pipe *pipe)