| .. | .. |
|---|
| 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]); |
|---|