Lines Matching refs:cdns
28 static int cdns3_idle_init(struct cdns3 *cdns);
32 struct cdns3 cdns; member
36 struct cdns3 cdns; member
40 struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns) in cdns3_get_current_role_driver() argument
42 WARN_ON(!cdns->roles[cdns->role]); in cdns3_get_current_role_driver()
43 return cdns->roles[cdns->role]; in cdns3_get_current_role_driver()
46 static int cdns3_role_start(struct cdns3 *cdns, enum usb_role role) in cdns3_role_start() argument
53 mutex_lock(&cdns->mutex); in cdns3_role_start()
54 cdns->role = role; in cdns3_role_start()
55 mutex_unlock(&cdns->mutex); in cdns3_role_start()
57 if (!cdns->roles[role]) in cdns3_role_start()
60 if (cdns->roles[role]->state == CDNS3_ROLE_STATE_ACTIVE) in cdns3_role_start()
63 mutex_lock(&cdns->mutex); in cdns3_role_start()
64 ret = cdns->roles[role]->start(cdns); in cdns3_role_start()
66 cdns->roles[role]->state = CDNS3_ROLE_STATE_ACTIVE; in cdns3_role_start()
67 mutex_unlock(&cdns->mutex); in cdns3_role_start()
72 static void cdns3_role_stop(struct cdns3 *cdns) in cdns3_role_stop() argument
74 enum usb_role role = cdns->role; in cdns3_role_stop()
79 if (cdns->roles[role]->state == CDNS3_ROLE_STATE_INACTIVE) in cdns3_role_stop()
82 mutex_lock(&cdns->mutex); in cdns3_role_stop()
83 cdns->roles[role]->stop(cdns); in cdns3_role_stop()
84 cdns->roles[role]->state = CDNS3_ROLE_STATE_INACTIVE; in cdns3_role_stop()
85 mutex_unlock(&cdns->mutex); in cdns3_role_stop()
88 static void cdns3_exit_roles(struct cdns3 *cdns) in cdns3_exit_roles() argument
90 cdns3_role_stop(cdns); in cdns3_exit_roles()
91 cdns3_drd_exit(cdns); in cdns3_exit_roles()
94 static enum usb_role cdsn3_hw_role_state_machine(struct cdns3 *cdns);
102 static int cdns3_core_init_role(struct cdns3 *cdns) in cdns3_core_init_role() argument
104 struct udevice *dev = cdns->dev; in cdns3_core_init_role()
110 cdns->role = USB_ROLE_NONE; in cdns3_core_init_role()
131 best_dr_mode = cdns->dr_mode; in cdns3_core_init_role()
133 ret = cdns3_idle_init(cdns); in cdns3_core_init_role()
138 best_dr_mode = cdns->dr_mode; in cdns3_core_init_role()
139 } else if (cdns->dr_mode == USB_DR_MODE_OTG) { in cdns3_core_init_role()
141 } else if (cdns->dr_mode != dr_mode) { in cdns3_core_init_role()
150 ret = cdns3_host_init(cdns); in cdns3_core_init_role()
161 ret = cdns3_gadget_init(cdns); in cdns3_core_init_role()
170 cdns->dr_mode = dr_mode; in cdns3_core_init_role()
172 ret = cdns3_drd_update_mode(cdns); in cdns3_core_init_role()
176 if (cdns->dr_mode != USB_DR_MODE_OTG) { in cdns3_core_init_role()
177 ret = cdns3_hw_role_switch(cdns); in cdns3_core_init_role()
184 cdns3_exit_roles(cdns); in cdns3_core_init_role()
194 static enum usb_role cdsn3_hw_role_state_machine(struct cdns3 *cdns) in cdsn3_hw_role_state_machine() argument
199 if (cdns->dr_mode != USB_DR_MODE_OTG) in cdsn3_hw_role_state_machine()
202 id = cdns3_get_id(cdns); in cdsn3_hw_role_state_machine()
203 vbus = cdns3_get_vbus(cdns); in cdsn3_hw_role_state_machine()
211 role = cdns->role; in cdsn3_hw_role_state_machine()
234 dev_dbg(cdns->dev, "role %d -> %d\n", cdns->role, role); in cdsn3_hw_role_state_machine()
239 if (cdns3_is_host(cdns)) in cdsn3_hw_role_state_machine()
241 if (cdns3_is_device(cdns)) in cdsn3_hw_role_state_machine()
247 static int cdns3_idle_role_start(struct cdns3 *cdns) in cdns3_idle_role_start() argument
252 static void cdns3_idle_role_stop(struct cdns3 *cdns) in cdns3_idle_role_stop() argument
255 generic_phy_reset(&cdns->usb3_phy); in cdns3_idle_role_stop()
258 static int cdns3_idle_init(struct cdns3 *cdns) in cdns3_idle_init() argument
262 rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL); in cdns3_idle_init()
273 cdns->roles[USB_ROLE_NONE] = rdrv; in cdns3_idle_init()
282 int cdns3_hw_role_switch(struct cdns3 *cdns) in cdns3_hw_role_switch() argument
288 if (cdns->role_override) in cdns3_hw_role_switch()
291 current_role = cdns->role; in cdns3_hw_role_switch()
292 real_role = cdsn3_hw_role_state_machine(cdns); in cdns3_hw_role_switch()
298 cdns3_role_stop(cdns); in cdns3_hw_role_switch()
300 dev_dbg(cdns->dev, "Switching role %d -> %d", current_role, real_role); in cdns3_hw_role_switch()
302 ret = cdns3_role_start(cdns, real_role); in cdns3_hw_role_switch()
305 dev_err(cdns->dev, "set %d has failed, back to %d\n", in cdns3_hw_role_switch()
307 ret = cdns3_role_start(cdns, current_role); in cdns3_hw_role_switch()
309 dev_err(cdns->dev, "back to %d failed too\n", in cdns3_hw_role_switch()
316 static int cdns3_probe(struct cdns3 *cdns) in cdns3_probe() argument
318 struct udevice *dev = cdns->dev; in cdns3_probe()
321 cdns->xhci_regs = dev_remap_addr_name(dev, "xhci"); in cdns3_probe()
322 if (!cdns->xhci_regs) in cdns3_probe()
325 cdns->dev_regs = dev_remap_addr_name(dev, "dev"); in cdns3_probe()
326 if (!cdns->dev_regs) in cdns3_probe()
329 mutex_init(&cdns->mutex); in cdns3_probe()
331 ret = generic_phy_get_by_name(dev, "cdns3,usb2-phy", &cdns->usb2_phy); in cdns3_probe()
335 ret = generic_phy_init(&cdns->usb2_phy); in cdns3_probe()
339 ret = generic_phy_get_by_name(dev, "cdns3,usb3-phy", &cdns->usb3_phy); in cdns3_probe()
343 ret = generic_phy_init(&cdns->usb3_phy); in cdns3_probe()
347 ret = generic_phy_power_on(&cdns->usb2_phy); in cdns3_probe()
351 ret = generic_phy_power_on(&cdns->usb3_phy); in cdns3_probe()
355 ret = cdns3_drd_init(cdns); in cdns3_probe()
359 ret = cdns3_core_init_role(cdns); in cdns3_probe()
368 static int cdns3_remove(struct cdns3 *cdns) in cdns3_remove() argument
370 cdns3_exit_roles(cdns); in cdns3_remove()
371 generic_phy_power_off(&cdns->usb2_phy); in cdns3_remove()
372 generic_phy_power_off(&cdns->usb3_phy); in cdns3_remove()
373 generic_phy_exit(&cdns->usb2_phy); in cdns3_remove()
374 generic_phy_exit(&cdns->usb3_phy); in cdns3_remove()
439 struct cdns3 *cdns = &priv->cdns; in cdns3_gadget_probe() local
441 cdns->dev = dev; in cdns3_gadget_probe()
443 return cdns3_probe(cdns); in cdns3_gadget_probe()
449 struct cdns3 *cdns = &priv->cdns; in cdns3_gadget_remove() local
451 return cdns3_remove(cdns); in cdns3_gadget_remove()
470 struct cdns3 *cdns = &priv->cdns; in cdns3_host_probe() local
472 cdns->dev = dev; in cdns3_host_probe()
474 return cdns3_probe(cdns); in cdns3_host_probe()
480 struct cdns3 *cdns = &priv->cdns; in cdns3_host_remove() local
482 return cdns3_remove(cdns); in cdns3_host_remove()