diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt index 8de381a44708..4675185efad9 100644 --- a/Documentation/devicetree/bindings/usb/dwc3.txt +++ b/Documentation/devicetree/bindings/usb/dwc3.txt @@ -45,6 +45,9 @@ Optional properties: a free-running PHY clock. - snps,dis_del_phy_power_chg_quirk: when set core will change PHY power from P0 to P1/P2/P3 without delay. + - snps,xhci_slow_suspend_quirk: when set, need an extraordinary delay to wait + for xHC enter the Halted state (i.e. HCH in the USBSTS + register is '1'). - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal utmi_l1_suspend_n, false when asserts utmi_sleep_n - snps,hird-threshold: HIRD threshold diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c2e55ee60176..5c8f2dc6f7b0 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1024,6 +1024,8 @@ static int dwc3_probe(struct platform_device *pdev) "snps,dis_u2_freeclk_exists_quirk"); dwc->dis_del_phy_power_chg_quirk = device_property_read_bool(dev, "snps,dis_del_phy_power_chg_quirk"); + dwc->xhci_slow_suspend_quirk = device_property_read_bool(dev, + "snps,xhci_slow_suspend_quirk"); dwc->phyif_utmi_16_bits = device_property_read_bool(dev, "snps,phyif_utmi_16_bits"); @@ -1064,6 +1066,8 @@ static int dwc3_probe(struct platform_device *pdev) pdata->dis_u2_freeclk_exists_quirk; dwc->dis_del_phy_power_chg_quirk = pdata->dis_del_phy_power_chg_quirk; + dwc->xhci_slow_suspend_quirk = + pdata->xhci_slow_suspend_quirk; dwc->phyif_utmi_16_bits = pdata->phyif_utmi_16_bits; dwc->tx_de_emphasis_quirk = pdata->tx_de_emphasis_quirk; diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index ed96f7d113f6..e2959ac44655 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -748,6 +748,9 @@ struct dwc3_scratchpad_array { * provide a free-running PHY clock. * @dis_del_phy_power_chg_quirk: set if we disable delay phy power * change quirk. + * @xhci_slow_suspend_quirk: set if need an extraordinary delay to wait + * for xHC enter the Halted state after the Run/Stop + * (R/S) bit is cleared to '0'. * @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk * @tx_de_emphasis: Tx de-emphasis value * 0 - -6dB de-emphasis @@ -897,6 +900,7 @@ struct dwc3 { unsigned dis_enblslpm_quirk:1; unsigned dis_u2_freeclk_exists_quirk:1; unsigned dis_del_phy_power_chg_quirk:1; + unsigned xhci_slow_suspend_quirk:1; unsigned tx_de_emphasis_quirk:1; unsigned tx_de_emphasis:2; diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c index 661fbae01ae2..b973138c7a81 100644 --- a/drivers/usb/dwc3/host.c +++ b/drivers/usb/dwc3/host.c @@ -51,6 +51,7 @@ int dwc3_host_init(struct dwc3 *dwc) memset(&pdata, 0, sizeof(pdata)); pdata.usb3_lpm_capable = dwc->usb3_lpm_capable; + pdata.xhci_slow_suspend = dwc->xhci_slow_suspend_quirk; ret = platform_device_add_data(xhci, &pdata, sizeof(pdata)); if (ret) { diff --git a/drivers/usb/dwc3/platform_data.h b/drivers/usb/dwc3/platform_data.h index b44e818c062e..22d1f1465374 100644 --- a/drivers/usb/dwc3/platform_data.h +++ b/drivers/usb/dwc3/platform_data.h @@ -46,6 +46,7 @@ struct dwc3_platform_data { unsigned dis_enblslpm_quirk:1; unsigned dis_u2_freeclk_exists_quirk:1; unsigned dis_del_phy_power_chg_quirk:1; + unsigned xhci_slow_suspend_quirk:1; unsigned tx_de_emphasis_quirk:1; unsigned tx_de_emphasis:2;