1#ifndef _MEDIA_VIDEOBUF2_INTERNAL_H
2#define _MEDIA_VIDEOBUF2_INTERNAL_H
3
4#include <linux/err.h>
5#include <linux/kernel.h>
6#include <linux/module.h>
7#include <media/videobuf2-core.h>
8
9extern int vb2_debug;
10
11#define dprintk(level, fmt, arg...)					      \
12	do {								      \
13		if (vb2_debug >= level)					      \
14			pr_info("vb2: %s: " fmt, __func__, ## arg); \
15	} while (0)
16
17#ifdef CONFIG_VIDEO_ADV_DEBUG
18
19/*
20 * If advanced debugging is on, then count how often each op is called
21 * successfully, which can either be per-buffer or per-queue.
22 *
23 * This makes it easy to check that the 'init' and 'cleanup'
24 * (and variations thereof) stay balanced.
25 */
26
27#define log_memop(vb, op)						\
28	dprintk(2, "call_memop(%p, %d, %s)%s\n",			\
29		(vb)->vb2_queue, (vb)->index, #op,			\
30		(vb)->vb2_queue->mem_ops->op ? "" : " (nop)")
31
32#define call_memop(vb, op, args...)					\
33({									\
34	struct vb2_queue *_q = (vb)->vb2_queue;				\
35	int err;							\
36									\
37	log_memop(vb, op);						\
38	err = _q->mem_ops->op ? _q->mem_ops->op(args) : 0;		\
39	if (!err)							\
40		(vb)->cnt_mem_ ## op++;					\
41	err;								\
42})
43
44#define call_ptr_memop(vb, op, args...)					\
45({									\
46	struct vb2_queue *_q = (vb)->vb2_queue;				\
47	void *ptr;							\
48									\
49	log_memop(vb, op);						\
50	ptr = _q->mem_ops->op ? _q->mem_ops->op(args) : NULL;		\
51	if (!IS_ERR_OR_NULL(ptr))					\
52		(vb)->cnt_mem_ ## op++;					\
53	ptr;								\
54})
55
56#define call_void_memop(vb, op, args...)				\
57({									\
58	struct vb2_queue *_q = (vb)->vb2_queue;				\
59									\
60	log_memop(vb, op);						\
61	if (_q->mem_ops->op)						\
62		_q->mem_ops->op(args);					\
63	(vb)->cnt_mem_ ## op++;						\
64})
65
66#define log_qop(q, op)							\
67	dprintk(2, "call_qop(%p, %s)%s\n", q, #op,			\
68		(q)->ops->op ? "" : " (nop)")
69
70#define call_qop(q, op, args...)					\
71({									\
72	int err;							\
73									\
74	log_qop(q, op);							\
75	err = (q)->ops->op ? (q)->ops->op(args) : 0;			\
76	if (!err)							\
77		(q)->cnt_ ## op++;					\
78	err;								\
79})
80
81#define call_void_qop(q, op, args...)					\
82({									\
83	log_qop(q, op);							\
84	if ((q)->ops->op)						\
85		(q)->ops->op(args);					\
86	(q)->cnt_ ## op++;						\
87})
88
89#define log_vb_qop(vb, op, args...)					\
90	dprintk(2, "call_vb_qop(%p, %d, %s)%s\n",			\
91		(vb)->vb2_queue, (vb)->index, #op,			\
92		(vb)->vb2_queue->ops->op ? "" : " (nop)")
93
94#define call_vb_qop(vb, op, args...)					\
95({									\
96	int err;							\
97									\
98	log_vb_qop(vb, op);						\
99	err = (vb)->vb2_queue->ops->op ?				\
100		(vb)->vb2_queue->ops->op(args) : 0;			\
101	if (!err)							\
102		(vb)->cnt_ ## op++;					\
103	err;								\
104})
105
106#define call_void_vb_qop(vb, op, args...)				\
107({									\
108	log_vb_qop(vb, op);						\
109	if ((vb)->vb2_queue->ops->op)					\
110		(vb)->vb2_queue->ops->op(args);				\
111	(vb)->cnt_ ## op++;						\
112})
113
114#else
115
116#define call_memop(vb, op, args...)					\
117	((vb)->vb2_queue->mem_ops->op ?					\
118		(vb)->vb2_queue->mem_ops->op(args) : 0)
119
120#define call_ptr_memop(vb, op, args...)					\
121	((vb)->vb2_queue->mem_ops->op ?					\
122		(vb)->vb2_queue->mem_ops->op(args) : NULL)
123
124#define call_void_memop(vb, op, args...)				\
125	do {								\
126		if ((vb)->vb2_queue->mem_ops->op)			\
127			(vb)->vb2_queue->mem_ops->op(args);		\
128	} while (0)
129
130#define call_qop(q, op, args...)					\
131	((q)->ops->op ? (q)->ops->op(args) : 0)
132
133#define call_void_qop(q, op, args...)					\
134	do {								\
135		if ((q)->ops->op)					\
136			(q)->ops->op(args);				\
137	} while (0)
138
139#define call_vb_qop(vb, op, args...)					\
140	((vb)->vb2_queue->ops->op ? (vb)->vb2_queue->ops->op(args) : 0)
141
142#define call_void_vb_qop(vb, op, args...)				\
143	do {								\
144		if ((vb)->vb2_queue->ops->op)				\
145			(vb)->vb2_queue->ops->op(args);			\
146	} while (0)
147
148#endif
149
150#define call_bufop(q, op, args...)					\
151({									\
152	int ret = 0;							\
153	if (q && q->buf_ops && q->buf_ops->op)				\
154		ret = q->buf_ops->op(args);				\
155	ret;								\
156})
157
158bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb);
159int vb2_verify_memory_type(struct vb2_queue *q,
160		enum vb2_memory memory, unsigned int type);
161#endif /* _MEDIA_VIDEOBUF2_INTERNAL_H */
162