summaryrefslogtreecommitdiff
path: root/drivers/usb/dwc3/gadget.c
diff options
context:
space:
mode:
authorMayank Rana <mrana@codeaurora.org>2017-03-20 16:10:39 -0700
committerMayank Rana <mrana@codeaurora.org>2017-03-31 15:22:57 -0700
commit7af71579f5fb6f5904ca65e5c49ed4779ddbe849 (patch)
treee73c10b42f9542314a99473e67d4dfe25cdd3f95 /drivers/usb/dwc3/gadget.c
parentc451e3744b35669e8dfb5f6c98c4a91a3e604504 (diff)
usb: dwc3: Use high priority worker as bottom half handler
Latency involved in handling dwc3 interrupt in real time threaded interrupt is sometimes resulting into RT throttling. Hence queue bottom half work from dwc3 hard irq handler to a high priority workqueue. Also, update the corresponding irq flag in host controller platform driver. Change-Id: If65a522efb6d792eea7fa7afc4c5e4dcd1cb6fb8 Signed-off-by: Hemant Kumar <hemantk@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
Diffstat (limited to 'drivers/usb/dwc3/gadget.c')
-rw-r--r--drivers/usb/dwc3/gadget.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 0d6bc746c368..9608a79cbe40 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -3393,6 +3393,15 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
return ret;
}
+void dwc3_bh_work(struct work_struct *w)
+{
+ struct dwc3 *dwc = container_of(w, struct dwc3, bh_work);
+
+ pm_runtime_get_sync(dwc->dev);
+ dwc3_thread_interrupt(dwc->irq, dwc);
+ pm_runtime_put(dwc->dev);
+}
+
static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc)
{
struct dwc3 *dwc = _dwc;
@@ -3484,7 +3493,7 @@ irqreturn_t dwc3_interrupt(int irq, void *_dwc)
dwc->irq_dbg_index = (dwc->irq_dbg_index + 1) % MAX_INTR_STATS;
if (ret == IRQ_WAKE_THREAD)
- dwc3_thread_interrupt(dwc->irq, dwc);
+ queue_work(dwc->dwc_wq, &dwc->bh_work);
return IRQ_HANDLED;
}