diff options
| -rw-r--r-- | drivers/usb/musb/musb_dma.h | 3 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 14 |
2 files changed, 17 insertions, 0 deletions
diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h index 916065ba9e70..3a97c4e2d4f5 100644 --- a/drivers/usb/musb/musb_dma.h +++ b/drivers/usb/musb/musb_dma.h | |||
| @@ -169,6 +169,9 @@ struct dma_controller { | |||
| 169 | dma_addr_t dma_addr, | 169 | dma_addr_t dma_addr, |
| 170 | u32 length); | 170 | u32 length); |
| 171 | int (*channel_abort)(struct dma_channel *); | 171 | int (*channel_abort)(struct dma_channel *); |
| 172 | int (*is_compatible)(struct dma_channel *channel, | ||
| 173 | u16 maxpacket, | ||
| 174 | void *buf, u32 length); | ||
| 172 | }; | 175 | }; |
| 173 | 176 | ||
| 174 | /* called after channel_program(), may indicate a fault */ | 177 | /* called after channel_program(), may indicate a fault */ |
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 @@ | |||
| 100 | static inline void map_dma_buffer(struct musb_request *request, | 100 | static 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, |
