1dacca5f0SHans Verkuil /* SPDX-License-Identifier: GPL-2.0-only */
2dacca5f0SHans Verkuil /*
3dacca5f0SHans Verkuil  * vivid-core.h - core datastructures
4dacca5f0SHans Verkuil  *
5dacca5f0SHans Verkuil  * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6dacca5f0SHans Verkuil  */
7dacca5f0SHans Verkuil 
8dacca5f0SHans Verkuil #ifndef _VIVID_CORE_H_
9dacca5f0SHans Verkuil #define _VIVID_CORE_H_
10dacca5f0SHans Verkuil 
11dacca5f0SHans Verkuil #include <linux/fb.h>
12dacca5f0SHans Verkuil #include <linux/workqueue.h>
13dacca5f0SHans Verkuil #include <media/cec.h>
14dacca5f0SHans Verkuil #include <media/videobuf2-v4l2.h>
15dacca5f0SHans Verkuil #include <media/v4l2-device.h>
16dacca5f0SHans Verkuil #include <media/v4l2-dev.h>
17dacca5f0SHans Verkuil #include <media/v4l2-ctrls.h>
18dacca5f0SHans Verkuil #include <media/tpg/v4l2-tpg.h>
19dacca5f0SHans Verkuil #include "vivid-rds-gen.h"
20dacca5f0SHans Verkuil #include "vivid-vbi-gen.h"
21dacca5f0SHans Verkuil 
22dacca5f0SHans Verkuil #define dprintk(dev, level, fmt, arg...) \
23dacca5f0SHans Verkuil 	v4l2_dbg(level, vivid_debug, &dev->v4l2_dev, fmt, ## arg)
24dacca5f0SHans Verkuil 
25dacca5f0SHans Verkuil /* The maximum number of inputs */
26dacca5f0SHans Verkuil #define MAX_INPUTS 16
27dacca5f0SHans Verkuil /* The maximum number of outputs */
28dacca5f0SHans Verkuil #define MAX_OUTPUTS 16
29dacca5f0SHans Verkuil /* The maximum up or down scaling factor is 4 */
30dacca5f0SHans Verkuil #define MAX_ZOOM  4
31dacca5f0SHans Verkuil /* The maximum image width/height are set to 4K DMT */
32dacca5f0SHans Verkuil #define MAX_WIDTH  4096
33dacca5f0SHans Verkuil #define MAX_HEIGHT 2160
34dacca5f0SHans Verkuil /* The minimum image width/height */
35dacca5f0SHans Verkuil #define MIN_WIDTH  16
36*6bc7643dSHans Verkuil #define MIN_HEIGHT MIN_WIDTH
37*6bc7643dSHans Verkuil /* Pixel Array control divider */
38*6bc7643dSHans Verkuil #define PIXEL_ARRAY_DIV MIN_WIDTH
39dacca5f0SHans Verkuil /* The data_offset of plane 0 for the multiplanar formats */
40dacca5f0SHans Verkuil #define PLANE0_DATA_OFFSET 128
41dacca5f0SHans Verkuil 
42dacca5f0SHans Verkuil /* The supported TV frequency range in MHz */
43dacca5f0SHans Verkuil #define MIN_TV_FREQ (44U * 16U)
44dacca5f0SHans Verkuil #define MAX_TV_FREQ (958U * 16U)
45dacca5f0SHans Verkuil 
46dacca5f0SHans Verkuil /* The number of samples returned in every SDR buffer */
47dacca5f0SHans Verkuil #define SDR_CAP_SAMPLES_PER_BUF 0x4000
48dacca5f0SHans Verkuil 
49dacca5f0SHans Verkuil /* used by the threads to know when to resync internal counters */
50dacca5f0SHans Verkuil #define JIFFIES_PER_DAY (3600U * 24U * HZ)
51dacca5f0SHans Verkuil #define JIFFIES_RESYNC (JIFFIES_PER_DAY * (0xf0000000U / JIFFIES_PER_DAY))
52dacca5f0SHans Verkuil 
53dacca5f0SHans Verkuil extern const struct v4l2_rect vivid_min_rect;
54dacca5f0SHans Verkuil extern const struct v4l2_rect vivid_max_rect;
55dacca5f0SHans Verkuil extern unsigned vivid_debug;
56dacca5f0SHans Verkuil 
57dacca5f0SHans Verkuil struct vivid_fmt {
58dacca5f0SHans Verkuil 	u32	fourcc;          /* v4l2 format id */
59dacca5f0SHans Verkuil 	enum	tgp_color_enc color_enc;
60dacca5f0SHans Verkuil 	bool	can_do_overlay;
61dacca5f0SHans Verkuil 	u8	vdownsampling[TPG_MAX_PLANES];
62dacca5f0SHans Verkuil 	u32	alpha_mask;
63dacca5f0SHans Verkuil 	u8	planes;
64dacca5f0SHans Verkuil 	u8	buffers;
65dacca5f0SHans Verkuil 	u32	data_offset[TPG_MAX_PLANES];
66dacca5f0SHans Verkuil 	u32	bit_depth[TPG_MAX_PLANES];
67dacca5f0SHans Verkuil };
68dacca5f0SHans Verkuil 
69dacca5f0SHans Verkuil extern struct vivid_fmt vivid_formats[];
70dacca5f0SHans Verkuil 
71dacca5f0SHans Verkuil /* buffer for one video frame */
72dacca5f0SHans Verkuil struct vivid_buffer {
73dacca5f0SHans Verkuil 	/* common v4l buffer stuff -- must be first */
74dacca5f0SHans Verkuil 	struct vb2_v4l2_buffer vb;
75dacca5f0SHans Verkuil 	struct list_head	list;
76dacca5f0SHans Verkuil };
77dacca5f0SHans Verkuil 
78dacca5f0SHans Verkuil enum vivid_input {
79dacca5f0SHans Verkuil 	WEBCAM,
80dacca5f0SHans Verkuil 	TV,
81dacca5f0SHans Verkuil 	SVID,
82dacca5f0SHans Verkuil 	HDMI,
83dacca5f0SHans Verkuil };
84dacca5f0SHans Verkuil 
85dacca5f0SHans Verkuil enum vivid_signal_mode {
86dacca5f0SHans Verkuil 	CURRENT_DV_TIMINGS,
87dacca5f0SHans Verkuil 	CURRENT_STD = CURRENT_DV_TIMINGS,
88dacca5f0SHans Verkuil 	NO_SIGNAL,
89dacca5f0SHans Verkuil 	NO_LOCK,
90dacca5f0SHans Verkuil 	OUT_OF_RANGE,
91dacca5f0SHans Verkuil 	SELECTED_DV_TIMINGS,
92dacca5f0SHans Verkuil 	SELECTED_STD = SELECTED_DV_TIMINGS,
93dacca5f0SHans Verkuil 	CYCLE_DV_TIMINGS,
94dacca5f0SHans Verkuil 	CYCLE_STD = CYCLE_DV_TIMINGS,
95dacca5f0SHans Verkuil 	CUSTOM_DV_TIMINGS,
96dacca5f0SHans Verkuil };
97dacca5f0SHans Verkuil 
98dacca5f0SHans Verkuil enum vivid_colorspace {
99dacca5f0SHans Verkuil 	VIVID_CS_170M,
100dacca5f0SHans Verkuil 	VIVID_CS_709,
101dacca5f0SHans Verkuil 	VIVID_CS_SRGB,
102dacca5f0SHans Verkuil 	VIVID_CS_OPRGB,
103dacca5f0SHans Verkuil 	VIVID_CS_2020,
104dacca5f0SHans Verkuil 	VIVID_CS_DCI_P3,
105dacca5f0SHans Verkuil 	VIVID_CS_240M,
106dacca5f0SHans Verkuil 	VIVID_CS_SYS_M,
107dacca5f0SHans Verkuil 	VIVID_CS_SYS_BG,
108dacca5f0SHans Verkuil };
109dacca5f0SHans Verkuil 
110dacca5f0SHans Verkuil #define VIVID_INVALID_SIGNAL(mode) \
111dacca5f0SHans Verkuil 	((mode) == NO_SIGNAL || (mode) == NO_LOCK || (mode) == OUT_OF_RANGE)
112dacca5f0SHans Verkuil 
113c6c709eeSDeborah Brouwer struct vivid_cec_xfer {
114dacca5f0SHans Verkuil 	struct cec_adapter	*adap;
115c6c709eeSDeborah Brouwer 	u8			msg[CEC_MAX_MSG_SIZE];
116c6c709eeSDeborah Brouwer 	u32			len;
117c6c709eeSDeborah Brouwer 	u32			sft;
118dacca5f0SHans Verkuil };
119dacca5f0SHans Verkuil 
120dacca5f0SHans Verkuil struct vivid_dev {
121dacca5f0SHans Verkuil 	unsigned			inst;
122dacca5f0SHans Verkuil 	struct v4l2_device		v4l2_dev;
123dacca5f0SHans Verkuil #ifdef CONFIG_MEDIA_CONTROLLER
124dacca5f0SHans Verkuil 	struct media_device		mdev;
125dacca5f0SHans Verkuil 	struct media_pad		vid_cap_pad;
126dacca5f0SHans Verkuil 	struct media_pad		vid_out_pad;
127dacca5f0SHans Verkuil 	struct media_pad		vbi_cap_pad;
128dacca5f0SHans Verkuil 	struct media_pad		vbi_out_pad;
129dacca5f0SHans Verkuil 	struct media_pad		sdr_cap_pad;
130dacca5f0SHans Verkuil 	struct media_pad		meta_cap_pad;
131dacca5f0SHans Verkuil 	struct media_pad		meta_out_pad;
132dacca5f0SHans Verkuil 	struct media_pad		touch_cap_pad;
133dacca5f0SHans Verkuil #endif
134dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_user_gen;
135dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_user_vid;
136dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_user_aud;
137dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_streaming;
138dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_sdtv_cap;
139dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_loop_cap;
140dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_fb;
141dacca5f0SHans Verkuil 	struct video_device		vid_cap_dev;
142dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_vid_cap;
143dacca5f0SHans Verkuil 	struct video_device		vid_out_dev;
144dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_vid_out;
145dacca5f0SHans Verkuil 	struct video_device		vbi_cap_dev;
146dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_vbi_cap;
147dacca5f0SHans Verkuil 	struct video_device		vbi_out_dev;
148dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_vbi_out;
149dacca5f0SHans Verkuil 	struct video_device		radio_rx_dev;
150dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_radio_rx;
151dacca5f0SHans Verkuil 	struct video_device		radio_tx_dev;
152dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_radio_tx;
153dacca5f0SHans Verkuil 	struct video_device		sdr_cap_dev;
154dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_sdr_cap;
155dacca5f0SHans Verkuil 	struct video_device		meta_cap_dev;
156dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_meta_cap;
157dacca5f0SHans Verkuil 	struct video_device		meta_out_dev;
158dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_meta_out;
159dacca5f0SHans Verkuil 	struct video_device		touch_cap_dev;
160dacca5f0SHans Verkuil 	struct v4l2_ctrl_handler	ctrl_hdl_touch_cap;
161dacca5f0SHans Verkuil 
162dacca5f0SHans Verkuil 	spinlock_t			slock;
163dacca5f0SHans Verkuil 	struct mutex			mutex;
164dacca5f0SHans Verkuil 
165dacca5f0SHans Verkuil 	/* capabilities */
166dacca5f0SHans Verkuil 	u32				vid_cap_caps;
167dacca5f0SHans Verkuil 	u32				vid_out_caps;
168dacca5f0SHans Verkuil 	u32				vbi_cap_caps;
169dacca5f0SHans Verkuil 	u32				vbi_out_caps;
170dacca5f0SHans Verkuil 	u32				sdr_cap_caps;
171dacca5f0SHans Verkuil 	u32				radio_rx_caps;
172dacca5f0SHans Verkuil 	u32				radio_tx_caps;
173dacca5f0SHans Verkuil 	u32				meta_cap_caps;
174dacca5f0SHans Verkuil 	u32				meta_out_caps;
175dacca5f0SHans Verkuil 	u32				touch_cap_caps;
176dacca5f0SHans Verkuil 
177dacca5f0SHans Verkuil 	/* supported features */
178dacca5f0SHans Verkuil 	bool				multiplanar;
179dacca5f0SHans Verkuil 	unsigned			num_inputs;
180dacca5f0SHans Verkuil 	unsigned int			num_hdmi_inputs;
181dacca5f0SHans Verkuil 	u8				input_type[MAX_INPUTS];
182dacca5f0SHans Verkuil 	u8				input_name_counter[MAX_INPUTS];
183dacca5f0SHans Verkuil 	unsigned			num_outputs;
184dacca5f0SHans Verkuil 	unsigned int			num_hdmi_outputs;
185dacca5f0SHans Verkuil 	u8				output_type[MAX_OUTPUTS];
186dacca5f0SHans Verkuil 	u8				output_name_counter[MAX_OUTPUTS];
187dacca5f0SHans Verkuil 	bool				has_audio_inputs;
188dacca5f0SHans Verkuil 	bool				has_audio_outputs;
189dacca5f0SHans Verkuil 	bool				has_vid_cap;
190dacca5f0SHans Verkuil 	bool				has_vid_out;
191dacca5f0SHans Verkuil 	bool				has_vbi_cap;
192dacca5f0SHans Verkuil 	bool				has_raw_vbi_cap;
193dacca5f0SHans Verkuil 	bool				has_sliced_vbi_cap;
194dacca5f0SHans Verkuil 	bool				has_vbi_out;
195dacca5f0SHans Verkuil 	bool				has_raw_vbi_out;
196dacca5f0SHans Verkuil 	bool				has_sliced_vbi_out;
197dacca5f0SHans Verkuil 	bool				has_radio_rx;
198dacca5f0SHans Verkuil 	bool				has_radio_tx;
199dacca5f0SHans Verkuil 	bool				has_sdr_cap;
200dacca5f0SHans Verkuil 	bool				has_fb;
201dacca5f0SHans Verkuil 	bool				has_meta_cap;
202dacca5f0SHans Verkuil 	bool				has_meta_out;
203dacca5f0SHans Verkuil 	bool				has_tv_tuner;
204dacca5f0SHans Verkuil 	bool				has_touch_cap;
205dacca5f0SHans Verkuil 
206dacca5f0SHans Verkuil 	bool				can_loop_video;
207dacca5f0SHans Verkuil 
208dacca5f0SHans Verkuil 	/* controls */
209dacca5f0SHans Verkuil 	struct v4l2_ctrl		*brightness;
210dacca5f0SHans Verkuil 	struct v4l2_ctrl		*contrast;
211dacca5f0SHans Verkuil 	struct v4l2_ctrl		*saturation;
212dacca5f0SHans Verkuil 	struct v4l2_ctrl		*hue;
213dacca5f0SHans Verkuil 	struct {
214dacca5f0SHans Verkuil 		/* autogain/gain cluster */
215dacca5f0SHans Verkuil 		struct v4l2_ctrl	*autogain;
216dacca5f0SHans Verkuil 		struct v4l2_ctrl	*gain;
217dacca5f0SHans Verkuil 	};
218dacca5f0SHans Verkuil 	struct v4l2_ctrl		*volume;
219dacca5f0SHans Verkuil 	struct v4l2_ctrl		*mute;
220dacca5f0SHans Verkuil 	struct v4l2_ctrl		*alpha;
221dacca5f0SHans Verkuil 	struct v4l2_ctrl		*button;
222dacca5f0SHans Verkuil 	struct v4l2_ctrl		*boolean;
223dacca5f0SHans Verkuil 	struct v4l2_ctrl		*int32;
224dacca5f0SHans Verkuil 	struct v4l2_ctrl		*int64;
225dacca5f0SHans Verkuil 	struct v4l2_ctrl		*menu;
226dacca5f0SHans Verkuil 	struct v4l2_ctrl		*string;
227dacca5f0SHans Verkuil 	struct v4l2_ctrl		*bitmask;
228dacca5f0SHans Verkuil 	struct v4l2_ctrl		*int_menu;
229bb65e3d9SHans Verkuil 	struct v4l2_ctrl		*ro_int32;
230*6bc7643dSHans Verkuil 	struct v4l2_ctrl		*pixel_array;
231dacca5f0SHans Verkuil 	struct v4l2_ctrl		*test_pattern;
232dacca5f0SHans Verkuil 	struct v4l2_ctrl		*colorspace;
233dacca5f0SHans Verkuil 	struct v4l2_ctrl		*rgb_range_cap;
234dacca5f0SHans Verkuil 	struct v4l2_ctrl		*real_rgb_range_cap;
235dacca5f0SHans Verkuil 	struct {
236dacca5f0SHans Verkuil 		/* std_signal_mode/standard cluster */
237dacca5f0SHans Verkuil 		struct v4l2_ctrl	*ctrl_std_signal_mode;
238dacca5f0SHans Verkuil 		struct v4l2_ctrl	*ctrl_standard;
239dacca5f0SHans Verkuil 	};
240dacca5f0SHans Verkuil 	struct {
241dacca5f0SHans Verkuil 		/* dv_timings_signal_mode/timings cluster */
242dacca5f0SHans Verkuil 		struct v4l2_ctrl	*ctrl_dv_timings_signal_mode;
243dacca5f0SHans Verkuil 		struct v4l2_ctrl	*ctrl_dv_timings;
244dacca5f0SHans Verkuil 	};
245dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_display_present;
246dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_has_crop_cap;
247dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_has_compose_cap;
248dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_has_scaler_cap;
249dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_has_crop_out;
250dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_has_compose_out;
251dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_has_scaler_out;
252dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_tx_mode;
253dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_tx_rgb_range;
254dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_tx_edid_present;
255dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_tx_hotplug;
256dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_tx_rxsense;
257dacca5f0SHans Verkuil 
258dacca5f0SHans Verkuil 	struct v4l2_ctrl		*ctrl_rx_power_present;
259dacca5f0SHans Verkuil 
260dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_pi;
261dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_pty;
262dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_mono_stereo;
263dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_art_head;
264dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_compressed;
265dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_dyn_pty;
266dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_ta;
267dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_tp;
268dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_ms;
269dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_psname;
270dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_tx_rds_radiotext;
271dacca5f0SHans Verkuil 
272dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_rx_rds_pty;
273dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_rx_rds_ta;
274dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_rx_rds_tp;
275dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_rx_rds_ms;
276dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_rx_rds_psname;
277dacca5f0SHans Verkuil 	struct v4l2_ctrl		*radio_rx_rds_radiotext;
278dacca5f0SHans Verkuil 
279dacca5f0SHans Verkuil 	unsigned			input_brightness[MAX_INPUTS];
280dacca5f0SHans Verkuil 	unsigned			osd_mode;
281dacca5f0SHans Verkuil 	unsigned			button_pressed;
282dacca5f0SHans Verkuil 	bool				sensor_hflip;
283dacca5f0SHans Verkuil 	bool				sensor_vflip;
284dacca5f0SHans Verkuil 	bool				hflip;
285dacca5f0SHans Verkuil 	bool				vflip;
286dacca5f0SHans Verkuil 	bool				vbi_cap_interlaced;
287dacca5f0SHans Verkuil 	bool				loop_video;
288dacca5f0SHans Verkuil 	bool				reduced_fps;
289dacca5f0SHans Verkuil 
290dacca5f0SHans Verkuil 	/* Framebuffer */
291dacca5f0SHans Verkuil 	unsigned long			video_pbase;
292dacca5f0SHans Verkuil 	void				*video_vbase;
293dacca5f0SHans Verkuil 	u32				video_buffer_size;
294dacca5f0SHans Verkuil 	int				display_width;
295dacca5f0SHans Verkuil 	int				display_height;
296dacca5f0SHans Verkuil 	int				display_byte_stride;
297dacca5f0SHans Verkuil 	int				bits_per_pixel;
298dacca5f0SHans Verkuil 	int				bytes_per_pixel;
299dacca5f0SHans Verkuil 	struct fb_info			fb_info;
300dacca5f0SHans Verkuil 	struct fb_var_screeninfo	fb_defined;
301dacca5f0SHans Verkuil 	struct fb_fix_screeninfo	fb_fix;
302dacca5f0SHans Verkuil 
303dacca5f0SHans Verkuil 	/* Error injection */
3049e5f21d6SHans Verkuil 	bool				disconnect_error;
305dacca5f0SHans Verkuil 	bool				queue_setup_error;
306dacca5f0SHans Verkuil 	bool				buf_prepare_error;
307dacca5f0SHans Verkuil 	bool				start_streaming_error;
308dacca5f0SHans Verkuil 	bool				dqbuf_error;
309dacca5f0SHans Verkuil 	bool				req_validate_error;
310dacca5f0SHans Verkuil 	bool				seq_wrap;
31157c1d5deSDeborah Brouwer 	u64				time_wrap;
312dacca5f0SHans Verkuil 	u64				time_wrap_offset;
313dacca5f0SHans Verkuil 	unsigned			perc_dropped_buffers;
314dacca5f0SHans Verkuil 	enum vivid_signal_mode		std_signal_mode[MAX_INPUTS];
315dacca5f0SHans Verkuil 	unsigned int			query_std_last[MAX_INPUTS];
316dacca5f0SHans Verkuil 	v4l2_std_id			query_std[MAX_INPUTS];
317dacca5f0SHans Verkuil 	enum tpg_video_aspect		std_aspect_ratio[MAX_INPUTS];
318dacca5f0SHans Verkuil 
319dacca5f0SHans Verkuil 	enum vivid_signal_mode		dv_timings_signal_mode[MAX_INPUTS];
320dacca5f0SHans Verkuil 	char				**query_dv_timings_qmenu;
321dacca5f0SHans Verkuil 	char				*query_dv_timings_qmenu_strings;
322dacca5f0SHans Verkuil 	unsigned			query_dv_timings_size;
323dacca5f0SHans Verkuil 	unsigned int			query_dv_timings_last[MAX_INPUTS];
324dacca5f0SHans Verkuil 	unsigned int			query_dv_timings[MAX_INPUTS];
325dacca5f0SHans Verkuil 	enum tpg_video_aspect		dv_timings_aspect_ratio[MAX_INPUTS];
326dacca5f0SHans Verkuil 
327dacca5f0SHans Verkuil 	/* Input */
328dacca5f0SHans Verkuil 	unsigned			input;
329dacca5f0SHans Verkuil 	v4l2_std_id			std_cap[MAX_INPUTS];
330dacca5f0SHans Verkuil 	struct v4l2_dv_timings		dv_timings_cap[MAX_INPUTS];
331dacca5f0SHans Verkuil 	int				dv_timings_cap_sel[MAX_INPUTS];
332dacca5f0SHans Verkuil 	u32				service_set_cap;
333dacca5f0SHans Verkuil 	struct vivid_vbi_gen_data	vbi_gen;
334dacca5f0SHans Verkuil 	u8				*edid;
335dacca5f0SHans Verkuil 	unsigned			edid_blocks;
336dacca5f0SHans Verkuil 	unsigned			edid_max_blocks;
337dacca5f0SHans Verkuil 	unsigned			webcam_size_idx;
338dacca5f0SHans Verkuil 	unsigned			webcam_ival_idx;
339dacca5f0SHans Verkuil 	unsigned			tv_freq;
340dacca5f0SHans Verkuil 	unsigned			tv_audmode;
341dacca5f0SHans Verkuil 	unsigned			tv_field_cap;
342dacca5f0SHans Verkuil 	unsigned			tv_audio_input;
343dacca5f0SHans Verkuil 
344dacca5f0SHans Verkuil 	u32				power_present;
345dacca5f0SHans Verkuil 
346dacca5f0SHans Verkuil 	/* Output */
347dacca5f0SHans Verkuil 	unsigned			output;
348dacca5f0SHans Verkuil 	v4l2_std_id			std_out;
349dacca5f0SHans Verkuil 	struct v4l2_dv_timings		dv_timings_out;
350dacca5f0SHans Verkuil 	u32				colorspace_out;
351dacca5f0SHans Verkuil 	u32				ycbcr_enc_out;
352dacca5f0SHans Verkuil 	u32				hsv_enc_out;
353dacca5f0SHans Verkuil 	u32				quantization_out;
354dacca5f0SHans Verkuil 	u32				xfer_func_out;
355dacca5f0SHans Verkuil 	u32				service_set_out;
356dacca5f0SHans Verkuil 	unsigned			bytesperline_out[TPG_MAX_PLANES];
357dacca5f0SHans Verkuil 	unsigned			tv_field_out;
358dacca5f0SHans Verkuil 	unsigned			tv_audio_output;
359dacca5f0SHans Verkuil 	bool				vbi_out_have_wss;
360dacca5f0SHans Verkuil 	u8				vbi_out_wss[2];
361dacca5f0SHans Verkuil 	bool				vbi_out_have_cc[2];
362dacca5f0SHans Verkuil 	u8				vbi_out_cc[2][2];
363dacca5f0SHans Verkuil 	bool				dvi_d_out;
364dacca5f0SHans Verkuil 	u8				*scaled_line;
365dacca5f0SHans Verkuil 	u8				*blended_line;
366dacca5f0SHans Verkuil 	unsigned			cur_scaled_line;
367dacca5f0SHans Verkuil 	bool				display_present[MAX_OUTPUTS];
368dacca5f0SHans Verkuil 
369dacca5f0SHans Verkuil 	/* Output Overlay */
370dacca5f0SHans Verkuil 	void				*fb_vbase_out;
371dacca5f0SHans Verkuil 	bool				overlay_out_enabled;
372dacca5f0SHans Verkuil 	int				overlay_out_top, overlay_out_left;
373dacca5f0SHans Verkuil 	unsigned			fbuf_out_flags;
374dacca5f0SHans Verkuil 	u32				chromakey_out;
375dacca5f0SHans Verkuil 	u8				global_alpha_out;
376dacca5f0SHans Verkuil 
377dacca5f0SHans Verkuil 	/* video capture */
378dacca5f0SHans Verkuil 	struct tpg_data			tpg;
379dacca5f0SHans Verkuil 	unsigned			ms_vid_cap;
380dacca5f0SHans Verkuil 	bool				must_blank[VIDEO_MAX_FRAME];
381dacca5f0SHans Verkuil 
382dacca5f0SHans Verkuil 	const struct vivid_fmt		*fmt_cap;
383dacca5f0SHans Verkuil 	struct v4l2_fract		timeperframe_vid_cap;
384dacca5f0SHans Verkuil 	enum v4l2_field			field_cap;
385dacca5f0SHans Verkuil 	struct v4l2_rect		src_rect;
386dacca5f0SHans Verkuil 	struct v4l2_rect		fmt_cap_rect;
387dacca5f0SHans Verkuil 	struct v4l2_rect		crop_cap;
388dacca5f0SHans Verkuil 	struct v4l2_rect		compose_cap;
389dacca5f0SHans Verkuil 	struct v4l2_rect		crop_bounds_cap;
390dacca5f0SHans Verkuil 	struct vb2_queue		vb_vid_cap_q;
391dacca5f0SHans Verkuil 	struct list_head		vid_cap_active;
392dacca5f0SHans Verkuil 	struct vb2_queue		vb_vbi_cap_q;
393dacca5f0SHans Verkuil 	struct list_head		vbi_cap_active;
394dacca5f0SHans Verkuil 	struct vb2_queue		vb_meta_cap_q;
395dacca5f0SHans Verkuil 	struct list_head		meta_cap_active;
396dacca5f0SHans Verkuil 	struct vb2_queue		vb_touch_cap_q;
397dacca5f0SHans Verkuil 	struct list_head		touch_cap_active;
398dacca5f0SHans Verkuil 
399dacca5f0SHans Verkuil 	/* thread for generating video capture stream */
400dacca5f0SHans Verkuil 	struct task_struct		*kthread_vid_cap;
401dacca5f0SHans Verkuil 	unsigned long			jiffies_vid_cap;
402dacca5f0SHans Verkuil 	u64				cap_stream_start;
403dacca5f0SHans Verkuil 	u64				cap_frame_period;
404dacca5f0SHans Verkuil 	u64				cap_frame_eof_offset;
405dacca5f0SHans Verkuil 	u32				cap_seq_offset;
406dacca5f0SHans Verkuil 	u32				cap_seq_count;
407dacca5f0SHans Verkuil 	bool				cap_seq_resync;
408dacca5f0SHans Verkuil 	u32				vid_cap_seq_start;
409dacca5f0SHans Verkuil 	u32				vid_cap_seq_count;
410dacca5f0SHans Verkuil 	bool				vid_cap_streaming;
411dacca5f0SHans Verkuil 	u32				vbi_cap_seq_start;
412dacca5f0SHans Verkuil 	u32				vbi_cap_seq_count;
413dacca5f0SHans Verkuil 	bool				vbi_cap_streaming;
414dacca5f0SHans Verkuil 	u32				meta_cap_seq_start;
415dacca5f0SHans Verkuil 	u32				meta_cap_seq_count;
416dacca5f0SHans Verkuil 	bool				meta_cap_streaming;
417dacca5f0SHans Verkuil 
418dacca5f0SHans Verkuil 	/* Touch capture */
419dacca5f0SHans Verkuil 	struct task_struct		*kthread_touch_cap;
420dacca5f0SHans Verkuil 	unsigned long			jiffies_touch_cap;
421dacca5f0SHans Verkuil 	u64				touch_cap_stream_start;
422dacca5f0SHans Verkuil 	u32				touch_cap_seq_offset;
423dacca5f0SHans Verkuil 	bool				touch_cap_seq_resync;
424dacca5f0SHans Verkuil 	u32				touch_cap_seq_start;
425dacca5f0SHans Verkuil 	u32				touch_cap_seq_count;
42657c1d5deSDeborah Brouwer 	u32				touch_cap_with_seq_wrap_count;
427dacca5f0SHans Verkuil 	bool				touch_cap_streaming;
428dacca5f0SHans Verkuil 	struct v4l2_fract		timeperframe_tch_cap;
429dacca5f0SHans Verkuil 	struct v4l2_pix_format		tch_format;
430dacca5f0SHans Verkuil 	int				tch_pat_random;
431dacca5f0SHans Verkuil 
432dacca5f0SHans Verkuil 	/* video output */
433dacca5f0SHans Verkuil 	const struct vivid_fmt		*fmt_out;
434dacca5f0SHans Verkuil 	struct v4l2_fract		timeperframe_vid_out;
435dacca5f0SHans Verkuil 	enum v4l2_field			field_out;
436dacca5f0SHans Verkuil 	struct v4l2_rect		sink_rect;
437dacca5f0SHans Verkuil 	struct v4l2_rect		fmt_out_rect;
438dacca5f0SHans Verkuil 	struct v4l2_rect		crop_out;
439dacca5f0SHans Verkuil 	struct v4l2_rect		compose_out;
440dacca5f0SHans Verkuil 	struct v4l2_rect		compose_bounds_out;
441dacca5f0SHans Verkuil 	struct vb2_queue		vb_vid_out_q;
442dacca5f0SHans Verkuil 	struct list_head		vid_out_active;
443dacca5f0SHans Verkuil 	struct vb2_queue		vb_vbi_out_q;
444dacca5f0SHans Verkuil 	struct list_head		vbi_out_active;
445dacca5f0SHans Verkuil 	struct vb2_queue		vb_meta_out_q;
446dacca5f0SHans Verkuil 	struct list_head		meta_out_active;
447dacca5f0SHans Verkuil 
448dacca5f0SHans Verkuil 	/* video loop precalculated rectangles */
449dacca5f0SHans Verkuil 
450dacca5f0SHans Verkuil 	/*
451dacca5f0SHans Verkuil 	 * Intersection between what the output side composes and the capture side
452dacca5f0SHans Verkuil 	 * crops. I.e., what actually needs to be copied from the output buffer to
453dacca5f0SHans Verkuil 	 * the capture buffer.
454dacca5f0SHans Verkuil 	 */
455dacca5f0SHans Verkuil 	struct v4l2_rect		loop_vid_copy;
456dacca5f0SHans Verkuil 	/* The part of the output buffer that (after scaling) corresponds to loop_vid_copy. */
457dacca5f0SHans Verkuil 	struct v4l2_rect		loop_vid_out;
458dacca5f0SHans Verkuil 	/* The part of the capture buffer that (after scaling) corresponds to loop_vid_copy. */
459dacca5f0SHans Verkuil 	struct v4l2_rect		loop_vid_cap;
460dacca5f0SHans Verkuil 	/*
461dacca5f0SHans Verkuil 	 * The intersection of the framebuffer, the overlay output window and
462dacca5f0SHans Verkuil 	 * loop_vid_copy. I.e., the part of the framebuffer that actually should be
463dacca5f0SHans Verkuil 	 * blended with the compose_out rectangle. This uses the framebuffer origin.
464dacca5f0SHans Verkuil 	 */
465dacca5f0SHans Verkuil 	struct v4l2_rect		loop_fb_copy;
466dacca5f0SHans Verkuil 	/* The same as loop_fb_copy but with compose_out origin. */
467dacca5f0SHans Verkuil 	struct v4l2_rect		loop_vid_overlay;
468dacca5f0SHans Verkuil 	/*
469dacca5f0SHans Verkuil 	 * The part of the capture buffer that (after scaling) corresponds
470dacca5f0SHans Verkuil 	 * to loop_vid_overlay.
471dacca5f0SHans Verkuil 	 */
472dacca5f0SHans Verkuil 	struct v4l2_rect		loop_vid_overlay_cap;
473dacca5f0SHans Verkuil 
474dacca5f0SHans Verkuil 	/* thread for generating video output stream */
475dacca5f0SHans Verkuil 	struct task_struct		*kthread_vid_out;
476dacca5f0SHans Verkuil 	unsigned long			jiffies_vid_out;
477dacca5f0SHans Verkuil 	u32				out_seq_offset;
478dacca5f0SHans Verkuil 	u32				out_seq_count;
479dacca5f0SHans Verkuil 	bool				out_seq_resync;
480dacca5f0SHans Verkuil 	u32				vid_out_seq_start;
481dacca5f0SHans Verkuil 	u32				vid_out_seq_count;
482dacca5f0SHans Verkuil 	bool				vid_out_streaming;
483dacca5f0SHans Verkuil 	u32				vbi_out_seq_start;
484dacca5f0SHans Verkuil 	u32				vbi_out_seq_count;
485dacca5f0SHans Verkuil 	bool				vbi_out_streaming;
486dacca5f0SHans Verkuil 	bool				stream_sliced_vbi_out;
487dacca5f0SHans Verkuil 	u32				meta_out_seq_start;
488dacca5f0SHans Verkuil 	u32				meta_out_seq_count;
489dacca5f0SHans Verkuil 	bool				meta_out_streaming;
490dacca5f0SHans Verkuil 
491dacca5f0SHans Verkuil 	/* SDR capture */
492dacca5f0SHans Verkuil 	struct vb2_queue		vb_sdr_cap_q;
493dacca5f0SHans Verkuil 	struct list_head		sdr_cap_active;
494dacca5f0SHans Verkuil 	u32				sdr_pixelformat; /* v4l2 format id */
495dacca5f0SHans Verkuil 	unsigned			sdr_buffersize;
496dacca5f0SHans Verkuil 	unsigned			sdr_adc_freq;
497dacca5f0SHans Verkuil 	unsigned			sdr_fm_freq;
498dacca5f0SHans Verkuil 	unsigned			sdr_fm_deviation;
499dacca5f0SHans Verkuil 	int				sdr_fixp_src_phase;
500dacca5f0SHans Verkuil 	int				sdr_fixp_mod_phase;
501dacca5f0SHans Verkuil 
502dacca5f0SHans Verkuil 	bool				tstamp_src_is_soe;
503dacca5f0SHans Verkuil 	bool				has_crop_cap;
504dacca5f0SHans Verkuil 	bool				has_compose_cap;
505dacca5f0SHans Verkuil 	bool				has_scaler_cap;
506dacca5f0SHans Verkuil 	bool				has_crop_out;
507dacca5f0SHans Verkuil 	bool				has_compose_out;
508dacca5f0SHans Verkuil 	bool				has_scaler_out;
509dacca5f0SHans Verkuil 
510dacca5f0SHans Verkuil 	/* thread for generating SDR stream */
511dacca5f0SHans Verkuil 	struct task_struct		*kthread_sdr_cap;
512dacca5f0SHans Verkuil 	unsigned long			jiffies_sdr_cap;
513dacca5f0SHans Verkuil 	u32				sdr_cap_seq_offset;
51457c1d5deSDeborah Brouwer 	u32				sdr_cap_seq_start;
515dacca5f0SHans Verkuil 	u32				sdr_cap_seq_count;
51657c1d5deSDeborah Brouwer 	u32				sdr_cap_with_seq_wrap_count;
517dacca5f0SHans Verkuil 	bool				sdr_cap_seq_resync;
518dacca5f0SHans Verkuil 
519dacca5f0SHans Verkuil 	/* RDS generator */
520dacca5f0SHans Verkuil 	struct vivid_rds_gen		rds_gen;
521dacca5f0SHans Verkuil 
522dacca5f0SHans Verkuil 	/* Radio receiver */
523dacca5f0SHans Verkuil 	unsigned			radio_rx_freq;
524dacca5f0SHans Verkuil 	unsigned			radio_rx_audmode;
525dacca5f0SHans Verkuil 	int				radio_rx_sig_qual;
526dacca5f0SHans Verkuil 	unsigned			radio_rx_hw_seek_mode;
527dacca5f0SHans Verkuil 	bool				radio_rx_hw_seek_prog_lim;
528dacca5f0SHans Verkuil 	bool				radio_rx_rds_controls;
529dacca5f0SHans Verkuil 	bool				radio_rx_rds_enabled;
530dacca5f0SHans Verkuil 	unsigned			radio_rx_rds_use_alternates;
531dacca5f0SHans Verkuil 	unsigned			radio_rx_rds_last_block;
532dacca5f0SHans Verkuil 	struct v4l2_fh			*radio_rx_rds_owner;
533dacca5f0SHans Verkuil 
534dacca5f0SHans Verkuil 	/* Radio transmitter */
535dacca5f0SHans Verkuil 	unsigned			radio_tx_freq;
536dacca5f0SHans Verkuil 	unsigned			radio_tx_subchans;
537dacca5f0SHans Verkuil 	bool				radio_tx_rds_controls;
538dacca5f0SHans Verkuil 	unsigned			radio_tx_rds_last_block;
539dacca5f0SHans Verkuil 	struct v4l2_fh			*radio_tx_rds_owner;
540dacca5f0SHans Verkuil 
541dacca5f0SHans Verkuil 	/* Shared between radio receiver and transmitter */
542dacca5f0SHans Verkuil 	bool				radio_rds_loop;
543dacca5f0SHans Verkuil 	ktime_t				radio_rds_init_time;
544dacca5f0SHans Verkuil 
545dacca5f0SHans Verkuil 	/* CEC */
546dacca5f0SHans Verkuil 	struct cec_adapter		*cec_rx_adap;
547dacca5f0SHans Verkuil 	struct cec_adapter		*cec_tx_adap[MAX_OUTPUTS];
548dacca5f0SHans Verkuil 	u8				cec_output2bus_map[MAX_OUTPUTS];
549c6c709eeSDeborah Brouwer 	struct task_struct		*kthread_cec;
550c6c709eeSDeborah Brouwer 	wait_queue_head_t		kthread_waitq_cec;
551c6c709eeSDeborah Brouwer 	struct vivid_cec_xfer	xfers[MAX_OUTPUTS];
552c6c709eeSDeborah Brouwer 	spinlock_t			cec_xfers_slock; /* read and write cec messages */
553c6c709eeSDeborah Brouwer 	u32				cec_sft; /* bus signal free time, in bit periods */
554c6c709eeSDeborah Brouwer 	u8				last_initiator;
555dacca5f0SHans Verkuil 
556dacca5f0SHans Verkuil 	/* CEC OSD String */
557dacca5f0SHans Verkuil 	char				osd[14];
558dacca5f0SHans Verkuil 	unsigned long			osd_jiffies;
559dacca5f0SHans Verkuil 
560dacca5f0SHans Verkuil 	bool				meta_pts;
561dacca5f0SHans Verkuil 	bool				meta_scr;
562dacca5f0SHans Verkuil };
563dacca5f0SHans Verkuil 
vivid_is_webcam(const struct vivid_dev * dev)564dacca5f0SHans Verkuil static inline bool vivid_is_webcam(const struct vivid_dev *dev)
565dacca5f0SHans Verkuil {
566dacca5f0SHans Verkuil 	return dev->input_type[dev->input] == WEBCAM;
567dacca5f0SHans Verkuil }
568dacca5f0SHans Verkuil 
vivid_is_tv_cap(const struct vivid_dev * dev)569dacca5f0SHans Verkuil static inline bool vivid_is_tv_cap(const struct vivid_dev *dev)
570dacca5f0SHans Verkuil {
571dacca5f0SHans Verkuil 	return dev->input_type[dev->input] == TV;
572dacca5f0SHans Verkuil }
573dacca5f0SHans Verkuil 
vivid_is_svid_cap(const struct vivid_dev * dev)574dacca5f0SHans Verkuil static inline bool vivid_is_svid_cap(const struct vivid_dev *dev)
575dacca5f0SHans Verkuil {
576dacca5f0SHans Verkuil 	return dev->input_type[dev->input] == SVID;
577dacca5f0SHans Verkuil }
578dacca5f0SHans Verkuil 
vivid_is_hdmi_cap(const struct vivid_dev * dev)579dacca5f0SHans Verkuil static inline bool vivid_is_hdmi_cap(const struct vivid_dev *dev)
580dacca5f0SHans Verkuil {
581dacca5f0SHans Verkuil 	return dev->input_type[dev->input] == HDMI;
582dacca5f0SHans Verkuil }
583dacca5f0SHans Verkuil 
vivid_is_sdtv_cap(const struct vivid_dev * dev)584dacca5f0SHans Verkuil static inline bool vivid_is_sdtv_cap(const struct vivid_dev *dev)
585dacca5f0SHans Verkuil {
586dacca5f0SHans Verkuil 	return vivid_is_tv_cap(dev) || vivid_is_svid_cap(dev);
587dacca5f0SHans Verkuil }
588dacca5f0SHans Verkuil 
vivid_is_svid_out(const struct vivid_dev * dev)589dacca5f0SHans Verkuil static inline bool vivid_is_svid_out(const struct vivid_dev *dev)
590dacca5f0SHans Verkuil {
591dacca5f0SHans Verkuil 	return dev->output_type[dev->output] == SVID;
592dacca5f0SHans Verkuil }
593dacca5f0SHans Verkuil 
vivid_is_hdmi_out(const struct vivid_dev * dev)594dacca5f0SHans Verkuil static inline bool vivid_is_hdmi_out(const struct vivid_dev *dev)
595dacca5f0SHans Verkuil {
596dacca5f0SHans Verkuil 	return dev->output_type[dev->output] == HDMI;
597dacca5f0SHans Verkuil }
598dacca5f0SHans Verkuil 
599dacca5f0SHans Verkuil #endif
600