Lines Matching +full:imx23 +full:- +full:usbphy

1 // SPDX-License-Identifier: GPL-2.0+
82 { .compatible = "fsl,imx23-usb", .data = &imx23_usb_data},
83 { .compatible = "fsl,imx28-usb", .data = &imx28_usb_data},
84 { .compatible = "fsl,imx27-usb", .data = &imx27_usb_data},
85 { .compatible = "fsl,imx6q-usb", .data = &imx6q_usb_data},
86 { .compatible = "fsl,imx6sl-usb", .data = &imx6sl_usb_data},
87 { .compatible = "fsl,imx6sx-usb", .data = &imx6sx_usb_data},
88 { .compatible = "fsl,imx6ul-usb", .data = &imx6ul_usb_data},
89 { .compatible = "fsl,imx7d-usb", .data = &imx7d_usb_data},
90 { .compatible = "fsl,imx7ulp-usb", .data = &imx7ulp_usb_data},
91 { .compatible = "fsl,imx8ulp-usb", .data = &imx8ulp_usb_data},
109 /* SoC before i.mx6 (except imx23/imx28) needs three clks */
114 /* --------------------------------- */
124 struct device_node *np = dev->of_node; in usbmisc_get_init_data()
138 return ERR_PTR(-ENOMEM); in usbmisc_get_init_data()
140 ret = of_parse_phandle_with_args(np, "fsl,usbmisc", "#index-cells", in usbmisc_get_init_data()
148 data->index = args.args[0]; in usbmisc_get_init_data()
154 return ERR_PTR(-EPROBE_DEFER); in usbmisc_get_init_data()
157 put_device(&misc_pdev->dev); in usbmisc_get_init_data()
158 return ERR_PTR(-EPROBE_DEFER); in usbmisc_get_init_data()
160 data->dev = &misc_pdev->dev; in usbmisc_get_init_data()
166 if (of_property_read_bool(np, "disable-over-current")) { in usbmisc_get_init_data()
167 data->disable_oc = 1; in usbmisc_get_init_data()
168 } else if (of_property_read_bool(np, "over-current-active-high")) { in usbmisc_get_init_data()
169 data->oc_pol_active_low = 0; in usbmisc_get_init_data()
170 data->oc_pol_configured = 1; in usbmisc_get_init_data()
171 } else if (of_property_read_bool(np, "over-current-active-low")) { in usbmisc_get_init_data()
172 data->oc_pol_active_low = 1; in usbmisc_get_init_data()
173 data->oc_pol_configured = 1; in usbmisc_get_init_data()
178 data->pwr_pol = of_property_read_bool(np, "power-active-high"); in usbmisc_get_init_data()
179 data->evdo = of_property_read_bool(np, "external-vbus-divider"); in usbmisc_get_init_data()
182 data->ulpi = 1; in usbmisc_get_init_data()
184 if (of_property_read_u32(np, "samsung,picophy-pre-emp-curr-control", in usbmisc_get_init_data()
185 &data->emp_curr_control)) in usbmisc_get_init_data()
186 data->emp_curr_control = -1; in usbmisc_get_init_data()
187 if (of_property_read_u32(np, "samsung,picophy-dc-vol-level-adjust", in usbmisc_get_init_data()
188 &data->dc_vol_level_adjust)) in usbmisc_get_init_data()
189 data->dc_vol_level_adjust = -1; in usbmisc_get_init_data()
190 if (of_property_read_u32(np, "fsl,picophy-rise-fall-time-adjust", in usbmisc_get_init_data()
191 &data->rise_fall_time_adjust)) in usbmisc_get_init_data()
192 data->rise_fall_time_adjust = -1; in usbmisc_get_init_data()
203 data->clk_ipg = devm_clk_get(dev, "ipg"); in imx_get_clks()
204 if (IS_ERR(data->clk_ipg)) { in imx_get_clks()
206 data->clk = devm_clk_get(dev, NULL); in imx_get_clks()
207 if (IS_ERR(data->clk)) { in imx_get_clks()
208 ret = PTR_ERR(data->clk); in imx_get_clks()
211 PTR_ERR(data->clk), PTR_ERR(data->clk_ipg)); in imx_get_clks()
217 data->clk_wakeup = devm_clk_get_optional(dev, "usb_wakeup"); in imx_get_clks()
218 if (IS_ERR(data->clk_wakeup)) in imx_get_clks()
219 ret = dev_err_probe(dev, PTR_ERR(data->clk_wakeup), in imx_get_clks()
224 data->clk_ahb = devm_clk_get(dev, "ahb"); in imx_get_clks()
225 if (IS_ERR(data->clk_ahb)) { in imx_get_clks()
226 ret = PTR_ERR(data->clk_ahb); in imx_get_clks()
232 data->clk_per = devm_clk_get(dev, "per"); in imx_get_clks()
233 if (IS_ERR(data->clk_per)) { in imx_get_clks()
234 ret = PTR_ERR(data->clk_per); in imx_get_clks()
240 data->need_three_clks = true; in imx_get_clks()
249 if (data->need_three_clks) { in imx_prepare_enable_clks()
250 ret = clk_prepare_enable(data->clk_ipg); in imx_prepare_enable_clks()
258 ret = clk_prepare_enable(data->clk_ahb); in imx_prepare_enable_clks()
263 clk_disable_unprepare(data->clk_ipg); in imx_prepare_enable_clks()
267 ret = clk_prepare_enable(data->clk_per); in imx_prepare_enable_clks()
272 clk_disable_unprepare(data->clk_ahb); in imx_prepare_enable_clks()
273 clk_disable_unprepare(data->clk_ipg); in imx_prepare_enable_clks()
277 ret = clk_prepare_enable(data->clk); in imx_prepare_enable_clks()
293 if (data->need_three_clks) { in imx_disable_unprepare_clks()
294 clk_disable_unprepare(data->clk_per); in imx_disable_unprepare_clks()
295 clk_disable_unprepare(data->clk_ahb); in imx_disable_unprepare_clks()
296 clk_disable_unprepare(data->clk_ipg); in imx_disable_unprepare_clks()
298 clk_disable_unprepare(data->clk); in imx_disable_unprepare_clks()
304 struct device *dev = ci->dev->parent; in ci_hdrc_imx_notify_event()
307 struct imx_usbmisc_data *mdata = data->usbmisc_data; in ci_hdrc_imx_notify_event()
311 if (data->pinctrl) { in ci_hdrc_imx_notify_event()
312 ret = pinctrl_select_state(data->pinctrl, in ci_hdrc_imx_notify_event()
313 data->pinctrl_hsic_active); in ci_hdrc_imx_notify_event()
327 if (ci->vbus_active) in ci_hdrc_imx_notify_event()
331 if (ci->usb_phy) in ci_hdrc_imx_notify_event()
332 schedule_work(&ci->usb_phy->chg_work); in ci_hdrc_imx_notify_event()
346 pm_runtime_resume(&imx_data->ci_pdev->dev); in ci_wakeup_irq_handler()
355 regulator_disable(data->hsic_pad_regulator); in ci_hdrc_imx_disable_regulator()
362 .name = dev_name(&pdev->dev), in ci_hdrc_imx_probe()
369 struct device_node *np = pdev->dev.of_node; in ci_hdrc_imx_probe()
370 struct device *dev = &pdev->dev; in ci_hdrc_imx_probe()
372 imx_platform_flag = of_device_get_match_data(&pdev->dev); in ci_hdrc_imx_probe()
374 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in ci_hdrc_imx_probe()
376 return -ENOMEM; in ci_hdrc_imx_probe()
378 data->plat_data = imx_platform_flag; in ci_hdrc_imx_probe()
379 pdata.flags |= imx_platform_flag->flags; in ci_hdrc_imx_probe()
381 data->usbmisc_data = usbmisc_get_init_data(dev); in ci_hdrc_imx_probe()
382 if (IS_ERR(data->usbmisc_data)) in ci_hdrc_imx_probe()
383 return PTR_ERR(data->usbmisc_data); in ci_hdrc_imx_probe()
385 if ((of_usb_get_phy_mode(dev->of_node) == USBPHY_INTERFACE_MODE_HSIC) in ci_hdrc_imx_probe()
386 && data->usbmisc_data) { in ci_hdrc_imx_probe()
388 data->usbmisc_data->hsic = 1; in ci_hdrc_imx_probe()
389 data->pinctrl = devm_pinctrl_get(dev); in ci_hdrc_imx_probe()
390 if (PTR_ERR(data->pinctrl) == -ENODEV) in ci_hdrc_imx_probe()
391 data->pinctrl = NULL; in ci_hdrc_imx_probe()
392 else if (IS_ERR(data->pinctrl)) { in ci_hdrc_imx_probe()
393 ret = dev_err_probe(dev, PTR_ERR(data->pinctrl), in ci_hdrc_imx_probe()
398 data->hsic_pad_regulator = in ci_hdrc_imx_probe()
400 if (PTR_ERR(data->hsic_pad_regulator) == -ENODEV) { in ci_hdrc_imx_probe()
402 data->hsic_pad_regulator = NULL; in ci_hdrc_imx_probe()
403 } else if (IS_ERR(data->hsic_pad_regulator)) { in ci_hdrc_imx_probe()
404 ret = dev_err_probe(dev, PTR_ERR(data->hsic_pad_regulator), in ci_hdrc_imx_probe()
409 if (data->hsic_pad_regulator) { in ci_hdrc_imx_probe()
410 ret = regulator_enable(data->hsic_pad_regulator); in ci_hdrc_imx_probe()
427 if (data->pinctrl) { in ci_hdrc_imx_probe()
430 pinctrl_hsic_idle = pinctrl_lookup_state(data->pinctrl, "idle"); in ci_hdrc_imx_probe()
439 ret = pinctrl_select_state(data->pinctrl, pinctrl_hsic_idle); in ci_hdrc_imx_probe()
445 data->pinctrl_hsic_active = pinctrl_lookup_state(data->pinctrl, in ci_hdrc_imx_probe()
447 if (IS_ERR(data->pinctrl_hsic_active)) { in ci_hdrc_imx_probe()
450 PTR_ERR(data->pinctrl_hsic_active)); in ci_hdrc_imx_probe()
451 ret = PTR_ERR(data->pinctrl_hsic_active); in ci_hdrc_imx_probe()
457 cpu_latency_qos_add_request(&data->pm_qos_req, 0); in ci_hdrc_imx_probe()
467 ret = clk_prepare_enable(data->clk_wakeup); in ci_hdrc_imx_probe()
471 data->phy = devm_usb_get_phy_by_phandle(dev, "fsl,usbphy", 0); in ci_hdrc_imx_probe()
472 if (IS_ERR(data->phy)) { in ci_hdrc_imx_probe()
473 ret = PTR_ERR(data->phy); in ci_hdrc_imx_probe()
474 if (ret != -ENODEV) { in ci_hdrc_imx_probe()
475 dev_err_probe(dev, ret, "Failed to parse fsl,usbphy\n"); in ci_hdrc_imx_probe()
478 data->phy = devm_usb_get_phy_by_phandle(dev, "phys", 0); in ci_hdrc_imx_probe()
479 if (IS_ERR(data->phy)) { in ci_hdrc_imx_probe()
480 ret = PTR_ERR(data->phy); in ci_hdrc_imx_probe()
481 if (ret == -ENODEV) { in ci_hdrc_imx_probe()
482 data->phy = NULL; in ci_hdrc_imx_probe()
490 pdata.usb_phy = data->phy; in ci_hdrc_imx_probe()
491 if (data->usbmisc_data) in ci_hdrc_imx_probe()
492 data->usbmisc_data->usb_phy = data->phy; in ci_hdrc_imx_probe()
494 if ((of_device_is_compatible(np, "fsl,imx53-usb") || in ci_hdrc_imx_probe()
495 of_device_is_compatible(np, "fsl,imx51-usb")) && pdata.usb_phy && in ci_hdrc_imx_probe()
498 data->override_phy_control = true; in ci_hdrc_imx_probe()
507 data->supports_runtime_pm = true; in ci_hdrc_imx_probe()
509 data->wakeup_irq = platform_get_irq_optional(pdev, 1); in ci_hdrc_imx_probe()
510 if (data->wakeup_irq > 0) { in ci_hdrc_imx_probe()
511 ret = devm_request_threaded_irq(dev, data->wakeup_irq, in ci_hdrc_imx_probe()
519 ret = imx_usbmisc_init(data->usbmisc_data); in ci_hdrc_imx_probe()
525 data->ci_pdev = ci_hdrc_add_device(dev, in ci_hdrc_imx_probe()
526 pdev->resource, pdev->num_resources, in ci_hdrc_imx_probe()
528 if (IS_ERR(data->ci_pdev)) { in ci_hdrc_imx_probe()
529 ret = PTR_ERR(data->ci_pdev); in ci_hdrc_imx_probe()
534 if (data->usbmisc_data) { in ci_hdrc_imx_probe()
536 of_property_read_bool(np, "usb-role-switch")) in ci_hdrc_imx_probe()
537 data->usbmisc_data->ext_id = 1; in ci_hdrc_imx_probe()
540 of_property_read_bool(np, "usb-role-switch")) in ci_hdrc_imx_probe()
541 data->usbmisc_data->ext_vbus = 1; in ci_hdrc_imx_probe()
544 data->usbmisc_data->available_role = in ci_hdrc_imx_probe()
545 ci_hdrc_query_available_role(data->ci_pdev); in ci_hdrc_imx_probe()
548 ret = imx_usbmisc_init_post(data->usbmisc_data); in ci_hdrc_imx_probe()
554 if (data->supports_runtime_pm) { in ci_hdrc_imx_probe()
564 ci_hdrc_remove_device(data->ci_pdev); in ci_hdrc_imx_probe()
566 if (data->override_phy_control) in ci_hdrc_imx_probe()
567 usb_phy_shutdown(data->phy); in ci_hdrc_imx_probe()
569 clk_disable_unprepare(data->clk_wakeup); in ci_hdrc_imx_probe()
574 cpu_latency_qos_remove_request(&data->pm_qos_req); in ci_hdrc_imx_probe()
575 data->ci_pdev = NULL; in ci_hdrc_imx_probe()
577 if (data->usbmisc_data) in ci_hdrc_imx_probe()
578 put_device(data->usbmisc_data->dev); in ci_hdrc_imx_probe()
586 if (data->supports_runtime_pm) { in ci_hdrc_imx_remove()
587 pm_runtime_get_sync(&pdev->dev); in ci_hdrc_imx_remove()
588 pm_runtime_disable(&pdev->dev); in ci_hdrc_imx_remove()
589 pm_runtime_put_noidle(&pdev->dev); in ci_hdrc_imx_remove()
591 if (data->ci_pdev) in ci_hdrc_imx_remove()
592 ci_hdrc_remove_device(data->ci_pdev); in ci_hdrc_imx_remove()
593 if (data->override_phy_control) in ci_hdrc_imx_remove()
594 usb_phy_shutdown(data->phy); in ci_hdrc_imx_remove()
595 if (data->ci_pdev) { in ci_hdrc_imx_remove()
596 imx_disable_unprepare_clks(&pdev->dev); in ci_hdrc_imx_remove()
597 clk_disable_unprepare(data->clk_wakeup); in ci_hdrc_imx_remove()
598 if (data->plat_data->flags & CI_HDRC_PMQOS) in ci_hdrc_imx_remove()
599 cpu_latency_qos_remove_request(&data->pm_qos_req); in ci_hdrc_imx_remove()
601 if (data->usbmisc_data) in ci_hdrc_imx_remove()
602 put_device(data->usbmisc_data->dev); in ci_hdrc_imx_remove()
618 ret = imx_usbmisc_suspend(data->usbmisc_data, in imx_controller_suspend()
628 if (data->wakeup_irq > 0) in imx_controller_suspend()
629 enable_irq(data->wakeup_irq); in imx_controller_suspend()
631 if (data->plat_data->flags & CI_HDRC_PMQOS) in imx_controller_suspend()
632 cpu_latency_qos_remove_request(&data->pm_qos_req); in imx_controller_suspend()
634 data->in_lpm = true; in imx_controller_suspend()
647 if (!data->in_lpm) { in imx_controller_resume()
652 if (data->plat_data->flags & CI_HDRC_PMQOS) in imx_controller_resume()
653 cpu_latency_qos_add_request(&data->pm_qos_req, 0); in imx_controller_resume()
655 if (data->wakeup_irq > 0 && in imx_controller_resume()
656 !irqd_irq_disabled(irq_get_irq_data(data->wakeup_irq))) in imx_controller_resume()
657 disable_irq_nosync(data->wakeup_irq); in imx_controller_resume()
663 data->in_lpm = false; in imx_controller_resume()
665 ret = imx_usbmisc_resume(data->usbmisc_data, in imx_controller_resume()
685 if (data->in_lpm) in ci_hdrc_imx_suspend()
695 if (data->wakeup_irq > 0 && device_may_wakeup(dev)) in ci_hdrc_imx_suspend()
696 enable_irq_wake(data->wakeup_irq); in ci_hdrc_imx_suspend()
706 if (data->wakeup_irq > 0 && device_may_wakeup(dev)) in ci_hdrc_imx_resume()
707 disable_irq_wake(data->wakeup_irq); in ci_hdrc_imx_resume()
711 if (!ret && data->supports_runtime_pm) { in ci_hdrc_imx_resume()
724 if (data->in_lpm) { in ci_hdrc_imx_runtime_suspend()
754 MODULE_ALIAS("platform:imx-usb");