hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/usb/dwc3/dwc3-qcom.c
....@@ -115,7 +115,7 @@
115115 readl(base + offset);
116116 }
117117
118
-static void dwc3_qcom_vbus_overrride_enable(struct dwc3_qcom *qcom, bool enable)
118
+static void dwc3_qcom_vbus_override_enable(struct dwc3_qcom *qcom, bool enable)
119119 {
120120 if (enable) {
121121 dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_SS_PHY_CTRL,
....@@ -136,7 +136,7 @@
136136 struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, vbus_nb);
137137
138138 /* enable vbus override for device mode */
139
- dwc3_qcom_vbus_overrride_enable(qcom, event);
139
+ dwc3_qcom_vbus_override_enable(qcom, event);
140140 qcom->mode = event ? USB_DR_MODE_PERIPHERAL : USB_DR_MODE_HOST;
141141
142142 return NOTIFY_DONE;
....@@ -148,7 +148,7 @@
148148 struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, host_nb);
149149
150150 /* disable vbus override in host mode */
151
- dwc3_qcom_vbus_overrride_enable(qcom, !event);
151
+ dwc3_qcom_vbus_override_enable(qcom, !event);
152152 qcom->mode = event ? USB_DR_MODE_HOST : USB_DR_MODE_PERIPHERAL;
153153
154154 return NOTIFY_DONE;
....@@ -258,7 +258,8 @@
258258 if (IS_ERR(qcom->icc_path_apps)) {
259259 dev_err(dev, "failed to get apps-usb path: %ld\n",
260260 PTR_ERR(qcom->icc_path_apps));
261
- return PTR_ERR(qcom->icc_path_apps);
261
+ ret = PTR_ERR(qcom->icc_path_apps);
262
+ goto put_path_ddr;
262263 }
263264
264265 if (usb_get_maximum_speed(&qcom->dwc3->dev) >= USB_SPEED_SUPER ||
....@@ -271,17 +272,23 @@
271272
272273 if (ret) {
273274 dev_err(dev, "failed to set bandwidth for usb-ddr path: %d\n", ret);
274
- return ret;
275
+ goto put_path_apps;
275276 }
276277
277278 ret = icc_set_bw(qcom->icc_path_apps,
278279 APPS_USB_AVG_BW, APPS_USB_PEAK_BW);
279280 if (ret) {
280281 dev_err(dev, "failed to set bandwidth for apps-usb path: %d\n", ret);
281
- return ret;
282
+ goto put_path_apps;
282283 }
283284
284285 return 0;
286
+
287
+put_path_apps:
288
+ icc_put(qcom->icc_path_apps);
289
+put_path_ddr:
290
+ icc_put(qcom->icc_path_ddr);
291
+ return ret;
285292 }
286293
287294 /**
....@@ -299,7 +306,16 @@
299306 /* Only usable in contexts where the role can not change. */
300307 static bool dwc3_qcom_is_host(struct dwc3_qcom *qcom)
301308 {
302
- struct dwc3 *dwc = platform_get_drvdata(qcom->dwc3);
309
+ struct dwc3 *dwc;
310
+
311
+ /*
312
+ * FIXME: Fix this layering violation.
313
+ */
314
+ dwc = platform_get_drvdata(qcom->dwc3);
315
+
316
+ /* Core driver may not have probed yet. */
317
+ if (!dwc)
318
+ return false;
303319
304320 return dwc->xhci;
305321 }
....@@ -715,6 +731,7 @@
715731 struct device *dev = &pdev->dev;
716732 struct dwc3_qcom *qcom;
717733 struct resource *res, *parent_res = NULL;
734
+ struct resource local_res;
718735 int ret, i;
719736 bool ignore_pipe_clk;
720737
....@@ -765,9 +782,8 @@
765782 if (np) {
766783 parent_res = res;
767784 } else {
768
- parent_res = kmemdup(res, sizeof(struct resource), GFP_KERNEL);
769
- if (!parent_res)
770
- return -ENOMEM;
785
+ memcpy(&local_res, res, sizeof(struct resource));
786
+ parent_res = &local_res;
771787
772788 parent_res->start = res->start +
773789 qcom->acpi_pdata->qscratch_base_offset;
....@@ -779,9 +795,10 @@
779795 if (IS_ERR_OR_NULL(qcom->urs_usb)) {
780796 dev_err(dev, "failed to create URS USB platdev\n");
781797 if (!qcom->urs_usb)
782
- return -ENODEV;
798
+ ret = -ENODEV;
783799 else
784
- return PTR_ERR(qcom->urs_usb);
800
+ ret = PTR_ERR(qcom->urs_usb);
801
+ goto clk_disable;
785802 }
786803 }
787804 }
....@@ -825,8 +842,8 @@
825842 qcom->mode = usb_get_dr_mode(&qcom->dwc3->dev);
826843
827844 /* enable vbus override for device mode */
828
- if (qcom->mode == USB_DR_MODE_PERIPHERAL)
829
- dwc3_qcom_vbus_overrride_enable(qcom, true);
845
+ if (qcom->mode != USB_DR_MODE_HOST)
846
+ dwc3_qcom_vbus_override_enable(qcom, true);
830847
831848 /* register extcon to override sw_vbus on Vbus change later */
832849 ret = dwc3_qcom_register_extcon(qcom);
....@@ -862,10 +879,14 @@
862879 static int dwc3_qcom_remove(struct platform_device *pdev)
863880 {
864881 struct dwc3_qcom *qcom = platform_get_drvdata(pdev);
882
+ struct device_node *np = pdev->dev.of_node;
865883 struct device *dev = &pdev->dev;
866884 int i;
867885
868
- of_platform_depopulate(dev);
886
+ if (np)
887
+ of_platform_depopulate(&pdev->dev);
888
+ else
889
+ platform_device_put(pdev);
869890
870891 for (i = qcom->num_clocks - 1; i >= 0; i--) {
871892 clk_disable_unprepare(qcom->clks[i]);