1 /* 2 * u_f.h 3 * 4 * Utility definitions for USB functions 5 * 6 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 7 * http://www.samsung.com 8 * 9 * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16 #ifndef __U_F_H__ 17 #define __U_F_H__ 18 19 #include <linux/usb/gadget.h> 20 21 /* Variable Length Array Macros **********************************************/ 22 #define vla_group(groupname) size_t groupname##__next = 0 23 #define vla_group_size(groupname) groupname##__next 24 25 #define vla_item(groupname, type, name, n) \ 26 size_t groupname##_##name##__offset = ({ \ 27 size_t align_mask = __alignof__(type) - 1; \ 28 size_t offset = (groupname##__next + align_mask) & ~align_mask;\ 29 size_t size = (n) * sizeof(type); \ 30 groupname##__next = offset + size; \ 31 offset; \ 32 }) 33 34 #define vla_item_with_sz(groupname, type, name, n) \ 35 size_t groupname##_##name##__sz = (n) * sizeof(type); \ 36 size_t groupname##_##name##__offset = ({ \ 37 size_t align_mask = __alignof__(type) - 1; \ 38 size_t offset = (groupname##__next + align_mask) & ~align_mask;\ 39 size_t size = groupname##_##name##__sz; \ 40 groupname##__next = offset + size; \ 41 offset; \ 42 }) 43 44 #define vla_ptr(ptr, groupname, name) \ 45 ((void *) ((char *)ptr + groupname##_##name##__offset)) 46 47 struct usb_ep; 48 struct usb_request; 49 50 /** 51 * alloc_ep_req - returns a usb_request allocated by the gadget driver and 52 * allocates the request's buffer. 53 * 54 * @ep: the endpoint to allocate a usb_request 55 * @len: usb_requests's buffer suggested size 56 * 57 * In case @ep direction is OUT, the @len will be aligned to ep's 58 * wMaxPacketSize. In order to avoid memory leaks or drops, *always* use 59 * usb_requests's length (req->length) to refer to the allocated buffer size. 60 * Requests allocated via alloc_ep_req() *must* be freed by free_ep_req(). 61 */ 62 struct usb_request *alloc_ep_req(struct usb_ep *ep, size_t len); 63 64 /* Frees a usb_request previously allocated by alloc_ep_req() */ 65 static inline void free_ep_req(struct usb_ep *ep, struct usb_request *req) 66 { 67 kfree(req->buf); 68 usb_ep_free_request(ep, req); 69 } 70 71 #endif /* __U_F_H__ */ 72