Linux Audio

Check our new training course

Loading...
v4.6
 
 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
47struct usb_ep;
48struct usb_request;
49
50/* Requests allocated via alloc_ep_req() must be freed by free_ep_req(). */
51struct usb_request *alloc_ep_req(struct usb_ep *ep, int len, int default_len);
 
 
 
 
 
 
 
 
 
 
 
 
 
52static inline void free_ep_req(struct usb_ep *ep, struct usb_request *req)
53{
 
54	kfree(req->buf);
 
55	usb_ep_free_request(ep, req);
56}
57
58#endif /* __U_F_H__ */
v5.14.15
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * u_f.h
 4 *
 5 * Utility definitions for USB functions
 6 *
 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
 8 *		http://www.samsung.com
 9 *
10 * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
 
 
 
 
11 */
12
13#ifndef __U_F_H__
14#define __U_F_H__
15
16#include <linux/usb/gadget.h>
17#include <linux/overflow.h>
18
19/* Variable Length Array Macros **********************************************/
20#define vla_group(groupname) size_t groupname##__next = 0
21#define vla_group_size(groupname) groupname##__next
22
23#define vla_item(groupname, type, name, n) \
24	size_t groupname##_##name##__offset = ({			       \
25		size_t offset = 0;					       \
26		if (groupname##__next != SIZE_MAX) {			       \
27			size_t align_mask = __alignof__(type) - 1;	       \
28			size_t size = array_size(n, sizeof(type));	       \
29			offset = (groupname##__next + align_mask) &	       \
30				  ~align_mask;				       \
31			if (check_add_overflow(offset, size,		       \
32					       &groupname##__next)) {          \
33				groupname##__next = SIZE_MAX;		       \
34				offset = 0;				       \
35			}						       \
36		}							       \
37		offset;							       \
38	})
39
40#define vla_item_with_sz(groupname, type, name, n) \
41	size_t groupname##_##name##__sz = array_size(n, sizeof(type));	        \
42	size_t groupname##_##name##__offset = ({			        \
43		size_t offset = 0;						\
44		if (groupname##__next != SIZE_MAX) {				\
45			size_t align_mask = __alignof__(type) - 1;		\
46			offset = (groupname##__next + align_mask) &		\
47				  ~align_mask;					\
48			if (check_add_overflow(offset, groupname##_##name##__sz,\
49							&groupname##__next)) {	\
50				groupname##__next = SIZE_MAX;			\
51				offset = 0;					\
52			}							\
53		}								\
54		offset;								\
55	})
56
57#define vla_ptr(ptr, groupname, name) \
58	((void *) ((char *)ptr + groupname##_##name##__offset))
59
60struct usb_ep;
61struct usb_request;
62
63/**
64 * alloc_ep_req - returns a usb_request allocated by the gadget driver and
65 * allocates the request's buffer.
66 *
67 * @ep: the endpoint to allocate a usb_request
68 * @len: usb_requests's buffer suggested size
69 *
70 * In case @ep direction is OUT, the @len will be aligned to ep's
71 * wMaxPacketSize. In order to avoid memory leaks or drops, *always* use
72 * usb_requests's length (req->length) to refer to the allocated buffer size.
73 * Requests allocated via alloc_ep_req() *must* be freed by free_ep_req().
74 */
75struct usb_request *alloc_ep_req(struct usb_ep *ep, size_t len);
76
77/* Frees a usb_request previously allocated by alloc_ep_req() */
78static inline void free_ep_req(struct usb_ep *ep, struct usb_request *req)
79{
80	WARN_ON(req->buf == NULL);
81	kfree(req->buf);
82	req->buf = NULL;
83	usb_ep_free_request(ep, req);
84}
85
86#endif /* __U_F_H__ */