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
....@@ -1099,27 +1108,17 @@
10991108 if (dwc->parkmode_disable_ss_quirk)
11001109 reg |= DWC3_GUCTL1_PARKMODE_DISABLE_SS;
11011110
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))
11041119 reg |= DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK;
11051120
11061121 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);
11231122 }
11241123
11251124 /*
....@@ -1418,6 +1417,10 @@
14181417 "snps,dis-tx-ipgap-linecheck-quirk");
14191418 dwc->parkmode_disable_ss_quirk = device_property_read_bool(dev,
14201419 "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
14211424
14221425 dwc->tx_de_emphasis_quirk = device_property_read_bool(dev,
14231426 "snps,tx_de_emphasis_quirk");
....@@ -1645,13 +1648,11 @@
16451648 spin_lock_init(&dwc->lock);
16461649 mutex_init(&dwc->mutex);
16471650
1651
+ pm_runtime_get_noresume(dev);
16481652 pm_runtime_set_active(dev);
16491653 pm_runtime_use_autosuspend(dev);
16501654 pm_runtime_set_autosuspend_delay(dev, DWC3_DEFAULT_AUTOSUSPEND_DELAY);
16511655 pm_runtime_enable(dev);
1652
- ret = pm_runtime_get_sync(dev);
1653
- if (ret < 0)
1654
- goto err1;
16551656
16561657 pm_runtime_forbid(dev);
16571658
....@@ -1720,12 +1721,10 @@
17201721 dwc3_free_event_buffers(dwc);
17211722
17221723 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);
17291728 disable_clks:
17301729 clk_bulk_disable_unprepare(dwc->num_clks, dwc->clks);
17311730 assert_reset:
....@@ -1749,8 +1748,14 @@
17491748 dwc3_core_exit(dwc);
17501749 dwc3_ulpi_exit(dwc);
17511750
1751
+ pm_runtime_allow(&pdev->dev);
17521752 pm_runtime_disable(&pdev->dev);
17531753 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);
17541759 pm_runtime_set_suspended(&pdev->dev);
17551760
17561761 dwc3_free_event_buffers(dwc);