]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/usb/musb/musb_core.c
Merge remote-tracking branch 'usb-gadget/next'
[karo-tx-linux.git] / drivers / usb / musb / musb_core.c
index 208785e36d5265988c807e0a5242a1579a284a77..0a43329569d178de72a5c8ee619e7206c360c51c 100644 (file)
@@ -1809,8 +1809,7 @@ static void musb_free(struct musb *musb)
                        disable_irq_wake(musb->nIrq);
                free_irq(musb->nIrq, musb);
        }
-       if (musb->dma_controller)
-               dma_controller_destroy(musb->dma_controller);
+       cancel_work_sync(&musb->irq_work);
 
        musb_host_free(musb);
 }
@@ -1885,8 +1884,13 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
 
        pm_runtime_get_sync(musb->controller);
 
-       if (use_dma && dev->dma_mask)
+       if (use_dma && dev->dma_mask) {
                musb->dma_controller = dma_controller_create(musb, musb->mregs);
+               if (IS_ERR(musb->dma_controller)) {
+                       status = PTR_ERR(musb->dma_controller);
+                       goto fail2_5;
+               }
+       }
 
        /* be sure interrupts are disabled before connecting ISR */
        musb_platform_disable(musb);
@@ -1946,6 +1950,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
                if (status < 0)
                        goto fail3;
                status = musb_gadget_setup(musb);
+               if (status)
+                       musb_host_cleanup(musb);
                break;
        default:
                dev_err(dev, "unsupported port mode %d\n", musb->port_mode);
@@ -1972,10 +1978,12 @@ fail5:
 
 fail4:
        musb_gadget_cleanup(musb);
+       musb_host_cleanup(musb);
 
 fail3:
        if (musb->dma_controller)
                dma_controller_destroy(musb->dma_controller);
+fail2_5:
        pm_runtime_put_sync(musb->controller);
 
 fail2:
@@ -2032,6 +2040,9 @@ static int musb_remove(struct platform_device *pdev)
        musb_exit_debugfs(musb);
        musb_shutdown(pdev);
 
+       if (musb->dma_controller)
+               dma_controller_destroy(musb->dma_controller);
+
        musb_free(musb);
        device_init_wakeup(dev, 0);
        return 0;