usb: dwc3: Add dual-role support
[linux-2.6-block.git] / drivers / usb / dwc3 / core.c
index 458e7c6cc0028911b153d4a7b3f94d0a2bd19ce1..455d89a1cd6dbbb3e3f707bc42bada4a9569e5d7 100644 (file)
@@ -921,7 +921,12 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
                break;
        case USB_DR_MODE_OTG:
                INIT_WORK(&dwc->drd_work, __dwc3_set_mode);
-               dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
+               ret = dwc3_drd_init(dwc);
+               if (ret) {
+                       if (ret != -EPROBE_DEFER)
+                               dev_err(dev, "failed to initialize dual-role\n");
+                       return ret;
+               }
                break;
        default:
                dev_err(dev, "Unsupported mode of operation %d\n", dwc->dr_mode);
@@ -941,9 +946,7 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)
                dwc3_host_exit(dwc);
                break;
        case USB_DR_MODE_OTG:
-               dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
-               dwc3_gadget_exit(dwc);
-               flush_work(&dwc->drd_work);
+               dwc3_drd_exit(dwc);
                break;
        default:
                /* do nothing */