Lines Matching refs:hsotg

52 static int dwc2_get_dr_mode(struct dwc2_hsotg *hsotg)  in dwc2_get_dr_mode()  argument
56 hsotg->dr_mode = usb_get_dr_mode(hsotg->dev); in dwc2_get_dr_mode()
57 if (hsotg->dr_mode == USB_DR_MODE_UNKNOWN) in dwc2_get_dr_mode()
58 hsotg->dr_mode = USB_DR_MODE_OTG; in dwc2_get_dr_mode()
60 mode = hsotg->dr_mode; in dwc2_get_dr_mode()
62 if (dwc2_hw_is_device(hsotg)) { in dwc2_get_dr_mode()
64 dev_err(hsotg->dev, in dwc2_get_dr_mode()
69 } else if (dwc2_hw_is_host(hsotg)) { in dwc2_get_dr_mode()
71 dev_err(hsotg->dev, in dwc2_get_dr_mode()
83 if (mode != hsotg->dr_mode) { in dwc2_get_dr_mode()
84 dev_warn(hsotg->dev, in dwc2_get_dr_mode()
88 hsotg->dr_mode = mode; in dwc2_get_dr_mode()
94 static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) in __dwc2_lowlevel_hw_enable() argument
96 struct platform_device *pdev = to_platform_device(hsotg->dev); in __dwc2_lowlevel_hw_enable()
99 ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies), in __dwc2_lowlevel_hw_enable()
100 hsotg->supplies); in __dwc2_lowlevel_hw_enable()
104 if (hsotg->utmi_clk) { in __dwc2_lowlevel_hw_enable()
105 ret = clk_prepare_enable(hsotg->utmi_clk); in __dwc2_lowlevel_hw_enable()
110 if (hsotg->clk) { in __dwc2_lowlevel_hw_enable()
111 ret = clk_prepare_enable(hsotg->clk); in __dwc2_lowlevel_hw_enable()
116 if (hsotg->uphy) { in __dwc2_lowlevel_hw_enable()
117 ret = usb_phy_init(hsotg->uphy); in __dwc2_lowlevel_hw_enable()
118 } else if (hsotg->plat && hsotg->plat->phy_init) { in __dwc2_lowlevel_hw_enable()
119 ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type); in __dwc2_lowlevel_hw_enable()
121 ret = phy_init(hsotg->phy); in __dwc2_lowlevel_hw_enable()
123 ret = phy_power_on(hsotg->phy); in __dwc2_lowlevel_hw_enable()
125 phy_exit(hsotg->phy); in __dwc2_lowlevel_hw_enable()
135 if (hsotg->clk) in __dwc2_lowlevel_hw_enable()
136 clk_disable_unprepare(hsotg->clk); in __dwc2_lowlevel_hw_enable()
139 if (hsotg->utmi_clk) in __dwc2_lowlevel_hw_enable()
140 clk_disable_unprepare(hsotg->utmi_clk); in __dwc2_lowlevel_hw_enable()
143 regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); in __dwc2_lowlevel_hw_enable()
155 int dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) in dwc2_lowlevel_hw_enable() argument
157 int ret = __dwc2_lowlevel_hw_enable(hsotg); in dwc2_lowlevel_hw_enable()
160 hsotg->ll_hw_enabled = true; in dwc2_lowlevel_hw_enable()
164 static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg) in __dwc2_lowlevel_hw_disable() argument
166 struct platform_device *pdev = to_platform_device(hsotg->dev); in __dwc2_lowlevel_hw_disable()
169 if (hsotg->uphy) { in __dwc2_lowlevel_hw_disable()
170 usb_phy_shutdown(hsotg->uphy); in __dwc2_lowlevel_hw_disable()
171 } else if (hsotg->plat && hsotg->plat->phy_exit) { in __dwc2_lowlevel_hw_disable()
172 ret = hsotg->plat->phy_exit(pdev, hsotg->plat->phy_type); in __dwc2_lowlevel_hw_disable()
174 ret = phy_power_off(hsotg->phy); in __dwc2_lowlevel_hw_disable()
176 ret = phy_exit(hsotg->phy); in __dwc2_lowlevel_hw_disable()
181 if (hsotg->clk) in __dwc2_lowlevel_hw_disable()
182 clk_disable_unprepare(hsotg->clk); in __dwc2_lowlevel_hw_disable()
184 if (hsotg->utmi_clk) in __dwc2_lowlevel_hw_disable()
185 clk_disable_unprepare(hsotg->utmi_clk); in __dwc2_lowlevel_hw_disable()
187 return regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); in __dwc2_lowlevel_hw_disable()
197 int dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg) in dwc2_lowlevel_hw_disable() argument
199 int ret = __dwc2_lowlevel_hw_disable(hsotg); in dwc2_lowlevel_hw_disable()
202 hsotg->ll_hw_enabled = false; in dwc2_lowlevel_hw_disable()
211 static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) in dwc2_lowlevel_hw_init() argument
215 hsotg->reset = devm_reset_control_get_optional(hsotg->dev, "dwc2"); in dwc2_lowlevel_hw_init()
216 if (IS_ERR(hsotg->reset)) in dwc2_lowlevel_hw_init()
217 return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->reset), in dwc2_lowlevel_hw_init()
220 reset_control_deassert(hsotg->reset); in dwc2_lowlevel_hw_init()
221 ret = devm_add_action_or_reset(hsotg->dev, dwc2_reset_control_assert, in dwc2_lowlevel_hw_init()
222 hsotg->reset); in dwc2_lowlevel_hw_init()
226 hsotg->reset_ecc = devm_reset_control_get_optional(hsotg->dev, "dwc2-ecc"); in dwc2_lowlevel_hw_init()
227 if (IS_ERR(hsotg->reset_ecc)) in dwc2_lowlevel_hw_init()
228 return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->reset_ecc), in dwc2_lowlevel_hw_init()
231 reset_control_deassert(hsotg->reset_ecc); in dwc2_lowlevel_hw_init()
232 ret = devm_add_action_or_reset(hsotg->dev, dwc2_reset_control_assert, in dwc2_lowlevel_hw_init()
233 hsotg->reset_ecc); in dwc2_lowlevel_hw_init()
241 hsotg->phy = devm_phy_get(hsotg->dev, "usb2-phy"); in dwc2_lowlevel_hw_init()
242 if (IS_ERR(hsotg->phy)) { in dwc2_lowlevel_hw_init()
243 ret = PTR_ERR(hsotg->phy); in dwc2_lowlevel_hw_init()
247 hsotg->phy = NULL; in dwc2_lowlevel_hw_init()
250 return dev_err_probe(hsotg->dev, ret, "error getting phy\n"); in dwc2_lowlevel_hw_init()
254 if (!hsotg->phy) { in dwc2_lowlevel_hw_init()
255 hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); in dwc2_lowlevel_hw_init()
256 if (IS_ERR(hsotg->uphy)) { in dwc2_lowlevel_hw_init()
257 ret = PTR_ERR(hsotg->uphy); in dwc2_lowlevel_hw_init()
261 hsotg->uphy = NULL; in dwc2_lowlevel_hw_init()
264 return dev_err_probe(hsotg->dev, ret, "error getting usb phy\n"); in dwc2_lowlevel_hw_init()
269 hsotg->plat = dev_get_platdata(hsotg->dev); in dwc2_lowlevel_hw_init()
272 hsotg->clk = devm_clk_get_optional(hsotg->dev, "otg"); in dwc2_lowlevel_hw_init()
273 if (IS_ERR(hsotg->clk)) in dwc2_lowlevel_hw_init()
274 return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->clk), "cannot get otg clock\n"); in dwc2_lowlevel_hw_init()
276 hsotg->utmi_clk = devm_clk_get_optional(hsotg->dev, "utmi"); in dwc2_lowlevel_hw_init()
277 if (IS_ERR(hsotg->utmi_clk)) in dwc2_lowlevel_hw_init()
278 return dev_err_probe(hsotg->dev, PTR_ERR(hsotg->utmi_clk), in dwc2_lowlevel_hw_init()
282 for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++) in dwc2_lowlevel_hw_init()
283 hsotg->supplies[i].supply = dwc2_hsotg_supply_names[i]; in dwc2_lowlevel_hw_init()
285 ret = devm_regulator_bulk_get(hsotg->dev, ARRAY_SIZE(hsotg->supplies), in dwc2_lowlevel_hw_init()
286 hsotg->supplies); in dwc2_lowlevel_hw_init()
288 return dev_err_probe(hsotg->dev, ret, "failed to request supplies\n"); in dwc2_lowlevel_hw_init()
306 struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); in dwc2_driver_remove() local
310 gr = &hsotg->gr_backup; in dwc2_driver_remove()
313 if (hsotg->hibernated) { in dwc2_driver_remove()
315 ret = dwc2_exit_hibernation(hsotg, 0, 0, 1); in dwc2_driver_remove()
317 ret = dwc2_exit_hibernation(hsotg, 0, 0, 0); in dwc2_driver_remove()
320 dev_err(hsotg->dev, in dwc2_driver_remove()
325 if (hsotg->in_ppd) { in dwc2_driver_remove()
326 ret = dwc2_exit_partial_power_down(hsotg, 0, true); in dwc2_driver_remove()
328 dev_err(hsotg->dev, in dwc2_driver_remove()
333 if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE && in dwc2_driver_remove()
334 hsotg->bus_suspended) { in dwc2_driver_remove()
335 if (dwc2_is_device_mode(hsotg)) in dwc2_driver_remove()
336 dwc2_gadget_exit_clock_gating(hsotg, 0); in dwc2_driver_remove()
338 dwc2_host_exit_clock_gating(hsotg, 0); in dwc2_driver_remove()
341 dwc2_debugfs_exit(hsotg); in dwc2_driver_remove()
342 if (hsotg->hcd_enabled) in dwc2_driver_remove()
343 dwc2_hcd_remove(hsotg); in dwc2_driver_remove()
344 if (hsotg->gadget_enabled) in dwc2_driver_remove()
345 dwc2_hsotg_remove(hsotg); in dwc2_driver_remove()
347 dwc2_drd_exit(hsotg); in dwc2_driver_remove()
349 if (hsotg->params.activate_stm_id_vb_detection) in dwc2_driver_remove()
350 regulator_disable(hsotg->usb33d); in dwc2_driver_remove()
352 if (hsotg->ll_hw_enabled) in dwc2_driver_remove()
353 dwc2_lowlevel_hw_disable(hsotg); in dwc2_driver_remove()
370 struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); in dwc2_driver_shutdown() local
372 dwc2_disable_global_interrupts(hsotg); in dwc2_driver_shutdown()
373 synchronize_irq(hsotg->irq); in dwc2_driver_shutdown()
381 static bool dwc2_check_core_endianness(struct dwc2_hsotg *hsotg) in dwc2_check_core_endianness() argument
385 snpsid = ioread32(hsotg->regs + GSNPSID); in dwc2_check_core_endianness()
399 int dwc2_check_core_version(struct dwc2_hsotg *hsotg) in dwc2_check_core_version() argument
401 struct dwc2_hw_params *hw = &hsotg->hw_params; in dwc2_check_core_version()
409 hw->snpsid = dwc2_readl(hsotg, GSNPSID); in dwc2_check_core_version()
413 dev_err(hsotg->dev, "Bad value for GSNPSID: 0x%08x\n", in dwc2_check_core_version()
418 dev_dbg(hsotg->dev, "Core Release: %1x.%1x%1x%1x (snpsid=%x)\n", in dwc2_check_core_version()
438 struct dwc2_hsotg *hsotg; in dwc2_driver_probe() local
442 hsotg = devm_kzalloc(&dev->dev, sizeof(*hsotg), GFP_KERNEL); in dwc2_driver_probe()
443 if (!hsotg) in dwc2_driver_probe()
446 hsotg->dev = &dev->dev; in dwc2_driver_probe()
459 hsotg->regs = devm_platform_get_and_ioremap_resource(dev, 0, &res); in dwc2_driver_probe()
460 if (IS_ERR(hsotg->regs)) in dwc2_driver_probe()
461 return PTR_ERR(hsotg->regs); in dwc2_driver_probe()
464 (unsigned long)res->start, hsotg->regs); in dwc2_driver_probe()
466 retval = dwc2_lowlevel_hw_init(hsotg); in dwc2_driver_probe()
470 spin_lock_init(&hsotg->lock); in dwc2_driver_probe()
472 hsotg->irq = platform_get_irq(dev, 0); in dwc2_driver_probe()
473 if (hsotg->irq < 0) in dwc2_driver_probe()
474 return hsotg->irq; in dwc2_driver_probe()
476 dev_dbg(hsotg->dev, "registering common handler for irq%d\n", in dwc2_driver_probe()
477 hsotg->irq); in dwc2_driver_probe()
478 retval = devm_request_irq(hsotg->dev, hsotg->irq, in dwc2_driver_probe()
480 dev_name(hsotg->dev), hsotg); in dwc2_driver_probe()
484 hsotg->vbus_supply = devm_regulator_get_optional(hsotg->dev, "vbus"); in dwc2_driver_probe()
485 if (IS_ERR(hsotg->vbus_supply)) { in dwc2_driver_probe()
486 retval = PTR_ERR(hsotg->vbus_supply); in dwc2_driver_probe()
487 hsotg->vbus_supply = NULL; in dwc2_driver_probe()
492 retval = dwc2_lowlevel_hw_enable(hsotg); in dwc2_driver_probe()
496 hsotg->needs_byte_swap = dwc2_check_core_endianness(hsotg); in dwc2_driver_probe()
498 retval = dwc2_get_dr_mode(hsotg); in dwc2_driver_probe()
502 hsotg->need_phy_for_wake = in dwc2_driver_probe()
510 retval = dwc2_check_core_version(hsotg); in dwc2_driver_probe()
518 retval = dwc2_core_reset(hsotg, false); in dwc2_driver_probe()
523 retval = dwc2_get_hwparams(hsotg); in dwc2_driver_probe()
532 dwc2_force_dr_mode(hsotg); in dwc2_driver_probe()
534 retval = dwc2_init_params(hsotg); in dwc2_driver_probe()
538 if (hsotg->params.activate_stm_id_vb_detection) { in dwc2_driver_probe()
541 hsotg->usb33d = devm_regulator_get(hsotg->dev, "usb33d"); in dwc2_driver_probe()
542 if (IS_ERR(hsotg->usb33d)) { in dwc2_driver_probe()
543 retval = PTR_ERR(hsotg->usb33d); in dwc2_driver_probe()
544 dev_err_probe(hsotg->dev, retval, "failed to request usb33d supply\n"); in dwc2_driver_probe()
547 retval = regulator_enable(hsotg->usb33d); in dwc2_driver_probe()
549 dev_err_probe(hsotg->dev, retval, "failed to enable usb33d supply\n"); in dwc2_driver_probe()
553 ggpio = dwc2_readl(hsotg, GGPIO); in dwc2_driver_probe()
556 dwc2_writel(hsotg, ggpio, GGPIO); in dwc2_driver_probe()
562 retval = dwc2_drd_init(hsotg); in dwc2_driver_probe()
564 dev_err_probe(hsotg->dev, retval, "failed to initialize dual-role\n"); in dwc2_driver_probe()
568 if (hsotg->dr_mode != USB_DR_MODE_HOST) { in dwc2_driver_probe()
569 retval = dwc2_gadget_init(hsotg); in dwc2_driver_probe()
572 hsotg->gadget_enabled = 1; in dwc2_driver_probe()
580 if (hsotg->need_phy_for_wake) in dwc2_driver_probe()
583 hsotg->reset_phy_on_wake = in dwc2_driver_probe()
586 if (hsotg->reset_phy_on_wake && !hsotg->phy) { in dwc2_driver_probe()
587 dev_warn(hsotg->dev, in dwc2_driver_probe()
589 hsotg->reset_phy_on_wake = false; in dwc2_driver_probe()
592 if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) { in dwc2_driver_probe()
593 retval = dwc2_hcd_init(hsotg); in dwc2_driver_probe()
595 if (hsotg->gadget_enabled) in dwc2_driver_probe()
596 dwc2_hsotg_remove(hsotg); in dwc2_driver_probe()
599 hsotg->hcd_enabled = 1; in dwc2_driver_probe()
602 platform_set_drvdata(dev, hsotg); in dwc2_driver_probe()
603 hsotg->hibernated = 0; in dwc2_driver_probe()
605 dwc2_debugfs_init(hsotg); in dwc2_driver_probe()
608 if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) in dwc2_driver_probe()
609 dwc2_lowlevel_hw_disable(hsotg); in dwc2_driver_probe()
614 if (hsotg->gadget_enabled) { in dwc2_driver_probe()
615 retval = usb_add_gadget_udc(hsotg->dev, &hsotg->gadget); in dwc2_driver_probe()
617 hsotg->gadget.udc = NULL; in dwc2_driver_probe()
618 dwc2_hsotg_remove(hsotg); in dwc2_driver_probe()
628 dwc2_debugfs_exit(hsotg); in dwc2_driver_probe()
629 if (hsotg->hcd_enabled) in dwc2_driver_probe()
630 dwc2_hcd_remove(hsotg); in dwc2_driver_probe()
633 dwc2_drd_exit(hsotg); in dwc2_driver_probe()
636 if (hsotg->params.activate_stm_id_vb_detection) in dwc2_driver_probe()
637 regulator_disable(hsotg->usb33d); in dwc2_driver_probe()
639 if (hsotg->ll_hw_enabled) in dwc2_driver_probe()
640 dwc2_lowlevel_hw_disable(hsotg); in dwc2_driver_probe()