.. | .. |
---|
115 | 115 | readl(base + offset); |
---|
116 | 116 | } |
---|
117 | 117 | |
---|
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) |
---|
119 | 119 | { |
---|
120 | 120 | if (enable) { |
---|
121 | 121 | dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_SS_PHY_CTRL, |
---|
.. | .. |
---|
136 | 136 | struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, vbus_nb); |
---|
137 | 137 | |
---|
138 | 138 | /* enable vbus override for device mode */ |
---|
139 | | - dwc3_qcom_vbus_overrride_enable(qcom, event); |
---|
| 139 | + dwc3_qcom_vbus_override_enable(qcom, event); |
---|
140 | 140 | qcom->mode = event ? USB_DR_MODE_PERIPHERAL : USB_DR_MODE_HOST; |
---|
141 | 141 | |
---|
142 | 142 | return NOTIFY_DONE; |
---|
.. | .. |
---|
148 | 148 | struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, host_nb); |
---|
149 | 149 | |
---|
150 | 150 | /* disable vbus override in host mode */ |
---|
151 | | - dwc3_qcom_vbus_overrride_enable(qcom, !event); |
---|
| 151 | + dwc3_qcom_vbus_override_enable(qcom, !event); |
---|
152 | 152 | qcom->mode = event ? USB_DR_MODE_HOST : USB_DR_MODE_PERIPHERAL; |
---|
153 | 153 | |
---|
154 | 154 | return NOTIFY_DONE; |
---|
.. | .. |
---|
258 | 258 | if (IS_ERR(qcom->icc_path_apps)) { |
---|
259 | 259 | dev_err(dev, "failed to get apps-usb path: %ld\n", |
---|
260 | 260 | 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; |
---|
262 | 263 | } |
---|
263 | 264 | |
---|
264 | 265 | if (usb_get_maximum_speed(&qcom->dwc3->dev) >= USB_SPEED_SUPER || |
---|
.. | .. |
---|
271 | 272 | |
---|
272 | 273 | if (ret) { |
---|
273 | 274 | dev_err(dev, "failed to set bandwidth for usb-ddr path: %d\n", ret); |
---|
274 | | - return ret; |
---|
| 275 | + goto put_path_apps; |
---|
275 | 276 | } |
---|
276 | 277 | |
---|
277 | 278 | ret = icc_set_bw(qcom->icc_path_apps, |
---|
278 | 279 | APPS_USB_AVG_BW, APPS_USB_PEAK_BW); |
---|
279 | 280 | if (ret) { |
---|
280 | 281 | dev_err(dev, "failed to set bandwidth for apps-usb path: %d\n", ret); |
---|
281 | | - return ret; |
---|
| 282 | + goto put_path_apps; |
---|
282 | 283 | } |
---|
283 | 284 | |
---|
284 | 285 | 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; |
---|
285 | 292 | } |
---|
286 | 293 | |
---|
287 | 294 | /** |
---|
.. | .. |
---|
299 | 306 | /* Only usable in contexts where the role can not change. */ |
---|
300 | 307 | static bool dwc3_qcom_is_host(struct dwc3_qcom *qcom) |
---|
301 | 308 | { |
---|
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; |
---|
303 | 319 | |
---|
304 | 320 | return dwc->xhci; |
---|
305 | 321 | } |
---|
.. | .. |
---|
715 | 731 | struct device *dev = &pdev->dev; |
---|
716 | 732 | struct dwc3_qcom *qcom; |
---|
717 | 733 | struct resource *res, *parent_res = NULL; |
---|
| 734 | + struct resource local_res; |
---|
718 | 735 | int ret, i; |
---|
719 | 736 | bool ignore_pipe_clk; |
---|
720 | 737 | |
---|
.. | .. |
---|
765 | 782 | if (np) { |
---|
766 | 783 | parent_res = res; |
---|
767 | 784 | } 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; |
---|
771 | 787 | |
---|
772 | 788 | parent_res->start = res->start + |
---|
773 | 789 | qcom->acpi_pdata->qscratch_base_offset; |
---|
.. | .. |
---|
779 | 795 | if (IS_ERR_OR_NULL(qcom->urs_usb)) { |
---|
780 | 796 | dev_err(dev, "failed to create URS USB platdev\n"); |
---|
781 | 797 | if (!qcom->urs_usb) |
---|
782 | | - return -ENODEV; |
---|
| 798 | + ret = -ENODEV; |
---|
783 | 799 | else |
---|
784 | | - return PTR_ERR(qcom->urs_usb); |
---|
| 800 | + ret = PTR_ERR(qcom->urs_usb); |
---|
| 801 | + goto clk_disable; |
---|
785 | 802 | } |
---|
786 | 803 | } |
---|
787 | 804 | } |
---|
.. | .. |
---|
825 | 842 | qcom->mode = usb_get_dr_mode(&qcom->dwc3->dev); |
---|
826 | 843 | |
---|
827 | 844 | /* 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); |
---|
830 | 847 | |
---|
831 | 848 | /* register extcon to override sw_vbus on Vbus change later */ |
---|
832 | 849 | ret = dwc3_qcom_register_extcon(qcom); |
---|
.. | .. |
---|
862 | 879 | static int dwc3_qcom_remove(struct platform_device *pdev) |
---|
863 | 880 | { |
---|
864 | 881 | struct dwc3_qcom *qcom = platform_get_drvdata(pdev); |
---|
| 882 | + struct device_node *np = pdev->dev.of_node; |
---|
865 | 883 | struct device *dev = &pdev->dev; |
---|
866 | 884 | int i; |
---|
867 | 885 | |
---|
868 | | - of_platform_depopulate(dev); |
---|
| 886 | + if (np) |
---|
| 887 | + of_platform_depopulate(&pdev->dev); |
---|
| 888 | + else |
---|
| 889 | + platform_device_put(pdev); |
---|
869 | 890 | |
---|
870 | 891 | for (i = qcom->num_clocks - 1; i >= 0; i--) { |
---|
871 | 892 | clk_disable_unprepare(qcom->clks[i]); |
---|