perf tools: Don't clone maps from parent when synthesizing forks
[linux/fpc-iii.git] / drivers / media / platform / vivid / vivid-core.c
blob31db363602e5313e88d253f1fb77b9b06652efd9
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * vivid-core.c - A Virtual Video Test Driver, core initialization
5 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6 */
8 #include <linux/module.h>
9 #include <linux/errno.h>
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/sched.h>
13 #include <linux/slab.h>
14 #include <linux/vmalloc.h>
15 #include <linux/font.h>
16 #include <linux/mutex.h>
17 #include <linux/platform_device.h>
18 #include <linux/videodev2.h>
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"
41 #define VIVID_MODULE_NAME "vivid"
43 /* The maximum number of vivid devices */
44 #define VIVID_MAX_DEVS CONFIG_VIDEO_VIVID_MAX_DEVS
46 MODULE_DESCRIPTION("Virtual Video Test Driver");
47 MODULE_AUTHOR("Hans Verkuil");
48 MODULE_LICENSE("GPL");
50 static unsigned n_devs = 1;
51 module_param(n_devs, uint, 0444);
52 MODULE_PARM_DESC(n_devs, " number of driver instances to create");
54 static int vid_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
55 module_param_array(vid_cap_nr, int, NULL, 0444);
56 MODULE_PARM_DESC(vid_cap_nr, " videoX start number, -1 is autodetect");
58 static int vid_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
59 module_param_array(vid_out_nr, int, NULL, 0444);
60 MODULE_PARM_DESC(vid_out_nr, " videoX start number, -1 is autodetect");
62 static int vbi_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
63 module_param_array(vbi_cap_nr, int, NULL, 0444);
64 MODULE_PARM_DESC(vbi_cap_nr, " vbiX start number, -1 is autodetect");
66 static int vbi_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
67 module_param_array(vbi_out_nr, int, NULL, 0444);
68 MODULE_PARM_DESC(vbi_out_nr, " vbiX start number, -1 is autodetect");
70 static int sdr_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
71 module_param_array(sdr_cap_nr, int, NULL, 0444);
72 MODULE_PARM_DESC(sdr_cap_nr, " swradioX start number, -1 is autodetect");
74 static int radio_rx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
75 module_param_array(radio_rx_nr, int, NULL, 0444);
76 MODULE_PARM_DESC(radio_rx_nr, " radioX start number, -1 is autodetect");
78 static int radio_tx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
79 module_param_array(radio_tx_nr, int, NULL, 0444);
80 MODULE_PARM_DESC(radio_tx_nr, " radioX start number, -1 is autodetect");
82 static int ccs_cap_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
83 module_param_array(ccs_cap_mode, int, NULL, 0444);
84 MODULE_PARM_DESC(ccs_cap_mode, " capture crop/compose/scale mode:\n"
85 "\t\t bit 0=crop, 1=compose, 2=scale,\n"
86 "\t\t -1=user-controlled (default)");
88 static int ccs_out_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
89 module_param_array(ccs_out_mode, int, NULL, 0444);
90 MODULE_PARM_DESC(ccs_out_mode, " output crop/compose/scale mode:\n"
91 "\t\t bit 0=crop, 1=compose, 2=scale,\n"
92 "\t\t -1=user-controlled (default)");
94 static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 };
95 module_param_array(multiplanar, uint, NULL, 0444);
96 MODULE_PARM_DESC(multiplanar, " 1 (default) creates a single planar device, 2 creates a multiplanar device.");
98 /* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */
99 static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d };
100 module_param_array(node_types, uint, NULL, 0444);
101 MODULE_PARM_DESC(node_types, " node types, default is 0x1d3d. Bitmask with the following meaning:\n"
102 "\t\t bit 0: Video Capture node\n"
103 "\t\t bit 2-3: VBI Capture node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
104 "\t\t bit 4: Radio Receiver node\n"
105 "\t\t bit 5: Software Defined Radio Receiver node\n"
106 "\t\t bit 8: Video Output node\n"
107 "\t\t bit 10-11: VBI Output node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
108 "\t\t bit 12: Radio Transmitter node\n"
109 "\t\t bit 16: Framebuffer for testing overlays");
111 /* Default: 4 inputs */
112 static unsigned num_inputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 4 };
113 module_param_array(num_inputs, uint, NULL, 0444);
114 MODULE_PARM_DESC(num_inputs, " number of inputs, default is 4");
116 /* Default: input 0 = WEBCAM, 1 = TV, 2 = SVID, 3 = HDMI */
117 static unsigned input_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0xe4 };
118 module_param_array(input_types, uint, NULL, 0444);
119 MODULE_PARM_DESC(input_types, " input types, default is 0xe4. Two bits per input,\n"
120 "\t\t bits 0-1 == input 0, bits 31-30 == input 15.\n"
121 "\t\t Type 0 == webcam, 1 == TV, 2 == S-Video, 3 == HDMI");
123 /* Default: 2 outputs */
124 static unsigned num_outputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
125 module_param_array(num_outputs, uint, NULL, 0444);
126 MODULE_PARM_DESC(num_outputs, " number of outputs, default is 2");
128 /* Default: output 0 = SVID, 1 = HDMI */
129 static unsigned output_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
130 module_param_array(output_types, uint, NULL, 0444);
131 MODULE_PARM_DESC(output_types, " output types, default is 0x02. One bit per output,\n"
132 "\t\t bit 0 == output 0, bit 15 == output 15.\n"
133 "\t\t Type 0 == S-Video, 1 == HDMI");
135 unsigned vivid_debug;
136 module_param(vivid_debug, uint, 0644);
137 MODULE_PARM_DESC(vivid_debug, " activates debug info");
139 static bool no_error_inj;
140 module_param(no_error_inj, bool, 0444);
141 MODULE_PARM_DESC(no_error_inj, " if set disable the error injecting controls");
143 static unsigned int allocators[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0 };
144 module_param_array(allocators, uint, NULL, 0444);
145 MODULE_PARM_DESC(allocators, " memory allocator selection, default is 0.\n"
146 "\t\t 0 == vmalloc\n"
147 "\t\t 1 == dma-contig");
149 static struct vivid_dev *vivid_devs[VIVID_MAX_DEVS];
151 const struct v4l2_rect vivid_min_rect = {
152 0, 0, MIN_WIDTH, MIN_HEIGHT
155 const struct v4l2_rect vivid_max_rect = {
156 0, 0, MAX_WIDTH * MAX_ZOOM, MAX_HEIGHT * MAX_ZOOM
159 static const u8 vivid_hdmi_edid[256] = {
160 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
161 0x31, 0xd8, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
162 0x22, 0x1a, 0x01, 0x03, 0x80, 0x60, 0x36, 0x78,
163 0x0f, 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26,
164 0x0f, 0x50, 0x54, 0x2f, 0xcf, 0x00, 0x31, 0x59,
165 0x45, 0x59, 0x81, 0x80, 0x81, 0x40, 0x90, 0x40,
166 0x95, 0x00, 0xa9, 0x40, 0xb3, 0x00, 0x08, 0xe8,
167 0x00, 0x30, 0xf2, 0x70, 0x5a, 0x80, 0xb0, 0x58,
168 0x8a, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00, 0x1e,
169 0x00, 0x00, 0x00, 0xfd, 0x00, 0x18, 0x55, 0x18,
170 0x87, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20,
171 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x76,
172 0x69, 0x76, 0x69, 0x64, 0x0a, 0x20, 0x20, 0x20,
173 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x10,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7b,
177 0x02, 0x03, 0x3f, 0xf0, 0x51, 0x61, 0x60, 0x5f,
178 0x5e, 0x5d, 0x10, 0x1f, 0x04, 0x13, 0x22, 0x21,
179 0x20, 0x05, 0x14, 0x02, 0x11, 0x01, 0x23, 0x09,
180 0x07, 0x07, 0x83, 0x01, 0x00, 0x00, 0x6d, 0x03,
181 0x0c, 0x00, 0x10, 0x00, 0x00, 0x3c, 0x21, 0x00,
182 0x60, 0x01, 0x02, 0x03, 0x67, 0xd8, 0x5d, 0xc4,
183 0x01, 0x78, 0x00, 0x00, 0xe2, 0x00, 0xea, 0xe3,
184 0x05, 0x00, 0x00, 0xe3, 0x06, 0x01, 0x00, 0x4d,
185 0xd0, 0x00, 0xa0, 0xf0, 0x70, 0x3e, 0x80, 0x30,
186 0x20, 0x35, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00,
187 0x1e, 0x1a, 0x36, 0x80, 0xa0, 0x70, 0x38, 0x1f,
188 0x40, 0x30, 0x20, 0x35, 0x00, 0xc0, 0x1c, 0x32,
189 0x00, 0x00, 0x1a, 0x1a, 0x1d, 0x00, 0x80, 0x51,
190 0xd0, 0x1c, 0x20, 0x40, 0x80, 0x35, 0x00, 0xc0,
191 0x1c, 0x32, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
195 static int vidioc_querycap(struct file *file, void *priv,
196 struct v4l2_capability *cap)
198 struct vivid_dev *dev = video_drvdata(file);
200 strcpy(cap->driver, "vivid");
201 strcpy(cap->card, "vivid");
202 snprintf(cap->bus_info, sizeof(cap->bus_info),
203 "platform:%s", dev->v4l2_dev.name);
205 cap->capabilities = dev->vid_cap_caps | dev->vid_out_caps |
206 dev->vbi_cap_caps | dev->vbi_out_caps |
207 dev->radio_rx_caps | dev->radio_tx_caps |
208 dev->sdr_cap_caps | V4L2_CAP_DEVICE_CAPS;
209 return 0;
212 static int vidioc_s_hw_freq_seek(struct file *file, void *fh, const struct v4l2_hw_freq_seek *a)
214 struct video_device *vdev = video_devdata(file);
216 if (vdev->vfl_type == VFL_TYPE_RADIO)
217 return vivid_radio_rx_s_hw_freq_seek(file, fh, a);
218 return -ENOTTY;
221 static int vidioc_enum_freq_bands(struct file *file, void *fh, struct v4l2_frequency_band *band)
223 struct video_device *vdev = video_devdata(file);
225 if (vdev->vfl_type == VFL_TYPE_RADIO)
226 return vivid_radio_rx_enum_freq_bands(file, fh, band);
227 if (vdev->vfl_type == VFL_TYPE_SDR)
228 return vivid_sdr_enum_freq_bands(file, fh, band);
229 return -ENOTTY;
232 static int vidioc_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
234 struct video_device *vdev = video_devdata(file);
236 if (vdev->vfl_type == VFL_TYPE_RADIO)
237 return vivid_radio_rx_g_tuner(file, fh, vt);
238 if (vdev->vfl_type == VFL_TYPE_SDR)
239 return vivid_sdr_g_tuner(file, fh, vt);
240 return vivid_video_g_tuner(file, fh, vt);
243 static int vidioc_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)
245 struct video_device *vdev = video_devdata(file);
247 if (vdev->vfl_type == VFL_TYPE_RADIO)
248 return vivid_radio_rx_s_tuner(file, fh, vt);
249 if (vdev->vfl_type == VFL_TYPE_SDR)
250 return vivid_sdr_s_tuner(file, fh, vt);
251 return vivid_video_s_tuner(file, fh, vt);
254 static int vidioc_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
256 struct vivid_dev *dev = video_drvdata(file);
257 struct video_device *vdev = video_devdata(file);
259 if (vdev->vfl_type == VFL_TYPE_RADIO)
260 return vivid_radio_g_frequency(file,
261 vdev->vfl_dir == VFL_DIR_RX ?
262 &dev->radio_rx_freq : &dev->radio_tx_freq, vf);
263 if (vdev->vfl_type == VFL_TYPE_SDR)
264 return vivid_sdr_g_frequency(file, fh, vf);
265 return vivid_video_g_frequency(file, fh, vf);
268 static int vidioc_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)
270 struct vivid_dev *dev = video_drvdata(file);
271 struct video_device *vdev = video_devdata(file);
273 if (vdev->vfl_type == VFL_TYPE_RADIO)
274 return vivid_radio_s_frequency(file,
275 vdev->vfl_dir == VFL_DIR_RX ?
276 &dev->radio_rx_freq : &dev->radio_tx_freq, vf);
277 if (vdev->vfl_type == VFL_TYPE_SDR)
278 return vivid_sdr_s_frequency(file, fh, vf);
279 return vivid_video_s_frequency(file, fh, vf);
282 static int vidioc_overlay(struct file *file, void *fh, unsigned i)
284 struct video_device *vdev = video_devdata(file);
286 if (vdev->vfl_dir == VFL_DIR_RX)
287 return vivid_vid_cap_overlay(file, fh, i);
288 return vivid_vid_out_overlay(file, fh, i);
291 static int vidioc_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *a)
293 struct video_device *vdev = video_devdata(file);
295 if (vdev->vfl_dir == VFL_DIR_RX)
296 return vivid_vid_cap_g_fbuf(file, fh, a);
297 return vivid_vid_out_g_fbuf(file, fh, a);
300 static int vidioc_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *a)
302 struct video_device *vdev = video_devdata(file);
304 if (vdev->vfl_dir == VFL_DIR_RX)
305 return vivid_vid_cap_s_fbuf(file, fh, a);
306 return vivid_vid_out_s_fbuf(file, fh, a);
309 static int vidioc_s_std(struct file *file, void *fh, v4l2_std_id id)
311 struct video_device *vdev = video_devdata(file);
313 if (vdev->vfl_dir == VFL_DIR_RX)
314 return vivid_vid_cap_s_std(file, fh, id);
315 return vivid_vid_out_s_std(file, fh, id);
318 static int vidioc_s_dv_timings(struct file *file, void *fh, struct v4l2_dv_timings *timings)
320 struct video_device *vdev = video_devdata(file);
322 if (vdev->vfl_dir == VFL_DIR_RX)
323 return vivid_vid_cap_s_dv_timings(file, fh, timings);
324 return vivid_vid_out_s_dv_timings(file, fh, timings);
327 static int vidioc_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cc)
329 struct video_device *vdev = video_devdata(file);
331 if (vdev->vfl_dir == VFL_DIR_RX)
332 return vivid_vid_cap_cropcap(file, fh, cc);
333 return vivid_vid_out_cropcap(file, fh, cc);
336 static int vidioc_g_selection(struct file *file, void *fh,
337 struct v4l2_selection *sel)
339 struct video_device *vdev = video_devdata(file);
341 if (vdev->vfl_dir == VFL_DIR_RX)
342 return vivid_vid_cap_g_selection(file, fh, sel);
343 return vivid_vid_out_g_selection(file, fh, sel);
346 static int vidioc_s_selection(struct file *file, void *fh,
347 struct v4l2_selection *sel)
349 struct video_device *vdev = video_devdata(file);
351 if (vdev->vfl_dir == VFL_DIR_RX)
352 return vivid_vid_cap_s_selection(file, fh, sel);
353 return vivid_vid_out_s_selection(file, fh, sel);
356 static int vidioc_g_parm(struct file *file, void *fh,
357 struct v4l2_streamparm *parm)
359 struct video_device *vdev = video_devdata(file);
361 if (vdev->vfl_dir == VFL_DIR_RX)
362 return vivid_vid_cap_g_parm(file, fh, parm);
363 return vivid_vid_out_g_parm(file, fh, parm);
366 static int vidioc_s_parm(struct file *file, void *fh,
367 struct v4l2_streamparm *parm)
369 struct video_device *vdev = video_devdata(file);
371 if (vdev->vfl_dir == VFL_DIR_RX)
372 return vivid_vid_cap_s_parm(file, fh, parm);
373 return vivid_vid_out_g_parm(file, fh, parm);
376 static int vidioc_log_status(struct file *file, void *fh)
378 struct vivid_dev *dev = video_drvdata(file);
379 struct video_device *vdev = video_devdata(file);
381 v4l2_ctrl_log_status(file, fh);
382 if (vdev->vfl_dir == VFL_DIR_RX && vdev->vfl_type == VFL_TYPE_GRABBER)
383 tpg_log_status(&dev->tpg);
384 return 0;
387 static ssize_t vivid_radio_read(struct file *file, char __user *buf,
388 size_t size, loff_t *offset)
390 struct video_device *vdev = video_devdata(file);
392 if (vdev->vfl_dir == VFL_DIR_TX)
393 return -EINVAL;
394 return vivid_radio_rx_read(file, buf, size, offset);
397 static ssize_t vivid_radio_write(struct file *file, const char __user *buf,
398 size_t size, loff_t *offset)
400 struct video_device *vdev = video_devdata(file);
402 if (vdev->vfl_dir == VFL_DIR_RX)
403 return -EINVAL;
404 return vivid_radio_tx_write(file, buf, size, offset);
407 static __poll_t vivid_radio_poll(struct file *file, struct poll_table_struct *wait)
409 struct video_device *vdev = video_devdata(file);
411 if (vdev->vfl_dir == VFL_DIR_RX)
412 return vivid_radio_rx_poll(file, wait);
413 return vivid_radio_tx_poll(file, wait);
416 static bool vivid_is_in_use(struct video_device *vdev)
418 unsigned long flags;
419 bool res;
421 spin_lock_irqsave(&vdev->fh_lock, flags);
422 res = !list_empty(&vdev->fh_list);
423 spin_unlock_irqrestore(&vdev->fh_lock, flags);
424 return res;
427 static bool vivid_is_last_user(struct vivid_dev *dev)
429 unsigned uses = vivid_is_in_use(&dev->vid_cap_dev) +
430 vivid_is_in_use(&dev->vid_out_dev) +
431 vivid_is_in_use(&dev->vbi_cap_dev) +
432 vivid_is_in_use(&dev->vbi_out_dev) +
433 vivid_is_in_use(&dev->sdr_cap_dev) +
434 vivid_is_in_use(&dev->radio_rx_dev) +
435 vivid_is_in_use(&dev->radio_tx_dev);
437 return uses == 1;
440 static int vivid_fop_release(struct file *file)
442 struct vivid_dev *dev = video_drvdata(file);
443 struct video_device *vdev = video_devdata(file);
445 mutex_lock(&dev->mutex);
446 if (!no_error_inj && v4l2_fh_is_singular_file(file) &&
447 !video_is_registered(vdev) && vivid_is_last_user(dev)) {
449 * I am the last user of this driver, and a disconnect
450 * was forced (since this video_device is unregistered),
451 * so re-register all video_device's again.
453 v4l2_info(&dev->v4l2_dev, "reconnect\n");
454 set_bit(V4L2_FL_REGISTERED, &dev->vid_cap_dev.flags);
455 set_bit(V4L2_FL_REGISTERED, &dev->vid_out_dev.flags);
456 set_bit(V4L2_FL_REGISTERED, &dev->vbi_cap_dev.flags);
457 set_bit(V4L2_FL_REGISTERED, &dev->vbi_out_dev.flags);
458 set_bit(V4L2_FL_REGISTERED, &dev->sdr_cap_dev.flags);
459 set_bit(V4L2_FL_REGISTERED, &dev->radio_rx_dev.flags);
460 set_bit(V4L2_FL_REGISTERED, &dev->radio_tx_dev.flags);
462 mutex_unlock(&dev->mutex);
463 if (file->private_data == dev->overlay_cap_owner)
464 dev->overlay_cap_owner = NULL;
465 if (file->private_data == dev->radio_rx_rds_owner) {
466 dev->radio_rx_rds_last_block = 0;
467 dev->radio_rx_rds_owner = NULL;
469 if (file->private_data == dev->radio_tx_rds_owner) {
470 dev->radio_tx_rds_last_block = 0;
471 dev->radio_tx_rds_owner = NULL;
473 if (vdev->queue)
474 return vb2_fop_release(file);
475 return v4l2_fh_release(file);
478 static const struct v4l2_file_operations vivid_fops = {
479 .owner = THIS_MODULE,
480 .open = v4l2_fh_open,
481 .release = vivid_fop_release,
482 .read = vb2_fop_read,
483 .write = vb2_fop_write,
484 .poll = vb2_fop_poll,
485 .unlocked_ioctl = video_ioctl2,
486 .mmap = vb2_fop_mmap,
489 static const struct v4l2_file_operations vivid_radio_fops = {
490 .owner = THIS_MODULE,
491 .open = v4l2_fh_open,
492 .release = vivid_fop_release,
493 .read = vivid_radio_read,
494 .write = vivid_radio_write,
495 .poll = vivid_radio_poll,
496 .unlocked_ioctl = video_ioctl2,
499 static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
500 .vidioc_querycap = vidioc_querycap,
502 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid,
503 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
504 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
505 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
506 .vidioc_enum_fmt_vid_cap_mplane = vidioc_enum_fmt_vid_mplane,
507 .vidioc_g_fmt_vid_cap_mplane = vidioc_g_fmt_vid_cap_mplane,
508 .vidioc_try_fmt_vid_cap_mplane = vidioc_try_fmt_vid_cap_mplane,
509 .vidioc_s_fmt_vid_cap_mplane = vidioc_s_fmt_vid_cap_mplane,
511 .vidioc_enum_fmt_vid_out = vidioc_enum_fmt_vid,
512 .vidioc_g_fmt_vid_out = vidioc_g_fmt_vid_out,
513 .vidioc_try_fmt_vid_out = vidioc_try_fmt_vid_out,
514 .vidioc_s_fmt_vid_out = vidioc_s_fmt_vid_out,
515 .vidioc_enum_fmt_vid_out_mplane = vidioc_enum_fmt_vid_mplane,
516 .vidioc_g_fmt_vid_out_mplane = vidioc_g_fmt_vid_out_mplane,
517 .vidioc_try_fmt_vid_out_mplane = vidioc_try_fmt_vid_out_mplane,
518 .vidioc_s_fmt_vid_out_mplane = vidioc_s_fmt_vid_out_mplane,
520 .vidioc_g_selection = vidioc_g_selection,
521 .vidioc_s_selection = vidioc_s_selection,
522 .vidioc_cropcap = vidioc_cropcap,
524 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
525 .vidioc_try_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
526 .vidioc_s_fmt_vbi_cap = vidioc_s_fmt_vbi_cap,
528 .vidioc_g_fmt_sliced_vbi_cap = vidioc_g_fmt_sliced_vbi_cap,
529 .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_fmt_sliced_vbi_cap,
530 .vidioc_s_fmt_sliced_vbi_cap = vidioc_s_fmt_sliced_vbi_cap,
531 .vidioc_g_sliced_vbi_cap = vidioc_g_sliced_vbi_cap,
533 .vidioc_g_fmt_vbi_out = vidioc_g_fmt_vbi_out,
534 .vidioc_try_fmt_vbi_out = vidioc_g_fmt_vbi_out,
535 .vidioc_s_fmt_vbi_out = vidioc_s_fmt_vbi_out,
537 .vidioc_g_fmt_sliced_vbi_out = vidioc_g_fmt_sliced_vbi_out,
538 .vidioc_try_fmt_sliced_vbi_out = vidioc_try_fmt_sliced_vbi_out,
539 .vidioc_s_fmt_sliced_vbi_out = vidioc_s_fmt_sliced_vbi_out,
541 .vidioc_enum_fmt_sdr_cap = vidioc_enum_fmt_sdr_cap,
542 .vidioc_g_fmt_sdr_cap = vidioc_g_fmt_sdr_cap,
543 .vidioc_try_fmt_sdr_cap = vidioc_try_fmt_sdr_cap,
544 .vidioc_s_fmt_sdr_cap = vidioc_s_fmt_sdr_cap,
546 .vidioc_overlay = vidioc_overlay,
547 .vidioc_enum_framesizes = vidioc_enum_framesizes,
548 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
549 .vidioc_g_parm = vidioc_g_parm,
550 .vidioc_s_parm = vidioc_s_parm,
552 .vidioc_enum_fmt_vid_overlay = vidioc_enum_fmt_vid_overlay,
553 .vidioc_g_fmt_vid_overlay = vidioc_g_fmt_vid_overlay,
554 .vidioc_try_fmt_vid_overlay = vidioc_try_fmt_vid_overlay,
555 .vidioc_s_fmt_vid_overlay = vidioc_s_fmt_vid_overlay,
556 .vidioc_g_fmt_vid_out_overlay = vidioc_g_fmt_vid_out_overlay,
557 .vidioc_try_fmt_vid_out_overlay = vidioc_try_fmt_vid_out_overlay,
558 .vidioc_s_fmt_vid_out_overlay = vidioc_s_fmt_vid_out_overlay,
559 .vidioc_g_fbuf = vidioc_g_fbuf,
560 .vidioc_s_fbuf = vidioc_s_fbuf,
562 .vidioc_reqbufs = vb2_ioctl_reqbufs,
563 .vidioc_create_bufs = vb2_ioctl_create_bufs,
564 .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
565 .vidioc_querybuf = vb2_ioctl_querybuf,
566 .vidioc_qbuf = vb2_ioctl_qbuf,
567 .vidioc_dqbuf = vb2_ioctl_dqbuf,
568 .vidioc_expbuf = vb2_ioctl_expbuf,
569 .vidioc_streamon = vb2_ioctl_streamon,
570 .vidioc_streamoff = vb2_ioctl_streamoff,
572 .vidioc_enum_input = vidioc_enum_input,
573 .vidioc_g_input = vidioc_g_input,
574 .vidioc_s_input = vidioc_s_input,
575 .vidioc_s_audio = vidioc_s_audio,
576 .vidioc_g_audio = vidioc_g_audio,
577 .vidioc_enumaudio = vidioc_enumaudio,
578 .vidioc_s_frequency = vidioc_s_frequency,
579 .vidioc_g_frequency = vidioc_g_frequency,
580 .vidioc_s_tuner = vidioc_s_tuner,
581 .vidioc_g_tuner = vidioc_g_tuner,
582 .vidioc_s_modulator = vidioc_s_modulator,
583 .vidioc_g_modulator = vidioc_g_modulator,
584 .vidioc_s_hw_freq_seek = vidioc_s_hw_freq_seek,
585 .vidioc_enum_freq_bands = vidioc_enum_freq_bands,
587 .vidioc_enum_output = vidioc_enum_output,
588 .vidioc_g_output = vidioc_g_output,
589 .vidioc_s_output = vidioc_s_output,
590 .vidioc_s_audout = vidioc_s_audout,
591 .vidioc_g_audout = vidioc_g_audout,
592 .vidioc_enumaudout = vidioc_enumaudout,
594 .vidioc_querystd = vidioc_querystd,
595 .vidioc_g_std = vidioc_g_std,
596 .vidioc_s_std = vidioc_s_std,
597 .vidioc_s_dv_timings = vidioc_s_dv_timings,
598 .vidioc_g_dv_timings = vidioc_g_dv_timings,
599 .vidioc_query_dv_timings = vidioc_query_dv_timings,
600 .vidioc_enum_dv_timings = vidioc_enum_dv_timings,
601 .vidioc_dv_timings_cap = vidioc_dv_timings_cap,
602 .vidioc_g_edid = vidioc_g_edid,
603 .vidioc_s_edid = vidioc_s_edid,
605 .vidioc_log_status = vidioc_log_status,
606 .vidioc_subscribe_event = vidioc_subscribe_event,
607 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
610 /* -----------------------------------------------------------------
611 Initialization and module stuff
612 ------------------------------------------------------------------*/
614 static void vivid_dev_release(struct v4l2_device *v4l2_dev)
616 struct vivid_dev *dev = container_of(v4l2_dev, struct vivid_dev, v4l2_dev);
618 vivid_free_controls(dev);
619 v4l2_device_unregister(&dev->v4l2_dev);
620 vfree(dev->scaled_line);
621 vfree(dev->blended_line);
622 vfree(dev->edid);
623 vfree(dev->bitmap_cap);
624 vfree(dev->bitmap_out);
625 tpg_free(&dev->tpg);
626 kfree(dev->query_dv_timings_qmenu);
627 kfree(dev);
630 static int vivid_create_instance(struct platform_device *pdev, int inst)
632 static const struct v4l2_dv_timings def_dv_timings =
633 V4L2_DV_BT_CEA_1280X720P60;
634 static const struct vb2_mem_ops * const vivid_mem_ops[2] = {
635 &vb2_vmalloc_memops,
636 &vb2_dma_contig_memops,
638 unsigned in_type_counter[4] = { 0, 0, 0, 0 };
639 unsigned out_type_counter[4] = { 0, 0, 0, 0 };
640 int ccs_cap = ccs_cap_mode[inst];
641 int ccs_out = ccs_out_mode[inst];
642 bool has_tuner;
643 bool has_modulator;
644 struct vivid_dev *dev;
645 struct video_device *vfd;
646 struct vb2_queue *q;
647 unsigned node_type = node_types[inst];
648 unsigned int allocator = allocators[inst];
649 v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;
650 int ret;
651 int i;
653 /* allocate main vivid state structure */
654 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
655 if (!dev)
656 return -ENOMEM;
658 dev->inst = inst;
660 /* register v4l2_device */
661 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
662 "%s-%03d", VIVID_MODULE_NAME, inst);
663 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
664 if (ret) {
665 kfree(dev);
666 return ret;
668 dev->v4l2_dev.release = vivid_dev_release;
670 /* start detecting feature set */
672 /* do we use single- or multi-planar? */
673 dev->multiplanar = multiplanar[inst] > 1;
674 v4l2_info(&dev->v4l2_dev, "using %splanar format API\n",
675 dev->multiplanar ? "multi" : "single ");
677 /* how many inputs do we have and of what type? */
678 dev->num_inputs = num_inputs[inst];
679 if (dev->num_inputs < 1)
680 dev->num_inputs = 1;
681 if (dev->num_inputs >= MAX_INPUTS)
682 dev->num_inputs = MAX_INPUTS;
683 for (i = 0; i < dev->num_inputs; i++) {
684 dev->input_type[i] = (input_types[inst] >> (i * 2)) & 0x3;
685 dev->input_name_counter[i] = in_type_counter[dev->input_type[i]]++;
687 dev->has_audio_inputs = in_type_counter[TV] && in_type_counter[SVID];
688 if (in_type_counter[HDMI] == 16) {
689 /* The CEC physical address only allows for max 15 inputs */
690 in_type_counter[HDMI]--;
691 dev->num_inputs--;
694 /* how many outputs do we have and of what type? */
695 dev->num_outputs = num_outputs[inst];
696 if (dev->num_outputs < 1)
697 dev->num_outputs = 1;
698 if (dev->num_outputs >= MAX_OUTPUTS)
699 dev->num_outputs = MAX_OUTPUTS;
700 for (i = 0; i < dev->num_outputs; i++) {
701 dev->output_type[i] = ((output_types[inst] >> i) & 1) ? HDMI : SVID;
702 dev->output_name_counter[i] = out_type_counter[dev->output_type[i]]++;
704 dev->has_audio_outputs = out_type_counter[SVID];
705 if (out_type_counter[HDMI] == 16) {
707 * The CEC physical address only allows for max 15 inputs,
708 * so outputs are also limited to 15 to allow for easy
709 * CEC output to input mapping.
711 out_type_counter[HDMI]--;
712 dev->num_outputs--;
715 /* do we create a video capture device? */
716 dev->has_vid_cap = node_type & 0x0001;
718 /* do we create a vbi capture device? */
719 if (in_type_counter[TV] || in_type_counter[SVID]) {
720 dev->has_raw_vbi_cap = node_type & 0x0004;
721 dev->has_sliced_vbi_cap = node_type & 0x0008;
722 dev->has_vbi_cap = dev->has_raw_vbi_cap | dev->has_sliced_vbi_cap;
725 /* do we create a video output device? */
726 dev->has_vid_out = node_type & 0x0100;
728 /* do we create a vbi output device? */
729 if (out_type_counter[SVID]) {
730 dev->has_raw_vbi_out = node_type & 0x0400;
731 dev->has_sliced_vbi_out = node_type & 0x0800;
732 dev->has_vbi_out = dev->has_raw_vbi_out | dev->has_sliced_vbi_out;
735 /* do we create a radio receiver device? */
736 dev->has_radio_rx = node_type & 0x0010;
738 /* do we create a radio transmitter device? */
739 dev->has_radio_tx = node_type & 0x1000;
741 /* do we create a software defined radio capture device? */
742 dev->has_sdr_cap = node_type & 0x0020;
744 /* do we have a tuner? */
745 has_tuner = ((dev->has_vid_cap || dev->has_vbi_cap) && in_type_counter[TV]) ||
746 dev->has_radio_rx || dev->has_sdr_cap;
748 /* do we have a modulator? */
749 has_modulator = dev->has_radio_tx;
751 if (dev->has_vid_cap)
752 /* do we have a framebuffer for overlay testing? */
753 dev->has_fb = node_type & 0x10000;
755 /* can we do crop/compose/scaling while capturing? */
756 if (no_error_inj && ccs_cap == -1)
757 ccs_cap = 7;
759 /* if ccs_cap == -1, then the use can select it using controls */
760 if (ccs_cap != -1) {
761 dev->has_crop_cap = ccs_cap & 1;
762 dev->has_compose_cap = ccs_cap & 2;
763 dev->has_scaler_cap = ccs_cap & 4;
764 v4l2_info(&dev->v4l2_dev, "Capture Crop: %c Compose: %c Scaler: %c\n",
765 dev->has_crop_cap ? 'Y' : 'N',
766 dev->has_compose_cap ? 'Y' : 'N',
767 dev->has_scaler_cap ? 'Y' : 'N');
770 /* can we do crop/compose/scaling with video output? */
771 if (no_error_inj && ccs_out == -1)
772 ccs_out = 7;
774 /* if ccs_out == -1, then the use can select it using controls */
775 if (ccs_out != -1) {
776 dev->has_crop_out = ccs_out & 1;
777 dev->has_compose_out = ccs_out & 2;
778 dev->has_scaler_out = ccs_out & 4;
779 v4l2_info(&dev->v4l2_dev, "Output Crop: %c Compose: %c Scaler: %c\n",
780 dev->has_crop_out ? 'Y' : 'N',
781 dev->has_compose_out ? 'Y' : 'N',
782 dev->has_scaler_out ? 'Y' : 'N');
785 /* end detecting feature set */
787 if (dev->has_vid_cap) {
788 /* set up the capabilities of the video capture device */
789 dev->vid_cap_caps = dev->multiplanar ?
790 V4L2_CAP_VIDEO_CAPTURE_MPLANE :
791 V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY;
792 dev->vid_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
793 if (dev->has_audio_inputs)
794 dev->vid_cap_caps |= V4L2_CAP_AUDIO;
795 if (in_type_counter[TV])
796 dev->vid_cap_caps |= V4L2_CAP_TUNER;
798 if (dev->has_vid_out) {
799 /* set up the capabilities of the video output device */
800 dev->vid_out_caps = dev->multiplanar ?
801 V4L2_CAP_VIDEO_OUTPUT_MPLANE :
802 V4L2_CAP_VIDEO_OUTPUT;
803 if (dev->has_fb)
804 dev->vid_out_caps |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
805 dev->vid_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
806 if (dev->has_audio_outputs)
807 dev->vid_out_caps |= V4L2_CAP_AUDIO;
809 if (dev->has_vbi_cap) {
810 /* set up the capabilities of the vbi capture device */
811 dev->vbi_cap_caps = (dev->has_raw_vbi_cap ? V4L2_CAP_VBI_CAPTURE : 0) |
812 (dev->has_sliced_vbi_cap ? V4L2_CAP_SLICED_VBI_CAPTURE : 0);
813 dev->vbi_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
814 if (dev->has_audio_inputs)
815 dev->vbi_cap_caps |= V4L2_CAP_AUDIO;
816 if (in_type_counter[TV])
817 dev->vbi_cap_caps |= V4L2_CAP_TUNER;
819 if (dev->has_vbi_out) {
820 /* set up the capabilities of the vbi output device */
821 dev->vbi_out_caps = (dev->has_raw_vbi_out ? V4L2_CAP_VBI_OUTPUT : 0) |
822 (dev->has_sliced_vbi_out ? V4L2_CAP_SLICED_VBI_OUTPUT : 0);
823 dev->vbi_out_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
824 if (dev->has_audio_outputs)
825 dev->vbi_out_caps |= V4L2_CAP_AUDIO;
827 if (dev->has_sdr_cap) {
828 /* set up the capabilities of the sdr capture device */
829 dev->sdr_cap_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_TUNER;
830 dev->sdr_cap_caps |= V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
832 /* set up the capabilities of the radio receiver device */
833 if (dev->has_radio_rx)
834 dev->radio_rx_caps = V4L2_CAP_RADIO | V4L2_CAP_RDS_CAPTURE |
835 V4L2_CAP_HW_FREQ_SEEK | V4L2_CAP_TUNER |
836 V4L2_CAP_READWRITE;
837 /* set up the capabilities of the radio transmitter device */
838 if (dev->has_radio_tx)
839 dev->radio_tx_caps = V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR |
840 V4L2_CAP_READWRITE;
842 ret = -ENOMEM;
843 /* initialize the test pattern generator */
844 tpg_init(&dev->tpg, 640, 360);
845 if (tpg_alloc(&dev->tpg, MAX_ZOOM * MAX_WIDTH))
846 goto free_dev;
847 dev->scaled_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM));
848 if (!dev->scaled_line)
849 goto free_dev;
850 dev->blended_line = vzalloc(array_size(MAX_WIDTH, MAX_ZOOM));
851 if (!dev->blended_line)
852 goto free_dev;
854 /* load the edid */
855 dev->edid = vmalloc(256 * 128);
856 if (!dev->edid)
857 goto free_dev;
859 /* create a string array containing the names of all the preset timings */
860 while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width)
861 dev->query_dv_timings_size++;
862 dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size,
863 (sizeof(void *) + 32),
864 GFP_KERNEL);
865 if (dev->query_dv_timings_qmenu == NULL)
866 goto free_dev;
867 for (i = 0; i < dev->query_dv_timings_size; i++) {
868 const struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt;
869 char *p = (char *)&dev->query_dv_timings_qmenu[dev->query_dv_timings_size];
870 u32 htot, vtot;
872 p += i * 32;
873 dev->query_dv_timings_qmenu[i] = p;
875 htot = V4L2_DV_BT_FRAME_WIDTH(bt);
876 vtot = V4L2_DV_BT_FRAME_HEIGHT(bt);
877 snprintf(p, 32, "%ux%u%s%u",
878 bt->width, bt->height, bt->interlaced ? "i" : "p",
879 (u32)bt->pixelclock / (htot * vtot));
882 /* disable invalid ioctls based on the feature set */
883 if (!dev->has_audio_inputs) {
884 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_AUDIO);
885 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_AUDIO);
886 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMAUDIO);
887 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_AUDIO);
888 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_AUDIO);
889 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_ENUMAUDIO);
891 if (!dev->has_audio_outputs) {
892 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_AUDOUT);
893 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_AUDOUT);
894 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMAUDOUT);
895 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_AUDOUT);
896 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_AUDOUT);
897 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_ENUMAUDOUT);
899 if (!in_type_counter[TV] && !in_type_counter[SVID]) {
900 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_STD);
901 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_STD);
902 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMSTD);
903 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERYSTD);
905 if (!out_type_counter[SVID]) {
906 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_STD);
907 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_STD);
908 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMSTD);
910 if (!has_tuner && !has_modulator) {
911 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_FREQUENCY);
912 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_FREQUENCY);
913 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_FREQUENCY);
914 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_FREQUENCY);
916 if (!has_tuner) {
917 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_TUNER);
918 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_TUNER);
919 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_TUNER);
920 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_TUNER);
922 if (in_type_counter[HDMI] == 0) {
923 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_EDID);
924 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_EDID);
925 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_DV_TIMINGS_CAP);
926 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_DV_TIMINGS);
927 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_DV_TIMINGS);
928 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUM_DV_TIMINGS);
929 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERY_DV_TIMINGS);
931 if (out_type_counter[HDMI] == 0) {
932 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_EDID);
933 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_DV_TIMINGS_CAP);
934 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_DV_TIMINGS);
935 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_DV_TIMINGS);
936 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_DV_TIMINGS);
938 if (!dev->has_fb) {
939 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FBUF);
940 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FBUF);
941 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_OVERLAY);
943 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_HW_FREQ_SEEK);
944 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_HW_FREQ_SEEK);
945 v4l2_disable_ioctl(&dev->sdr_cap_dev, VIDIOC_S_HW_FREQ_SEEK);
946 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FREQUENCY);
947 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FREQUENCY);
948 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMESIZES);
949 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMEINTERVALS);
950 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_FREQUENCY);
951 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_FREQUENCY);
953 /* configure internal data */
954 dev->fmt_cap = &vivid_formats[0];
955 dev->fmt_out = &vivid_formats[0];
956 if (!dev->multiplanar)
957 vivid_formats[0].data_offset[0] = 0;
958 dev->webcam_size_idx = 1;
959 dev->webcam_ival_idx = 3;
960 tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc);
961 dev->std_cap = V4L2_STD_PAL;
962 dev->std_out = V4L2_STD_PAL;
963 if (dev->input_type[0] == TV || dev->input_type[0] == SVID)
964 tvnorms_cap = V4L2_STD_ALL;
965 if (dev->output_type[0] == SVID)
966 tvnorms_out = V4L2_STD_ALL;
967 dev->dv_timings_cap = def_dv_timings;
968 dev->dv_timings_out = def_dv_timings;
969 dev->tv_freq = 2804 /* 175.25 * 16 */;
970 dev->tv_audmode = V4L2_TUNER_MODE_STEREO;
971 dev->tv_field_cap = V4L2_FIELD_INTERLACED;
972 dev->tv_field_out = V4L2_FIELD_INTERLACED;
973 dev->radio_rx_freq = 95000 * 16;
974 dev->radio_rx_audmode = V4L2_TUNER_MODE_STEREO;
975 if (dev->has_radio_tx) {
976 dev->radio_tx_freq = 95500 * 16;
977 dev->radio_rds_loop = false;
979 dev->radio_tx_subchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_RDS;
980 dev->sdr_adc_freq = 300000;
981 dev->sdr_fm_freq = 50000000;
982 dev->sdr_pixelformat = V4L2_SDR_FMT_CU8;
983 dev->sdr_buffersize = SDR_CAP_SAMPLES_PER_BUF * 2;
985 dev->edid_max_blocks = dev->edid_blocks = 2;
986 memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid));
987 dev->radio_rds_init_time = ktime_get();
989 /* create all controls */
990 ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj,
991 in_type_counter[TV] || in_type_counter[SVID] ||
992 out_type_counter[SVID],
993 in_type_counter[HDMI] || out_type_counter[HDMI]);
994 if (ret)
995 goto unreg_dev;
998 * update the capture and output formats to do a proper initial
999 * configuration.
1001 vivid_update_format_cap(dev, false);
1002 vivid_update_format_out(dev);
1004 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap);
1005 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out);
1006 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_cap);
1007 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_out);
1008 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_rx);
1009 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_tx);
1010 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_sdr_cap);
1012 /* initialize overlay */
1013 dev->fb_cap.fmt.width = dev->src_rect.width;
1014 dev->fb_cap.fmt.height = dev->src_rect.height;
1015 dev->fb_cap.fmt.pixelformat = dev->fmt_cap->fourcc;
1016 dev->fb_cap.fmt.bytesperline = dev->src_rect.width * tpg_g_twopixelsize(&dev->tpg, 0) / 2;
1017 dev->fb_cap.fmt.sizeimage = dev->src_rect.height * dev->fb_cap.fmt.bytesperline;
1019 /* initialize locks */
1020 spin_lock_init(&dev->slock);
1021 mutex_init(&dev->mutex);
1023 /* init dma queues */
1024 INIT_LIST_HEAD(&dev->vid_cap_active);
1025 INIT_LIST_HEAD(&dev->vid_out_active);
1026 INIT_LIST_HEAD(&dev->vbi_cap_active);
1027 INIT_LIST_HEAD(&dev->vbi_out_active);
1028 INIT_LIST_HEAD(&dev->sdr_cap_active);
1030 INIT_LIST_HEAD(&dev->cec_work_list);
1031 spin_lock_init(&dev->cec_slock);
1033 * Same as create_singlethread_workqueue, but now I can use the
1034 * string formatting of alloc_ordered_workqueue.
1036 dev->cec_workqueue =
1037 alloc_ordered_workqueue("vivid-%03d-cec", WQ_MEM_RECLAIM, inst);
1038 if (!dev->cec_workqueue) {
1039 ret = -ENOMEM;
1040 goto unreg_dev;
1043 if (allocator == 1)
1044 dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
1045 else if (allocator >= ARRAY_SIZE(vivid_mem_ops))
1046 allocator = 0;
1048 /* start creating the vb2 queues */
1049 if (dev->has_vid_cap) {
1050 /* initialize vid_cap queue */
1051 q = &dev->vb_vid_cap_q;
1052 q->type = dev->multiplanar ? V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :
1053 V4L2_BUF_TYPE_VIDEO_CAPTURE;
1054 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1055 q->drv_priv = dev;
1056 q->buf_struct_size = sizeof(struct vivid_buffer);
1057 q->ops = &vivid_vid_cap_qops;
1058 q->mem_ops = vivid_mem_ops[allocator];
1059 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1060 q->min_buffers_needed = 2;
1061 q->lock = &dev->mutex;
1062 q->dev = dev->v4l2_dev.dev;
1064 ret = vb2_queue_init(q);
1065 if (ret)
1066 goto unreg_dev;
1069 if (dev->has_vid_out) {
1070 /* initialize vid_out queue */
1071 q = &dev->vb_vid_out_q;
1072 q->type = dev->multiplanar ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE :
1073 V4L2_BUF_TYPE_VIDEO_OUTPUT;
1074 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_WRITE;
1075 q->drv_priv = dev;
1076 q->buf_struct_size = sizeof(struct vivid_buffer);
1077 q->ops = &vivid_vid_out_qops;
1078 q->mem_ops = vivid_mem_ops[allocator];
1079 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1080 q->min_buffers_needed = 2;
1081 q->lock = &dev->mutex;
1082 q->dev = dev->v4l2_dev.dev;
1084 ret = vb2_queue_init(q);
1085 if (ret)
1086 goto unreg_dev;
1089 if (dev->has_vbi_cap) {
1090 /* initialize vbi_cap queue */
1091 q = &dev->vb_vbi_cap_q;
1092 q->type = dev->has_raw_vbi_cap ? V4L2_BUF_TYPE_VBI_CAPTURE :
1093 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
1094 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1095 q->drv_priv = dev;
1096 q->buf_struct_size = sizeof(struct vivid_buffer);
1097 q->ops = &vivid_vbi_cap_qops;
1098 q->mem_ops = vivid_mem_ops[allocator];
1099 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1100 q->min_buffers_needed = 2;
1101 q->lock = &dev->mutex;
1102 q->dev = dev->v4l2_dev.dev;
1104 ret = vb2_queue_init(q);
1105 if (ret)
1106 goto unreg_dev;
1109 if (dev->has_vbi_out) {
1110 /* initialize vbi_out queue */
1111 q = &dev->vb_vbi_out_q;
1112 q->type = dev->has_raw_vbi_out ? V4L2_BUF_TYPE_VBI_OUTPUT :
1113 V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
1114 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_WRITE;
1115 q->drv_priv = dev;
1116 q->buf_struct_size = sizeof(struct vivid_buffer);
1117 q->ops = &vivid_vbi_out_qops;
1118 q->mem_ops = vivid_mem_ops[allocator];
1119 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1120 q->min_buffers_needed = 2;
1121 q->lock = &dev->mutex;
1122 q->dev = dev->v4l2_dev.dev;
1124 ret = vb2_queue_init(q);
1125 if (ret)
1126 goto unreg_dev;
1129 if (dev->has_sdr_cap) {
1130 /* initialize sdr_cap queue */
1131 q = &dev->vb_sdr_cap_q;
1132 q->type = V4L2_BUF_TYPE_SDR_CAPTURE;
1133 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1134 q->drv_priv = dev;
1135 q->buf_struct_size = sizeof(struct vivid_buffer);
1136 q->ops = &vivid_sdr_cap_qops;
1137 q->mem_ops = vivid_mem_ops[allocator];
1138 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1139 q->min_buffers_needed = 8;
1140 q->lock = &dev->mutex;
1141 q->dev = dev->v4l2_dev.dev;
1143 ret = vb2_queue_init(q);
1144 if (ret)
1145 goto unreg_dev;
1148 if (dev->has_fb) {
1149 /* Create framebuffer for testing capture/output overlay */
1150 ret = vivid_fb_init(dev);
1151 if (ret)
1152 goto unreg_dev;
1153 v4l2_info(&dev->v4l2_dev, "Framebuffer device registered as fb%d\n",
1154 dev->fb_info.node);
1157 /* finally start creating the device nodes */
1158 if (dev->has_vid_cap) {
1159 vfd = &dev->vid_cap_dev;
1160 snprintf(vfd->name, sizeof(vfd->name),
1161 "vivid-%03d-vid-cap", inst);
1162 vfd->fops = &vivid_fops;
1163 vfd->ioctl_ops = &vivid_ioctl_ops;
1164 vfd->device_caps = dev->vid_cap_caps;
1165 vfd->release = video_device_release_empty;
1166 vfd->v4l2_dev = &dev->v4l2_dev;
1167 vfd->queue = &dev->vb_vid_cap_q;
1168 vfd->tvnorms = tvnorms_cap;
1171 * Provide a mutex to v4l2 core. It will be used to protect
1172 * all fops and v4l2 ioctls.
1174 vfd->lock = &dev->mutex;
1175 video_set_drvdata(vfd, dev);
1177 #ifdef CONFIG_VIDEO_VIVID_CEC
1178 if (in_type_counter[HDMI]) {
1179 struct cec_adapter *adap;
1181 adap = vivid_cec_alloc_adap(dev, 0, false);
1182 ret = PTR_ERR_OR_ZERO(adap);
1183 if (ret < 0)
1184 goto unreg_dev;
1185 dev->cec_rx_adap = adap;
1186 ret = cec_register_adapter(adap, &pdev->dev);
1187 if (ret < 0) {
1188 cec_delete_adapter(adap);
1189 dev->cec_rx_adap = NULL;
1190 goto unreg_dev;
1192 cec_s_phys_addr(adap, 0, false);
1193 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI input 0\n",
1194 dev_name(&adap->devnode.dev));
1196 #endif
1198 ret = video_register_device(vfd, VFL_TYPE_GRABBER, vid_cap_nr[inst]);
1199 if (ret < 0)
1200 goto unreg_dev;
1201 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n",
1202 video_device_node_name(vfd));
1205 if (dev->has_vid_out) {
1206 #ifdef CONFIG_VIDEO_VIVID_CEC
1207 unsigned int bus_cnt = 0;
1208 #endif
1210 vfd = &dev->vid_out_dev;
1211 snprintf(vfd->name, sizeof(vfd->name),
1212 "vivid-%03d-vid-out", inst);
1213 vfd->vfl_dir = VFL_DIR_TX;
1214 vfd->fops = &vivid_fops;
1215 vfd->ioctl_ops = &vivid_ioctl_ops;
1216 vfd->device_caps = dev->vid_out_caps;
1217 vfd->release = video_device_release_empty;
1218 vfd->v4l2_dev = &dev->v4l2_dev;
1219 vfd->queue = &dev->vb_vid_out_q;
1220 vfd->tvnorms = tvnorms_out;
1223 * Provide a mutex to v4l2 core. It will be used to protect
1224 * all fops and v4l2 ioctls.
1226 vfd->lock = &dev->mutex;
1227 video_set_drvdata(vfd, dev);
1229 #ifdef CONFIG_VIDEO_VIVID_CEC
1230 for (i = 0; i < dev->num_outputs; i++) {
1231 struct cec_adapter *adap;
1233 if (dev->output_type[i] != HDMI)
1234 continue;
1235 dev->cec_output2bus_map[i] = bus_cnt;
1236 adap = vivid_cec_alloc_adap(dev, bus_cnt, true);
1237 ret = PTR_ERR_OR_ZERO(adap);
1238 if (ret < 0)
1239 goto unreg_dev;
1240 dev->cec_tx_adap[bus_cnt] = adap;
1241 ret = cec_register_adapter(adap, &pdev->dev);
1242 if (ret < 0) {
1243 cec_delete_adapter(adap);
1244 dev->cec_tx_adap[bus_cnt] = NULL;
1245 goto unreg_dev;
1247 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI output %d\n",
1248 dev_name(&adap->devnode.dev), bus_cnt);
1249 bus_cnt++;
1250 if (bus_cnt <= out_type_counter[HDMI])
1251 cec_s_phys_addr(adap, bus_cnt << 12, false);
1252 else
1253 cec_s_phys_addr(adap, 0x1000, false);
1255 #endif
1257 ret = video_register_device(vfd, VFL_TYPE_GRABBER, vid_out_nr[inst]);
1258 if (ret < 0)
1259 goto unreg_dev;
1260 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s\n",
1261 video_device_node_name(vfd));
1264 if (dev->has_vbi_cap) {
1265 vfd = &dev->vbi_cap_dev;
1266 snprintf(vfd->name, sizeof(vfd->name),
1267 "vivid-%03d-vbi-cap", inst);
1268 vfd->fops = &vivid_fops;
1269 vfd->ioctl_ops = &vivid_ioctl_ops;
1270 vfd->device_caps = dev->vbi_cap_caps;
1271 vfd->release = video_device_release_empty;
1272 vfd->v4l2_dev = &dev->v4l2_dev;
1273 vfd->queue = &dev->vb_vbi_cap_q;
1274 vfd->lock = &dev->mutex;
1275 vfd->tvnorms = tvnorms_cap;
1276 video_set_drvdata(vfd, dev);
1278 ret = video_register_device(vfd, VFL_TYPE_VBI, vbi_cap_nr[inst]);
1279 if (ret < 0)
1280 goto unreg_dev;
1281 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s, supports %s VBI\n",
1282 video_device_node_name(vfd),
1283 (dev->has_raw_vbi_cap && dev->has_sliced_vbi_cap) ?
1284 "raw and sliced" :
1285 (dev->has_raw_vbi_cap ? "raw" : "sliced"));
1288 if (dev->has_vbi_out) {
1289 vfd = &dev->vbi_out_dev;
1290 snprintf(vfd->name, sizeof(vfd->name),
1291 "vivid-%03d-vbi-out", inst);
1292 vfd->vfl_dir = VFL_DIR_TX;
1293 vfd->fops = &vivid_fops;
1294 vfd->ioctl_ops = &vivid_ioctl_ops;
1295 vfd->device_caps = dev->vbi_out_caps;
1296 vfd->release = video_device_release_empty;
1297 vfd->v4l2_dev = &dev->v4l2_dev;
1298 vfd->queue = &dev->vb_vbi_out_q;
1299 vfd->lock = &dev->mutex;
1300 vfd->tvnorms = tvnorms_out;
1301 video_set_drvdata(vfd, dev);
1303 ret = video_register_device(vfd, VFL_TYPE_VBI, vbi_out_nr[inst]);
1304 if (ret < 0)
1305 goto unreg_dev;
1306 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, supports %s VBI\n",
1307 video_device_node_name(vfd),
1308 (dev->has_raw_vbi_out && dev->has_sliced_vbi_out) ?
1309 "raw and sliced" :
1310 (dev->has_raw_vbi_out ? "raw" : "sliced"));
1313 if (dev->has_sdr_cap) {
1314 vfd = &dev->sdr_cap_dev;
1315 snprintf(vfd->name, sizeof(vfd->name),
1316 "vivid-%03d-sdr-cap", inst);
1317 vfd->fops = &vivid_fops;
1318 vfd->ioctl_ops = &vivid_ioctl_ops;
1319 vfd->device_caps = dev->sdr_cap_caps;
1320 vfd->release = video_device_release_empty;
1321 vfd->v4l2_dev = &dev->v4l2_dev;
1322 vfd->queue = &dev->vb_sdr_cap_q;
1323 vfd->lock = &dev->mutex;
1324 video_set_drvdata(vfd, dev);
1326 ret = video_register_device(vfd, VFL_TYPE_SDR, sdr_cap_nr[inst]);
1327 if (ret < 0)
1328 goto unreg_dev;
1329 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n",
1330 video_device_node_name(vfd));
1333 if (dev->has_radio_rx) {
1334 vfd = &dev->radio_rx_dev;
1335 snprintf(vfd->name, sizeof(vfd->name),
1336 "vivid-%03d-rad-rx", inst);
1337 vfd->fops = &vivid_radio_fops;
1338 vfd->ioctl_ops = &vivid_ioctl_ops;
1339 vfd->device_caps = dev->radio_rx_caps;
1340 vfd->release = video_device_release_empty;
1341 vfd->v4l2_dev = &dev->v4l2_dev;
1342 vfd->lock = &dev->mutex;
1343 video_set_drvdata(vfd, dev);
1345 ret = video_register_device(vfd, VFL_TYPE_RADIO, radio_rx_nr[inst]);
1346 if (ret < 0)
1347 goto unreg_dev;
1348 v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as %s\n",
1349 video_device_node_name(vfd));
1352 if (dev->has_radio_tx) {
1353 vfd = &dev->radio_tx_dev;
1354 snprintf(vfd->name, sizeof(vfd->name),
1355 "vivid-%03d-rad-tx", inst);
1356 vfd->vfl_dir = VFL_DIR_TX;
1357 vfd->fops = &vivid_radio_fops;
1358 vfd->ioctl_ops = &vivid_ioctl_ops;
1359 vfd->device_caps = dev->radio_tx_caps;
1360 vfd->release = video_device_release_empty;
1361 vfd->v4l2_dev = &dev->v4l2_dev;
1362 vfd->lock = &dev->mutex;
1363 video_set_drvdata(vfd, dev);
1365 ret = video_register_device(vfd, VFL_TYPE_RADIO, radio_tx_nr[inst]);
1366 if (ret < 0)
1367 goto unreg_dev;
1368 v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered as %s\n",
1369 video_device_node_name(vfd));
1372 /* Now that everything is fine, let's add it to device list */
1373 vivid_devs[inst] = dev;
1375 return 0;
1377 unreg_dev:
1378 video_unregister_device(&dev->radio_tx_dev);
1379 video_unregister_device(&dev->radio_rx_dev);
1380 video_unregister_device(&dev->sdr_cap_dev);
1381 video_unregister_device(&dev->vbi_out_dev);
1382 video_unregister_device(&dev->vbi_cap_dev);
1383 video_unregister_device(&dev->vid_out_dev);
1384 video_unregister_device(&dev->vid_cap_dev);
1385 cec_unregister_adapter(dev->cec_rx_adap);
1386 for (i = 0; i < MAX_OUTPUTS; i++)
1387 cec_unregister_adapter(dev->cec_tx_adap[i]);
1388 if (dev->cec_workqueue) {
1389 vivid_cec_bus_free_work(dev);
1390 destroy_workqueue(dev->cec_workqueue);
1392 free_dev:
1393 v4l2_device_put(&dev->v4l2_dev);
1394 return ret;
1397 /* This routine allocates from 1 to n_devs virtual drivers.
1399 The real maximum number of virtual drivers will depend on how many drivers
1400 will succeed. This is limited to the maximum number of devices that
1401 videodev supports, which is equal to VIDEO_NUM_DEVICES.
1403 static int vivid_probe(struct platform_device *pdev)
1405 const struct font_desc *font = find_font("VGA8x16");
1406 int ret = 0, i;
1408 if (font == NULL) {
1409 pr_err("vivid: could not find font\n");
1410 return -ENODEV;
1413 tpg_set_font(font->data);
1415 n_devs = clamp_t(unsigned, n_devs, 1, VIVID_MAX_DEVS);
1417 for (i = 0; i < n_devs; i++) {
1418 ret = vivid_create_instance(pdev, i);
1419 if (ret) {
1420 /* If some instantiations succeeded, keep driver */
1421 if (i)
1422 ret = 0;
1423 break;
1427 if (ret < 0) {
1428 pr_err("vivid: error %d while loading driver\n", ret);
1429 return ret;
1432 /* n_devs will reflect the actual number of allocated devices */
1433 n_devs = i;
1435 return ret;
1438 static int vivid_remove(struct platform_device *pdev)
1440 struct vivid_dev *dev;
1441 unsigned int i, j;
1443 for (i = 0; i < n_devs; i++) {
1444 dev = vivid_devs[i];
1445 if (!dev)
1446 continue;
1448 if (dev->has_vid_cap) {
1449 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1450 video_device_node_name(&dev->vid_cap_dev));
1451 video_unregister_device(&dev->vid_cap_dev);
1453 if (dev->has_vid_out) {
1454 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1455 video_device_node_name(&dev->vid_out_dev));
1456 video_unregister_device(&dev->vid_out_dev);
1458 if (dev->has_vbi_cap) {
1459 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1460 video_device_node_name(&dev->vbi_cap_dev));
1461 video_unregister_device(&dev->vbi_cap_dev);
1463 if (dev->has_vbi_out) {
1464 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1465 video_device_node_name(&dev->vbi_out_dev));
1466 video_unregister_device(&dev->vbi_out_dev);
1468 if (dev->has_sdr_cap) {
1469 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1470 video_device_node_name(&dev->sdr_cap_dev));
1471 video_unregister_device(&dev->sdr_cap_dev);
1473 if (dev->has_radio_rx) {
1474 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1475 video_device_node_name(&dev->radio_rx_dev));
1476 video_unregister_device(&dev->radio_rx_dev);
1478 if (dev->has_radio_tx) {
1479 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1480 video_device_node_name(&dev->radio_tx_dev));
1481 video_unregister_device(&dev->radio_tx_dev);
1483 if (dev->has_fb) {
1484 v4l2_info(&dev->v4l2_dev, "unregistering fb%d\n",
1485 dev->fb_info.node);
1486 unregister_framebuffer(&dev->fb_info);
1487 vivid_fb_release_buffers(dev);
1489 cec_unregister_adapter(dev->cec_rx_adap);
1490 for (j = 0; j < MAX_OUTPUTS; j++)
1491 cec_unregister_adapter(dev->cec_tx_adap[j]);
1492 if (dev->cec_workqueue) {
1493 vivid_cec_bus_free_work(dev);
1494 destroy_workqueue(dev->cec_workqueue);
1496 v4l2_device_put(&dev->v4l2_dev);
1497 vivid_devs[i] = NULL;
1499 return 0;
1502 static void vivid_pdev_release(struct device *dev)
1506 static struct platform_device vivid_pdev = {
1507 .name = "vivid",
1508 .dev.release = vivid_pdev_release,
1511 static struct platform_driver vivid_pdrv = {
1512 .probe = vivid_probe,
1513 .remove = vivid_remove,
1514 .driver = {
1515 .name = "vivid",
1519 static int __init vivid_init(void)
1521 int ret;
1523 ret = platform_device_register(&vivid_pdev);
1524 if (ret)
1525 return ret;
1527 ret = platform_driver_register(&vivid_pdrv);
1528 if (ret)
1529 platform_device_unregister(&vivid_pdev);
1531 return ret;
1534 static void __exit vivid_exit(void)
1536 platform_driver_unregister(&vivid_pdrv);
1537 platform_device_unregister(&vivid_pdev);
1540 module_init(vivid_init);
1541 module_exit(vivid_exit);