xref: /linux/drivers/media/usb/go7007/go7007-v4l2.c (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1 /*
2  * Copyright (C) 2005-2006 Micronas USA Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License (Version 2) as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13 
14 #include <linux/module.h>
15 #include <linux/delay.h>
16 #include <linux/sched.h>
17 #include <linux/spinlock.h>
18 #include <linux/slab.h>
19 #include <linux/fs.h>
20 #include <linux/unistd.h>
21 #include <linux/time.h>
22 #include <linux/vmalloc.h>
23 #include <linux/pagemap.h>
24 #include <linux/i2c.h>
25 #include <linux/mutex.h>
26 #include <linux/uaccess.h>
27 #include <linux/videodev2.h>
28 #include <media/v4l2-common.h>
29 #include <media/v4l2-ioctl.h>
30 #include <media/v4l2-subdev.h>
31 #include <media/v4l2-event.h>
32 #include <media/videobuf2-vmalloc.h>
33 #include <media/saa7115.h>
34 
35 #include "go7007-priv.h"
36 
37 #define call_all(dev, o, f, args...) \
38 	v4l2_device_call_until_err(dev, 0, o, f, ##args)
39 
40 static bool valid_pixelformat(u32 pixelformat)
41 {
42 	switch (pixelformat) {
43 	case V4L2_PIX_FMT_MJPEG:
44 	case V4L2_PIX_FMT_MPEG1:
45 	case V4L2_PIX_FMT_MPEG2:
46 	case V4L2_PIX_FMT_MPEG4:
47 		return true;
48 	default:
49 		return false;
50 	}
51 }
52 
53 static u32 get_frame_type_flag(struct go7007_buffer *vb, int format)
54 {
55 	u8 *ptr = vb2_plane_vaddr(&vb->vb, 0);
56 
57 	switch (format) {
58 	case V4L2_PIX_FMT_MJPEG:
59 		return V4L2_BUF_FLAG_KEYFRAME;
60 	case V4L2_PIX_FMT_MPEG4:
61 		switch ((ptr[vb->frame_offset + 4] >> 6) & 0x3) {
62 		case 0:
63 			return V4L2_BUF_FLAG_KEYFRAME;
64 		case 1:
65 			return V4L2_BUF_FLAG_PFRAME;
66 		case 2:
67 			return V4L2_BUF_FLAG_BFRAME;
68 		default:
69 			return 0;
70 		}
71 	case V4L2_PIX_FMT_MPEG1:
72 	case V4L2_PIX_FMT_MPEG2:
73 		switch ((ptr[vb->frame_offset + 5] >> 3) & 0x7) {
74 		case 1:
75 			return V4L2_BUF_FLAG_KEYFRAME;
76 		case 2:
77 			return V4L2_BUF_FLAG_PFRAME;
78 		case 3:
79 			return V4L2_BUF_FLAG_BFRAME;
80 		default:
81 			return 0;
82 		}
83 	}
84 
85 	return 0;
86 }
87 
88 static void get_resolution(struct go7007 *go, int *width, int *height)
89 {
90 	switch (go->standard) {
91 	case GO7007_STD_NTSC:
92 		*width = 720;
93 		*height = 480;
94 		break;
95 	case GO7007_STD_PAL:
96 		*width = 720;
97 		*height = 576;
98 		break;
99 	case GO7007_STD_OTHER:
100 	default:
101 		*width = go->board_info->sensor_width;
102 		*height = go->board_info->sensor_height;
103 		break;
104 	}
105 }
106 
107 static void set_formatting(struct go7007 *go)
108 {
109 	if (go->format == V4L2_PIX_FMT_MJPEG) {
110 		go->pali = 0;
111 		go->aspect_ratio = GO7007_RATIO_1_1;
112 		go->gop_size = 0;
113 		go->ipb = 0;
114 		go->closed_gop = 0;
115 		go->repeat_seqhead = 0;
116 		go->seq_header_enable = 0;
117 		go->gop_header_enable = 0;
118 		go->dvd_mode = 0;
119 		return;
120 	}
121 
122 	switch (go->format) {
123 	case V4L2_PIX_FMT_MPEG1:
124 		go->pali = 0;
125 		break;
126 	default:
127 	case V4L2_PIX_FMT_MPEG2:
128 		go->pali = 0x48;
129 		break;
130 	case V4L2_PIX_FMT_MPEG4:
131 		/* For future reference: this is the list of MPEG4
132 		 * profiles that are available, although they are
133 		 * untested:
134 		 *
135 		 * Profile		pali
136 		 * --------------	----
137 		 * PROFILE_S_L0		0x08
138 		 * PROFILE_S_L1		0x01
139 		 * PROFILE_S_L2		0x02
140 		 * PROFILE_S_L3		0x03
141 		 * PROFILE_ARTS_L1	0x91
142 		 * PROFILE_ARTS_L2	0x92
143 		 * PROFILE_ARTS_L3	0x93
144 		 * PROFILE_ARTS_L4	0x94
145 		 * PROFILE_AS_L0	0xf0
146 		 * PROFILE_AS_L1	0xf1
147 		 * PROFILE_AS_L2	0xf2
148 		 * PROFILE_AS_L3	0xf3
149 		 * PROFILE_AS_L4	0xf4
150 		 * PROFILE_AS_L5	0xf5
151 		 */
152 		go->pali = 0xf5;
153 		break;
154 	}
155 	go->gop_size = v4l2_ctrl_g_ctrl(go->mpeg_video_gop_size);
156 	go->closed_gop = v4l2_ctrl_g_ctrl(go->mpeg_video_gop_closure);
157 	go->ipb = v4l2_ctrl_g_ctrl(go->mpeg_video_b_frames) != 0;
158 	go->bitrate = v4l2_ctrl_g_ctrl(go->mpeg_video_bitrate);
159 	go->repeat_seqhead = v4l2_ctrl_g_ctrl(go->mpeg_video_rep_seqheader);
160 	go->gop_header_enable = 1;
161 	go->dvd_mode = 0;
162 	if (go->format == V4L2_PIX_FMT_MPEG2)
163 		go->dvd_mode =
164 			go->bitrate == 9800000 &&
165 			go->gop_size == 15 &&
166 			go->ipb == 0 &&
167 			go->repeat_seqhead == 1 &&
168 			go->closed_gop;
169 
170 	switch (v4l2_ctrl_g_ctrl(go->mpeg_video_aspect_ratio)) {
171 	default:
172 	case V4L2_MPEG_VIDEO_ASPECT_1x1:
173 		go->aspect_ratio = GO7007_RATIO_1_1;
174 		break;
175 	case V4L2_MPEG_VIDEO_ASPECT_4x3:
176 		go->aspect_ratio = GO7007_RATIO_4_3;
177 		break;
178 	case V4L2_MPEG_VIDEO_ASPECT_16x9:
179 		go->aspect_ratio = GO7007_RATIO_16_9;
180 		break;
181 	}
182 }
183 
184 static int set_capture_size(struct go7007 *go, struct v4l2_format *fmt, int try)
185 {
186 	int sensor_height = 0, sensor_width = 0;
187 	int width, height;
188 
189 	if (fmt != NULL && !valid_pixelformat(fmt->fmt.pix.pixelformat))
190 		return -EINVAL;
191 
192 	get_resolution(go, &sensor_width, &sensor_height);
193 
194 	if (fmt == NULL) {
195 		width = sensor_width;
196 		height = sensor_height;
197 	} else if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
198 		if (fmt->fmt.pix.width > sensor_width)
199 			width = sensor_width;
200 		else if (fmt->fmt.pix.width < 144)
201 			width = 144;
202 		else
203 			width = fmt->fmt.pix.width & ~0x0f;
204 
205 		if (fmt->fmt.pix.height > sensor_height)
206 			height = sensor_height;
207 		else if (fmt->fmt.pix.height < 96)
208 			height = 96;
209 		else
210 			height = fmt->fmt.pix.height & ~0x0f;
211 	} else {
212 		width = fmt->fmt.pix.width;
213 
214 		if (width <= sensor_width / 4) {
215 			width = sensor_width / 4;
216 			height = sensor_height / 4;
217 		} else if (width <= sensor_width / 2) {
218 			width = sensor_width / 2;
219 			height = sensor_height / 2;
220 		} else {
221 			width = sensor_width;
222 			height = sensor_height;
223 		}
224 		width &= ~0xf;
225 		height &= ~0xf;
226 	}
227 
228 	if (fmt != NULL) {
229 		u32 pixelformat = fmt->fmt.pix.pixelformat;
230 
231 		memset(fmt, 0, sizeof(*fmt));
232 		fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
233 		fmt->fmt.pix.width = width;
234 		fmt->fmt.pix.height = height;
235 		fmt->fmt.pix.pixelformat = pixelformat;
236 		fmt->fmt.pix.field = V4L2_FIELD_NONE;
237 		fmt->fmt.pix.bytesperline = 0;
238 		fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
239 		fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
240 	}
241 
242 	if (try)
243 		return 0;
244 
245 	if (fmt)
246 		go->format = fmt->fmt.pix.pixelformat;
247 	go->width = width;
248 	go->height = height;
249 	go->encoder_h_offset = go->board_info->sensor_h_offset;
250 	go->encoder_v_offset = go->board_info->sensor_v_offset;
251 
252 	if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
253 		struct v4l2_subdev_format format = {
254 			.which = V4L2_SUBDEV_FORMAT_ACTIVE,
255 		};
256 
257 		format.format.code = MEDIA_BUS_FMT_FIXED;
258 		format.format.width = fmt ? fmt->fmt.pix.width : width;
259 		format.format.height = height;
260 		go->encoder_h_halve = 0;
261 		go->encoder_v_halve = 0;
262 		go->encoder_subsample = 0;
263 		call_all(&go->v4l2_dev, pad, set_fmt, NULL, &format);
264 	} else {
265 		if (width <= sensor_width / 4) {
266 			go->encoder_h_halve = 1;
267 			go->encoder_v_halve = 1;
268 			go->encoder_subsample = 1;
269 		} else if (width <= sensor_width / 2) {
270 			go->encoder_h_halve = 1;
271 			go->encoder_v_halve = 1;
272 			go->encoder_subsample = 0;
273 		} else {
274 			go->encoder_h_halve = 0;
275 			go->encoder_v_halve = 0;
276 			go->encoder_subsample = 0;
277 		}
278 	}
279 	return 0;
280 }
281 
282 static int vidioc_querycap(struct file *file, void  *priv,
283 					struct v4l2_capability *cap)
284 {
285 	struct go7007 *go = video_drvdata(file);
286 
287 	strlcpy(cap->driver, "go7007", sizeof(cap->driver));
288 	strlcpy(cap->card, go->name, sizeof(cap->card));
289 	strlcpy(cap->bus_info, go->bus_info, sizeof(cap->bus_info));
290 
291 	cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
292 				V4L2_CAP_STREAMING;
293 
294 	if (go->board_info->num_aud_inputs)
295 		cap->device_caps |= V4L2_CAP_AUDIO;
296 	if (go->board_info->flags & GO7007_BOARD_HAS_TUNER)
297 		cap->device_caps |= V4L2_CAP_TUNER;
298 	cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
299 	return 0;
300 }
301 
302 static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
303 					struct v4l2_fmtdesc *fmt)
304 {
305 	char *desc = NULL;
306 
307 	switch (fmt->index) {
308 	case 0:
309 		fmt->pixelformat = V4L2_PIX_FMT_MJPEG;
310 		desc = "Motion JPEG";
311 		break;
312 	case 1:
313 		fmt->pixelformat = V4L2_PIX_FMT_MPEG1;
314 		desc = "MPEG-1 ES";
315 		break;
316 	case 2:
317 		fmt->pixelformat = V4L2_PIX_FMT_MPEG2;
318 		desc = "MPEG-2 ES";
319 		break;
320 	case 3:
321 		fmt->pixelformat = V4L2_PIX_FMT_MPEG4;
322 		desc = "MPEG-4 ES";
323 		break;
324 	default:
325 		return -EINVAL;
326 	}
327 	fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
328 	fmt->flags = V4L2_FMT_FLAG_COMPRESSED;
329 
330 	strncpy(fmt->description, desc, sizeof(fmt->description));
331 
332 	return 0;
333 }
334 
335 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
336 					struct v4l2_format *fmt)
337 {
338 	struct go7007 *go = video_drvdata(file);
339 
340 	fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
341 	fmt->fmt.pix.width = go->width;
342 	fmt->fmt.pix.height = go->height;
343 	fmt->fmt.pix.pixelformat = go->format;
344 	fmt->fmt.pix.field = V4L2_FIELD_NONE;
345 	fmt->fmt.pix.bytesperline = 0;
346 	fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
347 	fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
348 
349 	return 0;
350 }
351 
352 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
353 			struct v4l2_format *fmt)
354 {
355 	struct go7007 *go = video_drvdata(file);
356 
357 	return set_capture_size(go, fmt, 1);
358 }
359 
360 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
361 			struct v4l2_format *fmt)
362 {
363 	struct go7007 *go = video_drvdata(file);
364 
365 	if (vb2_is_busy(&go->vidq))
366 		return -EBUSY;
367 
368 	return set_capture_size(go, fmt, 0);
369 }
370 
371 static int go7007_queue_setup(struct vb2_queue *q,
372 		const struct v4l2_format *fmt,
373 		unsigned int *num_buffers, unsigned int *num_planes,
374 		unsigned int sizes[], void *alloc_ctxs[])
375 {
376 	sizes[0] = GO7007_BUF_SIZE;
377 	*num_planes = 1;
378 
379 	if (*num_buffers < 2)
380 		*num_buffers = 2;
381 
382 	return 0;
383 }
384 
385 static void go7007_buf_queue(struct vb2_buffer *vb)
386 {
387 	struct vb2_queue *vq = vb->vb2_queue;
388 	struct go7007 *go = vb2_get_drv_priv(vq);
389 	struct go7007_buffer *go7007_vb =
390 		container_of(vb, struct go7007_buffer, vb);
391 	unsigned long flags;
392 
393 	spin_lock_irqsave(&go->spinlock, flags);
394 	list_add_tail(&go7007_vb->list, &go->vidq_active);
395 	spin_unlock_irqrestore(&go->spinlock, flags);
396 }
397 
398 static int go7007_buf_prepare(struct vb2_buffer *vb)
399 {
400 	struct go7007_buffer *go7007_vb =
401 		container_of(vb, struct go7007_buffer, vb);
402 
403 	go7007_vb->modet_active = 0;
404 	go7007_vb->frame_offset = 0;
405 	vb->v4l2_planes[0].bytesused = 0;
406 	return 0;
407 }
408 
409 static void go7007_buf_finish(struct vb2_buffer *vb)
410 {
411 	struct vb2_queue *vq = vb->vb2_queue;
412 	struct go7007 *go = vb2_get_drv_priv(vq);
413 	struct go7007_buffer *go7007_vb =
414 		container_of(vb, struct go7007_buffer, vb);
415 	u32 frame_type_flag = get_frame_type_flag(go7007_vb, go->format);
416 	struct v4l2_buffer *buf = &vb->v4l2_buf;
417 
418 	buf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_BFRAME |
419 			V4L2_BUF_FLAG_PFRAME);
420 	buf->flags |= frame_type_flag;
421 	buf->field = V4L2_FIELD_NONE;
422 }
423 
424 static int go7007_start_streaming(struct vb2_queue *q, unsigned int count)
425 {
426 	struct go7007 *go = vb2_get_drv_priv(q);
427 	int ret;
428 
429 	set_formatting(go);
430 	mutex_lock(&go->hw_lock);
431 	go->next_seq = 0;
432 	go->active_buf = NULL;
433 	go->modet_event_status = 0;
434 	q->streaming = 1;
435 	if (go7007_start_encoder(go) < 0)
436 		ret = -EIO;
437 	else
438 		ret = 0;
439 	mutex_unlock(&go->hw_lock);
440 	if (ret) {
441 		q->streaming = 0;
442 		return ret;
443 	}
444 	call_all(&go->v4l2_dev, video, s_stream, 1);
445 	v4l2_ctrl_grab(go->mpeg_video_gop_size, true);
446 	v4l2_ctrl_grab(go->mpeg_video_gop_closure, true);
447 	v4l2_ctrl_grab(go->mpeg_video_bitrate, true);
448 	v4l2_ctrl_grab(go->mpeg_video_aspect_ratio, true);
449 	/* Turn on Capture LED */
450 	if (go->board_id == GO7007_BOARDID_ADS_USBAV_709)
451 		go7007_write_addr(go, 0x3c82, 0x0005);
452 	return ret;
453 }
454 
455 static void go7007_stop_streaming(struct vb2_queue *q)
456 {
457 	struct go7007 *go = vb2_get_drv_priv(q);
458 	unsigned long flags;
459 
460 	q->streaming = 0;
461 	go7007_stream_stop(go);
462 	mutex_lock(&go->hw_lock);
463 	go7007_reset_encoder(go);
464 	mutex_unlock(&go->hw_lock);
465 	call_all(&go->v4l2_dev, video, s_stream, 0);
466 
467 	spin_lock_irqsave(&go->spinlock, flags);
468 	INIT_LIST_HEAD(&go->vidq_active);
469 	spin_unlock_irqrestore(&go->spinlock, flags);
470 	v4l2_ctrl_grab(go->mpeg_video_gop_size, false);
471 	v4l2_ctrl_grab(go->mpeg_video_gop_closure, false);
472 	v4l2_ctrl_grab(go->mpeg_video_bitrate, false);
473 	v4l2_ctrl_grab(go->mpeg_video_aspect_ratio, false);
474 	/* Turn on Capture LED */
475 	if (go->board_id == GO7007_BOARDID_ADS_USBAV_709)
476 		go7007_write_addr(go, 0x3c82, 0x000d);
477 }
478 
479 static struct vb2_ops go7007_video_qops = {
480 	.queue_setup    = go7007_queue_setup,
481 	.buf_queue      = go7007_buf_queue,
482 	.buf_prepare    = go7007_buf_prepare,
483 	.buf_finish     = go7007_buf_finish,
484 	.start_streaming = go7007_start_streaming,
485 	.stop_streaming = go7007_stop_streaming,
486 	.wait_prepare   = vb2_ops_wait_prepare,
487 	.wait_finish    = vb2_ops_wait_finish,
488 };
489 
490 static int vidioc_g_parm(struct file *filp, void *priv,
491 		struct v4l2_streamparm *parm)
492 {
493 	struct go7007 *go = video_drvdata(filp);
494 	struct v4l2_fract timeperframe = {
495 		.numerator = 1001 *  go->fps_scale,
496 		.denominator = go->sensor_framerate,
497 	};
498 
499 	if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
500 		return -EINVAL;
501 
502 	parm->parm.capture.readbuffers = 2;
503 	parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
504 	parm->parm.capture.timeperframe = timeperframe;
505 
506 	return 0;
507 }
508 
509 static int vidioc_s_parm(struct file *filp, void *priv,
510 		struct v4l2_streamparm *parm)
511 {
512 	struct go7007 *go = video_drvdata(filp);
513 	unsigned int n, d;
514 
515 	if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
516 		return -EINVAL;
517 
518 	n = go->sensor_framerate *
519 		parm->parm.capture.timeperframe.numerator;
520 	d = 1001 * parm->parm.capture.timeperframe.denominator;
521 	if (n != 0 && d != 0 && n > d)
522 		go->fps_scale = (n + d/2) / d;
523 	else
524 		go->fps_scale = 1;
525 
526 	return vidioc_g_parm(filp, priv, parm);
527 }
528 
529 /* VIDIOC_ENUMSTD on go7007 were used for enumerating the supported fps and
530    its resolution, when the device is not connected to TV.
531    This is were an API abuse, probably used by the lack of specific IOCTL's to
532    enumerate it, by the time the driver was written.
533 
534    However, since kernel 2.6.19, two new ioctls (VIDIOC_ENUM_FRAMEINTERVALS
535    and VIDIOC_ENUM_FRAMESIZES) were added for this purpose.
536 
537    The two functions below implement the newer ioctls
538 */
539 static int vidioc_enum_framesizes(struct file *filp, void *priv,
540 				  struct v4l2_frmsizeenum *fsize)
541 {
542 	struct go7007 *go = video_drvdata(filp);
543 	int width, height;
544 
545 	if (fsize->index > 2)
546 		return -EINVAL;
547 
548 	if (!valid_pixelformat(fsize->pixel_format))
549 		return -EINVAL;
550 
551 	get_resolution(go, &width, &height);
552 	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
553 	fsize->discrete.width = (width >> fsize->index) & ~0xf;
554 	fsize->discrete.height = (height >> fsize->index) & ~0xf;
555 	return 0;
556 }
557 
558 static int vidioc_enum_frameintervals(struct file *filp, void *priv,
559 				      struct v4l2_frmivalenum *fival)
560 {
561 	struct go7007 *go = video_drvdata(filp);
562 	int width, height;
563 	int i;
564 
565 	if (fival->index > 4)
566 		return -EINVAL;
567 
568 	if (!valid_pixelformat(fival->pixel_format))
569 		return -EINVAL;
570 
571 	if (!(go->board_info->sensor_flags & GO7007_SENSOR_SCALING)) {
572 		get_resolution(go, &width, &height);
573 		for (i = 0; i <= 2; i++)
574 			if (fival->width == ((width >> i) & ~0xf) &&
575 			    fival->height == ((height >> i) & ~0xf))
576 				break;
577 		if (i > 2)
578 			return -EINVAL;
579 	}
580 	fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
581 	fival->discrete.numerator = 1001 * (fival->index + 1);
582 	fival->discrete.denominator = go->sensor_framerate;
583 	return 0;
584 }
585 
586 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *std)
587 {
588 	struct go7007 *go = video_drvdata(file);
589 
590 	*std = go->std;
591 	return 0;
592 }
593 
594 static int go7007_s_std(struct go7007 *go)
595 {
596 	if (go->std & V4L2_STD_625_50) {
597 		go->standard = GO7007_STD_PAL;
598 		go->sensor_framerate = 25025;
599 	} else {
600 		go->standard = GO7007_STD_NTSC;
601 		go->sensor_framerate = 30000;
602 	}
603 
604 	call_all(&go->v4l2_dev, video, s_std, go->std);
605 	set_capture_size(go, NULL, 0);
606 	return 0;
607 }
608 
609 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id std)
610 {
611 	struct go7007 *go = video_drvdata(file);
612 
613 	if (vb2_is_busy(&go->vidq))
614 		return -EBUSY;
615 
616 	go->std = std;
617 
618 	return go7007_s_std(go);
619 }
620 
621 static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *std)
622 {
623 	struct go7007 *go = video_drvdata(file);
624 
625 	return call_all(&go->v4l2_dev, video, querystd, std);
626 }
627 
628 static int vidioc_enum_input(struct file *file, void *priv,
629 				struct v4l2_input *inp)
630 {
631 	struct go7007 *go = video_drvdata(file);
632 
633 	if (inp->index >= go->board_info->num_inputs)
634 		return -EINVAL;
635 
636 	strncpy(inp->name, go->board_info->inputs[inp->index].name,
637 			sizeof(inp->name));
638 
639 	/* If this board has a tuner, it will be the first input */
640 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
641 			inp->index == 0)
642 		inp->type = V4L2_INPUT_TYPE_TUNER;
643 	else
644 		inp->type = V4L2_INPUT_TYPE_CAMERA;
645 
646 	if (go->board_info->num_aud_inputs)
647 		inp->audioset = (1 << go->board_info->num_aud_inputs) - 1;
648 	else
649 		inp->audioset = 0;
650 	inp->tuner = 0;
651 	if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
652 		inp->std = video_devdata(file)->tvnorms;
653 	else
654 		inp->std = 0;
655 
656 	return 0;
657 }
658 
659 
660 static int vidioc_g_input(struct file *file, void *priv, unsigned int *input)
661 {
662 	struct go7007 *go = video_drvdata(file);
663 
664 	*input = go->input;
665 
666 	return 0;
667 }
668 
669 static int vidioc_enumaudio(struct file *file, void *fh, struct v4l2_audio *a)
670 {
671 	struct go7007 *go = video_drvdata(file);
672 
673 	if (a->index >= go->board_info->num_aud_inputs)
674 		return -EINVAL;
675 	strlcpy(a->name, go->board_info->aud_inputs[a->index].name,
676 		sizeof(a->name));
677 	a->capability = V4L2_AUDCAP_STEREO;
678 	return 0;
679 }
680 
681 static int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *a)
682 {
683 	struct go7007 *go = video_drvdata(file);
684 
685 	a->index = go->aud_input;
686 	strlcpy(a->name, go->board_info->aud_inputs[go->aud_input].name,
687 		sizeof(a->name));
688 	a->capability = V4L2_AUDCAP_STEREO;
689 	return 0;
690 }
691 
692 static int vidioc_s_audio(struct file *file, void *fh,
693 	const struct v4l2_audio *a)
694 {
695 	struct go7007 *go = video_drvdata(file);
696 
697 	if (a->index >= go->board_info->num_aud_inputs)
698 		return -EINVAL;
699 	go->aud_input = a->index;
700 	v4l2_subdev_call(go->sd_audio, audio, s_routing,
701 		go->board_info->aud_inputs[go->aud_input].audio_input, 0, 0);
702 	return 0;
703 }
704 
705 static void go7007_s_input(struct go7007 *go)
706 {
707 	unsigned int input = go->input;
708 
709 	v4l2_subdev_call(go->sd_video, video, s_routing,
710 			go->board_info->inputs[input].video_input, 0,
711 			go->board_info->video_config);
712 	if (go->board_info->num_aud_inputs) {
713 		int aud_input = go->board_info->inputs[input].audio_index;
714 
715 		v4l2_subdev_call(go->sd_audio, audio, s_routing,
716 			go->board_info->aud_inputs[aud_input].audio_input, 0, 0);
717 		go->aud_input = aud_input;
718 	}
719 }
720 
721 static int vidioc_s_input(struct file *file, void *priv, unsigned int input)
722 {
723 	struct go7007 *go = video_drvdata(file);
724 
725 	if (input >= go->board_info->num_inputs)
726 		return -EINVAL;
727 	if (vb2_is_busy(&go->vidq))
728 		return -EBUSY;
729 
730 	go->input = input;
731 	go7007_s_input(go);
732 
733 	return 0;
734 }
735 
736 static int vidioc_g_tuner(struct file *file, void *priv,
737 				struct v4l2_tuner *t)
738 {
739 	struct go7007 *go = video_drvdata(file);
740 
741 	if (t->index != 0)
742 		return -EINVAL;
743 
744 	strlcpy(t->name, "Tuner", sizeof(t->name));
745 	return call_all(&go->v4l2_dev, tuner, g_tuner, t);
746 }
747 
748 static int vidioc_s_tuner(struct file *file, void *priv,
749 				const struct v4l2_tuner *t)
750 {
751 	struct go7007 *go = video_drvdata(file);
752 
753 	if (t->index != 0)
754 		return -EINVAL;
755 
756 	return call_all(&go->v4l2_dev, tuner, s_tuner, t);
757 }
758 
759 static int vidioc_g_frequency(struct file *file, void *priv,
760 				struct v4l2_frequency *f)
761 {
762 	struct go7007 *go = video_drvdata(file);
763 
764 	if (f->tuner)
765 		return -EINVAL;
766 
767 	return call_all(&go->v4l2_dev, tuner, g_frequency, f);
768 }
769 
770 static int vidioc_s_frequency(struct file *file, void *priv,
771 				const struct v4l2_frequency *f)
772 {
773 	struct go7007 *go = video_drvdata(file);
774 
775 	if (f->tuner)
776 		return -EINVAL;
777 
778 	return call_all(&go->v4l2_dev, tuner, s_frequency, f);
779 }
780 
781 static int vidioc_log_status(struct file *file, void *priv)
782 {
783 	struct go7007 *go = video_drvdata(file);
784 
785 	v4l2_ctrl_log_status(file, priv);
786 	return call_all(&go->v4l2_dev, core, log_status);
787 }
788 
789 static int vidioc_subscribe_event(struct v4l2_fh *fh,
790 				const struct v4l2_event_subscription *sub)
791 {
792 
793 	switch (sub->type) {
794 	case V4L2_EVENT_CTRL:
795 		return v4l2_ctrl_subscribe_event(fh, sub);
796 	case V4L2_EVENT_MOTION_DET:
797 		/* Allow for up to 30 events (1 second for NTSC) to be
798 		 * stored. */
799 		return v4l2_event_subscribe(fh, sub, 30, NULL);
800 	}
801 	return -EINVAL;
802 }
803 
804 
805 static int go7007_s_ctrl(struct v4l2_ctrl *ctrl)
806 {
807 	struct go7007 *go =
808 		container_of(ctrl->handler, struct go7007, hdl);
809 	unsigned y;
810 	u8 *mt;
811 
812 	switch (ctrl->id) {
813 	case V4L2_CID_PIXEL_THRESHOLD0:
814 		go->modet[0].pixel_threshold = ctrl->val;
815 		break;
816 	case V4L2_CID_MOTION_THRESHOLD0:
817 		go->modet[0].motion_threshold = ctrl->val;
818 		break;
819 	case V4L2_CID_MB_THRESHOLD0:
820 		go->modet[0].mb_threshold = ctrl->val;
821 		break;
822 	case V4L2_CID_PIXEL_THRESHOLD1:
823 		go->modet[1].pixel_threshold = ctrl->val;
824 		break;
825 	case V4L2_CID_MOTION_THRESHOLD1:
826 		go->modet[1].motion_threshold = ctrl->val;
827 		break;
828 	case V4L2_CID_MB_THRESHOLD1:
829 		go->modet[1].mb_threshold = ctrl->val;
830 		break;
831 	case V4L2_CID_PIXEL_THRESHOLD2:
832 		go->modet[2].pixel_threshold = ctrl->val;
833 		break;
834 	case V4L2_CID_MOTION_THRESHOLD2:
835 		go->modet[2].motion_threshold = ctrl->val;
836 		break;
837 	case V4L2_CID_MB_THRESHOLD2:
838 		go->modet[2].mb_threshold = ctrl->val;
839 		break;
840 	case V4L2_CID_PIXEL_THRESHOLD3:
841 		go->modet[3].pixel_threshold = ctrl->val;
842 		break;
843 	case V4L2_CID_MOTION_THRESHOLD3:
844 		go->modet[3].motion_threshold = ctrl->val;
845 		break;
846 	case V4L2_CID_MB_THRESHOLD3:
847 		go->modet[3].mb_threshold = ctrl->val;
848 		break;
849 	case V4L2_CID_DETECT_MD_REGION_GRID:
850 		mt = go->modet_map;
851 		for (y = 0; y < go->height / 16; y++, mt += go->width / 16)
852 			memcpy(mt, ctrl->p_new.p_u8 + y * (720 / 16), go->width / 16);
853 		break;
854 	default:
855 		return -EINVAL;
856 	}
857 	return 0;
858 }
859 
860 static struct v4l2_file_operations go7007_fops = {
861 	.owner		= THIS_MODULE,
862 	.open		= v4l2_fh_open,
863 	.release	= vb2_fop_release,
864 	.unlocked_ioctl	= video_ioctl2,
865 	.read		= vb2_fop_read,
866 	.mmap		= vb2_fop_mmap,
867 	.poll		= vb2_fop_poll,
868 };
869 
870 static const struct v4l2_ioctl_ops video_ioctl_ops = {
871 	.vidioc_querycap          = vidioc_querycap,
872 	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
873 	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
874 	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
875 	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
876 	.vidioc_reqbufs           = vb2_ioctl_reqbufs,
877 	.vidioc_querybuf          = vb2_ioctl_querybuf,
878 	.vidioc_qbuf              = vb2_ioctl_qbuf,
879 	.vidioc_dqbuf             = vb2_ioctl_dqbuf,
880 	.vidioc_g_std             = vidioc_g_std,
881 	.vidioc_s_std             = vidioc_s_std,
882 	.vidioc_querystd          = vidioc_querystd,
883 	.vidioc_enum_input        = vidioc_enum_input,
884 	.vidioc_g_input           = vidioc_g_input,
885 	.vidioc_s_input           = vidioc_s_input,
886 	.vidioc_enumaudio         = vidioc_enumaudio,
887 	.vidioc_g_audio           = vidioc_g_audio,
888 	.vidioc_s_audio           = vidioc_s_audio,
889 	.vidioc_streamon          = vb2_ioctl_streamon,
890 	.vidioc_streamoff         = vb2_ioctl_streamoff,
891 	.vidioc_g_tuner           = vidioc_g_tuner,
892 	.vidioc_s_tuner           = vidioc_s_tuner,
893 	.vidioc_g_frequency       = vidioc_g_frequency,
894 	.vidioc_s_frequency       = vidioc_s_frequency,
895 	.vidioc_g_parm            = vidioc_g_parm,
896 	.vidioc_s_parm            = vidioc_s_parm,
897 	.vidioc_enum_framesizes   = vidioc_enum_framesizes,
898 	.vidioc_enum_frameintervals = vidioc_enum_frameintervals,
899 	.vidioc_log_status        = vidioc_log_status,
900 	.vidioc_subscribe_event   = vidioc_subscribe_event,
901 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
902 };
903 
904 static struct video_device go7007_template = {
905 	.name		= "go7007",
906 	.fops		= &go7007_fops,
907 	.release	= video_device_release_empty,
908 	.ioctl_ops	= &video_ioctl_ops,
909 	.tvnorms	= V4L2_STD_ALL,
910 };
911 
912 static const struct v4l2_ctrl_ops go7007_ctrl_ops = {
913 	.s_ctrl = go7007_s_ctrl,
914 };
915 
916 static const struct v4l2_ctrl_config go7007_pixel_threshold0_ctrl = {
917 	.ops = &go7007_ctrl_ops,
918 	.id = V4L2_CID_PIXEL_THRESHOLD0,
919 	.name = "Pixel Threshold Region 0",
920 	.type = V4L2_CTRL_TYPE_INTEGER,
921 	.def = 20,
922 	.max = 32767,
923 	.step = 1,
924 };
925 
926 static const struct v4l2_ctrl_config go7007_motion_threshold0_ctrl = {
927 	.ops = &go7007_ctrl_ops,
928 	.id = V4L2_CID_MOTION_THRESHOLD0,
929 	.name = "Motion Threshold Region 0",
930 	.type = V4L2_CTRL_TYPE_INTEGER,
931 	.def = 80,
932 	.max = 32767,
933 	.step = 1,
934 };
935 
936 static const struct v4l2_ctrl_config go7007_mb_threshold0_ctrl = {
937 	.ops = &go7007_ctrl_ops,
938 	.id = V4L2_CID_MB_THRESHOLD0,
939 	.name = "MB Threshold Region 0",
940 	.type = V4L2_CTRL_TYPE_INTEGER,
941 	.def = 200,
942 	.max = 32767,
943 	.step = 1,
944 };
945 
946 static const struct v4l2_ctrl_config go7007_pixel_threshold1_ctrl = {
947 	.ops = &go7007_ctrl_ops,
948 	.id = V4L2_CID_PIXEL_THRESHOLD1,
949 	.name = "Pixel Threshold Region 1",
950 	.type = V4L2_CTRL_TYPE_INTEGER,
951 	.def = 20,
952 	.max = 32767,
953 	.step = 1,
954 };
955 
956 static const struct v4l2_ctrl_config go7007_motion_threshold1_ctrl = {
957 	.ops = &go7007_ctrl_ops,
958 	.id = V4L2_CID_MOTION_THRESHOLD1,
959 	.name = "Motion Threshold Region 1",
960 	.type = V4L2_CTRL_TYPE_INTEGER,
961 	.def = 80,
962 	.max = 32767,
963 	.step = 1,
964 };
965 
966 static const struct v4l2_ctrl_config go7007_mb_threshold1_ctrl = {
967 	.ops = &go7007_ctrl_ops,
968 	.id = V4L2_CID_MB_THRESHOLD1,
969 	.name = "MB Threshold Region 1",
970 	.type = V4L2_CTRL_TYPE_INTEGER,
971 	.def = 200,
972 	.max = 32767,
973 	.step = 1,
974 };
975 
976 static const struct v4l2_ctrl_config go7007_pixel_threshold2_ctrl = {
977 	.ops = &go7007_ctrl_ops,
978 	.id = V4L2_CID_PIXEL_THRESHOLD2,
979 	.name = "Pixel Threshold Region 2",
980 	.type = V4L2_CTRL_TYPE_INTEGER,
981 	.def = 20,
982 	.max = 32767,
983 	.step = 1,
984 };
985 
986 static const struct v4l2_ctrl_config go7007_motion_threshold2_ctrl = {
987 	.ops = &go7007_ctrl_ops,
988 	.id = V4L2_CID_MOTION_THRESHOLD2,
989 	.name = "Motion Threshold Region 2",
990 	.type = V4L2_CTRL_TYPE_INTEGER,
991 	.def = 80,
992 	.max = 32767,
993 	.step = 1,
994 };
995 
996 static const struct v4l2_ctrl_config go7007_mb_threshold2_ctrl = {
997 	.ops = &go7007_ctrl_ops,
998 	.id = V4L2_CID_MB_THRESHOLD2,
999 	.name = "MB Threshold Region 2",
1000 	.type = V4L2_CTRL_TYPE_INTEGER,
1001 	.def = 200,
1002 	.max = 32767,
1003 	.step = 1,
1004 };
1005 
1006 static const struct v4l2_ctrl_config go7007_pixel_threshold3_ctrl = {
1007 	.ops = &go7007_ctrl_ops,
1008 	.id = V4L2_CID_PIXEL_THRESHOLD3,
1009 	.name = "Pixel Threshold Region 3",
1010 	.type = V4L2_CTRL_TYPE_INTEGER,
1011 	.def = 20,
1012 	.max = 32767,
1013 	.step = 1,
1014 };
1015 
1016 static const struct v4l2_ctrl_config go7007_motion_threshold3_ctrl = {
1017 	.ops = &go7007_ctrl_ops,
1018 	.id = V4L2_CID_MOTION_THRESHOLD3,
1019 	.name = "Motion Threshold Region 3",
1020 	.type = V4L2_CTRL_TYPE_INTEGER,
1021 	.def = 80,
1022 	.max = 32767,
1023 	.step = 1,
1024 };
1025 
1026 static const struct v4l2_ctrl_config go7007_mb_threshold3_ctrl = {
1027 	.ops = &go7007_ctrl_ops,
1028 	.id = V4L2_CID_MB_THRESHOLD3,
1029 	.name = "MB Threshold Region 3",
1030 	.type = V4L2_CTRL_TYPE_INTEGER,
1031 	.def = 200,
1032 	.max = 32767,
1033 	.step = 1,
1034 };
1035 
1036 static const struct v4l2_ctrl_config go7007_mb_regions_ctrl = {
1037 	.ops = &go7007_ctrl_ops,
1038 	.id = V4L2_CID_DETECT_MD_REGION_GRID,
1039 	.dims = { 576 / 16, 720 / 16 },
1040 	.max = 3,
1041 	.step = 1,
1042 };
1043 
1044 int go7007_v4l2_ctrl_init(struct go7007 *go)
1045 {
1046 	struct v4l2_ctrl_handler *hdl = &go->hdl;
1047 	struct v4l2_ctrl *ctrl;
1048 
1049 	v4l2_ctrl_handler_init(hdl, 22);
1050 	go->mpeg_video_gop_size = v4l2_ctrl_new_std(hdl, NULL,
1051 			V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, 34, 1, 15);
1052 	go->mpeg_video_gop_closure = v4l2_ctrl_new_std(hdl, NULL,
1053 			V4L2_CID_MPEG_VIDEO_GOP_CLOSURE, 0, 1, 1, 1);
1054 	go->mpeg_video_bitrate = v4l2_ctrl_new_std(hdl, NULL,
1055 			V4L2_CID_MPEG_VIDEO_BITRATE,
1056 			64000, 10000000, 1, 9800000);
1057 	go->mpeg_video_b_frames = v4l2_ctrl_new_std(hdl, NULL,
1058 			V4L2_CID_MPEG_VIDEO_B_FRAMES, 0, 2, 2, 0);
1059 	go->mpeg_video_rep_seqheader = v4l2_ctrl_new_std(hdl, NULL,
1060 			V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, 0, 1, 1, 1);
1061 
1062 	go->mpeg_video_aspect_ratio = v4l2_ctrl_new_std_menu(hdl, NULL,
1063 			V4L2_CID_MPEG_VIDEO_ASPECT,
1064 			V4L2_MPEG_VIDEO_ASPECT_16x9, 0,
1065 			V4L2_MPEG_VIDEO_ASPECT_1x1);
1066 	ctrl = v4l2_ctrl_new_std(hdl, NULL,
1067 			V4L2_CID_JPEG_ACTIVE_MARKER, 0,
1068 			V4L2_JPEG_ACTIVE_MARKER_DQT |
1069 			V4L2_JPEG_ACTIVE_MARKER_DHT, 0,
1070 			V4L2_JPEG_ACTIVE_MARKER_DQT |
1071 			V4L2_JPEG_ACTIVE_MARKER_DHT);
1072 	if (ctrl)
1073 		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1074 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold0_ctrl, NULL);
1075 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold0_ctrl, NULL);
1076 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold0_ctrl, NULL);
1077 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold1_ctrl, NULL);
1078 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold1_ctrl, NULL);
1079 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold1_ctrl, NULL);
1080 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold2_ctrl, NULL);
1081 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold2_ctrl, NULL);
1082 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold2_ctrl, NULL);
1083 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold3_ctrl, NULL);
1084 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold3_ctrl, NULL);
1085 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold3_ctrl, NULL);
1086 	v4l2_ctrl_new_custom(hdl, &go7007_mb_regions_ctrl, NULL);
1087 	go->modet_mode = v4l2_ctrl_new_std_menu(hdl, NULL,
1088 			V4L2_CID_DETECT_MD_MODE,
1089 			V4L2_DETECT_MD_MODE_REGION_GRID,
1090 			1 << V4L2_DETECT_MD_MODE_THRESHOLD_GRID,
1091 			V4L2_DETECT_MD_MODE_DISABLED);
1092 	if (hdl->error) {
1093 		int rv = hdl->error;
1094 
1095 		v4l2_err(&go->v4l2_dev, "Could not register controls\n");
1096 		return rv;
1097 	}
1098 	go->v4l2_dev.ctrl_handler = hdl;
1099 	return 0;
1100 }
1101 
1102 int go7007_v4l2_init(struct go7007 *go)
1103 {
1104 	struct video_device *vdev = &go->vdev;
1105 	int rv;
1106 
1107 	mutex_init(&go->serialize_lock);
1108 	mutex_init(&go->queue_lock);
1109 
1110 	INIT_LIST_HEAD(&go->vidq_active);
1111 	go->vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1112 	go->vidq.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1113 	go->vidq.ops = &go7007_video_qops;
1114 	go->vidq.mem_ops = &vb2_vmalloc_memops;
1115 	go->vidq.drv_priv = go;
1116 	go->vidq.buf_struct_size = sizeof(struct go7007_buffer);
1117 	go->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1118 	go->vidq.lock = &go->queue_lock;
1119 	rv = vb2_queue_init(&go->vidq);
1120 	if (rv)
1121 		return rv;
1122 	*vdev = go7007_template;
1123 	vdev->lock = &go->serialize_lock;
1124 	vdev->queue = &go->vidq;
1125 	video_set_drvdata(vdev, go);
1126 	vdev->v4l2_dev = &go->v4l2_dev;
1127 	if (!v4l2_device_has_op(&go->v4l2_dev, video, querystd))
1128 		v4l2_disable_ioctl(vdev, VIDIOC_QUERYSTD);
1129 	if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER)) {
1130 		v4l2_disable_ioctl(vdev, VIDIOC_S_FREQUENCY);
1131 		v4l2_disable_ioctl(vdev, VIDIOC_G_FREQUENCY);
1132 		v4l2_disable_ioctl(vdev, VIDIOC_S_TUNER);
1133 		v4l2_disable_ioctl(vdev, VIDIOC_G_TUNER);
1134 	} else {
1135 		struct v4l2_frequency f = {
1136 			.type = V4L2_TUNER_ANALOG_TV,
1137 			.frequency = 980,
1138 		};
1139 
1140 		call_all(&go->v4l2_dev, tuner, s_frequency, &f);
1141 	}
1142 	if (!(go->board_info->sensor_flags & GO7007_SENSOR_TV)) {
1143 		v4l2_disable_ioctl(vdev, VIDIOC_G_STD);
1144 		v4l2_disable_ioctl(vdev, VIDIOC_S_STD);
1145 		vdev->tvnorms = 0;
1146 	}
1147 	if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING)
1148 		v4l2_disable_ioctl(vdev, VIDIOC_ENUM_FRAMESIZES);
1149 	if (go->board_info->num_aud_inputs == 0) {
1150 		v4l2_disable_ioctl(vdev, VIDIOC_G_AUDIO);
1151 		v4l2_disable_ioctl(vdev, VIDIOC_S_AUDIO);
1152 		v4l2_disable_ioctl(vdev, VIDIOC_ENUMAUDIO);
1153 	}
1154 	/* Setup correct crystal frequency on this board */
1155 	if (go->board_info->sensor_flags & GO7007_SENSOR_SAA7115)
1156 		v4l2_subdev_call(go->sd_video, video, s_crystal_freq,
1157 				SAA7115_FREQ_24_576_MHZ,
1158 				SAA7115_FREQ_FL_APLL | SAA7115_FREQ_FL_UCGC |
1159 				SAA7115_FREQ_FL_DOUBLE_ASCLK);
1160 	go7007_s_input(go);
1161 	if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1162 		go7007_s_std(go);
1163 	rv = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1164 	if (rv < 0)
1165 		return rv;
1166 	dev_info(go->dev, "registered device %s [v4l2]\n",
1167 		 video_device_node_name(vdev));
1168 
1169 	return 0;
1170 }
1171 
1172 void go7007_v4l2_remove(struct go7007 *go)
1173 {
1174 	v4l2_ctrl_handler_free(&go->hdl);
1175 }
1176