1c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/*
2c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * vivid-core.h - core datastructures
3c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil *
4c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
5c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil *
6c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * This program is free software; you may redistribute it and/or modify
7c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * it under the terms of the GNU General Public License as published by
8c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * the Free Software Foundation; version 2 of the License.
9c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil *
10c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
11c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
13c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
14c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
15c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
16c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * SOFTWARE.
18c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */
19c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
20c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#ifndef _VIVID_CORE_H_
21c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define _VIVID_CORE_H_
22c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
23c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <linux/fb.h>
24c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/videobuf2-core.h>
25c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/v4l2-device.h>
26c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/v4l2-dev.h>
27c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/v4l2-ctrls.h>
28c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include "vivid-tpg.h"
29c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include "vivid-rds-gen.h"
30c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include "vivid-vbi-gen.h"
31c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
32c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define dprintk(dev, level, fmt, arg...) \
33c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	v4l2_dbg(level, vivid_debug, &dev->v4l2_dev, fmt, ## arg)
34c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
35c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* Maximum allowed frame rate
36c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil *
37c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * vivid will allow setting timeperframe in [1/FPS_MAX - FPS_MAX/1] range.
38c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil *
39c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Ideally FPS_MAX should be infinity, i.e. practically UINT_MAX, but that
40c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * might hit application errors when they manipulate these values.
41c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil *
42c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Besides, for tpf < 10ms image-generation logic should be changed, to avoid
43c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * producing frames with equal content.
44c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */
45c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define FPS_MAX 100
46c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
47c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum number of clip rectangles */
48c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_CLIPS  16
49c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum number of inputs */
50c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_INPUTS 16
51c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum number of outputs */
52c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_OUTPUTS 16
53c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum up or down scaling factor is 4 */
54c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_ZOOM  4
55c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum image width/height are set to 4K DMT */
56c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_WIDTH  4096
57c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_HEIGHT 2160
58c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The minimum image width/height */
59c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MIN_WIDTH  16
60c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MIN_HEIGHT 16
61c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The data_offset of plane 0 for the multiplanar formats */
62c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define PLANE0_DATA_OFFSET 128
63c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
64c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The supported TV frequency range in MHz */
65c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MIN_TV_FREQ (44U * 16U)
66c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_TV_FREQ (958U * 16U)
67c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
68c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The number of samples returned in every SDR buffer */
69c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define SDR_CAP_SAMPLES_PER_BUF 0x4000
70c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
71c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* used by the threads to know when to resync internal counters */
72c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define JIFFIES_PER_DAY (3600U * 24U * HZ)
73c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define JIFFIES_RESYNC (JIFFIES_PER_DAY * (0xf0000000U / JIFFIES_PER_DAY))
74c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
75c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern const struct v4l2_rect vivid_min_rect;
76c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern const struct v4l2_rect vivid_max_rect;
77c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern unsigned vivid_debug;
78c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
79c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstruct vivid_fmt {
80c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	const char *name;
81c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32	fourcc;          /* v4l2 format id */
82c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8	depth;
83c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool	is_yuv;
84c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool	can_do_overlay;
85c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32	alpha_mask;
86c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8	planes;
87c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32	data_offset[2];
88c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil};
89c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
90c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern struct vivid_fmt vivid_formats[];
91c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
92c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* buffer for one video frame */
93c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstruct vivid_buffer {
94c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* common v4l buffer stuff -- must be first */
95c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vb2_buffer	vb;
96c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct list_head	list;
97c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil};
98c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
99c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilenum vivid_input {
100c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	WEBCAM,
101c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	TV,
102c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	SVID,
103c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	HDMI,
104c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil};
105c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
106c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilenum vivid_signal_mode {
107c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	CURRENT_DV_TIMINGS,
108c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	CURRENT_STD = CURRENT_DV_TIMINGS,
109c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	NO_SIGNAL,
110c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	NO_LOCK,
111c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	OUT_OF_RANGE,
112c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	SELECTED_DV_TIMINGS,
113c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	SELECTED_STD = SELECTED_DV_TIMINGS,
114c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	CYCLE_DV_TIMINGS,
115c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	CYCLE_STD = CYCLE_DV_TIMINGS,
116c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	CUSTOM_DV_TIMINGS,
117c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil};
118c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
119c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define VIVID_INVALID_SIGNAL(mode) \
120c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	((mode) == NO_SIGNAL || (mode) == NO_LOCK || (mode) == OUT_OF_RANGE)
121c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
122c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstruct vivid_dev {
123c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			inst;
124c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_device		v4l2_dev;
125c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_user_gen;
126c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_user_vid;
127c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_user_aud;
128c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_streaming;
129c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_sdtv_cap;
130c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_loop_out;
131c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		vid_cap_dev;
132c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_vid_cap;
133c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		vid_out_dev;
134c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_vid_out;
135c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		vbi_cap_dev;
136c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_vbi_cap;
137c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		vbi_out_dev;
138c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_vbi_out;
139c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		radio_rx_dev;
140c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_radio_rx;
141c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		radio_tx_dev;
142c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_radio_tx;
143c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct video_device		sdr_cap_dev;
144c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl_handler	ctrl_hdl_sdr_cap;
145c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	spinlock_t			slock;
146c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct mutex			mutex;
147c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
148c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* capabilities */
149c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vid_cap_caps;
150c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vid_out_caps;
151c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vbi_cap_caps;
152c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vbi_out_caps;
153c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				sdr_cap_caps;
154c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				radio_rx_caps;
155c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				radio_tx_caps;
156c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
157c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* supported features */
158c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				multiplanar;
159c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			num_inputs;
160c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				input_type[MAX_INPUTS];
161c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				input_name_counter[MAX_INPUTS];
162c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			num_outputs;
163c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				output_type[MAX_OUTPUTS];
164c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				output_name_counter[MAX_OUTPUTS];
165c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_audio_inputs;
166c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_audio_outputs;
167c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_vid_cap;
168c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_vid_out;
169c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_vbi_cap;
170c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_raw_vbi_cap;
171c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_sliced_vbi_cap;
172c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_vbi_out;
173c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_raw_vbi_out;
174c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_sliced_vbi_out;
175c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_radio_rx;
176c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_radio_tx;
177c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_sdr_cap;
178c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_fb;
179c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
180c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				can_loop_video;
181c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
182c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* controls */
183c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*brightness;
184c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*contrast;
185c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*saturation;
186c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*hue;
187c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct {
188c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		/* autogain/gain cluster */
189c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		struct v4l2_ctrl	*autogain;
190c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		struct v4l2_ctrl	*gain;
191c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	};
192c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*volume;
193c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*mute;
194c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*alpha;
195c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*button;
196c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*boolean;
197c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*int32;
198c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*int64;
199c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*menu;
200c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*string;
201c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*bitmask;
202c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*int_menu;
203c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*test_pattern;
204c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*colorspace;
205c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*rgb_range_cap;
206c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*real_rgb_range_cap;
207c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct {
208c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		/* std_signal_mode/standard cluster */
209c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		struct v4l2_ctrl	*ctrl_std_signal_mode;
210c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		struct v4l2_ctrl	*ctrl_standard;
211c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	};
212c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct {
213c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		/* dv_timings_signal_mode/timings cluster */
214c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		struct v4l2_ctrl	*ctrl_dv_timings_signal_mode;
215c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil		struct v4l2_ctrl	*ctrl_dv_timings;
216c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	};
217c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_has_crop_cap;
218c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_has_compose_cap;
219c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_has_scaler_cap;
220c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_has_crop_out;
221c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_has_compose_out;
222c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_has_scaler_out;
223c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_tx_mode;
224c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*ctrl_tx_rgb_range;
225c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
226c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_pi;
227c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_pty;
228c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_mono_stereo;
229c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_art_head;
230c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_compressed;
231c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_dyn_pty;
232c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_ta;
233c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_tp;
234c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_ms;
235c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_psname;
236c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_tx_rds_radiotext;
237c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
238c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_rx_rds_pty;
239c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_rx_rds_ta;
240c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_rx_rds_tp;
241c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_rx_rds_ms;
242c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_rx_rds_psname;
243c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_ctrl		*radio_rx_rds_radiotext;
244c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
245c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			input_brightness[MAX_INPUTS];
246c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			osd_mode;
247c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			button_pressed;
248c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				sensor_hflip;
249c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				sensor_vflip;
250c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				hflip;
251c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vflip;
252c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vbi_cap_interlaced;
253c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				loop_video;
254c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
255c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Framebuffer */
256c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned long			video_pbase;
257c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	void				*video_vbase;
258c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				video_buffer_size;
259c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				display_width;
260c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				display_height;
261c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				display_byte_stride;
262c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				bits_per_pixel;
263c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				bytes_per_pixel;
264c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct fb_info			fb_info;
265c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct fb_var_screeninfo	fb_defined;
266c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct fb_fix_screeninfo	fb_fix;
267c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
268c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Error injection */
269c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				queue_setup_error;
270c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				buf_prepare_error;
271c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				start_streaming_error;
272c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				dqbuf_error;
273c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				seq_wrap;
274c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				time_wrap;
275c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	__kernel_time_t			time_wrap_offset;
276c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			perc_dropped_buffers;
277c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum vivid_signal_mode		std_signal_mode;
278c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			query_std_last;
279c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	v4l2_std_id			query_std;
280c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum tpg_video_aspect		std_aspect_ratio;
281c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
282c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum vivid_signal_mode		dv_timings_signal_mode;
283c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	char				**query_dv_timings_qmenu;
284c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			query_dv_timings_size;
285c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			query_dv_timings_last;
286c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			query_dv_timings;
287c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum tpg_video_aspect		dv_timings_aspect_ratio;
288c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
289c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Input */
290c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			input;
291c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	v4l2_std_id			std_cap;
292c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_dv_timings		dv_timings_cap;
293c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				service_set_cap;
294c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vivid_vbi_gen_data	vbi_gen;
295c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				*edid;
296c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			edid_blocks;
297c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			edid_max_blocks;
298c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			webcam_size_idx;
299c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			webcam_ival_idx;
300c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			tv_freq;
301c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			tv_audmode;
302c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			tv_field_cap;
303c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			tv_audio_input;
304c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
305c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Capture Overlay */
306c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_framebuffer		fb_cap;
307c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_fh			*overlay_cap_owner;
308c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	void				*fb_vbase_cap;
309c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				overlay_cap_top, overlay_cap_left;
310c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum v4l2_field			overlay_cap_field;
311c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	void				*bitmap_cap;
312c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_clip		clips_cap[MAX_CLIPS];
313c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_clip		try_clips_cap[MAX_CLIPS];
314c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			clipcount_cap;
315c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
316c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Output */
317c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			output;
318c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	v4l2_std_id			std_out;
319c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_dv_timings		dv_timings_out;
320c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				colorspace_out;
321c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				service_set_out;
322c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				bytesperline_out[2];
323c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			tv_field_out;
324c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			tv_audio_output;
325c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vbi_out_have_wss;
326c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				vbi_out_wss[2];
327c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vbi_out_have_cc[2];
328c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				vbi_out_cc[2][2];
329c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				dvi_d_out;
330c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				*scaled_line;
331c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				*blended_line;
332c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			cur_scaled_line;
333c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
334c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Output Overlay */
335c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	void				*fb_vbase_out;
336c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				overlay_out_enabled;
337c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				overlay_out_top, overlay_out_left;
338c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	void				*bitmap_out;
339c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_clip		clips_out[MAX_CLIPS];
340c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_clip		try_clips_out[MAX_CLIPS];
341c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			clipcount_out;
342c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			fbuf_out_flags;
343c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				chromakey_out;
344c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u8				global_alpha_out;
345c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
346c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* video capture */
347c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct tpg_data			tpg;
348c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			ms_vid_cap;
349c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				must_blank[VIDEO_MAX_FRAME];
350c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
351c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	const struct vivid_fmt		*fmt_cap;
352c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_fract		timeperframe_vid_cap;
353c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum v4l2_field			field_cap;
354c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		src_rect;
355c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		fmt_cap_rect;
356c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		crop_cap;
357c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		compose_cap;
358c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		crop_bounds_cap;
359c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vb2_queue		vb_vid_cap_q;
360c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct list_head		vid_cap_active;
361c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vb2_queue		vb_vbi_cap_q;
362c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct list_head		vbi_cap_active;
363c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
364c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* thread for generating video capture stream */
365c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct task_struct		*kthread_vid_cap;
366c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned long			jiffies_vid_cap;
367c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				cap_seq_offset;
368c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				cap_seq_count;
369c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				cap_seq_resync;
370c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vid_cap_seq_start;
371c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vid_cap_seq_count;
372c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vid_cap_streaming;
373c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vbi_cap_seq_start;
374c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vbi_cap_seq_count;
375c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vbi_cap_streaming;
376c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				stream_sliced_vbi_cap;
377c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
378c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* video output */
379c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	const struct vivid_fmt		*fmt_out;
380c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_fract		timeperframe_vid_out;
381c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	enum v4l2_field			field_out;
382c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		sink_rect;
383c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		fmt_out_rect;
384c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		crop_out;
385c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		compose_out;
386c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		compose_bounds_out;
387c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vb2_queue		vb_vid_out_q;
388c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct list_head		vid_out_active;
389c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vb2_queue		vb_vbi_out_q;
390c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct list_head		vbi_out_active;
391c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
392c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* video loop precalculated rectangles */
393c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
394c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/*
395c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * Intersection between what the output side composes and the capture side
396c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * crops. I.e., what actually needs to be copied from the output buffer to
397c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * the capture buffer.
398c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 */
399c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		loop_vid_copy;
400c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* The part of the output buffer that (after scaling) corresponds to loop_vid_copy. */
401c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		loop_vid_out;
402c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* The part of the capture buffer that (after scaling) corresponds to loop_vid_copy. */
403c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		loop_vid_cap;
404c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/*
405c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * The intersection of the framebuffer, the overlay output window and
406c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * loop_vid_copy. I.e., the part of the framebuffer that actually should be
407c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * blended with the compose_out rectangle. This uses the framebuffer origin.
408c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 */
409c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		loop_fb_copy;
410c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* The same as loop_fb_copy but with compose_out origin. */
411c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		loop_vid_overlay;
412c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/*
413c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * The part of the capture buffer that (after scaling) corresponds
414c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 * to loop_vid_overlay.
415c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	 */
416c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_rect		loop_vid_overlay_cap;
417c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
418c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* thread for generating video output stream */
419c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct task_struct		*kthread_vid_out;
420c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned long			jiffies_vid_out;
421c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				out_seq_offset;
422c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				out_seq_count;
423c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				out_seq_resync;
424c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vid_out_seq_start;
425c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vid_out_seq_count;
426c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vid_out_streaming;
427c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vbi_out_seq_start;
428c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				vbi_out_seq_count;
429c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				vbi_out_streaming;
430c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				stream_sliced_vbi_out;
431c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
432c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* SDR capture */
433c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vb2_queue		vb_sdr_cap_q;
434c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct list_head		sdr_cap_active;
435c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			sdr_adc_freq;
436c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			sdr_fm_freq;
437c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				sdr_fixp_src_phase;
438c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				sdr_fixp_mod_phase;
439c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
440c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				tstamp_src_is_soe;
441c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_crop_cap;
442c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_compose_cap;
443c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_scaler_cap;
444c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_crop_out;
445c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_compose_out;
446c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				has_scaler_out;
447c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
448c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* thread for generating SDR stream */
449c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct task_struct		*kthread_sdr_cap;
450c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned long			jiffies_sdr_cap;
451c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				sdr_cap_seq_offset;
452c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	u32				sdr_cap_seq_count;
453c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				sdr_cap_seq_resync;
454c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
455c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* RDS generator */
456c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct vivid_rds_gen		rds_gen;
457c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
458c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Radio receiver */
459c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_rx_freq;
460c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_rx_audmode;
461c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	int				radio_rx_sig_qual;
462c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_rx_hw_seek_mode;
463c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				radio_rx_hw_seek_prog_lim;
464c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				radio_rx_rds_controls;
465c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				radio_rx_rds_enabled;
466c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_rx_rds_use_alternates;
467c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_rx_rds_last_block;
468c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_fh			*radio_rx_rds_owner;
469c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
470c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Radio transmitter */
471c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_tx_freq;
472c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_tx_subchans;
473c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				radio_tx_rds_controls;
474c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	unsigned			radio_tx_rds_last_block;
475c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct v4l2_fh			*radio_tx_rds_owner;
476c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
477c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	/* Shared between radio receiver and transmitter */
478c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	bool				radio_rds_loop;
479c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	struct timespec			radio_rds_init_ts;
480c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil};
481c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
482c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_webcam(const struct vivid_dev *dev)
483c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
484c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return dev->input_type[dev->input] == WEBCAM;
485c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
486c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
487c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_tv_cap(const struct vivid_dev *dev)
488c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
489c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return dev->input_type[dev->input] == TV;
490c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
491c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
492c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_svid_cap(const struct vivid_dev *dev)
493c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
494c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return dev->input_type[dev->input] == SVID;
495c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
496c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
497c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_hdmi_cap(const struct vivid_dev *dev)
498c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
499c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return dev->input_type[dev->input] == HDMI;
500c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
501c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
502c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_sdtv_cap(const struct vivid_dev *dev)
503c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
504c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return vivid_is_tv_cap(dev) || vivid_is_svid_cap(dev);
505c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
506c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
507c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_svid_out(const struct vivid_dev *dev)
508c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
509c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return dev->output_type[dev->output] == SVID;
510c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
511c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
512c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_hdmi_out(const struct vivid_dev *dev)
513c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{
514c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil	return dev->output_type[dev->output] == HDMI;
515c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}
516c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
517c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilvoid vivid_lock(struct vb2_queue *vq);
518c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilvoid vivid_unlock(struct vb2_queue *vq);
519c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil
520c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#endif
521