summaryrefslogtreecommitdiff
path: root/drivers/usb/host
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2012-03-23 16:52:56 -0700
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-05-18 08:11:12 -0700
commit77ffea90745ba3cf675cf350dc02cf1e84152a44 (patch)
tree29e47e7d12570b31f2bc74a6b1eb81aa9ad5758a /drivers/usb/host
parenteb52a35e1cdb95bc426ef1d404bbf166a76111cc (diff)
tegra: usb: host: dma buffer sync while mapping
Implementing dma_sync_* functions for usb transfer buffers when DMA is being used by ehci-hcd. Bug 953885 Change-Id: Ia772138752e3fe03bb45ee983dffa1b5d8d620f5 Signed-off-by: Vinayak Pane <vpane@nvidia.com> Reviewed-on: http://git-master/r/102687 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r--drivers/usb/host/ehci-tegra.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 5e646b65b3f0..4e7277b2b889 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -938,6 +938,22 @@ static int tegra_ehci_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
return ret;
ret = usb_hcd_map_urb_for_dma(hcd, urb, mem_flags);
+
+ /* control packets over dma */
+ if (urb->setup_dma)
+ dma_sync_single_for_device(hcd->self.controller,
+ urb->setup_dma, sizeof(struct usb_ctrlrequest),
+ DMA_TO_DEVICE);
+
+ /* urb buffers over dma */
+ if (urb->transfer_dma) {
+ enum dma_data_direction dir;
+ dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+
+ dma_sync_single_for_device(hcd->self.controller,
+ urb->transfer_dma, urb->transfer_buffer_length, dir);
+ }
+
if (ret)
free_dma_aligned_buffer(urb);
@@ -956,6 +972,15 @@ static void tegra_ehci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
else if (tegra->phy->instance == 2)
readb(IO_ADDRESS(IO_PPCS_PHYS + USB3_PREFETCH_ID));
+ if (urb->transfer_dma) {
+ enum dma_data_direction dir;
+ dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+ if (dir == DMA_FROM_DEVICE)
+ dma_sync_single_for_cpu(hcd->self.controller,
+ urb->transfer_dma, urb->transfer_buffer_length,
+ DMA_FROM_DEVICE);
+ }
+
usb_hcd_unmap_urb_for_dma(hcd, urb);
free_dma_aligned_buffer(urb);
}