Linux Audio

Check our new training course

Loading...
v6.8
 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__ */
v6.2
 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__ */