From: Thinh Nguyen <thinh.ngu...@synopsys.com>

[ Upstream commit b574ce3ee45937f4a01edc98c59213bfc7effe50 ]

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....@mediatek.com>
Signed-off-by: Thinh Nguyen <thi...@synopsys.com>
Signed-off-by: Felipe Balbi <ba...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/usb/dwc3/core.c | 35 ++++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 25c686a752b0f..7c5a18f9f66c8 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -930,13 +930,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;
@@ -1382,6 +1375,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)) {
@@ -1413,17 +1408,23 @@ static void dwc3_check_params(struct dwc3 *dwc)
                        dwc->maximum_speed);
                /* fall through */
        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;
        }
 }
-- 
2.25.1



Reply via email to