Lines Matching defs:cdns

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