Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Yoshihiro Shimoda and committed by
Felipe Balbi
7ace8fc8 53e20f2e

+8 -6
+8 -6
drivers/usb/gadget/udc/udc-core.c
··· 60 60 int usb_gadget_map_request(struct usb_gadget *gadget, 61 61 struct usb_request *req, int is_in) 62 62 { 63 + struct device *dev = gadget->dev.parent; 64 + 63 65 if (req->length == 0) 64 66 return 0; 65 67 66 68 if (req->num_sgs) { 67 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 72 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 71 73 if (mapped == 0) { 72 74 dev_err(&gadget->dev, "failed to map SGs\n"); ··· 77 75 78 76 req->num_mapped_sgs = mapped; 79 77 } else { 80 - req->dma = dma_map_single(&gadget->dev, req->buf, req->length, 78 + req->dma = dma_map_single(dev, req->buf, req->length, 81 79 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 82 80 83 - if (dma_mapping_error(&gadget->dev, req->dma)) { 84 - dev_err(&gadget->dev, "failed to map buffer\n"); 81 + if (dma_mapping_error(dev, req->dma)) { 82 + dev_err(dev, "failed to map buffer\n"); 85 83 return -EFAULT; 86 84 } 87 85 } ··· 97 95 return; 98 96 99 97 if (req->num_mapped_sgs) { 100 - dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs, 98 + dma_unmap_sg(gadget->dev.parent, req->sg, req->num_mapped_sgs, 101 99 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 102 100 103 101 req->num_mapped_sgs = 0; 104 102 } else { 105 - dma_unmap_single(&gadget->dev, req->dma, req->length, 103 + dma_unmap_single(gadget->dev.parent, req->dma, req->length, 106 104 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 107 105 } 108 106 }