diff options
author | Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> | 2015-07-13 05:10:05 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-07-20 13:57:46 -0400 |
commit | 7ace8fc8219e4cbbfd5b4790390d9a01a2541cdf (patch) | |
tree | 58e33564d7ef41e42bc8d9ea4c0fb49edb88d7ee | |
parent | 53e20f2eb161fbe9eea28b54dccc870cec94eca2 (diff) |
usb: gadget: udc: core: Fix argument of dma_map_single for IOMMU
The dma_map_single and dma_unmap_single should set "gadget->dev.parent"
instead of "&gadget->dev" in the first argument because the parent has
a udc controller's device pointer.
Otherwise, iommu functions are not called in ARM environment.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r-- | drivers/usb/gadget/udc/udc-core.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c index d69c35558f68..362ee8af5fce 100644 --- a/drivers/usb/gadget/udc/udc-core.c +++ b/drivers/usb/gadget/udc/udc-core.c | |||
@@ -60,13 +60,15 @@ static DEFINE_MUTEX(udc_lock); | |||
60 | int usb_gadget_map_request(struct usb_gadget *gadget, | 60 | int usb_gadget_map_request(struct usb_gadget *gadget, |
61 | struct usb_request *req, int is_in) | 61 | struct usb_request *req, int is_in) |
62 | { | 62 | { |
63 | struct device *dev = gadget->dev.parent; | ||
64 | |||
63 | if (req->length == 0) | 65 | if (req->length == 0) |
64 | return 0; | 66 | return 0; |
65 | 67 | ||
66 | if (req->num_sgs) { | 68 | if (req->num_sgs) { |
67 | int mapped; | 69 | int mapped; |
68 | 70 | ||
69 | mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs, | 71 | mapped = dma_map_sg(dev, req->sg, req->num_sgs, |
70 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 72 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
71 | if (mapped == 0) { | 73 | if (mapped == 0) { |
72 | dev_err(&gadget->dev, "failed to map SGs\n"); | 74 | dev_err(&gadget->dev, "failed to map SGs\n"); |
@@ -75,11 +77,11 @@ int usb_gadget_map_request(struct usb_gadget *gadget, | |||
75 | 77 | ||
76 | req->num_mapped_sgs = mapped; | 78 | req->num_mapped_sgs = mapped; |
77 | } else { | 79 | } else { |
78 | req->dma = dma_map_single(&gadget->dev, req->buf, req->length, | 80 | req->dma = dma_map_single(dev, req->buf, req->length, |
79 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 81 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
80 | 82 | ||
81 | if (dma_mapping_error(&gadget->dev, req->dma)) { | 83 | if (dma_mapping_error(dev, req->dma)) { |
82 | dev_err(&gadget->dev, "failed to map buffer\n"); | 84 | dev_err(dev, "failed to map buffer\n"); |
83 | return -EFAULT; | 85 | return -EFAULT; |
84 | } | 86 | } |
85 | } | 87 | } |
@@ -95,12 +97,12 @@ void usb_gadget_unmap_request(struct usb_gadget *gadget, | |||
95 | return; | 97 | return; |
96 | 98 | ||
97 | if (req->num_mapped_sgs) { | 99 | if (req->num_mapped_sgs) { |
98 | dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs, | 100 | dma_unmap_sg(gadget->dev.parent, req->sg, req->num_mapped_sgs, |
99 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 101 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
100 | 102 | ||
101 | req->num_mapped_sgs = 0; | 103 | req->num_mapped_sgs = 0; |
102 | } else { | 104 | } else { |
103 | dma_unmap_single(&gadget->dev, req->dma, req->length, | 105 | dma_unmap_single(gadget->dev.parent, req->dma, req->length, |
104 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | 106 | is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); |
105 | } | 107 | } |
106 | } | 108 | } |