diff options
Diffstat (limited to 'drivers/usb/musb/musb_core.c')
-rw-r--r-- | drivers/usb/musb/musb_core.c | 21 |
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); |