usb: dwc3: get rid of ->prepare()/->complete()
authorFelipe Balbi <balbi@ti.com>
Tue, 7 Oct 2014 15:19:23 +0000 (10:19 -0500)
committerFelipe Balbi <balbi@ti.com>
Mon, 3 Nov 2014 16:00:58 +0000 (10:00 -0600)
Using ->prepare()/->complete() to mask/unmask
IRQs is wrong at least for dwc3. We need to
make sure that by the end of ->resume(), IRQs
are working and ready to fire because a child
device may need working IRQs for its own ->resume()
method.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c

index 4d4e854f99aa6a60dc0d713fd09ab31c98684138..fa396fc57a85ad24327bcad3864126b7b70cac39 100644 (file)
@@ -825,50 +825,6 @@ static int dwc3_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int dwc3_prepare(struct device *dev)
-{
-       struct dwc3     *dwc = dev_get_drvdata(dev);
-       unsigned long   flags;
-
-       spin_lock_irqsave(&dwc->lock, flags);
-
-       switch (dwc->dr_mode) {
-       case USB_DR_MODE_PERIPHERAL:
-       case USB_DR_MODE_OTG:
-               dwc3_gadget_prepare(dwc);
-               /* FALLTHROUGH */
-       case USB_DR_MODE_HOST:
-       default:
-               dwc3_event_buffers_cleanup(dwc);
-               break;
-       }
-
-       spin_unlock_irqrestore(&dwc->lock, flags);
-
-       return 0;
-}
-
-static void dwc3_complete(struct device *dev)
-{
-       struct dwc3     *dwc = dev_get_drvdata(dev);
-       unsigned long   flags;
-
-       spin_lock_irqsave(&dwc->lock, flags);
-
-       dwc3_event_buffers_setup(dwc);
-       switch (dwc->dr_mode) {
-       case USB_DR_MODE_PERIPHERAL:
-       case USB_DR_MODE_OTG:
-               dwc3_gadget_complete(dwc);
-               /* FALLTHROUGH */
-       case USB_DR_MODE_HOST:
-       default:
-               break;
-       }
-
-       spin_unlock_irqrestore(&dwc->lock, flags);
-}
-
 static int dwc3_suspend(struct device *dev)
 {
        struct dwc3     *dwc = dev_get_drvdata(dev);
@@ -883,7 +839,7 @@ static int dwc3_suspend(struct device *dev)
                /* FALLTHROUGH */
        case USB_DR_MODE_HOST:
        default:
-               /* do nothing */
+               dwc3_event_buffers_cleanup(dwc);
                break;
        }
 
@@ -916,6 +872,7 @@ static int dwc3_resume(struct device *dev)
 
        spin_lock_irqsave(&dwc->lock, flags);
 
+       dwc3_event_buffers_setup(dwc);
        dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl);
 
        switch (dwc->dr_mode) {
@@ -944,9 +901,6 @@ err_usb2phy_init:
 }
 
 static const struct dev_pm_ops dwc3_dev_pm_ops = {
-       .prepare        = dwc3_prepare,
-       .complete       = dwc3_complete,
-
        SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume)
 };
 
index 66f62563bcf94e970b01b8661dd3572a647ede5b..a715ee1f3c062aa7ef5862407dc57d8272243655 100644 (file)
@@ -964,20 +964,9 @@ static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc,
 
 /* power management interface */
 #if !IS_ENABLED(CONFIG_USB_DWC3_HOST)
-int dwc3_gadget_prepare(struct dwc3 *dwc);
-void dwc3_gadget_complete(struct dwc3 *dwc);
 int dwc3_gadget_suspend(struct dwc3 *dwc);
 int dwc3_gadget_resume(struct dwc3 *dwc);
 #else
-static inline int dwc3_gadget_prepare(struct dwc3 *dwc)
-{
-       return 0;
-}
-
-static inline void dwc3_gadget_complete(struct dwc3 *dwc)
-{
-}
-
 static inline int dwc3_gadget_suspend(struct dwc3 *dwc)
 {
        return 0;
index 546ea5431b8cd225165b38ca0e5ff2b53906738c..748b87b3f98ad662874ad3a7df5e7666e3818587 100644 (file)
@@ -2744,26 +2744,13 @@ void dwc3_gadget_exit(struct dwc3 *dwc)
                        dwc->ctrl_req, dwc->ctrl_req_addr);
 }
 
-int dwc3_gadget_prepare(struct dwc3 *dwc)
+int dwc3_gadget_suspend(struct dwc3 *dwc)
 {
        if (dwc->pullups_connected) {
                dwc3_gadget_disable_irq(dwc);
                dwc3_gadget_run_stop(dwc, true, true);
        }
 
-       return 0;
-}
-
-void dwc3_gadget_complete(struct dwc3 *dwc)
-{
-       if (dwc->pullups_connected) {
-               dwc3_gadget_enable_irq(dwc);
-               dwc3_gadget_run_stop(dwc, true, false);
-       }
-}
-
-int dwc3_gadget_suspend(struct dwc3 *dwc)
-{
        __dwc3_gadget_ep_disable(dwc->eps[0]);
        __dwc3_gadget_ep_disable(dwc->eps[1]);
 
@@ -2798,6 +2785,11 @@ int dwc3_gadget_resume(struct dwc3 *dwc)
 
        dwc3_writel(dwc->regs, DWC3_DCFG, dwc->dcfg);
 
+       if (dwc->pullups_connected) {
+               dwc3_gadget_enable_irq(dwc);
+               dwc3_gadget_run_stop(dwc, true, false);
+       }
+
        return 0;
 
 err1: