summaryrefslogtreecommitdiff
path: root/drivers/usb/musb
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2015-02-26 23:27:12 +0300
committerFelipe Balbi <balbi@ti.com>2015-03-10 23:33:29 +0300
commit83b8f5b8c07c8cbad8c14c7b8767e7219a6c1813 (patch)
tree12f0a696bdd190895b6857e370c3307db98a5b4c /drivers/usb/musb
parentb28a6432405ca95b3da25630d79d2463c754a79c (diff)
downloadlinux-83b8f5b8c07c8cbad8c14c7b8767e7219a6c1813.tar.xz
usb: musb: core: drop recover_work
that's not needed anymore. Everything that we call is irq-safe, so we might as well not have a delayed work for babble recovery. Tested-by: Bin Liu <b-liu@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb')
-rw-r--r--drivers/usb/musb/musb_core.c17
-rw-r--r--drivers/usb/musb/musb_core.h1
2 files changed, 9 insertions, 9 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index bf9746287d7c..b410af6b0510 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -509,6 +509,7 @@ void musb_hnp_stop(struct musb *musb)
static void musb_disable_interrupts(struct musb *musb);
static void musb_generic_disable(struct musb *musb);
+static void musb_recover_from_babble(struct musb *musb);
/*
* Interrupt Service Routine to record USB "global" interrupts.
@@ -885,8 +886,7 @@ b_host:
if (is_host_active(musb)) {
musb_disable_interrupts(musb);
- schedule_delayed_work(&musb->recover_work,
- usecs_to_jiffies(10));
+ musb_recover_from_babble(musb);
}
}
} else {
@@ -1831,13 +1831,17 @@ static void musb_irq_work(struct work_struct *data)
}
}
-/* Recover from babble interrupt conditions */
-static void musb_recover_work(struct work_struct *data)
+static void musb_recover_from_babble(struct musb *musb)
{
- struct musb *musb = container_of(data, struct musb, recover_work.work);
int ret;
u8 devctl;
+ /*
+ * wait at least 320 cycles of 60MHz clock. That's 5.3us, we will give
+ * it some slack and wait for 10us.
+ */
+ udelay(10);
+
ret = musb_platform_recover(musb);
if (ret) {
musb_enable_interrupts(musb);
@@ -2098,7 +2102,6 @@ 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_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);
@@ -2194,7 +2197,6 @@ fail4:
fail3:
cancel_work_sync(&musb->irq_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)
@@ -2260,7 +2262,6 @@ static int musb_remove(struct platform_device *pdev)
dma_controller_destroy(musb->dma_controller);
cancel_work_sync(&musb->irq_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);
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 1e03c7ec82e4..3877249a8b2d 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -301,7 +301,6 @@ struct musb {
irqreturn_t (*isr)(int, void *);
struct work_struct irq_work;
- struct delayed_work recover_work;
struct delayed_work deassert_reset_work;
struct delayed_work finish_resume_work;
u16 hwvers;