Lines Matching refs:cdns
28 static int cdns3_idle_init(struct cdns3 *cdns);
31 struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns) in cdns3_get_current_role_driver() argument
33 WARN_ON(!cdns->roles[cdns->role]); in cdns3_get_current_role_driver()
34 return cdns->roles[cdns->role]; in cdns3_get_current_role_driver()
37 static int cdns3_role_start(struct cdns3 *cdns, enum usb_role role) in cdns3_role_start() argument
44 mutex_lock(&cdns->mutex); in cdns3_role_start()
45 cdns->role = role; in cdns3_role_start()
46 mutex_unlock(&cdns->mutex); in cdns3_role_start()
48 if (!cdns->roles[role]) in cdns3_role_start()
51 if (cdns->roles[role]->state == CDNS3_ROLE_STATE_ACTIVE) in cdns3_role_start()
54 mutex_lock(&cdns->mutex); in cdns3_role_start()
55 ret = cdns->roles[role]->start(cdns); in cdns3_role_start()
57 cdns->roles[role]->state = CDNS3_ROLE_STATE_ACTIVE; in cdns3_role_start()
58 mutex_unlock(&cdns->mutex); in cdns3_role_start()
63 static void cdns3_role_stop(struct cdns3 *cdns) in cdns3_role_stop() argument
65 enum usb_role role = cdns->role; in cdns3_role_stop()
70 if (cdns->roles[role]->state == CDNS3_ROLE_STATE_INACTIVE) in cdns3_role_stop()
73 mutex_lock(&cdns->mutex); in cdns3_role_stop()
74 cdns->roles[role]->stop(cdns); in cdns3_role_stop()
75 cdns->roles[role]->state = CDNS3_ROLE_STATE_INACTIVE; in cdns3_role_stop()
76 mutex_unlock(&cdns->mutex); in cdns3_role_stop()
79 static void cdns3_exit_roles(struct cdns3 *cdns) in cdns3_exit_roles() argument
81 cdns3_role_stop(cdns); in cdns3_exit_roles()
82 cdns3_drd_exit(cdns); in cdns3_exit_roles()
85 static enum usb_role cdsn3_hw_role_state_machine(struct cdns3 *cdns);
93 static int cdns3_core_init_role(struct cdns3 *cdns) in cdns3_core_init_role() argument
95 struct device *dev = cdns->dev; in cdns3_core_init_role()
101 cdns->role = USB_ROLE_NONE; in cdns3_core_init_role()
122 best_dr_mode = cdns->dr_mode; in cdns3_core_init_role()
124 ret = cdns3_idle_init(cdns); in cdns3_core_init_role()
129 best_dr_mode = cdns->dr_mode; in cdns3_core_init_role()
130 } else if (cdns->dr_mode == USB_DR_MODE_OTG) { in cdns3_core_init_role()
132 } else if (cdns->dr_mode != dr_mode) { in cdns3_core_init_role()
140 ret = cdns3_host_init(cdns); in cdns3_core_init_role()
149 ret = cdns3_gadget_init(cdns); in cdns3_core_init_role()
157 cdns->dr_mode = dr_mode; in cdns3_core_init_role()
159 ret = cdns3_drd_update_mode(cdns); in cdns3_core_init_role()
164 ret = cdns3_role_start(cdns, USB_ROLE_NONE); in cdns3_core_init_role()
168 switch (cdns->dr_mode) { in cdns3_core_init_role()
170 ret = cdns3_hw_role_switch(cdns); in cdns3_core_init_role()
175 ret = cdns3_role_start(cdns, USB_ROLE_DEVICE); in cdns3_core_init_role()
180 ret = cdns3_role_start(cdns, USB_ROLE_HOST); in cdns3_core_init_role()
191 cdns3_exit_roles(cdns); in cdns3_core_init_role()
201 static enum usb_role cdsn3_hw_role_state_machine(struct cdns3 *cdns) in cdsn3_hw_role_state_machine() argument
206 if (cdns->dr_mode != USB_DR_MODE_OTG) in cdsn3_hw_role_state_machine()
209 id = cdns3_get_id(cdns); in cdsn3_hw_role_state_machine()
210 vbus = cdns3_get_vbus(cdns); in cdsn3_hw_role_state_machine()
218 role = cdns->role; in cdsn3_hw_role_state_machine()
241 dev_dbg(cdns->dev, "role %d -> %d\n", cdns->role, role); in cdsn3_hw_role_state_machine()
246 if (cdns3_is_host(cdns)) in cdsn3_hw_role_state_machine()
248 if (cdns3_is_device(cdns)) in cdsn3_hw_role_state_machine()
254 static int cdns3_idle_role_start(struct cdns3 *cdns) in cdns3_idle_role_start() argument
259 static void cdns3_idle_role_stop(struct cdns3 *cdns) in cdns3_idle_role_stop() argument
262 phy_reset(cdns->usb3_phy); in cdns3_idle_role_stop()
265 static int cdns3_idle_init(struct cdns3 *cdns) in cdns3_idle_init() argument
269 rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL); in cdns3_idle_init()
280 cdns->roles[USB_ROLE_NONE] = rdrv; in cdns3_idle_init()
289 int cdns3_hw_role_switch(struct cdns3 *cdns) in cdns3_hw_role_switch() argument
295 if (cdns->role_override) in cdns3_hw_role_switch()
298 pm_runtime_get_sync(cdns->dev); in cdns3_hw_role_switch()
300 current_role = cdns->role; in cdns3_hw_role_switch()
301 real_role = cdsn3_hw_role_state_machine(cdns); in cdns3_hw_role_switch()
307 cdns3_role_stop(cdns); in cdns3_hw_role_switch()
309 dev_dbg(cdns->dev, "Switching role %d -> %d", current_role, real_role); in cdns3_hw_role_switch()
311 ret = cdns3_role_start(cdns, real_role); in cdns3_hw_role_switch()
314 dev_err(cdns->dev, "set %d has failed, back to %d\n", in cdns3_hw_role_switch()
316 ret = cdns3_role_start(cdns, current_role); in cdns3_hw_role_switch()
318 dev_err(cdns->dev, "back to %d failed too\n", in cdns3_hw_role_switch()
322 pm_runtime_put_sync(cdns->dev); in cdns3_hw_role_switch()
335 struct cdns3 *cdns = dev_get_drvdata(dev); in cdns3_role_get() local
337 return cdns->role; in cdns3_role_get()
351 struct cdns3 *cdns = dev_get_drvdata(dev); in cdns3_role_set() local
354 pm_runtime_get_sync(cdns->dev); in cdns3_role_set()
376 cdns->role_override = 0; in cdns3_role_set()
378 cdns->role_override = 1; in cdns3_role_set()
384 if (!cdns->role_override && cdns->dr_mode == USB_DR_MODE_OTG) { in cdns3_role_set()
385 cdns3_hw_role_switch(cdns); in cdns3_role_set()
389 if (cdns->role == role) in cdns3_role_set()
392 if (cdns->dr_mode == USB_DR_MODE_HOST) { in cdns3_role_set()
403 if (cdns->dr_mode == USB_DR_MODE_PERIPHERAL) { in cdns3_role_set()
414 cdns3_role_stop(cdns); in cdns3_role_set()
415 ret = cdns3_role_start(cdns, role); in cdns3_role_set()
417 dev_err(cdns->dev, "set role %d has failed\n", role); in cdns3_role_set()
422 pm_runtime_put_sync(cdns->dev); in cdns3_role_set()
442 struct cdns3 *cdns; in cdns3_probe() local
452 cdns = devm_kzalloc(dev, sizeof(*cdns), GFP_KERNEL); in cdns3_probe()
453 if (!cdns) in cdns3_probe()
456 cdns->dev = dev; in cdns3_probe()
458 platform_set_drvdata(pdev, cdns); in cdns3_probe()
466 cdns->xhci_res[0] = *res; in cdns3_probe()
474 cdns->xhci_res[1] = *res; in cdns3_probe()
476 cdns->dev_irq = platform_get_irq_byname(pdev, "peripheral"); in cdns3_probe()
477 if (cdns->dev_irq == -EPROBE_DEFER) in cdns3_probe()
478 return cdns->dev_irq; in cdns3_probe()
480 if (cdns->dev_irq < 0) in cdns3_probe()
487 cdns->dev_regs = regs; in cdns3_probe()
489 cdns->otg_irq = platform_get_irq_byname(pdev, "otg"); in cdns3_probe()
490 if (cdns->otg_irq == -EPROBE_DEFER) in cdns3_probe()
491 return cdns->otg_irq; in cdns3_probe()
493 if (cdns->otg_irq < 0) { in cdns3_probe()
495 return cdns->otg_irq; in cdns3_probe()
504 cdns->otg_res = *res; in cdns3_probe()
506 mutex_init(&cdns->mutex); in cdns3_probe()
508 cdns->usb2_phy = devm_phy_optional_get(dev, "cdns3,usb2-phy"); in cdns3_probe()
509 if (IS_ERR(cdns->usb2_phy)) in cdns3_probe()
510 return PTR_ERR(cdns->usb2_phy); in cdns3_probe()
512 ret = phy_init(cdns->usb2_phy); in cdns3_probe()
516 cdns->usb3_phy = devm_phy_optional_get(dev, "cdns3,usb3-phy"); in cdns3_probe()
517 if (IS_ERR(cdns->usb3_phy)) in cdns3_probe()
518 return PTR_ERR(cdns->usb3_phy); in cdns3_probe()
520 ret = phy_init(cdns->usb3_phy); in cdns3_probe()
524 ret = phy_power_on(cdns->usb2_phy); in cdns3_probe()
528 ret = phy_power_on(cdns->usb3_phy); in cdns3_probe()
532 cdns->role_sw = usb_role_switch_register(dev, &cdns3_switch_desc); in cdns3_probe()
533 if (IS_ERR(cdns->role_sw)) { in cdns3_probe()
534 ret = PTR_ERR(cdns->role_sw); in cdns3_probe()
539 ret = cdns3_drd_init(cdns); in cdns3_probe()
543 ret = cdns3_core_init_role(cdns); in cdns3_probe()
563 cdns3_drd_exit(cdns); in cdns3_probe()
564 usb_role_switch_unregister(cdns->role_sw); in cdns3_probe()
566 phy_power_off(cdns->usb3_phy); in cdns3_probe()
569 phy_power_off(cdns->usb2_phy); in cdns3_probe()
571 phy_exit(cdns->usb3_phy); in cdns3_probe()
573 phy_exit(cdns->usb2_phy); in cdns3_probe()
586 struct cdns3 *cdns = platform_get_drvdata(pdev); in cdns3_remove() local
591 cdns3_exit_roles(cdns); in cdns3_remove()
592 usb_role_switch_unregister(cdns->role_sw); in cdns3_remove()
593 phy_power_off(cdns->usb2_phy); in cdns3_remove()
594 phy_power_off(cdns->usb3_phy); in cdns3_remove()
595 phy_exit(cdns->usb2_phy); in cdns3_remove()
596 phy_exit(cdns->usb3_phy); in cdns3_remove()
604 struct cdns3 *cdns = dev_get_drvdata(dev); in cdns3_suspend() local
607 if (cdns->role == USB_ROLE_HOST) in cdns3_suspend()
613 if (cdns->roles[cdns->role]->suspend) { in cdns3_suspend()
614 spin_lock_irqsave(&cdns->gadget_dev->lock, flags); in cdns3_suspend()
615 cdns->roles[cdns->role]->suspend(cdns, false); in cdns3_suspend()
616 spin_unlock_irqrestore(&cdns->gadget_dev->lock, flags); in cdns3_suspend()
624 struct cdns3 *cdns = dev_get_drvdata(dev); in cdns3_resume() local
627 if (cdns->role == USB_ROLE_HOST) in cdns3_resume()
630 if (cdns->roles[cdns->role]->resume) { in cdns3_resume()
631 spin_lock_irqsave(&cdns->gadget_dev->lock, flags); in cdns3_resume()
632 cdns->roles[cdns->role]->resume(cdns, false); in cdns3_resume()
633 spin_unlock_irqrestore(&cdns->gadget_dev->lock, flags); in cdns3_resume()