2016-10-08 00:43:48 +00:00
|
|
|
From 25245e060b4626a625e1849b027b3bebc9696ff4 Mon Sep 17 00:00:00 2001
|
2016-10-07 01:00:45 +00:00
|
|
|
From: Tony Lindgren <tony@atomide.com>
|
|
|
|
Date: Fri, 30 Sep 2016 11:10:10 -0700
|
2016-10-08 00:43:48 +00:00
|
|
|
Subject: [PATCH 12/14] usb: musb: Call pm_runtime from musb_gadget_queue
|
2016-10-07 01:00:45 +00:00
|
|
|
|
|
|
|
If we're booting pandaboard using NFSroot over built-in g_ether, we
|
|
|
|
can get the following after booting once and doing a warm reset:
|
|
|
|
|
|
|
|
g_ether gadget: ecm_open
|
|
|
|
g_ether gadget: notify connect true
|
|
|
|
...
|
|
|
|
WARNING: CPU: 0 PID: 1 at drivers/bus/omap_l3_noc.c:147
|
|
|
|
l3_interrupt_handler+0x220/0x34c
|
|
|
|
44000000.ocp:L3 Custom Error: MASTER MPU TARGET L4CFG (Read):
|
|
|
|
Data Access in User mode du ring Functional access
|
|
|
|
...
|
|
|
|
|
|
|
|
Fix the issue by calling pm_runtime functions from
|
|
|
|
musb_gadget_queue.
|
|
|
|
|
|
|
|
Note that in the long run we should be able to queue the pending
|
|
|
|
transfers if pm_runtime is not active, and flush the queue from
|
|
|
|
pm_runtime_resume.
|
|
|
|
|
|
|
|
Reported-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
|
|
Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
|
|
Signed-off-by: Tony Lindgren <tony@atomide.com>
|
|
|
|
---
|
|
|
|
drivers/usb/musb/musb_gadget.c | 4 ++++
|
|
|
|
1 file changed, 4 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
|
|
|
|
index 6d1e975..8ccc1b1 100644
|
|
|
|
--- a/drivers/usb/musb/musb_gadget.c
|
|
|
|
+++ b/drivers/usb/musb/musb_gadget.c
|
|
|
|
@@ -1255,6 +1255,7 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
|
|
|
|
|
|
|
|
map_dma_buffer(request, musb, musb_ep);
|
|
|
|
|
|
|
|
+ pm_runtime_get_sync(musb->controller);
|
|
|
|
spin_lock_irqsave(&musb->lock, lockflags);
|
|
|
|
|
|
|
|
/* don't queue if the ep is down */
|
|
|
|
@@ -1275,6 +1276,9 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
|
|
|
|
|
|
|
|
unlock:
|
|
|
|
spin_unlock_irqrestore(&musb->lock, lockflags);
|
|
|
|
+ pm_runtime_mark_last_busy(musb->controller);
|
|
|
|
+ pm_runtime_put_autosuspend(musb->controller);
|
|
|
|
+
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
--
|
|
|
|
2.10.0
|
|
|
|
|