aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/musb_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb/musb_core.c')
-rw-r--r--drivers/usb/musb/musb_core.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 029692053dd3..ff5a1a8989d5 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -906,7 +906,7 @@ b_host:
906 */ 906 */
907 if (int_usb & MUSB_INTR_RESET) { 907 if (int_usb & MUSB_INTR_RESET) {
908 handled = IRQ_HANDLED; 908 handled = IRQ_HANDLED;
909 if (devctl & MUSB_DEVCTL_HM) { 909 if (is_host_active(musb)) {
910 /* 910 /*
911 * When BABBLE happens what we can depends on which 911 * When BABBLE happens what we can depends on which
912 * platform MUSB is running, because some platforms 912 * platform MUSB is running, because some platforms
@@ -916,9 +916,7 @@ b_host:
916 * drop the session. 916 * drop the session.
917 */ 917 */
918 dev_err(musb->controller, "Babble\n"); 918 dev_err(musb->controller, "Babble\n");
919 919 musb_recover_from_babble(musb);
920 if (is_host_active(musb))
921 musb_recover_from_babble(musb);
922 } else { 920 } else {
923 musb_dbg(musb, "BUS RESET as %s", 921 musb_dbg(musb, "BUS RESET as %s",
924 usb_otg_state_string(musb->xceiv->otg->state)); 922 usb_otg_state_string(musb->xceiv->otg->state));
@@ -1861,22 +1859,22 @@ static void musb_pm_runtime_check_session(struct musb *musb)
1861 MUSB_DEVCTL_HR; 1859 MUSB_DEVCTL_HR;
1862 switch (devctl & ~s) { 1860 switch (devctl & ~s) {
1863 case MUSB_QUIRK_B_INVALID_VBUS_91: 1861 case MUSB_QUIRK_B_INVALID_VBUS_91:
1864 if (musb->quirk_retries--) { 1862 if (musb->quirk_retries && !musb->flush_irq_work) {
1865 musb_dbg(musb, 1863 musb_dbg(musb,
1866 "Poll devctl on invalid vbus, assume no session"); 1864 "Poll devctl on invalid vbus, assume no session");
1867 schedule_delayed_work(&musb->irq_work, 1865 schedule_delayed_work(&musb->irq_work,
1868 msecs_to_jiffies(1000)); 1866 msecs_to_jiffies(1000));
1869 1867 musb->quirk_retries--;
1870 return; 1868 return;
1871 } 1869 }
1872 /* fall through */ 1870 /* fall through */
1873 case MUSB_QUIRK_A_DISCONNECT_19: 1871 case MUSB_QUIRK_A_DISCONNECT_19:
1874 if (musb->quirk_retries--) { 1872 if (musb->quirk_retries && !musb->flush_irq_work) {
1875 musb_dbg(musb, 1873 musb_dbg(musb,
1876 "Poll devctl on possible host mode disconnect"); 1874 "Poll devctl on possible host mode disconnect");
1877 schedule_delayed_work(&musb->irq_work, 1875 schedule_delayed_work(&musb->irq_work,
1878 msecs_to_jiffies(1000)); 1876 msecs_to_jiffies(1000));
1879 1877 musb->quirk_retries--;
1880 return; 1878 return;
1881 } 1879 }
1882 if (!musb->session) 1880 if (!musb->session)
@@ -2681,8 +2679,15 @@ static int musb_suspend(struct device *dev)
2681 2679
2682 musb_platform_disable(musb); 2680 musb_platform_disable(musb);
2683 musb_disable_interrupts(musb); 2681 musb_disable_interrupts(musb);
2682
2683 musb->flush_irq_work = true;
2684 while (flush_delayed_work(&musb->irq_work))
2685 ;
2686 musb->flush_irq_work = false;
2687
2684 if (!(musb->io.quirks & MUSB_PRESERVE_SESSION)) 2688 if (!(musb->io.quirks & MUSB_PRESERVE_SESSION))
2685 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); 2689 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
2690
2686 WARN_ON(!list_empty(&musb->pending_list)); 2691 WARN_ON(!list_empty(&musb->pending_list));
2687 2692
2688 spin_lock_irqsave(&musb->lock, flags); 2693 spin_lock_irqsave(&musb->lock, flags);