Lines Matching full:qcom

119 static void dwc3_qcom_vbus_override_enable(struct dwc3_qcom *qcom, bool enable)  in dwc3_qcom_vbus_override_enable()  argument
122 dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_SS_PHY_CTRL, in dwc3_qcom_vbus_override_enable()
124 dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_HS_PHY_CTRL, in dwc3_qcom_vbus_override_enable()
127 dwc3_qcom_clrbits(qcom->qscratch_base, QSCRATCH_SS_PHY_CTRL, in dwc3_qcom_vbus_override_enable()
129 dwc3_qcom_clrbits(qcom->qscratch_base, QSCRATCH_HS_PHY_CTRL, in dwc3_qcom_vbus_override_enable()
137 struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, vbus_nb); in dwc3_qcom_vbus_notifier() local
140 dwc3_qcom_vbus_override_enable(qcom, event); in dwc3_qcom_vbus_notifier()
141 qcom->mode = event ? USB_DR_MODE_PERIPHERAL : USB_DR_MODE_HOST; in dwc3_qcom_vbus_notifier()
149 struct dwc3_qcom *qcom = container_of(nb, struct dwc3_qcom, host_nb); in dwc3_qcom_host_notifier() local
152 dwc3_qcom_vbus_override_enable(qcom, !event); in dwc3_qcom_host_notifier()
153 qcom->mode = event ? USB_DR_MODE_HOST : USB_DR_MODE_PERIPHERAL; in dwc3_qcom_host_notifier()
158 static int dwc3_qcom_register_extcon(struct dwc3_qcom *qcom) in dwc3_qcom_register_extcon() argument
160 struct device *dev = qcom->dev; in dwc3_qcom_register_extcon()
167 qcom->edev = extcon_get_edev_by_phandle(dev, 0); in dwc3_qcom_register_extcon()
168 if (IS_ERR(qcom->edev)) in dwc3_qcom_register_extcon()
169 return dev_err_probe(dev, PTR_ERR(qcom->edev), in dwc3_qcom_register_extcon()
172 qcom->vbus_nb.notifier_call = dwc3_qcom_vbus_notifier; in dwc3_qcom_register_extcon()
174 qcom->host_edev = extcon_get_edev_by_phandle(dev, 1); in dwc3_qcom_register_extcon()
175 if (IS_ERR(qcom->host_edev)) in dwc3_qcom_register_extcon()
176 qcom->host_edev = NULL; in dwc3_qcom_register_extcon()
178 ret = devm_extcon_register_notifier(dev, qcom->edev, EXTCON_USB, in dwc3_qcom_register_extcon()
179 &qcom->vbus_nb); in dwc3_qcom_register_extcon()
185 if (qcom->host_edev) in dwc3_qcom_register_extcon()
186 host_edev = qcom->host_edev; in dwc3_qcom_register_extcon()
188 host_edev = qcom->edev; in dwc3_qcom_register_extcon()
190 qcom->host_nb.notifier_call = dwc3_qcom_host_notifier; in dwc3_qcom_register_extcon()
192 &qcom->host_nb); in dwc3_qcom_register_extcon()
199 if (extcon_get_state(qcom->edev, EXTCON_USB) || in dwc3_qcom_register_extcon()
201 dwc3_qcom_vbus_notifier(&qcom->vbus_nb, true, qcom->edev); in dwc3_qcom_register_extcon()
203 dwc3_qcom_vbus_notifier(&qcom->vbus_nb, false, qcom->edev); in dwc3_qcom_register_extcon()
208 static int dwc3_qcom_interconnect_enable(struct dwc3_qcom *qcom) in dwc3_qcom_interconnect_enable() argument
212 ret = icc_enable(qcom->icc_path_ddr); in dwc3_qcom_interconnect_enable()
216 ret = icc_enable(qcom->icc_path_apps); in dwc3_qcom_interconnect_enable()
218 icc_disable(qcom->icc_path_ddr); in dwc3_qcom_interconnect_enable()
223 static int dwc3_qcom_interconnect_disable(struct dwc3_qcom *qcom) in dwc3_qcom_interconnect_disable() argument
227 ret = icc_disable(qcom->icc_path_ddr); in dwc3_qcom_interconnect_disable()
231 ret = icc_disable(qcom->icc_path_apps); in dwc3_qcom_interconnect_disable()
233 icc_enable(qcom->icc_path_ddr); in dwc3_qcom_interconnect_disable()
241 * @qcom: Pointer to the concerned usb core.
244 static int dwc3_qcom_interconnect_init(struct dwc3_qcom *qcom) in dwc3_qcom_interconnect_init() argument
247 struct device *dev = qcom->dev; in dwc3_qcom_interconnect_init()
250 qcom->icc_path_ddr = of_icc_get(dev, "usb-ddr"); in dwc3_qcom_interconnect_init()
251 if (IS_ERR(qcom->icc_path_ddr)) { in dwc3_qcom_interconnect_init()
252 return dev_err_probe(dev, PTR_ERR(qcom->icc_path_ddr), in dwc3_qcom_interconnect_init()
256 qcom->icc_path_apps = of_icc_get(dev, "apps-usb"); in dwc3_qcom_interconnect_init()
257 if (IS_ERR(qcom->icc_path_apps)) { in dwc3_qcom_interconnect_init()
258 ret = dev_err_probe(dev, PTR_ERR(qcom->icc_path_apps), in dwc3_qcom_interconnect_init()
263 max_speed = usb_get_maximum_speed(&qcom->dwc3->dev); in dwc3_qcom_interconnect_init()
265 ret = icc_set_bw(qcom->icc_path_ddr, in dwc3_qcom_interconnect_init()
268 ret = icc_set_bw(qcom->icc_path_ddr, in dwc3_qcom_interconnect_init()
276 ret = icc_set_bw(qcom->icc_path_apps, APPS_USB_AVG_BW, APPS_USB_PEAK_BW); in dwc3_qcom_interconnect_init()
285 icc_put(qcom->icc_path_apps); in dwc3_qcom_interconnect_init()
287 icc_put(qcom->icc_path_ddr); in dwc3_qcom_interconnect_init()
293 * @qcom: Pointer to the concerned usb core.
297 static void dwc3_qcom_interconnect_exit(struct dwc3_qcom *qcom) in dwc3_qcom_interconnect_exit() argument
299 icc_put(qcom->icc_path_ddr); in dwc3_qcom_interconnect_exit()
300 icc_put(qcom->icc_path_apps); in dwc3_qcom_interconnect_exit()
304 static bool dwc3_qcom_is_host(struct dwc3_qcom *qcom) in dwc3_qcom_is_host() argument
311 dwc = platform_get_drvdata(qcom->dwc3); in dwc3_qcom_is_host()
320 static enum usb_device_speed dwc3_qcom_read_usb2_speed(struct dwc3_qcom *qcom, int port_index) in dwc3_qcom_read_usb2_speed() argument
322 struct dwc3 *dwc = platform_get_drvdata(qcom->dwc3); in dwc3_qcom_read_usb2_speed()
410 static void dwc3_qcom_disable_interrupts(struct dwc3_qcom *qcom) in dwc3_qcom_disable_interrupts() argument
414 for (i = 0; i < qcom->num_ports; i++) in dwc3_qcom_disable_interrupts()
415 dwc3_qcom_disable_port_interrupts(&qcom->ports[i]); in dwc3_qcom_disable_interrupts()
418 static void dwc3_qcom_enable_interrupts(struct dwc3_qcom *qcom) in dwc3_qcom_enable_interrupts() argument
422 for (i = 0; i < qcom->num_ports; i++) in dwc3_qcom_enable_interrupts()
423 dwc3_qcom_enable_port_interrupts(&qcom->ports[i]); in dwc3_qcom_enable_interrupts()
426 static int dwc3_qcom_suspend(struct dwc3_qcom *qcom, bool wakeup) in dwc3_qcom_suspend() argument
431 if (qcom->is_suspended) in dwc3_qcom_suspend()
434 for (i = 0; i < qcom->num_ports; i++) { in dwc3_qcom_suspend()
435 val = readl(qcom->qscratch_base + pwr_evnt_irq_stat_reg[i]); in dwc3_qcom_suspend()
437 dev_err(qcom->dev, "port-%d HS-PHY not in L2\n", i + 1); in dwc3_qcom_suspend()
440 for (i = qcom->num_clocks - 1; i >= 0; i--) in dwc3_qcom_suspend()
441 clk_disable_unprepare(qcom->clks[i]); in dwc3_qcom_suspend()
443 ret = dwc3_qcom_interconnect_disable(qcom); in dwc3_qcom_suspend()
445 dev_warn(qcom->dev, "failed to disable interconnect: %d\n", ret); in dwc3_qcom_suspend()
451 if (dwc3_qcom_is_host(qcom) && wakeup) { in dwc3_qcom_suspend()
452 for (i = 0; i < qcom->num_ports; i++) in dwc3_qcom_suspend()
453 qcom->ports[i].usb2_speed = dwc3_qcom_read_usb2_speed(qcom, i); in dwc3_qcom_suspend()
454 dwc3_qcom_enable_interrupts(qcom); in dwc3_qcom_suspend()
457 qcom->is_suspended = true; in dwc3_qcom_suspend()
462 static int dwc3_qcom_resume(struct dwc3_qcom *qcom, bool wakeup) in dwc3_qcom_resume() argument
467 if (!qcom->is_suspended) in dwc3_qcom_resume()
470 if (dwc3_qcom_is_host(qcom) && wakeup) in dwc3_qcom_resume()
471 dwc3_qcom_disable_interrupts(qcom); in dwc3_qcom_resume()
473 for (i = 0; i < qcom->num_clocks; i++) { in dwc3_qcom_resume()
474 ret = clk_prepare_enable(qcom->clks[i]); in dwc3_qcom_resume()
477 clk_disable_unprepare(qcom->clks[i]); in dwc3_qcom_resume()
482 ret = dwc3_qcom_interconnect_enable(qcom); in dwc3_qcom_resume()
484 dev_warn(qcom->dev, "failed to enable interconnect: %d\n", ret); in dwc3_qcom_resume()
487 for (i = 0; i < qcom->num_ports; i++) { in dwc3_qcom_resume()
488 dwc3_qcom_setbits(qcom->qscratch_base, in dwc3_qcom_resume()
493 qcom->is_suspended = false; in dwc3_qcom_resume()
500 struct dwc3_qcom *qcom = data; in qcom_dwc3_resume_irq() local
501 struct dwc3 *dwc = platform_get_drvdata(qcom->dwc3); in qcom_dwc3_resume_irq()
504 if (qcom->pm_suspended) in qcom_dwc3_resume_irq()
511 if (dwc3_qcom_is_host(qcom)) in qcom_dwc3_resume_irq()
517 static void dwc3_qcom_select_utmi_clk(struct dwc3_qcom *qcom) in dwc3_qcom_select_utmi_clk() argument
520 dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_GENERAL_CFG, in dwc3_qcom_select_utmi_clk()
525 dwc3_qcom_setbits(qcom->qscratch_base, QSCRATCH_GENERAL_CFG, in dwc3_qcom_select_utmi_clk()
530 dwc3_qcom_clrbits(qcom->qscratch_base, QSCRATCH_GENERAL_CFG, in dwc3_qcom_select_utmi_clk()
534 static int dwc3_qcom_request_irq(struct dwc3_qcom *qcom, int irq, in dwc3_qcom_request_irq() argument
540 ret = devm_request_threaded_irq(qcom->dev, irq, NULL, in dwc3_qcom_request_irq()
543 name, qcom); in dwc3_qcom_request_irq()
545 dev_err(qcom->dev, "failed to request irq %s: %d\n", name, ret); in dwc3_qcom_request_irq()
552 struct dwc3_qcom *qcom = platform_get_drvdata(pdev); in dwc3_qcom_setup_port_irq() local
566 ret = dwc3_qcom_request_irq(qcom, irq, irq_name); in dwc3_qcom_setup_port_irq()
569 qcom->ports[port_index].dp_hs_phy_irq = irq; in dwc3_qcom_setup_port_irq()
581 ret = dwc3_qcom_request_irq(qcom, irq, irq_name); in dwc3_qcom_setup_port_irq()
584 qcom->ports[port_index].dm_hs_phy_irq = irq; in dwc3_qcom_setup_port_irq()
596 ret = dwc3_qcom_request_irq(qcom, irq, irq_name); in dwc3_qcom_setup_port_irq()
599 qcom->ports[port_index].ss_phy_irq = irq; in dwc3_qcom_setup_port_irq()
607 ret = dwc3_qcom_request_irq(qcom, irq, "qusb2_phy"); in dwc3_qcom_setup_port_irq()
610 qcom->ports[port_index].qusb2_phy_irq = irq; in dwc3_qcom_setup_port_irq()
639 struct dwc3_qcom *qcom = platform_get_drvdata(pdev); in dwc3_qcom_setup_irq() local
644 qcom->num_ports = dwc3_qcom_find_num_ports(pdev); in dwc3_qcom_setup_irq()
645 is_multiport = (qcom->num_ports > 1); in dwc3_qcom_setup_irq()
647 for (i = 0; i < qcom->num_ports; i++) { in dwc3_qcom_setup_irq()
656 static int dwc3_qcom_clk_init(struct dwc3_qcom *qcom, int count) in dwc3_qcom_clk_init() argument
658 struct device *dev = qcom->dev; in dwc3_qcom_clk_init()
668 qcom->num_clocks = count; in dwc3_qcom_clk_init()
670 qcom->clks = devm_kcalloc(dev, qcom->num_clocks, in dwc3_qcom_clk_init()
672 if (!qcom->clks) in dwc3_qcom_clk_init()
675 for (i = 0; i < qcom->num_clocks; i++) { in dwc3_qcom_clk_init()
682 clk_put(qcom->clks[i]); in dwc3_qcom_clk_init()
689 clk_disable_unprepare(qcom->clks[i]); in dwc3_qcom_clk_init()
690 clk_put(qcom->clks[i]); in dwc3_qcom_clk_init()
697 qcom->clks[i] = clk; in dwc3_qcom_clk_init()
705 struct dwc3_qcom *qcom = platform_get_drvdata(pdev); in dwc3_qcom_of_register_core() local
723 qcom->dwc3 = of_find_device_by_node(dwc3_np); in dwc3_qcom_of_register_core()
724 if (!qcom->dwc3) { in dwc3_qcom_of_register_core()
737 struct dwc3_qcom *qcom; in dwc3_qcom_probe() local
742 qcom = devm_kzalloc(&pdev->dev, sizeof(*qcom), GFP_KERNEL); in dwc3_qcom_probe()
743 if (!qcom) in dwc3_qcom_probe()
746 platform_set_drvdata(pdev, qcom); in dwc3_qcom_probe()
747 qcom->dev = &pdev->dev; in dwc3_qcom_probe()
749 qcom->resets = devm_reset_control_array_get_optional_exclusive(dev); in dwc3_qcom_probe()
750 if (IS_ERR(qcom->resets)) { in dwc3_qcom_probe()
751 return dev_err_probe(&pdev->dev, PTR_ERR(qcom->resets), in dwc3_qcom_probe()
755 ret = reset_control_assert(qcom->resets); in dwc3_qcom_probe()
763 ret = reset_control_deassert(qcom->resets); in dwc3_qcom_probe()
769 ret = dwc3_qcom_clk_init(qcom, of_clk_get_parent_count(np)); in dwc3_qcom_probe()
775 qcom->qscratch_base = devm_platform_ioremap_resource(pdev, 0); in dwc3_qcom_probe()
776 if (IS_ERR(qcom->qscratch_base)) { in dwc3_qcom_probe()
777 ret = PTR_ERR(qcom->qscratch_base); in dwc3_qcom_probe()
792 "qcom,select-utmi-as-pipe-clk"); in dwc3_qcom_probe()
794 dwc3_qcom_select_utmi_clk(qcom); in dwc3_qcom_probe()
802 ret = dwc3_qcom_interconnect_init(qcom); in dwc3_qcom_probe()
806 qcom->mode = usb_get_dr_mode(&qcom->dwc3->dev); in dwc3_qcom_probe()
809 if (qcom->mode != USB_DR_MODE_HOST) in dwc3_qcom_probe()
810 dwc3_qcom_vbus_override_enable(qcom, true); in dwc3_qcom_probe()
813 ret = dwc3_qcom_register_extcon(qcom); in dwc3_qcom_probe()
819 device_init_wakeup(&qcom->dwc3->dev, wakeup_source); in dwc3_qcom_probe()
821 qcom->is_suspended = false; in dwc3_qcom_probe()
829 dwc3_qcom_interconnect_exit(qcom); in dwc3_qcom_probe()
832 platform_device_put(qcom->dwc3); in dwc3_qcom_probe()
834 for (i = qcom->num_clocks - 1; i >= 0; i--) { in dwc3_qcom_probe()
835 clk_disable_unprepare(qcom->clks[i]); in dwc3_qcom_probe()
836 clk_put(qcom->clks[i]); in dwc3_qcom_probe()
839 reset_control_assert(qcom->resets); in dwc3_qcom_probe()
846 struct dwc3_qcom *qcom = platform_get_drvdata(pdev); in dwc3_qcom_remove() local
851 platform_device_put(qcom->dwc3); in dwc3_qcom_remove()
853 for (i = qcom->num_clocks - 1; i >= 0; i--) { in dwc3_qcom_remove()
854 clk_disable_unprepare(qcom->clks[i]); in dwc3_qcom_remove()
855 clk_put(qcom->clks[i]); in dwc3_qcom_remove()
857 qcom->num_clocks = 0; in dwc3_qcom_remove()
859 dwc3_qcom_interconnect_exit(qcom); in dwc3_qcom_remove()
860 reset_control_assert(qcom->resets); in dwc3_qcom_remove()
868 struct dwc3_qcom *qcom = dev_get_drvdata(dev); in dwc3_qcom_pm_suspend() local
872 ret = dwc3_qcom_suspend(qcom, wakeup); in dwc3_qcom_pm_suspend()
876 qcom->pm_suspended = true; in dwc3_qcom_pm_suspend()
883 struct dwc3_qcom *qcom = dev_get_drvdata(dev); in dwc3_qcom_pm_resume() local
887 ret = dwc3_qcom_resume(qcom, wakeup); in dwc3_qcom_pm_resume()
891 qcom->pm_suspended = false; in dwc3_qcom_pm_resume()
898 struct dwc3_qcom *qcom = dev_get_drvdata(dev); in dwc3_qcom_runtime_suspend() local
900 return dwc3_qcom_suspend(qcom, true); in dwc3_qcom_runtime_suspend()
905 struct dwc3_qcom *qcom = dev_get_drvdata(dev); in dwc3_qcom_runtime_resume() local
907 return dwc3_qcom_resume(qcom, true); in dwc3_qcom_runtime_resume()
917 { .compatible = "qcom,dwc3" },
926 .name = "dwc3-qcom",
935 MODULE_DESCRIPTION("DesignWare DWC3 QCOM Glue Driver");