aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/musb_gadget.c
diff options
context:
space:
mode:
authorMian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>2011-01-04 06:47:03 -0500
committerFelipe Balbi <balbi@ti.com>2011-02-01 03:41:30 -0500
commit5f5761cb8e77f2f2321b7847eef9629e6896cd47 (patch)
treebf8ec03057f612ede1361da285c8d1993be75de8 /drivers/usb/musb/musb_gadget.c
parentc65bfa62b7185bdeb063c2a637f501f00997d068 (diff)
usb: musb: introduce api for dma code to check compatibility with usb request
Gadget MUSB driver handles dma mappings in musb_gadget_queue(). Where as it is possible for dma code to reject the usb request later at ->channel_program() called from txstate()/rxstate() For example ->channel_program in tusb6010_omap.c: static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, u8 rndis_mode, dma_addr_t dma_addr, u32 len) { ... if (unlikely(dma_addr & 0x1) || (len < 32) || (len > packet_sz)) return false; ... if (dma_addr & 0x2) return false; ... } In this case, usb request will be handled in PIO mode which renders dma mapping operations unnecessary. This patch adds an api to allow dma code to indicate incompatibility with usb request. Gadget musb driver call this api, if available, before dma mappings to avoid any unnecessary mapping operations. Signed-off-by: Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb/musb_gadget.c')
-rw-r--r--drivers/usb/musb/musb_gadget.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 65775039d6b3..2fe304611dcf 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -100,11 +100,25 @@
100static inline void map_dma_buffer(struct musb_request *request, 100static inline void map_dma_buffer(struct musb_request *request,
101 struct musb *musb, struct musb_ep *musb_ep) 101 struct musb *musb, struct musb_ep *musb_ep)
102{ 102{
103 int compatible = true;
104 struct dma_controller *dma = musb->dma_controller;
105
103 request->map_state = UN_MAPPED; 106 request->map_state = UN_MAPPED;
104 107
105 if (!is_dma_capable() || !musb_ep->dma) 108 if (!is_dma_capable() || !musb_ep->dma)
106 return; 109 return;
107 110
111 /* Check if DMA engine can handle this request.
112 * DMA code must reject the USB request explicitly.
113 * Default behaviour is to map the request.
114 */
115 if (dma->is_compatible)
116 compatible = dma->is_compatible(musb_ep->dma,
117 musb_ep->packet_sz, request->request.buf,
118 request->request.length);
119 if (!compatible)
120 return;
121
108 if (request->request.dma == DMA_ADDR_INVALID) { 122 if (request->request.dma == DMA_ADDR_INVALID) {
109 request->request.dma = dma_map_single( 123 request->request.dma = dma_map_single(
110 musb->controller, 124 musb->controller,