Lines Matching +full:modulator +full:- +full:sel

1 // SPDX-License-Identifier: GPL-2.0-only
4 * vivid-core.c - A Virtual Video Test Driver, core initialization
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>
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"
56 static int vid_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
58 MODULE_PARM_DESC(vid_cap_nr, " videoX start number, -1 is autodetect");
60 static int vid_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
62 MODULE_PARM_DESC(vid_out_nr, " videoX start number, -1 is autodetect");
64 static int vbi_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
66 MODULE_PARM_DESC(vbi_cap_nr, " vbiX start number, -1 is autodetect");
68 static int vbi_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
70 MODULE_PARM_DESC(vbi_out_nr, " vbiX start number, -1 is autodetect");
72 static int sdr_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
74 MODULE_PARM_DESC(sdr_cap_nr, " swradioX start number, -1 is autodetect");
76 static int radio_rx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
78 MODULE_PARM_DESC(radio_rx_nr, " radioX start number, -1 is autodetect");
80 static int radio_tx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
82 MODULE_PARM_DESC(radio_tx_nr, " radioX start number, -1 is autodetect");
84 static int meta_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
86 MODULE_PARM_DESC(meta_cap_nr, " videoX start number, -1 is autodetect");
88 static int meta_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
90 MODULE_PARM_DESC(meta_out_nr, " videoX start number, -1 is autodetect");
92 static int touch_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
94 MODULE_PARM_DESC(touch_cap_nr, " v4l-touchX start number, -1 is autodetect");
96 static int ccs_cap_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
100 "\t\t -1=user-controlled (default)");
102 static int ccs_out_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
106 "\t\t -1=user-controlled (default)");
108 static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 };
113 * Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr +
114 * vbi-out + vid-out + meta-cap
117 [0 ... (VIVID_MAX_DEVS - 1)] = 0xe1d3d
122 "\t\t bit 2-3: VBI Capture node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
126 "\t\t bit 10-11: VBI Output node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
136 static unsigned num_inputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 4 };
141 static unsigned input_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0xe4 };
144 "\t\t bits 0-1 == input 0, bits 31-30 == input 15.\n"
145 "\t\t Type 0 == webcam, 1 == TV, 2 == S-Video, 3 == HDMI");
148 static unsigned num_outputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
153 static unsigned output_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
157 "\t\t Type 0 == S-Video, 1 == HDMI");
167 static unsigned int allocators[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0 };
171 "\t\t 1 == dma-contig");
174 [0 ... (VIVID_MAX_DEVS - 1)] = 0
177 MODULE_PARM_DESC(cache_hints, " user-space cache hints, default is 0.\n"
182 [0 ... (VIVID_MAX_DEVS - 1)] = 1
266 strscpy(cap->driver, "vivid", sizeof(cap->driver)); in vidioc_querycap()
267 strscpy(cap->card, "vivid", sizeof(cap->card)); in vidioc_querycap()
268 snprintf(cap->bus_info, sizeof(cap->bus_info), in vidioc_querycap()
269 "platform:%s-%03d", VIVID_MODULE_NAME, dev->inst); in vidioc_querycap()
271 cap->capabilities = dev->vid_cap_caps | dev->vid_out_caps | in vidioc_querycap()
272 dev->vbi_cap_caps | dev->vbi_out_caps | in vidioc_querycap()
273 dev->radio_rx_caps | dev->radio_tx_caps | in vidioc_querycap()
274 dev->sdr_cap_caps | dev->meta_cap_caps | in vidioc_querycap()
275 dev->meta_out_caps | dev->touch_cap_caps | in vidioc_querycap()
284 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_hw_freq_seek()
286 return -ENOTTY; in vidioc_s_hw_freq_seek()
293 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_enum_freq_bands()
295 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_enum_freq_bands()
297 return -ENOTTY; in vidioc_enum_freq_bands()
304 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_g_tuner()
306 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_g_tuner()
315 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_tuner()
317 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_s_tuner()
327 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_g_frequency()
329 vdev->vfl_dir == VFL_DIR_RX ? in vidioc_g_frequency()
330 &dev->radio_rx_freq : &dev->radio_tx_freq, vf); in vidioc_g_frequency()
331 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_g_frequency()
341 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_frequency()
343 vdev->vfl_dir == VFL_DIR_RX ? in vidioc_s_frequency()
344 &dev->radio_rx_freq : &dev->radio_tx_freq, vf); in vidioc_s_frequency()
345 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_s_frequency()
354 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_overlay()
355 return -ENOTTY; in vidioc_overlay()
363 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_fbuf()
364 return -ENOTTY; in vidioc_g_fbuf()
372 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_fbuf()
373 return -ENOTTY; in vidioc_s_fbuf()
381 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_std()
390 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_dv_timings()
400 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_pixelaspect()
406 struct v4l2_selection *sel) in vidioc_g_selection() argument
410 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_selection()
411 return vivid_vid_cap_g_selection(file, fh, sel); in vidioc_g_selection()
412 return vivid_vid_out_g_selection(file, fh, sel); in vidioc_g_selection()
416 struct v4l2_selection *sel) in vidioc_s_selection() argument
420 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_selection()
421 return vivid_vid_cap_s_selection(file, fh, sel); in vidioc_s_selection()
422 return vivid_vid_out_s_selection(file, fh, sel); in vidioc_s_selection()
430 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vidioc_g_parm()
432 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_parm()
442 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_parm()
444 return -ENOTTY; in vidioc_s_parm()
453 if (vdev->vfl_dir == VFL_DIR_RX && vdev->vfl_type == VFL_TYPE_VIDEO) in vidioc_log_status()
454 tpg_log_status(&dev->tpg); in vidioc_log_status()
463 if (vdev->vfl_dir == VFL_DIR_TX) in vivid_radio_read()
464 return -EINVAL; in vivid_radio_read()
473 if (vdev->vfl_dir == VFL_DIR_RX) in vivid_radio_write()
474 return -EINVAL; in vivid_radio_write()
482 if (vdev->vfl_dir == VFL_DIR_RX) in vivid_radio_poll()
492 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_enum_input()
501 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_input()
510 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_input()
520 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_enum_fmt_cap()
530 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_fmt_cap()
540 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_try_fmt_cap()
550 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_fmt_cap()
560 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_fmt_cap_mplane()
570 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_try_fmt_cap_mplane()
580 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_fmt_cap_mplane()
592 spin_lock_irqsave(&vdev->fh_lock, flags); in vivid_is_in_use()
593 res = !list_empty(&vdev->fh_list); in vivid_is_in_use()
594 spin_unlock_irqrestore(&vdev->fh_lock, flags); in vivid_is_in_use()
601 vivid_is_in_use(dev->has_vid_cap, &dev->vid_cap_dev) + in vivid_is_last_user()
602 vivid_is_in_use(dev->has_vid_out, &dev->vid_out_dev) + in vivid_is_last_user()
603 vivid_is_in_use(dev->has_vbi_cap, &dev->vbi_cap_dev) + in vivid_is_last_user()
604 vivid_is_in_use(dev->has_vbi_out, &dev->vbi_out_dev) + in vivid_is_last_user()
605 vivid_is_in_use(dev->has_radio_rx, &dev->radio_rx_dev) + in vivid_is_last_user()
606 vivid_is_in_use(dev->has_radio_tx, &dev->radio_tx_dev) + in vivid_is_last_user()
607 vivid_is_in_use(dev->has_sdr_cap, &dev->sdr_cap_dev) + in vivid_is_last_user()
608 vivid_is_in_use(dev->has_meta_cap, &dev->meta_cap_dev) + in vivid_is_last_user()
609 vivid_is_in_use(dev->has_meta_out, &dev->meta_out_dev) + in vivid_is_last_user()
610 vivid_is_in_use(dev->has_touch_cap, &dev->touch_cap_dev); in vivid_is_last_user()
617 if (dev->has_vid_cap) in vivid_reconnect()
618 set_bit(V4L2_FL_REGISTERED, &dev->vid_cap_dev.flags); in vivid_reconnect()
619 if (dev->has_vid_out) in vivid_reconnect()
620 set_bit(V4L2_FL_REGISTERED, &dev->vid_out_dev.flags); in vivid_reconnect()
621 if (dev->has_vbi_cap) in vivid_reconnect()
622 set_bit(V4L2_FL_REGISTERED, &dev->vbi_cap_dev.flags); in vivid_reconnect()
623 if (dev->has_vbi_out) in vivid_reconnect()
624 set_bit(V4L2_FL_REGISTERED, &dev->vbi_out_dev.flags); in vivid_reconnect()
625 if (dev->has_radio_rx) in vivid_reconnect()
626 set_bit(V4L2_FL_REGISTERED, &dev->radio_rx_dev.flags); in vivid_reconnect()
627 if (dev->has_radio_tx) in vivid_reconnect()
628 set_bit(V4L2_FL_REGISTERED, &dev->radio_tx_dev.flags); in vivid_reconnect()
629 if (dev->has_sdr_cap) in vivid_reconnect()
630 set_bit(V4L2_FL_REGISTERED, &dev->sdr_cap_dev.flags); in vivid_reconnect()
631 if (dev->has_meta_cap) in vivid_reconnect()
632 set_bit(V4L2_FL_REGISTERED, &dev->meta_cap_dev.flags); in vivid_reconnect()
633 if (dev->has_meta_out) in vivid_reconnect()
634 set_bit(V4L2_FL_REGISTERED, &dev->meta_out_dev.flags); in vivid_reconnect()
635 if (dev->has_touch_cap) in vivid_reconnect()
636 set_bit(V4L2_FL_REGISTERED, &dev->touch_cap_dev.flags); in vivid_reconnect()
637 dev->disconnect_error = false; in vivid_reconnect()
645 mutex_lock(&dev->mutex); in vivid_fop_release()
647 dev->disconnect_error && !video_is_registered(vdev) && in vivid_fop_release()
652 * so re-register all video_device's again. in vivid_fop_release()
654 v4l2_info(&dev->v4l2_dev, "reconnect\n"); in vivid_fop_release()
657 if (file->private_data == dev->radio_rx_rds_owner) { in vivid_fop_release()
658 dev->radio_rx_rds_last_block = 0; in vivid_fop_release()
659 dev->radio_rx_rds_owner = NULL; in vivid_fop_release()
661 if (file->private_data == dev->radio_tx_rds_owner) { in vivid_fop_release()
662 dev->radio_tx_rds_last_block = 0; in vivid_fop_release()
663 dev->radio_tx_rds_owner = NULL; in vivid_fop_release()
665 mutex_unlock(&dev->mutex); in vivid_fop_release()
666 if (vdev->queue) in vivid_fop_release()
702 if (p->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE || in vidioc_reqbufs()
703 p->type == V4L2_BUF_TYPE_VBI_CAPTURE) { in vidioc_reqbufs()
704 r = vb2_queue_change_type(vdev->queue, p->type); in vidioc_reqbufs()
722 if (p->format.type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE || in vidioc_create_bufs()
723 p->format.type == V4L2_BUF_TYPE_VBI_CAPTURE) { in vidioc_create_bufs()
724 r = vb2_queue_change_type(vdev->queue, p->format.type); in vidioc_create_bufs()
848 /* -----------------------------------------------------------------
850 ------------------------------------------------------------------*/
856 cancel_work_sync(&dev->update_hdmi_ctrl_work); in vivid_dev_release()
858 v4l2_device_unregister(&dev->v4l2_dev); in vivid_dev_release()
860 media_device_cleanup(&dev->mdev); in vivid_dev_release()
862 vfree(dev->scaled_line); in vivid_dev_release()
863 vfree(dev->blended_line); in vivid_dev_release()
864 vfree(dev->edid); in vivid_dev_release()
865 tpg_free(&dev->tpg); in vivid_dev_release()
866 kfree(dev->query_dv_timings_qmenu); in vivid_dev_release()
867 kfree(dev->query_dv_timings_qmenu_strings); in vivid_dev_release()
874 struct vivid_dev *dev = container_of(req->mdev, struct vivid_dev, mdev); in vivid_req_validate()
876 if (dev->req_validate_error) { in vivid_req_validate()
877 dev->req_validate_error = false; in vivid_req_validate()
878 return -EINVAL; in vivid_req_validate()
895 if (buf_type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->multiplanar) in vivid_create_queue()
897 else if (buf_type == V4L2_BUF_TYPE_VIDEO_OUTPUT && dev->multiplanar) in vivid_create_queue()
899 else if (buf_type == V4L2_BUF_TYPE_VBI_CAPTURE && !dev->has_raw_vbi_cap) in vivid_create_queue()
901 else if (buf_type == V4L2_BUF_TYPE_VBI_OUTPUT && !dev->has_raw_vbi_out) in vivid_create_queue()
904 q->type = buf_type; in vivid_create_queue()
905 q->io_modes = VB2_MMAP | VB2_DMABUF; in vivid_create_queue()
906 q->io_modes |= V4L2_TYPE_IS_OUTPUT(buf_type) ? VB2_WRITE : VB2_READ; in vivid_create_queue()
910 * see also MAX_BUFFER_INDEX in videobuf2-core.c. It will be less if in vivid_create_queue()
912 * videobuf2-core.c to MAX_BUFFER_INDEX. in vivid_create_queue()
915 q->max_num_buffers = MAX_VID_CAP_BUFFERS; in vivid_create_queue()
917 q->max_num_buffers = 1024; in vivid_create_queue()
919 q->max_num_buffers = 32768; in vivid_create_queue()
921 if (allocators[dev->inst] != 1) in vivid_create_queue()
922 q->io_modes |= VB2_USERPTR; in vivid_create_queue()
923 q->drv_priv = dev; in vivid_create_queue()
924 q->buf_struct_size = sizeof(struct vivid_buffer); in vivid_create_queue()
925 q->ops = ops; in vivid_create_queue()
926 q->mem_ops = allocators[dev->inst] == 1 ? &vb2_dma_contig_memops : in vivid_create_queue()
928 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in vivid_create_queue()
929 q->min_reqbufs_allocation = min_reqbufs_allocation; in vivid_create_queue()
930 q->lock = &dev->mutex; in vivid_create_queue()
931 q->dev = dev->v4l2_dev.dev; in vivid_create_queue()
932 q->supports_requests = supports_requests[dev->inst]; in vivid_create_queue()
933 q->requires_requests = supports_requests[dev->inst] >= 2; in vivid_create_queue()
934 q->allow_cache_hints = (cache_hints[dev->inst] == 1); in vivid_create_queue()
950 /* do we use single- or multi-planar? */ in vivid_detect_feature_set()
951 dev->multiplanar = multiplanar[inst] > 1; in vivid_detect_feature_set()
952 v4l2_info(&dev->v4l2_dev, "using %splanar format API\n", in vivid_detect_feature_set()
953 dev->multiplanar ? "multi" : "single "); in vivid_detect_feature_set()
956 dev->num_inputs = num_inputs[inst]; in vivid_detect_feature_set()
958 if (dev->num_inputs < 1) in vivid_detect_feature_set()
959 dev->num_inputs = 1; in vivid_detect_feature_set()
961 dev->num_inputs = 0; in vivid_detect_feature_set()
963 if (dev->num_inputs >= MAX_INPUTS) in vivid_detect_feature_set()
964 dev->num_inputs = MAX_INPUTS; in vivid_detect_feature_set()
965 for (i = 0; i < dev->num_inputs; i++) { in vivid_detect_feature_set()
966 dev->input_type[i] = (input_types[inst] >> (i * 2)) & 0x3; in vivid_detect_feature_set()
967 dev->input_name_counter[i] = in_type_counter[dev->input_type[i]]++; in vivid_detect_feature_set()
969 dev->has_audio_inputs = in_type_counter[TV] && in_type_counter[SVID]; in vivid_detect_feature_set()
972 in_type_counter[HDMI]--; in vivid_detect_feature_set()
973 dev->num_inputs--; in vivid_detect_feature_set()
975 dev->num_hdmi_inputs = in_type_counter[HDMI]; in vivid_detect_feature_set()
976 dev->num_svid_inputs = in_type_counter[SVID]; in vivid_detect_feature_set()
979 dev->num_outputs = num_outputs[inst]; in vivid_detect_feature_set()
981 if (dev->num_outputs < 1) in vivid_detect_feature_set()
982 dev->num_outputs = 1; in vivid_detect_feature_set()
984 dev->num_outputs = 0; in vivid_detect_feature_set()
986 if (dev->num_outputs >= MAX_OUTPUTS) in vivid_detect_feature_set()
987 dev->num_outputs = MAX_OUTPUTS; in vivid_detect_feature_set()
988 for (i = 0; i < dev->num_outputs; i++) { in vivid_detect_feature_set()
989 dev->output_type[i] = ((output_types[inst] >> i) & 1) ? HDMI : SVID; in vivid_detect_feature_set()
990 dev->output_name_counter[i] = out_type_counter[dev->output_type[i]]++; in vivid_detect_feature_set()
992 dev->has_audio_outputs = out_type_counter[SVID]; in vivid_detect_feature_set()
999 out_type_counter[HDMI]--; in vivid_detect_feature_set()
1000 dev->num_outputs--; in vivid_detect_feature_set()
1002 dev->num_hdmi_outputs = out_type_counter[HDMI]; in vivid_detect_feature_set()
1005 dev->has_vid_cap = node_type & 0x0001; in vivid_detect_feature_set()
1009 dev->has_raw_vbi_cap = node_type & 0x0004; in vivid_detect_feature_set()
1010 dev->has_sliced_vbi_cap = node_type & 0x0008; in vivid_detect_feature_set()
1011 dev->has_vbi_cap = dev->has_raw_vbi_cap | dev->has_sliced_vbi_cap; in vivid_detect_feature_set()
1015 dev->has_meta_cap = node_type & 0x20000; in vivid_detect_feature_set()
1019 !dev->has_vid_cap && !dev->has_meta_cap) { in vivid_detect_feature_set()
1020 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
1022 return -EINVAL; in vivid_detect_feature_set()
1025 !dev->has_vid_cap && !dev->has_vbi_cap && !dev->has_meta_cap) { in vivid_detect_feature_set()
1026 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
1027 "TV or S-Video input without video, VBI or metadata nodes\n"); in vivid_detect_feature_set()
1028 return -EINVAL; in vivid_detect_feature_set()
1032 dev->has_vid_out = node_type & 0x0100; in vivid_detect_feature_set()
1036 dev->has_raw_vbi_out = node_type & 0x0400; in vivid_detect_feature_set()
1037 dev->has_sliced_vbi_out = node_type & 0x0800; in vivid_detect_feature_set()
1038 dev->has_vbi_out = dev->has_raw_vbi_out | dev->has_sliced_vbi_out; in vivid_detect_feature_set()
1042 dev->has_meta_out = node_type & 0x40000; in vivid_detect_feature_set()
1046 !dev->has_vid_out && !dev->has_vbi_out && !dev->has_meta_out) { in vivid_detect_feature_set()
1047 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
1048 "S-Video output without video, VBI or metadata nodes\n"); in vivid_detect_feature_set()
1049 return -EINVAL; in vivid_detect_feature_set()
1051 if (out_type_counter[HDMI] && !dev->has_vid_out && !dev->has_meta_out) { in vivid_detect_feature_set()
1052 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
1054 return -EINVAL; in vivid_detect_feature_set()
1058 dev->has_radio_rx = node_type & 0x0010; in vivid_detect_feature_set()
1061 dev->has_radio_tx = node_type & 0x1000; in vivid_detect_feature_set()
1064 dev->has_sdr_cap = node_type & 0x0020; in vivid_detect_feature_set()
1067 dev->has_tv_tuner = in_type_counter[TV]; in vivid_detect_feature_set()
1070 *has_tuner = ((dev->has_vid_cap || dev->has_vbi_cap) && in_type_counter[TV]) || in vivid_detect_feature_set()
1071 dev->has_radio_rx || dev->has_sdr_cap; in vivid_detect_feature_set()
1073 /* do we have a modulator? */ in vivid_detect_feature_set()
1074 *has_modulator = dev->has_radio_tx; in vivid_detect_feature_set()
1077 if (dev->has_vid_cap) in vivid_detect_feature_set()
1079 dev->has_fb = node_type & 0x10000; in vivid_detect_feature_set()
1083 if (no_error_inj && *ccs_cap == -1) in vivid_detect_feature_set()
1086 /* if ccs_cap == -1, then the user can select it using controls */ in vivid_detect_feature_set()
1087 if (*ccs_cap != -1) { in vivid_detect_feature_set()
1088 dev->has_crop_cap = *ccs_cap & 1; in vivid_detect_feature_set()
1089 dev->has_compose_cap = *ccs_cap & 2; in vivid_detect_feature_set()
1090 dev->has_scaler_cap = *ccs_cap & 4; in vivid_detect_feature_set()
1091 v4l2_info(&dev->v4l2_dev, "Capture Crop: %c Compose: %c Scaler: %c\n", in vivid_detect_feature_set()
1092 dev->has_crop_cap ? 'Y' : 'N', in vivid_detect_feature_set()
1093 dev->has_compose_cap ? 'Y' : 'N', in vivid_detect_feature_set()
1094 dev->has_scaler_cap ? 'Y' : 'N'); in vivid_detect_feature_set()
1098 if (no_error_inj && *ccs_out == -1) in vivid_detect_feature_set()
1101 /* if ccs_out == -1, then the user can select it using controls */ in vivid_detect_feature_set()
1102 if (*ccs_out != -1) { in vivid_detect_feature_set()
1103 dev->has_crop_out = *ccs_out & 1; in vivid_detect_feature_set()
1104 dev->has_compose_out = *ccs_out & 2; in vivid_detect_feature_set()
1105 dev->has_scaler_out = *ccs_out & 4; in vivid_detect_feature_set()
1106 v4l2_info(&dev->v4l2_dev, "Output Crop: %c Compose: %c Scaler: %c\n", in vivid_detect_feature_set()
1107 dev->has_crop_out ? 'Y' : 'N', in vivid_detect_feature_set()
1108 dev->has_compose_out ? 'Y' : 'N', in vivid_detect_feature_set()
1109 dev->has_scaler_out ? 'Y' : 'N'); in vivid_detect_feature_set()
1113 dev->has_touch_cap = node_type & 0x80000; in vivid_detect_feature_set()
1120 if (dev->has_vid_cap) { in vivid_set_capabilities()
1122 dev->vid_cap_caps = dev->multiplanar ? in vivid_set_capabilities()
1125 dev->vid_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1126 if (dev->has_audio_inputs) in vivid_set_capabilities()
1127 dev->vid_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1128 if (dev->has_tv_tuner) in vivid_set_capabilities()
1129 dev->vid_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1131 if (dev->has_vid_out) { in vivid_set_capabilities()
1133 dev->vid_out_caps = dev->multiplanar ? in vivid_set_capabilities()
1136 if (dev->has_fb) in vivid_set_capabilities()
1137 dev->vid_out_caps |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY; in vivid_set_capabilities()
1138 dev->vid_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1139 if (dev->has_audio_outputs) in vivid_set_capabilities()
1140 dev->vid_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1142 if (dev->has_vbi_cap) { in vivid_set_capabilities()
1144 dev->vbi_cap_caps = (dev->has_raw_vbi_cap ? V4L2_CAP_VBI_CAPTURE : 0) | in vivid_set_capabilities()
1145 (dev->has_sliced_vbi_cap ? V4L2_CAP_SLICED_VBI_CAPTURE : 0); in vivid_set_capabilities()
1146 dev->vbi_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1147 if (dev->has_audio_inputs) in vivid_set_capabilities()
1148 dev->vbi_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1149 if (dev->has_tv_tuner) in vivid_set_capabilities()
1150 dev->vbi_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1152 if (dev->has_vbi_out) { in vivid_set_capabilities()
1154 dev->vbi_out_caps = (dev->has_raw_vbi_out ? V4L2_CAP_VBI_OUTPUT : 0) | in vivid_set_capabilities()
1155 (dev->has_sliced_vbi_out ? V4L2_CAP_SLICED_VBI_OUTPUT : 0); in vivid_set_capabilities()
1156 dev->vbi_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1157 if (dev->has_audio_outputs) in vivid_set_capabilities()
1158 dev->vbi_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1160 if (dev->has_sdr_cap) { in vivid_set_capabilities()
1162 dev->sdr_cap_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER; in vivid_set_capabilities()
1163 dev->sdr_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1166 if (dev->has_radio_rx) in vivid_set_capabilities()
1167 dev->radio_rx_caps = V4L2_CAP_RADIO | V4L2_CAP_RDS_CAPTURE | in vivid_set_capabilities()
1171 if (dev->has_radio_tx) in vivid_set_capabilities()
1172 dev->radio_tx_caps = V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR | in vivid_set_capabilities()
1176 if (dev->has_meta_cap) { in vivid_set_capabilities()
1177 dev->meta_cap_caps = V4L2_CAP_META_CAPTURE | in vivid_set_capabilities()
1179 if (dev->has_audio_inputs) in vivid_set_capabilities()
1180 dev->meta_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1181 if (dev->has_tv_tuner) in vivid_set_capabilities()
1182 dev->meta_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1185 if (dev->has_meta_out) { in vivid_set_capabilities()
1186 dev->meta_out_caps = V4L2_CAP_META_OUTPUT | in vivid_set_capabilities()
1188 if (dev->has_audio_outputs) in vivid_set_capabilities()
1189 dev->meta_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1192 if (dev->has_touch_cap) { in vivid_set_capabilities()
1193 dev->touch_cap_caps = V4L2_CAP_TOUCH | V4L2_CAP_STREAMING | in vivid_set_capabilities()
1195 dev->touch_cap_caps |= dev->multiplanar ? in vivid_set_capabilities()
1207 if (!dev->has_audio_inputs) { in vivid_disable_unused_ioctls()
1208 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1209 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1210 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1211 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1212 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1213 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1214 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1215 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1216 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1218 if (!dev->has_audio_outputs) { in vivid_disable_unused_ioctls()
1219 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1220 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1221 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1222 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1223 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1224 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1225 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1226 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1227 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1230 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_STD); in vivid_disable_unused_ioctls()
1231 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_STD); in vivid_disable_unused_ioctls()
1232 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMSTD); in vivid_disable_unused_ioctls()
1233 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERYSTD); in vivid_disable_unused_ioctls()
1236 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_STD); in vivid_disable_unused_ioctls()
1237 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_STD); in vivid_disable_unused_ioctls()
1238 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMSTD); in vivid_disable_unused_ioctls()
1241 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1242 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1243 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1244 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1245 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1246 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1249 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1250 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1251 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1252 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1253 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1254 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1257 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_EDID); in vivid_disable_unused_ioctls()
1258 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_EDID); in vivid_disable_unused_ioctls()
1259 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_DV_TIMINGS_CAP); in vivid_disable_unused_ioctls()
1260 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_DV_TIMINGS); in vivid_disable_unused_ioctls()
1261 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_DV_TIMINGS); in vivid_disable_unused_ioctls()
1262 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUM_DV_TIMINGS); in vivid_disable_unused_ioctls()
1263 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERY_DV_TIMINGS); in vivid_disable_unused_ioctls()
1266 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_EDID); in vivid_disable_unused_ioctls()
1267 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_DV_TIMINGS_CAP); in vivid_disable_unused_ioctls()
1268 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_DV_TIMINGS); in vivid_disable_unused_ioctls()
1269 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_DV_TIMINGS); in vivid_disable_unused_ioctls()
1270 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_DV_TIMINGS); in vivid_disable_unused_ioctls()
1272 if (!dev->has_fb) { in vivid_disable_unused_ioctls()
1273 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FBUF); in vivid_disable_unused_ioctls()
1274 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FBUF); in vivid_disable_unused_ioctls()
1275 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_OVERLAY); in vivid_disable_unused_ioctls()
1277 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1278 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1279 v4l2_disable_ioctl(&dev->sdr_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1280 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1281 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1282 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1283 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMESIZES); in vivid_disable_unused_ioctls()
1284 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMEINTERVALS); in vivid_disable_unused_ioctls()
1285 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1286 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1287 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1288 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1289 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_S_PARM); in vivid_disable_unused_ioctls()
1290 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMESIZES); in vivid_disable_unused_ioctls()
1291 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMEINTERVALS); in vivid_disable_unused_ioctls()
1298 while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width) in vivid_init_dv_timings()
1299 dev->query_dv_timings_size++; in vivid_init_dv_timings()
1305 dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size, in vivid_init_dv_timings()
1311 dev->query_dv_timings_qmenu_strings = in vivid_init_dv_timings()
1312 kmalloc_array(dev->query_dv_timings_size, 32, GFP_KERNEL); in vivid_init_dv_timings()
1314 if (!dev->query_dv_timings_qmenu || in vivid_init_dv_timings()
1315 !dev->query_dv_timings_qmenu_strings) in vivid_init_dv_timings()
1316 return -ENOMEM; in vivid_init_dv_timings()
1318 for (i = 0; i < dev->query_dv_timings_size; i++) { in vivid_init_dv_timings()
1320 char *p = dev->query_dv_timings_qmenu_strings + i * 32; in vivid_init_dv_timings()
1323 dev->query_dv_timings_qmenu[i] = p; in vivid_init_dv_timings()
1328 bt->width, bt->height, bt->interlaced ? "i" : "p", in vivid_init_dv_timings()
1329 (u32)bt->pixelclock / (htot * vtot)); in vivid_init_dv_timings()
1340 if (dev->has_vid_cap) { in vivid_create_queues()
1342 ret = vivid_create_queue(dev, &dev->vb_vid_cap_q, in vivid_create_queues()
1349 if (dev->has_vid_out) { in vivid_create_queues()
1351 ret = vivid_create_queue(dev, &dev->vb_vid_out_q, in vivid_create_queues()
1358 if (dev->has_vbi_cap) { in vivid_create_queues()
1360 ret = vivid_create_queue(dev, &dev->vb_vbi_cap_q, in vivid_create_queues()
1367 if (dev->has_vbi_out) { in vivid_create_queues()
1369 ret = vivid_create_queue(dev, &dev->vb_vbi_out_q, in vivid_create_queues()
1376 if (dev->has_sdr_cap) { in vivid_create_queues()
1378 ret = vivid_create_queue(dev, &dev->vb_sdr_cap_q, in vivid_create_queues()
1385 if (dev->has_meta_cap) { in vivid_create_queues()
1387 ret = vivid_create_queue(dev, &dev->vb_meta_cap_q, in vivid_create_queues()
1394 if (dev->has_meta_out) { in vivid_create_queues()
1396 ret = vivid_create_queue(dev, &dev->vb_meta_out_q, in vivid_create_queues()
1403 if (dev->has_touch_cap) { in vivid_create_queues()
1405 ret = vivid_create_queue(dev, &dev->vb_touch_cap_q, in vivid_create_queues()
1412 if (dev->has_fb) { in vivid_create_queues()
1431 if (dev->has_vid_cap) { in vivid_create_devnodes()
1432 vfd = &dev->vid_cap_dev; in vivid_create_devnodes()
1433 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1434 "vivid-%03d-vid-cap", inst); in vivid_create_devnodes()
1435 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1436 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1437 vfd->device_caps = dev->vid_cap_caps; in vivid_create_devnodes()
1438 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1439 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1440 vfd->queue = &dev->vb_vid_cap_q; in vivid_create_devnodes()
1441 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1447 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1451 dev->vid_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1452 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_cap_pad); in vivid_create_devnodes()
1459 ret = cec_register_adapter(dev->cec_rx_adap, &pdev->dev); in vivid_create_devnodes()
1461 cec_delete_adapter(dev->cec_rx_adap); in vivid_create_devnodes()
1462 dev->cec_rx_adap = NULL; in vivid_create_devnodes()
1465 cec_s_phys_addr(dev->cec_rx_adap, 0, false); in vivid_create_devnodes()
1466 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI input\n", in vivid_create_devnodes()
1467 dev_name(&dev->cec_rx_adap->devnode.dev)); in vivid_create_devnodes()
1474 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n", in vivid_create_devnodes()
1478 if (dev->has_vid_out) { in vivid_create_devnodes()
1482 vfd = &dev->vid_out_dev; in vivid_create_devnodes()
1483 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1484 "vivid-%03d-vid-out", inst); in vivid_create_devnodes()
1485 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1486 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1487 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1488 vfd->device_caps = dev->vid_out_caps; in vivid_create_devnodes()
1489 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1490 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1491 vfd->queue = &dev->vb_vid_out_q; in vivid_create_devnodes()
1492 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1498 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1502 dev->vid_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1503 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_out_pad); in vivid_create_devnodes()
1509 for (i = 0; i < dev->num_hdmi_outputs; i++) { in vivid_create_devnodes()
1510 ret = cec_register_adapter(dev->cec_tx_adap[i], &pdev->dev); in vivid_create_devnodes()
1512 for (; i >= 0; i--) { in vivid_create_devnodes()
1513 cec_delete_adapter(dev->cec_tx_adap[i]); in vivid_create_devnodes()
1514 dev->cec_tx_adap[i] = NULL; in vivid_create_devnodes()
1518 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI output %d\n", in vivid_create_devnodes()
1519 dev_name(&dev->cec_tx_adap[i]->devnode.dev), i); in vivid_create_devnodes()
1526 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s\n", in vivid_create_devnodes()
1530 if (dev->has_vbi_cap) { in vivid_create_devnodes()
1531 vfd = &dev->vbi_cap_dev; in vivid_create_devnodes()
1532 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1533 "vivid-%03d-vbi-cap", inst); in vivid_create_devnodes()
1534 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1535 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1536 vfd->device_caps = dev->vbi_cap_caps; in vivid_create_devnodes()
1537 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1538 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1539 vfd->queue = &dev->vb_vbi_cap_q; in vivid_create_devnodes()
1540 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1541 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1545 dev->vbi_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1546 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_cap_pad); in vivid_create_devnodes()
1554 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s, supports %s VBI\n", in vivid_create_devnodes()
1556 (dev->has_raw_vbi_cap && dev->has_sliced_vbi_cap) ? in vivid_create_devnodes()
1558 (dev->has_raw_vbi_cap ? "raw" : "sliced")); in vivid_create_devnodes()
1561 if (dev->has_vbi_out) { in vivid_create_devnodes()
1562 vfd = &dev->vbi_out_dev; in vivid_create_devnodes()
1563 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1564 "vivid-%03d-vbi-out", inst); in vivid_create_devnodes()
1565 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1566 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1567 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1568 vfd->device_caps = dev->vbi_out_caps; in vivid_create_devnodes()
1569 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1570 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1571 vfd->queue = &dev->vb_vbi_out_q; in vivid_create_devnodes()
1572 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1573 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1577 dev->vbi_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1578 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_out_pad); in vivid_create_devnodes()
1586 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, supports %s VBI\n", in vivid_create_devnodes()
1588 (dev->has_raw_vbi_out && dev->has_sliced_vbi_out) ? in vivid_create_devnodes()
1590 (dev->has_raw_vbi_out ? "raw" : "sliced")); in vivid_create_devnodes()
1593 if (dev->has_sdr_cap) { in vivid_create_devnodes()
1594 vfd = &dev->sdr_cap_dev; in vivid_create_devnodes()
1595 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1596 "vivid-%03d-sdr-cap", inst); in vivid_create_devnodes()
1597 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1598 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1599 vfd->device_caps = dev->sdr_cap_caps; in vivid_create_devnodes()
1600 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1601 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1602 vfd->queue = &dev->vb_sdr_cap_q; in vivid_create_devnodes()
1603 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1607 dev->sdr_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1608 ret = media_entity_pads_init(&vfd->entity, 1, &dev->sdr_cap_pad); in vivid_create_devnodes()
1616 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n", in vivid_create_devnodes()
1620 if (dev->has_radio_rx) { in vivid_create_devnodes()
1621 vfd = &dev->radio_rx_dev; in vivid_create_devnodes()
1622 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1623 "vivid-%03d-rad-rx", inst); in vivid_create_devnodes()
1624 vfd->fops = &vivid_radio_fops; in vivid_create_devnodes()
1625 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1626 vfd->device_caps = dev->radio_rx_caps; in vivid_create_devnodes()
1627 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1628 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1629 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1635 v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as %s\n", in vivid_create_devnodes()
1639 if (dev->has_radio_tx) { in vivid_create_devnodes()
1640 vfd = &dev->radio_tx_dev; in vivid_create_devnodes()
1641 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1642 "vivid-%03d-rad-tx", inst); in vivid_create_devnodes()
1643 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1644 vfd->fops = &vivid_radio_fops; in vivid_create_devnodes()
1645 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1646 vfd->device_caps = dev->radio_tx_caps; in vivid_create_devnodes()
1647 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1648 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1649 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1655 v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered as %s\n", in vivid_create_devnodes()
1659 if (dev->has_meta_cap) { in vivid_create_devnodes()
1660 vfd = &dev->meta_cap_dev; in vivid_create_devnodes()
1661 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1662 "vivid-%03d-meta-cap", inst); in vivid_create_devnodes()
1663 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1664 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1665 vfd->device_caps = dev->meta_cap_caps; in vivid_create_devnodes()
1666 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1667 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1668 vfd->queue = &dev->vb_meta_cap_q; in vivid_create_devnodes()
1669 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1670 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1673 dev->meta_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1674 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1675 &dev->meta_cap_pad); in vivid_create_devnodes()
1683 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1688 if (dev->has_meta_out) { in vivid_create_devnodes()
1689 vfd = &dev->meta_out_dev; in vivid_create_devnodes()
1690 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1691 "vivid-%03d-meta-out", inst); in vivid_create_devnodes()
1692 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1693 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1694 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1695 vfd->device_caps = dev->meta_out_caps; in vivid_create_devnodes()
1696 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1697 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1698 vfd->queue = &dev->vb_meta_out_q; in vivid_create_devnodes()
1699 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1700 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1703 dev->meta_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1704 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1705 &dev->meta_out_pad); in vivid_create_devnodes()
1713 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1718 if (dev->has_touch_cap) { in vivid_create_devnodes()
1719 vfd = &dev->touch_cap_dev; in vivid_create_devnodes()
1720 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1721 "vivid-%03d-touch-cap", inst); in vivid_create_devnodes()
1722 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1723 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1724 vfd->device_caps = dev->touch_cap_caps; in vivid_create_devnodes()
1725 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1726 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1727 vfd->queue = &dev->vb_touch_cap_q; in vivid_create_devnodes()
1728 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1729 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1732 dev->touch_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1733 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1734 &dev->touch_cap_pad); in vivid_create_devnodes()
1742 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1749 ret = media_device_register(&dev->mdev); in vivid_create_devnodes()
1751 dev_err(dev->mdev.dev, in vivid_create_devnodes()
1772 for (int j = 0; j < vivid_devs[i]->num_hdmi_inputs; j++) { in update_hdmi_ctrls_work_handler()
1773 struct v4l2_ctrl *c = vivid_devs[i]->ctrl_hdmi_to_output[j]; in update_hdmi_ctrls_work_handler()
1775 v4l2_ctrl_modify_range(c, c->minimum, c->maximum, in update_hdmi_ctrls_work_handler()
1776 skip_mask & ~(1ULL << c->cur.val), in update_hdmi_ctrls_work_handler()
1777 c->default_value); in update_hdmi_ctrls_work_handler()
1790 for (int j = 0; j < vivid_devs[i]->num_svid_inputs; j++) { in update_svid_ctrls_work_handler()
1791 struct v4l2_ctrl *c = vivid_devs[i]->ctrl_svid_to_output[j]; in update_svid_ctrls_work_handler()
1793 v4l2_ctrl_modify_range(c, c->minimum, c->maximum, in update_svid_ctrls_work_handler()
1794 skip_mask & ~(1ULL << c->cur.val), in update_svid_ctrls_work_handler()
1795 c->default_value); in update_svid_ctrls_work_handler()
1819 return -ENOMEM; in vivid_create_instance()
1821 dev->inst = inst; in vivid_create_instance()
1824 dev->v4l2_dev.mdev = &dev->mdev; in vivid_create_instance()
1827 strscpy(dev->mdev.model, VIVID_MODULE_NAME, sizeof(dev->mdev.model)); in vivid_create_instance()
1828 snprintf(dev->mdev.bus_info, sizeof(dev->mdev.bus_info), in vivid_create_instance()
1829 "platform:%s-%03d", VIVID_MODULE_NAME, inst); in vivid_create_instance()
1830 dev->mdev.dev = &pdev->dev; in vivid_create_instance()
1831 media_device_init(&dev->mdev); in vivid_create_instance()
1832 dev->mdev.ops = &vivid_media_ops; in vivid_create_instance()
1836 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), in vivid_create_instance()
1837 "%s-%03d", VIVID_MODULE_NAME, inst); in vivid_create_instance()
1838 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); in vivid_create_instance()
1843 dev->v4l2_dev.release = vivid_dev_release; in vivid_create_instance()
1854 ret = -ENOMEM; in vivid_create_instance()
1856 tpg_init(&dev->tpg, 640, 360); in vivid_create_instance()
1857 if (tpg_alloc(&dev->tpg, array_size(MAX_WIDTH, MAX_ZOOM))) in vivid_create_instance()
1859 dev->scaled_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM)); in vivid_create_instance()
1860 if (!dev->scaled_line) in vivid_create_instance()
1862 dev->blended_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM)); in vivid_create_instance()
1863 if (!dev->blended_line) in vivid_create_instance()
1867 dev->edid = vmalloc(array_size(256, 128)); in vivid_create_instance()
1868 if (!dev->edid) in vivid_create_instance()
1879 dev->fmt_cap = &vivid_formats[0]; in vivid_create_instance()
1880 dev->fmt_out = &vivid_formats[0]; in vivid_create_instance()
1881 if (!dev->multiplanar) in vivid_create_instance()
1883 dev->webcam_size_idx = 1; in vivid_create_instance()
1884 dev->webcam_ival_idx = 3; in vivid_create_instance()
1885 tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc); in vivid_create_instance()
1886 dev->std_out = V4L2_STD_PAL; in vivid_create_instance()
1887 if (dev->input_type[0] == TV || dev->input_type[0] == SVID) in vivid_create_instance()
1889 if (dev->output_type[0] == SVID) in vivid_create_instance()
1892 dev->dv_timings_cap[i] = def_dv_timings; in vivid_create_instance()
1893 dev->std_cap[i] = V4L2_STD_PAL; in vivid_create_instance()
1895 dev->dv_timings_out = def_dv_timings; in vivid_create_instance()
1896 dev->tv_freq = 2804 /* 175.25 * 16 */; in vivid_create_instance()
1897 dev->tv_audmode = V4L2_TUNER_MODE_STEREO; in vivid_create_instance()
1898 dev->tv_field_cap = V4L2_FIELD_INTERLACED; in vivid_create_instance()
1899 dev->tv_field_out = V4L2_FIELD_INTERLACED; in vivid_create_instance()
1900 dev->radio_rx_freq = 95000 * 16; in vivid_create_instance()
1901 dev->radio_rx_audmode = V4L2_TUNER_MODE_STEREO; in vivid_create_instance()
1902 if (dev->has_radio_tx) { in vivid_create_instance()
1903 dev->radio_tx_freq = 95500 * 16; in vivid_create_instance()
1904 dev->radio_rds_loop = false; in vivid_create_instance()
1906 dev->radio_tx_subchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_RDS; in vivid_create_instance()
1907 dev->sdr_adc_freq = 300000; in vivid_create_instance()
1908 dev->sdr_fm_freq = 50000000; in vivid_create_instance()
1909 dev->sdr_pixelformat = V4L2_SDR_FMT_CU8; in vivid_create_instance()
1910 dev->sdr_buffersize = SDR_CAP_SAMPLES_PER_BUF * 2; in vivid_create_instance()
1912 dev->edid_max_blocks = dev->edid_blocks = 2; in vivid_create_instance()
1913 memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid)); in vivid_create_instance()
1914 dev->radio_rds_init_time = ktime_get(); in vivid_create_instance()
1915 INIT_WORK(&dev->update_hdmi_ctrl_work, update_hdmi_ctrls_work_handler); in vivid_create_instance()
1916 INIT_WORK(&dev->update_svid_ctrl_work, update_svid_ctrls_work_handler); in vivid_create_instance()
1917 for (int j = 0, k = 0; j < dev->num_inputs; ++j) in vivid_create_instance()
1918 if (dev->input_type[j] == HDMI) in vivid_create_instance()
1919 dev->hdmi_index_to_input_index[k++] = j; in vivid_create_instance()
1920 for (int j = 0, k = 0; j < dev->num_outputs; ++j) in vivid_create_instance()
1921 if (dev->output_type[j] == HDMI) { in vivid_create_instance()
1922 dev->output_to_iface_index[j] = k; in vivid_create_instance()
1923 dev->hdmi_index_to_output_index[k++] = j; in vivid_create_instance()
1925 for (int j = 0, k = 0; j < dev->num_inputs; ++j) in vivid_create_instance()
1926 if (dev->input_type[j] == SVID) in vivid_create_instance()
1927 dev->svid_index_to_input_index[k++] = j; in vivid_create_instance()
1928 for (int j = 0, k = 0; j < dev->num_outputs; ++j) in vivid_create_instance()
1929 if (dev->output_type[j] == SVID) in vivid_create_instance()
1930 dev->output_to_iface_index[j] = k++; in vivid_create_instance()
1933 ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj, in vivid_create_instance()
1941 if (dev->num_inputs && dev->input_type[0] != HDMI) { in vivid_create_instance()
1942 v4l2_ctrl_activate(dev->ctrl_dv_timings_signal_mode, false); in vivid_create_instance()
1943 v4l2_ctrl_activate(dev->ctrl_dv_timings, false); in vivid_create_instance()
1944 } else if (dev->num_inputs && dev->input_type[0] == HDMI) { in vivid_create_instance()
1945 v4l2_ctrl_activate(dev->ctrl_std_signal_mode, false); in vivid_create_instance()
1946 v4l2_ctrl_activate(dev->ctrl_standard, false); in vivid_create_instance()
1957 dev->timeperframe_tch_cap.numerator = 1; in vivid_create_instance()
1958 dev->timeperframe_tch_cap.denominator = 10; in vivid_create_instance()
1962 spin_lock_init(&dev->slock); in vivid_create_instance()
1963 mutex_init(&dev->mutex); in vivid_create_instance()
1966 INIT_LIST_HEAD(&dev->vid_cap_active); in vivid_create_instance()
1967 INIT_LIST_HEAD(&dev->vid_out_active); in vivid_create_instance()
1968 INIT_LIST_HEAD(&dev->vbi_cap_active); in vivid_create_instance()
1969 INIT_LIST_HEAD(&dev->vbi_out_active); in vivid_create_instance()
1970 INIT_LIST_HEAD(&dev->sdr_cap_active); in vivid_create_instance()
1971 INIT_LIST_HEAD(&dev->meta_cap_active); in vivid_create_instance()
1972 INIT_LIST_HEAD(&dev->meta_out_active); in vivid_create_instance()
1973 INIT_LIST_HEAD(&dev->touch_cap_active); in vivid_create_instance()
1975 spin_lock_init(&dev->cec_xfers_slock); in vivid_create_instance()
1978 dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in vivid_create_instance()
1985 if (dev->has_vid_cap && in_type_counter[HDMI]) { in vivid_create_instance()
1992 dev->cec_rx_adap = adap; in vivid_create_instance()
1995 if (dev->has_vid_out) { in vivid_create_instance()
1998 for (i = j = 0; i < dev->num_outputs; i++) { in vivid_create_instance()
2001 if (dev->output_type[i] != HDMI) in vivid_create_instance()
2007 while (j--) in vivid_create_instance()
2008 cec_delete_adapter(dev->cec_tx_adap[j]); in vivid_create_instance()
2012 dev->cec_tx_adap[j++] = adap; in vivid_create_instance()
2016 if (dev->cec_rx_adap || dev->num_hdmi_outputs) { in vivid_create_instance()
2017 init_waitqueue_head(&dev->kthread_waitq_cec); in vivid_create_instance()
2018 dev->kthread_cec = kthread_run(vivid_cec_bus_thread, dev, in vivid_create_instance()
2019 "vivid_cec-%s", dev->v4l2_dev.name); in vivid_create_instance()
2020 if (IS_ERR(dev->kthread_cec)) { in vivid_create_instance()
2021 ret = PTR_ERR(dev->kthread_cec); in vivid_create_instance()
2022 dev->kthread_cec = NULL; in vivid_create_instance()
2023 v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n"); in vivid_create_instance()
2030 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap); in vivid_create_instance()
2031 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out); in vivid_create_instance()
2032 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_cap); in vivid_create_instance()
2033 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_out); in vivid_create_instance()
2034 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_rx); in vivid_create_instance()
2035 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_tx); in vivid_create_instance()
2036 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_sdr_cap); in vivid_create_instance()
2037 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_cap); in vivid_create_instance()
2038 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_out); in vivid_create_instance()
2039 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_touch_cap); in vivid_create_instance()
2054 vb2_video_unregister_device(&dev->touch_cap_dev); in vivid_create_instance()
2055 vb2_video_unregister_device(&dev->meta_out_dev); in vivid_create_instance()
2056 vb2_video_unregister_device(&dev->meta_cap_dev); in vivid_create_instance()
2057 video_unregister_device(&dev->radio_tx_dev); in vivid_create_instance()
2058 video_unregister_device(&dev->radio_rx_dev); in vivid_create_instance()
2059 vb2_video_unregister_device(&dev->sdr_cap_dev); in vivid_create_instance()
2060 vb2_video_unregister_device(&dev->vbi_out_dev); in vivid_create_instance()
2061 vb2_video_unregister_device(&dev->vbi_cap_dev); in vivid_create_instance()
2062 vb2_video_unregister_device(&dev->vid_out_dev); in vivid_create_instance()
2063 vb2_video_unregister_device(&dev->vid_cap_dev); in vivid_create_instance()
2064 cec_unregister_adapter(dev->cec_rx_adap); in vivid_create_instance()
2066 cec_unregister_adapter(dev->cec_tx_adap[i]); in vivid_create_instance()
2067 if (dev->kthread_cec) in vivid_create_instance()
2068 kthread_stop(dev->kthread_cec); in vivid_create_instance()
2070 v4l2_device_put(&dev->v4l2_dev); in vivid_create_instance()
2087 return -ENODEV; in vivid_probe()
2090 tpg_set_font(font->data); in vivid_probe()
2119 if (!dev->has_vid_out) in vivid_probe()
2121 for (int j = 0; j < dev->num_outputs && hdmi_count < MAX_MENU_ITEMS; ++j) { in vivid_probe()
2122 if (dev->output_type[j] == HDMI) { in vivid_probe()
2127 for (int j = 0; j < dev->num_outputs && svid_count < MAX_MENU_ITEMS; ++j) { in vivid_probe()
2128 if (dev->output_type[j] == SVID) { in vivid_probe()
2137 for (int j = 0; j < vivid_devs[i]->num_hdmi_inputs; j++) { in vivid_probe()
2138 struct v4l2_ctrl *c = vivid_devs[i]->ctrl_hdmi_to_output[j]; in vivid_probe()
2140 v4l2_ctrl_modify_range(c, c->minimum, hdmi_count - 1, 0, c->default_value); in vivid_probe()
2142 for (int j = 0; j < vivid_devs[i]->num_svid_inputs; j++) { in vivid_probe()
2143 struct v4l2_ctrl *c = vivid_devs[i]->ctrl_svid_to_output[j]; in vivid_probe()
2145 v4l2_ctrl_modify_range(c, c->minimum, svid_count - 1, 0, c->default_value); in vivid_probe()
2161 if (dev->disconnect_error) in vivid_remove()
2164 media_device_unregister(&dev->mdev); in vivid_remove()
2167 if (dev->has_vid_cap) { in vivid_remove()
2168 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2169 video_device_node_name(&dev->vid_cap_dev)); in vivid_remove()
2170 vb2_video_unregister_device(&dev->vid_cap_dev); in vivid_remove()
2172 if (dev->has_vid_out) { in vivid_remove()
2173 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2174 video_device_node_name(&dev->vid_out_dev)); in vivid_remove()
2175 vb2_video_unregister_device(&dev->vid_out_dev); in vivid_remove()
2177 if (dev->has_vbi_cap) { in vivid_remove()
2178 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2179 video_device_node_name(&dev->vbi_cap_dev)); in vivid_remove()
2180 vb2_video_unregister_device(&dev->vbi_cap_dev); in vivid_remove()
2182 if (dev->has_vbi_out) { in vivid_remove()
2183 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2184 video_device_node_name(&dev->vbi_out_dev)); in vivid_remove()
2185 vb2_video_unregister_device(&dev->vbi_out_dev); in vivid_remove()
2187 if (dev->has_sdr_cap) { in vivid_remove()
2188 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2189 video_device_node_name(&dev->sdr_cap_dev)); in vivid_remove()
2190 vb2_video_unregister_device(&dev->sdr_cap_dev); in vivid_remove()
2192 if (dev->has_radio_rx) { in vivid_remove()
2193 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2194 video_device_node_name(&dev->radio_rx_dev)); in vivid_remove()
2195 video_unregister_device(&dev->radio_rx_dev); in vivid_remove()
2197 if (dev->has_radio_tx) { in vivid_remove()
2198 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2199 video_device_node_name(&dev->radio_tx_dev)); in vivid_remove()
2200 video_unregister_device(&dev->radio_tx_dev); in vivid_remove()
2202 if (dev->has_fb) in vivid_remove()
2204 if (dev->has_meta_cap) { in vivid_remove()
2205 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2206 video_device_node_name(&dev->meta_cap_dev)); in vivid_remove()
2207 vb2_video_unregister_device(&dev->meta_cap_dev); in vivid_remove()
2209 if (dev->has_meta_out) { in vivid_remove()
2210 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2211 video_device_node_name(&dev->meta_out_dev)); in vivid_remove()
2212 vb2_video_unregister_device(&dev->meta_out_dev); in vivid_remove()
2214 if (dev->has_touch_cap) { in vivid_remove()
2215 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2216 video_device_node_name(&dev->touch_cap_dev)); in vivid_remove()
2217 vb2_video_unregister_device(&dev->touch_cap_dev); in vivid_remove()
2219 cec_unregister_adapter(dev->cec_rx_adap); in vivid_remove()
2221 cec_unregister_adapter(dev->cec_tx_adap[j]); in vivid_remove()
2222 if (dev->kthread_cec) in vivid_remove()
2223 kthread_stop(dev->kthread_cec); in vivid_remove()
2224 v4l2_device_put(&dev->v4l2_dev); in vivid_remove()
2250 int ret = -ENOMEM; in vivid_init()
2271 MAX_STRING_LENGTH, "Output HDMI %03d-%d", in vivid_init()
2284 MAX_STRING_LENGTH, "Output S-Video %03d-%d", in vivid_init()
2301 ret = -ENOMEM; in vivid_init()
2306 ret = -ENOMEM; in vivid_init()