|
@@ -2005,17 +2005,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
|
musb_readl = musb_default_readl;
|
|
musb_readl = musb_default_readl;
|
|
musb_writel = musb_default_writel;
|
|
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:
|
|
/* The musb_platform_init() call:
|
|
* - adjusts musb->mregs
|
|
* - adjusts musb->mregs
|
|
* - sets the musb->isr
|
|
* - sets the musb->isr
|
|
@@ -2117,6 +2106,16 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
|
if (musb->ops->phy_callback)
|
|
if (musb->ops->phy_callback)
|
|
musb_phy_callback = 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);
|
|
pm_runtime_get_sync(musb->controller);
|
|
|
|
|
|
status = usb_phy_init(musb->xceiv);
|
|
status = usb_phy_init(musb->xceiv);
|
|
@@ -2251,6 +2250,7 @@ fail2_5:
|
|
err_usb_phy_init:
|
|
err_usb_phy_init:
|
|
pm_runtime_dont_use_autosuspend(musb->controller);
|
|
pm_runtime_dont_use_autosuspend(musb->controller);
|
|
pm_runtime_put_sync(musb->controller);
|
|
pm_runtime_put_sync(musb->controller);
|
|
|
|
+ pm_runtime_disable(musb->controller);
|
|
|
|
|
|
fail2:
|
|
fail2:
|
|
if (musb->irq_wake)
|
|
if (musb->irq_wake)
|
|
@@ -2258,7 +2258,6 @@ fail2:
|
|
musb_platform_exit(musb);
|
|
musb_platform_exit(musb);
|
|
|
|
|
|
fail1:
|
|
fail1:
|
|
- pm_runtime_disable(musb->controller);
|
|
|
|
dev_err(musb->controller,
|
|
dev_err(musb->controller,
|
|
"musb_init_controller failed with status %d\n", status);
|
|
"musb_init_controller failed with status %d\n", status);
|
|
|
|
|
|
@@ -2306,6 +2305,9 @@ static int musb_remove(struct platform_device *pdev)
|
|
*/
|
|
*/
|
|
musb_exit_debugfs(musb);
|
|
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);
|
|
pm_runtime_get_sync(musb->controller);
|
|
musb_host_cleanup(musb);
|
|
musb_host_cleanup(musb);
|
|
musb_gadget_cleanup(musb);
|
|
musb_gadget_cleanup(musb);
|
|
@@ -2314,21 +2316,14 @@ static int musb_remove(struct platform_device *pdev)
|
|
musb_generic_disable(musb);
|
|
musb_generic_disable(musb);
|
|
spin_unlock_irqrestore(&musb->lock, flags);
|
|
spin_unlock_irqrestore(&musb->lock, flags);
|
|
musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
|
|
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_platform_exit(musb);
|
|
-
|
|
|
|
musb_phy_callback = NULL;
|
|
musb_phy_callback = NULL;
|
|
-
|
|
|
|
if (musb->dma_controller)
|
|
if (musb->dma_controller)
|
|
musb_dma_controller_destroy(musb->dma_controller);
|
|
musb_dma_controller_destroy(musb->dma_controller);
|
|
-
|
|
|
|
usb_phy_shutdown(musb->xceiv);
|
|
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);
|
|
musb_free(musb);
|
|
device_init_wakeup(dev, 0);
|
|
device_init_wakeup(dev, 0);
|
|
return 0;
|
|
return 0;
|