From 8643e4397f940b5497de8d2876d01d33d98077fc Mon Sep 17 00:00:00 2001 From: Wu Liang feng Date: Wed, 10 Aug 2016 20:55:53 +0800 Subject: [PATCH] usb: dwc3: add a quirk xhci_slow_suspend_quirk On some xHCI controllers (e.g. Rockchip SoCs), which are integrated in DWC3 IP, need an extraordinary delay to wait for xHCI enter the Halted state(i.e. HCH in the USBSTS register is '1'), especially if DWC3 is in DRD mode. Change-Id: I67c84d4768df95f7616d6716a77cf743e4334122 Signed-off-by: Wu Liang feng --- Documentation/devicetree/bindings/usb/dwc3.txt | 3 +++ drivers/usb/dwc3/core.c | 2 ++ drivers/usb/dwc3/core.h | 4 ++++ drivers/usb/dwc3/host.c | 1 + 4 files changed, 10 insertions(+) diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt index e96bfc20907e..0099e2fbed01 100644 --- a/Documentation/devicetree/bindings/usb/dwc3.txt +++ b/Documentation/devicetree/bindings/usb/dwc3.txt @@ -44,6 +44,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 99a42212e4c2..270dbede8852 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -967,6 +967,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->tx_de_emphasis_quirk = device_property_read_bool(dev, "snps,tx_de_emphasis_quirk"); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index a765b043228e..d11303373a9b 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -813,6 +813,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 @@ -959,6 +962,7 @@ struct dwc3 { unsigned dis_rxdet_inp3_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 2903c9102cbd..971d95163ce6 100644 --- a/drivers/usb/dwc3/host.c +++ b/drivers/usb/dwc3/host.c @@ -92,6 +92,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) { -- 2.34.1