hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/usb/dwc3/core.c
....@@ -121,8 +121,12 @@
121121 int ret;
122122 int retries = 1000;
123123 u32 reg;
124
+ u32 desired_dr_role;
124125
125126 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);
126130
127131 pm_runtime_get_sync(dwc->dev);
128132
....@@ -141,13 +145,13 @@
141145 if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_OTG)
142146 dwc3_otg_update(dwc, 0);
143147
144
- if (!dwc->desired_dr_role)
148
+ if (!desired_dr_role)
145149 goto out;
146150
147
- if (dwc->desired_dr_role == dwc->current_dr_role)
151
+ if (desired_dr_role == dwc->current_dr_role)
148152 goto out;
149153
150
- if (dwc->desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
154
+ if (desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
151155 goto out;
152156
153157 switch (dwc->current_dr_role) {
....@@ -175,7 +179,7 @@
175179 */
176180 if (dwc->current_dr_role && ((DWC3_IP_IS(DWC3) ||
177181 DWC3_VER_IS_PRIOR(DWC31, 190A)) &&
178
- dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) {
182
+ desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) {
179183 reg = dwc3_readl(dwc->regs, DWC3_GCTL);
180184 reg |= DWC3_GCTL_CORESOFTRESET;
181185 dwc3_writel(dwc->regs, DWC3_GCTL, reg);
....@@ -195,11 +199,11 @@
195199
196200 spin_lock_irqsave(&dwc->lock, flags);
197201
198
- dwc3_set_prtcap(dwc, dwc->desired_dr_role);
202
+ dwc3_set_prtcap(dwc, desired_dr_role);
199203
200204 spin_unlock_irqrestore(&dwc->lock, flags);
201205
202
- switch (dwc->desired_dr_role) {
206
+ switch (desired_dr_role) {
203207 case DWC3_GCTL_PRTCAP_HOST:
204208 ret = dwc3_host_init(dwc);
205209 if (ret) {
....@@ -303,9 +307,9 @@
303307 /*
304308 * We're resetting only the device side because, if we're in host mode,
305309 * 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.
307311 */
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)
309313 return 0;
310314
311315 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
....@@ -992,8 +996,13 @@
992996
993997 if (!dwc->ulpi_ready) {
994998 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
+ }
9961004 goto err0;
1005
+ }
9971006 dwc->ulpi_ready = true;
9981007 }
9991008
....@@ -1104,27 +1113,12 @@
11041113 reg |= DWC3_GUCTL1_PARKMODE_DISABLE_HS;
11051114 #endif
11061115
1107
- if (dwc->maximum_speed == USB_SPEED_HIGH ||
1108
- dwc->maximum_speed == USB_SPEED_FULL)
1116
+ if (DWC3_VER_IS_WITHIN(DWC3, 290A, ANY) &&
1117
+ (dwc->maximum_speed == USB_SPEED_HIGH ||
1118
+ dwc->maximum_speed == USB_SPEED_FULL))
11091119 reg |= DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK;
11101120
11111121 dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
1112
- }
1113
-
1114
- if (dwc->dr_mode == USB_DR_MODE_HOST ||
1115
- dwc->dr_mode == USB_DR_MODE_OTG) {
1116
- reg = dwc3_readl(dwc->regs, DWC3_GUCTL);
1117
-
1118
- /*
1119
- * Enable Auto retry Feature to make the controller operating in
1120
- * Host mode on seeing transaction errors(CRC errors or internal
1121
- * overrun scenerios) on IN transfers to reply to the device
1122
- * with a non-terminating retry ACK (i.e, an ACK transcation
1123
- * packet with Retry=1 & Nump != 0)
1124
- */
1125
- reg |= DWC3_GUCTL_HSTINAUTORETRY;
1126
-
1127
- dwc3_writel(dwc->regs, DWC3_GUCTL, reg);
11281122 }
11291123
11301124 /*
....@@ -1654,13 +1648,11 @@
16541648 spin_lock_init(&dwc->lock);
16551649 mutex_init(&dwc->mutex);
16561650
1651
+ pm_runtime_get_noresume(dev);
16571652 pm_runtime_set_active(dev);
16581653 pm_runtime_use_autosuspend(dev);
16591654 pm_runtime_set_autosuspend_delay(dev, DWC3_DEFAULT_AUTOSUSPEND_DELAY);
16601655 pm_runtime_enable(dev);
1661
- ret = pm_runtime_get_sync(dev);
1662
- if (ret < 0)
1663
- goto err1;
16641656
16651657 pm_runtime_forbid(dev);
16661658
....@@ -1729,12 +1721,10 @@
17291721 dwc3_free_event_buffers(dwc);
17301722
17311723 err2:
1732
- pm_runtime_allow(&pdev->dev);
1733
-
1734
-err1:
1735
- pm_runtime_put_sync(&pdev->dev);
1736
- pm_runtime_disable(&pdev->dev);
1737
-
1724
+ pm_runtime_allow(dev);
1725
+ pm_runtime_disable(dev);
1726
+ pm_runtime_set_suspended(dev);
1727
+ pm_runtime_put_noidle(dev);
17381728 disable_clks:
17391729 clk_bulk_disable_unprepare(dwc->num_clks, dwc->clks);
17401730 assert_reset:
....@@ -1758,8 +1748,14 @@
17581748 dwc3_core_exit(dwc);
17591749 dwc3_ulpi_exit(dwc);
17601750
1751
+ pm_runtime_allow(&pdev->dev);
17611752 pm_runtime_disable(&pdev->dev);
17621753 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);
17631759 pm_runtime_set_suspended(&pdev->dev);
17641760
17651761 dwc3_free_event_buffers(dwc);