Lines Matching +full:modulator +full:- +full:sel
1 // SPDX-License-Identifier: GPL-2.0-only
3 * vivid-core.c - A Virtual Video Test Driver, core initialization
19 #include <linux/v4l2-dv-timings.h>
20 #include <media/videobuf2-vmalloc.h>
21 #include <media/videobuf2-dma-contig.h>
22 #include <media/v4l2-dv-timings.h>
23 #include <media/v4l2-ioctl.h>
24 #include <media/v4l2-fh.h>
25 #include <media/v4l2-event.h>
27 #include "vivid-core.h"
28 #include "vivid-vid-common.h"
29 #include "vivid-vid-cap.h"
30 #include "vivid-vid-out.h"
31 #include "vivid-radio-common.h"
32 #include "vivid-radio-rx.h"
33 #include "vivid-radio-tx.h"
34 #include "vivid-sdr-cap.h"
35 #include "vivid-vbi-cap.h"
36 #include "vivid-vbi-out.h"
37 #include "vivid-osd.h"
38 #include "vivid-cec.h"
39 #include "vivid-ctrls.h"
40 #include "vivid-meta-cap.h"
41 #include "vivid-meta-out.h"
42 #include "vivid-touch-cap.h"
57 static int vid_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
59 MODULE_PARM_DESC(vid_cap_nr, " videoX start number, -1 is autodetect");
61 static int vid_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
63 MODULE_PARM_DESC(vid_out_nr, " videoX start number, -1 is autodetect");
65 static int vbi_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
67 MODULE_PARM_DESC(vbi_cap_nr, " vbiX start number, -1 is autodetect");
69 static int vbi_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
71 MODULE_PARM_DESC(vbi_out_nr, " vbiX start number, -1 is autodetect");
73 static int sdr_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
75 MODULE_PARM_DESC(sdr_cap_nr, " swradioX start number, -1 is autodetect");
77 static int radio_rx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
79 MODULE_PARM_DESC(radio_rx_nr, " radioX start number, -1 is autodetect");
81 static int radio_tx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
83 MODULE_PARM_DESC(radio_tx_nr, " radioX start number, -1 is autodetect");
85 static int meta_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
87 MODULE_PARM_DESC(meta_cap_nr, " videoX start number, -1 is autodetect");
89 static int meta_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
91 MODULE_PARM_DESC(meta_out_nr, " videoX start number, -1 is autodetect");
93 static int touch_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
95 MODULE_PARM_DESC(touch_cap_nr, " v4l-touchX start number, -1 is autodetect");
97 static int ccs_cap_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
101 "\t\t -1=user-controlled (default)");
103 static int ccs_out_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
107 "\t\t -1=user-controlled (default)");
109 static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 };
114 * Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr +
115 * vbi-out + vid-out + meta-cap
118 [0 ... (VIVID_MAX_DEVS - 1)] = 0xe1d3d
123 "\t\t bit 2-3: VBI Capture node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
127 "\t\t bit 10-11: VBI Output node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
135 static unsigned num_inputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 4 };
140 static unsigned input_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0xe4 };
143 "\t\t bits 0-1 == input 0, bits 31-30 == input 15.\n"
144 "\t\t Type 0 == webcam, 1 == TV, 2 == S-Video, 3 == HDMI");
147 static unsigned num_outputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
152 static unsigned output_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
156 "\t\t Type 0 == S-Video, 1 == HDMI");
166 static unsigned int allocators[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0 };
170 "\t\t 1 == dma-contig");
173 [0 ... (VIVID_MAX_DEVS - 1)] = 0
176 MODULE_PARM_DESC(cache_hints, " user-space cache hints, default is 0.\n"
231 strscpy(cap->driver, "vivid", sizeof(cap->driver)); in vidioc_querycap()
232 strscpy(cap->card, "vivid", sizeof(cap->card)); in vidioc_querycap()
233 snprintf(cap->bus_info, sizeof(cap->bus_info), in vidioc_querycap()
234 "platform:%s", dev->v4l2_dev.name); in vidioc_querycap()
236 cap->capabilities = dev->vid_cap_caps | dev->vid_out_caps | in vidioc_querycap()
237 dev->vbi_cap_caps | dev->vbi_out_caps | in vidioc_querycap()
238 dev->radio_rx_caps | dev->radio_tx_caps | in vidioc_querycap()
239 dev->sdr_cap_caps | dev->meta_cap_caps | in vidioc_querycap()
240 dev->meta_out_caps | dev->touch_cap_caps | in vidioc_querycap()
249 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_hw_freq_seek()
251 return -ENOTTY; in vidioc_s_hw_freq_seek()
258 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_enum_freq_bands()
260 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_enum_freq_bands()
262 return -ENOTTY; in vidioc_enum_freq_bands()
269 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_g_tuner()
271 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_g_tuner()
280 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_tuner()
282 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_s_tuner()
292 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_g_frequency()
294 vdev->vfl_dir == VFL_DIR_RX ? in vidioc_g_frequency()
295 &dev->radio_rx_freq : &dev->radio_tx_freq, vf); in vidioc_g_frequency()
296 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_g_frequency()
306 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_frequency()
308 vdev->vfl_dir == VFL_DIR_RX ? in vidioc_s_frequency()
309 &dev->radio_rx_freq : &dev->radio_tx_freq, vf); in vidioc_s_frequency()
310 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_s_frequency()
319 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_overlay()
328 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_fbuf()
337 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_fbuf()
346 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_std()
355 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_dv_timings()
365 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_pixelaspect()
371 struct v4l2_selection *sel) in vidioc_g_selection() argument
375 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_selection()
376 return vivid_vid_cap_g_selection(file, fh, sel); in vidioc_g_selection()
377 return vivid_vid_out_g_selection(file, fh, sel); in vidioc_g_selection()
381 struct v4l2_selection *sel) in vidioc_s_selection() argument
385 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_selection()
386 return vivid_vid_cap_s_selection(file, fh, sel); in vidioc_s_selection()
387 return vivid_vid_out_s_selection(file, fh, sel); in vidioc_s_selection()
395 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vidioc_g_parm()
397 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_parm()
407 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_parm()
409 return -ENOTTY; in vidioc_s_parm()
418 if (vdev->vfl_dir == VFL_DIR_RX && vdev->vfl_type == VFL_TYPE_VIDEO) in vidioc_log_status()
419 tpg_log_status(&dev->tpg); in vidioc_log_status()
428 if (vdev->vfl_dir == VFL_DIR_TX) in vivid_radio_read()
429 return -EINVAL; in vivid_radio_read()
438 if (vdev->vfl_dir == VFL_DIR_RX) in vivid_radio_write()
439 return -EINVAL; in vivid_radio_write()
447 if (vdev->vfl_dir == VFL_DIR_RX) in vivid_radio_poll()
457 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_enum_input()
466 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_input()
475 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_input()
485 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_enum_fmt_cap()
495 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_fmt_cap()
505 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_try_fmt_cap()
515 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_fmt_cap()
525 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_fmt_cap_mplane()
535 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_try_fmt_cap_mplane()
545 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_fmt_cap_mplane()
555 spin_lock_irqsave(&vdev->fh_lock, flags); in vivid_is_in_use()
556 res = !list_empty(&vdev->fh_list); in vivid_is_in_use()
557 spin_unlock_irqrestore(&vdev->fh_lock, flags); in vivid_is_in_use()
563 unsigned uses = vivid_is_in_use(&dev->vid_cap_dev) + in vivid_is_last_user()
564 vivid_is_in_use(&dev->vid_out_dev) + in vivid_is_last_user()
565 vivid_is_in_use(&dev->vbi_cap_dev) + in vivid_is_last_user()
566 vivid_is_in_use(&dev->vbi_out_dev) + in vivid_is_last_user()
567 vivid_is_in_use(&dev->sdr_cap_dev) + in vivid_is_last_user()
568 vivid_is_in_use(&dev->radio_rx_dev) + in vivid_is_last_user()
569 vivid_is_in_use(&dev->radio_tx_dev) + in vivid_is_last_user()
570 vivid_is_in_use(&dev->meta_cap_dev) + in vivid_is_last_user()
571 vivid_is_in_use(&dev->meta_out_dev) + in vivid_is_last_user()
572 vivid_is_in_use(&dev->touch_cap_dev); in vivid_is_last_user()
582 mutex_lock(&dev->mutex); in vivid_fop_release()
588 * so re-register all video_device's again. in vivid_fop_release()
590 v4l2_info(&dev->v4l2_dev, "reconnect\n"); in vivid_fop_release()
591 set_bit(V4L2_FL_REGISTERED, &dev->vid_cap_dev.flags); in vivid_fop_release()
592 set_bit(V4L2_FL_REGISTERED, &dev->vid_out_dev.flags); in vivid_fop_release()
593 set_bit(V4L2_FL_REGISTERED, &dev->vbi_cap_dev.flags); in vivid_fop_release()
594 set_bit(V4L2_FL_REGISTERED, &dev->vbi_out_dev.flags); in vivid_fop_release()
595 set_bit(V4L2_FL_REGISTERED, &dev->sdr_cap_dev.flags); in vivid_fop_release()
596 set_bit(V4L2_FL_REGISTERED, &dev->radio_rx_dev.flags); in vivid_fop_release()
597 set_bit(V4L2_FL_REGISTERED, &dev->radio_tx_dev.flags); in vivid_fop_release()
598 set_bit(V4L2_FL_REGISTERED, &dev->meta_cap_dev.flags); in vivid_fop_release()
599 set_bit(V4L2_FL_REGISTERED, &dev->meta_out_dev.flags); in vivid_fop_release()
600 set_bit(V4L2_FL_REGISTERED, &dev->touch_cap_dev.flags); in vivid_fop_release()
602 mutex_unlock(&dev->mutex); in vivid_fop_release()
603 if (file->private_data == dev->overlay_cap_owner) in vivid_fop_release()
604 dev->overlay_cap_owner = NULL; in vivid_fop_release()
605 if (file->private_data == dev->radio_rx_rds_owner) { in vivid_fop_release()
606 dev->radio_rx_rds_last_block = 0; in vivid_fop_release()
607 dev->radio_rx_rds_owner = NULL; in vivid_fop_release()
609 if (file->private_data == dev->radio_tx_rds_owner) { in vivid_fop_release()
610 dev->radio_tx_rds_last_block = 0; in vivid_fop_release()
611 dev->radio_tx_rds_owner = NULL; in vivid_fop_release()
613 if (vdev->queue) in vivid_fop_release()
758 /* -----------------------------------------------------------------
760 ------------------------------------------------------------------*/
767 v4l2_device_unregister(&dev->v4l2_dev); in vivid_dev_release()
769 media_device_cleanup(&dev->mdev); in vivid_dev_release()
771 vfree(dev->scaled_line); in vivid_dev_release()
772 vfree(dev->blended_line); in vivid_dev_release()
773 vfree(dev->edid); in vivid_dev_release()
774 vfree(dev->bitmap_cap); in vivid_dev_release()
775 vfree(dev->bitmap_out); in vivid_dev_release()
776 tpg_free(&dev->tpg); in vivid_dev_release()
777 kfree(dev->query_dv_timings_qmenu); in vivid_dev_release()
778 kfree(dev->query_dv_timings_qmenu_strings); in vivid_dev_release()
785 struct vivid_dev *dev = container_of(req->mdev, struct vivid_dev, mdev); in vivid_req_validate()
787 if (dev->req_validate_error) { in vivid_req_validate()
788 dev->req_validate_error = false; in vivid_req_validate()
789 return -EINVAL; in vivid_req_validate()
806 if (buf_type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->multiplanar) in vivid_create_queue()
808 else if (buf_type == V4L2_BUF_TYPE_VIDEO_OUTPUT && dev->multiplanar) in vivid_create_queue()
810 else if (buf_type == V4L2_BUF_TYPE_VBI_CAPTURE && !dev->has_raw_vbi_cap) in vivid_create_queue()
812 else if (buf_type == V4L2_BUF_TYPE_VBI_OUTPUT && !dev->has_raw_vbi_out) in vivid_create_queue()
815 q->type = buf_type; in vivid_create_queue()
816 q->io_modes = VB2_MMAP | VB2_DMABUF; in vivid_create_queue()
817 q->io_modes |= V4L2_TYPE_IS_OUTPUT(buf_type) ? VB2_WRITE : VB2_READ; in vivid_create_queue()
818 if (allocators[dev->inst] != 1) in vivid_create_queue()
819 q->io_modes |= VB2_USERPTR; in vivid_create_queue()
820 q->drv_priv = dev; in vivid_create_queue()
821 q->buf_struct_size = sizeof(struct vivid_buffer); in vivid_create_queue()
822 q->ops = ops; in vivid_create_queue()
823 q->mem_ops = allocators[dev->inst] == 1 ? &vb2_dma_contig_memops : in vivid_create_queue()
825 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in vivid_create_queue()
826 q->min_buffers_needed = min_buffers_needed; in vivid_create_queue()
827 q->lock = &dev->mutex; in vivid_create_queue()
828 q->dev = dev->v4l2_dev.dev; in vivid_create_queue()
829 q->supports_requests = true; in vivid_create_queue()
830 q->allow_cache_hints = (cache_hints[dev->inst] == 1); in vivid_create_queue()
846 /* do we use single- or multi-planar? */ in vivid_detect_feature_set()
847 dev->multiplanar = multiplanar[inst] > 1; in vivid_detect_feature_set()
848 v4l2_info(&dev->v4l2_dev, "using %splanar format API\n", in vivid_detect_feature_set()
849 dev->multiplanar ? "multi" : "single "); in vivid_detect_feature_set()
852 dev->num_inputs = num_inputs[inst]; in vivid_detect_feature_set()
853 if (dev->num_inputs < 1) in vivid_detect_feature_set()
854 dev->num_inputs = 1; in vivid_detect_feature_set()
855 if (dev->num_inputs >= MAX_INPUTS) in vivid_detect_feature_set()
856 dev->num_inputs = MAX_INPUTS; in vivid_detect_feature_set()
857 for (i = 0; i < dev->num_inputs; i++) { in vivid_detect_feature_set()
858 dev->input_type[i] = (input_types[inst] >> (i * 2)) & 0x3; in vivid_detect_feature_set()
859 dev->input_name_counter[i] = in_type_counter[dev->input_type[i]]++; in vivid_detect_feature_set()
861 dev->has_audio_inputs = in_type_counter[TV] && in_type_counter[SVID]; in vivid_detect_feature_set()
864 in_type_counter[HDMI]--; in vivid_detect_feature_set()
865 dev->num_inputs--; in vivid_detect_feature_set()
867 dev->num_hdmi_inputs = in_type_counter[HDMI]; in vivid_detect_feature_set()
870 dev->num_outputs = num_outputs[inst]; in vivid_detect_feature_set()
871 if (dev->num_outputs < 1) in vivid_detect_feature_set()
872 dev->num_outputs = 1; in vivid_detect_feature_set()
873 if (dev->num_outputs >= MAX_OUTPUTS) in vivid_detect_feature_set()
874 dev->num_outputs = MAX_OUTPUTS; in vivid_detect_feature_set()
875 for (i = 0; i < dev->num_outputs; i++) { in vivid_detect_feature_set()
876 dev->output_type[i] = ((output_types[inst] >> i) & 1) ? HDMI : SVID; in vivid_detect_feature_set()
877 dev->output_name_counter[i] = out_type_counter[dev->output_type[i]]++; in vivid_detect_feature_set()
878 dev->display_present[i] = true; in vivid_detect_feature_set()
880 dev->has_audio_outputs = out_type_counter[SVID]; in vivid_detect_feature_set()
887 out_type_counter[HDMI]--; in vivid_detect_feature_set()
888 dev->num_outputs--; in vivid_detect_feature_set()
890 dev->num_hdmi_outputs = out_type_counter[HDMI]; in vivid_detect_feature_set()
893 dev->has_vid_cap = node_type & 0x0001; in vivid_detect_feature_set()
897 dev->has_raw_vbi_cap = node_type & 0x0004; in vivid_detect_feature_set()
898 dev->has_sliced_vbi_cap = node_type & 0x0008; in vivid_detect_feature_set()
899 dev->has_vbi_cap = dev->has_raw_vbi_cap | dev->has_sliced_vbi_cap; in vivid_detect_feature_set()
903 dev->has_meta_cap = node_type & 0x20000; in vivid_detect_feature_set()
907 !dev->has_vid_cap && !dev->has_meta_cap) { in vivid_detect_feature_set()
908 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
910 return -EINVAL; in vivid_detect_feature_set()
913 !dev->has_vid_cap && !dev->has_vbi_cap && !dev->has_meta_cap) { in vivid_detect_feature_set()
914 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
915 "TV or S-Video input without video, VBI or metadata nodes\n"); in vivid_detect_feature_set()
916 return -EINVAL; in vivid_detect_feature_set()
920 dev->has_vid_out = node_type & 0x0100; in vivid_detect_feature_set()
924 dev->has_raw_vbi_out = node_type & 0x0400; in vivid_detect_feature_set()
925 dev->has_sliced_vbi_out = node_type & 0x0800; in vivid_detect_feature_set()
926 dev->has_vbi_out = dev->has_raw_vbi_out | dev->has_sliced_vbi_out; in vivid_detect_feature_set()
930 dev->has_meta_out = node_type & 0x40000; in vivid_detect_feature_set()
934 !dev->has_vid_out && !dev->has_vbi_out && !dev->has_meta_out) { in vivid_detect_feature_set()
935 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
936 "S-Video output without video, VBI or metadata nodes\n"); in vivid_detect_feature_set()
937 return -EINVAL; in vivid_detect_feature_set()
939 if (out_type_counter[HDMI] && !dev->has_vid_out && !dev->has_meta_out) { in vivid_detect_feature_set()
940 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
942 return -EINVAL; in vivid_detect_feature_set()
946 dev->has_radio_rx = node_type & 0x0010; in vivid_detect_feature_set()
949 dev->has_radio_tx = node_type & 0x1000; in vivid_detect_feature_set()
952 dev->has_sdr_cap = node_type & 0x0020; in vivid_detect_feature_set()
955 dev->has_tv_tuner = in_type_counter[TV]; in vivid_detect_feature_set()
958 *has_tuner = ((dev->has_vid_cap || dev->has_vbi_cap) && in_type_counter[TV]) || in vivid_detect_feature_set()
959 dev->has_radio_rx || dev->has_sdr_cap; in vivid_detect_feature_set()
961 /* do we have a modulator? */ in vivid_detect_feature_set()
962 *has_modulator = dev->has_radio_tx; in vivid_detect_feature_set()
964 if (dev->has_vid_cap) in vivid_detect_feature_set()
966 dev->has_fb = node_type & 0x10000; in vivid_detect_feature_set()
969 if (no_error_inj && *ccs_cap == -1) in vivid_detect_feature_set()
972 /* if ccs_cap == -1, then the user can select it using controls */ in vivid_detect_feature_set()
973 if (*ccs_cap != -1) { in vivid_detect_feature_set()
974 dev->has_crop_cap = *ccs_cap & 1; in vivid_detect_feature_set()
975 dev->has_compose_cap = *ccs_cap & 2; in vivid_detect_feature_set()
976 dev->has_scaler_cap = *ccs_cap & 4; in vivid_detect_feature_set()
977 v4l2_info(&dev->v4l2_dev, "Capture Crop: %c Compose: %c Scaler: %c\n", in vivid_detect_feature_set()
978 dev->has_crop_cap ? 'Y' : 'N', in vivid_detect_feature_set()
979 dev->has_compose_cap ? 'Y' : 'N', in vivid_detect_feature_set()
980 dev->has_scaler_cap ? 'Y' : 'N'); in vivid_detect_feature_set()
984 if (no_error_inj && *ccs_out == -1) in vivid_detect_feature_set()
987 /* if ccs_out == -1, then the user can select it using controls */ in vivid_detect_feature_set()
988 if (*ccs_out != -1) { in vivid_detect_feature_set()
989 dev->has_crop_out = *ccs_out & 1; in vivid_detect_feature_set()
990 dev->has_compose_out = *ccs_out & 2; in vivid_detect_feature_set()
991 dev->has_scaler_out = *ccs_out & 4; in vivid_detect_feature_set()
992 v4l2_info(&dev->v4l2_dev, "Output Crop: %c Compose: %c Scaler: %c\n", in vivid_detect_feature_set()
993 dev->has_crop_out ? 'Y' : 'N', in vivid_detect_feature_set()
994 dev->has_compose_out ? 'Y' : 'N', in vivid_detect_feature_set()
995 dev->has_scaler_out ? 'Y' : 'N'); in vivid_detect_feature_set()
999 dev->has_touch_cap = node_type & 0x80000; in vivid_detect_feature_set()
1006 if (dev->has_vid_cap) { in vivid_set_capabilities()
1008 dev->vid_cap_caps = dev->multiplanar ? in vivid_set_capabilities()
1011 dev->vid_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1012 if (dev->has_audio_inputs) in vivid_set_capabilities()
1013 dev->vid_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1014 if (dev->has_tv_tuner) in vivid_set_capabilities()
1015 dev->vid_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1017 if (dev->has_vid_out) { in vivid_set_capabilities()
1019 dev->vid_out_caps = dev->multiplanar ? in vivid_set_capabilities()
1022 if (dev->has_fb) in vivid_set_capabilities()
1023 dev->vid_out_caps |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY; in vivid_set_capabilities()
1024 dev->vid_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1025 if (dev->has_audio_outputs) in vivid_set_capabilities()
1026 dev->vid_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1028 if (dev->has_vbi_cap) { in vivid_set_capabilities()
1030 dev->vbi_cap_caps = (dev->has_raw_vbi_cap ? V4L2_CAP_VBI_CAPTURE : 0) | in vivid_set_capabilities()
1031 (dev->has_sliced_vbi_cap ? V4L2_CAP_SLICED_VBI_CAPTURE : 0); in vivid_set_capabilities()
1032 dev->vbi_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1033 if (dev->has_audio_inputs) in vivid_set_capabilities()
1034 dev->vbi_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1035 if (dev->has_tv_tuner) in vivid_set_capabilities()
1036 dev->vbi_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1038 if (dev->has_vbi_out) { in vivid_set_capabilities()
1040 dev->vbi_out_caps = (dev->has_raw_vbi_out ? V4L2_CAP_VBI_OUTPUT : 0) | in vivid_set_capabilities()
1041 (dev->has_sliced_vbi_out ? V4L2_CAP_SLICED_VBI_OUTPUT : 0); in vivid_set_capabilities()
1042 dev->vbi_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1043 if (dev->has_audio_outputs) in vivid_set_capabilities()
1044 dev->vbi_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1046 if (dev->has_sdr_cap) { in vivid_set_capabilities()
1048 dev->sdr_cap_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER; in vivid_set_capabilities()
1049 dev->sdr_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1052 if (dev->has_radio_rx) in vivid_set_capabilities()
1053 dev->radio_rx_caps = V4L2_CAP_RADIO | V4L2_CAP_RDS_CAPTURE | in vivid_set_capabilities()
1057 if (dev->has_radio_tx) in vivid_set_capabilities()
1058 dev->radio_tx_caps = V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR | in vivid_set_capabilities()
1062 if (dev->has_meta_cap) { in vivid_set_capabilities()
1063 dev->meta_cap_caps = V4L2_CAP_META_CAPTURE | in vivid_set_capabilities()
1065 if (dev->has_audio_inputs) in vivid_set_capabilities()
1066 dev->meta_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1067 if (dev->has_tv_tuner) in vivid_set_capabilities()
1068 dev->meta_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1071 if (dev->has_meta_out) { in vivid_set_capabilities()
1072 dev->meta_out_caps = V4L2_CAP_META_OUTPUT | in vivid_set_capabilities()
1074 if (dev->has_audio_outputs) in vivid_set_capabilities()
1075 dev->meta_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1078 if (dev->has_touch_cap) { in vivid_set_capabilities()
1079 dev->touch_cap_caps = V4L2_CAP_TOUCH | V4L2_CAP_STREAMING | in vivid_set_capabilities()
1081 dev->touch_cap_caps |= dev->multiplanar ? in vivid_set_capabilities()
1093 if (!dev->has_audio_inputs) { in vivid_disable_unused_ioctls()
1094 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1095 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1096 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1097 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1098 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1099 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1100 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1101 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1102 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1104 if (!dev->has_audio_outputs) { in vivid_disable_unused_ioctls()
1105 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1106 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1107 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1108 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1109 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1110 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1111 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1112 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1113 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1116 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_STD); in vivid_disable_unused_ioctls()
1117 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_STD); in vivid_disable_unused_ioctls()
1118 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMSTD); in vivid_disable_unused_ioctls()
1119 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERYSTD); in vivid_disable_unused_ioctls()
1122 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_STD); in vivid_disable_unused_ioctls()
1123 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_STD); in vivid_disable_unused_ioctls()
1124 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMSTD); in vivid_disable_unused_ioctls()
1127 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1128 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1129 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1130 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1131 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1132 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1135 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1136 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1137 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1138 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1139 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1140 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1143 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_EDID); in vivid_disable_unused_ioctls()
1144 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_EDID); in vivid_disable_unused_ioctls()
1145 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_DV_TIMINGS_CAP); in vivid_disable_unused_ioctls()
1146 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_DV_TIMINGS); in vivid_disable_unused_ioctls()
1147 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_DV_TIMINGS); in vivid_disable_unused_ioctls()
1148 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUM_DV_TIMINGS); in vivid_disable_unused_ioctls()
1149 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERY_DV_TIMINGS); in vivid_disable_unused_ioctls()
1152 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_EDID); in vivid_disable_unused_ioctls()
1153 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_DV_TIMINGS_CAP); in vivid_disable_unused_ioctls()
1154 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_DV_TIMINGS); in vivid_disable_unused_ioctls()
1155 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_DV_TIMINGS); in vivid_disable_unused_ioctls()
1156 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_DV_TIMINGS); in vivid_disable_unused_ioctls()
1158 if (!dev->has_fb) { in vivid_disable_unused_ioctls()
1159 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FBUF); in vivid_disable_unused_ioctls()
1160 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FBUF); in vivid_disable_unused_ioctls()
1161 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_OVERLAY); in vivid_disable_unused_ioctls()
1163 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1164 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1165 v4l2_disable_ioctl(&dev->sdr_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1166 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1167 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1168 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1169 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMESIZES); in vivid_disable_unused_ioctls()
1170 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMEINTERVALS); in vivid_disable_unused_ioctls()
1171 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1172 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1173 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1174 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1175 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_S_PARM); in vivid_disable_unused_ioctls()
1176 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMESIZES); in vivid_disable_unused_ioctls()
1177 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMEINTERVALS); in vivid_disable_unused_ioctls()
1184 while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width) in vivid_init_dv_timings()
1185 dev->query_dv_timings_size++; in vivid_init_dv_timings()
1191 dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size, in vivid_init_dv_timings()
1197 dev->query_dv_timings_qmenu_strings = in vivid_init_dv_timings()
1198 kmalloc_array(dev->query_dv_timings_size, 32, GFP_KERNEL); in vivid_init_dv_timings()
1200 if (!dev->query_dv_timings_qmenu || in vivid_init_dv_timings()
1201 !dev->query_dv_timings_qmenu_strings) in vivid_init_dv_timings()
1202 return -ENOMEM; in vivid_init_dv_timings()
1204 for (i = 0; i < dev->query_dv_timings_size; i++) { in vivid_init_dv_timings()
1206 char *p = dev->query_dv_timings_qmenu_strings + i * 32; in vivid_init_dv_timings()
1209 dev->query_dv_timings_qmenu[i] = p; in vivid_init_dv_timings()
1214 bt->width, bt->height, bt->interlaced ? "i" : "p", in vivid_init_dv_timings()
1215 (u32)bt->pixelclock / (htot * vtot)); in vivid_init_dv_timings()
1226 if (dev->has_vid_cap) { in vivid_create_queues()
1228 ret = vivid_create_queue(dev, &dev->vb_vid_cap_q, in vivid_create_queues()
1235 if (dev->has_vid_out) { in vivid_create_queues()
1237 ret = vivid_create_queue(dev, &dev->vb_vid_out_q, in vivid_create_queues()
1244 if (dev->has_vbi_cap) { in vivid_create_queues()
1246 ret = vivid_create_queue(dev, &dev->vb_vbi_cap_q, in vivid_create_queues()
1253 if (dev->has_vbi_out) { in vivid_create_queues()
1255 ret = vivid_create_queue(dev, &dev->vb_vbi_out_q, in vivid_create_queues()
1262 if (dev->has_sdr_cap) { in vivid_create_queues()
1264 ret = vivid_create_queue(dev, &dev->vb_sdr_cap_q, in vivid_create_queues()
1271 if (dev->has_meta_cap) { in vivid_create_queues()
1273 ret = vivid_create_queue(dev, &dev->vb_meta_cap_q, in vivid_create_queues()
1280 if (dev->has_meta_out) { in vivid_create_queues()
1282 ret = vivid_create_queue(dev, &dev->vb_meta_out_q, in vivid_create_queues()
1289 if (dev->has_touch_cap) { in vivid_create_queues()
1291 ret = vivid_create_queue(dev, &dev->vb_touch_cap_q, in vivid_create_queues()
1298 if (dev->has_fb) { in vivid_create_queues()
1303 v4l2_info(&dev->v4l2_dev, "Framebuffer device registered as fb%d\n", in vivid_create_queues()
1304 dev->fb_info.node); in vivid_create_queues()
1320 if (dev->has_vid_cap) { in vivid_create_devnodes()
1321 vfd = &dev->vid_cap_dev; in vivid_create_devnodes()
1322 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1323 "vivid-%03d-vid-cap", inst); in vivid_create_devnodes()
1324 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1325 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1326 vfd->device_caps = dev->vid_cap_caps; in vivid_create_devnodes()
1327 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1328 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1329 vfd->queue = &dev->vb_vid_cap_q; in vivid_create_devnodes()
1330 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1336 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1340 dev->vid_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1341 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_cap_pad); in vivid_create_devnodes()
1348 ret = cec_register_adapter(dev->cec_rx_adap, &pdev->dev); in vivid_create_devnodes()
1350 cec_delete_adapter(dev->cec_rx_adap); in vivid_create_devnodes()
1351 dev->cec_rx_adap = NULL; in vivid_create_devnodes()
1354 cec_s_phys_addr(dev->cec_rx_adap, 0, false); in vivid_create_devnodes()
1355 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI input 0\n", in vivid_create_devnodes()
1356 dev_name(&dev->cec_rx_adap->devnode.dev)); in vivid_create_devnodes()
1363 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n", in vivid_create_devnodes()
1367 if (dev->has_vid_out) { in vivid_create_devnodes()
1371 vfd = &dev->vid_out_dev; in vivid_create_devnodes()
1372 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1373 "vivid-%03d-vid-out", inst); in vivid_create_devnodes()
1374 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1375 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1376 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1377 vfd->device_caps = dev->vid_out_caps; in vivid_create_devnodes()
1378 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1379 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1380 vfd->queue = &dev->vb_vid_out_q; in vivid_create_devnodes()
1381 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1387 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1391 dev->vid_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1392 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_out_pad); in vivid_create_devnodes()
1399 ret = cec_register_adapter(dev->cec_tx_adap[i], &pdev->dev); in vivid_create_devnodes()
1402 cec_delete_adapter(dev->cec_tx_adap[i]); in vivid_create_devnodes()
1403 dev->cec_tx_adap[i] = NULL; in vivid_create_devnodes()
1407 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI output %d\n", in vivid_create_devnodes()
1408 dev_name(&dev->cec_tx_adap[i]->devnode.dev), i); in vivid_create_devnodes()
1410 cec_s_phys_addr(dev->cec_tx_adap[i], (i + 1) << 12, false); in vivid_create_devnodes()
1412 cec_s_phys_addr(dev->cec_tx_adap[i], 0x1000, false); in vivid_create_devnodes()
1419 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s\n", in vivid_create_devnodes()
1423 if (dev->has_vbi_cap) { in vivid_create_devnodes()
1424 vfd = &dev->vbi_cap_dev; in vivid_create_devnodes()
1425 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1426 "vivid-%03d-vbi-cap", inst); in vivid_create_devnodes()
1427 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1428 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1429 vfd->device_caps = dev->vbi_cap_caps; in vivid_create_devnodes()
1430 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1431 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1432 vfd->queue = &dev->vb_vbi_cap_q; in vivid_create_devnodes()
1433 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1434 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1438 dev->vbi_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1439 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_cap_pad); in vivid_create_devnodes()
1447 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s, supports %s VBI\n", in vivid_create_devnodes()
1449 (dev->has_raw_vbi_cap && dev->has_sliced_vbi_cap) ? in vivid_create_devnodes()
1451 (dev->has_raw_vbi_cap ? "raw" : "sliced")); in vivid_create_devnodes()
1454 if (dev->has_vbi_out) { in vivid_create_devnodes()
1455 vfd = &dev->vbi_out_dev; in vivid_create_devnodes()
1456 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1457 "vivid-%03d-vbi-out", inst); in vivid_create_devnodes()
1458 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1459 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1460 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1461 vfd->device_caps = dev->vbi_out_caps; in vivid_create_devnodes()
1462 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1463 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1464 vfd->queue = &dev->vb_vbi_out_q; in vivid_create_devnodes()
1465 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1466 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1470 dev->vbi_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1471 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_out_pad); in vivid_create_devnodes()
1479 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, supports %s VBI\n", in vivid_create_devnodes()
1481 (dev->has_raw_vbi_out && dev->has_sliced_vbi_out) ? in vivid_create_devnodes()
1483 (dev->has_raw_vbi_out ? "raw" : "sliced")); in vivid_create_devnodes()
1486 if (dev->has_sdr_cap) { in vivid_create_devnodes()
1487 vfd = &dev->sdr_cap_dev; in vivid_create_devnodes()
1488 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1489 "vivid-%03d-sdr-cap", inst); in vivid_create_devnodes()
1490 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1491 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1492 vfd->device_caps = dev->sdr_cap_caps; in vivid_create_devnodes()
1493 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1494 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1495 vfd->queue = &dev->vb_sdr_cap_q; in vivid_create_devnodes()
1496 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1500 dev->sdr_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1501 ret = media_entity_pads_init(&vfd->entity, 1, &dev->sdr_cap_pad); in vivid_create_devnodes()
1509 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n", in vivid_create_devnodes()
1513 if (dev->has_radio_rx) { in vivid_create_devnodes()
1514 vfd = &dev->radio_rx_dev; in vivid_create_devnodes()
1515 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1516 "vivid-%03d-rad-rx", inst); in vivid_create_devnodes()
1517 vfd->fops = &vivid_radio_fops; in vivid_create_devnodes()
1518 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1519 vfd->device_caps = dev->radio_rx_caps; in vivid_create_devnodes()
1520 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1521 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1522 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1528 v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as %s\n", in vivid_create_devnodes()
1532 if (dev->has_radio_tx) { in vivid_create_devnodes()
1533 vfd = &dev->radio_tx_dev; in vivid_create_devnodes()
1534 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1535 "vivid-%03d-rad-tx", inst); in vivid_create_devnodes()
1536 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1537 vfd->fops = &vivid_radio_fops; in vivid_create_devnodes()
1538 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1539 vfd->device_caps = dev->radio_tx_caps; in vivid_create_devnodes()
1540 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1541 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1542 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1548 v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered as %s\n", in vivid_create_devnodes()
1552 if (dev->has_meta_cap) { in vivid_create_devnodes()
1553 vfd = &dev->meta_cap_dev; in vivid_create_devnodes()
1554 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1555 "vivid-%03d-meta-cap", inst); in vivid_create_devnodes()
1556 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1557 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1558 vfd->device_caps = dev->meta_cap_caps; in vivid_create_devnodes()
1559 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1560 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1561 vfd->queue = &dev->vb_meta_cap_q; in vivid_create_devnodes()
1562 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1563 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1566 dev->meta_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1567 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1568 &dev->meta_cap_pad); in vivid_create_devnodes()
1576 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1581 if (dev->has_meta_out) { in vivid_create_devnodes()
1582 vfd = &dev->meta_out_dev; in vivid_create_devnodes()
1583 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1584 "vivid-%03d-meta-out", inst); in vivid_create_devnodes()
1585 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1586 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1587 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1588 vfd->device_caps = dev->meta_out_caps; in vivid_create_devnodes()
1589 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1590 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1591 vfd->queue = &dev->vb_meta_out_q; in vivid_create_devnodes()
1592 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1593 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1596 dev->meta_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1597 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1598 &dev->meta_out_pad); in vivid_create_devnodes()
1606 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1611 if (dev->has_touch_cap) { in vivid_create_devnodes()
1612 vfd = &dev->touch_cap_dev; in vivid_create_devnodes()
1613 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1614 "vivid-%03d-touch-cap", inst); in vivid_create_devnodes()
1615 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1616 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1617 vfd->device_caps = dev->touch_cap_caps; in vivid_create_devnodes()
1618 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1619 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1620 vfd->queue = &dev->vb_touch_cap_q; in vivid_create_devnodes()
1621 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1622 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1625 dev->touch_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1626 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1627 &dev->touch_cap_pad); in vivid_create_devnodes()
1635 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1642 ret = media_device_register(&dev->mdev); in vivid_create_devnodes()
1644 dev_err(dev->mdev.dev, in vivid_create_devnodes()
1672 return -ENOMEM; in vivid_create_instance()
1674 dev->inst = inst; in vivid_create_instance()
1677 dev->v4l2_dev.mdev = &dev->mdev; in vivid_create_instance()
1680 strscpy(dev->mdev.model, VIVID_MODULE_NAME, sizeof(dev->mdev.model)); in vivid_create_instance()
1681 snprintf(dev->mdev.bus_info, sizeof(dev->mdev.bus_info), in vivid_create_instance()
1682 "platform:%s-%03d", VIVID_MODULE_NAME, inst); in vivid_create_instance()
1683 dev->mdev.dev = &pdev->dev; in vivid_create_instance()
1684 media_device_init(&dev->mdev); in vivid_create_instance()
1685 dev->mdev.ops = &vivid_media_ops; in vivid_create_instance()
1689 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), in vivid_create_instance()
1690 "%s-%03d", VIVID_MODULE_NAME, inst); in vivid_create_instance()
1691 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); in vivid_create_instance()
1696 dev->v4l2_dev.release = vivid_dev_release; in vivid_create_instance()
1707 ret = -ENOMEM; in vivid_create_instance()
1709 tpg_init(&dev->tpg, 640, 360); in vivid_create_instance()
1710 if (tpg_alloc(&dev->tpg, array_size(MAX_WIDTH, MAX_ZOOM))) in vivid_create_instance()
1712 dev->scaled_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM)); in vivid_create_instance()
1713 if (!dev->scaled_line) in vivid_create_instance()
1715 dev->blended_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM)); in vivid_create_instance()
1716 if (!dev->blended_line) in vivid_create_instance()
1720 dev->edid = vmalloc(array_size(256, 128)); in vivid_create_instance()
1721 if (!dev->edid) in vivid_create_instance()
1732 dev->fmt_cap = &vivid_formats[0]; in vivid_create_instance()
1733 dev->fmt_out = &vivid_formats[0]; in vivid_create_instance()
1734 if (!dev->multiplanar) in vivid_create_instance()
1736 dev->webcam_size_idx = 1; in vivid_create_instance()
1737 dev->webcam_ival_idx = 3; in vivid_create_instance()
1738 tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc); in vivid_create_instance()
1739 dev->std_out = V4L2_STD_PAL; in vivid_create_instance()
1740 if (dev->input_type[0] == TV || dev->input_type[0] == SVID) in vivid_create_instance()
1742 if (dev->output_type[0] == SVID) in vivid_create_instance()
1745 dev->dv_timings_cap[i] = def_dv_timings; in vivid_create_instance()
1746 dev->std_cap[i] = V4L2_STD_PAL; in vivid_create_instance()
1748 dev->dv_timings_out = def_dv_timings; in vivid_create_instance()
1749 dev->tv_freq = 2804 /* 175.25 * 16 */; in vivid_create_instance()
1750 dev->tv_audmode = V4L2_TUNER_MODE_STEREO; in vivid_create_instance()
1751 dev->tv_field_cap = V4L2_FIELD_INTERLACED; in vivid_create_instance()
1752 dev->tv_field_out = V4L2_FIELD_INTERLACED; in vivid_create_instance()
1753 dev->radio_rx_freq = 95000 * 16; in vivid_create_instance()
1754 dev->radio_rx_audmode = V4L2_TUNER_MODE_STEREO; in vivid_create_instance()
1755 if (dev->has_radio_tx) { in vivid_create_instance()
1756 dev->radio_tx_freq = 95500 * 16; in vivid_create_instance()
1757 dev->radio_rds_loop = false; in vivid_create_instance()
1759 dev->radio_tx_subchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_RDS; in vivid_create_instance()
1760 dev->sdr_adc_freq = 300000; in vivid_create_instance()
1761 dev->sdr_fm_freq = 50000000; in vivid_create_instance()
1762 dev->sdr_pixelformat = V4L2_SDR_FMT_CU8; in vivid_create_instance()
1763 dev->sdr_buffersize = SDR_CAP_SAMPLES_PER_BUF * 2; in vivid_create_instance()
1765 dev->edid_max_blocks = dev->edid_blocks = 2; in vivid_create_instance()
1766 memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid)); in vivid_create_instance()
1767 dev->radio_rds_init_time = ktime_get(); in vivid_create_instance()
1770 ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj, in vivid_create_instance()
1778 if (dev->num_outputs && dev->output_type[0] != HDMI) in vivid_create_instance()
1779 v4l2_ctrl_activate(dev->ctrl_display_present, false); in vivid_create_instance()
1780 if (dev->num_inputs && dev->input_type[0] != HDMI) { in vivid_create_instance()
1781 v4l2_ctrl_activate(dev->ctrl_dv_timings_signal_mode, false); in vivid_create_instance()
1782 v4l2_ctrl_activate(dev->ctrl_dv_timings, false); in vivid_create_instance()
1783 } else if (dev->num_inputs && dev->input_type[0] == HDMI) { in vivid_create_instance()
1784 v4l2_ctrl_activate(dev->ctrl_std_signal_mode, false); in vivid_create_instance()
1785 v4l2_ctrl_activate(dev->ctrl_standard, false); in vivid_create_instance()
1796 dev->fb_cap.fmt.width = dev->src_rect.width; in vivid_create_instance()
1797 dev->fb_cap.fmt.height = dev->src_rect.height; in vivid_create_instance()
1798 dev->fb_cap.fmt.pixelformat = dev->fmt_cap->fourcc; in vivid_create_instance()
1799 dev->fb_cap.fmt.bytesperline = dev->src_rect.width * tpg_g_twopixelsize(&dev->tpg, 0) / 2; in vivid_create_instance()
1800 dev->fb_cap.fmt.sizeimage = dev->src_rect.height * dev->fb_cap.fmt.bytesperline; in vivid_create_instance()
1803 dev->timeperframe_tch_cap.numerator = 1; in vivid_create_instance()
1804 dev->timeperframe_tch_cap.denominator = 10; in vivid_create_instance()
1808 spin_lock_init(&dev->slock); in vivid_create_instance()
1809 mutex_init(&dev->mutex); in vivid_create_instance()
1812 INIT_LIST_HEAD(&dev->vid_cap_active); in vivid_create_instance()
1813 INIT_LIST_HEAD(&dev->vid_out_active); in vivid_create_instance()
1814 INIT_LIST_HEAD(&dev->vbi_cap_active); in vivid_create_instance()
1815 INIT_LIST_HEAD(&dev->vbi_out_active); in vivid_create_instance()
1816 INIT_LIST_HEAD(&dev->sdr_cap_active); in vivid_create_instance()
1817 INIT_LIST_HEAD(&dev->meta_cap_active); in vivid_create_instance()
1818 INIT_LIST_HEAD(&dev->meta_out_active); in vivid_create_instance()
1819 INIT_LIST_HEAD(&dev->touch_cap_active); in vivid_create_instance()
1821 INIT_LIST_HEAD(&dev->cec_work_list); in vivid_create_instance()
1822 spin_lock_init(&dev->cec_slock); in vivid_create_instance()
1827 dev->cec_workqueue = alloc_ordered_workqueue("vivid-%03d-cec", in vivid_create_instance()
1829 if (!dev->cec_workqueue) { in vivid_create_instance()
1830 ret = -ENOMEM; in vivid_create_instance()
1835 dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in vivid_create_instance()
1842 if (dev->has_vid_cap && in_type_counter[HDMI]) { in vivid_create_instance()
1849 dev->cec_rx_adap = adap; in vivid_create_instance()
1852 if (dev->has_vid_out) { in vivid_create_instance()
1853 for (i = 0; i < dev->num_outputs; i++) { in vivid_create_instance()
1856 if (dev->output_type[i] != HDMI) in vivid_create_instance()
1859 dev->cec_output2bus_map[i] = cec_tx_bus_cnt; in vivid_create_instance()
1863 for (i = 0; i < dev->num_outputs; i++) in vivid_create_instance()
1864 cec_delete_adapter(dev->cec_tx_adap[i]); in vivid_create_instance()
1868 dev->cec_tx_adap[cec_tx_bus_cnt] = adap; in vivid_create_instance()
1874 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap); in vivid_create_instance()
1875 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out); in vivid_create_instance()
1876 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_cap); in vivid_create_instance()
1877 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_out); in vivid_create_instance()
1878 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_rx); in vivid_create_instance()
1879 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_tx); in vivid_create_instance()
1880 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_sdr_cap); in vivid_create_instance()
1881 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_cap); in vivid_create_instance()
1882 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_out); in vivid_create_instance()
1883 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_touch_cap); in vivid_create_instance()
1898 vb2_video_unregister_device(&dev->touch_cap_dev); in vivid_create_instance()
1899 vb2_video_unregister_device(&dev->meta_out_dev); in vivid_create_instance()
1900 vb2_video_unregister_device(&dev->meta_cap_dev); in vivid_create_instance()
1901 video_unregister_device(&dev->radio_tx_dev); in vivid_create_instance()
1902 video_unregister_device(&dev->radio_rx_dev); in vivid_create_instance()
1903 vb2_video_unregister_device(&dev->sdr_cap_dev); in vivid_create_instance()
1904 vb2_video_unregister_device(&dev->vbi_out_dev); in vivid_create_instance()
1905 vb2_video_unregister_device(&dev->vbi_cap_dev); in vivid_create_instance()
1906 vb2_video_unregister_device(&dev->vid_out_dev); in vivid_create_instance()
1907 vb2_video_unregister_device(&dev->vid_cap_dev); in vivid_create_instance()
1908 cec_unregister_adapter(dev->cec_rx_adap); in vivid_create_instance()
1910 cec_unregister_adapter(dev->cec_tx_adap[i]); in vivid_create_instance()
1911 if (dev->cec_workqueue) { in vivid_create_instance()
1913 destroy_workqueue(dev->cec_workqueue); in vivid_create_instance()
1916 v4l2_device_put(&dev->v4l2_dev); in vivid_create_instance()
1933 return -ENODEV; in vivid_probe()
1936 tpg_set_font(font->data); in vivid_probe()
1972 media_device_unregister(&dev->mdev); in vivid_remove()
1975 if (dev->has_vid_cap) { in vivid_remove()
1976 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
1977 video_device_node_name(&dev->vid_cap_dev)); in vivid_remove()
1978 vb2_video_unregister_device(&dev->vid_cap_dev); in vivid_remove()
1980 if (dev->has_vid_out) { in vivid_remove()
1981 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
1982 video_device_node_name(&dev->vid_out_dev)); in vivid_remove()
1983 vb2_video_unregister_device(&dev->vid_out_dev); in vivid_remove()
1985 if (dev->has_vbi_cap) { in vivid_remove()
1986 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
1987 video_device_node_name(&dev->vbi_cap_dev)); in vivid_remove()
1988 vb2_video_unregister_device(&dev->vbi_cap_dev); in vivid_remove()
1990 if (dev->has_vbi_out) { in vivid_remove()
1991 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
1992 video_device_node_name(&dev->vbi_out_dev)); in vivid_remove()
1993 vb2_video_unregister_device(&dev->vbi_out_dev); in vivid_remove()
1995 if (dev->has_sdr_cap) { in vivid_remove()
1996 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
1997 video_device_node_name(&dev->sdr_cap_dev)); in vivid_remove()
1998 vb2_video_unregister_device(&dev->sdr_cap_dev); in vivid_remove()
2000 if (dev->has_radio_rx) { in vivid_remove()
2001 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2002 video_device_node_name(&dev->radio_rx_dev)); in vivid_remove()
2003 video_unregister_device(&dev->radio_rx_dev); in vivid_remove()
2005 if (dev->has_radio_tx) { in vivid_remove()
2006 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2007 video_device_node_name(&dev->radio_tx_dev)); in vivid_remove()
2008 video_unregister_device(&dev->radio_tx_dev); in vivid_remove()
2010 if (dev->has_fb) { in vivid_remove()
2011 v4l2_info(&dev->v4l2_dev, "unregistering fb%d\n", in vivid_remove()
2012 dev->fb_info.node); in vivid_remove()
2013 unregister_framebuffer(&dev->fb_info); in vivid_remove()
2016 if (dev->has_meta_cap) { in vivid_remove()
2017 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2018 video_device_node_name(&dev->meta_cap_dev)); in vivid_remove()
2019 vb2_video_unregister_device(&dev->meta_cap_dev); in vivid_remove()
2021 if (dev->has_meta_out) { in vivid_remove()
2022 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2023 video_device_node_name(&dev->meta_out_dev)); in vivid_remove()
2024 vb2_video_unregister_device(&dev->meta_out_dev); in vivid_remove()
2026 if (dev->has_touch_cap) { in vivid_remove()
2027 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2028 video_device_node_name(&dev->touch_cap_dev)); in vivid_remove()
2029 vb2_video_unregister_device(&dev->touch_cap_dev); in vivid_remove()
2031 cec_unregister_adapter(dev->cec_rx_adap); in vivid_remove()
2033 cec_unregister_adapter(dev->cec_tx_adap[j]); in vivid_remove()
2034 if (dev->cec_workqueue) { in vivid_remove()
2036 destroy_workqueue(dev->cec_workqueue); in vivid_remove()
2038 v4l2_device_put(&dev->v4l2_dev); in vivid_remove()