Lines Matching +full:data +full:- +full:role

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2018-2019 Cadence.
6 * Copyright (C) 2017-2018 NXP
14 #include <linux/dma-mapping.h>
24 #include "host-export.h"
29 static int cdns_role_start(struct cdns *cdns, enum usb_role role)
33 if (WARN_ON(role > USB_ROLE_DEVICE))
36 mutex_lock(&cdns->mutex);
37 cdns->role = role;
38 mutex_unlock(&cdns->mutex);
40 if (!cdns->roles[role])
41 return -ENXIO;
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);
57 enum usb_role role = cdns->role;
59 if (WARN_ON(role > USB_ROLE_DEVICE))
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);
78 * cdns_core_init_role - initialize role of operation
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;
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) {
134 return -EINVAL;
140 if ((cdns->version == CDNSP_CONTROLLER_V2 &&
142 (cdns->version < CDNSP_CONTROLLER_V2 &&
146 ret = -ENXIO;
156 if (cdns->gadget_init)
157 ret = cdns->gadget_init(cdns);
159 ret = -ENXIO;
168 cdns->dr_mode = dr_mode;
174 /* Initialize idle role to start with */
179 switch (cdns->dr_mode) {
196 ret = -EINVAL;
207 * cdns_hw_role_state_machine - role switch state machine based on hw events.
210 * Returns next role to be entered based on hw events.
214 enum usb_role role = USB_ROLE_NONE;
217 if (cdns->dr_mode != USB_DR_MODE_OTG) {
219 role = USB_ROLE_HOST;
221 role = USB_ROLE_DEVICE;
223 return role;
230 * Role change state machine
232 * Previous state: cdns->role
233 * Next state: role
235 role = cdns->role;
237 switch (role) {
244 role = USB_ROLE_HOST;
246 role = USB_ROLE_DEVICE;
250 role = USB_ROLE_NONE;
254 role = USB_ROLE_NONE;
258 dev_dbg(cdns->dev, "role %d -> %d\n", cdns->role, role);
260 return role;
271 phy_reset(cdns->usb3_phy);
278 rdrv = devm_kzalloc(cdns->dev, sizeof(*rdrv), GFP_KERNEL);
280 return -ENOMEM;
282 rdrv->start = cdns_idle_role_start;
283 rdrv->stop = cdns_idle_role_stop;
284 rdrv->state = CDNS_ROLE_STATE_INACTIVE;
285 rdrv->suspend = NULL;
286 rdrv->resume = NULL;
287 rdrv->name = "idle";
289 cdns->roles[USB_ROLE_NONE] = rdrv;
295 * cdns_hw_role_switch - switch roles based on HW state
303 /* Depends on role switch class */
304 if (cdns->role_sw)
307 pm_runtime_get_sync(cdns->dev);
309 current_role = cdns->role;
318 dev_dbg(cdns->dev, "Switching role %d -> %d", current_role, real_role);
322 /* Back to current role */
323 dev_err(cdns->dev, "set %d has failed, back to %d\n",
327 dev_err(cdns->dev, "back to %d failed too\n",
331 pm_runtime_put_sync(cdns->dev);
336 * cdns_role_get - get current role of controller.
338 * @sw: pointer to USB role switch structure
340 * Returns role
346 return cdns->role;
350 * cdns_role_set - set current role of controller.
352 * @sw: pointer to USB role switch structure
353 * @role: the previous role
355 * - Role switch for dual-role devices
356 * - USB_ROLE_GADGET <--> USB_ROLE_NONE for peripheral-only devices
358 static int cdns_role_set(struct usb_role_switch *sw, enum usb_role role)
363 pm_runtime_get_sync(cdns->dev);
365 if (cdns->role == role)
368 if (cdns->dr_mode == USB_DR_MODE_HOST) {
369 switch (role) {
378 if (cdns->dr_mode == USB_DR_MODE_PERIPHERAL) {
379 switch (role) {
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);
399 * cdns_wakeup_irq - interrupt handler for wakeup events
401 * @data: structure of cdns
405 static irqreturn_t cdns_wakeup_irq(int irq, void *data)
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);
422 * cdns_init - probe for cdns3/cdnsp core device
429 struct device *dev = cdns->dev;
438 mutex_init(&cdns->mutex);
440 if (device_property_read_bool(dev, "usb-role-switch")) {
447 sw_desc.fwnode = dev->fwnode;
449 cdns->role_sw = usb_role_switch_register(dev, &sw_desc);
450 if (IS_ERR(cdns->role_sw)) {
451 dev_warn(dev, "Unable to register Role Switch\n");
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");
476 spin_lock_init(&cdns->lock);
484 if (cdns->role_sw)
485 usb_role_switch_unregister(cdns->role_sw);
492 * cdns_remove - unbind drd driver and clean up
500 usb_role_switch_unregister(cdns->role_sw);
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);
532 if (!cdns->role_sw) {
534 if (real_role != cdns->role) {
543 if (cdns->role == USB_ROLE_HOST)
545 else if (cdns->role == USB_ROLE_DEVICE)
553 if (cdns->roles[cdns->role]->resume)
554 cdns->roles[cdns->role]->resume(cdns, cdns_power_is_lost(cdns));
562 struct device *dev = cdns->dev;