usb: dwc3: core: Properly default unspecified speed
authorThinh Nguyen <Thinh.Nguyen@synopsys.com>
Fri, 24 Jul 2020 21:01:02 +0000 (14:01 -0700)
committerFelipe Balbi <balbi@kernel.org>
Thu, 24 Sep 2020 08:56:16 +0000 (11:56 +0300)
If the maximum_speed is not specified, default the device speed base on
its HW capability. Don't prematurely check HW capability before
validating the maximum_speed device property. The device property takes
precedence in dwc->maximum_speed.

Fixes: 0e1e5c47f7a9 ("usb: dwc3: add support for USB 2.0-only core configuration")
Reported-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
drivers/usb/dwc3/core.c

index 2eb34c8..c8e0ef2 100644 (file)
@@ -929,13 +929,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
         */
        dwc3_writel(dwc->regs, DWC3_GUID, LINUX_VERSION_CODE);
 
-       /* Handle USB2.0-only core configuration */
-       if (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
-                       DWC3_GHWPARAMS3_SSPHY_IFC_DIS) {
-               if (dwc->maximum_speed == USB_SPEED_SUPER)
-                       dwc->maximum_speed = USB_SPEED_HIGH;
-       }
-
        ret = dwc3_phy_setup(dwc);
        if (ret)
                goto err0;
@@ -1381,6 +1374,8 @@ bool dwc3_has_imod(struct dwc3 *dwc)
 static void dwc3_check_params(struct dwc3 *dwc)
 {
        struct device *dev = dwc->dev;
+       unsigned int hwparam_gen =
+               DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3);
 
        /* Check for proper value of imod_interval */
        if (dwc->imod_interval && !dwc3_has_imod(dwc)) {
@@ -1412,17 +1407,23 @@ static void dwc3_check_params(struct dwc3 *dwc)
                        dwc->maximum_speed);
                fallthrough;
        case USB_SPEED_UNKNOWN:
-               /* default to superspeed */
-               dwc->maximum_speed = USB_SPEED_SUPER;
-
-               /*
-                * default to superspeed plus if we are capable.
-                */
-               if ((DWC3_IP_IS(DWC31) || DWC3_IP_IS(DWC32)) &&
-                   (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
-                    DWC3_GHWPARAMS3_SSPHY_IFC_GEN2))
+               switch (hwparam_gen) {
+               case DWC3_GHWPARAMS3_SSPHY_IFC_GEN2:
                        dwc->maximum_speed = USB_SPEED_SUPER_PLUS;
-
+                       break;
+               case DWC3_GHWPARAMS3_SSPHY_IFC_GEN1:
+                       if (DWC3_IP_IS(DWC32))
+                               dwc->maximum_speed = USB_SPEED_SUPER_PLUS;
+                       else
+                               dwc->maximum_speed = USB_SPEED_SUPER;
+                       break;
+               case DWC3_GHWPARAMS3_SSPHY_IFC_DIS:
+                       dwc->maximum_speed = USB_SPEED_HIGH;
+                       break;
+               default:
+                       dwc->maximum_speed = USB_SPEED_SUPER;
+                       break;
+               }
                break;
        }
 }