Commit b574ce3e authored by Thinh Nguyen's avatar Thinh Nguyen Committed by Felipe Balbi

usb: dwc3: core: Properly default unspecified speed

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: 0e1e5c47 ("usb: dwc3: add support for USB 2.0-only core configuration")
Reported-by: default avatarChunfeng Yun <chunfeng.yun@mediatek.com>
Signed-off-by: default avatarThinh Nguyen <thinhn@synopsys.com>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent 362b9398
...@@ -929,13 +929,6 @@ static int dwc3_core_init(struct dwc3 *dwc) ...@@ -929,13 +929,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
*/ */
dwc3_writel(dwc->regs, DWC3_GUID, LINUX_VERSION_CODE); 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); ret = dwc3_phy_setup(dwc);
if (ret) if (ret)
goto err0; goto err0;
...@@ -1381,6 +1374,8 @@ bool dwc3_has_imod(struct dwc3 *dwc) ...@@ -1381,6 +1374,8 @@ bool dwc3_has_imod(struct dwc3 *dwc)
static void dwc3_check_params(struct dwc3 *dwc) static void dwc3_check_params(struct dwc3 *dwc)
{ {
struct device *dev = dwc->dev; struct device *dev = dwc->dev;
unsigned int hwparam_gen =
DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3);
/* Check for proper value of imod_interval */ /* Check for proper value of imod_interval */
if (dwc->imod_interval && !dwc3_has_imod(dwc)) { if (dwc->imod_interval && !dwc3_has_imod(dwc)) {
...@@ -1412,17 +1407,23 @@ static void dwc3_check_params(struct dwc3 *dwc) ...@@ -1412,17 +1407,23 @@ static void dwc3_check_params(struct dwc3 *dwc)
dwc->maximum_speed); dwc->maximum_speed);
fallthrough; fallthrough;
case USB_SPEED_UNKNOWN: case USB_SPEED_UNKNOWN:
/* default to superspeed */ switch (hwparam_gen) {
dwc->maximum_speed = USB_SPEED_SUPER; case DWC3_GHWPARAMS3_SSPHY_IFC_GEN2:
/*
* 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))
dwc->maximum_speed = USB_SPEED_SUPER_PLUS; 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; break;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment