Эх сурвалжийг харах

usb: musb: core: fix highspeed check

FSDEV is set for both HIGH and FULL speeds,
the correct HIGHSPEED check is done through
power register's HSMODE bit.

Tested-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Felipe Balbi 10 жил өмнө
parent
commit
28378d5ed5

+ 14 - 7
drivers/usb/musb/musb_core.c

@@ -880,16 +880,23 @@ b_host:
 	if (int_usb & MUSB_INTR_RESET) {
 		handled = IRQ_HANDLED;
 		if (devctl & MUSB_DEVCTL_HM) {
+			u8 power = musb_readl(musb->mregs, MUSB_POWER);
+
 			/*
 			 * Looks like non-HS BABBLE can be ignored, but
-			 * HS BABBLE is an error condition. For HS the solution
-			 * is to avoid babble in the first place and fix what
-			 * caused BABBLE. When HS BABBLE happens we can only
-			 * stop the session.
+			 * HS BABBLE is an error condition.
+			 *
+			 * For HS the solution is to avoid babble in the first
+			 * place and fix what caused BABBLE.
+			 *
+			 * When HS BABBLE happens what we can depends on which
+			 * platform MUSB is running, because some platforms
+			 * implemented proprietary means for 'recovering' from
+			 * Babble conditions. One such platform is AM335x. In
+			 * most cases, however, the only thing we can do is drop
+			 * the session.
 			 */
-			if (devctl & (MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV)) {
-				dev_dbg(musb->controller, "BABBLE devctl: %02x\n", devctl);
-			} else {
+			if (power & MUSB_POWER_HSMODE) {
 				ERR("Stopping host session -- babble\n");
 				musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
 			}