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"
181 [0 ... (VIVID_MAX_DEVS - 1)] = 1
240 strscpy(cap->driver, "vivid", sizeof(cap->driver)); in vidioc_querycap()
241 strscpy(cap->card, "vivid", sizeof(cap->card)); in vidioc_querycap()
242 snprintf(cap->bus_info, sizeof(cap->bus_info), in vidioc_querycap()
243 "platform:%s-%03d", VIVID_MODULE_NAME, dev->inst); in vidioc_querycap()
245 cap->capabilities = dev->vid_cap_caps | dev->vid_out_caps | in vidioc_querycap()
246 dev->vbi_cap_caps | dev->vbi_out_caps | in vidioc_querycap()
247 dev->radio_rx_caps | dev->radio_tx_caps | in vidioc_querycap()
248 dev->sdr_cap_caps | dev->meta_cap_caps | in vidioc_querycap()
249 dev->meta_out_caps | dev->touch_cap_caps | in vidioc_querycap()
258 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_hw_freq_seek()
260 return -ENOTTY; in vidioc_s_hw_freq_seek()
267 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_enum_freq_bands()
269 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_enum_freq_bands()
271 return -ENOTTY; in vidioc_enum_freq_bands()
278 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_g_tuner()
280 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_g_tuner()
289 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_tuner()
291 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_s_tuner()
301 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_g_frequency()
303 vdev->vfl_dir == VFL_DIR_RX ? in vidioc_g_frequency()
304 &dev->radio_rx_freq : &dev->radio_tx_freq, vf); in vidioc_g_frequency()
305 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_g_frequency()
315 if (vdev->vfl_type == VFL_TYPE_RADIO) in vidioc_s_frequency()
317 vdev->vfl_dir == VFL_DIR_RX ? in vidioc_s_frequency()
318 &dev->radio_rx_freq : &dev->radio_tx_freq, vf); in vidioc_s_frequency()
319 if (vdev->vfl_type == VFL_TYPE_SDR) in vidioc_s_frequency()
328 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_overlay()
329 return -ENOTTY; in vidioc_overlay()
337 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_fbuf()
338 return -ENOTTY; in vidioc_g_fbuf()
346 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_fbuf()
347 return -ENOTTY; in vidioc_s_fbuf()
355 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_std()
364 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_dv_timings()
374 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_pixelaspect()
380 struct v4l2_selection *sel) in vidioc_g_selection() argument
384 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_selection()
385 return vivid_vid_cap_g_selection(file, fh, sel); in vidioc_g_selection()
386 return vivid_vid_out_g_selection(file, fh, sel); in vidioc_g_selection()
390 struct v4l2_selection *sel) in vidioc_s_selection() argument
394 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_selection()
395 return vivid_vid_cap_s_selection(file, fh, sel); in vidioc_s_selection()
396 return vivid_vid_out_s_selection(file, fh, sel); in vidioc_s_selection()
404 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vidioc_g_parm()
406 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_g_parm()
416 if (vdev->vfl_dir == VFL_DIR_RX) in vidioc_s_parm()
418 return -ENOTTY; in vidioc_s_parm()
427 if (vdev->vfl_dir == VFL_DIR_RX && vdev->vfl_type == VFL_TYPE_VIDEO) in vidioc_log_status()
428 tpg_log_status(&dev->tpg); in vidioc_log_status()
437 if (vdev->vfl_dir == VFL_DIR_TX) in vivid_radio_read()
438 return -EINVAL; in vivid_radio_read()
447 if (vdev->vfl_dir == VFL_DIR_RX) in vivid_radio_write()
448 return -EINVAL; in vivid_radio_write()
456 if (vdev->vfl_dir == VFL_DIR_RX) in vivid_radio_poll()
466 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_enum_input()
475 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_input()
484 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_input()
494 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_enum_fmt_cap()
504 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_fmt_cap()
514 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_try_fmt_cap()
524 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_fmt_cap()
534 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_g_fmt_cap_mplane()
544 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_try_fmt_cap_mplane()
554 if (vdev->vfl_type == VFL_TYPE_TOUCH) in vivid_s_fmt_cap_mplane()
566 spin_lock_irqsave(&vdev->fh_lock, flags); in vivid_is_in_use()
567 res = !list_empty(&vdev->fh_list); in vivid_is_in_use()
568 spin_unlock_irqrestore(&vdev->fh_lock, flags); in vivid_is_in_use()
575 vivid_is_in_use(dev->has_vid_cap, &dev->vid_cap_dev) + in vivid_is_last_user()
576 vivid_is_in_use(dev->has_vid_out, &dev->vid_out_dev) + in vivid_is_last_user()
577 vivid_is_in_use(dev->has_vbi_cap, &dev->vbi_cap_dev) + in vivid_is_last_user()
578 vivid_is_in_use(dev->has_vbi_out, &dev->vbi_out_dev) + in vivid_is_last_user()
579 vivid_is_in_use(dev->has_radio_rx, &dev->radio_rx_dev) + in vivid_is_last_user()
580 vivid_is_in_use(dev->has_radio_tx, &dev->radio_tx_dev) + in vivid_is_last_user()
581 vivid_is_in_use(dev->has_sdr_cap, &dev->sdr_cap_dev) + in vivid_is_last_user()
582 vivid_is_in_use(dev->has_meta_cap, &dev->meta_cap_dev) + in vivid_is_last_user()
583 vivid_is_in_use(dev->has_meta_out, &dev->meta_out_dev) + in vivid_is_last_user()
584 vivid_is_in_use(dev->has_touch_cap, &dev->touch_cap_dev); in vivid_is_last_user()
591 if (dev->has_vid_cap) in vivid_reconnect()
592 set_bit(V4L2_FL_REGISTERED, &dev->vid_cap_dev.flags); in vivid_reconnect()
593 if (dev->has_vid_out) in vivid_reconnect()
594 set_bit(V4L2_FL_REGISTERED, &dev->vid_out_dev.flags); in vivid_reconnect()
595 if (dev->has_vbi_cap) in vivid_reconnect()
596 set_bit(V4L2_FL_REGISTERED, &dev->vbi_cap_dev.flags); in vivid_reconnect()
597 if (dev->has_vbi_out) in vivid_reconnect()
598 set_bit(V4L2_FL_REGISTERED, &dev->vbi_out_dev.flags); in vivid_reconnect()
599 if (dev->has_radio_rx) in vivid_reconnect()
600 set_bit(V4L2_FL_REGISTERED, &dev->radio_rx_dev.flags); in vivid_reconnect()
601 if (dev->has_radio_tx) in vivid_reconnect()
602 set_bit(V4L2_FL_REGISTERED, &dev->radio_tx_dev.flags); in vivid_reconnect()
603 if (dev->has_sdr_cap) in vivid_reconnect()
604 set_bit(V4L2_FL_REGISTERED, &dev->sdr_cap_dev.flags); in vivid_reconnect()
605 if (dev->has_meta_cap) in vivid_reconnect()
606 set_bit(V4L2_FL_REGISTERED, &dev->meta_cap_dev.flags); in vivid_reconnect()
607 if (dev->has_meta_out) in vivid_reconnect()
608 set_bit(V4L2_FL_REGISTERED, &dev->meta_out_dev.flags); in vivid_reconnect()
609 if (dev->has_touch_cap) in vivid_reconnect()
610 set_bit(V4L2_FL_REGISTERED, &dev->touch_cap_dev.flags); in vivid_reconnect()
611 dev->disconnect_error = false; in vivid_reconnect()
619 mutex_lock(&dev->mutex); in vivid_fop_release()
621 dev->disconnect_error && !video_is_registered(vdev) && in vivid_fop_release()
626 * so re-register all video_device's again. in vivid_fop_release()
628 v4l2_info(&dev->v4l2_dev, "reconnect\n"); in vivid_fop_release()
631 if (file->private_data == dev->radio_rx_rds_owner) { in vivid_fop_release()
632 dev->radio_rx_rds_last_block = 0; in vivid_fop_release()
633 dev->radio_rx_rds_owner = NULL; in vivid_fop_release()
635 if (file->private_data == dev->radio_tx_rds_owner) { in vivid_fop_release()
636 dev->radio_tx_rds_last_block = 0; in vivid_fop_release()
637 dev->radio_tx_rds_owner = NULL; in vivid_fop_release()
639 mutex_unlock(&dev->mutex); in vivid_fop_release()
640 if (vdev->queue) in vivid_fop_release()
676 if (p->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE || in vidioc_reqbufs()
677 p->type == V4L2_BUF_TYPE_VBI_CAPTURE) { in vidioc_reqbufs()
678 r = vb2_queue_change_type(vdev->queue, p->type); in vidioc_reqbufs()
696 if (p->format.type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE || in vidioc_create_bufs()
697 p->format.type == V4L2_BUF_TYPE_VBI_CAPTURE) { in vidioc_create_bufs()
698 r = vb2_queue_change_type(vdev->queue, p->format.type); in vidioc_create_bufs()
821 /* -----------------------------------------------------------------
823 ------------------------------------------------------------------*/
830 v4l2_device_unregister(&dev->v4l2_dev); in vivid_dev_release()
832 media_device_cleanup(&dev->mdev); in vivid_dev_release()
834 vfree(dev->scaled_line); in vivid_dev_release()
835 vfree(dev->blended_line); in vivid_dev_release()
836 vfree(dev->edid); in vivid_dev_release()
837 tpg_free(&dev->tpg); in vivid_dev_release()
838 kfree(dev->query_dv_timings_qmenu); in vivid_dev_release()
839 kfree(dev->query_dv_timings_qmenu_strings); in vivid_dev_release()
846 struct vivid_dev *dev = container_of(req->mdev, struct vivid_dev, mdev); in vivid_req_validate()
848 if (dev->req_validate_error) { in vivid_req_validate()
849 dev->req_validate_error = false; in vivid_req_validate()
850 return -EINVAL; in vivid_req_validate()
867 if (buf_type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->multiplanar) in vivid_create_queue()
869 else if (buf_type == V4L2_BUF_TYPE_VIDEO_OUTPUT && dev->multiplanar) in vivid_create_queue()
871 else if (buf_type == V4L2_BUF_TYPE_VBI_CAPTURE && !dev->has_raw_vbi_cap) in vivid_create_queue()
873 else if (buf_type == V4L2_BUF_TYPE_VBI_OUTPUT && !dev->has_raw_vbi_out) in vivid_create_queue()
876 q->type = buf_type; in vivid_create_queue()
877 q->io_modes = VB2_MMAP | VB2_DMABUF; in vivid_create_queue()
878 q->io_modes |= V4L2_TYPE_IS_OUTPUT(buf_type) ? VB2_WRITE : VB2_READ; in vivid_create_queue()
882 * see also MAX_BUFFER_INDEX in videobuf2-core.c. It will be less if in vivid_create_queue()
884 * videobuf2-core.c to MAX_BUFFER_INDEX. in vivid_create_queue()
887 q->max_num_buffers = 64; in vivid_create_queue()
889 q->max_num_buffers = 1024; in vivid_create_queue()
891 q->max_num_buffers = 32768; in vivid_create_queue()
893 if (allocators[dev->inst] != 1) in vivid_create_queue()
894 q->io_modes |= VB2_USERPTR; in vivid_create_queue()
895 q->drv_priv = dev; in vivid_create_queue()
896 q->buf_struct_size = sizeof(struct vivid_buffer); in vivid_create_queue()
897 q->ops = ops; in vivid_create_queue()
898 q->mem_ops = allocators[dev->inst] == 1 ? &vb2_dma_contig_memops : in vivid_create_queue()
900 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in vivid_create_queue()
901 q->min_queued_buffers = supports_requests[dev->inst] ? 0 : min_queued_buffers; in vivid_create_queue()
902 q->lock = &dev->mutex; in vivid_create_queue()
903 q->dev = dev->v4l2_dev.dev; in vivid_create_queue()
904 q->supports_requests = supports_requests[dev->inst]; in vivid_create_queue()
905 q->requires_requests = supports_requests[dev->inst] >= 2; in vivid_create_queue()
906 q->allow_cache_hints = (cache_hints[dev->inst] == 1); in vivid_create_queue()
922 /* do we use single- or multi-planar? */ in vivid_detect_feature_set()
923 dev->multiplanar = multiplanar[inst] > 1; in vivid_detect_feature_set()
924 v4l2_info(&dev->v4l2_dev, "using %splanar format API\n", in vivid_detect_feature_set()
925 dev->multiplanar ? "multi" : "single "); in vivid_detect_feature_set()
928 dev->num_inputs = num_inputs[inst]; in vivid_detect_feature_set()
930 if (dev->num_inputs < 1) in vivid_detect_feature_set()
931 dev->num_inputs = 1; in vivid_detect_feature_set()
933 dev->num_inputs = 0; in vivid_detect_feature_set()
935 if (dev->num_inputs >= MAX_INPUTS) in vivid_detect_feature_set()
936 dev->num_inputs = MAX_INPUTS; in vivid_detect_feature_set()
937 for (i = 0; i < dev->num_inputs; i++) { in vivid_detect_feature_set()
938 dev->input_type[i] = (input_types[inst] >> (i * 2)) & 0x3; in vivid_detect_feature_set()
939 dev->input_name_counter[i] = in_type_counter[dev->input_type[i]]++; in vivid_detect_feature_set()
941 dev->has_audio_inputs = in_type_counter[TV] && in_type_counter[SVID]; in vivid_detect_feature_set()
944 in_type_counter[HDMI]--; in vivid_detect_feature_set()
945 dev->num_inputs--; in vivid_detect_feature_set()
947 dev->num_hdmi_inputs = in_type_counter[HDMI]; in vivid_detect_feature_set()
950 dev->num_outputs = num_outputs[inst]; in vivid_detect_feature_set()
952 if (dev->num_outputs < 1) in vivid_detect_feature_set()
953 dev->num_outputs = 1; in vivid_detect_feature_set()
955 dev->num_outputs = 0; in vivid_detect_feature_set()
957 if (dev->num_outputs >= MAX_OUTPUTS) in vivid_detect_feature_set()
958 dev->num_outputs = MAX_OUTPUTS; in vivid_detect_feature_set()
959 for (i = 0; i < dev->num_outputs; i++) { in vivid_detect_feature_set()
960 dev->output_type[i] = ((output_types[inst] >> i) & 1) ? HDMI : SVID; in vivid_detect_feature_set()
961 dev->output_name_counter[i] = out_type_counter[dev->output_type[i]]++; in vivid_detect_feature_set()
962 dev->display_present[i] = true; in vivid_detect_feature_set()
964 dev->has_audio_outputs = out_type_counter[SVID]; in vivid_detect_feature_set()
971 out_type_counter[HDMI]--; in vivid_detect_feature_set()
972 dev->num_outputs--; in vivid_detect_feature_set()
974 dev->num_hdmi_outputs = out_type_counter[HDMI]; in vivid_detect_feature_set()
977 dev->has_vid_cap = node_type & 0x0001; in vivid_detect_feature_set()
981 dev->has_raw_vbi_cap = node_type & 0x0004; in vivid_detect_feature_set()
982 dev->has_sliced_vbi_cap = node_type & 0x0008; in vivid_detect_feature_set()
983 dev->has_vbi_cap = dev->has_raw_vbi_cap | dev->has_sliced_vbi_cap; in vivid_detect_feature_set()
987 dev->has_meta_cap = node_type & 0x20000; in vivid_detect_feature_set()
991 !dev->has_vid_cap && !dev->has_meta_cap) { in vivid_detect_feature_set()
992 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
994 return -EINVAL; in vivid_detect_feature_set()
997 !dev->has_vid_cap && !dev->has_vbi_cap && !dev->has_meta_cap) { in vivid_detect_feature_set()
998 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
999 "TV or S-Video input without video, VBI or metadata nodes\n"); in vivid_detect_feature_set()
1000 return -EINVAL; in vivid_detect_feature_set()
1004 dev->has_vid_out = node_type & 0x0100; in vivid_detect_feature_set()
1008 dev->has_raw_vbi_out = node_type & 0x0400; in vivid_detect_feature_set()
1009 dev->has_sliced_vbi_out = node_type & 0x0800; in vivid_detect_feature_set()
1010 dev->has_vbi_out = dev->has_raw_vbi_out | dev->has_sliced_vbi_out; in vivid_detect_feature_set()
1014 dev->has_meta_out = node_type & 0x40000; in vivid_detect_feature_set()
1018 !dev->has_vid_out && !dev->has_vbi_out && !dev->has_meta_out) { in vivid_detect_feature_set()
1019 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
1020 "S-Video output without video, VBI or metadata nodes\n"); in vivid_detect_feature_set()
1021 return -EINVAL; in vivid_detect_feature_set()
1023 if (out_type_counter[HDMI] && !dev->has_vid_out && !dev->has_meta_out) { in vivid_detect_feature_set()
1024 v4l2_warn(&dev->v4l2_dev, in vivid_detect_feature_set()
1026 return -EINVAL; in vivid_detect_feature_set()
1030 dev->has_radio_rx = node_type & 0x0010; in vivid_detect_feature_set()
1033 dev->has_radio_tx = node_type & 0x1000; in vivid_detect_feature_set()
1036 dev->has_sdr_cap = node_type & 0x0020; in vivid_detect_feature_set()
1039 dev->has_tv_tuner = in_type_counter[TV]; in vivid_detect_feature_set()
1042 *has_tuner = ((dev->has_vid_cap || dev->has_vbi_cap) && in_type_counter[TV]) || in vivid_detect_feature_set()
1043 dev->has_radio_rx || dev->has_sdr_cap; in vivid_detect_feature_set()
1045 /* do we have a modulator? */ in vivid_detect_feature_set()
1046 *has_modulator = dev->has_radio_tx; in vivid_detect_feature_set()
1048 if (dev->has_vid_cap) in vivid_detect_feature_set()
1050 dev->has_fb = node_type & 0x10000; in vivid_detect_feature_set()
1053 if (no_error_inj && *ccs_cap == -1) in vivid_detect_feature_set()
1056 /* if ccs_cap == -1, then the user can select it using controls */ in vivid_detect_feature_set()
1057 if (*ccs_cap != -1) { in vivid_detect_feature_set()
1058 dev->has_crop_cap = *ccs_cap & 1; in vivid_detect_feature_set()
1059 dev->has_compose_cap = *ccs_cap & 2; in vivid_detect_feature_set()
1060 dev->has_scaler_cap = *ccs_cap & 4; in vivid_detect_feature_set()
1061 v4l2_info(&dev->v4l2_dev, "Capture Crop: %c Compose: %c Scaler: %c\n", in vivid_detect_feature_set()
1062 dev->has_crop_cap ? 'Y' : 'N', in vivid_detect_feature_set()
1063 dev->has_compose_cap ? 'Y' : 'N', in vivid_detect_feature_set()
1064 dev->has_scaler_cap ? 'Y' : 'N'); in vivid_detect_feature_set()
1068 if (no_error_inj && *ccs_out == -1) in vivid_detect_feature_set()
1071 /* if ccs_out == -1, then the user can select it using controls */ in vivid_detect_feature_set()
1072 if (*ccs_out != -1) { in vivid_detect_feature_set()
1073 dev->has_crop_out = *ccs_out & 1; in vivid_detect_feature_set()
1074 dev->has_compose_out = *ccs_out & 2; in vivid_detect_feature_set()
1075 dev->has_scaler_out = *ccs_out & 4; in vivid_detect_feature_set()
1076 v4l2_info(&dev->v4l2_dev, "Output Crop: %c Compose: %c Scaler: %c\n", in vivid_detect_feature_set()
1077 dev->has_crop_out ? 'Y' : 'N', in vivid_detect_feature_set()
1078 dev->has_compose_out ? 'Y' : 'N', in vivid_detect_feature_set()
1079 dev->has_scaler_out ? 'Y' : 'N'); in vivid_detect_feature_set()
1083 dev->has_touch_cap = node_type & 0x80000; in vivid_detect_feature_set()
1090 if (dev->has_vid_cap) { in vivid_set_capabilities()
1092 dev->vid_cap_caps = dev->multiplanar ? in vivid_set_capabilities()
1095 dev->vid_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1096 if (dev->has_audio_inputs) in vivid_set_capabilities()
1097 dev->vid_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1098 if (dev->has_tv_tuner) in vivid_set_capabilities()
1099 dev->vid_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1101 if (dev->has_vid_out) { in vivid_set_capabilities()
1103 dev->vid_out_caps = dev->multiplanar ? in vivid_set_capabilities()
1106 if (dev->has_fb) in vivid_set_capabilities()
1107 dev->vid_out_caps |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY; in vivid_set_capabilities()
1108 dev->vid_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1109 if (dev->has_audio_outputs) in vivid_set_capabilities()
1110 dev->vid_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1112 if (dev->has_vbi_cap) { in vivid_set_capabilities()
1114 dev->vbi_cap_caps = (dev->has_raw_vbi_cap ? V4L2_CAP_VBI_CAPTURE : 0) | in vivid_set_capabilities()
1115 (dev->has_sliced_vbi_cap ? V4L2_CAP_SLICED_VBI_CAPTURE : 0); in vivid_set_capabilities()
1116 dev->vbi_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1117 if (dev->has_audio_inputs) in vivid_set_capabilities()
1118 dev->vbi_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1119 if (dev->has_tv_tuner) in vivid_set_capabilities()
1120 dev->vbi_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1122 if (dev->has_vbi_out) { in vivid_set_capabilities()
1124 dev->vbi_out_caps = (dev->has_raw_vbi_out ? V4L2_CAP_VBI_OUTPUT : 0) | in vivid_set_capabilities()
1125 (dev->has_sliced_vbi_out ? V4L2_CAP_SLICED_VBI_OUTPUT : 0); in vivid_set_capabilities()
1126 dev->vbi_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1127 if (dev->has_audio_outputs) in vivid_set_capabilities()
1128 dev->vbi_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1130 if (dev->has_sdr_cap) { in vivid_set_capabilities()
1132 dev->sdr_cap_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER; in vivid_set_capabilities()
1133 dev->sdr_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in vivid_set_capabilities()
1136 if (dev->has_radio_rx) in vivid_set_capabilities()
1137 dev->radio_rx_caps = V4L2_CAP_RADIO | V4L2_CAP_RDS_CAPTURE | in vivid_set_capabilities()
1141 if (dev->has_radio_tx) in vivid_set_capabilities()
1142 dev->radio_tx_caps = V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR | in vivid_set_capabilities()
1146 if (dev->has_meta_cap) { in vivid_set_capabilities()
1147 dev->meta_cap_caps = V4L2_CAP_META_CAPTURE | in vivid_set_capabilities()
1149 if (dev->has_audio_inputs) in vivid_set_capabilities()
1150 dev->meta_cap_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1151 if (dev->has_tv_tuner) in vivid_set_capabilities()
1152 dev->meta_cap_caps |= V4L2_CAP_TUNER; in vivid_set_capabilities()
1155 if (dev->has_meta_out) { in vivid_set_capabilities()
1156 dev->meta_out_caps = V4L2_CAP_META_OUTPUT | in vivid_set_capabilities()
1158 if (dev->has_audio_outputs) in vivid_set_capabilities()
1159 dev->meta_out_caps |= V4L2_CAP_AUDIO; in vivid_set_capabilities()
1162 if (dev->has_touch_cap) { in vivid_set_capabilities()
1163 dev->touch_cap_caps = V4L2_CAP_TOUCH | V4L2_CAP_STREAMING | in vivid_set_capabilities()
1165 dev->touch_cap_caps |= dev->multiplanar ? in vivid_set_capabilities()
1177 if (!dev->has_audio_inputs) { in vivid_disable_unused_ioctls()
1178 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1179 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1180 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1181 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1182 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1183 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1184 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_AUDIO); in vivid_disable_unused_ioctls()
1185 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_AUDIO); in vivid_disable_unused_ioctls()
1186 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_ENUMAUDIO); in vivid_disable_unused_ioctls()
1188 if (!dev->has_audio_outputs) { in vivid_disable_unused_ioctls()
1189 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1190 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1191 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1192 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1193 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1194 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1195 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_AUDOUT); in vivid_disable_unused_ioctls()
1196 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_AUDOUT); in vivid_disable_unused_ioctls()
1197 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_ENUMAUDOUT); in vivid_disable_unused_ioctls()
1200 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_STD); in vivid_disable_unused_ioctls()
1201 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_STD); in vivid_disable_unused_ioctls()
1202 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMSTD); in vivid_disable_unused_ioctls()
1203 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERYSTD); in vivid_disable_unused_ioctls()
1206 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_STD); in vivid_disable_unused_ioctls()
1207 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_STD); in vivid_disable_unused_ioctls()
1208 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMSTD); in vivid_disable_unused_ioctls()
1211 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1212 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1213 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1214 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1215 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1216 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1219 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1220 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1221 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1222 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1223 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_TUNER); in vivid_disable_unused_ioctls()
1224 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_G_TUNER); in vivid_disable_unused_ioctls()
1227 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_EDID); in vivid_disable_unused_ioctls()
1228 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_EDID); in vivid_disable_unused_ioctls()
1229 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_DV_TIMINGS_CAP); in vivid_disable_unused_ioctls()
1230 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_DV_TIMINGS); in vivid_disable_unused_ioctls()
1231 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_DV_TIMINGS); in vivid_disable_unused_ioctls()
1232 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUM_DV_TIMINGS); in vivid_disable_unused_ioctls()
1233 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERY_DV_TIMINGS); in vivid_disable_unused_ioctls()
1236 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_EDID); in vivid_disable_unused_ioctls()
1237 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_DV_TIMINGS_CAP); in vivid_disable_unused_ioctls()
1238 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_DV_TIMINGS); in vivid_disable_unused_ioctls()
1239 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_DV_TIMINGS); in vivid_disable_unused_ioctls()
1240 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_DV_TIMINGS); in vivid_disable_unused_ioctls()
1242 if (!dev->has_fb) { in vivid_disable_unused_ioctls()
1243 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FBUF); in vivid_disable_unused_ioctls()
1244 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FBUF); in vivid_disable_unused_ioctls()
1245 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_OVERLAY); in vivid_disable_unused_ioctls()
1247 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1248 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1249 v4l2_disable_ioctl(&dev->sdr_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1250 v4l2_disable_ioctl(&dev->meta_cap_dev, VIDIOC_S_HW_FREQ_SEEK); in vivid_disable_unused_ioctls()
1251 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1252 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1253 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMESIZES); in vivid_disable_unused_ioctls()
1254 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMEINTERVALS); in vivid_disable_unused_ioctls()
1255 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1256 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1257 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_S_FREQUENCY); in vivid_disable_unused_ioctls()
1258 v4l2_disable_ioctl(&dev->meta_out_dev, VIDIOC_G_FREQUENCY); in vivid_disable_unused_ioctls()
1259 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_S_PARM); in vivid_disable_unused_ioctls()
1260 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMESIZES); in vivid_disable_unused_ioctls()
1261 v4l2_disable_ioctl(&dev->touch_cap_dev, VIDIOC_ENUM_FRAMEINTERVALS); in vivid_disable_unused_ioctls()
1268 while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width) in vivid_init_dv_timings()
1269 dev->query_dv_timings_size++; in vivid_init_dv_timings()
1275 dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size, in vivid_init_dv_timings()
1281 dev->query_dv_timings_qmenu_strings = in vivid_init_dv_timings()
1282 kmalloc_array(dev->query_dv_timings_size, 32, GFP_KERNEL); in vivid_init_dv_timings()
1284 if (!dev->query_dv_timings_qmenu || in vivid_init_dv_timings()
1285 !dev->query_dv_timings_qmenu_strings) in vivid_init_dv_timings()
1286 return -ENOMEM; in vivid_init_dv_timings()
1288 for (i = 0; i < dev->query_dv_timings_size; i++) { in vivid_init_dv_timings()
1290 char *p = dev->query_dv_timings_qmenu_strings + i * 32; in vivid_init_dv_timings()
1293 dev->query_dv_timings_qmenu[i] = p; in vivid_init_dv_timings()
1298 bt->width, bt->height, bt->interlaced ? "i" : "p", in vivid_init_dv_timings()
1299 (u32)bt->pixelclock / (htot * vtot)); in vivid_init_dv_timings()
1310 if (dev->has_vid_cap) { in vivid_create_queues()
1312 ret = vivid_create_queue(dev, &dev->vb_vid_cap_q, in vivid_create_queues()
1319 if (dev->has_vid_out) { in vivid_create_queues()
1321 ret = vivid_create_queue(dev, &dev->vb_vid_out_q, in vivid_create_queues()
1328 if (dev->has_vbi_cap) { in vivid_create_queues()
1330 ret = vivid_create_queue(dev, &dev->vb_vbi_cap_q, in vivid_create_queues()
1337 if (dev->has_vbi_out) { in vivid_create_queues()
1339 ret = vivid_create_queue(dev, &dev->vb_vbi_out_q, in vivid_create_queues()
1346 if (dev->has_sdr_cap) { in vivid_create_queues()
1348 ret = vivid_create_queue(dev, &dev->vb_sdr_cap_q, in vivid_create_queues()
1355 if (dev->has_meta_cap) { in vivid_create_queues()
1357 ret = vivid_create_queue(dev, &dev->vb_meta_cap_q, in vivid_create_queues()
1364 if (dev->has_meta_out) { in vivid_create_queues()
1366 ret = vivid_create_queue(dev, &dev->vb_meta_out_q, in vivid_create_queues()
1373 if (dev->has_touch_cap) { in vivid_create_queues()
1375 ret = vivid_create_queue(dev, &dev->vb_touch_cap_q, in vivid_create_queues()
1382 if (dev->has_fb) { in vivid_create_queues()
1387 v4l2_info(&dev->v4l2_dev, "Framebuffer device registered as fb%d\n", in vivid_create_queues()
1388 dev->fb_info.node); in vivid_create_queues()
1404 if (dev->has_vid_cap) { in vivid_create_devnodes()
1405 vfd = &dev->vid_cap_dev; in vivid_create_devnodes()
1406 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1407 "vivid-%03d-vid-cap", inst); in vivid_create_devnodes()
1408 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1409 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1410 vfd->device_caps = dev->vid_cap_caps; in vivid_create_devnodes()
1411 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1412 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1413 vfd->queue = &dev->vb_vid_cap_q; in vivid_create_devnodes()
1414 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1420 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1424 dev->vid_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1425 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_cap_pad); in vivid_create_devnodes()
1432 ret = cec_register_adapter(dev->cec_rx_adap, &pdev->dev); in vivid_create_devnodes()
1434 cec_delete_adapter(dev->cec_rx_adap); in vivid_create_devnodes()
1435 dev->cec_rx_adap = NULL; in vivid_create_devnodes()
1438 cec_s_phys_addr(dev->cec_rx_adap, 0, false); in vivid_create_devnodes()
1439 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI input 0\n", in vivid_create_devnodes()
1440 dev_name(&dev->cec_rx_adap->devnode.dev)); in vivid_create_devnodes()
1447 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n", in vivid_create_devnodes()
1451 if (dev->has_vid_out) { in vivid_create_devnodes()
1455 vfd = &dev->vid_out_dev; in vivid_create_devnodes()
1456 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1457 "vivid-%03d-vid-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->vid_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_vid_out_q; in vivid_create_devnodes()
1465 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1471 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1475 dev->vid_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1476 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vid_out_pad); in vivid_create_devnodes()
1483 ret = cec_register_adapter(dev->cec_tx_adap[i], &pdev->dev); in vivid_create_devnodes()
1486 cec_delete_adapter(dev->cec_tx_adap[i]); in vivid_create_devnodes()
1487 dev->cec_tx_adap[i] = NULL; in vivid_create_devnodes()
1491 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI output %d\n", in vivid_create_devnodes()
1492 dev_name(&dev->cec_tx_adap[i]->devnode.dev), i); in vivid_create_devnodes()
1494 cec_s_phys_addr(dev->cec_tx_adap[i], (i + 1) << 12, false); in vivid_create_devnodes()
1496 cec_s_phys_addr(dev->cec_tx_adap[i], 0x1000, false); in vivid_create_devnodes()
1503 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s\n", in vivid_create_devnodes()
1507 if (dev->has_vbi_cap) { in vivid_create_devnodes()
1508 vfd = &dev->vbi_cap_dev; in vivid_create_devnodes()
1509 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1510 "vivid-%03d-vbi-cap", inst); in vivid_create_devnodes()
1511 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1512 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1513 vfd->device_caps = dev->vbi_cap_caps; in vivid_create_devnodes()
1514 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1515 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1516 vfd->queue = &dev->vb_vbi_cap_q; in vivid_create_devnodes()
1517 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1518 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1522 dev->vbi_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1523 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_cap_pad); in vivid_create_devnodes()
1531 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s, supports %s VBI\n", in vivid_create_devnodes()
1533 (dev->has_raw_vbi_cap && dev->has_sliced_vbi_cap) ? in vivid_create_devnodes()
1535 (dev->has_raw_vbi_cap ? "raw" : "sliced")); in vivid_create_devnodes()
1538 if (dev->has_vbi_out) { in vivid_create_devnodes()
1539 vfd = &dev->vbi_out_dev; in vivid_create_devnodes()
1540 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1541 "vivid-%03d-vbi-out", inst); in vivid_create_devnodes()
1542 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1543 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1544 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1545 vfd->device_caps = dev->vbi_out_caps; in vivid_create_devnodes()
1546 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1547 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1548 vfd->queue = &dev->vb_vbi_out_q; in vivid_create_devnodes()
1549 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1550 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1554 dev->vbi_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1555 ret = media_entity_pads_init(&vfd->entity, 1, &dev->vbi_out_pad); in vivid_create_devnodes()
1563 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, supports %s VBI\n", in vivid_create_devnodes()
1565 (dev->has_raw_vbi_out && dev->has_sliced_vbi_out) ? in vivid_create_devnodes()
1567 (dev->has_raw_vbi_out ? "raw" : "sliced")); in vivid_create_devnodes()
1570 if (dev->has_sdr_cap) { in vivid_create_devnodes()
1571 vfd = &dev->sdr_cap_dev; in vivid_create_devnodes()
1572 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1573 "vivid-%03d-sdr-cap", inst); in vivid_create_devnodes()
1574 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1575 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1576 vfd->device_caps = dev->sdr_cap_caps; in vivid_create_devnodes()
1577 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1578 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1579 vfd->queue = &dev->vb_sdr_cap_q; in vivid_create_devnodes()
1580 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1584 dev->sdr_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1585 ret = media_entity_pads_init(&vfd->entity, 1, &dev->sdr_cap_pad); in vivid_create_devnodes()
1593 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n", in vivid_create_devnodes()
1597 if (dev->has_radio_rx) { in vivid_create_devnodes()
1598 vfd = &dev->radio_rx_dev; in vivid_create_devnodes()
1599 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1600 "vivid-%03d-rad-rx", inst); in vivid_create_devnodes()
1601 vfd->fops = &vivid_radio_fops; in vivid_create_devnodes()
1602 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1603 vfd->device_caps = dev->radio_rx_caps; in vivid_create_devnodes()
1604 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1605 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1606 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1612 v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as %s\n", in vivid_create_devnodes()
1616 if (dev->has_radio_tx) { in vivid_create_devnodes()
1617 vfd = &dev->radio_tx_dev; in vivid_create_devnodes()
1618 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1619 "vivid-%03d-rad-tx", inst); in vivid_create_devnodes()
1620 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1621 vfd->fops = &vivid_radio_fops; in vivid_create_devnodes()
1622 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1623 vfd->device_caps = dev->radio_tx_caps; in vivid_create_devnodes()
1624 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1625 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1626 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1632 v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered as %s\n", in vivid_create_devnodes()
1636 if (dev->has_meta_cap) { in vivid_create_devnodes()
1637 vfd = &dev->meta_cap_dev; in vivid_create_devnodes()
1638 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1639 "vivid-%03d-meta-cap", inst); in vivid_create_devnodes()
1640 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1641 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1642 vfd->device_caps = dev->meta_cap_caps; in vivid_create_devnodes()
1643 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1644 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1645 vfd->queue = &dev->vb_meta_cap_q; in vivid_create_devnodes()
1646 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1647 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1650 dev->meta_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1651 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1652 &dev->meta_cap_pad); in vivid_create_devnodes()
1660 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1665 if (dev->has_meta_out) { in vivid_create_devnodes()
1666 vfd = &dev->meta_out_dev; in vivid_create_devnodes()
1667 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1668 "vivid-%03d-meta-out", inst); in vivid_create_devnodes()
1669 vfd->vfl_dir = VFL_DIR_TX; in vivid_create_devnodes()
1670 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1671 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1672 vfd->device_caps = dev->meta_out_caps; in vivid_create_devnodes()
1673 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1674 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1675 vfd->queue = &dev->vb_meta_out_q; in vivid_create_devnodes()
1676 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1677 vfd->tvnorms = tvnorms_out; in vivid_create_devnodes()
1680 dev->meta_out_pad.flags = MEDIA_PAD_FL_SOURCE; in vivid_create_devnodes()
1681 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1682 &dev->meta_out_pad); in vivid_create_devnodes()
1690 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1695 if (dev->has_touch_cap) { in vivid_create_devnodes()
1696 vfd = &dev->touch_cap_dev; in vivid_create_devnodes()
1697 snprintf(vfd->name, sizeof(vfd->name), in vivid_create_devnodes()
1698 "vivid-%03d-touch-cap", inst); in vivid_create_devnodes()
1699 vfd->fops = &vivid_fops; in vivid_create_devnodes()
1700 vfd->ioctl_ops = &vivid_ioctl_ops; in vivid_create_devnodes()
1701 vfd->device_caps = dev->touch_cap_caps; in vivid_create_devnodes()
1702 vfd->release = video_device_release_empty; in vivid_create_devnodes()
1703 vfd->v4l2_dev = &dev->v4l2_dev; in vivid_create_devnodes()
1704 vfd->queue = &dev->vb_touch_cap_q; in vivid_create_devnodes()
1705 vfd->tvnorms = tvnorms_cap; in vivid_create_devnodes()
1706 vfd->lock = &dev->mutex; in vivid_create_devnodes()
1709 dev->touch_cap_pad.flags = MEDIA_PAD_FL_SINK; in vivid_create_devnodes()
1710 ret = media_entity_pads_init(&vfd->entity, 1, in vivid_create_devnodes()
1711 &dev->touch_cap_pad); in vivid_create_devnodes()
1719 v4l2_info(&dev->v4l2_dev, in vivid_create_devnodes()
1726 ret = media_device_register(&dev->mdev); in vivid_create_devnodes()
1728 dev_err(dev->mdev.dev, in vivid_create_devnodes()
1756 return -ENOMEM; in vivid_create_instance()
1758 dev->inst = inst; in vivid_create_instance()
1761 dev->v4l2_dev.mdev = &dev->mdev; in vivid_create_instance()
1764 strscpy(dev->mdev.model, VIVID_MODULE_NAME, sizeof(dev->mdev.model)); in vivid_create_instance()
1765 snprintf(dev->mdev.bus_info, sizeof(dev->mdev.bus_info), in vivid_create_instance()
1766 "platform:%s-%03d", VIVID_MODULE_NAME, inst); in vivid_create_instance()
1767 dev->mdev.dev = &pdev->dev; in vivid_create_instance()
1768 media_device_init(&dev->mdev); in vivid_create_instance()
1769 dev->mdev.ops = &vivid_media_ops; in vivid_create_instance()
1773 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), in vivid_create_instance()
1774 "%s-%03d", VIVID_MODULE_NAME, inst); in vivid_create_instance()
1775 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); in vivid_create_instance()
1780 dev->v4l2_dev.release = vivid_dev_release; in vivid_create_instance()
1791 ret = -ENOMEM; in vivid_create_instance()
1793 tpg_init(&dev->tpg, 640, 360); in vivid_create_instance()
1794 if (tpg_alloc(&dev->tpg, array_size(MAX_WIDTH, MAX_ZOOM))) in vivid_create_instance()
1796 dev->scaled_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM)); in vivid_create_instance()
1797 if (!dev->scaled_line) in vivid_create_instance()
1799 dev->blended_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM)); in vivid_create_instance()
1800 if (!dev->blended_line) in vivid_create_instance()
1804 dev->edid = vmalloc(array_size(256, 128)); in vivid_create_instance()
1805 if (!dev->edid) in vivid_create_instance()
1816 dev->fmt_cap = &vivid_formats[0]; in vivid_create_instance()
1817 dev->fmt_out = &vivid_formats[0]; in vivid_create_instance()
1818 if (!dev->multiplanar) in vivid_create_instance()
1820 dev->webcam_size_idx = 1; in vivid_create_instance()
1821 dev->webcam_ival_idx = 3; in vivid_create_instance()
1822 tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc); in vivid_create_instance()
1823 dev->std_out = V4L2_STD_PAL; in vivid_create_instance()
1824 if (dev->input_type[0] == TV || dev->input_type[0] == SVID) in vivid_create_instance()
1826 if (dev->output_type[0] == SVID) in vivid_create_instance()
1829 dev->dv_timings_cap[i] = def_dv_timings; in vivid_create_instance()
1830 dev->std_cap[i] = V4L2_STD_PAL; in vivid_create_instance()
1832 dev->dv_timings_out = def_dv_timings; in vivid_create_instance()
1833 dev->tv_freq = 2804 /* 175.25 * 16 */; in vivid_create_instance()
1834 dev->tv_audmode = V4L2_TUNER_MODE_STEREO; in vivid_create_instance()
1835 dev->tv_field_cap = V4L2_FIELD_INTERLACED; in vivid_create_instance()
1836 dev->tv_field_out = V4L2_FIELD_INTERLACED; in vivid_create_instance()
1837 dev->radio_rx_freq = 95000 * 16; in vivid_create_instance()
1838 dev->radio_rx_audmode = V4L2_TUNER_MODE_STEREO; in vivid_create_instance()
1839 if (dev->has_radio_tx) { in vivid_create_instance()
1840 dev->radio_tx_freq = 95500 * 16; in vivid_create_instance()
1841 dev->radio_rds_loop = false; in vivid_create_instance()
1843 dev->radio_tx_subchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_RDS; in vivid_create_instance()
1844 dev->sdr_adc_freq = 300000; in vivid_create_instance()
1845 dev->sdr_fm_freq = 50000000; in vivid_create_instance()
1846 dev->sdr_pixelformat = V4L2_SDR_FMT_CU8; in vivid_create_instance()
1847 dev->sdr_buffersize = SDR_CAP_SAMPLES_PER_BUF * 2; in vivid_create_instance()
1849 dev->edid_max_blocks = dev->edid_blocks = 2; in vivid_create_instance()
1850 memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid)); in vivid_create_instance()
1851 dev->radio_rds_init_time = ktime_get(); in vivid_create_instance()
1854 ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj, in vivid_create_instance()
1862 if (dev->num_outputs && dev->output_type[0] != HDMI) in vivid_create_instance()
1863 v4l2_ctrl_activate(dev->ctrl_display_present, false); in vivid_create_instance()
1864 if (dev->num_inputs && dev->input_type[0] != HDMI) { in vivid_create_instance()
1865 v4l2_ctrl_activate(dev->ctrl_dv_timings_signal_mode, false); in vivid_create_instance()
1866 v4l2_ctrl_activate(dev->ctrl_dv_timings, false); in vivid_create_instance()
1867 } else if (dev->num_inputs && dev->input_type[0] == HDMI) { in vivid_create_instance()
1868 v4l2_ctrl_activate(dev->ctrl_std_signal_mode, false); in vivid_create_instance()
1869 v4l2_ctrl_activate(dev->ctrl_standard, false); in vivid_create_instance()
1880 dev->timeperframe_tch_cap.numerator = 1; in vivid_create_instance()
1881 dev->timeperframe_tch_cap.denominator = 10; in vivid_create_instance()
1885 spin_lock_init(&dev->slock); in vivid_create_instance()
1886 mutex_init(&dev->mutex); in vivid_create_instance()
1889 INIT_LIST_HEAD(&dev->vid_cap_active); in vivid_create_instance()
1890 INIT_LIST_HEAD(&dev->vid_out_active); in vivid_create_instance()
1891 INIT_LIST_HEAD(&dev->vbi_cap_active); in vivid_create_instance()
1892 INIT_LIST_HEAD(&dev->vbi_out_active); in vivid_create_instance()
1893 INIT_LIST_HEAD(&dev->sdr_cap_active); in vivid_create_instance()
1894 INIT_LIST_HEAD(&dev->meta_cap_active); in vivid_create_instance()
1895 INIT_LIST_HEAD(&dev->meta_out_active); in vivid_create_instance()
1896 INIT_LIST_HEAD(&dev->touch_cap_active); in vivid_create_instance()
1898 spin_lock_init(&dev->cec_xfers_slock); in vivid_create_instance()
1901 dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in vivid_create_instance()
1908 if (dev->has_vid_cap && in_type_counter[HDMI]) { in vivid_create_instance()
1915 dev->cec_rx_adap = adap; in vivid_create_instance()
1918 if (dev->has_vid_out) { in vivid_create_instance()
1919 for (i = 0; i < dev->num_outputs; i++) { in vivid_create_instance()
1922 if (dev->output_type[i] != HDMI) in vivid_create_instance()
1925 dev->cec_output2bus_map[i] = cec_tx_bus_cnt; in vivid_create_instance()
1929 for (i = 0; i < dev->num_outputs; i++) in vivid_create_instance()
1930 cec_delete_adapter(dev->cec_tx_adap[i]); in vivid_create_instance()
1934 dev->cec_tx_adap[cec_tx_bus_cnt] = adap; in vivid_create_instance()
1939 if (dev->cec_rx_adap || cec_tx_bus_cnt) { in vivid_create_instance()
1940 init_waitqueue_head(&dev->kthread_waitq_cec); in vivid_create_instance()
1941 dev->kthread_cec = kthread_run(vivid_cec_bus_thread, dev, in vivid_create_instance()
1942 "vivid_cec-%s", dev->v4l2_dev.name); in vivid_create_instance()
1943 if (IS_ERR(dev->kthread_cec)) { in vivid_create_instance()
1944 ret = PTR_ERR(dev->kthread_cec); in vivid_create_instance()
1945 dev->kthread_cec = NULL; in vivid_create_instance()
1946 v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n"); in vivid_create_instance()
1953 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap); in vivid_create_instance()
1954 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out); in vivid_create_instance()
1955 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_cap); in vivid_create_instance()
1956 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_out); in vivid_create_instance()
1957 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_rx); in vivid_create_instance()
1958 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_tx); in vivid_create_instance()
1959 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_sdr_cap); in vivid_create_instance()
1960 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_cap); in vivid_create_instance()
1961 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_meta_out); in vivid_create_instance()
1962 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_touch_cap); in vivid_create_instance()
1977 vb2_video_unregister_device(&dev->touch_cap_dev); in vivid_create_instance()
1978 vb2_video_unregister_device(&dev->meta_out_dev); in vivid_create_instance()
1979 vb2_video_unregister_device(&dev->meta_cap_dev); in vivid_create_instance()
1980 video_unregister_device(&dev->radio_tx_dev); in vivid_create_instance()
1981 video_unregister_device(&dev->radio_rx_dev); in vivid_create_instance()
1982 vb2_video_unregister_device(&dev->sdr_cap_dev); in vivid_create_instance()
1983 vb2_video_unregister_device(&dev->vbi_out_dev); in vivid_create_instance()
1984 vb2_video_unregister_device(&dev->vbi_cap_dev); in vivid_create_instance()
1985 vb2_video_unregister_device(&dev->vid_out_dev); in vivid_create_instance()
1986 vb2_video_unregister_device(&dev->vid_cap_dev); in vivid_create_instance()
1987 cec_unregister_adapter(dev->cec_rx_adap); in vivid_create_instance()
1989 cec_unregister_adapter(dev->cec_tx_adap[i]); in vivid_create_instance()
1990 if (dev->kthread_cec) in vivid_create_instance()
1991 kthread_stop(dev->kthread_cec); in vivid_create_instance()
1993 v4l2_device_put(&dev->v4l2_dev); in vivid_create_instance()
2010 return -ENODEV; in vivid_probe()
2013 tpg_set_font(font->data); in vivid_probe()
2048 if (dev->disconnect_error) in vivid_remove()
2051 media_device_unregister(&dev->mdev); in vivid_remove()
2054 if (dev->has_vid_cap) { in vivid_remove()
2055 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2056 video_device_node_name(&dev->vid_cap_dev)); in vivid_remove()
2057 vb2_video_unregister_device(&dev->vid_cap_dev); in vivid_remove()
2059 if (dev->has_vid_out) { in vivid_remove()
2060 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2061 video_device_node_name(&dev->vid_out_dev)); in vivid_remove()
2062 vb2_video_unregister_device(&dev->vid_out_dev); in vivid_remove()
2064 if (dev->has_vbi_cap) { in vivid_remove()
2065 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2066 video_device_node_name(&dev->vbi_cap_dev)); in vivid_remove()
2067 vb2_video_unregister_device(&dev->vbi_cap_dev); in vivid_remove()
2069 if (dev->has_vbi_out) { in vivid_remove()
2070 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2071 video_device_node_name(&dev->vbi_out_dev)); in vivid_remove()
2072 vb2_video_unregister_device(&dev->vbi_out_dev); in vivid_remove()
2074 if (dev->has_sdr_cap) { in vivid_remove()
2075 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2076 video_device_node_name(&dev->sdr_cap_dev)); in vivid_remove()
2077 vb2_video_unregister_device(&dev->sdr_cap_dev); in vivid_remove()
2079 if (dev->has_radio_rx) { in vivid_remove()
2080 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2081 video_device_node_name(&dev->radio_rx_dev)); in vivid_remove()
2082 video_unregister_device(&dev->radio_rx_dev); in vivid_remove()
2084 if (dev->has_radio_tx) { in vivid_remove()
2085 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2086 video_device_node_name(&dev->radio_tx_dev)); in vivid_remove()
2087 video_unregister_device(&dev->radio_tx_dev); in vivid_remove()
2089 if (dev->has_fb) { in vivid_remove()
2090 v4l2_info(&dev->v4l2_dev, "unregistering fb%d\n", in vivid_remove()
2091 dev->fb_info.node); in vivid_remove()
2092 unregister_framebuffer(&dev->fb_info); in vivid_remove()
2095 if (dev->has_meta_cap) { in vivid_remove()
2096 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2097 video_device_node_name(&dev->meta_cap_dev)); in vivid_remove()
2098 vb2_video_unregister_device(&dev->meta_cap_dev); in vivid_remove()
2100 if (dev->has_meta_out) { in vivid_remove()
2101 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2102 video_device_node_name(&dev->meta_out_dev)); in vivid_remove()
2103 vb2_video_unregister_device(&dev->meta_out_dev); in vivid_remove()
2105 if (dev->has_touch_cap) { in vivid_remove()
2106 v4l2_info(&dev->v4l2_dev, "unregistering %s\n", in vivid_remove()
2107 video_device_node_name(&dev->touch_cap_dev)); in vivid_remove()
2108 vb2_video_unregister_device(&dev->touch_cap_dev); in vivid_remove()
2110 cec_unregister_adapter(dev->cec_rx_adap); in vivid_remove()
2112 cec_unregister_adapter(dev->cec_tx_adap[j]); in vivid_remove()
2113 if (dev->kthread_cec) in vivid_remove()
2114 kthread_stop(dev->kthread_cec); in vivid_remove()
2115 v4l2_device_put(&dev->v4l2_dev); in vivid_remove()