Lines Matching refs:cdns
26 static int cdns_idle_init(struct cdns *cdns);
28 static int cdns_role_start(struct cdns *cdns, enum usb_role role) in cdns_role_start() argument
35 mutex_lock(&cdns->mutex); in cdns_role_start()
36 cdns->role = role; in cdns_role_start()
37 mutex_unlock(&cdns->mutex); in cdns_role_start()
39 if (!cdns->roles[role]) in cdns_role_start()
42 if (cdns->roles[role]->state == CDNS_ROLE_STATE_ACTIVE) in cdns_role_start()
45 mutex_lock(&cdns->mutex); in cdns_role_start()
46 ret = cdns->roles[role]->start(cdns); in cdns_role_start()
48 cdns->roles[role]->state = CDNS_ROLE_STATE_ACTIVE; in cdns_role_start()
49 mutex_unlock(&cdns->mutex); in cdns_role_start()
54 static void cdns_role_stop(struct cdns *cdns) in cdns_role_stop() argument
56 enum usb_role role = cdns->role; in cdns_role_stop()
61 if (cdns->roles[role]->state == CDNS_ROLE_STATE_INACTIVE) in cdns_role_stop()
64 mutex_lock(&cdns->mutex); in cdns_role_stop()
65 cdns->roles[role]->stop(cdns); in cdns_role_stop()
66 cdns->roles[role]->state = CDNS_ROLE_STATE_INACTIVE; in cdns_role_stop()
67 mutex_unlock(&cdns->mutex); in cdns_role_stop()
70 static void cdns_exit_roles(struct cdns *cdns) in cdns_exit_roles() argument
72 cdns_role_stop(cdns); in cdns_exit_roles()
73 cdns_drd_exit(cdns); in cdns_exit_roles()
82 static int cdns_core_init_role(struct cdns *cdns) in cdns_core_init_role() argument
84 struct device *dev = cdns->dev; in cdns_core_init_role()
90 cdns->role = USB_ROLE_NONE; in cdns_core_init_role()
98 if (cdns->version == CDNSP_CONTROLLER_V2) { in cdns_core_init_role()
121 best_dr_mode = cdns->dr_mode; in cdns_core_init_role()
123 ret = cdns_idle_init(cdns); in cdns_core_init_role()
128 best_dr_mode = cdns->dr_mode; in cdns_core_init_role()
129 } else if (cdns->dr_mode == USB_DR_MODE_OTG) { in cdns_core_init_role()
131 } else if (cdns->dr_mode != dr_mode) { in cdns_core_init_role()
139 if ((cdns->version == CDNSP_CONTROLLER_V2 && in cdns_core_init_role()
141 (cdns->version < CDNSP_CONTROLLER_V2 && in cdns_core_init_role()
143 ret = cdns_host_init(cdns); in cdns_core_init_role()
155 if (cdns->gadget_init) in cdns_core_init_role()
156 ret = cdns->gadget_init(cdns); in cdns_core_init_role()
167 cdns->dr_mode = dr_mode; in cdns_core_init_role()
169 ret = cdns_drd_update_mode(cdns); in cdns_core_init_role()
174 ret = cdns_role_start(cdns, USB_ROLE_NONE); in cdns_core_init_role()
178 switch (cdns->dr_mode) { in cdns_core_init_role()
180 ret = cdns_hw_role_switch(cdns); in cdns_core_init_role()
185 ret = cdns_role_start(cdns, USB_ROLE_DEVICE); in cdns_core_init_role()
190 ret = cdns_role_start(cdns, USB_ROLE_HOST); in cdns_core_init_role()
201 cdns_exit_roles(cdns); in cdns_core_init_role()
211 static enum usb_role cdns_hw_role_state_machine(struct cdns *cdns) in cdns_hw_role_state_machine() argument
216 if (cdns->dr_mode != USB_DR_MODE_OTG) { in cdns_hw_role_state_machine()
217 if (cdns_is_host(cdns)) in cdns_hw_role_state_machine()
219 if (cdns_is_device(cdns)) in cdns_hw_role_state_machine()
225 id = cdns_get_id(cdns); in cdns_hw_role_state_machine()
226 vbus = cdns_get_vbus(cdns); in cdns_hw_role_state_machine()
234 role = cdns->role; in cdns_hw_role_state_machine()
257 dev_dbg(cdns->dev, "role %d -> %d\n", cdns->role, role); in cdns_hw_role_state_machine()
262 static int cdns_idle_role_start(struct cdns *cdns) in cdns_idle_role_start() argument
267 static void cdns_idle_role_stop(struct cdns *cdns) in cdns_idle_role_stop() argument
270 phy_reset(cdns->usb3_phy); in cdns_idle_role_stop()
273 static int cdns_idle_init(struct cdns *cdns) in cdns_idle_init() argument
277 rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL); in cdns_idle_init()
288 cdns->roles[USB_ROLE_NONE] = rdrv; in cdns_idle_init()
297 int cdns_hw_role_switch(struct cdns *cdns) in cdns_hw_role_switch() argument
303 if (cdns->role_sw) in cdns_hw_role_switch()
306 pm_runtime_get_sync(cdns->dev); in cdns_hw_role_switch()
308 current_role = cdns->role; in cdns_hw_role_switch()
309 real_role = cdns_hw_role_state_machine(cdns); in cdns_hw_role_switch()
315 cdns_role_stop(cdns); in cdns_hw_role_switch()
317 dev_dbg(cdns->dev, "Switching role %d -> %d", current_role, real_role); in cdns_hw_role_switch()
319 ret = cdns_role_start(cdns, real_role); in cdns_hw_role_switch()
322 dev_err(cdns->dev, "set %d has failed, back to %d\n", in cdns_hw_role_switch()
324 ret = cdns_role_start(cdns, current_role); in cdns_hw_role_switch()
326 dev_err(cdns->dev, "back to %d failed too\n", in cdns_hw_role_switch()
330 pm_runtime_put_sync(cdns->dev); in cdns_hw_role_switch()
343 struct cdns *cdns = usb_role_switch_get_drvdata(sw); in cdns_role_get() local
345 return cdns->role; in cdns_role_get()
359 struct cdns *cdns = usb_role_switch_get_drvdata(sw); in cdns_role_set() local
362 pm_runtime_get_sync(cdns->dev); in cdns_role_set()
364 if (cdns->role == role) in cdns_role_set()
367 if (cdns->dr_mode == USB_DR_MODE_HOST) { in cdns_role_set()
377 if (cdns->dr_mode == USB_DR_MODE_PERIPHERAL) { in cdns_role_set()
387 cdns_role_stop(cdns); in cdns_role_set()
388 ret = cdns_role_start(cdns, role); in cdns_role_set()
390 dev_err(cdns->dev, "set role %d has failed\n", role); in cdns_role_set()
393 pm_runtime_put_sync(cdns->dev); in cdns_role_set()
406 struct cdns *cdns = data; in cdns_wakeup_irq() local
408 if (cdns->in_lpm) { in cdns_wakeup_irq()
410 cdns->wakeup_pending = true; in cdns_wakeup_irq()
411 if ((cdns->role == USB_ROLE_HOST) && cdns->host_dev) in cdns_wakeup_irq()
412 pm_request_resume(&cdns->host_dev->dev); in cdns_wakeup_irq()
426 int cdns_init(struct cdns *cdns) in cdns_init() argument
428 struct device *dev = cdns->dev; in cdns_init()
437 mutex_init(&cdns->mutex); in cdns_init()
445 sw_desc.driver_data = cdns; in cdns_init()
448 cdns->role_sw = usb_role_switch_register(dev, &sw_desc); in cdns_init()
449 if (IS_ERR(cdns->role_sw)) { in cdns_init()
451 return PTR_ERR(cdns->role_sw); in cdns_init()
455 if (cdns->wakeup_irq) { in cdns_init()
456 ret = devm_request_irq(cdns->dev, cdns->wakeup_irq, in cdns_init()
459 dev_name(cdns->dev), cdns); in cdns_init()
462 dev_err(cdns->dev, "couldn't register wakeup irq handler\n"); in cdns_init()
467 ret = cdns_drd_init(cdns); in cdns_init()
471 ret = cdns_core_init_role(cdns); in cdns_init()
475 spin_lock_init(&cdns->lock); in cdns_init()
481 cdns_drd_exit(cdns); in cdns_init()
483 if (cdns->role_sw) in cdns_init()
484 usb_role_switch_unregister(cdns->role_sw); in cdns_init()
496 int cdns_remove(struct cdns *cdns) in cdns_remove() argument
498 cdns_exit_roles(cdns); in cdns_remove()
499 usb_role_switch_unregister(cdns->role_sw); in cdns_remove()
506 int cdns_suspend(struct cdns *cdns) in cdns_suspend() argument
508 struct device *dev = cdns->dev; in cdns_suspend()
514 if (cdns->roles[cdns->role]->suspend) { in cdns_suspend()
515 spin_lock_irqsave(&cdns->lock, flags); in cdns_suspend()
516 cdns->roles[cdns->role]->suspend(cdns, false); in cdns_suspend()
517 spin_unlock_irqrestore(&cdns->lock, flags); in cdns_suspend()
524 int cdns_resume(struct cdns *cdns) in cdns_resume() argument
530 if (cdns_power_is_lost(cdns)) { in cdns_resume()
531 if (cdns->role_sw) { in cdns_resume()
532 cdns->role = cdns_role_get(cdns->role_sw); in cdns_resume()
534 real_role = cdns_hw_role_state_machine(cdns); in cdns_resume()
535 if (real_role != cdns->role) { in cdns_resume()
536 ret = cdns_hw_role_switch(cdns); in cdns_resume()
544 if (cdns->role == USB_ROLE_HOST) in cdns_resume()
545 ret = cdns_drd_host_on(cdns); in cdns_resume()
546 else if (cdns->role == USB_ROLE_DEVICE) in cdns_resume()
547 ret = cdns_drd_gadget_on(cdns); in cdns_resume()
554 if (cdns->roles[cdns->role]->resume) in cdns_resume()
555 cdns->roles[cdns->role]->resume(cdns, cdns_power_is_lost(cdns)); in cdns_resume()
561 void cdns_set_active(struct cdns *cdns, u8 set_active) in cdns_set_active() argument
563 struct device *dev = cdns->dev; in cdns_set_active()