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