Lines Matching refs:hsotg
82 static int dwc2_get_dr_mode(struct dwc2_hsotg *hsotg) in dwc2_get_dr_mode() argument
86 hsotg->dr_mode = usb_get_dr_mode(hsotg->dev); in dwc2_get_dr_mode()
87 if (hsotg->dr_mode == USB_DR_MODE_UNKNOWN) in dwc2_get_dr_mode()
88 hsotg->dr_mode = USB_DR_MODE_OTG; in dwc2_get_dr_mode()
90 mode = hsotg->dr_mode; in dwc2_get_dr_mode()
92 if (dwc2_hw_is_device(hsotg)) { in dwc2_get_dr_mode()
94 dev_err(hsotg->dev, in dwc2_get_dr_mode()
99 } else if (dwc2_hw_is_host(hsotg)) { in dwc2_get_dr_mode()
101 dev_err(hsotg->dev, in dwc2_get_dr_mode()
113 if (mode != hsotg->dr_mode) { in dwc2_get_dr_mode()
114 dev_warn(hsotg->dev, in dwc2_get_dr_mode()
118 hsotg->dr_mode = mode; in dwc2_get_dr_mode()
124 static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) in __dwc2_lowlevel_hw_enable() argument
126 struct platform_device *pdev = to_platform_device(hsotg->dev); in __dwc2_lowlevel_hw_enable()
129 ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies), in __dwc2_lowlevel_hw_enable()
130 hsotg->supplies); in __dwc2_lowlevel_hw_enable()
134 if (hsotg->clk) { in __dwc2_lowlevel_hw_enable()
135 ret = clk_prepare_enable(hsotg->clk); in __dwc2_lowlevel_hw_enable()
140 if (hsotg->uphy) { in __dwc2_lowlevel_hw_enable()
141 ret = usb_phy_init(hsotg->uphy); in __dwc2_lowlevel_hw_enable()
142 } else if (hsotg->plat && hsotg->plat->phy_init) { in __dwc2_lowlevel_hw_enable()
143 ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type); in __dwc2_lowlevel_hw_enable()
145 ret = phy_power_on(hsotg->phy); in __dwc2_lowlevel_hw_enable()
147 ret = phy_init(hsotg->phy); in __dwc2_lowlevel_hw_enable()
160 int dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) in dwc2_lowlevel_hw_enable() argument
162 int ret = __dwc2_lowlevel_hw_enable(hsotg); in dwc2_lowlevel_hw_enable()
165 hsotg->ll_hw_enabled = true; in dwc2_lowlevel_hw_enable()
169 static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg) in __dwc2_lowlevel_hw_disable() argument
171 struct platform_device *pdev = to_platform_device(hsotg->dev); in __dwc2_lowlevel_hw_disable()
174 if (hsotg->uphy) { in __dwc2_lowlevel_hw_disable()
175 usb_phy_shutdown(hsotg->uphy); in __dwc2_lowlevel_hw_disable()
176 } else if (hsotg->plat && hsotg->plat->phy_exit) { in __dwc2_lowlevel_hw_disable()
177 ret = hsotg->plat->phy_exit(pdev, hsotg->plat->phy_type); in __dwc2_lowlevel_hw_disable()
179 ret = phy_exit(hsotg->phy); in __dwc2_lowlevel_hw_disable()
181 ret = phy_power_off(hsotg->phy); in __dwc2_lowlevel_hw_disable()
186 if (hsotg->clk) in __dwc2_lowlevel_hw_disable()
187 clk_disable_unprepare(hsotg->clk); in __dwc2_lowlevel_hw_disable()
189 ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), in __dwc2_lowlevel_hw_disable()
190 hsotg->supplies); in __dwc2_lowlevel_hw_disable()
202 int dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg) in dwc2_lowlevel_hw_disable() argument
204 int ret = __dwc2_lowlevel_hw_disable(hsotg); in dwc2_lowlevel_hw_disable()
207 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 ret = PTR_ERR(hsotg->reset); in dwc2_lowlevel_hw_init()
218 dev_err(hsotg->dev, "error getting reset control %d\n", ret); in dwc2_lowlevel_hw_init()
222 reset_control_deassert(hsotg->reset); in dwc2_lowlevel_hw_init()
224 hsotg->reset_ecc = devm_reset_control_get_optional(hsotg->dev, "dwc2-ecc"); in dwc2_lowlevel_hw_init()
225 if (IS_ERR(hsotg->reset_ecc)) { in dwc2_lowlevel_hw_init()
226 ret = PTR_ERR(hsotg->reset_ecc); in dwc2_lowlevel_hw_init()
227 dev_err(hsotg->dev, "error getting reset control for ecc %d\n", ret); in dwc2_lowlevel_hw_init()
231 reset_control_deassert(hsotg->reset_ecc); in dwc2_lowlevel_hw_init()
237 hsotg->phy = devm_phy_get(hsotg->dev, "usb2-phy"); in dwc2_lowlevel_hw_init()
238 if (IS_ERR(hsotg->phy)) { in dwc2_lowlevel_hw_init()
239 ret = PTR_ERR(hsotg->phy); in dwc2_lowlevel_hw_init()
243 hsotg->phy = NULL; in dwc2_lowlevel_hw_init()
248 dev_err(hsotg->dev, "error getting phy %d\n", ret); in dwc2_lowlevel_hw_init()
253 if (!hsotg->phy) { in dwc2_lowlevel_hw_init()
254 hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); in dwc2_lowlevel_hw_init()
255 if (IS_ERR(hsotg->uphy)) { in dwc2_lowlevel_hw_init()
256 ret = PTR_ERR(hsotg->uphy); in dwc2_lowlevel_hw_init()
260 hsotg->uphy = NULL; in dwc2_lowlevel_hw_init()
265 dev_err(hsotg->dev, "error getting usb phy %d\n", in dwc2_lowlevel_hw_init()
272 hsotg->plat = dev_get_platdata(hsotg->dev); in dwc2_lowlevel_hw_init()
275 hsotg->clk = devm_clk_get_optional(hsotg->dev, "otg"); in dwc2_lowlevel_hw_init()
276 if (IS_ERR(hsotg->clk)) { in dwc2_lowlevel_hw_init()
277 dev_err(hsotg->dev, "cannot get otg clock\n"); in dwc2_lowlevel_hw_init()
278 return PTR_ERR(hsotg->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 dev_err(hsotg->dev, "failed to request supplies: %d\n", ret); in dwc2_lowlevel_hw_init()
307 struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); in dwc2_driver_remove() local
309 dwc2_debugfs_exit(hsotg); in dwc2_driver_remove()
310 if (hsotg->hcd_enabled) in dwc2_driver_remove()
311 dwc2_hcd_remove(hsotg); in dwc2_driver_remove()
312 if (hsotg->gadget_enabled) in dwc2_driver_remove()
313 dwc2_hsotg_remove(hsotg); in dwc2_driver_remove()
315 if (hsotg->ll_hw_enabled) in dwc2_driver_remove()
316 dwc2_lowlevel_hw_disable(hsotg); in dwc2_driver_remove()
318 reset_control_assert(hsotg->reset); in dwc2_driver_remove()
319 reset_control_assert(hsotg->reset_ecc); in dwc2_driver_remove()
338 struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); in dwc2_driver_shutdown() local
340 disable_irq(hsotg->irq); in dwc2_driver_shutdown()
348 static bool dwc2_check_core_endianness(struct dwc2_hsotg *hsotg) in dwc2_check_core_endianness() argument
352 snpsid = ioread32(hsotg->regs + GSNPSID); in dwc2_check_core_endianness()
374 struct dwc2_hsotg *hsotg; in dwc2_driver_probe() local
378 hsotg = devm_kzalloc(&dev->dev, sizeof(*hsotg), GFP_KERNEL); in dwc2_driver_probe()
379 if (!hsotg) in dwc2_driver_probe()
382 hsotg->dev = &dev->dev; in dwc2_driver_probe()
396 hsotg->regs = devm_ioremap_resource(&dev->dev, res); in dwc2_driver_probe()
397 if (IS_ERR(hsotg->regs)) in dwc2_driver_probe()
398 return PTR_ERR(hsotg->regs); in dwc2_driver_probe()
401 (unsigned long)res->start, hsotg->regs); in dwc2_driver_probe()
403 retval = dwc2_lowlevel_hw_init(hsotg); in dwc2_driver_probe()
407 spin_lock_init(&hsotg->lock); in dwc2_driver_probe()
409 hsotg->irq = platform_get_irq(dev, 0); in dwc2_driver_probe()
410 if (hsotg->irq < 0) in dwc2_driver_probe()
411 return hsotg->irq; in dwc2_driver_probe()
413 dev_dbg(hsotg->dev, "registering common handler for irq%d\n", in dwc2_driver_probe()
414 hsotg->irq); in dwc2_driver_probe()
415 retval = devm_request_irq(hsotg->dev, hsotg->irq, in dwc2_driver_probe()
417 dev_name(hsotg->dev), hsotg); in dwc2_driver_probe()
421 hsotg->vbus_supply = devm_regulator_get_optional(hsotg->dev, "vbus"); in dwc2_driver_probe()
422 if (IS_ERR(hsotg->vbus_supply)) { in dwc2_driver_probe()
423 retval = PTR_ERR(hsotg->vbus_supply); in dwc2_driver_probe()
424 hsotg->vbus_supply = NULL; in dwc2_driver_probe()
429 retval = dwc2_lowlevel_hw_enable(hsotg); in dwc2_driver_probe()
433 hsotg->needs_byte_swap = dwc2_check_core_endianness(hsotg); in dwc2_driver_probe()
435 retval = dwc2_get_dr_mode(hsotg); in dwc2_driver_probe()
439 hsotg->need_phy_for_wake = in dwc2_driver_probe()
447 retval = dwc2_core_reset(hsotg, false); in dwc2_driver_probe()
452 retval = dwc2_get_hwparams(hsotg); in dwc2_driver_probe()
461 dwc2_force_dr_mode(hsotg); in dwc2_driver_probe()
463 retval = dwc2_init_params(hsotg); in dwc2_driver_probe()
467 if (hsotg->dr_mode != USB_DR_MODE_HOST) { in dwc2_driver_probe()
468 retval = dwc2_gadget_init(hsotg); in dwc2_driver_probe()
471 hsotg->gadget_enabled = 1; in dwc2_driver_probe()
479 if (hsotg->need_phy_for_wake) in dwc2_driver_probe()
482 hsotg->reset_phy_on_wake = in dwc2_driver_probe()
485 if (hsotg->reset_phy_on_wake && !hsotg->phy) { in dwc2_driver_probe()
486 dev_warn(hsotg->dev, in dwc2_driver_probe()
488 hsotg->reset_phy_on_wake = false; in dwc2_driver_probe()
491 if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) { in dwc2_driver_probe()
492 retval = dwc2_hcd_init(hsotg); in dwc2_driver_probe()
494 if (hsotg->gadget_enabled) in dwc2_driver_probe()
495 dwc2_hsotg_remove(hsotg); in dwc2_driver_probe()
498 hsotg->hcd_enabled = 1; in dwc2_driver_probe()
501 platform_set_drvdata(dev, hsotg); in dwc2_driver_probe()
502 hsotg->hibernated = 0; in dwc2_driver_probe()
504 dwc2_debugfs_init(hsotg); in dwc2_driver_probe()
507 if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) in dwc2_driver_probe()
508 dwc2_lowlevel_hw_disable(hsotg); in dwc2_driver_probe()
513 dwc2_lowlevel_hw_disable(hsotg); in dwc2_driver_probe()