Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cris-mirror.git] / drivers / media / platform / vivid / vivid-core.c
blob7f937136c3f5b76f0c3b8117352780782445f5bf
1 /*
2 * vivid-core.c - A Virtual Video Test Driver, core initialization
4 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6 * This program is free software; you may redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
11 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
13 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
14 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
15 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
16 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17 * SOFTWARE.
20 #include <linux/module.h>
21 #include <linux/errno.h>
22 #include <linux/kernel.h>
23 #include <linux/init.h>
24 #include <linux/sched.h>
25 #include <linux/slab.h>
26 #include <linux/vmalloc.h>
27 #include <linux/font.h>
28 #include <linux/mutex.h>
29 #include <linux/platform_device.h>
30 #include <linux/videodev2.h>
31 #include <linux/v4l2-dv-timings.h>
32 #include <media/videobuf2-vmalloc.h>
33 #include <media/v4l2-dv-timings.h>
34 #include <media/v4l2-ioctl.h>
35 #include <media/v4l2-fh.h>
36 #include <media/v4l2-event.h>
38 #include "vivid-core.h"
39 #include "vivid-vid-common.h"
40 #include "vivid-vid-cap.h"
41 #include "vivid-vid-out.h"
42 #include "vivid-radio-common.h"
43 #include "vivid-radio-rx.h"
44 #include "vivid-radio-tx.h"
45 #include "vivid-sdr-cap.h"
46 #include "vivid-vbi-cap.h"
47 #include "vivid-vbi-out.h"
48 #include "vivid-osd.h"
49 #include "vivid-cec.h"
50 #include "vivid-ctrls.h"
52 #define VIVID_MODULE_NAME "vivid"
54 /* The maximum number of vivid devices */
55 #define VIVID_MAX_DEVS CONFIG_VIDEO_VIVID_MAX_DEVS
57 MODULE_DESCRIPTION("Virtual Video Test Driver");
58 MODULE_AUTHOR("Hans Verkuil");
59 MODULE_LICENSE("GPL");
61 static unsigned n_devs = 1;
62 module_param(n_devs, uint, 0444);
63 MODULE_PARM_DESC(n_devs, " number of driver instances to create");
65 static int vid_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
66 module_param_array(vid_cap_nr, int, NULL, 0444);
67 MODULE_PARM_DESC(vid_cap_nr, " videoX start number, -1 is autodetect");
69 static int vid_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
70 module_param_array(vid_out_nr, int, NULL, 0444);
71 MODULE_PARM_DESC(vid_out_nr, " videoX start number, -1 is autodetect");
73 static int vbi_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
74 module_param_array(vbi_cap_nr, int, NULL, 0444);
75 MODULE_PARM_DESC(vbi_cap_nr, " vbiX start number, -1 is autodetect");
77 static int vbi_out_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
78 module_param_array(vbi_out_nr, int, NULL, 0444);
79 MODULE_PARM_DESC(vbi_out_nr, " vbiX start number, -1 is autodetect");
81 static int sdr_cap_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
82 module_param_array(sdr_cap_nr, int, NULL, 0444);
83 MODULE_PARM_DESC(sdr_cap_nr, " swradioX start number, -1 is autodetect");
85 static int radio_rx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
86 module_param_array(radio_rx_nr, int, NULL, 0444);
87 MODULE_PARM_DESC(radio_rx_nr, " radioX start number, -1 is autodetect");
89 static int radio_tx_nr[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
90 module_param_array(radio_tx_nr, int, NULL, 0444);
91 MODULE_PARM_DESC(radio_tx_nr, " radioX start number, -1 is autodetect");
93 static int ccs_cap_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
94 module_param_array(ccs_cap_mode, int, NULL, 0444);
95 MODULE_PARM_DESC(ccs_cap_mode, " capture crop/compose/scale mode:\n"
96 "\t\t bit 0=crop, 1=compose, 2=scale,\n"
97 "\t\t -1=user-controlled (default)");
99 static int ccs_out_mode[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = -1 };
100 module_param_array(ccs_out_mode, int, NULL, 0444);
101 MODULE_PARM_DESC(ccs_out_mode, " output crop/compose/scale mode:\n"
102 "\t\t bit 0=crop, 1=compose, 2=scale,\n"
103 "\t\t -1=user-controlled (default)");
105 static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 };
106 module_param_array(multiplanar, uint, NULL, 0444);
107 MODULE_PARM_DESC(multiplanar, " 1 (default) creates a single planar device, 2 creates a multiplanar device.");
109 /* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */
110 static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d };
111 module_param_array(node_types, uint, NULL, 0444);
112 MODULE_PARM_DESC(node_types, " node types, default is 0x1d3d. Bitmask with the following meaning:\n"
113 "\t\t bit 0: Video Capture node\n"
114 "\t\t bit 2-3: VBI Capture node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
115 "\t\t bit 4: Radio Receiver node\n"
116 "\t\t bit 5: Software Defined Radio Receiver node\n"
117 "\t\t bit 8: Video Output node\n"
118 "\t\t bit 10-11: VBI Output node: 0 = none, 1 = raw vbi, 2 = sliced vbi, 3 = both\n"
119 "\t\t bit 12: Radio Transmitter node\n"
120 "\t\t bit 16: Framebuffer for testing overlays");
122 /* Default: 4 inputs */
123 static unsigned num_inputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 4 };
124 module_param_array(num_inputs, uint, NULL, 0444);
125 MODULE_PARM_DESC(num_inputs, " number of inputs, default is 4");
127 /* Default: input 0 = WEBCAM, 1 = TV, 2 = SVID, 3 = HDMI */
128 static unsigned input_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0xe4 };
129 module_param_array(input_types, uint, NULL, 0444);
130 MODULE_PARM_DESC(input_types, " input types, default is 0xe4. Two bits per input,\n"
131 "\t\t bits 0-1 == input 0, bits 31-30 == input 15.\n"
132 "\t\t Type 0 == webcam, 1 == TV, 2 == S-Video, 3 == HDMI");
134 /* Default: 2 outputs */
135 static unsigned num_outputs[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
136 module_param_array(num_outputs, uint, NULL, 0444);
137 MODULE_PARM_DESC(num_outputs, " number of outputs, default is 2");
139 /* Default: output 0 = SVID, 1 = HDMI */
140 static unsigned output_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 2 };
141 module_param_array(output_types, uint, NULL, 0444);
142 MODULE_PARM_DESC(output_types, " output types, default is 0x02. One bit per output,\n"
143 "\t\t bit 0 == output 0, bit 15 == output 15.\n"
144 "\t\t Type 0 == S-Video, 1 == HDMI");
146 unsigned vivid_debug;
147 module_param(vivid_debug, uint, 0644);
148 MODULE_PARM_DESC(vivid_debug, " activates debug info");
150 static bool no_error_inj;
151 module_param(no_error_inj, bool, 0444);
152 MODULE_PARM_DESC(no_error_inj, " if set disable the error injecting controls");
154 static struct vivid_dev *vivid_devs[VIVID_MAX_DEVS];
156 const struct v4l2_rect vivid_min_rect = {
157 0, 0, MIN_WIDTH, MIN_HEIGHT
160 const struct v4l2_rect vivid_max_rect = {
161 0, 0, MAX_WIDTH * MAX_ZOOM, MAX_HEIGHT * MAX_ZOOM
164 static const u8 vivid_hdmi_edid[256] = {
165 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
166 0x63, 0x3a, 0xaa, 0x55, 0x00, 0x00, 0x00, 0x00,
167 0x0a, 0x18, 0x01, 0x03, 0x80, 0x10, 0x09, 0x78,
168 0x0e, 0x00, 0xb2, 0xa0, 0x57, 0x49, 0x9b, 0x26,
169 0x10, 0x48, 0x4f, 0x2f, 0xcf, 0x00, 0x31, 0x59,
170 0x45, 0x59, 0x81, 0x80, 0x81, 0x40, 0x90, 0x40,
171 0x95, 0x00, 0xa9, 0x40, 0xb3, 0x00, 0x02, 0x3a,
172 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c,
173 0x46, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x1e,
174 0x00, 0x00, 0x00, 0xfd, 0x00, 0x18, 0x55, 0x18,
175 0x5e, 0x11, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20,
176 0x20, 0x20, 0x00, 0x00, 0x00, 0xfc, 0x00, 'v',
177 '4', 'l', '2', '-', 'h', 'd', 'm', 'i',
178 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x10,
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0,
182 0x02, 0x03, 0x1a, 0xc0, 0x48, 0xa2, 0x10, 0x04,
183 0x02, 0x01, 0x21, 0x14, 0x13, 0x23, 0x09, 0x07,
184 0x07, 0x65, 0x03, 0x0c, 0x00, 0x10, 0x00, 0xe2,
185 0x00, 0x2a, 0x01, 0x1d, 0x00, 0x80, 0x51, 0xd0,
186 0x1c, 0x20, 0x40, 0x80, 0x35, 0x00, 0x00, 0x00,
187 0x00, 0x00, 0x00, 0x1e, 0x8c, 0x0a, 0xd0, 0x8a,
188 0x20, 0xe0, 0x2d, 0x10, 0x10, 0x3e, 0x96, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7
200 static int vidioc_querycap(struct file *file, void *priv,
201 struct v4l2_capability *cap)
203 struct vivid_dev *dev = video_drvdata(file);
205 strcpy(cap->driver, "vivid");
206 strcpy(cap->card, "vivid");
207 snprintf(cap->bus_info, sizeof(cap->bus_info),
208 "platform:%s", dev->v4l2_dev.name);
210 cap->capabilities = dev->vid_cap_caps | dev->vid_out_caps |
211 dev->vbi_cap_caps | dev->vbi_out_caps |
212 dev->radio_rx_caps | dev->radio_tx_caps |
213 dev->sdr_cap_caps | V4L2_CAP_DEVICE_CAPS;
214 return 0;
217 static int vidioc_s_hw_freq_seek(struct file *file, void *fh, const struct v4l2_hw_freq_seek *a)
219 struct video_device *vdev = video_devdata(file);
221 if (vdev->vfl_type == VFL_TYPE_RADIO)
222 return vivid_radio_rx_s_hw_freq_seek(file, fh, a);
223 return -ENOTTY;
226 static int vidioc_enum_freq_bands(struct file *file, void *fh, struct v4l2_frequency_band *band)
228 struct video_device *vdev = video_devdata(file);
230 if (vdev->vfl_type == VFL_TYPE_RADIO)
231 return vivid_radio_rx_enum_freq_bands(file, fh, band);
232 if (vdev->vfl_type == VFL_TYPE_SDR)
233 return vivid_sdr_enum_freq_bands(file, fh, band);
234 return -ENOTTY;
237 static int vidioc_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
239 struct video_device *vdev = video_devdata(file);
241 if (vdev->vfl_type == VFL_TYPE_RADIO)
242 return vivid_radio_rx_g_tuner(file, fh, vt);
243 if (vdev->vfl_type == VFL_TYPE_SDR)
244 return vivid_sdr_g_tuner(file, fh, vt);
245 return vivid_video_g_tuner(file, fh, vt);
248 static int vidioc_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)
250 struct video_device *vdev = video_devdata(file);
252 if (vdev->vfl_type == VFL_TYPE_RADIO)
253 return vivid_radio_rx_s_tuner(file, fh, vt);
254 if (vdev->vfl_type == VFL_TYPE_SDR)
255 return vivid_sdr_s_tuner(file, fh, vt);
256 return vivid_video_s_tuner(file, fh, vt);
259 static int vidioc_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
261 struct vivid_dev *dev = video_drvdata(file);
262 struct video_device *vdev = video_devdata(file);
264 if (vdev->vfl_type == VFL_TYPE_RADIO)
265 return vivid_radio_g_frequency(file,
266 vdev->vfl_dir == VFL_DIR_RX ?
267 &dev->radio_rx_freq : &dev->radio_tx_freq, vf);
268 if (vdev->vfl_type == VFL_TYPE_SDR)
269 return vivid_sdr_g_frequency(file, fh, vf);
270 return vivid_video_g_frequency(file, fh, vf);
273 static int vidioc_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)
275 struct vivid_dev *dev = video_drvdata(file);
276 struct video_device *vdev = video_devdata(file);
278 if (vdev->vfl_type == VFL_TYPE_RADIO)
279 return vivid_radio_s_frequency(file,
280 vdev->vfl_dir == VFL_DIR_RX ?
281 &dev->radio_rx_freq : &dev->radio_tx_freq, vf);
282 if (vdev->vfl_type == VFL_TYPE_SDR)
283 return vivid_sdr_s_frequency(file, fh, vf);
284 return vivid_video_s_frequency(file, fh, vf);
287 static int vidioc_overlay(struct file *file, void *fh, unsigned i)
289 struct video_device *vdev = video_devdata(file);
291 if (vdev->vfl_dir == VFL_DIR_RX)
292 return vivid_vid_cap_overlay(file, fh, i);
293 return vivid_vid_out_overlay(file, fh, i);
296 static int vidioc_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *a)
298 struct video_device *vdev = video_devdata(file);
300 if (vdev->vfl_dir == VFL_DIR_RX)
301 return vivid_vid_cap_g_fbuf(file, fh, a);
302 return vivid_vid_out_g_fbuf(file, fh, a);
305 static int vidioc_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *a)
307 struct video_device *vdev = video_devdata(file);
309 if (vdev->vfl_dir == VFL_DIR_RX)
310 return vivid_vid_cap_s_fbuf(file, fh, a);
311 return vivid_vid_out_s_fbuf(file, fh, a);
314 static int vidioc_s_std(struct file *file, void *fh, v4l2_std_id id)
316 struct video_device *vdev = video_devdata(file);
318 if (vdev->vfl_dir == VFL_DIR_RX)
319 return vivid_vid_cap_s_std(file, fh, id);
320 return vivid_vid_out_s_std(file, fh, id);
323 static int vidioc_s_dv_timings(struct file *file, void *fh, struct v4l2_dv_timings *timings)
325 struct video_device *vdev = video_devdata(file);
327 if (vdev->vfl_dir == VFL_DIR_RX)
328 return vivid_vid_cap_s_dv_timings(file, fh, timings);
329 return vivid_vid_out_s_dv_timings(file, fh, timings);
332 static int vidioc_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cc)
334 struct video_device *vdev = video_devdata(file);
336 if (vdev->vfl_dir == VFL_DIR_RX)
337 return vivid_vid_cap_cropcap(file, fh, cc);
338 return vivid_vid_out_cropcap(file, fh, cc);
341 static int vidioc_g_selection(struct file *file, void *fh,
342 struct v4l2_selection *sel)
344 struct video_device *vdev = video_devdata(file);
346 if (vdev->vfl_dir == VFL_DIR_RX)
347 return vivid_vid_cap_g_selection(file, fh, sel);
348 return vivid_vid_out_g_selection(file, fh, sel);
351 static int vidioc_s_selection(struct file *file, void *fh,
352 struct v4l2_selection *sel)
354 struct video_device *vdev = video_devdata(file);
356 if (vdev->vfl_dir == VFL_DIR_RX)
357 return vivid_vid_cap_s_selection(file, fh, sel);
358 return vivid_vid_out_s_selection(file, fh, sel);
361 static int vidioc_g_parm(struct file *file, void *fh,
362 struct v4l2_streamparm *parm)
364 struct video_device *vdev = video_devdata(file);
366 if (vdev->vfl_dir == VFL_DIR_RX)
367 return vivid_vid_cap_g_parm(file, fh, parm);
368 return vivid_vid_out_g_parm(file, fh, parm);
371 static int vidioc_s_parm(struct file *file, void *fh,
372 struct v4l2_streamparm *parm)
374 struct video_device *vdev = video_devdata(file);
376 if (vdev->vfl_dir == VFL_DIR_RX)
377 return vivid_vid_cap_s_parm(file, fh, parm);
378 return vivid_vid_out_g_parm(file, fh, parm);
381 static int vidioc_log_status(struct file *file, void *fh)
383 struct vivid_dev *dev = video_drvdata(file);
384 struct video_device *vdev = video_devdata(file);
386 v4l2_ctrl_log_status(file, fh);
387 if (vdev->vfl_dir == VFL_DIR_RX && vdev->vfl_type == VFL_TYPE_GRABBER)
388 tpg_log_status(&dev->tpg);
389 return 0;
392 static ssize_t vivid_radio_read(struct file *file, char __user *buf,
393 size_t size, loff_t *offset)
395 struct video_device *vdev = video_devdata(file);
397 if (vdev->vfl_dir == VFL_DIR_TX)
398 return -EINVAL;
399 return vivid_radio_rx_read(file, buf, size, offset);
402 static ssize_t vivid_radio_write(struct file *file, const char __user *buf,
403 size_t size, loff_t *offset)
405 struct video_device *vdev = video_devdata(file);
407 if (vdev->vfl_dir == VFL_DIR_RX)
408 return -EINVAL;
409 return vivid_radio_tx_write(file, buf, size, offset);
412 static unsigned int vivid_radio_poll(struct file *file, struct poll_table_struct *wait)
414 struct video_device *vdev = video_devdata(file);
416 if (vdev->vfl_dir == VFL_DIR_RX)
417 return vivid_radio_rx_poll(file, wait);
418 return vivid_radio_tx_poll(file, wait);
421 static bool vivid_is_in_use(struct video_device *vdev)
423 unsigned long flags;
424 bool res;
426 spin_lock_irqsave(&vdev->fh_lock, flags);
427 res = !list_empty(&vdev->fh_list);
428 spin_unlock_irqrestore(&vdev->fh_lock, flags);
429 return res;
432 static bool vivid_is_last_user(struct vivid_dev *dev)
434 unsigned uses = vivid_is_in_use(&dev->vid_cap_dev) +
435 vivid_is_in_use(&dev->vid_out_dev) +
436 vivid_is_in_use(&dev->vbi_cap_dev) +
437 vivid_is_in_use(&dev->vbi_out_dev) +
438 vivid_is_in_use(&dev->sdr_cap_dev) +
439 vivid_is_in_use(&dev->radio_rx_dev) +
440 vivid_is_in_use(&dev->radio_tx_dev);
442 return uses == 1;
445 static int vivid_fop_release(struct file *file)
447 struct vivid_dev *dev = video_drvdata(file);
448 struct video_device *vdev = video_devdata(file);
450 mutex_lock(&dev->mutex);
451 if (!no_error_inj && v4l2_fh_is_singular_file(file) &&
452 !video_is_registered(vdev) && vivid_is_last_user(dev)) {
454 * I am the last user of this driver, and a disconnect
455 * was forced (since this video_device is unregistered),
456 * so re-register all video_device's again.
458 v4l2_info(&dev->v4l2_dev, "reconnect\n");
459 set_bit(V4L2_FL_REGISTERED, &dev->vid_cap_dev.flags);
460 set_bit(V4L2_FL_REGISTERED, &dev->vid_out_dev.flags);
461 set_bit(V4L2_FL_REGISTERED, &dev->vbi_cap_dev.flags);
462 set_bit(V4L2_FL_REGISTERED, &dev->vbi_out_dev.flags);
463 set_bit(V4L2_FL_REGISTERED, &dev->sdr_cap_dev.flags);
464 set_bit(V4L2_FL_REGISTERED, &dev->radio_rx_dev.flags);
465 set_bit(V4L2_FL_REGISTERED, &dev->radio_tx_dev.flags);
467 mutex_unlock(&dev->mutex);
468 if (file->private_data == dev->overlay_cap_owner)
469 dev->overlay_cap_owner = NULL;
470 if (file->private_data == dev->radio_rx_rds_owner) {
471 dev->radio_rx_rds_last_block = 0;
472 dev->radio_rx_rds_owner = NULL;
474 if (file->private_data == dev->radio_tx_rds_owner) {
475 dev->radio_tx_rds_last_block = 0;
476 dev->radio_tx_rds_owner = NULL;
478 if (vdev->queue)
479 return vb2_fop_release(file);
480 return v4l2_fh_release(file);
483 static const struct v4l2_file_operations vivid_fops = {
484 .owner = THIS_MODULE,
485 .open = v4l2_fh_open,
486 .release = vivid_fop_release,
487 .read = vb2_fop_read,
488 .write = vb2_fop_write,
489 .poll = vb2_fop_poll,
490 .unlocked_ioctl = video_ioctl2,
491 .mmap = vb2_fop_mmap,
494 static const struct v4l2_file_operations vivid_radio_fops = {
495 .owner = THIS_MODULE,
496 .open = v4l2_fh_open,
497 .release = vivid_fop_release,
498 .read = vivid_radio_read,
499 .write = vivid_radio_write,
500 .poll = vivid_radio_poll,
501 .unlocked_ioctl = video_ioctl2,
504 static const struct v4l2_ioctl_ops vivid_ioctl_ops = {
505 .vidioc_querycap = vidioc_querycap,
507 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid,
508 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
509 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
510 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
511 .vidioc_enum_fmt_vid_cap_mplane = vidioc_enum_fmt_vid_mplane,
512 .vidioc_g_fmt_vid_cap_mplane = vidioc_g_fmt_vid_cap_mplane,
513 .vidioc_try_fmt_vid_cap_mplane = vidioc_try_fmt_vid_cap_mplane,
514 .vidioc_s_fmt_vid_cap_mplane = vidioc_s_fmt_vid_cap_mplane,
516 .vidioc_enum_fmt_vid_out = vidioc_enum_fmt_vid,
517 .vidioc_g_fmt_vid_out = vidioc_g_fmt_vid_out,
518 .vidioc_try_fmt_vid_out = vidioc_try_fmt_vid_out,
519 .vidioc_s_fmt_vid_out = vidioc_s_fmt_vid_out,
520 .vidioc_enum_fmt_vid_out_mplane = vidioc_enum_fmt_vid_mplane,
521 .vidioc_g_fmt_vid_out_mplane = vidioc_g_fmt_vid_out_mplane,
522 .vidioc_try_fmt_vid_out_mplane = vidioc_try_fmt_vid_out_mplane,
523 .vidioc_s_fmt_vid_out_mplane = vidioc_s_fmt_vid_out_mplane,
525 .vidioc_g_selection = vidioc_g_selection,
526 .vidioc_s_selection = vidioc_s_selection,
527 .vidioc_cropcap = vidioc_cropcap,
529 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
530 .vidioc_try_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
531 .vidioc_s_fmt_vbi_cap = vidioc_s_fmt_vbi_cap,
533 .vidioc_g_fmt_sliced_vbi_cap = vidioc_g_fmt_sliced_vbi_cap,
534 .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_fmt_sliced_vbi_cap,
535 .vidioc_s_fmt_sliced_vbi_cap = vidioc_s_fmt_sliced_vbi_cap,
536 .vidioc_g_sliced_vbi_cap = vidioc_g_sliced_vbi_cap,
538 .vidioc_g_fmt_vbi_out = vidioc_g_fmt_vbi_out,
539 .vidioc_try_fmt_vbi_out = vidioc_g_fmt_vbi_out,
540 .vidioc_s_fmt_vbi_out = vidioc_s_fmt_vbi_out,
542 .vidioc_g_fmt_sliced_vbi_out = vidioc_g_fmt_sliced_vbi_out,
543 .vidioc_try_fmt_sliced_vbi_out = vidioc_try_fmt_sliced_vbi_out,
544 .vidioc_s_fmt_sliced_vbi_out = vidioc_s_fmt_sliced_vbi_out,
546 .vidioc_enum_fmt_sdr_cap = vidioc_enum_fmt_sdr_cap,
547 .vidioc_g_fmt_sdr_cap = vidioc_g_fmt_sdr_cap,
548 .vidioc_try_fmt_sdr_cap = vidioc_try_fmt_sdr_cap,
549 .vidioc_s_fmt_sdr_cap = vidioc_s_fmt_sdr_cap,
551 .vidioc_overlay = vidioc_overlay,
552 .vidioc_enum_framesizes = vidioc_enum_framesizes,
553 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
554 .vidioc_g_parm = vidioc_g_parm,
555 .vidioc_s_parm = vidioc_s_parm,
557 .vidioc_enum_fmt_vid_overlay = vidioc_enum_fmt_vid_overlay,
558 .vidioc_g_fmt_vid_overlay = vidioc_g_fmt_vid_overlay,
559 .vidioc_try_fmt_vid_overlay = vidioc_try_fmt_vid_overlay,
560 .vidioc_s_fmt_vid_overlay = vidioc_s_fmt_vid_overlay,
561 .vidioc_g_fmt_vid_out_overlay = vidioc_g_fmt_vid_out_overlay,
562 .vidioc_try_fmt_vid_out_overlay = vidioc_try_fmt_vid_out_overlay,
563 .vidioc_s_fmt_vid_out_overlay = vidioc_s_fmt_vid_out_overlay,
564 .vidioc_g_fbuf = vidioc_g_fbuf,
565 .vidioc_s_fbuf = vidioc_s_fbuf,
567 .vidioc_reqbufs = vb2_ioctl_reqbufs,
568 .vidioc_create_bufs = vb2_ioctl_create_bufs,
569 .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
570 .vidioc_querybuf = vb2_ioctl_querybuf,
571 .vidioc_qbuf = vb2_ioctl_qbuf,
572 .vidioc_dqbuf = vb2_ioctl_dqbuf,
573 .vidioc_expbuf = vb2_ioctl_expbuf,
574 .vidioc_streamon = vb2_ioctl_streamon,
575 .vidioc_streamoff = vb2_ioctl_streamoff,
577 .vidioc_enum_input = vidioc_enum_input,
578 .vidioc_g_input = vidioc_g_input,
579 .vidioc_s_input = vidioc_s_input,
580 .vidioc_s_audio = vidioc_s_audio,
581 .vidioc_g_audio = vidioc_g_audio,
582 .vidioc_enumaudio = vidioc_enumaudio,
583 .vidioc_s_frequency = vidioc_s_frequency,
584 .vidioc_g_frequency = vidioc_g_frequency,
585 .vidioc_s_tuner = vidioc_s_tuner,
586 .vidioc_g_tuner = vidioc_g_tuner,
587 .vidioc_s_modulator = vidioc_s_modulator,
588 .vidioc_g_modulator = vidioc_g_modulator,
589 .vidioc_s_hw_freq_seek = vidioc_s_hw_freq_seek,
590 .vidioc_enum_freq_bands = vidioc_enum_freq_bands,
592 .vidioc_enum_output = vidioc_enum_output,
593 .vidioc_g_output = vidioc_g_output,
594 .vidioc_s_output = vidioc_s_output,
595 .vidioc_s_audout = vidioc_s_audout,
596 .vidioc_g_audout = vidioc_g_audout,
597 .vidioc_enumaudout = vidioc_enumaudout,
599 .vidioc_querystd = vidioc_querystd,
600 .vidioc_g_std = vidioc_g_std,
601 .vidioc_s_std = vidioc_s_std,
602 .vidioc_s_dv_timings = vidioc_s_dv_timings,
603 .vidioc_g_dv_timings = vidioc_g_dv_timings,
604 .vidioc_query_dv_timings = vidioc_query_dv_timings,
605 .vidioc_enum_dv_timings = vidioc_enum_dv_timings,
606 .vidioc_dv_timings_cap = vidioc_dv_timings_cap,
607 .vidioc_g_edid = vidioc_g_edid,
608 .vidioc_s_edid = vidioc_s_edid,
610 .vidioc_log_status = vidioc_log_status,
611 .vidioc_subscribe_event = vidioc_subscribe_event,
612 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
615 /* -----------------------------------------------------------------
616 Initialization and module stuff
617 ------------------------------------------------------------------*/
619 static void vivid_dev_release(struct v4l2_device *v4l2_dev)
621 struct vivid_dev *dev = container_of(v4l2_dev, struct vivid_dev, v4l2_dev);
623 vivid_free_controls(dev);
624 v4l2_device_unregister(&dev->v4l2_dev);
625 vfree(dev->scaled_line);
626 vfree(dev->blended_line);
627 vfree(dev->edid);
628 vfree(dev->bitmap_cap);
629 vfree(dev->bitmap_out);
630 tpg_free(&dev->tpg);
631 kfree(dev->query_dv_timings_qmenu);
632 kfree(dev);
635 static int vivid_create_instance(struct platform_device *pdev, int inst)
637 static const struct v4l2_dv_timings def_dv_timings =
638 V4L2_DV_BT_CEA_1280X720P60;
639 unsigned in_type_counter[4] = { 0, 0, 0, 0 };
640 unsigned out_type_counter[4] = { 0, 0, 0, 0 };
641 int ccs_cap = ccs_cap_mode[inst];
642 int ccs_out = ccs_out_mode[inst];
643 bool has_tuner;
644 bool has_modulator;
645 struct vivid_dev *dev;
646 struct video_device *vfd;
647 struct vb2_queue *q;
648 unsigned node_type = node_types[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 /* initialize the test pattern generator */
843 tpg_init(&dev->tpg, 640, 360);
844 if (tpg_alloc(&dev->tpg, MAX_ZOOM * MAX_WIDTH))
845 goto free_dev;
846 dev->scaled_line = vzalloc(MAX_ZOOM * MAX_WIDTH);
847 if (!dev->scaled_line)
848 goto free_dev;
849 dev->blended_line = vzalloc(MAX_ZOOM * MAX_WIDTH);
850 if (!dev->blended_line)
851 goto free_dev;
853 /* load the edid */
854 dev->edid = vmalloc(256 * 128);
855 if (!dev->edid)
856 goto free_dev;
858 /* create a string array containing the names of all the preset timings */
859 while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width)
860 dev->query_dv_timings_size++;
861 dev->query_dv_timings_qmenu = kmalloc(dev->query_dv_timings_size *
862 (sizeof(void *) + 32), GFP_KERNEL);
863 if (dev->query_dv_timings_qmenu == NULL)
864 goto free_dev;
865 for (i = 0; i < dev->query_dv_timings_size; i++) {
866 const struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt;
867 char *p = (char *)&dev->query_dv_timings_qmenu[dev->query_dv_timings_size];
868 u32 htot, vtot;
870 p += i * 32;
871 dev->query_dv_timings_qmenu[i] = p;
873 htot = V4L2_DV_BT_FRAME_WIDTH(bt);
874 vtot = V4L2_DV_BT_FRAME_HEIGHT(bt);
875 snprintf(p, 32, "%ux%u%s%u",
876 bt->width, bt->height, bt->interlaced ? "i" : "p",
877 (u32)bt->pixelclock / (htot * vtot));
880 /* disable invalid ioctls based on the feature set */
881 if (!dev->has_audio_inputs) {
882 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_AUDIO);
883 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_AUDIO);
884 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMAUDIO);
885 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_AUDIO);
886 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_AUDIO);
887 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_ENUMAUDIO);
889 if (!dev->has_audio_outputs) {
890 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_AUDOUT);
891 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_AUDOUT);
892 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMAUDOUT);
893 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_AUDOUT);
894 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_AUDOUT);
895 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_ENUMAUDOUT);
897 if (!in_type_counter[TV] && !in_type_counter[SVID]) {
898 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_STD);
899 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_STD);
900 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUMSTD);
901 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERYSTD);
903 if (!out_type_counter[SVID]) {
904 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_STD);
905 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_STD);
906 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUMSTD);
908 if (!has_tuner && !has_modulator) {
909 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_FREQUENCY);
910 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_FREQUENCY);
911 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_FREQUENCY);
912 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_FREQUENCY);
914 if (!has_tuner) {
915 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_TUNER);
916 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_TUNER);
917 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_TUNER);
918 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_G_TUNER);
920 if (in_type_counter[HDMI] == 0) {
921 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_EDID);
922 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_EDID);
923 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_DV_TIMINGS_CAP);
924 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_G_DV_TIMINGS);
925 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_DV_TIMINGS);
926 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_ENUM_DV_TIMINGS);
927 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_QUERY_DV_TIMINGS);
929 if (out_type_counter[HDMI] == 0) {
930 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_EDID);
931 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_DV_TIMINGS_CAP);
932 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_DV_TIMINGS);
933 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_DV_TIMINGS);
934 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_DV_TIMINGS);
936 if (!dev->has_fb) {
937 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FBUF);
938 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FBUF);
939 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_OVERLAY);
941 v4l2_disable_ioctl(&dev->vid_cap_dev, VIDIOC_S_HW_FREQ_SEEK);
942 v4l2_disable_ioctl(&dev->vbi_cap_dev, VIDIOC_S_HW_FREQ_SEEK);
943 v4l2_disable_ioctl(&dev->sdr_cap_dev, VIDIOC_S_HW_FREQ_SEEK);
944 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_S_FREQUENCY);
945 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_G_FREQUENCY);
946 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMESIZES);
947 v4l2_disable_ioctl(&dev->vid_out_dev, VIDIOC_ENUM_FRAMEINTERVALS);
948 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_S_FREQUENCY);
949 v4l2_disable_ioctl(&dev->vbi_out_dev, VIDIOC_G_FREQUENCY);
951 /* configure internal data */
952 dev->fmt_cap = &vivid_formats[0];
953 dev->fmt_out = &vivid_formats[0];
954 if (!dev->multiplanar)
955 vivid_formats[0].data_offset[0] = 0;
956 dev->webcam_size_idx = 1;
957 dev->webcam_ival_idx = 3;
958 tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc);
959 dev->std_cap = V4L2_STD_PAL;
960 dev->std_out = V4L2_STD_PAL;
961 if (dev->input_type[0] == TV || dev->input_type[0] == SVID)
962 tvnorms_cap = V4L2_STD_ALL;
963 if (dev->output_type[0] == SVID)
964 tvnorms_out = V4L2_STD_ALL;
965 dev->dv_timings_cap = def_dv_timings;
966 dev->dv_timings_out = def_dv_timings;
967 dev->tv_freq = 2804 /* 175.25 * 16 */;
968 dev->tv_audmode = V4L2_TUNER_MODE_STEREO;
969 dev->tv_field_cap = V4L2_FIELD_INTERLACED;
970 dev->tv_field_out = V4L2_FIELD_INTERLACED;
971 dev->radio_rx_freq = 95000 * 16;
972 dev->radio_rx_audmode = V4L2_TUNER_MODE_STEREO;
973 if (dev->has_radio_tx) {
974 dev->radio_tx_freq = 95500 * 16;
975 dev->radio_rds_loop = false;
977 dev->radio_tx_subchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_RDS;
978 dev->sdr_adc_freq = 300000;
979 dev->sdr_fm_freq = 50000000;
980 dev->sdr_pixelformat = V4L2_SDR_FMT_CU8;
981 dev->sdr_buffersize = SDR_CAP_SAMPLES_PER_BUF * 2;
983 dev->edid_max_blocks = dev->edid_blocks = 2;
984 memcpy(dev->edid, vivid_hdmi_edid, sizeof(vivid_hdmi_edid));
985 ktime_get_ts(&dev->radio_rds_init_ts);
987 /* create all controls */
988 ret = vivid_create_controls(dev, ccs_cap == -1, ccs_out == -1, no_error_inj,
989 in_type_counter[TV] || in_type_counter[SVID] ||
990 out_type_counter[SVID],
991 in_type_counter[HDMI] || out_type_counter[HDMI]);
992 if (ret)
993 goto unreg_dev;
996 * update the capture and output formats to do a proper initial
997 * configuration.
999 vivid_update_format_cap(dev, false);
1000 vivid_update_format_out(dev);
1002 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_cap);
1003 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vid_out);
1004 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_cap);
1005 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_vbi_out);
1006 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_rx);
1007 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_radio_tx);
1008 v4l2_ctrl_handler_setup(&dev->ctrl_hdl_sdr_cap);
1010 /* initialize overlay */
1011 dev->fb_cap.fmt.width = dev->src_rect.width;
1012 dev->fb_cap.fmt.height = dev->src_rect.height;
1013 dev->fb_cap.fmt.pixelformat = dev->fmt_cap->fourcc;
1014 dev->fb_cap.fmt.bytesperline = dev->src_rect.width * tpg_g_twopixelsize(&dev->tpg, 0) / 2;
1015 dev->fb_cap.fmt.sizeimage = dev->src_rect.height * dev->fb_cap.fmt.bytesperline;
1017 /* initialize locks */
1018 spin_lock_init(&dev->slock);
1019 mutex_init(&dev->mutex);
1021 /* init dma queues */
1022 INIT_LIST_HEAD(&dev->vid_cap_active);
1023 INIT_LIST_HEAD(&dev->vid_out_active);
1024 INIT_LIST_HEAD(&dev->vbi_cap_active);
1025 INIT_LIST_HEAD(&dev->vbi_out_active);
1026 INIT_LIST_HEAD(&dev->sdr_cap_active);
1028 INIT_LIST_HEAD(&dev->cec_work_list);
1029 spin_lock_init(&dev->cec_slock);
1031 * Same as create_singlethread_workqueue, but now I can use the
1032 * string formatting of alloc_ordered_workqueue.
1034 dev->cec_workqueue =
1035 alloc_ordered_workqueue("vivid-%03d-cec", WQ_MEM_RECLAIM, inst);
1036 if (!dev->cec_workqueue)
1037 goto unreg_dev;
1039 /* start creating the vb2 queues */
1040 if (dev->has_vid_cap) {
1041 /* initialize vid_cap queue */
1042 q = &dev->vb_vid_cap_q;
1043 q->type = dev->multiplanar ? V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :
1044 V4L2_BUF_TYPE_VIDEO_CAPTURE;
1045 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1046 q->drv_priv = dev;
1047 q->buf_struct_size = sizeof(struct vivid_buffer);
1048 q->ops = &vivid_vid_cap_qops;
1049 q->mem_ops = &vb2_vmalloc_memops;
1050 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1051 q->min_buffers_needed = 2;
1052 q->lock = &dev->mutex;
1054 ret = vb2_queue_init(q);
1055 if (ret)
1056 goto unreg_dev;
1059 if (dev->has_vid_out) {
1060 /* initialize vid_out queue */
1061 q = &dev->vb_vid_out_q;
1062 q->type = dev->multiplanar ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE :
1063 V4L2_BUF_TYPE_VIDEO_OUTPUT;
1064 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_WRITE;
1065 q->drv_priv = dev;
1066 q->buf_struct_size = sizeof(struct vivid_buffer);
1067 q->ops = &vivid_vid_out_qops;
1068 q->mem_ops = &vb2_vmalloc_memops;
1069 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1070 q->min_buffers_needed = 2;
1071 q->lock = &dev->mutex;
1073 ret = vb2_queue_init(q);
1074 if (ret)
1075 goto unreg_dev;
1078 if (dev->has_vbi_cap) {
1079 /* initialize vbi_cap queue */
1080 q = &dev->vb_vbi_cap_q;
1081 q->type = dev->has_raw_vbi_cap ? V4L2_BUF_TYPE_VBI_CAPTURE :
1082 V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
1083 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1084 q->drv_priv = dev;
1085 q->buf_struct_size = sizeof(struct vivid_buffer);
1086 q->ops = &vivid_vbi_cap_qops;
1087 q->mem_ops = &vb2_vmalloc_memops;
1088 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1089 q->min_buffers_needed = 2;
1090 q->lock = &dev->mutex;
1092 ret = vb2_queue_init(q);
1093 if (ret)
1094 goto unreg_dev;
1097 if (dev->has_vbi_out) {
1098 /* initialize vbi_out queue */
1099 q = &dev->vb_vbi_out_q;
1100 q->type = dev->has_raw_vbi_out ? V4L2_BUF_TYPE_VBI_OUTPUT :
1101 V4L2_BUF_TYPE_SLICED_VBI_OUTPUT;
1102 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_WRITE;
1103 q->drv_priv = dev;
1104 q->buf_struct_size = sizeof(struct vivid_buffer);
1105 q->ops = &vivid_vbi_out_qops;
1106 q->mem_ops = &vb2_vmalloc_memops;
1107 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1108 q->min_buffers_needed = 2;
1109 q->lock = &dev->mutex;
1111 ret = vb2_queue_init(q);
1112 if (ret)
1113 goto unreg_dev;
1116 if (dev->has_sdr_cap) {
1117 /* initialize sdr_cap queue */
1118 q = &dev->vb_sdr_cap_q;
1119 q->type = V4L2_BUF_TYPE_SDR_CAPTURE;
1120 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1121 q->drv_priv = dev;
1122 q->buf_struct_size = sizeof(struct vivid_buffer);
1123 q->ops = &vivid_sdr_cap_qops;
1124 q->mem_ops = &vb2_vmalloc_memops;
1125 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1126 q->min_buffers_needed = 8;
1127 q->lock = &dev->mutex;
1129 ret = vb2_queue_init(q);
1130 if (ret)
1131 goto unreg_dev;
1134 if (dev->has_fb) {
1135 /* Create framebuffer for testing capture/output overlay */
1136 ret = vivid_fb_init(dev);
1137 if (ret)
1138 goto unreg_dev;
1139 v4l2_info(&dev->v4l2_dev, "Framebuffer device registered as fb%d\n",
1140 dev->fb_info.node);
1143 /* finally start creating the device nodes */
1144 if (dev->has_vid_cap) {
1145 vfd = &dev->vid_cap_dev;
1146 snprintf(vfd->name, sizeof(vfd->name),
1147 "vivid-%03d-vid-cap", inst);
1148 vfd->fops = &vivid_fops;
1149 vfd->ioctl_ops = &vivid_ioctl_ops;
1150 vfd->device_caps = dev->vid_cap_caps;
1151 vfd->release = video_device_release_empty;
1152 vfd->v4l2_dev = &dev->v4l2_dev;
1153 vfd->queue = &dev->vb_vid_cap_q;
1154 vfd->tvnorms = tvnorms_cap;
1157 * Provide a mutex to v4l2 core. It will be used to protect
1158 * all fops and v4l2 ioctls.
1160 vfd->lock = &dev->mutex;
1161 video_set_drvdata(vfd, dev);
1163 #ifdef CONFIG_VIDEO_VIVID_CEC
1164 if (in_type_counter[HDMI]) {
1165 struct cec_adapter *adap;
1167 adap = vivid_cec_alloc_adap(dev, 0, &pdev->dev, false);
1168 ret = PTR_ERR_OR_ZERO(adap);
1169 if (ret < 0)
1170 goto unreg_dev;
1171 dev->cec_rx_adap = adap;
1172 ret = cec_register_adapter(adap);
1173 if (ret < 0) {
1174 cec_delete_adapter(adap);
1175 dev->cec_rx_adap = NULL;
1176 goto unreg_dev;
1178 cec_s_phys_addr(adap, 0, false);
1179 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI input %d\n",
1180 dev_name(&adap->devnode.dev), i);
1182 #endif
1184 ret = video_register_device(vfd, VFL_TYPE_GRABBER, vid_cap_nr[inst]);
1185 if (ret < 0)
1186 goto unreg_dev;
1187 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n",
1188 video_device_node_name(vfd));
1191 if (dev->has_vid_out) {
1192 #ifdef CONFIG_VIDEO_VIVID_CEC
1193 unsigned int bus_cnt = 0;
1194 #endif
1196 vfd = &dev->vid_out_dev;
1197 snprintf(vfd->name, sizeof(vfd->name),
1198 "vivid-%03d-vid-out", inst);
1199 vfd->vfl_dir = VFL_DIR_TX;
1200 vfd->fops = &vivid_fops;
1201 vfd->ioctl_ops = &vivid_ioctl_ops;
1202 vfd->device_caps = dev->vid_out_caps;
1203 vfd->release = video_device_release_empty;
1204 vfd->v4l2_dev = &dev->v4l2_dev;
1205 vfd->queue = &dev->vb_vid_out_q;
1206 vfd->tvnorms = tvnorms_out;
1209 * Provide a mutex to v4l2 core. It will be used to protect
1210 * all fops and v4l2 ioctls.
1212 vfd->lock = &dev->mutex;
1213 video_set_drvdata(vfd, dev);
1215 #ifdef CONFIG_VIDEO_VIVID_CEC
1216 for (i = 0; i < dev->num_outputs; i++) {
1217 struct cec_adapter *adap;
1219 if (dev->output_type[i] != HDMI)
1220 continue;
1221 dev->cec_output2bus_map[i] = bus_cnt;
1222 adap = vivid_cec_alloc_adap(dev, bus_cnt,
1223 &pdev->dev, true);
1224 ret = PTR_ERR_OR_ZERO(adap);
1225 if (ret < 0)
1226 goto unreg_dev;
1227 dev->cec_tx_adap[bus_cnt] = adap;
1228 ret = cec_register_adapter(adap);
1229 if (ret < 0) {
1230 cec_delete_adapter(adap);
1231 dev->cec_tx_adap[bus_cnt] = NULL;
1232 goto unreg_dev;
1234 bus_cnt++;
1235 if (bus_cnt <= out_type_counter[HDMI])
1236 cec_s_phys_addr(adap, bus_cnt << 12, false);
1237 else
1238 cec_s_phys_addr(adap, 0x1000, false);
1239 v4l2_info(&dev->v4l2_dev, "CEC adapter %s registered for HDMI output %d\n",
1240 dev_name(&adap->devnode.dev), i);
1242 #endif
1244 ret = video_register_device(vfd, VFL_TYPE_GRABBER, vid_out_nr[inst]);
1245 if (ret < 0)
1246 goto unreg_dev;
1247 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s\n",
1248 video_device_node_name(vfd));
1251 if (dev->has_vbi_cap) {
1252 vfd = &dev->vbi_cap_dev;
1253 snprintf(vfd->name, sizeof(vfd->name),
1254 "vivid-%03d-vbi-cap", inst);
1255 vfd->fops = &vivid_fops;
1256 vfd->ioctl_ops = &vivid_ioctl_ops;
1257 vfd->device_caps = dev->vbi_cap_caps;
1258 vfd->release = video_device_release_empty;
1259 vfd->v4l2_dev = &dev->v4l2_dev;
1260 vfd->queue = &dev->vb_vbi_cap_q;
1261 vfd->lock = &dev->mutex;
1262 vfd->tvnorms = tvnorms_cap;
1263 video_set_drvdata(vfd, dev);
1265 ret = video_register_device(vfd, VFL_TYPE_VBI, vbi_cap_nr[inst]);
1266 if (ret < 0)
1267 goto unreg_dev;
1268 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s, supports %s VBI\n",
1269 video_device_node_name(vfd),
1270 (dev->has_raw_vbi_cap && dev->has_sliced_vbi_cap) ?
1271 "raw and sliced" :
1272 (dev->has_raw_vbi_cap ? "raw" : "sliced"));
1275 if (dev->has_vbi_out) {
1276 vfd = &dev->vbi_out_dev;
1277 snprintf(vfd->name, sizeof(vfd->name),
1278 "vivid-%03d-vbi-out", inst);
1279 vfd->vfl_dir = VFL_DIR_TX;
1280 vfd->fops = &vivid_fops;
1281 vfd->ioctl_ops = &vivid_ioctl_ops;
1282 vfd->device_caps = dev->vbi_out_caps;
1283 vfd->release = video_device_release_empty;
1284 vfd->v4l2_dev = &dev->v4l2_dev;
1285 vfd->queue = &dev->vb_vbi_out_q;
1286 vfd->lock = &dev->mutex;
1287 vfd->tvnorms = tvnorms_out;
1288 video_set_drvdata(vfd, dev);
1290 ret = video_register_device(vfd, VFL_TYPE_VBI, vbi_out_nr[inst]);
1291 if (ret < 0)
1292 goto unreg_dev;
1293 v4l2_info(&dev->v4l2_dev, "V4L2 output device registered as %s, supports %s VBI\n",
1294 video_device_node_name(vfd),
1295 (dev->has_raw_vbi_out && dev->has_sliced_vbi_out) ?
1296 "raw and sliced" :
1297 (dev->has_raw_vbi_out ? "raw" : "sliced"));
1300 if (dev->has_sdr_cap) {
1301 vfd = &dev->sdr_cap_dev;
1302 snprintf(vfd->name, sizeof(vfd->name),
1303 "vivid-%03d-sdr-cap", inst);
1304 vfd->fops = &vivid_fops;
1305 vfd->ioctl_ops = &vivid_ioctl_ops;
1306 vfd->device_caps = dev->sdr_cap_caps;
1307 vfd->release = video_device_release_empty;
1308 vfd->v4l2_dev = &dev->v4l2_dev;
1309 vfd->queue = &dev->vb_sdr_cap_q;
1310 vfd->lock = &dev->mutex;
1311 video_set_drvdata(vfd, dev);
1313 ret = video_register_device(vfd, VFL_TYPE_SDR, sdr_cap_nr[inst]);
1314 if (ret < 0)
1315 goto unreg_dev;
1316 v4l2_info(&dev->v4l2_dev, "V4L2 capture device registered as %s\n",
1317 video_device_node_name(vfd));
1320 if (dev->has_radio_rx) {
1321 vfd = &dev->radio_rx_dev;
1322 snprintf(vfd->name, sizeof(vfd->name),
1323 "vivid-%03d-rad-rx", inst);
1324 vfd->fops = &vivid_radio_fops;
1325 vfd->ioctl_ops = &vivid_ioctl_ops;
1326 vfd->device_caps = dev->radio_rx_caps;
1327 vfd->release = video_device_release_empty;
1328 vfd->v4l2_dev = &dev->v4l2_dev;
1329 vfd->lock = &dev->mutex;
1330 video_set_drvdata(vfd, dev);
1332 ret = video_register_device(vfd, VFL_TYPE_RADIO, radio_rx_nr[inst]);
1333 if (ret < 0)
1334 goto unreg_dev;
1335 v4l2_info(&dev->v4l2_dev, "V4L2 receiver device registered as %s\n",
1336 video_device_node_name(vfd));
1339 if (dev->has_radio_tx) {
1340 vfd = &dev->radio_tx_dev;
1341 snprintf(vfd->name, sizeof(vfd->name),
1342 "vivid-%03d-rad-tx", inst);
1343 vfd->vfl_dir = VFL_DIR_TX;
1344 vfd->fops = &vivid_radio_fops;
1345 vfd->ioctl_ops = &vivid_ioctl_ops;
1346 vfd->device_caps = dev->radio_tx_caps;
1347 vfd->release = video_device_release_empty;
1348 vfd->v4l2_dev = &dev->v4l2_dev;
1349 vfd->lock = &dev->mutex;
1350 video_set_drvdata(vfd, dev);
1352 ret = video_register_device(vfd, VFL_TYPE_RADIO, radio_tx_nr[inst]);
1353 if (ret < 0)
1354 goto unreg_dev;
1355 v4l2_info(&dev->v4l2_dev, "V4L2 transmitter device registered as %s\n",
1356 video_device_node_name(vfd));
1359 /* Now that everything is fine, let's add it to device list */
1360 vivid_devs[inst] = dev;
1362 return 0;
1364 unreg_dev:
1365 video_unregister_device(&dev->radio_tx_dev);
1366 video_unregister_device(&dev->radio_rx_dev);
1367 video_unregister_device(&dev->sdr_cap_dev);
1368 video_unregister_device(&dev->vbi_out_dev);
1369 video_unregister_device(&dev->vbi_cap_dev);
1370 video_unregister_device(&dev->vid_out_dev);
1371 video_unregister_device(&dev->vid_cap_dev);
1372 cec_unregister_adapter(dev->cec_rx_adap);
1373 for (i = 0; i < MAX_OUTPUTS; i++)
1374 cec_unregister_adapter(dev->cec_tx_adap[i]);
1375 if (dev->cec_workqueue) {
1376 vivid_cec_bus_free_work(dev);
1377 destroy_workqueue(dev->cec_workqueue);
1379 free_dev:
1380 v4l2_device_put(&dev->v4l2_dev);
1381 return ret;
1384 /* This routine allocates from 1 to n_devs virtual drivers.
1386 The real maximum number of virtual drivers will depend on how many drivers
1387 will succeed. This is limited to the maximum number of devices that
1388 videodev supports, which is equal to VIDEO_NUM_DEVICES.
1390 static int vivid_probe(struct platform_device *pdev)
1392 const struct font_desc *font = find_font("VGA8x16");
1393 int ret = 0, i;
1395 if (font == NULL) {
1396 pr_err("vivid: could not find font\n");
1397 return -ENODEV;
1400 tpg_set_font(font->data);
1402 n_devs = clamp_t(unsigned, n_devs, 1, VIVID_MAX_DEVS);
1404 for (i = 0; i < n_devs; i++) {
1405 ret = vivid_create_instance(pdev, i);
1406 if (ret) {
1407 /* If some instantiations succeeded, keep driver */
1408 if (i)
1409 ret = 0;
1410 break;
1414 if (ret < 0) {
1415 pr_err("vivid: error %d while loading driver\n", ret);
1416 return ret;
1419 /* n_devs will reflect the actual number of allocated devices */
1420 n_devs = i;
1422 return ret;
1425 static int vivid_remove(struct platform_device *pdev)
1427 struct vivid_dev *dev;
1428 unsigned int i, j;
1430 for (i = 0; i < n_devs; i++) {
1431 dev = vivid_devs[i];
1432 if (!dev)
1433 continue;
1435 if (dev->has_vid_cap) {
1436 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1437 video_device_node_name(&dev->vid_cap_dev));
1438 video_unregister_device(&dev->vid_cap_dev);
1440 if (dev->has_vid_out) {
1441 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1442 video_device_node_name(&dev->vid_out_dev));
1443 video_unregister_device(&dev->vid_out_dev);
1445 if (dev->has_vbi_cap) {
1446 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1447 video_device_node_name(&dev->vbi_cap_dev));
1448 video_unregister_device(&dev->vbi_cap_dev);
1450 if (dev->has_vbi_out) {
1451 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1452 video_device_node_name(&dev->vbi_out_dev));
1453 video_unregister_device(&dev->vbi_out_dev);
1455 if (dev->has_sdr_cap) {
1456 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1457 video_device_node_name(&dev->sdr_cap_dev));
1458 video_unregister_device(&dev->sdr_cap_dev);
1460 if (dev->has_radio_rx) {
1461 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1462 video_device_node_name(&dev->radio_rx_dev));
1463 video_unregister_device(&dev->radio_rx_dev);
1465 if (dev->has_radio_tx) {
1466 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1467 video_device_node_name(&dev->radio_tx_dev));
1468 video_unregister_device(&dev->radio_tx_dev);
1470 if (dev->has_fb) {
1471 v4l2_info(&dev->v4l2_dev, "unregistering fb%d\n",
1472 dev->fb_info.node);
1473 unregister_framebuffer(&dev->fb_info);
1474 vivid_fb_release_buffers(dev);
1476 cec_unregister_adapter(dev->cec_rx_adap);
1477 for (j = 0; j < MAX_OUTPUTS; j++)
1478 cec_unregister_adapter(dev->cec_tx_adap[j]);
1479 if (dev->cec_workqueue) {
1480 vivid_cec_bus_free_work(dev);
1481 destroy_workqueue(dev->cec_workqueue);
1483 v4l2_device_put(&dev->v4l2_dev);
1484 vivid_devs[i] = NULL;
1486 return 0;
1489 static void vivid_pdev_release(struct device *dev)
1493 static struct platform_device vivid_pdev = {
1494 .name = "vivid",
1495 .dev.release = vivid_pdev_release,
1498 static struct platform_driver vivid_pdrv = {
1499 .probe = vivid_probe,
1500 .remove = vivid_remove,
1501 .driver = {
1502 .name = "vivid",
1506 static int __init vivid_init(void)
1508 int ret;
1510 ret = platform_device_register(&vivid_pdev);
1511 if (ret)
1512 return ret;
1514 ret = platform_driver_register(&vivid_pdrv);
1515 if (ret)
1516 platform_device_unregister(&vivid_pdev);
1518 return ret;
1521 static void __exit vivid_exit(void)
1523 platform_driver_unregister(&vivid_pdrv);
1524 platform_device_unregister(&vivid_pdev);
1527 module_init(vivid_init);
1528 module_exit(vivid_exit);