Lines Matching full:cdns

27 static int cdns_idle_init(struct cdns *cdns);
29 static int cdns_role_start(struct cdns *cdns, enum usb_role role) in cdns_role_start() argument
36 mutex_lock(&cdns->mutex); in cdns_role_start()
37 cdns->role = role; in cdns_role_start()
38 mutex_unlock(&cdns->mutex); in cdns_role_start()
40 if (!cdns->roles[role]) in cdns_role_start()
43 if (cdns->roles[role]->state == CDNS_ROLE_STATE_ACTIVE) in cdns_role_start()
46 mutex_lock(&cdns->mutex); in cdns_role_start()
47 ret = cdns->roles[role]->start(cdns); in cdns_role_start()
49 cdns->roles[role]->state = CDNS_ROLE_STATE_ACTIVE; in cdns_role_start()
50 mutex_unlock(&cdns->mutex); in cdns_role_start()
55 static void cdns_role_stop(struct cdns *cdns) in cdns_role_stop() argument
57 enum usb_role role = cdns->role; in cdns_role_stop()
62 if (cdns->roles[role]->state == CDNS_ROLE_STATE_INACTIVE) in cdns_role_stop()
65 mutex_lock(&cdns->mutex); in cdns_role_stop()
66 cdns->roles[role]->stop(cdns); in cdns_role_stop()
67 cdns->roles[role]->state = CDNS_ROLE_STATE_INACTIVE; in cdns_role_stop()
68 mutex_unlock(&cdns->mutex); in cdns_role_stop()
71 static void cdns_exit_roles(struct cdns *cdns) in cdns_exit_roles() argument
73 cdns_role_stop(cdns); in cdns_exit_roles()
74 cdns_drd_exit(cdns); in cdns_exit_roles()
79 * @cdns: Pointer to cdns structure
83 static int cdns_core_init_role(struct cdns *cdns) in cdns_core_init_role() argument
85 struct device *dev = cdns->dev; in cdns_core_init_role()
91 cdns->role = USB_ROLE_NONE; in cdns_core_init_role()
99 if (cdns->version == CDNSP_CONTROLLER_V2) { in cdns_core_init_role()
119 * At this point cdns->dr_mode contains strap configuration. in cdns_core_init_role()
122 best_dr_mode = cdns->dr_mode; in cdns_core_init_role()
124 ret = cdns_idle_init(cdns); in cdns_core_init_role()
129 best_dr_mode = cdns->dr_mode; in cdns_core_init_role()
130 } else if (cdns->dr_mode == USB_DR_MODE_OTG) { in cdns_core_init_role()
132 } else if (cdns->dr_mode != dr_mode) { in cdns_core_init_role()
140 if ((cdns->version == CDNSP_CONTROLLER_V2 && in cdns_core_init_role()
142 (cdns->version < CDNSP_CONTROLLER_V2 && in cdns_core_init_role()
144 ret = cdns_host_init(cdns); in cdns_core_init_role()
156 if (cdns->gadget_init) in cdns_core_init_role()
157 ret = cdns->gadget_init(cdns); in cdns_core_init_role()
168 cdns->dr_mode = dr_mode; in cdns_core_init_role()
170 ret = cdns_drd_update_mode(cdns); in cdns_core_init_role()
175 ret = cdns_role_start(cdns, USB_ROLE_NONE); in cdns_core_init_role()
179 switch (cdns->dr_mode) { in cdns_core_init_role()
181 ret = cdns_hw_role_switch(cdns); in cdns_core_init_role()
186 ret = cdns_role_start(cdns, USB_ROLE_DEVICE); in cdns_core_init_role()
191 ret = cdns_role_start(cdns, USB_ROLE_HOST); in cdns_core_init_role()
202 cdns_exit_roles(cdns); in cdns_core_init_role()
208 * @cdns: Pointer to controller structure.
212 static enum usb_role cdns_hw_role_state_machine(struct cdns *cdns) in cdns_hw_role_state_machine() argument
217 if (cdns->dr_mode != USB_DR_MODE_OTG) { in cdns_hw_role_state_machine()
218 if (cdns_is_host(cdns)) in cdns_hw_role_state_machine()
220 if (cdns_is_device(cdns)) in cdns_hw_role_state_machine()
226 id = cdns_get_id(cdns); in cdns_hw_role_state_machine()
227 vbus = cdns_get_vbus(cdns); in cdns_hw_role_state_machine()
232 * Previous state: cdns->role in cdns_hw_role_state_machine()
235 role = cdns->role; in cdns_hw_role_state_machine()
258 dev_dbg(cdns->dev, "role %d -> %d\n", cdns->role, role); in cdns_hw_role_state_machine()
263 static int cdns_idle_role_start(struct cdns *cdns) in cdns_idle_role_start() argument
268 static void cdns_idle_role_stop(struct cdns *cdns) in cdns_idle_role_stop() argument
271 phy_reset(cdns->usb3_phy); in cdns_idle_role_stop()
274 static int cdns_idle_init(struct cdns *cdns) in cdns_idle_init() argument
278 rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL); in cdns_idle_init()
289 cdns->roles[USB_ROLE_NONE] = rdrv; in cdns_idle_init()
296 * @cdns: controller
298 int cdns_hw_role_switch(struct cdns *cdns) in cdns_hw_role_switch() argument
304 if (cdns->role_sw) in cdns_hw_role_switch()
307 pm_runtime_get_sync(cdns->dev); in cdns_hw_role_switch()
309 current_role = cdns->role; in cdns_hw_role_switch()
310 real_role = cdns_hw_role_state_machine(cdns); in cdns_hw_role_switch()
316 cdns_role_stop(cdns); in cdns_hw_role_switch()
318 dev_dbg(cdns->dev, "Switching role %d -> %d", current_role, real_role); in cdns_hw_role_switch()
320 ret = cdns_role_start(cdns, real_role); in cdns_hw_role_switch()
323 dev_err(cdns->dev, "set %d has failed, back to %d\n", in cdns_hw_role_switch()
325 ret = cdns_role_start(cdns, current_role); in cdns_hw_role_switch()
327 dev_err(cdns->dev, "back to %d failed too\n", in cdns_hw_role_switch()
331 pm_runtime_put_sync(cdns->dev); in cdns_hw_role_switch()
344 struct cdns *cdns = usb_role_switch_get_drvdata(sw); in cdns_role_get() local
346 return cdns->role; in cdns_role_get()
360 struct cdns *cdns = usb_role_switch_get_drvdata(sw); in cdns_role_set() local
363 pm_runtime_get_sync(cdns->dev); in cdns_role_set()
365 if (cdns->role == role) in cdns_role_set()
368 if (cdns->dr_mode == USB_DR_MODE_HOST) { in cdns_role_set()
378 if (cdns->dr_mode == USB_DR_MODE_PERIPHERAL) { in cdns_role_set()
388 cdns_role_stop(cdns); in cdns_role_set()
389 ret = cdns_role_start(cdns, role); in cdns_role_set()
391 dev_err(cdns->dev, "set role %d has failed\n", role); in cdns_role_set()
394 pm_runtime_put_sync(cdns->dev); in cdns_role_set()
401 * @data: structure of cdns
407 struct cdns *cdns = data; in cdns_wakeup_irq() local
409 if (cdns->in_lpm) { in cdns_wakeup_irq()
411 cdns->wakeup_pending = true; in cdns_wakeup_irq()
412 if ((cdns->role == USB_ROLE_HOST) && cdns->host_dev) in cdns_wakeup_irq()
413 pm_request_resume(&cdns->host_dev->dev); in cdns_wakeup_irq()
423 * @cdns: Pointer to cdns structure.
427 int cdns_init(struct cdns *cdns) in cdns_init() argument
429 struct device *dev = cdns->dev; in cdns_init()
438 mutex_init(&cdns->mutex); in cdns_init()
446 sw_desc.driver_data = cdns; in cdns_init()
449 cdns->role_sw = usb_role_switch_register(dev, &sw_desc); in cdns_init()
450 if (IS_ERR(cdns->role_sw)) { in cdns_init()
452 return PTR_ERR(cdns->role_sw); in cdns_init()
456 if (cdns->wakeup_irq) { in cdns_init()
457 ret = devm_request_irq(cdns->dev, cdns->wakeup_irq, in cdns_init()
460 dev_name(cdns->dev), cdns); in cdns_init()
463 dev_err(cdns->dev, "couldn't register wakeup irq handler\n"); in cdns_init()
468 ret = cdns_drd_init(cdns); in cdns_init()
472 ret = cdns_core_init_role(cdns); in cdns_init()
476 spin_lock_init(&cdns->lock); in cdns_init()
482 cdns_drd_exit(cdns); in cdns_init()
484 if (cdns->role_sw) in cdns_init()
485 usb_role_switch_unregister(cdns->role_sw); in cdns_init()
493 * @cdns: Pointer to cdns structure.
497 int cdns_remove(struct cdns *cdns) in cdns_remove() argument
499 cdns_exit_roles(cdns); in cdns_remove()
500 usb_role_switch_unregister(cdns->role_sw); in cdns_remove()
507 int cdns_suspend(struct cdns *cdns) in cdns_suspend() argument
509 struct device *dev = cdns->dev; in cdns_suspend()
515 if (cdns->roles[cdns->role]->suspend) { in cdns_suspend()
516 spin_lock_irqsave(&cdns->lock, flags); in cdns_suspend()
517 cdns->roles[cdns->role]->suspend(cdns, false); in cdns_suspend()
518 spin_unlock_irqrestore(&cdns->lock, flags); in cdns_suspend()
525 int cdns_resume(struct cdns *cdns) in cdns_resume() argument
531 if (cdns_power_is_lost(cdns)) { in cdns_resume()
532 if (!cdns->role_sw) { in cdns_resume()
533 real_role = cdns_hw_role_state_machine(cdns); in cdns_resume()
534 if (real_role != cdns->role) { in cdns_resume()
535 ret = cdns_hw_role_switch(cdns); in cdns_resume()
543 if (cdns->role == USB_ROLE_HOST) in cdns_resume()
544 ret = cdns_drd_host_on(cdns); in cdns_resume()
545 else if (cdns->role == USB_ROLE_DEVICE) in cdns_resume()
546 ret = cdns_drd_gadget_on(cdns); in cdns_resume()
553 if (cdns->roles[cdns->role]->resume) in cdns_resume()
554 cdns->roles[cdns->role]->resume(cdns, cdns_power_is_lost(cdns)); in cdns_resume()
560 void cdns_set_active(struct cdns *cdns, u8 set_active) in cdns_set_active() argument
562 struct device *dev = cdns->dev; in cdns_set_active()