usb: dwc3: Get gadget mode working again
authorJohn Stultz <john.stultz@linaro.org>
Wed, 15 Nov 2017 18:38:46 +0000 (10:38 -0800)
committerDouglas RAILLARD <douglas.raillard@arm.com>
Tue, 14 Aug 2018 15:32:10 +0000 (16:32 +0100)
Adapt from 4.15-rc changes that broke gadget mode

Should be squished down with earlier patch.

Signed-off-by: John Stultz <john.stultz@linaro.org>
drivers/usb/dwc3/core.c

index 8ef5a5a765d9dc43ddd1e7a3ff042d516dc8fecc..12154c7f5548a85fa7232b73ca63d3a42ca6e6a1 100644 (file)
@@ -1514,10 +1514,10 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
 
        switch (dwc->current_dr_role) {
        case DWC3_GCTL_PRTCAP_DEVICE:
+       case DWC3_GCTL_PRTCAP_OTG:
                spin_lock_irqsave(&dwc->lock, flags);
                dwc3_gadget_suspend(dwc);
                spin_unlock_irqrestore(&dwc->lock, flags);
-               dwc3_core_exit(dwc);
                break;
        case DWC3_GCTL_PRTCAP_HOST:
                if (!PMSG_IS_AUTO(msg)) {
@@ -1559,6 +1559,8 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
                break;
        }
 
+       dwc3_core_exit(dwc);
+
        return 0;
 }
 
@@ -1568,12 +1570,16 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
        int             ret;
        u32             reg;
 
+       ret = dwc3_core_init(dwc);
+       if (ret)
+               return ret;
+
        switch (dwc->current_dr_role) {
        case DWC3_GCTL_PRTCAP_DEVICE:
                ret = dwc3_core_init_for_resume(dwc);
                if (ret)
                        return ret;
-
+       case DWC3_GCTL_PRTCAP_OTG:
                dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE);
                spin_lock_irqsave(&dwc->lock, flags);
                dwc3_gadget_resume(dwc);
@@ -1679,6 +1685,7 @@ static int dwc3_runtime_resume(struct device *dev)
 
        switch (dwc->current_dr_role) {
        case DWC3_GCTL_PRTCAP_DEVICE:
+       case DWC3_GCTL_PRTCAP_OTG:
                dwc3_gadget_process_pending_events(dwc);
                break;
        case DWC3_GCTL_PRTCAP_HOST:
@@ -1688,7 +1695,6 @@ static int dwc3_runtime_resume(struct device *dev)
        }
 
        pm_runtime_mark_last_busy(dev);
-       /* maybe drop this? */
        pm_runtime_get(dev);
 
        return 0;
@@ -1700,6 +1706,7 @@ static int dwc3_runtime_idle(struct device *dev)
 
        switch (dwc->current_dr_role) {
        case DWC3_GCTL_PRTCAP_DEVICE:
+       case DWC3_GCTL_PRTCAP_OTG:
                if (dwc3_runtime_checks(dwc))
                        return -EBUSY;
                break;