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: 0e1e5c47f7
("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>
This commit is contained in:
parent
362b9398c9
commit
b574ce3ee4
|
@ -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)
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue