Skip to content

Commit

Permalink
usb: musb: core: Convert babble recover work to delayed work
Browse files Browse the repository at this point in the history
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 <[email protected]>
Tested-by: Bin Liu <[email protected]>
Signed-off-by: Felipe Balbi <[email protected]>
  • Loading branch information
georgecherian authored and Felipe Balbi committed Jul 16, 2014
1 parent 97b4129 commit 675ae76
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 8 deletions.
15 changes: 8 additions & 7 deletions drivers/usb/musb/musb_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -850,7 +850,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,

/* 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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -2039,7 +2040,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)

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)
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/usb/musb/musb_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 675ae76

Please sign in to comment.