aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Cherian <george.cherian@ti.com>2014-07-16 08:52:10 -0400
committerFelipe Balbi <balbi@ti.com>2014-07-16 10:59:54 -0400
commit675ae7631150a54eac81806ccb1bf16aba2bead8 (patch)
tree73ff41dd438d3c34ba1a70114e97b79afa26fbf2
parent97b4129e0562c74e6d75ff081e93202c71aecaa3 (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.c15
-rw-r--r--drivers/usb/musb/musb_core.h2
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 */
1752static void musb_recover_work(struct work_struct *data) 1753static 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
2040fail3: 2041fail3:
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;