brintos

brintos / linux-shallow public Read only

0
0
Text · 73.8 KiB · 4f330f4 Raw
2341 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2 3/*4 * vivid-core.c - A Virtual Video Test Driver, core initialization5 *6 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.7 */8 9#include <linux/module.h>10#include <linux/errno.h>11#include <linux/kernel.h>12#include <linux/init.h>13#include <linux/sched.h>14#include <linux/slab.h>15#include <linux/vmalloc.h>16#include <linux/font.h>17#include <linux/mutex.h>18#include <linux/platform_device.h>19#include <linux/videodev2.h>20#include <linux/v4l2-dv-timings.h>21#include <media/videobuf2-vmalloc.h>22#include <media/videobuf2-dma-contig.h>23#include <media/v4l2-dv-timings.h>24#include <media/v4l2-ioctl.h>25#include <media/v4l2-fh.h>26#include <media/v4l2-event.h>27 28#include "vivid-core.h"29#include "vivid-vid-common.h"30#include "vivid-vid-cap.h"31#include "vivid-vid-out.h"32#include "vivid-radio-common.h"33#include "vivid-radio-rx.h"34#include "vivid-radio-tx.h"35#include "vivid-sdr-cap.h"36#include "vivid-vbi-cap.h"37#include "vivid-vbi-out.h"38#include "vivid-osd.h"39#include "vivid-cec.h"40#include "vivid-ctrls.h"41#include "vivid-meta-cap.h"42#include "vivid-meta-out.h"43#include "vivid-touch-cap.h"44 45#define VIVID_MODULE_NAME "vivid"46#define MAX_STRING_LENGTH 2347 48MODULE_DESCRIPTION("Virtual Video Test Driver");49MODULE_AUTHOR("Hans Verkuil");50MODULE_LICENSE("GPL");51 52unsigned int n_devs = 1;53module_param(n_devs, uint, 0444);54MODULE_PARM_DESC(n_devs, " number of driver instances to create");55 56static int vid_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };57module_param_array(vid_cap_nr, int, NULL, 0444);58MODULE_PARM_DESC(vid_cap_nr, " videoX start number, -1 is autodetect");59 60static int vid_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };61module_param_array(vid_out_nr, int, NULL, 0444);62MODULE_PARM_DESC(vid_out_nr, " videoX start number, -1 is autodetect");63 64static int vbi_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };65module_param_array(vbi_cap_nr, int, NULL, 0444);66MODULE_PARM_DESC(vbi_cap_nr, " vbiX start number, -1 is autodetect");67 68static int vbi_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };69module_param_array(vbi_out_nr, int, NULL, 0444);70MODULE_PARM_DESC(vbi_out_nr, " vbiX start number, -1 is autodetect");71 72static int sdr_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };73module_param_array(sdr_cap_nr, int, NULL, 0444);74MODULE_PARM_DESC(sdr_cap_nr, " swradioX start number, -1 is autodetect");75 76static int radio_rx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };77module_param_array(radio_rx_nr, int, NULL, 0444);78MODULE_PARM_DESC(radio_rx_nr, " radioX start number, -1 is autodetect");79 80static int radio_tx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };81module_param_array(radio_tx_nr, int, NULL, 0444);82MODULE_PARM_DESC(radio_tx_nr, " radioX start number, -1 is autodetect");83 84static int meta_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };85module_param_array(meta_cap_nr, int, NULL, 0444);86MODULE_PARM_DESC(meta_cap_nr, " videoX start number, -1 is autodetect");87 88static int meta_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };89module_param_array(meta_out_nr, int, NULL, 0444);90MODULE_PARM_DESC(meta_out_nr, " videoX start number, -1 is autodetect");91 92static int touch_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };93module_param_array(touch_cap_nr, int, NULL, 0444);94MODULE_PARM_DESC(touch_cap_nr, " v4l-touchX start number, -1 is autodetect");95 96static int ccs_cap_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };97module_param_array(ccs_cap_mode, int, NULL, 0444);98MODULE_PARM_DESC(ccs_cap_mode, " capture crop/compose/scale mode:\n"99			   "\t\t    bit 0=crop, 1=compose, 2=scale,\n"100			   "\t\t    -1=user-controlled (default)");101 102static int ccs_out_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };103module_param_array(ccs_out_mode, int, NULL, 0444);104MODULE_PARM_DESC(ccs_out_mode, " output crop/compose/scale mode:\n"105			   "\t\t    bit 0=crop, 1=compose, 2=scale,\n"106			   "\t\t    -1=user-controlled (default)");107 108static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 };109module_param_array(multiplanar, uint, NULL, 0444);110MODULE_PARM_DESC(multiplanar, " 1 (default) creates a single planar device, 2 creates a multiplanar device.");111 112/*113 * Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr +114 * vbi-out + vid-out + meta-cap115 */116static unsigned int node_types[VIVID_MAX_DEVS] = {117	[0 ... (VIVID_MAX_DEVS - 1)] = 0xe1d3d118};119module_param_array(node_types, uint, NULL, 0444);120MODULE_PARM_DESC(node_types, " node types, default is 0xe1d3d. Bitmask with the following meaning:\n"121			     "\t\t    bit 0: Video Capture node\n"122			     "\t\t    bit 2-3: VBI Capture node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"123			     "\t\t    bit 4: Radio Receiver node\n"124			     "\t\t    bit 5: Software Defined Radio Receiver node\n"125			     "\t\t    bit 8: Video Output node\n"126			     "\t\t    bit 10-11: VBI Output node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"127			     "\t\t    bit 12: Radio Transmitter node\n"128			     "\t\t    bit 16: Framebuffer for testing output overlays\n"129			     "\t\t    bit 17: Metadata Capture node\n"130			     "\t\t    bit 18: Metadata Output node\n"131			     "\t\t    bit 19: Touch Capture node\n");132 133/* Default: 4 inputs */134static unsigned num_inputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 4 };135module_param_array(num_inputs, uint, NULL, 0444);136MODULE_PARM_DESC(num_inputs, " number of inputs, default is 4");137 138/* Default: input 0 = WEBCAM, 1 = TV, 2 = SVID, 3 = HDMI */139static unsigned input_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0xe4 };140module_param_array(input_types, uint, NULL, 0444);141MODULE_PARM_DESC(input_types, " input types, default is 0xe4. Two bits per input,\n"142			      "\t\t    bits 0-1 == input 0, bits 31-30 == input 15.\n"143			      "\t\t    Type 0 == webcam, 1 == TV, 2 == S-Video, 3 == HDMI");144 145/* Default: 2 outputs */146static unsigned num_outputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };147module_param_array(num_outputs, uint, NULL, 0444);148MODULE_PARM_DESC(num_outputs, " number of outputs, default is 2");149 150/* Default: output 0 = SVID, 1 = HDMI */151static unsigned output_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };152module_param_array(output_types, uint, NULL, 0444);153MODULE_PARM_DESC(output_types, " output types, default is 0x02. One bit per output,\n"154			      "\t\t    bit 0 == output 0, bit 15 == output 15.\n"155			      "\t\t    Type 0 == S-Video, 1 == HDMI");156 157unsigned vivid_debug;158module_param(vivid_debug, uint, 0644);159MODULE_PARM_DESC(vivid_debug, " activates debug info");160 161static bool no_error_inj;162module_param(no_error_inj, bool, 0444);163MODULE_PARM_DESC(no_error_inj, " if set disable the error injecting controls");164 165static unsigned int allocators[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0 };166module_param_array(allocators, uint, NULL, 0444);167MODULE_PARM_DESC(allocators, " memory allocator selection, default is 0.\n"168			     "\t\t    0 == vmalloc\n"169			     "\t\t    1 == dma-contig");170 171static unsigned int cache_hints[VIVID_MAX_DEVS] = {172	[0 ... (VIVID_MAX_DEVS - 1)] = 0173};174module_param_array(cache_hints, uint, NULL, 0444);175MODULE_PARM_DESC(cache_hints, " user-space cache hints, default is 0.\n"176			     "\t\t    0 == forbid\n"177			     "\t\t    1 == allow");178 179static unsigned int supports_requests[VIVID_MAX_DEVS] = {180	[0 ... (VIVID_MAX_DEVS - 1)] = 1181};182module_param_array(supports_requests, uint, NULL, 0444);183MODULE_PARM_DESC(supports_requests, " support for requests, default is 1.\n"184			     "\t\t    0 == no support\n"185			     "\t\t    1 == supports requests\n"186			     "\t\t    2 == requires requests");187 188struct vivid_dev *vivid_devs[VIVID_MAX_DEVS];189 190DEFINE_SPINLOCK(hdmi_output_skip_mask_lock);191struct workqueue_struct *update_hdmi_ctrls_workqueue;192u64 hdmi_to_output_menu_skip_mask;193u64 hdmi_input_update_outputs_mask;194 195struct vivid_dev *vivid_ctrl_hdmi_to_output_instance[MAX_MENU_ITEMS];196unsigned int vivid_ctrl_hdmi_to_output_index[MAX_MENU_ITEMS];197 198char *vivid_ctrl_hdmi_to_output_strings[MAX_MENU_ITEMS + 1] = {199	"Test Pattern Generator",200	"None"201};202 203DEFINE_SPINLOCK(svid_output_skip_mask_lock);204struct workqueue_struct *update_svid_ctrls_workqueue;205u64 svid_to_output_menu_skip_mask;206 207struct vivid_dev *vivid_ctrl_svid_to_output_instance[MAX_MENU_ITEMS];208unsigned int vivid_ctrl_svid_to_output_index[MAX_MENU_ITEMS];209 210char *vivid_ctrl_svid_to_output_strings[MAX_MENU_ITEMS + 1] = {211	"Test Pattern Generator",212	"None"213};214 215const struct v4l2_rect vivid_min_rect = {216	0, 0, MIN_WIDTH, MIN_HEIGHT217};218 219const struct v4l2_rect vivid_max_rect = {220	0, 0, MAX_WIDTH * MAX_ZOOM, MAX_HEIGHT * MAX_ZOOM221};222 223static const u8 vivid_hdmi_edid[256] = {224	0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,225	0x31, 0xd8, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00,226	0x22, 0x1a, 0x01, 0x03, 0x80, 0x60, 0x36, 0x78,227	0x0f, 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26,228	0x0f, 0x50, 0x54, 0x2f, 0xcf, 0x00, 0x31, 0x59,229	0x45, 0x59, 0x81, 0x80, 0x81, 0x40, 0x90, 0x40,230	0x95, 0x00, 0xa9, 0x40, 0xb3, 0x00, 0x08, 0xe8,231	0x00, 0x30, 0xf2, 0x70, 0x5a, 0x80, 0xb0, 0x58,232	0x8a, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00, 0x1e,233	0x00, 0x00, 0x00, 0xfd, 0x00, 0x18, 0x55, 0x18,234	0x87, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20,235	0x20, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x76,236	0x69, 0x76, 0x69, 0x64, 0x0a, 0x20, 0x20, 0x20,237	0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x10,238	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,239	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7b,240 241	0x02, 0x03, 0x3f, 0xf1, 0x51, 0x61, 0x60, 0x5f,242	0x5e, 0x5d, 0x10, 0x1f, 0x04, 0x13, 0x22, 0x21,243	0x20, 0x05, 0x14, 0x02, 0x11, 0x01, 0x23, 0x09,244	0x07, 0x07, 0x83, 0x01, 0x00, 0x00, 0x6d, 0x03,245	0x0c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x21, 0x00,246	0x60, 0x01, 0x02, 0x03, 0x67, 0xd8, 0x5d, 0xc4,247	0x01, 0x78, 0x00, 0x00, 0xe2, 0x00, 0xca, 0xe3,248	0x05, 0x00, 0x00, 0xe3, 0x06, 0x01, 0x00, 0x4d,249	0xd0, 0x00, 0xa0, 0xf0, 0x70, 0x3e, 0x80, 0x30,250	0x20, 0x35, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00,251	0x1e, 0x1a, 0x36, 0x80, 0xa0, 0x70, 0x38, 0x1f,252	0x40, 0x30, 0x20, 0x35, 0x00, 0xc0, 0x1c, 0x32,253	0x00, 0x00, 0x1a, 0x1a, 0x1d, 0x00, 0x80, 0x51,254	0xd0, 0x1c, 0x20, 0x40, 0x80, 0x35, 0x00, 0xc0,255	0x1c, 0x32, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,256	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92,257};258 259static int vidioc_querycap(struct file *file, void  *priv,260					struct v4l2_capability *cap)261{262	struct vivid_dev *dev = video_drvdata(file);263 264	strscpy(cap->driver, "vivid", sizeof(cap->driver));265	strscpy(cap->card, "vivid", sizeof(cap->card));266	snprintf(cap->bus_info, sizeof(cap->bus_info),267		 "platform:%s-%03d", VIVID_MODULE_NAME, dev->inst);268 269	cap->capabilities = dev->vid_cap_caps | dev->vid_out_caps |270		dev->vbi_cap_caps | dev->vbi_out_caps |271		dev->radio_rx_caps | dev->radio_tx_caps |272		dev->sdr_cap_caps | dev->meta_cap_caps |273		dev->meta_out_caps | dev->touch_cap_caps |274		V4L2_CAP_DEVICE_CAPS;275	return 0;276}277 278static int vidioc_s_hw_freq_seek(struct file *file, void *fh, const struct v4l2_hw_freq_seek *a)279{280	struct video_device *vdev = video_devdata(file);281 282	if (vdev->vfl_type == VFL_TYPE_RADIO)283		return vivid_radio_rx_s_hw_freq_seek(file, fh, a);284	return -ENOTTY;285}286 287static int vidioc_enum_freq_bands(struct file *file, void *fh, struct v4l2_frequency_band *band)288{289	struct video_device *vdev = video_devdata(file);290 291	if (vdev->vfl_type == VFL_TYPE_RADIO)292		return vivid_radio_rx_enum_freq_bands(file, fh, band);293	if (vdev->vfl_type == VFL_TYPE_SDR)294		return vivid_sdr_enum_freq_bands(file, fh, band);295	return -ENOTTY;296}297 298static int vidioc_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)299{300	struct video_device *vdev = video_devdata(file);301 302	if (vdev->vfl_type == VFL_TYPE_RADIO)303		return vivid_radio_rx_g_tuner(file, fh, vt);304	if (vdev->vfl_type == VFL_TYPE_SDR)305		return vivid_sdr_g_tuner(file, fh, vt);306	return vivid_video_g_tuner(file, fh, vt);307}308 309static int vidioc_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)310{311	struct video_device *vdev = video_devdata(file);312 313	if (vdev->vfl_type == VFL_TYPE_RADIO)314		return vivid_radio_rx_s_tuner(file, fh, vt);315	if (vdev->vfl_type == VFL_TYPE_SDR)316		return vivid_sdr_s_tuner(file, fh, vt);317	return vivid_video_s_tuner(file, fh, vt);318}319 320static int vidioc_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)321{322	struct vivid_dev *dev = video_drvdata(file);323	struct video_device *vdev = video_devdata(file);324 325	if (vdev->vfl_type == VFL_TYPE_RADIO)326		return vivid_radio_g_frequency(file,327			vdev->vfl_dir == VFL_DIR_RX ?328			&dev->radio_rx_freq : &dev->radio_tx_freq, vf);329	if (vdev->vfl_type == VFL_TYPE_SDR)330		return vivid_sdr_g_frequency(file, fh, vf);331	return vivid_video_g_frequency(file, fh, vf);332}333 334static int vidioc_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)335{336	struct vivid_dev *dev = video_drvdata(file);337	struct video_device *vdev = video_devdata(file);338 339	if (vdev->vfl_type == VFL_TYPE_RADIO)340		return vivid_radio_s_frequency(file,341			vdev->vfl_dir == VFL_DIR_RX ?342			&dev->radio_rx_freq : &dev->radio_tx_freq, vf);343	if (vdev->vfl_type == VFL_TYPE_SDR)344		return vivid_sdr_s_frequency(file, fh, vf);345	return vivid_video_s_frequency(file, fh, vf);346}347 348static int vidioc_overlay(struct file *file, void *fh, unsigned i)349{350	struct video_device *vdev = video_devdata(file);351 352	if (vdev->vfl_dir == VFL_DIR_RX)353		return -ENOTTY;354	return vivid_vid_out_overlay(file, fh, i);355}356 357static int vidioc_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *a)358{359	struct video_device *vdev = video_devdata(file);360 361	if (vdev->vfl_dir == VFL_DIR_RX)362		return -ENOTTY;363	return vivid_vid_out_g_fbuf(file, fh, a);364}365 366static int vidioc_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *a)367{368	struct video_device *vdev = video_devdata(file);369 370	if (vdev->vfl_dir == VFL_DIR_RX)371		return -ENOTTY;372	return vivid_vid_out_s_fbuf(file, fh, a);373}374 375static int vidioc_s_std(struct file *file, void *fh, v4l2_std_id id)376{377	struct video_device *vdev = video_devdata(file);378 379	if (vdev->vfl_dir == VFL_DIR_RX)380		return vivid_vid_cap_s_std(file, fh, id);381	return vivid_vid_out_s_std(file, fh, id);382}383 384static int vidioc_s_dv_timings(struct file *file, void *fh, struct v4l2_dv_timings *timings)385{386	struct video_device *vdev = video_devdata(file);387 388	if (vdev->vfl_dir == VFL_DIR_RX)389		return vivid_vid_cap_s_dv_timings(file, fh, timings);390	return vivid_vid_out_s_dv_timings(file, fh, timings);391}392 393static int vidioc_g_pixelaspect(struct file *file, void *fh,394				int type, struct v4l2_fract *f)395{396	struct video_device *vdev = video_devdata(file);397 398	if (vdev->vfl_dir == VFL_DIR_RX)399		return vivid_vid_cap_g_pixelaspect(file, fh, type, f);400	return vivid_vid_out_g_pixelaspect(file, fh, type, f);401}402 403static int vidioc_g_selection(struct file *file, void *fh,404			      struct v4l2_selection *sel)405{406	struct video_device *vdev = video_devdata(file);407 408	if (vdev->vfl_dir == VFL_DIR_RX)409		return vivid_vid_cap_g_selection(file, fh, sel);410	return vivid_vid_out_g_selection(file, fh, sel);411}412 413static int vidioc_s_selection(struct file *file, void *fh,414			      struct v4l2_selection *sel)415{416	struct video_device *vdev = video_devdata(file);417 418	if (vdev->vfl_dir == VFL_DIR_RX)419		return vivid_vid_cap_s_selection(file, fh, sel);420	return vivid_vid_out_s_selection(file, fh, sel);421}422 423static int vidioc_g_parm(struct file *file, void *fh,424			  struct v4l2_streamparm *parm)425{426	struct video_device *vdev = video_devdata(file);427 428	if (vdev->vfl_type == VFL_TYPE_TOUCH)429		return vivid_g_parm_tch(file, fh, parm);430	if (vdev->vfl_dir == VFL_DIR_RX)431		return vivid_vid_cap_g_parm(file, fh, parm);432	return vivid_vid_out_g_parm(file, fh, parm);433}434 435static int vidioc_s_parm(struct file *file, void *fh,436			  struct v4l2_streamparm *parm)437{438	struct video_device *vdev = video_devdata(file);439 440	if (vdev->vfl_dir == VFL_DIR_RX)441		return vivid_vid_cap_s_parm(file, fh, parm);442	return -ENOTTY;443}444 445static int vidioc_log_status(struct file *file, void *fh)446{447	struct vivid_dev *dev = video_drvdata(file);448	struct video_device *vdev = video_devdata(file);449 450	v4l2_ctrl_log_status(file, fh);451	if (vdev->vfl_dir == VFL_DIR_RX && vdev->vfl_type == VFL_TYPE_VIDEO)452		tpg_log_status(&dev->tpg);453	return 0;454}455 456static ssize_t vivid_radio_read(struct file *file, char __user *buf,457			 size_t size, loff_t *offset)458{459	struct video_device *vdev = video_devdata(file);460 461	if (vdev->vfl_dir == VFL_DIR_TX)462		return -EINVAL;463	return vivid_radio_rx_read(file, buf, size, offset);464}465 466static ssize_t vivid_radio_write(struct file *file, const char __user *buf,467			  size_t size, loff_t *offset)468{469	struct video_device *vdev = video_devdata(file);470 471	if (vdev->vfl_dir == VFL_DIR_RX)472		return -EINVAL;473	return vivid_radio_tx_write(file, buf, size, offset);474}475 476static __poll_t vivid_radio_poll(struct file *file, struct poll_table_struct *wait)477{478	struct video_device *vdev = video_devdata(file);479 480	if (vdev->vfl_dir == VFL_DIR_RX)481		return vivid_radio_rx_poll(file, wait);482	return vivid_radio_tx_poll(file, wait);483}484 485static int vivid_enum_input(struct file *file, void *priv,486			    struct v4l2_input *inp)487{488	struct video_device *vdev = video_devdata(file);489 490	if (vdev->vfl_type == VFL_TYPE_TOUCH)491		return vivid_enum_input_tch(file, priv, inp);492	return vidioc_enum_input(file, priv, inp);493}494 495static int vivid_g_input(struct file *file, void *priv, unsigned int *i)496{497	struct video_device *vdev = video_devdata(file);498 499	if (vdev->vfl_type == VFL_TYPE_TOUCH)500		return vivid_g_input_tch(file, priv, i);501	return vidioc_g_input(file, priv, i);502}503 504static int vivid_s_input(struct file *file, void *priv, unsigned int i)505{506	struct video_device *vdev = video_devdata(file);507 508	if (vdev->vfl_type == VFL_TYPE_TOUCH)509		return vivid_s_input_tch(file, priv, i);510	return vidioc_s_input(file, priv, i);511}512 513static int vivid_enum_fmt_cap(struct file *file, void  *priv,514			      struct v4l2_fmtdesc *f)515{516	struct video_device *vdev = video_devdata(file);517 518	if (vdev->vfl_type == VFL_TYPE_TOUCH)519		return vivid_enum_fmt_tch(file, priv, f);520	return vivid_enum_fmt_vid(file, priv, f);521}522 523static int vivid_g_fmt_cap(struct file *file, void *priv,524			   struct v4l2_format *f)525{526	struct video_device *vdev = video_devdata(file);527 528	if (vdev->vfl_type == VFL_TYPE_TOUCH)529		return vivid_g_fmt_tch(file, priv, f);530	return vidioc_g_fmt_vid_cap(file, priv, f);531}532 533static int vivid_try_fmt_cap(struct file *file, void *priv,534			     struct v4l2_format *f)535{536	struct video_device *vdev = video_devdata(file);537 538	if (vdev->vfl_type == VFL_TYPE_TOUCH)539		return vivid_g_fmt_tch(file, priv, f);540	return vidioc_try_fmt_vid_cap(file, priv, f);541}542 543static int vivid_s_fmt_cap(struct file *file, void *priv,544			   struct v4l2_format *f)545{546	struct video_device *vdev = video_devdata(file);547 548	if (vdev->vfl_type == VFL_TYPE_TOUCH)549		return vivid_g_fmt_tch(file, priv, f);550	return vidioc_s_fmt_vid_cap(file, priv, f);551}552 553static int vivid_g_fmt_cap_mplane(struct file *file, void *priv,554				  struct v4l2_format *f)555{556	struct video_device *vdev = video_devdata(file);557 558	if (vdev->vfl_type == VFL_TYPE_TOUCH)559		return vivid_g_fmt_tch_mplane(file, priv, f);560	return vidioc_g_fmt_vid_cap_mplane(file, priv, f);561}562 563static int vivid_try_fmt_cap_mplane(struct file *file, void *priv,564				    struct v4l2_format *f)565{566	struct video_device *vdev = video_devdata(file);567 568	if (vdev->vfl_type == VFL_TYPE_TOUCH)569		return vivid_g_fmt_tch_mplane(file, priv, f);570	return vidioc_try_fmt_vid_cap_mplane(file, priv, f);571}572 573static int vivid_s_fmt_cap_mplane(struct file *file, void *priv,574				  struct v4l2_format *f)575{576	struct video_device *vdev = video_devdata(file);577 578	if (vdev->vfl_type == VFL_TYPE_TOUCH)579		return vivid_g_fmt_tch_mplane(file, priv, f);580	return vidioc_s_fmt_vid_cap_mplane(file, priv, f);581}582 583static bool vivid_is_in_use(bool valid, struct video_device *vdev)584{585	unsigned long flags;586	bool res;587 588	if (!valid)589		return false;590	spin_lock_irqsave(&vdev->fh_lock, flags);591	res = !list_empty(&vdev->fh_list);592	spin_unlock_irqrestore(&vdev->fh_lock, flags);593	return res;594}595 596static bool vivid_is_last_user(struct vivid_dev *dev)597{598	unsigned int uses =599		vivid_is_in_use(dev->has_vid_cap, &dev->vid_cap_dev) +600		vivid_is_in_use(dev->has_vid_out, &dev->vid_out_dev) +601		vivid_is_in_use(dev->has_vbi_cap, &dev->vbi_cap_dev) +602		vivid_is_in_use(dev->has_vbi_out, &dev->vbi_out_dev) +603		vivid_is_in_use(dev->has_radio_rx, &dev->radio_rx_dev) +604		vivid_is_in_use(dev->has_radio_tx, &dev->radio_tx_dev) +605		vivid_is_in_use(dev->has_sdr_cap, &dev->sdr_cap_dev) +606		vivid_is_in_use(dev->has_meta_cap, &dev->meta_cap_dev) +607		vivid_is_in_use(dev->has_meta_out, &dev->meta_out_dev) +608		vivid_is_in_use(dev->has_touch_cap, &dev->touch_cap_dev);609 610	return uses == 1;611}612 613static void vivid_reconnect(struct vivid_dev *dev)614{615	if (dev->has_vid_cap)616		set_bit(V4L2_FL_REGISTERED, &dev->vid_cap_dev.flags);617	if (dev->has_vid_out)618		set_bit(V4L2_FL_REGISTERED, &dev->vid_out_dev.flags);619	if (dev->has_vbi_cap)620		set_bit(V4L2_FL_REGISTERED, &dev->vbi_cap_dev.flags);621	if (dev->has_vbi_out)622		set_bit(V4L2_FL_REGISTERED, &dev->vbi_out_dev.flags);623	if (dev->has_radio_rx)624		set_bit(V4L2_FL_REGISTERED, &dev->radio_rx_dev.flags);625	if (dev->has_radio_tx)626		set_bit(V4L2_FL_REGISTERED, &dev->radio_tx_dev.flags);627	if (dev->has_sdr_cap)628		set_bit(V4L2_FL_REGISTERED, &dev->sdr_cap_dev.flags);629	if (dev->has_meta_cap)630		set_bit(V4L2_FL_REGISTERED, &dev->meta_cap_dev.flags);631	if (dev->has_meta_out)632		set_bit(V4L2_FL_REGISTERED, &dev->meta_out_dev.flags);633	if (dev->has_touch_cap)634		set_bit(V4L2_FL_REGISTERED, &dev->touch_cap_dev.flags);635	dev->disconnect_error = false;636}637 638static int vivid_fop_release(struct file *file)639{640	struct vivid_dev *dev = video_drvdata(file);641	struct video_device *vdev = video_devdata(file);642 643	mutex_lock(&dev->mutex);644	if (!no_error_inj && v4l2_fh_is_singular_file(file) &&645	    dev->disconnect_error && !video_is_registered(vdev) &&646	    vivid_is_last_user(dev)) {647		/*648		 * I am the last user of this driver, and a disconnect649		 * was forced (since this video_device is unregistered),650		 * so re-register all video_device's again.651		 */652		v4l2_info(&dev->v4l2_dev, "reconnect\n");653		vivid_reconnect(dev);654	}655	if (file->private_data == dev->radio_rx_rds_owner) {656		dev->radio_rx_rds_last_block = 0;657		dev->radio_rx_rds_owner = NULL;658	}659	if (file->private_data == dev->radio_tx_rds_owner) {660		dev->radio_tx_rds_last_block = 0;661		dev->radio_tx_rds_owner = NULL;662	}663	mutex_unlock(&dev->mutex);664	if (vdev->queue)665		return vb2_fop_release(file);666	return v4l2_fh_release(file);667}668 669static const struct v4l2_file_operations vivid_fops = {670	.owner		= THIS_MODULE,671	.open           = v4l2_fh_open,672	.release        = vivid_fop_release,673	.read           = vb2_fop_read,674	.write          = vb2_fop_write,675	.poll		= vb2_fop_poll,676	.unlocked_ioctl = video_ioctl2,677	.mmap           = vb2_fop_mmap,678};679 680static const struct v4l2_file_operations vivid_radio_fops = {681	.owner		= THIS_MODULE,682	.open           = v4l2_fh_open,683	.release        = vivid_fop_release,684	.read           = vivid_radio_read,685	.write          = vivid_radio_write,686	.poll		= vivid_radio_poll,687	.unlocked_ioctl = video_ioctl2,688};689 690static int vidioc_reqbufs(struct file *file, void *priv,691			  struct v4l2_requestbuffers *p)692{693	struct video_device *vdev = video_devdata(file);694	int r;695 696	/*697	 * Sliced and raw VBI capture share the same queue so we must698	 * change the type.699	 */700	if (p->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE ||701	    p->type == V4L2_BUF_TYPE_VBI_CAPTURE) {702		r = vb2_queue_change_type(vdev->queue, p->type);703		if (r)704			return r;705	}706 707	return vb2_ioctl_reqbufs(file, priv, p);708}709 710static int vidioc_create_bufs(struct file *file, void *priv,711			      struct v4l2_create_buffers *p)712{713	struct video_device *vdev = video_devdata(file);714	int r;715 716	/*717	 * Sliced and raw VBI capture share the same queue so we must718	 * change the type.719	 */720	if (p->format.type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE ||721	    p->format.type == V4L2_BUF_TYPE_VBI_CAPTURE) {722		r = vb2_queue_change_type(vdev->queue, p->format.type);723		if (r)724			return r;725	}726 727	return vb2_ioctl_create_bufs(file, priv, p);728}729 730static const struct v4l2_ioctl_ops vivid_ioctl_ops = {731	.vidioc_querycap		= vidioc_querycap,732 733	.vidioc_enum_fmt_vid_cap	= vivid_enum_fmt_cap,734	.vidioc_g_fmt_vid_cap		= vivid_g_fmt_cap,735	.vidioc_try_fmt_vid_cap		= vivid_try_fmt_cap,736	.vidioc_s_fmt_vid_cap		= vivid_s_fmt_cap,737	.vidioc_g_fmt_vid_cap_mplane	= vivid_g_fmt_cap_mplane,738	.vidioc_try_fmt_vid_cap_mplane	= vivid_try_fmt_cap_mplane,739	.vidioc_s_fmt_vid_cap_mplane	= vivid_s_fmt_cap_mplane,740 741	.vidioc_enum_fmt_vid_out	= vivid_enum_fmt_vid,742	.vidioc_g_fmt_vid_out		= vidioc_g_fmt_vid_out,743	.vidioc_try_fmt_vid_out		= vidioc_try_fmt_vid_out,744	.vidioc_s_fmt_vid_out		= vidioc_s_fmt_vid_out,745	.vidioc_g_fmt_vid_out_mplane	= vidioc_g_fmt_vid_out_mplane,746	.vidioc_try_fmt_vid_out_mplane	= vidioc_try_fmt_vid_out_mplane,747	.vidioc_s_fmt_vid_out_mplane	= vidioc_s_fmt_vid_out_mplane,748 749	.vidioc_g_selection		= vidioc_g_selection,750	.vidioc_s_selection		= vidioc_s_selection,751	.vidioc_g_pixelaspect		= vidioc_g_pixelaspect,752 753	.vidioc_g_fmt_vbi_cap		= vidioc_g_fmt_vbi_cap,754	.vidioc_try_fmt_vbi_cap		= vidioc_g_fmt_vbi_cap,755	.vidioc_s_fmt_vbi_cap		= vidioc_s_fmt_vbi_cap,756 757	.vidioc_g_fmt_sliced_vbi_cap    = vidioc_g_fmt_sliced_vbi_cap,758	.vidioc_try_fmt_sliced_vbi_cap  = vidioc_try_fmt_sliced_vbi_cap,759	.vidioc_s_fmt_sliced_vbi_cap    = vidioc_s_fmt_sliced_vbi_cap,760	.vidioc_g_sliced_vbi_cap	= vidioc_g_sliced_vbi_cap,761 762	.vidioc_g_fmt_vbi_out		= vidioc_g_fmt_vbi_out,763	.vidioc_try_fmt_vbi_out		= vidioc_g_fmt_vbi_out,764	.vidioc_s_fmt_vbi_out		= vidioc_s_fmt_vbi_out,765 766	.vidioc_g_fmt_sliced_vbi_out    = vidioc_g_fmt_sliced_vbi_out,767	.vidioc_try_fmt_sliced_vbi_out  = vidioc_try_fmt_sliced_vbi_out,768	.vidioc_s_fmt_sliced_vbi_out    = vidioc_s_fmt_sliced_vbi_out,769 770	.vidioc_enum_fmt_sdr_cap	= vidioc_enum_fmt_sdr_cap,771	.vidioc_g_fmt_sdr_cap		= vidioc_g_fmt_sdr_cap,772	.vidioc_try_fmt_sdr_cap		= vidioc_try_fmt_sdr_cap,773	.vidioc_s_fmt_sdr_cap		= vidioc_s_fmt_sdr_cap,774 775	.vidioc_overlay			= vidioc_overlay,776	.vidioc_enum_framesizes		= vidioc_enum_framesizes,777	.vidioc_enum_frameintervals	= vidioc_enum_frameintervals,778	.vidioc_g_parm			= vidioc_g_parm,779	.vidioc_s_parm			= vidioc_s_parm,780 781	.vidioc_g_fmt_vid_out_overlay	= vidioc_g_fmt_vid_out_overlay,782	.vidioc_try_fmt_vid_out_overlay	= vidioc_try_fmt_vid_out_overlay,783	.vidioc_s_fmt_vid_out_overlay	= vidioc_s_fmt_vid_out_overlay,784	.vidioc_g_fbuf			= vidioc_g_fbuf,785	.vidioc_s_fbuf			= vidioc_s_fbuf,786 787	.vidioc_reqbufs			= vidioc_reqbufs,788	.vidioc_create_bufs		= vidioc_create_bufs,789	.vidioc_prepare_buf		= vb2_ioctl_prepare_buf,790	.vidioc_querybuf		= vb2_ioctl_querybuf,791	.vidioc_qbuf			= vb2_ioctl_qbuf,792	.vidioc_dqbuf			= vb2_ioctl_dqbuf,793	.vidioc_expbuf			= vb2_ioctl_expbuf,794	.vidioc_streamon		= vb2_ioctl_streamon,795	.vidioc_streamoff		= vb2_ioctl_streamoff,796	.vidioc_remove_bufs		= vb2_ioctl_remove_bufs,797 798	.vidioc_enum_input		= vivid_enum_input,799	.vidioc_g_input			= vivid_g_input,800	.vidioc_s_input			= vivid_s_input,801	.vidioc_s_audio			= vidioc_s_audio,802	.vidioc_g_audio			= vidioc_g_audio,803	.vidioc_enumaudio		= vidioc_enumaudio,804	.vidioc_s_frequency		= vidioc_s_frequency,805	.vidioc_g_frequency		= vidioc_g_frequency,806	.vidioc_s_tuner			= vidioc_s_tuner,807	.vidioc_g_tuner			= vidioc_g_tuner,808	.vidioc_s_modulator		= vidioc_s_modulator,809	.vidioc_g_modulator		= vidioc_g_modulator,810	.vidioc_s_hw_freq_seek		= vidioc_s_hw_freq_seek,811	.vidioc_enum_freq_bands		= vidioc_enum_freq_bands,812 813	.vidioc_enum_output		= vidioc_enum_output,814	.vidioc_g_output		= vidioc_g_output,815	.vidioc_s_output		= vidioc_s_output,816	.vidioc_s_audout		= vidioc_s_audout,817	.vidioc_g_audout		= vidioc_g_audout,818	.vidioc_enumaudout		= vidioc_enumaudout,819 820	.vidioc_querystd		= vidioc_querystd,821	.vidioc_g_std			= vidioc_g_std,822	.vidioc_s_std			= vidioc_s_std,823	.vidioc_s_dv_timings		= vidioc_s_dv_timings,824	.vidioc_g_dv_timings		= vidioc_g_dv_timings,825	.vidioc_query_dv_timings	= vidioc_query_dv_timings,826	.vidioc_enum_dv_timings		= vidioc_enum_dv_timings,827	.vidioc_dv_timings_cap		= vidioc_dv_timings_cap,828	.vidioc_g_edid			= vidioc_g_edid,829	.vidioc_s_edid			= vidioc_s_edid,830 831	.vidioc_log_status		= vidioc_log_status,832	.vidioc_subscribe_event		= vidioc_subscribe_event,833	.vidioc_unsubscribe_event	= v4l2_event_unsubscribe,834 835	.vidioc_enum_fmt_meta_cap	= vidioc_enum_fmt_meta_cap,836	.vidioc_g_fmt_meta_cap		= vidioc_g_fmt_meta_cap,837	.vidioc_s_fmt_meta_cap		= vidioc_g_fmt_meta_cap,838	.vidioc_try_fmt_meta_cap	= vidioc_g_fmt_meta_cap,839 840	.vidioc_enum_fmt_meta_out       = vidioc_enum_fmt_meta_out,841	.vidioc_g_fmt_meta_out          = vidioc_g_fmt_meta_out,842	.vidioc_s_fmt_meta_out          = vidioc_g_fmt_meta_out,843	.vidioc_try_fmt_meta_out        = vidioc_g_fmt_meta_out,844};845 846/* -----------------------------------------------------------------847	Initialization and module stuff848   ------------------------------------------------------------------*/849 850static void vivid_dev_release(struct v4l2_device *v4l2_dev)851{852	struct vivid_dev *dev = container_of(v4l2_dev, struct vivid_dev, v4l2_dev);853 854	cancel_work_sync(&dev->update_hdmi_ctrl_work);855	vivid_free_controls(dev);856	v4l2_device_unregister(&dev->v4l2_dev);857#ifdef CONFIG_MEDIA_CONTROLLER858	media_device_cleanup(&dev->mdev);859#endif860	vfree(dev->scaled_line);861	vfree(dev->blended_line);862	vfree(dev->edid);863	tpg_free(&dev->tpg);864	kfree(dev->query_dv_timings_qmenu);865	kfree(dev->query_dv_timings_qmenu_strings);866	kfree(dev);867}868 869#ifdef CONFIG_MEDIA_CONTROLLER870static int vivid_req_validate(struct media_request *req)871{872	struct vivid_dev *dev = container_of(req->mdev, struct vivid_dev, mdev);873 874	if (dev->req_validate_error) {875		dev->req_validate_error = false;876		return -EINVAL;877	}878	return vb2_request_validate(req);879}880 881static const struct media_device_ops vivid_media_ops = {882	.req_validate = vivid_req_validate,883	.req_queue = vb2_request_queue,884};885#endif886 887static int vivid_create_queue(struct vivid_dev *dev,888			      struct vb2_queue *q,889			      u32 buf_type,890			      unsigned int min_reqbufs_allocation,891			      const struct vb2_ops *ops)892{893	if (buf_type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->multiplanar)894		buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;895	else if (buf_type == V4L2_BUF_TYPE_VIDEO_OUTPUT && dev->multiplanar)896		buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;897	else if (buf_type == V4L2_BUF_TYPE_VBI_CAPTURE && !dev->has_raw_vbi_cap)898		buf_type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;899	else if (buf_type == V4L2_BUF_TYPE_VBI_OUTPUT && !dev->has_raw_vbi_out)900		buf_type = V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;901 902	q->type = buf_type;903	q->io_modes = VB2_MMAP | VB2_DMABUF;904	q->io_modes |= V4L2_TYPE_IS_OUTPUT(buf_type) ?  VB2_WRITE : VB2_READ;905 906	/*907	 * The maximum number of buffers is 32768 if PAGE_SHIFT == 12,908	 * see also MAX_BUFFER_INDEX in videobuf2-core.c. It will be less if909	 * PAGE_SHIFT > 12, but then max_num_buffers will be clamped by910	 * videobuf2-core.c to MAX_BUFFER_INDEX.911	 */912	if (buf_type == V4L2_BUF_TYPE_VIDEO_CAPTURE)913		q->max_num_buffers = MAX_VID_CAP_BUFFERS;914	if (buf_type == V4L2_BUF_TYPE_SDR_CAPTURE)915		q->max_num_buffers = 1024;916	if (buf_type == V4L2_BUF_TYPE_VBI_CAPTURE)917		q->max_num_buffers = 32768;918 919	if (allocators[dev->inst] != 1)920		q->io_modes |= VB2_USERPTR;921	q->drv_priv = dev;922	q->buf_struct_size = sizeof(struct vivid_buffer);923	q->ops = ops;924	q->mem_ops = allocators[dev->inst] == 1 ? &vb2_dma_contig_memops :925						  &vb2_vmalloc_memops;926	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;927	q->min_reqbufs_allocation = min_reqbufs_allocation;928	q->lock = &dev->mutex;929	q->dev = dev->v4l2_dev.dev;930	q->supports_requests = supports_requests[dev->inst];931	q->requires_requests = supports_requests[dev->inst] >= 2;932	q->allow_cache_hints = (cache_hints[dev->inst] == 1);933 934	return vb2_queue_init(q);935}936 937static int vivid_detect_feature_set(struct vivid_dev *dev, int inst,938				    unsigned node_type,939				    bool *has_tuner,940				    bool *has_modulator,941				    int *ccs_cap,942				    int *ccs_out,943				    unsigned in_type_counter[4],944				    unsigned out_type_counter[4])945{946	int i;947 948	/* do we use single- or multi-planar? */949	dev->multiplanar = multiplanar[inst] > 1;950	v4l2_info(&dev->v4l2_dev, "using %splanar format API\n",951			dev->multiplanar ? "multi" : "single ");952 953	/* how many inputs do we have and of what type? */954	dev->num_inputs = num_inputs[inst];955	if (node_type & 0x20007) {956		if (dev->num_inputs < 1)957			dev->num_inputs = 1;958	} else {959		dev->num_inputs = 0;960	}961	if (dev->num_inputs >= MAX_INPUTS)962		dev->num_inputs = MAX_INPUTS;963	for (i = 0; i < dev->num_inputs; i++) {964		dev->input_type[i] = (input_types[inst] >> (i * 2)) & 0x3;965		dev->input_name_counter[i] = in_type_counter[dev->input_type[i]]++;966	}967	dev->has_audio_inputs = in_type_counter[TV] && in_type_counter[SVID];968	if (in_type_counter[HDMI] == 16) {969		/* The CEC physical address only allows for max 15 inputs */970		in_type_counter[HDMI]--;971		dev->num_inputs--;972	}973	dev->num_hdmi_inputs = in_type_counter[HDMI];974	dev->num_svid_inputs = in_type_counter[SVID];975 976	/* how many outputs do we have and of what type? */977	dev->num_outputs = num_outputs[inst];978	if (node_type & 0x40300) {979		if (dev->num_outputs < 1)980			dev->num_outputs = 1;981	} else {982		dev->num_outputs = 0;983	}984	if (dev->num_outputs >= MAX_OUTPUTS)985		dev->num_outputs = MAX_OUTPUTS;986	for (i = 0; i < dev->num_outputs; i++) {987		dev->output_type[i] = ((output_types[inst] >> i) & 1) ? HDMI : SVID;988		dev->output_name_counter[i] = out_type_counter[dev->output_type[i]]++;989	}990	dev->has_audio_outputs = out_type_counter[SVID];991	if (out_type_counter[HDMI] == 16) {992		/*993		 * The CEC physical address only allows for max 15 inputs,994		 * so outputs are also limited to 15 to allow for easy995		 * CEC output to input mapping.996		 */997		out_type_counter[HDMI]--;998		dev->num_outputs--;999	}1000	dev->num_hdmi_outputs = out_type_counter[HDMI];1001 1002	/* do we create a video capture device? */1003	dev->has_vid_cap = node_type & 0x0001;1004 1005	/* do we create a vbi capture device? */1006	if (in_type_counter[TV] || in_type_counter[SVID]) {1007		dev->has_raw_vbi_cap = node_type & 0x0004;1008		dev->has_sliced_vbi_cap = node_type & 0x0008;1009		dev->has_vbi_cap = dev->has_raw_vbi_cap | dev->has_sliced_vbi_cap;1010	}1011 1012	/* do we create a meta capture device */1013	dev->has_meta_cap = node_type & 0x20000;1014 1015	/* sanity checks */1016	if ((in_type_counter[WEBCAM] || in_type_counter[HDMI]) &&1017	    !dev->has_vid_cap && !dev->has_meta_cap) {1018		v4l2_warn(&dev->v4l2_dev,1019			  "Webcam or HDMI input without video or metadata nodes\n");1020		return -EINVAL;1021	}1022	if ((in_type_counter[TV] || in_type_counter[SVID]) &&1023	    !dev->has_vid_cap && !dev->has_vbi_cap && !dev->has_meta_cap) {1024		v4l2_warn(&dev->v4l2_dev,1025			  "TV or S-Video input without video, VBI or metadata nodes\n");1026		return -EINVAL;1027	}1028 1029	/* do we create a video output device? */1030	dev->has_vid_out = node_type & 0x0100;1031 1032	/* do we create a vbi output device? */1033	if (out_type_counter[SVID]) {1034		dev->has_raw_vbi_out = node_type & 0x0400;1035		dev->has_sliced_vbi_out = node_type & 0x0800;1036		dev->has_vbi_out = dev->has_raw_vbi_out | dev->has_sliced_vbi_out;1037	}1038 1039	/* do we create a metadata output device */1040	dev->has_meta_out = node_type & 0x40000;1041 1042	/* sanity checks */1043	if (out_type_counter[SVID] &&1044	    !dev->has_vid_out && !dev->has_vbi_out && !dev->has_meta_out) {1045		v4l2_warn(&dev->v4l2_dev,1046			  "S-Video output without video, VBI or metadata nodes\n");1047		return -EINVAL;1048	}1049	if (out_type_counter[HDMI] && !dev->has_vid_out && !dev->has_meta_out) {1050		v4l2_warn(&dev->v4l2_dev,1051			  "HDMI output without video or metadata nodes\n");1052		return -EINVAL;1053	}1054 1055	/* do we create a radio receiver device? */1056	dev->has_radio_rx = node_type & 0x0010;1057 1058	/* do we create a radio transmitter device? */1059	dev->has_radio_tx = node_type & 0x1000;1060 1061	/* do we create a software defined radio capture device? */1062	dev->has_sdr_cap = node_type & 0x0020;1063 1064	/* do we have a TV tuner? */1065	dev->has_tv_tuner = in_type_counter[TV];1066 1067	/* do we have a tuner? */1068	*has_tuner = ((dev->has_vid_cap || dev->has_vbi_cap) && in_type_counter[TV]) ||1069		      dev->has_radio_rx || dev->has_sdr_cap;1070 1071	/* do we have a modulator? */1072	*has_modulator = dev->has_radio_tx;1073 1074	if (dev->has_vid_cap)1075		/* do we have a framebuffer for overlay testing? */1076		dev->has_fb = node_type & 0x10000;1077 1078	/* can we do crop/compose/scaling while capturing? */1079	if (no_error_inj && *ccs_cap == -1)1080		*ccs_cap = 7;1081 1082	/* if ccs_cap == -1, then the user can select it using controls */1083	if (*ccs_cap != -1) {1084		dev->has_crop_cap = *ccs_cap & 1;1085		dev->has_compose_cap = *ccs_cap & 2;1086		dev->has_scaler_cap = *ccs_cap & 4;1087		v4l2_info(&dev->v4l2_dev, "Capture Crop: %c Compose: %c Scaler: %c\n",1088			dev->has_crop_cap ? 'Y' : 'N',1089			dev->has_compose_cap ? 'Y' : 'N',1090			dev->has_scaler_cap ? 'Y' : 'N');1091	}1092 1093	/* can we do crop/compose/scaling with video output? */1094	if (no_error_inj && *ccs_out == -1)1095		*ccs_out = 7;1096 1097	/* if ccs_out == -1, then the user can select it using controls */1098	if (*ccs_out != -1) {1099		dev->has_crop_out = *ccs_out & 1;1100		dev->has_compose_out = *ccs_out & 2;1101		dev->has_scaler_out = *ccs_out & 4;1102		v4l2_info(&dev->v4l2_dev, "Output Crop: %c Compose: %c Scaler: %c\n",1103			dev->has_crop_out ? 'Y' : 'N',1104			dev->has_compose_out ? 'Y' : 'N',1105			dev->has_scaler_out ? 'Y' : 'N');1106	}1107 1108	/* do we create a touch capture device */1109	dev->has_touch_cap = node_type & 0x80000;1110 1111	return 0;1112}1113 1114static void vivid_set_capabilities(struct vivid_dev *dev)1115{1116	if (dev->has_vid_cap) {1117		/* set up the capabilities of the video capture device */1118		dev->vid_cap_caps = dev->multiplanar ?1119			V4L2_CAP_VIDEO_CAPTURE_MPLANE :1120			V4L2_CAP_VIDEO_CAPTURE;1121		dev->vid_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1122		if (dev->has_audio_inputs)1123			dev->vid_cap_caps |= V4L2_CAP_AUDIO;1124		if (dev->has_tv_tuner)1125			dev->vid_cap_caps |= V4L2_CAP_TUNER;1126	}1127	if (dev->has_vid_out) {1128		/* set up the capabilities of the video output device */1129		dev->vid_out_caps = dev->multiplanar ?1130			V4L2_CAP_VIDEO_OUTPUT_MPLANE :1131			V4L2_CAP_VIDEO_OUTPUT;1132		if (dev->has_fb)1133			dev->vid_out_caps |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY;1134		dev->vid_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1135		if (dev->has_audio_outputs)1136			dev->vid_out_caps |= V4L2_CAP_AUDIO;1137	}1138	if (dev->has_vbi_cap) {1139		/* set up the capabilities of the vbi capture device */1140		dev->vbi_cap_caps = (dev->has_raw_vbi_cap ? V4L2_CAP_VBI_CAPTURE : 0) |1141				    (dev->has_sliced_vbi_cap ? V4L2_CAP_SLICED_VBI_CAPTURE : 0);1142		dev->vbi_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1143		if (dev->has_audio_inputs)1144			dev->vbi_cap_caps |= V4L2_CAP_AUDIO;1145		if (dev->has_tv_tuner)1146			dev->vbi_cap_caps |= V4L2_CAP_TUNER;1147	}1148	if (dev->has_vbi_out) {1149		/* set up the capabilities of the vbi output device */1150		dev->vbi_out_caps = (dev->has_raw_vbi_out ? V4L2_CAP_VBI_OUTPUT : 0) |1151				    (dev->has_sliced_vbi_out ? V4L2_CAP_SLICED_VBI_OUTPUT : 0);1152		dev->vbi_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1153		if (dev->has_audio_outputs)1154			dev->vbi_out_caps |= V4L2_CAP_AUDIO;1155	}1156	if (dev->has_sdr_cap) {1157		/* set up the capabilities of the sdr capture device */1158		dev->sdr_cap_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER;1159		dev->sdr_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1160	}1161	/* set up the capabilities of the radio receiver device */1162	if (dev->has_radio_rx)1163		dev->radio_rx_caps = V4L2_CAP_RADIO | V4L2_CAP_RDS_CAPTURE |1164				     V4L2_CAP_HW_FREQ_SEEK | V4L2_CAP_TUNER |1165				     V4L2_CAP_READWRITE;1166	/* set up the capabilities of the radio transmitter device */1167	if (dev->has_radio_tx)1168		dev->radio_tx_caps = V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR |1169				     V4L2_CAP_READWRITE;1170 1171	/* set up the capabilities of meta capture device */1172	if (dev->has_meta_cap) {1173		dev->meta_cap_caps = V4L2_CAP_META_CAPTURE |1174				     V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1175		if (dev->has_audio_inputs)1176			dev->meta_cap_caps |= V4L2_CAP_AUDIO;1177		if (dev->has_tv_tuner)1178			dev->meta_cap_caps |= V4L2_CAP_TUNER;1179	}1180	/* set up the capabilities of meta output device */1181	if (dev->has_meta_out) {1182		dev->meta_out_caps = V4L2_CAP_META_OUTPUT |1183				     V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;1184		if (dev->has_audio_outputs)1185			dev->meta_out_caps |= V4L2_CAP_AUDIO;1186	}1187	/* set up the capabilities of the touch capture device */1188	if (dev->has_touch_cap) {1189		dev->touch_cap_caps = V4L2_CAP_TOUCH | V4L2_CAP_STREAMING |1190				      V4L2_CAP_READWRITE;1191		dev->touch_cap_caps |= dev->multiplanar ?1192			V4L2_CAP_VIDEO_CAPTURE_MPLANE : V4L2_CAP_VIDEO_CAPTURE;1193	}1194}1195 1196static void vivid_disable_unused_ioctls(struct vivid_dev *dev,1197					bool has_tuner,1198					bool has_modulator,1199					unsigned in_type_counter[4],1200					unsigned out_type_counter[4])1201{1202	/* disable invalid ioctls based on the feature set */1203	if (!dev->has_audio_inputs) {1204		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_AUDIO);1205		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_AUDIO);1206		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMAUDIO);1207		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_AUDIO);1208		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_AUDIO);1209		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_ENUMAUDIO);1210		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_AUDIO);1211		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_AUDIO);1212		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_ENUMAUDIO);1213	}1214	if (!dev->has_audio_outputs) {1215		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_AUDOUT);1216		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_AUDOUT);1217		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMAUDOUT);1218		v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_AUDOUT);1219		v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_AUDOUT);1220		v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_ENUMAUDOUT);1221		v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_AUDOUT);1222		v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_AUDOUT);1223		v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_ENUMAUDOUT);1224	}1225	if (!in_type_counter[TV] && !in_type_counter[SVID]) {1226		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_STD);1227		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_STD);1228		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMSTD);1229		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERYSTD);1230	}1231	if (!out_type_counter[SVID]) {1232		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_STD);1233		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_STD);1234		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMSTD);1235	}1236	if (!has_tuner && !has_modulator) {1237		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_FREQUENCY);1238		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_FREQUENCY);1239		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_FREQUENCY);1240		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_FREQUENCY);1241		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_FREQUENCY);1242		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_FREQUENCY);1243	}1244	if (!has_tuner) {1245		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_TUNER);1246		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_TUNER);1247		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_TUNER);1248		v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_TUNER);1249		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_TUNER);1250		v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_TUNER);1251	}1252	if (in_type_counter[HDMI] == 0) {1253		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_EDID);1254		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_EDID);1255		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_DV_TIMINGS_CAP);1256		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_DV_TIMINGS);1257		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_DV_TIMINGS);1258		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUM_DV_TIMINGS);1259		v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERY_DV_TIMINGS);1260	}1261	if (out_type_counter[HDMI] == 0) {1262		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_EDID);1263		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_DV_TIMINGS_CAP);1264		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_DV_TIMINGS);1265		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_DV_TIMINGS);1266		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_DV_TIMINGS);1267	}1268	if (!dev->has_fb) {1269		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FBUF);1270		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FBUF);1271		v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_OVERLAY);1272	}1273	v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_HW_FREQ_SEEK);1274	v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_HW_FREQ_SEEK);1275	v4l2_disable_ioctl(&dev->sdr_cap_dev, VIDIOC_S_HW_FREQ_SEEK);1276	v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_HW_FREQ_SEEK);1277	v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FREQUENCY);1278	v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FREQUENCY);1279	v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMESIZES);1280	v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMEINTERVALS);1281	v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_FREQUENCY);1282	v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_FREQUENCY);1283	v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_FREQUENCY);1284	v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_FREQUENCY);1285	v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_S_PARM);1286	v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMESIZES);1287	v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMEINTERVALS);1288}1289 1290static int vivid_init_dv_timings(struct vivid_dev *dev)1291{1292	int i;1293 1294	while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width)1295		dev->query_dv_timings_size++;1296 1297	/*1298	 * Create a char pointer array that points to the names of all the1299	 * preset timings1300	 */1301	dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size,1302						    sizeof(char *), GFP_KERNEL);1303	/*1304	 * Create a string array containing the names of all the preset1305	 * timings. Each name is max 31 chars long (+ terminating 0).1306	 */1307	dev->query_dv_timings_qmenu_strings =1308		kmalloc_array(dev->query_dv_timings_size, 32, GFP_KERNEL);1309 1310	if (!dev->query_dv_timings_qmenu ||1311	    !dev->query_dv_timings_qmenu_strings)1312		return -ENOMEM;1313 1314	for (i = 0; i < dev->query_dv_timings_size; i++) {1315		const struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt;1316		char *p = dev->query_dv_timings_qmenu_strings + i * 32;1317		u32 htot, vtot;1318 1319		dev->query_dv_timings_qmenu[i] = p;1320 1321		htot = V4L2_DV_BT_FRAME_WIDTH(bt);1322		vtot = V4L2_DV_BT_FRAME_HEIGHT(bt);1323		snprintf(p, 32, "%ux%u%s%u",1324			bt->width, bt->height, bt->interlaced ? "i" : "p",1325			(u32)bt->pixelclock / (htot * vtot));1326	}1327 1328	return 0;1329}1330 1331static int vivid_create_queues(struct vivid_dev *dev)1332{1333	int ret;1334 1335	/* start creating the vb2 queues */1336	if (dev->has_vid_cap) {1337		/* initialize vid_cap queue */1338		ret = vivid_create_queue(dev, &dev->vb_vid_cap_q,1339					 V4L2_BUF_TYPE_VIDEO_CAPTURE, 2,1340					 &vivid_vid_cap_qops);1341		if (ret)1342			return ret;1343	}1344 1345	if (dev->has_vid_out) {1346		/* initialize vid_out queue */1347		ret = vivid_create_queue(dev, &dev->vb_vid_out_q,1348					 V4L2_BUF_TYPE_VIDEO_OUTPUT, 2,1349					 &vivid_vid_out_qops);1350		if (ret)1351			return ret;1352	}1353 1354	if (dev->has_vbi_cap) {1355		/* initialize vbi_cap queue */1356		ret = vivid_create_queue(dev, &dev->vb_vbi_cap_q,1357					 V4L2_BUF_TYPE_VBI_CAPTURE, 2,1358					 &vivid_vbi_cap_qops);1359		if (ret)1360			return ret;1361	}1362 1363	if (dev->has_vbi_out) {1364		/* initialize vbi_out queue */1365		ret = vivid_create_queue(dev, &dev->vb_vbi_out_q,1366					 V4L2_BUF_TYPE_VBI_OUTPUT, 2,1367					 &vivid_vbi_out_qops);1368		if (ret)1369			return ret;1370	}1371 1372	if (dev->has_sdr_cap) {1373		/* initialize sdr_cap queue */1374		ret = vivid_create_queue(dev, &dev->vb_sdr_cap_q,1375					 V4L2_BUF_TYPE_SDR_CAPTURE, 8,1376					 &vivid_sdr_cap_qops);1377		if (ret)1378			return ret;1379	}1380 1381	if (dev->has_meta_cap) {1382		/* initialize meta_cap queue */1383		ret = vivid_create_queue(dev, &dev->vb_meta_cap_q,1384					 V4L2_BUF_TYPE_META_CAPTURE, 2,1385					 &vivid_meta_cap_qops);1386		if (ret)1387			return ret;1388	}1389 1390	if (dev->has_meta_out) {1391		/* initialize meta_out queue */1392		ret = vivid_create_queue(dev, &dev->vb_meta_out_q,1393					 V4L2_BUF_TYPE_META_OUTPUT, 2,1394					 &vivid_meta_out_qops);1395		if (ret)1396			return ret;1397	}1398 1399	if (dev->has_touch_cap) {1400		/* initialize touch_cap queue */1401		ret = vivid_create_queue(dev, &dev->vb_touch_cap_q,1402					 V4L2_BUF_TYPE_VIDEO_CAPTURE, 2,1403					 &vivid_touch_cap_qops);1404		if (ret)1405			return ret;1406	}1407 1408	if (dev->has_fb) {1409		/* Create framebuffer for testing output overlay */1410		ret = vivid_fb_init(dev);1411		if (ret)1412			return ret;1413		v4l2_info(&dev->v4l2_dev, "Framebuffer device registered as fb%d\n",1414			  dev->fb_info.node);1415	}1416	return 0;1417}1418 1419static int vivid_create_devnodes(struct platform_device *pdev,1420				 struct vivid_dev *dev, int inst,1421				 v4l2_std_id tvnorms_cap,1422				 v4l2_std_id tvnorms_out,1423				 unsigned in_type_counter[4],1424				 unsigned out_type_counter[4])1425{1426	struct video_device *vfd;1427	int ret;1428 1429	if (dev->has_vid_cap) {1430		vfd = &dev->vid_cap_dev;1431		snprintf(vfd->name, sizeof(vfd->name),1432			 "vivid-%03d-vid-cap", inst);1433		vfd->fops = &vivid_fops;1434		vfd->ioctl_ops = &vivid_ioctl_ops;1435		vfd->device_caps = dev->vid_cap_caps;1436		vfd->release = video_device_release_empty;1437		vfd->v4l2_dev = &dev->v4l2_dev;1438		vfd->queue = &dev->vb_vid_cap_q;1439		vfd->tvnorms = tvnorms_cap;1440 1441		/*1442		 * Provide a mutex to v4l2 core. It will be used to protect1443		 * all fops and v4l2 ioctls.1444		 */1445		vfd->lock = &dev->mutex;1446		video_set_drvdata(vfd, dev);1447 1448#ifdef CONFIG_MEDIA_CONTROLLER1449		dev->vid_cap_pad.flags = MEDIA_PAD_FL_SINK;1450		ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_cap_pad);1451		if (ret)1452			return ret;1453#endif1454 1455#ifdef CONFIG_VIDEO_VIVID_CEC1456		if (in_type_counter[HDMI]) {1457			ret = cec_register_adapter(dev->cec_rx_adap, &pdev->dev);1458			if (ret < 0) {1459				cec_delete_adapter(dev->cec_rx_adap);1460				dev->cec_rx_adap = NULL;1461				return ret;1462			}1463			cec_s_phys_addr(dev->cec_rx_adap, 0, false);1464			v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI input\n",1465				  dev_name(&dev->cec_rx_adap->devnode.dev));1466		}1467#endif1468 1469		ret = video_register_device(vfd, VFL_TYPE_VIDEO, vid_cap_nr[inst]);1470		if (ret < 0)1471			return ret;1472		v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n",1473					  video_device_node_name(vfd));1474	}1475 1476	if (dev->has_vid_out) {1477#ifdef CONFIG_VIDEO_VIVID_CEC1478		int i;1479#endif1480		vfd = &dev->vid_out_dev;1481		snprintf(vfd->name, sizeof(vfd->name),1482			 "vivid-%03d-vid-out", inst);1483		vfd->vfl_dir = VFL_DIR_TX;1484		vfd->fops = &vivid_fops;1485		vfd->ioctl_ops = &vivid_ioctl_ops;1486		vfd->device_caps = dev->vid_out_caps;1487		vfd->release = video_device_release_empty;1488		vfd->v4l2_dev = &dev->v4l2_dev;1489		vfd->queue = &dev->vb_vid_out_q;1490		vfd->tvnorms = tvnorms_out;1491 1492		/*1493		 * Provide a mutex to v4l2 core. It will be used to protect1494		 * all fops and v4l2 ioctls.1495		 */1496		vfd->lock = &dev->mutex;1497		video_set_drvdata(vfd, dev);1498 1499#ifdef CONFIG_MEDIA_CONTROLLER1500		dev->vid_out_pad.flags = MEDIA_PAD_FL_SOURCE;1501		ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_out_pad);1502		if (ret)1503			return ret;1504#endif1505 1506#ifdef CONFIG_VIDEO_VIVID_CEC1507		for (i = 0; i < dev->num_hdmi_outputs; i++) {1508			ret = cec_register_adapter(dev->cec_tx_adap[i], &pdev->dev);1509			if (ret < 0) {1510				for (; i >= 0; i--) {1511					cec_delete_adapter(dev->cec_tx_adap[i]);1512					dev->cec_tx_adap[i] = NULL;1513				}1514				return ret;1515			}1516			v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI output %d\n",1517				  dev_name(&dev->cec_tx_adap[i]->devnode.dev), i);1518		}1519#endif1520 1521		ret = video_register_device(vfd, VFL_TYPE_VIDEO, vid_out_nr[inst]);1522		if (ret < 0)1523			return ret;1524		v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s\n",1525					  video_device_node_name(vfd));1526	}1527 1528	if (dev->has_vbi_cap) {1529		vfd = &dev->vbi_cap_dev;1530		snprintf(vfd->name, sizeof(vfd->name),1531			 "vivid-%03d-vbi-cap", inst);1532		vfd->fops = &vivid_fops;1533		vfd->ioctl_ops = &vivid_ioctl_ops;1534		vfd->device_caps = dev->vbi_cap_caps;1535		vfd->release = video_device_release_empty;1536		vfd->v4l2_dev = &dev->v4l2_dev;1537		vfd->queue = &dev->vb_vbi_cap_q;1538		vfd->lock = &dev->mutex;1539		vfd->tvnorms = tvnorms_cap;1540		video_set_drvdata(vfd, dev);1541 1542#ifdef CONFIG_MEDIA_CONTROLLER1543		dev->vbi_cap_pad.flags = MEDIA_PAD_FL_SINK;1544		ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_cap_pad);1545		if (ret)1546			return ret;1547#endif1548 1549		ret = video_register_device(vfd, VFL_TYPE_VBI, vbi_cap_nr[inst]);1550		if (ret < 0)1551			return ret;1552		v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s, supports %s VBI\n",1553					  video_device_node_name(vfd),1554					  (dev->has_raw_vbi_cap && dev->has_sliced_vbi_cap) ?1555					  "raw and sliced" :1556					  (dev->has_raw_vbi_cap ? "raw" : "sliced"));1557	}1558 1559	if (dev->has_vbi_out) {1560		vfd = &dev->vbi_out_dev;1561		snprintf(vfd->name, sizeof(vfd->name),1562			 "vivid-%03d-vbi-out", inst);1563		vfd->vfl_dir = VFL_DIR_TX;1564		vfd->fops = &vivid_fops;1565		vfd->ioctl_ops = &vivid_ioctl_ops;1566		vfd->device_caps = dev->vbi_out_caps;1567		vfd->release = video_device_release_empty;1568		vfd->v4l2_dev = &dev->v4l2_dev;1569		vfd->queue = &dev->vb_vbi_out_q;1570		vfd->lock = &dev->mutex;1571		vfd->tvnorms = tvnorms_out;1572		video_set_drvdata(vfd, dev);1573 1574#ifdef CONFIG_MEDIA_CONTROLLER1575		dev->vbi_out_pad.flags = MEDIA_PAD_FL_SOURCE;1576		ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_out_pad);1577		if (ret)1578			return ret;1579#endif1580 1581		ret = video_register_device(vfd, VFL_TYPE_VBI, vbi_out_nr[inst]);1582		if (ret < 0)1583			return ret;1584		v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, supports %s VBI\n",1585					  video_device_node_name(vfd),1586					  (dev->has_raw_vbi_out && dev->has_sliced_vbi_out) ?1587					  "raw and sliced" :1588					  (dev->has_raw_vbi_out ? "raw" : "sliced"));1589	}1590 1591	if (dev->has_sdr_cap) {1592		vfd = &dev->sdr_cap_dev;1593		snprintf(vfd->name, sizeof(vfd->name),1594			 "vivid-%03d-sdr-cap", inst);1595		vfd->fops = &vivid_fops;1596		vfd->ioctl_ops = &vivid_ioctl_ops;1597		vfd->device_caps = dev->sdr_cap_caps;1598		vfd->release = video_device_release_empty;1599		vfd->v4l2_dev = &dev->v4l2_dev;1600		vfd->queue = &dev->vb_sdr_cap_q;1601		vfd->lock = &dev->mutex;1602		video_set_drvdata(vfd, dev);1603 1604#ifdef CONFIG_MEDIA_CONTROLLER1605		dev->sdr_cap_pad.flags = MEDIA_PAD_FL_SINK;1606		ret = media_entity_pads_init(&vfd->entity, 1, &dev->sdr_cap_pad);1607		if (ret)1608			return ret;1609#endif1610 1611		ret = video_register_device(vfd, VFL_TYPE_SDR, sdr_cap_nr[inst]);1612		if (ret < 0)1613			return ret;1614		v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n",1615					  video_device_node_name(vfd));1616	}1617 1618	if (dev->has_radio_rx) {1619		vfd = &dev->radio_rx_dev;1620		snprintf(vfd->name, sizeof(vfd->name),1621			 "vivid-%03d-rad-rx", inst);1622		vfd->fops = &vivid_radio_fops;1623		vfd->ioctl_ops = &vivid_ioctl_ops;1624		vfd->device_caps = dev->radio_rx_caps;1625		vfd->release = video_device_release_empty;1626		vfd->v4l2_dev = &dev->v4l2_dev;1627		vfd->lock = &dev->mutex;1628		video_set_drvdata(vfd, dev);1629 1630		ret = video_register_device(vfd, VFL_TYPE_RADIO, radio_rx_nr[inst]);1631		if (ret < 0)1632			return ret;1633		v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as %s\n",1634					  video_device_node_name(vfd));1635	}1636 1637	if (dev->has_radio_tx) {1638		vfd = &dev->radio_tx_dev;1639		snprintf(vfd->name, sizeof(vfd->name),1640			 "vivid-%03d-rad-tx", inst);1641		vfd->vfl_dir = VFL_DIR_TX;1642		vfd->fops = &vivid_radio_fops;1643		vfd->ioctl_ops = &vivid_ioctl_ops;1644		vfd->device_caps = dev->radio_tx_caps;1645		vfd->release = video_device_release_empty;1646		vfd->v4l2_dev = &dev->v4l2_dev;1647		vfd->lock = &dev->mutex;1648		video_set_drvdata(vfd, dev);1649 1650		ret = video_register_device(vfd, VFL_TYPE_RADIO, radio_tx_nr[inst]);1651		if (ret < 0)1652			return ret;1653		v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered as %s\n",1654					  video_device_node_name(vfd));1655	}1656 1657	if (dev->has_meta_cap) {1658		vfd = &dev->meta_cap_dev;1659		snprintf(vfd->name, sizeof(vfd->name),1660			 "vivid-%03d-meta-cap", inst);1661		vfd->fops = &vivid_fops;1662		vfd->ioctl_ops = &vivid_ioctl_ops;1663		vfd->device_caps = dev->meta_cap_caps;1664		vfd->release = video_device_release_empty;1665		vfd->v4l2_dev = &dev->v4l2_dev;1666		vfd->queue = &dev->vb_meta_cap_q;1667		vfd->lock = &dev->mutex;1668		vfd->tvnorms = tvnorms_cap;1669		video_set_drvdata(vfd, dev);1670#ifdef CONFIG_MEDIA_CONTROLLER1671		dev->meta_cap_pad.flags = MEDIA_PAD_FL_SINK;1672		ret = media_entity_pads_init(&vfd->entity, 1,1673					     &dev->meta_cap_pad);1674		if (ret)1675			return ret;1676#endif1677		ret = video_register_device(vfd, VFL_TYPE_VIDEO,1678					    meta_cap_nr[inst]);1679		if (ret < 0)1680			return ret;1681		v4l2_info(&dev->v4l2_dev,1682			  "V4L2 metadata capture device registered as %s\n",1683			  video_device_node_name(vfd));1684	}1685 1686	if (dev->has_meta_out) {1687		vfd = &dev->meta_out_dev;1688		snprintf(vfd->name, sizeof(vfd->name),1689			 "vivid-%03d-meta-out", inst);1690		vfd->vfl_dir = VFL_DIR_TX;1691		vfd->fops = &vivid_fops;1692		vfd->ioctl_ops = &vivid_ioctl_ops;1693		vfd->device_caps = dev->meta_out_caps;1694		vfd->release = video_device_release_empty;1695		vfd->v4l2_dev = &dev->v4l2_dev;1696		vfd->queue = &dev->vb_meta_out_q;1697		vfd->lock = &dev->mutex;1698		vfd->tvnorms = tvnorms_out;1699		video_set_drvdata(vfd, dev);1700#ifdef CONFIG_MEDIA_CONTROLLER1701		dev->meta_out_pad.flags = MEDIA_PAD_FL_SOURCE;1702		ret = media_entity_pads_init(&vfd->entity, 1,1703					     &dev->meta_out_pad);1704		if (ret)1705			return ret;1706#endif1707		ret = video_register_device(vfd, VFL_TYPE_VIDEO,1708					    meta_out_nr[inst]);1709		if (ret < 0)1710			return ret;1711		v4l2_info(&dev->v4l2_dev,1712			  "V4L2 metadata output device registered as %s\n",1713			  video_device_node_name(vfd));1714	}1715 1716	if (dev->has_touch_cap) {1717		vfd = &dev->touch_cap_dev;1718		snprintf(vfd->name, sizeof(vfd->name),1719			 "vivid-%03d-touch-cap", inst);1720		vfd->fops = &vivid_fops;1721		vfd->ioctl_ops = &vivid_ioctl_ops;1722		vfd->device_caps = dev->touch_cap_caps;1723		vfd->release = video_device_release_empty;1724		vfd->v4l2_dev = &dev->v4l2_dev;1725		vfd->queue = &dev->vb_touch_cap_q;1726		vfd->tvnorms = tvnorms_cap;1727		vfd->lock = &dev->mutex;1728		video_set_drvdata(vfd, dev);1729#ifdef CONFIG_MEDIA_CONTROLLER1730		dev->touch_cap_pad.flags = MEDIA_PAD_FL_SINK;1731		ret = media_entity_pads_init(&vfd->entity, 1,1732					     &dev->touch_cap_pad);1733		if (ret)1734			return ret;1735#endif1736		ret = video_register_device(vfd, VFL_TYPE_TOUCH,1737					    touch_cap_nr[inst]);1738		if (ret < 0)1739			return ret;1740		v4l2_info(&dev->v4l2_dev,1741			  "V4L2 touch capture device registered as %s\n",1742			  video_device_node_name(vfd));1743	}1744 1745#ifdef CONFIG_MEDIA_CONTROLLER1746	/* Register the media device */1747	ret = media_device_register(&dev->mdev);1748	if (ret) {1749		dev_err(dev->mdev.dev,1750			"media device register failed (err=%d)\n", ret);1751		return ret;1752	}1753#endif1754	return 0;1755}1756 1757static void update_hdmi_ctrls_work_handler(struct work_struct *work)1758{1759	u64 skip_mask;1760	u64 update_mask;1761 1762	spin_lock(&hdmi_output_skip_mask_lock);1763	skip_mask = hdmi_to_output_menu_skip_mask;1764	update_mask = hdmi_input_update_outputs_mask;1765	hdmi_input_update_outputs_mask = 0;1766	spin_unlock(&hdmi_output_skip_mask_lock);1767	for (int i = 0; i < n_devs && vivid_devs[i]; i++) {1768		if (update_mask & (1 << i))1769			vivid_update_connected_outputs(vivid_devs[i]);1770		for (int j = 0; j < vivid_devs[i]->num_hdmi_inputs; j++) {1771			struct v4l2_ctrl *c = vivid_devs[i]->ctrl_hdmi_to_output[j];1772 1773			v4l2_ctrl_modify_range(c, c->minimum, c->maximum,1774					       skip_mask & ~(1ULL << c->cur.val),1775					       c->default_value);1776		}1777	}1778}1779 1780static void update_svid_ctrls_work_handler(struct work_struct *work)1781{1782	u64 skip_mask;1783 1784	spin_lock(&svid_output_skip_mask_lock);1785	skip_mask = svid_to_output_menu_skip_mask;1786	spin_unlock(&svid_output_skip_mask_lock);1787	for (int i = 0; i < n_devs && vivid_devs[i]; i++) {1788		for (int j = 0; j < vivid_devs[i]->num_svid_inputs; j++) {1789			struct v4l2_ctrl *c = vivid_devs[i]->ctrl_svid_to_output[j];1790 1791			v4l2_ctrl_modify_range(c, c->minimum, c->maximum,1792					       skip_mask & ~(1ULL << c->cur.val),1793					       c->default_value);1794		}1795	}1796}1797 1798static int vivid_create_instance(struct platform_device *pdev, int inst)1799{1800	static const struct v4l2_dv_timings def_dv_timings =1801					V4L2_DV_BT_CEA_1280X720P60;1802	unsigned in_type_counter[4] = { 0, 0, 0, 0 };1803	unsigned out_type_counter[4] = { 0, 0, 0, 0 };1804	int ccs_cap = ccs_cap_mode[inst];1805	int ccs_out = ccs_out_mode[inst];1806	bool has_tuner;1807	bool has_modulator;1808	struct vivid_dev *dev;1809	unsigned node_type = node_types[inst];1810	v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;1811	int ret;1812	int i;1813 1814	/* allocate main vivid state structure */1815	dev = kzalloc(sizeof(*dev), GFP_KERNEL);1816	if (!dev)1817		return -ENOMEM;1818 1819	dev->inst = inst;1820 1821#ifdef CONFIG_MEDIA_CONTROLLER1822	dev->v4l2_dev.mdev = &dev->mdev;1823 1824	/* Initialize media device */1825	strscpy(dev->mdev.model, VIVID_MODULE_NAME, sizeof(dev->mdev.model));1826	snprintf(dev->mdev.bus_info, sizeof(dev->mdev.bus_info),1827		 "platform:%s-%03d", VIVID_MODULE_NAME, inst);1828	dev->mdev.dev = &pdev->dev;1829	media_device_init(&dev->mdev);1830	dev->mdev.ops = &vivid_media_ops;1831#endif1832 1833	/* register v4l2_device */1834	snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),1835			"%s-%03d", VIVID_MODULE_NAME, inst);1836	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);1837	if (ret) {1838		kfree(dev);1839		return ret;1840	}1841	dev->v4l2_dev.release = vivid_dev_release;1842 1843	ret = vivid_detect_feature_set(dev, inst, node_type,1844				       &has_tuner, &has_modulator,1845				       &ccs_cap, &ccs_out,1846				       in_type_counter, out_type_counter);1847	if (ret)1848		goto free_dev;1849 1850	vivid_set_capabilities(dev);1851 1852	ret = -ENOMEM;1853	/* initialize the test pattern generator */1854	tpg_init(&dev->tpg, 640, 360);1855	if (tpg_alloc(&dev->tpg, array_size(MAX_WIDTH, MAX_ZOOM)))1856		goto free_dev;1857	dev->scaled_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM));1858	if (!dev->scaled_line)1859		goto free_dev;1860	dev->blended_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM));1861	if (!dev->blended_line)1862		goto free_dev;1863 1864	/* load the edid */1865	dev->edid = vmalloc(array_size(256, 128));1866	if (!dev->edid)1867		goto free_dev;1868 1869	ret = vivid_init_dv_timings(dev);1870	if (ret < 0)1871		goto free_dev;1872 1873	vivid_disable_unused_ioctls(dev, has_tuner, has_modulator,1874				    in_type_counter, out_type_counter);1875 1876	/* configure internal data */1877	dev->fmt_cap = &vivid_formats[0];1878	dev->fmt_out = &vivid_formats[0];1879	if (!dev->multiplanar)1880		vivid_formats[0].data_offset[0] = 0;1881	dev->webcam_size_idx = 1;1882	dev->webcam_ival_idx = 3;1883	tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc);1884	dev->std_out = V4L2_STD_PAL;1885	if (dev->input_type[0] == TV || dev->input_type[0] == SVID)1886		tvnorms_cap = V4L2_STD_ALL;1887	if (dev->output_type[0] == SVID)1888		tvnorms_out = V4L2_STD_ALL;1889	for (i = 0; i < MAX_INPUTS; i++) {1890		dev->dv_timings_cap[i] = def_dv_timings;1891		dev->std_cap[i] = V4L2_STD_PAL;1892	}1893	dev->dv_timings_out = def_dv_timings;1894	dev->tv_freq = 2804 /* 175.25 * 16 */;1895	dev->tv_audmode = V4L2_TUNER_MODE_STEREO;1896	dev->tv_field_cap = V4L2_FIELD_INTERLACED;1897	dev->tv_field_out = V4L2_FIELD_INTERLACED;1898	dev->radio_rx_freq = 95000 * 16;1899	dev->radio_rx_audmode = V4L2_TUNER_MODE_STEREO;1900	if (dev->has_radio_tx) {1901		dev->radio_tx_freq = 95500 * 16;1902		dev->radio_rds_loop = false;1903	}1904	dev->radio_tx_subchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_RDS;1905	dev->sdr_adc_freq = 300000;1906	dev->sdr_fm_freq = 50000000;1907	dev->sdr_pixelformat = V4L2_SDR_FMT_CU8;1908	dev->sdr_buffersize = SDR_CAP_SAMPLES_PER_BUF * 2;1909 1910	dev->edid_max_blocks = dev->edid_blocks = 2;1911	memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid));1912	dev->radio_rds_init_time = ktime_get();1913	INIT_WORK(&dev->update_hdmi_ctrl_work, update_hdmi_ctrls_work_handler);1914	INIT_WORK(&dev->update_svid_ctrl_work, update_svid_ctrls_work_handler);1915	for (int j = 0, k = 0; j < dev->num_inputs; ++j)1916		if (dev->input_type[j] == HDMI)1917			dev->hdmi_index_to_input_index[k++] = j;1918	for (int j = 0, k = 0; j < dev->num_outputs; ++j)1919		if (dev->output_type[j] == HDMI) {1920			dev->output_to_iface_index[j] = k;1921			dev->hdmi_index_to_output_index[k++] = j;1922		}1923	for (int j = 0, k = 0; j < dev->num_inputs; ++j)1924		if (dev->input_type[j] == SVID)1925			dev->svid_index_to_input_index[k++] = j;1926	for (int j = 0, k = 0; j < dev->num_outputs; ++j)1927		if (dev->output_type[j] == SVID)1928			dev->output_to_iface_index[j] = k++;1929 1930	/* create all controls */1931	ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj,1932			in_type_counter[TV] || in_type_counter[SVID] ||1933			out_type_counter[SVID],1934			in_type_counter[HDMI] || out_type_counter[HDMI]);1935	if (ret)1936		goto unreg_dev;1937 1938	/* enable/disable interface specific controls */1939	if (dev->num_inputs && dev->input_type[0] != HDMI) {1940		v4l2_ctrl_activate(dev->ctrl_dv_timings_signal_mode, false);1941		v4l2_ctrl_activate(dev->ctrl_dv_timings, false);1942	} else if (dev->num_inputs && dev->input_type[0] == HDMI) {1943		v4l2_ctrl_activate(dev->ctrl_std_signal_mode, false);1944		v4l2_ctrl_activate(dev->ctrl_standard, false);1945	}1946 1947	/*1948	 * update the capture and output formats to do a proper initial1949	 * configuration.1950	 */1951	vivid_update_format_cap(dev, false);1952	vivid_update_format_out(dev);1953 1954	/* update touch configuration */1955	dev->timeperframe_tch_cap.numerator = 1;1956	dev->timeperframe_tch_cap.denominator = 10;1957	vivid_set_touch(dev, 0);1958 1959	/* initialize locks */1960	spin_lock_init(&dev->slock);1961	mutex_init(&dev->mutex);1962 1963	/* init dma queues */1964	INIT_LIST_HEAD(&dev->vid_cap_active);1965	INIT_LIST_HEAD(&dev->vid_out_active);1966	INIT_LIST_HEAD(&dev->vbi_cap_active);1967	INIT_LIST_HEAD(&dev->vbi_out_active);1968	INIT_LIST_HEAD(&dev->sdr_cap_active);1969	INIT_LIST_HEAD(&dev->meta_cap_active);1970	INIT_LIST_HEAD(&dev->meta_out_active);1971	INIT_LIST_HEAD(&dev->touch_cap_active);1972 1973	spin_lock_init(&dev->cec_xfers_slock);1974 1975	if (allocators[inst] == 1)1976		dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));1977 1978	ret = vivid_create_queues(dev);1979	if (ret)1980		goto unreg_dev;1981 1982#ifdef CONFIG_VIDEO_VIVID_CEC1983	if (dev->has_vid_cap && in_type_counter[HDMI]) {1984		struct cec_adapter *adap;1985 1986		adap = vivid_cec_alloc_adap(dev, 0, false);1987		ret = PTR_ERR_OR_ZERO(adap);1988		if (ret < 0)1989			goto unreg_dev;1990		dev->cec_rx_adap = adap;1991	}1992 1993	if (dev->has_vid_out) {1994		int j;1995 1996		for (i = j = 0; i < dev->num_outputs; i++) {1997			struct cec_adapter *adap;1998 1999			if (dev->output_type[i] != HDMI)2000				continue;2001 2002			adap = vivid_cec_alloc_adap(dev, j, true);2003			ret = PTR_ERR_OR_ZERO(adap);2004			if (ret < 0) {2005				while (j--)2006					cec_delete_adapter(dev->cec_tx_adap[j]);2007				goto unreg_dev;2008			}2009 2010			dev->cec_tx_adap[j++] = adap;2011		}2012	}2013 2014	if (dev->cec_rx_adap || dev->num_hdmi_outputs) {2015		init_waitqueue_head(&dev->kthread_waitq_cec);2016		dev->kthread_cec = kthread_run(vivid_cec_bus_thread, dev,2017					       "vivid_cec-%s", dev->v4l2_dev.name);2018		if (IS_ERR(dev->kthread_cec)) {2019			ret = PTR_ERR(dev->kthread_cec);2020			dev->kthread_cec = NULL;2021			v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n");2022			goto unreg_dev;2023		}2024	}2025 2026#endif2027 2028	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap);2029	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out);2030	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_cap);2031	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_out);2032	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_rx);2033	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_tx);2034	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_sdr_cap);2035	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_cap);2036	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_out);2037	v4l2_ctrl_handler_setup(&dev->ctrl_hdl_touch_cap);2038 2039	/* finally start creating the device nodes */2040	ret = vivid_create_devnodes(pdev, dev, inst,2041				    tvnorms_cap, tvnorms_out,2042				    in_type_counter, out_type_counter);2043	if (ret)2044		goto unreg_dev;2045 2046	/* Now that everything is fine, let's add it to device list */2047	vivid_devs[inst] = dev;2048 2049	return 0;2050 2051unreg_dev:2052	vb2_video_unregister_device(&dev->touch_cap_dev);2053	vb2_video_unregister_device(&dev->meta_out_dev);2054	vb2_video_unregister_device(&dev->meta_cap_dev);2055	video_unregister_device(&dev->radio_tx_dev);2056	video_unregister_device(&dev->radio_rx_dev);2057	vb2_video_unregister_device(&dev->sdr_cap_dev);2058	vb2_video_unregister_device(&dev->vbi_out_dev);2059	vb2_video_unregister_device(&dev->vbi_cap_dev);2060	vb2_video_unregister_device(&dev->vid_out_dev);2061	vb2_video_unregister_device(&dev->vid_cap_dev);2062	cec_unregister_adapter(dev->cec_rx_adap);2063	for (i = 0; i < MAX_HDMI_OUTPUTS; i++)2064		cec_unregister_adapter(dev->cec_tx_adap[i]);2065	if (dev->kthread_cec)2066		kthread_stop(dev->kthread_cec);2067free_dev:2068	v4l2_device_put(&dev->v4l2_dev);2069	return ret;2070}2071 2072/* This routine allocates from 1 to n_devs virtual drivers.2073 2074   The real maximum number of virtual drivers will depend on how many drivers2075   will succeed. This is limited to the maximum number of devices that2076   videodev supports, which is equal to VIDEO_NUM_DEVICES.2077 */2078static int vivid_probe(struct platform_device *pdev)2079{2080	const struct font_desc *font = find_font("VGA8x16");2081	int ret = 0, i;2082 2083	if (font == NULL) {2084		pr_err("vivid: could not find font\n");2085		return -ENODEV;2086	}2087 2088	tpg_set_font(font->data);2089 2090	n_devs = clamp_t(unsigned, n_devs, 1, VIVID_MAX_DEVS);2091 2092	for (i = 0; i < n_devs; i++) {2093		ret = vivid_create_instance(pdev, i);2094		if (ret) {2095			/* If some instantiations succeeded, keep driver */2096			if (i)2097				ret = 0;2098			break;2099		}2100	}2101 2102	if (ret < 0) {2103		pr_err("vivid: error %d while loading driver\n", ret);2104		return ret;2105	}2106 2107	/* n_devs will reflect the actual number of allocated devices */2108	n_devs = i;2109 2110	/* Determine qmenu items actually in use */2111	int hdmi_count = FIXED_MENU_ITEMS;2112	int svid_count = FIXED_MENU_ITEMS;2113 2114	for (int i = 0; i < n_devs; i++) {2115		struct vivid_dev *dev = vivid_devs[i];2116 2117		if (!dev->has_vid_out)2118			continue;2119		for (int j = 0; j < dev->num_outputs && hdmi_count < MAX_MENU_ITEMS; ++j) {2120			if (dev->output_type[j] == HDMI) {2121				vivid_ctrl_hdmi_to_output_instance[hdmi_count] = vivid_devs[i];2122				vivid_ctrl_hdmi_to_output_index[hdmi_count++] = j;2123			}2124		}2125		for (int j = 0; j < dev->num_outputs && svid_count < MAX_MENU_ITEMS; ++j) {2126			if (dev->output_type[j] == SVID) {2127				vivid_ctrl_svid_to_output_instance[svid_count] = vivid_devs[i];2128				vivid_ctrl_svid_to_output_index[svid_count++] = j;2129			}2130		}2131	}2132	hdmi_count = min(hdmi_count, MAX_MENU_ITEMS);2133	svid_count = min(svid_count, MAX_MENU_ITEMS);2134	for (int i = 0; i < n_devs; i++) {2135		for (int j = 0; j < vivid_devs[i]->num_hdmi_inputs; j++) {2136			struct v4l2_ctrl *c = vivid_devs[i]->ctrl_hdmi_to_output[j];2137 2138			v4l2_ctrl_modify_range(c, c->minimum, hdmi_count - 1, 0, c->default_value);2139		}2140		for (int j = 0; j < vivid_devs[i]->num_svid_inputs; j++) {2141			struct v4l2_ctrl *c = vivid_devs[i]->ctrl_svid_to_output[j];2142 2143			v4l2_ctrl_modify_range(c, c->minimum, svid_count - 1, 0, c->default_value);2144		}2145	}2146	return ret;2147}2148 2149static void vivid_remove(struct platform_device *pdev)2150{2151	struct vivid_dev *dev;2152	unsigned int i, j;2153 2154	for (i = 0; i < n_devs; i++) {2155		dev = vivid_devs[i];2156		if (!dev)2157			continue;2158 2159		if (dev->disconnect_error)2160			vivid_reconnect(dev);2161#ifdef CONFIG_MEDIA_CONTROLLER2162		media_device_unregister(&dev->mdev);2163#endif2164 2165		if (dev->has_vid_cap) {2166			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2167				video_device_node_name(&dev->vid_cap_dev));2168			vb2_video_unregister_device(&dev->vid_cap_dev);2169		}2170		if (dev->has_vid_out) {2171			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2172				video_device_node_name(&dev->vid_out_dev));2173			vb2_video_unregister_device(&dev->vid_out_dev);2174		}2175		if (dev->has_vbi_cap) {2176			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2177				video_device_node_name(&dev->vbi_cap_dev));2178			vb2_video_unregister_device(&dev->vbi_cap_dev);2179		}2180		if (dev->has_vbi_out) {2181			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2182				video_device_node_name(&dev->vbi_out_dev));2183			vb2_video_unregister_device(&dev->vbi_out_dev);2184		}2185		if (dev->has_sdr_cap) {2186			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2187				video_device_node_name(&dev->sdr_cap_dev));2188			vb2_video_unregister_device(&dev->sdr_cap_dev);2189		}2190		if (dev->has_radio_rx) {2191			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2192				video_device_node_name(&dev->radio_rx_dev));2193			video_unregister_device(&dev->radio_rx_dev);2194		}2195		if (dev->has_radio_tx) {2196			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2197				video_device_node_name(&dev->radio_tx_dev));2198			video_unregister_device(&dev->radio_tx_dev);2199		}2200		if (dev->has_fb) {2201			v4l2_info(&dev->v4l2_dev, "unregistering fb%d\n",2202				dev->fb_info.node);2203			unregister_framebuffer(&dev->fb_info);2204			vivid_fb_release_buffers(dev);2205		}2206		if (dev->has_meta_cap) {2207			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2208				  video_device_node_name(&dev->meta_cap_dev));2209			vb2_video_unregister_device(&dev->meta_cap_dev);2210		}2211		if (dev->has_meta_out) {2212			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2213				  video_device_node_name(&dev->meta_out_dev));2214			vb2_video_unregister_device(&dev->meta_out_dev);2215		}2216		if (dev->has_touch_cap) {2217			v4l2_info(&dev->v4l2_dev, "unregistering %s\n",2218				  video_device_node_name(&dev->touch_cap_dev));2219			vb2_video_unregister_device(&dev->touch_cap_dev);2220		}2221		cec_unregister_adapter(dev->cec_rx_adap);2222		for (j = 0; j < MAX_HDMI_OUTPUTS; j++)2223			cec_unregister_adapter(dev->cec_tx_adap[j]);2224		if (dev->kthread_cec)2225			kthread_stop(dev->kthread_cec);2226		v4l2_device_put(&dev->v4l2_dev);2227		vivid_devs[i] = NULL;2228	}2229}2230 2231static void vivid_pdev_release(struct device *dev)2232{2233}2234 2235static struct platform_device vivid_pdev = {2236	.name		= "vivid",2237	.dev.release	= vivid_pdev_release,2238};2239 2240static struct platform_driver vivid_pdrv = {2241	.probe		= vivid_probe,2242	.remove_new	= vivid_remove,2243	.driver		= {2244		.name	= "vivid",2245	},2246};2247 2248static int __init vivid_init(void)2249{2250	int hdmi_count = FIXED_MENU_ITEMS;2251	int svid_count = FIXED_MENU_ITEMS;2252	int ret = -ENOMEM;2253	unsigned int ndevs;2254 2255	/* Sanity check, prevent insane number of vivid instances */2256	if (n_devs > 64)2257		n_devs = 64;2258	ndevs = clamp_t(unsigned int, n_devs, 1, VIVID_MAX_DEVS);2259 2260	for (unsigned int i = 0; i < ndevs; i++) {2261		if (!(node_types[i] & (1 << 8)))2262			continue;2263		unsigned int n_outputs = min(num_outputs[i], MAX_OUTPUTS);2264 2265		for (u8 j = 0, k = 0; j < n_outputs && hdmi_count < MAX_MENU_ITEMS &&2266		     k < MAX_HDMI_OUTPUTS; ++j) {2267			if (output_types[i] & BIT(j)) {2268				vivid_ctrl_hdmi_to_output_strings[hdmi_count] =2269					kmalloc(MAX_STRING_LENGTH, GFP_KERNEL);2270				if (!vivid_ctrl_hdmi_to_output_strings[hdmi_count])2271					goto free_output_strings;2272				snprintf(vivid_ctrl_hdmi_to_output_strings[hdmi_count],2273					 MAX_STRING_LENGTH, "Output HDMI %03d-%d",2274					 i & 0xff, k);2275				k++;2276				hdmi_count++;2277			}2278		}2279		for (u8 j = 0, k = 0; j < n_outputs && svid_count < MAX_MENU_ITEMS; ++j) {2280			if (!(output_types[i] & BIT(j))) {2281				vivid_ctrl_svid_to_output_strings[svid_count] =2282					kmalloc(MAX_STRING_LENGTH, GFP_KERNEL);2283				if (!vivid_ctrl_svid_to_output_strings[svid_count])2284					goto free_output_strings;2285				snprintf(vivid_ctrl_svid_to_output_strings[svid_count],2286					 MAX_STRING_LENGTH, "Output S-Video %03d-%d",2287					 i & 0xff, k);2288				k++;2289				svid_count++;2290			}2291		}2292	}2293	ret = platform_device_register(&vivid_pdev);2294	if (ret)2295		goto free_output_strings;2296	ret = platform_driver_register(&vivid_pdrv);2297	if (ret)2298		goto unreg_device;2299 2300	/* Initialize workqueue before module is loaded */2301	update_hdmi_ctrls_workqueue = create_workqueue("update_hdmi_ctrls_wq");2302	if (!update_hdmi_ctrls_workqueue) {2303		ret = -ENOMEM;2304		goto unreg_driver;2305	}2306	update_svid_ctrls_workqueue = create_workqueue("update_svid_ctrls_wq");2307	if (!update_svid_ctrls_workqueue) {2308		ret = -ENOMEM;2309		goto destroy_hdmi_wq;2310	}2311	return ret;2312 2313destroy_hdmi_wq:2314	destroy_workqueue(update_hdmi_ctrls_workqueue);2315unreg_driver:2316	platform_driver_register(&vivid_pdrv);2317unreg_device:2318	platform_device_unregister(&vivid_pdev);2319free_output_strings:2320	for (int i = FIXED_MENU_ITEMS; i < MAX_MENU_ITEMS; i++) {2321		kfree(vivid_ctrl_hdmi_to_output_strings[i]);2322		kfree(vivid_ctrl_svid_to_output_strings[i]);2323	}2324	return ret;2325}2326 2327static void __exit vivid_exit(void)2328{2329	for (int i = FIXED_MENU_ITEMS; i < MAX_MENU_ITEMS; i++) {2330		kfree(vivid_ctrl_hdmi_to_output_strings[i]);2331		kfree(vivid_ctrl_svid_to_output_strings[i]);2332	}2333	destroy_workqueue(update_svid_ctrls_workqueue);2334	destroy_workqueue(update_hdmi_ctrls_workqueue);2335	platform_driver_unregister(&vivid_pdrv);2336	platform_device_unregister(&vivid_pdev);2337}2338 2339module_init(vivid_init);2340module_exit(vivid_exit);2341