usb: musb: core: Convert babble recover work to delayed work
authorGeorge Cherian <george.cherian@ti.com>
Wed, 16 Jul 2014 12:52:10 +0000 (18:22 +0530)
committerFelipe Balbi <balbi@ti.com>
Wed, 16 Jul 2014 14:59:54 +0000 (09:59 -0500)
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>
drivers/usb/musb/musb_core.c
drivers/usb/musb/musb_core.h

index 0ad9551ffad11a727801f1e16afdc9e966e485cb..c0ce09f8fdcd034c1ca0f3b5fa10b8dc5dbf8a36 100644 (file)
@@ -850,7 +850,8 @@ b_host:
 
        /* handle babble condition */
        if (int_usb & MUSB_INTR_BABBLE && is_host_active(musb))
-               schedule_work(&musb->recover_work);
+               schedule_delayed_work(&musb->recover_work,
+                                     msecs_to_jiffies(100));
 
 #if 0
 /* REVISIT ... this would be for multiplexing periodic endpoints, or
@@ -1751,16 +1752,16 @@ static void musb_irq_work(struct work_struct *data)
 /* Recover from babble interrupt conditions */
 static void musb_recover_work(struct work_struct *data)
 {
-       struct musb *musb = container_of(data, struct musb, recover_work);
+       struct musb *musb = container_of(data, struct musb, recover_work.work);
        int status;
 
        musb_platform_reset(musb);
 
        usb_phy_vbus_off(musb->xceiv);
-       udelay(100);
+       usleep_range(100, 200);
 
        usb_phy_vbus_on(musb->xceiv);
-       udelay(100);
+       usleep_range(100, 200);
 
        /*
         * 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)
 
        /* Init IRQ workqueue before request_irq */
        INIT_WORK(&musb->irq_work, musb_irq_work);
-       INIT_WORK(&musb->recover_work, musb_recover_work);
+       INIT_DELAYED_WORK(&musb->recover_work, musb_recover_work);
        INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset);
        INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume);
 
@@ -2039,7 +2040,7 @@ fail4:
 
 fail3:
        cancel_work_sync(&musb->irq_work);
-       cancel_work_sync(&musb->recover_work);
+       cancel_delayed_work_sync(&musb->recover_work);
        cancel_delayed_work_sync(&musb->finish_resume_work);
        cancel_delayed_work_sync(&musb->deassert_reset_work);
        if (musb->dma_controller)
@@ -2105,7 +2106,7 @@ static int musb_remove(struct platform_device *pdev)
                dma_controller_destroy(musb->dma_controller);
 
        cancel_work_sync(&musb->irq_work);
-       cancel_work_sync(&musb->recover_work);
+       cancel_delayed_work_sync(&musb->recover_work);
        cancel_delayed_work_sync(&musb->finish_resume_work);
        cancel_delayed_work_sync(&musb->deassert_reset_work);
        musb_free(musb);
index d155a156f240be828f339b32f57a86bf3a1f2204..9241025f69654b40376865305b0cc814832988b8 100644 (file)
@@ -297,7 +297,7 @@ struct musb {
 
        irqreturn_t             (*isr)(int, void *);
        struct work_struct      irq_work;
-       struct work_struct      recover_work;
+       struct delayed_work     recover_work;
        struct delayed_work     deassert_reset_work;
        struct delayed_work     finish_resume_work;
        u16                     hwvers;