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

usb: gadget: add generic map/unmap request utilities

such utilities are currently duplicated on all UDC
drivers basically with the same structure. Let's group
all implementations into one generic implementation
and get rid of that duplication.

Signed-off-by: Felipe Balbi <balbi@ti.com>

+62
+52
drivers/usb/gadget/udc-core.c
··· 22 22 #include <linux/device.h> 23 23 #include <linux/list.h> 24 24 #include <linux/err.h> 25 + #include <linux/dma-mapping.h> 25 26 26 27 #include <linux/usb/ch9.h> 27 28 #include <linux/usb/gadget.h> ··· 47 46 static struct class *udc_class; 48 47 static LIST_HEAD(udc_list); 49 48 static DEFINE_MUTEX(udc_lock); 49 + 50 + /* ------------------------------------------------------------------------- */ 51 + 52 + int usb_gadget_map_request(struct usb_gadget *gadget, 53 + struct usb_request *req, int is_in) 54 + { 55 + if (req->length == 0) 56 + return 0; 57 + 58 + if (req->num_sgs) { 59 + int mapped; 60 + 61 + mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs, 62 + is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 63 + if (mapped == 0) { 64 + dev_err(&gadget->dev, "failed to map SGs\n"); 65 + return -EFAULT; 66 + } 67 + 68 + req->num_mapped_sgs = mapped; 69 + } else { 70 + req->dma = dma_map_single(&gadget->dev, req->buf, req->length, 71 + is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 72 + 73 + if (dma_mapping_error(&gadget->dev, req->dma)) { 74 + dev_err(&gadget->dev, "failed to map buffer\n"); 75 + return -EFAULT; 76 + } 77 + } 78 + 79 + return 0; 80 + } 81 + EXPORT_SYMBOL_GPL(usb_gadget_map_request); 82 + 83 + void usb_gadget_unmap_request(struct usb_gadget *gadget, 84 + struct usb_request *req, int is_in) 85 + { 86 + if (req->length == 0) 87 + return; 88 + 89 + if (req->num_mapped_sgs) { 90 + dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs, 91 + is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 92 + 93 + req->num_mapped_sgs = 0; 94 + } else { 95 + dma_unmap_single(&gadget->dev, req->dma, req->length, 96 + is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 97 + } 98 + } 99 + EXPORT_SYMBOL_GPL(usb_gadget_unmap_request); 50 100 51 101 /* ------------------------------------------------------------------------- */ 52 102
+10
include/linux/usb/gadget.h
··· 950 950 951 951 /*-------------------------------------------------------------------------*/ 952 952 953 + /* utility to simplify map/unmap of usb_requests to/from DMA */ 954 + 955 + extern int usb_gadget_map_request(struct usb_gadget *gadget, 956 + struct usb_request *req, int is_in); 957 + 958 + extern void usb_gadget_unmap_request(struct usb_gadget *gadget, 959 + struct usb_request *req, int is_in); 960 + 961 + /*-------------------------------------------------------------------------*/ 962 + 953 963 /* utility wrapping a simple endpoint selection policy */ 954 964 955 965 extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *,