musb_readl = musb_default_readl;
        musb_writel = musb_default_writel;
 
-       /*
-        * We need musb_read/write functions initialized for PM.
-        * Note that at least 2430 glue needs autosuspend delay
-        * somewhere above 300 ms for the hardware to idle properly
-        * after disconnecting the cable in host mode. Let's use
-        * 500 ms for some margin.
-        */
-       pm_runtime_use_autosuspend(musb->controller);
-       pm_runtime_set_autosuspend_delay(musb->controller, 500);
-       pm_runtime_enable(musb->controller);
-
        /* The musb_platform_init() call:
         *   - adjusts musb->mregs
         *   - sets the musb->isr
        if (musb->ops->phy_callback)
                musb_phy_callback = musb->ops->phy_callback;
 
+       /*
+        * We need musb_read/write functions initialized for PM.
+        * Note that at least 2430 glue needs autosuspend delay
+        * somewhere above 300 ms for the hardware to idle properly
+        * after disconnecting the cable in host mode. Let's use
+        * 500 ms for some margin.
+        */
+       pm_runtime_use_autosuspend(musb->controller);
+       pm_runtime_set_autosuspend_delay(musb->controller, 500);
+       pm_runtime_enable(musb->controller);
        pm_runtime_get_sync(musb->controller);
 
        status = usb_phy_init(musb->xceiv);
 err_usb_phy_init:
        pm_runtime_dont_use_autosuspend(musb->controller);
        pm_runtime_put_sync(musb->controller);
+       pm_runtime_disable(musb->controller);
 
 fail2:
        if (musb->irq_wake)
        musb_platform_exit(musb);
 
 fail1:
-       pm_runtime_disable(musb->controller);
        dev_err(musb->controller,
                "musb_init_controller failed with status %d\n", status);
 
         */
        musb_exit_debugfs(musb);
 
+       cancel_work_sync(&musb->irq_work);
+       cancel_delayed_work_sync(&musb->finish_resume_work);
+       cancel_delayed_work_sync(&musb->deassert_reset_work);
        pm_runtime_get_sync(musb->controller);
        musb_host_cleanup(musb);
        musb_gadget_cleanup(musb);
        musb_generic_disable(musb);
        spin_unlock_irqrestore(&musb->lock, flags);
        musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
+       pm_runtime_dont_use_autosuspend(musb->controller);
+       pm_runtime_put_sync(musb->controller);
+       pm_runtime_disable(musb->controller);
        musb_platform_exit(musb);
-
        musb_phy_callback = NULL;
-
        if (musb->dma_controller)
                musb_dma_controller_destroy(musb->dma_controller);
-
        usb_phy_shutdown(musb->xceiv);
-
-       cancel_work_sync(&musb->irq_work);
-       cancel_delayed_work_sync(&musb->finish_resume_work);
-       cancel_delayed_work_sync(&musb->deassert_reset_work);
-       pm_runtime_dont_use_autosuspend(musb->controller);
-       pm_runtime_put_sync(musb->controller);
-       pm_runtime_disable(musb->controller);
        musb_free(musb);
        device_init_wakeup(dev, 0);
        return 0;