diff options
author | George Cherian <george.cherian@ti.com> | 2014-07-16 08:52:10 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-07-16 10:59:54 -0400 |
commit | 675ae7631150a54eac81806ccb1bf16aba2bead8 (patch) | |
tree | 73ff41dd438d3c34ba1a70114e97b79afa26fbf2 | |
parent | 97b4129e0562c74e6d75ff081e93202c71aecaa3 (diff) |
usb: musb: core: Convert babble recover work to delayed work
During babble condition both first disconnect of devices are
initiated. Make sure MUSB controller is reset and re-initialized
after all disconnects.
To acheive this schedule a delayed work for babble recovery.
While at that convert udelay to usleep_range.
Refer Documentation/timers/timers-howto.txt
Signed-off-by: George Cherian <george.cherian@ti.com>
Tested-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r-- | drivers/usb/musb/musb_core.c | 15 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.h | 2 |
2 files changed, 9 insertions, 8 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 0ad9551ffad1..c0ce09f8fdcd 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -850,7 +850,8 @@ b_host: | |||
850 | 850 | ||
851 | /* handle babble condition */ | 851 | /* handle babble condition */ |
852 | if (int_usb & MUSB_INTR_BABBLE && is_host_active(musb)) | 852 | if (int_usb & MUSB_INTR_BABBLE && is_host_active(musb)) |
853 | schedule_work(&musb->recover_work); | 853 | schedule_delayed_work(&musb->recover_work, |
854 | msecs_to_jiffies(100)); | ||
854 | 855 | ||
855 | #if 0 | 856 | #if 0 |
856 | /* REVISIT ... this would be for multiplexing periodic endpoints, or | 857 | /* REVISIT ... this would be for multiplexing periodic endpoints, or |
@@ -1751,16 +1752,16 @@ static void musb_irq_work(struct work_struct *data) | |||
1751 | /* Recover from babble interrupt conditions */ | 1752 | /* Recover from babble interrupt conditions */ |
1752 | static void musb_recover_work(struct work_struct *data) | 1753 | static void musb_recover_work(struct work_struct *data) |
1753 | { | 1754 | { |
1754 | struct musb *musb = container_of(data, struct musb, recover_work); | 1755 | struct musb *musb = container_of(data, struct musb, recover_work.work); |
1755 | int status; | 1756 | int status; |
1756 | 1757 | ||
1757 | musb_platform_reset(musb); | 1758 | musb_platform_reset(musb); |
1758 | 1759 | ||
1759 | usb_phy_vbus_off(musb->xceiv); | 1760 | usb_phy_vbus_off(musb->xceiv); |
1760 | udelay(100); | 1761 | usleep_range(100, 200); |
1761 | 1762 | ||
1762 | usb_phy_vbus_on(musb->xceiv); | 1763 | usb_phy_vbus_on(musb->xceiv); |
1763 | udelay(100); | 1764 | usleep_range(100, 200); |
1764 | 1765 | ||
1765 | /* | 1766 | /* |
1766 | * When a babble condition occurs, the musb controller removes the | 1767 | * When a babble condition occurs, the musb controller removes the |
@@ -1943,7 +1944,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
1943 | 1944 | ||
1944 | /* Init IRQ workqueue before request_irq */ | 1945 | /* Init IRQ workqueue before request_irq */ |
1945 | INIT_WORK(&musb->irq_work, musb_irq_work); | 1946 | INIT_WORK(&musb->irq_work, musb_irq_work); |
1946 | INIT_WORK(&musb->recover_work, musb_recover_work); | 1947 | INIT_DELAYED_WORK(&musb->recover_work, musb_recover_work); |
1947 | INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); | 1948 | INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); |
1948 | INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); | 1949 | INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); |
1949 | 1950 | ||
@@ -2039,7 +2040,7 @@ fail4: | |||
2039 | 2040 | ||
2040 | fail3: | 2041 | fail3: |
2041 | cancel_work_sync(&musb->irq_work); | 2042 | cancel_work_sync(&musb->irq_work); |
2042 | cancel_work_sync(&musb->recover_work); | 2043 | cancel_delayed_work_sync(&musb->recover_work); |
2043 | cancel_delayed_work_sync(&musb->finish_resume_work); | 2044 | cancel_delayed_work_sync(&musb->finish_resume_work); |
2044 | cancel_delayed_work_sync(&musb->deassert_reset_work); | 2045 | cancel_delayed_work_sync(&musb->deassert_reset_work); |
2045 | if (musb->dma_controller) | 2046 | if (musb->dma_controller) |
@@ -2105,7 +2106,7 @@ static int musb_remove(struct platform_device *pdev) | |||
2105 | dma_controller_destroy(musb->dma_controller); | 2106 | dma_controller_destroy(musb->dma_controller); |
2106 | 2107 | ||
2107 | cancel_work_sync(&musb->irq_work); | 2108 | cancel_work_sync(&musb->irq_work); |
2108 | cancel_work_sync(&musb->recover_work); | 2109 | cancel_delayed_work_sync(&musb->recover_work); |
2109 | cancel_delayed_work_sync(&musb->finish_resume_work); | 2110 | cancel_delayed_work_sync(&musb->finish_resume_work); |
2110 | cancel_delayed_work_sync(&musb->deassert_reset_work); | 2111 | cancel_delayed_work_sync(&musb->deassert_reset_work); |
2111 | musb_free(musb); | 2112 | musb_free(musb); |
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index d155a156f240..9241025f6965 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -297,7 +297,7 @@ struct musb { | |||
297 | 297 | ||
298 | irqreturn_t (*isr)(int, void *); | 298 | irqreturn_t (*isr)(int, void *); |
299 | struct work_struct irq_work; | 299 | struct work_struct irq_work; |
300 | struct work_struct recover_work; | 300 | struct delayed_work recover_work; |
301 | struct delayed_work deassert_reset_work; | 301 | struct delayed_work deassert_reset_work; |
302 | struct delayed_work finish_resume_work; | 302 | struct delayed_work finish_resume_work; |
303 | u16 hwvers; | 303 | u16 hwvers; |