.. | .. |
---|
121 | 121 | int ret; |
---|
122 | 122 | int retries = 1000; |
---|
123 | 123 | u32 reg; |
---|
| 124 | + u32 desired_dr_role; |
---|
124 | 125 | |
---|
125 | 126 | mutex_lock(&dwc->mutex); |
---|
| 127 | + spin_lock_irqsave(&dwc->lock, flags); |
---|
| 128 | + desired_dr_role = dwc->desired_dr_role; |
---|
| 129 | + spin_unlock_irqrestore(&dwc->lock, flags); |
---|
126 | 130 | |
---|
127 | 131 | pm_runtime_get_sync(dwc->dev); |
---|
128 | 132 | |
---|
.. | .. |
---|
141 | 145 | if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_OTG) |
---|
142 | 146 | dwc3_otg_update(dwc, 0); |
---|
143 | 147 | |
---|
144 | | - if (!dwc->desired_dr_role) |
---|
| 148 | + if (!desired_dr_role) |
---|
145 | 149 | goto out; |
---|
146 | 150 | |
---|
147 | | - if (dwc->desired_dr_role == dwc->current_dr_role) |
---|
| 151 | + if (desired_dr_role == dwc->current_dr_role) |
---|
148 | 152 | goto out; |
---|
149 | 153 | |
---|
150 | | - if (dwc->desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev) |
---|
| 154 | + if (desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev) |
---|
151 | 155 | goto out; |
---|
152 | 156 | |
---|
153 | 157 | switch (dwc->current_dr_role) { |
---|
.. | .. |
---|
175 | 179 | */ |
---|
176 | 180 | if (dwc->current_dr_role && ((DWC3_IP_IS(DWC3) || |
---|
177 | 181 | DWC3_VER_IS_PRIOR(DWC31, 190A)) && |
---|
178 | | - dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) { |
---|
| 182 | + desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) { |
---|
179 | 183 | reg = dwc3_readl(dwc->regs, DWC3_GCTL); |
---|
180 | 184 | reg |= DWC3_GCTL_CORESOFTRESET; |
---|
181 | 185 | dwc3_writel(dwc->regs, DWC3_GCTL, reg); |
---|
.. | .. |
---|
195 | 199 | |
---|
196 | 200 | spin_lock_irqsave(&dwc->lock, flags); |
---|
197 | 201 | |
---|
198 | | - dwc3_set_prtcap(dwc, dwc->desired_dr_role); |
---|
| 202 | + dwc3_set_prtcap(dwc, desired_dr_role); |
---|
199 | 203 | |
---|
200 | 204 | spin_unlock_irqrestore(&dwc->lock, flags); |
---|
201 | 205 | |
---|
202 | | - switch (dwc->desired_dr_role) { |
---|
| 206 | + switch (desired_dr_role) { |
---|
203 | 207 | case DWC3_GCTL_PRTCAP_HOST: |
---|
204 | 208 | ret = dwc3_host_init(dwc); |
---|
205 | 209 | if (ret) { |
---|
.. | .. |
---|
303 | 307 | /* |
---|
304 | 308 | * We're resetting only the device side because, if we're in host mode, |
---|
305 | 309 | * XHCI driver will reset the host block. If dwc3 was configured for |
---|
306 | | - * host-only mode, then we can return early. |
---|
| 310 | + * host-only mode or current role is host, then we can return early. |
---|
307 | 311 | */ |
---|
308 | | - if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST) |
---|
| 312 | + if (dwc->dr_mode == USB_DR_MODE_HOST || dwc->current_dr_role == DWC3_GCTL_PRTCAP_HOST) |
---|
309 | 313 | return 0; |
---|
310 | 314 | |
---|
311 | 315 | reg = dwc3_readl(dwc->regs, DWC3_DCTL); |
---|
.. | .. |
---|
992 | 996 | |
---|
993 | 997 | if (!dwc->ulpi_ready) { |
---|
994 | 998 | ret = dwc3_core_ulpi_init(dwc); |
---|
995 | | - if (ret) |
---|
| 999 | + if (ret) { |
---|
| 1000 | + if (ret == -ETIMEDOUT) { |
---|
| 1001 | + dwc3_core_soft_reset(dwc); |
---|
| 1002 | + ret = -EPROBE_DEFER; |
---|
| 1003 | + } |
---|
996 | 1004 | goto err0; |
---|
| 1005 | + } |
---|
997 | 1006 | dwc->ulpi_ready = true; |
---|
998 | 1007 | } |
---|
999 | 1008 | |
---|
.. | .. |
---|
1099 | 1108 | if (dwc->parkmode_disable_ss_quirk) |
---|
1100 | 1109 | reg |= DWC3_GUCTL1_PARKMODE_DISABLE_SS; |
---|
1101 | 1110 | |
---|
1102 | | - if (dwc->maximum_speed == USB_SPEED_HIGH || |
---|
1103 | | - dwc->maximum_speed == USB_SPEED_FULL) |
---|
| 1111 | +#ifdef CONFIG_NO_GKI |
---|
| 1112 | + if (dwc->parkmode_disable_hs_quirk) |
---|
| 1113 | + reg |= DWC3_GUCTL1_PARKMODE_DISABLE_HS; |
---|
| 1114 | +#endif |
---|
| 1115 | + |
---|
| 1116 | + if (DWC3_VER_IS_WITHIN(DWC3, 290A, ANY) && |
---|
| 1117 | + (dwc->maximum_speed == USB_SPEED_HIGH || |
---|
| 1118 | + dwc->maximum_speed == USB_SPEED_FULL)) |
---|
1104 | 1119 | reg |= DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK; |
---|
1105 | 1120 | |
---|
1106 | 1121 | dwc3_writel(dwc->regs, DWC3_GUCTL1, reg); |
---|
1107 | | - } |
---|
1108 | | - |
---|
1109 | | - if (dwc->dr_mode == USB_DR_MODE_HOST || |
---|
1110 | | - dwc->dr_mode == USB_DR_MODE_OTG) { |
---|
1111 | | - reg = dwc3_readl(dwc->regs, DWC3_GUCTL); |
---|
1112 | | - |
---|
1113 | | - /* |
---|
1114 | | - * Enable Auto retry Feature to make the controller operating in |
---|
1115 | | - * Host mode on seeing transaction errors(CRC errors or internal |
---|
1116 | | - * overrun scenerios) on IN transfers to reply to the device |
---|
1117 | | - * with a non-terminating retry ACK (i.e, an ACK transcation |
---|
1118 | | - * packet with Retry=1 & Nump != 0) |
---|
1119 | | - */ |
---|
1120 | | - reg |= DWC3_GUCTL_HSTINAUTORETRY; |
---|
1121 | | - |
---|
1122 | | - dwc3_writel(dwc->regs, DWC3_GUCTL, reg); |
---|
1123 | 1122 | } |
---|
1124 | 1123 | |
---|
1125 | 1124 | /* |
---|
.. | .. |
---|
1418 | 1417 | "snps,dis-tx-ipgap-linecheck-quirk"); |
---|
1419 | 1418 | dwc->parkmode_disable_ss_quirk = device_property_read_bool(dev, |
---|
1420 | 1419 | "snps,parkmode-disable-ss-quirk"); |
---|
| 1420 | +#ifdef CONFIG_NO_GKI |
---|
| 1421 | + dwc->parkmode_disable_hs_quirk = device_property_read_bool(dev, |
---|
| 1422 | + "snps,parkmode-disable-hs-quirk"); |
---|
| 1423 | +#endif |
---|
1421 | 1424 | |
---|
1422 | 1425 | dwc->tx_de_emphasis_quirk = device_property_read_bool(dev, |
---|
1423 | 1426 | "snps,tx_de_emphasis_quirk"); |
---|
.. | .. |
---|
1645 | 1648 | spin_lock_init(&dwc->lock); |
---|
1646 | 1649 | mutex_init(&dwc->mutex); |
---|
1647 | 1650 | |
---|
| 1651 | + pm_runtime_get_noresume(dev); |
---|
1648 | 1652 | pm_runtime_set_active(dev); |
---|
1649 | 1653 | pm_runtime_use_autosuspend(dev); |
---|
1650 | 1654 | pm_runtime_set_autosuspend_delay(dev, DWC3_DEFAULT_AUTOSUSPEND_DELAY); |
---|
1651 | 1655 | pm_runtime_enable(dev); |
---|
1652 | | - ret = pm_runtime_get_sync(dev); |
---|
1653 | | - if (ret < 0) |
---|
1654 | | - goto err1; |
---|
1655 | 1656 | |
---|
1656 | 1657 | pm_runtime_forbid(dev); |
---|
1657 | 1658 | |
---|
.. | .. |
---|
1720 | 1721 | dwc3_free_event_buffers(dwc); |
---|
1721 | 1722 | |
---|
1722 | 1723 | err2: |
---|
1723 | | - pm_runtime_allow(&pdev->dev); |
---|
1724 | | - |
---|
1725 | | -err1: |
---|
1726 | | - pm_runtime_put_sync(&pdev->dev); |
---|
1727 | | - pm_runtime_disable(&pdev->dev); |
---|
1728 | | - |
---|
| 1724 | + pm_runtime_allow(dev); |
---|
| 1725 | + pm_runtime_disable(dev); |
---|
| 1726 | + pm_runtime_set_suspended(dev); |
---|
| 1727 | + pm_runtime_put_noidle(dev); |
---|
1729 | 1728 | disable_clks: |
---|
1730 | 1729 | clk_bulk_disable_unprepare(dwc->num_clks, dwc->clks); |
---|
1731 | 1730 | assert_reset: |
---|
.. | .. |
---|
1749 | 1748 | dwc3_core_exit(dwc); |
---|
1750 | 1749 | dwc3_ulpi_exit(dwc); |
---|
1751 | 1750 | |
---|
| 1751 | + pm_runtime_allow(&pdev->dev); |
---|
1752 | 1752 | pm_runtime_disable(&pdev->dev); |
---|
1753 | 1753 | pm_runtime_put_noidle(&pdev->dev); |
---|
| 1754 | + /* |
---|
| 1755 | + * HACK: Clear the driver data, which is currently accessed by parent |
---|
| 1756 | + * glue drivers, before allowing the parent to suspend. |
---|
| 1757 | + */ |
---|
| 1758 | + platform_set_drvdata(pdev, NULL); |
---|
1754 | 1759 | pm_runtime_set_suspended(&pdev->dev); |
---|
1755 | 1760 | |
---|
1756 | 1761 | dwc3_free_event_buffers(dwc); |
---|