Commit 679ca39f authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Felipe Balbi

usb: gadget: udc: core: add usb_gadget_{un}map_request_by_dev()

If the following environment, the first argument of DMA API should
be set to a DMAC's device structure, not a udc controller's one.
 - A udc controller needs an external DMAC device (like a DMA Engine).
 - The external DMAC enables IOMMU.

So, this patch add usb_gadget_{un}map_request_by_dev() API to set
a DMAC's device structure by a udc controller driver.
Signed-off-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 5096c4d3
...@@ -61,11 +61,9 @@ static int udc_bind_to_driver(struct usb_udc *udc, ...@@ -61,11 +61,9 @@ static int udc_bind_to_driver(struct usb_udc *udc,
#ifdef CONFIG_HAS_DMA #ifdef CONFIG_HAS_DMA
int usb_gadget_map_request(struct usb_gadget *gadget, int usb_gadget_map_request_by_dev(struct device *dev,
struct usb_request *req, int is_in) struct usb_request *req, int is_in)
{ {
struct device *dev = gadget->dev.parent;
if (req->length == 0) if (req->length == 0)
return 0; return 0;
...@@ -92,24 +90,38 @@ int usb_gadget_map_request(struct usb_gadget *gadget, ...@@ -92,24 +90,38 @@ int usb_gadget_map_request(struct usb_gadget *gadget,
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(usb_gadget_map_request_by_dev);
int usb_gadget_map_request(struct usb_gadget *gadget,
struct usb_request *req, int is_in)
{
return usb_gadget_map_request_by_dev(gadget->dev.parent, req, is_in);
}
EXPORT_SYMBOL_GPL(usb_gadget_map_request); EXPORT_SYMBOL_GPL(usb_gadget_map_request);
void usb_gadget_unmap_request(struct usb_gadget *gadget, void usb_gadget_unmap_request_by_dev(struct device *dev,
struct usb_request *req, int is_in) struct usb_request *req, int is_in)
{ {
if (req->length == 0) if (req->length == 0)
return; return;
if (req->num_mapped_sgs) { if (req->num_mapped_sgs) {
dma_unmap_sg(gadget->dev.parent, req->sg, req->num_mapped_sgs, dma_unmap_sg(dev, req->sg, req->num_mapped_sgs,
is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
req->num_mapped_sgs = 0; req->num_mapped_sgs = 0;
} else { } else {
dma_unmap_single(gadget->dev.parent, req->dma, req->length, dma_unmap_single(dev, req->dma, req->length,
is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
} }
} }
EXPORT_SYMBOL_GPL(usb_gadget_unmap_request_by_dev);
void usb_gadget_unmap_request(struct usb_gadget *gadget,
struct usb_request *req, int is_in)
{
usb_gadget_unmap_request_by_dev(gadget->dev.parent, req, is_in);
}
EXPORT_SYMBOL_GPL(usb_gadget_unmap_request); EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
#endif /* CONFIG_HAS_DMA */ #endif /* CONFIG_HAS_DMA */
......
...@@ -1223,9 +1223,13 @@ int usb_otg_descriptor_init(struct usb_gadget *gadget, ...@@ -1223,9 +1223,13 @@ int usb_otg_descriptor_init(struct usb_gadget *gadget,
/* utility to simplify map/unmap of usb_requests to/from DMA */ /* utility to simplify map/unmap of usb_requests to/from DMA */
extern int usb_gadget_map_request_by_dev(struct device *dev,
struct usb_request *req, int is_in);
extern int usb_gadget_map_request(struct usb_gadget *gadget, extern int usb_gadget_map_request(struct usb_gadget *gadget,
struct usb_request *req, int is_in); struct usb_request *req, int is_in);
extern void usb_gadget_unmap_request_by_dev(struct device *dev,
struct usb_request *req, int is_in);
extern void usb_gadget_unmap_request(struct usb_gadget *gadget, extern void usb_gadget_unmap_request(struct usb_gadget *gadget,
struct usb_request *req, int is_in); struct usb_request *req, int is_in);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment