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.vb2_buf, 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 void *parg,
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 vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
390 	struct go7007_buffer *go7007_vb =
391 		container_of(vbuf, struct go7007_buffer, vb);
392 	unsigned long flags;
393 
394 	spin_lock_irqsave(&go->spinlock, flags);
395 	list_add_tail(&go7007_vb->list, &go->vidq_active);
396 	spin_unlock_irqrestore(&go->spinlock, flags);
397 }
398 
399 static int go7007_buf_prepare(struct vb2_buffer *vb)
400 {
401 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
402 	struct go7007_buffer *go7007_vb =
403 		container_of(vbuf, struct go7007_buffer, vb);
404 
405 	go7007_vb->modet_active = 0;
406 	go7007_vb->frame_offset = 0;
407 	vb->planes[0].bytesused = 0;
408 	return 0;
409 }
410 
411 static void go7007_buf_finish(struct vb2_buffer *vb)
412 {
413 	struct vb2_queue *vq = vb->vb2_queue;
414 	struct go7007 *go = vb2_get_drv_priv(vq);
415 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
416 	struct go7007_buffer *go7007_vb =
417 		container_of(vbuf, struct go7007_buffer, vb);
418 	u32 frame_type_flag = get_frame_type_flag(go7007_vb, go->format);
419 
420 	vbuf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_BFRAME |
421 			V4L2_BUF_FLAG_PFRAME);
422 	vbuf->flags |= frame_type_flag;
423 	vbuf->field = V4L2_FIELD_NONE;
424 }
425 
426 static int go7007_start_streaming(struct vb2_queue *q, unsigned int count)
427 {
428 	struct go7007 *go = vb2_get_drv_priv(q);
429 	int ret;
430 
431 	set_formatting(go);
432 	mutex_lock(&go->hw_lock);
433 	go->next_seq = 0;
434 	go->active_buf = NULL;
435 	go->modet_event_status = 0;
436 	q->streaming = 1;
437 	if (go7007_start_encoder(go) < 0)
438 		ret = -EIO;
439 	else
440 		ret = 0;
441 	mutex_unlock(&go->hw_lock);
442 	if (ret) {
443 		q->streaming = 0;
444 		return ret;
445 	}
446 	call_all(&go->v4l2_dev, video, s_stream, 1);
447 	v4l2_ctrl_grab(go->mpeg_video_gop_size, true);
448 	v4l2_ctrl_grab(go->mpeg_video_gop_closure, true);
449 	v4l2_ctrl_grab(go->mpeg_video_bitrate, true);
450 	v4l2_ctrl_grab(go->mpeg_video_aspect_ratio, true);
451 	/* Turn on Capture LED */
452 	if (go->board_id == GO7007_BOARDID_ADS_USBAV_709)
453 		go7007_write_addr(go, 0x3c82, 0x0005);
454 	return ret;
455 }
456 
457 static void go7007_stop_streaming(struct vb2_queue *q)
458 {
459 	struct go7007 *go = vb2_get_drv_priv(q);
460 	unsigned long flags;
461 
462 	q->streaming = 0;
463 	go7007_stream_stop(go);
464 	mutex_lock(&go->hw_lock);
465 	go7007_reset_encoder(go);
466 	mutex_unlock(&go->hw_lock);
467 	call_all(&go->v4l2_dev, video, s_stream, 0);
468 
469 	spin_lock_irqsave(&go->spinlock, flags);
470 	INIT_LIST_HEAD(&go->vidq_active);
471 	spin_unlock_irqrestore(&go->spinlock, flags);
472 	v4l2_ctrl_grab(go->mpeg_video_gop_size, false);
473 	v4l2_ctrl_grab(go->mpeg_video_gop_closure, false);
474 	v4l2_ctrl_grab(go->mpeg_video_bitrate, false);
475 	v4l2_ctrl_grab(go->mpeg_video_aspect_ratio, false);
476 	/* Turn on Capture LED */
477 	if (go->board_id == GO7007_BOARDID_ADS_USBAV_709)
478 		go7007_write_addr(go, 0x3c82, 0x000d);
479 }
480 
481 static struct vb2_ops go7007_video_qops = {
482 	.queue_setup    = go7007_queue_setup,
483 	.buf_queue      = go7007_buf_queue,
484 	.buf_prepare    = go7007_buf_prepare,
485 	.buf_finish     = go7007_buf_finish,
486 	.start_streaming = go7007_start_streaming,
487 	.stop_streaming = go7007_stop_streaming,
488 	.wait_prepare   = vb2_ops_wait_prepare,
489 	.wait_finish    = vb2_ops_wait_finish,
490 };
491 
492 static int vidioc_g_parm(struct file *filp, void *priv,
493 		struct v4l2_streamparm *parm)
494 {
495 	struct go7007 *go = video_drvdata(filp);
496 	struct v4l2_fract timeperframe = {
497 		.numerator = 1001 *  go->fps_scale,
498 		.denominator = go->sensor_framerate,
499 	};
500 
501 	if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
502 		return -EINVAL;
503 
504 	parm->parm.capture.readbuffers = 2;
505 	parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
506 	parm->parm.capture.timeperframe = timeperframe;
507 
508 	return 0;
509 }
510 
511 static int vidioc_s_parm(struct file *filp, void *priv,
512 		struct v4l2_streamparm *parm)
513 {
514 	struct go7007 *go = video_drvdata(filp);
515 	unsigned int n, d;
516 
517 	if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
518 		return -EINVAL;
519 
520 	n = go->sensor_framerate *
521 		parm->parm.capture.timeperframe.numerator;
522 	d = 1001 * parm->parm.capture.timeperframe.denominator;
523 	if (n != 0 && d != 0 && n > d)
524 		go->fps_scale = (n + d/2) / d;
525 	else
526 		go->fps_scale = 1;
527 
528 	return vidioc_g_parm(filp, priv, parm);
529 }
530 
531 /* VIDIOC_ENUMSTD on go7007 were used for enumerating the supported fps and
532    its resolution, when the device is not connected to TV.
533    This is were an API abuse, probably used by the lack of specific IOCTL's to
534    enumerate it, by the time the driver was written.
535 
536    However, since kernel 2.6.19, two new ioctls (VIDIOC_ENUM_FRAMEINTERVALS
537    and VIDIOC_ENUM_FRAMESIZES) were added for this purpose.
538 
539    The two functions below implement the newer ioctls
540 */
541 static int vidioc_enum_framesizes(struct file *filp, void *priv,
542 				  struct v4l2_frmsizeenum *fsize)
543 {
544 	struct go7007 *go = video_drvdata(filp);
545 	int width, height;
546 
547 	if (fsize->index > 2)
548 		return -EINVAL;
549 
550 	if (!valid_pixelformat(fsize->pixel_format))
551 		return -EINVAL;
552 
553 	get_resolution(go, &width, &height);
554 	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
555 	fsize->discrete.width = (width >> fsize->index) & ~0xf;
556 	fsize->discrete.height = (height >> fsize->index) & ~0xf;
557 	return 0;
558 }
559 
560 static int vidioc_enum_frameintervals(struct file *filp, void *priv,
561 				      struct v4l2_frmivalenum *fival)
562 {
563 	struct go7007 *go = video_drvdata(filp);
564 	int width, height;
565 	int i;
566 
567 	if (fival->index > 4)
568 		return -EINVAL;
569 
570 	if (!valid_pixelformat(fival->pixel_format))
571 		return -EINVAL;
572 
573 	if (!(go->board_info->sensor_flags & GO7007_SENSOR_SCALING)) {
574 		get_resolution(go, &width, &height);
575 		for (i = 0; i <= 2; i++)
576 			if (fival->width == ((width >> i) & ~0xf) &&
577 			    fival->height == ((height >> i) & ~0xf))
578 				break;
579 		if (i > 2)
580 			return -EINVAL;
581 	}
582 	fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
583 	fival->discrete.numerator = 1001 * (fival->index + 1);
584 	fival->discrete.denominator = go->sensor_framerate;
585 	return 0;
586 }
587 
588 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *std)
589 {
590 	struct go7007 *go = video_drvdata(file);
591 
592 	*std = go->std;
593 	return 0;
594 }
595 
596 static int go7007_s_std(struct go7007 *go)
597 {
598 	if (go->std & V4L2_STD_625_50) {
599 		go->standard = GO7007_STD_PAL;
600 		go->sensor_framerate = 25025;
601 	} else {
602 		go->standard = GO7007_STD_NTSC;
603 		go->sensor_framerate = 30000;
604 	}
605 
606 	call_all(&go->v4l2_dev, video, s_std, go->std);
607 	set_capture_size(go, NULL, 0);
608 	return 0;
609 }
610 
611 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id std)
612 {
613 	struct go7007 *go = video_drvdata(file);
614 
615 	if (vb2_is_busy(&go->vidq))
616 		return -EBUSY;
617 
618 	go->std = std;
619 
620 	return go7007_s_std(go);
621 }
622 
623 static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *std)
624 {
625 	struct go7007 *go = video_drvdata(file);
626 
627 	return call_all(&go->v4l2_dev, video, querystd, std);
628 }
629 
630 static int vidioc_enum_input(struct file *file, void *priv,
631 				struct v4l2_input *inp)
632 {
633 	struct go7007 *go = video_drvdata(file);
634 
635 	if (inp->index >= go->board_info->num_inputs)
636 		return -EINVAL;
637 
638 	strncpy(inp->name, go->board_info->inputs[inp->index].name,
639 			sizeof(inp->name));
640 
641 	/* If this board has a tuner, it will be the first input */
642 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
643 			inp->index == 0)
644 		inp->type = V4L2_INPUT_TYPE_TUNER;
645 	else
646 		inp->type = V4L2_INPUT_TYPE_CAMERA;
647 
648 	if (go->board_info->num_aud_inputs)
649 		inp->audioset = (1 << go->board_info->num_aud_inputs) - 1;
650 	else
651 		inp->audioset = 0;
652 	inp->tuner = 0;
653 	if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
654 		inp->std = video_devdata(file)->tvnorms;
655 	else
656 		inp->std = 0;
657 
658 	return 0;
659 }
660 
661 
662 static int vidioc_g_input(struct file *file, void *priv, unsigned int *input)
663 {
664 	struct go7007 *go = video_drvdata(file);
665 
666 	*input = go->input;
667 
668 	return 0;
669 }
670 
671 static int vidioc_enumaudio(struct file *file, void *fh, struct v4l2_audio *a)
672 {
673 	struct go7007 *go = video_drvdata(file);
674 
675 	if (a->index >= go->board_info->num_aud_inputs)
676 		return -EINVAL;
677 	strlcpy(a->name, go->board_info->aud_inputs[a->index].name,
678 		sizeof(a->name));
679 	a->capability = V4L2_AUDCAP_STEREO;
680 	return 0;
681 }
682 
683 static int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *a)
684 {
685 	struct go7007 *go = video_drvdata(file);
686 
687 	a->index = go->aud_input;
688 	strlcpy(a->name, go->board_info->aud_inputs[go->aud_input].name,
689 		sizeof(a->name));
690 	a->capability = V4L2_AUDCAP_STEREO;
691 	return 0;
692 }
693 
694 static int vidioc_s_audio(struct file *file, void *fh,
695 	const struct v4l2_audio *a)
696 {
697 	struct go7007 *go = video_drvdata(file);
698 
699 	if (a->index >= go->board_info->num_aud_inputs)
700 		return -EINVAL;
701 	go->aud_input = a->index;
702 	v4l2_subdev_call(go->sd_audio, audio, s_routing,
703 		go->board_info->aud_inputs[go->aud_input].audio_input, 0, 0);
704 	return 0;
705 }
706 
707 static void go7007_s_input(struct go7007 *go)
708 {
709 	unsigned int input = go->input;
710 
711 	v4l2_subdev_call(go->sd_video, video, s_routing,
712 			go->board_info->inputs[input].video_input, 0,
713 			go->board_info->video_config);
714 	if (go->board_info->num_aud_inputs) {
715 		int aud_input = go->board_info->inputs[input].audio_index;
716 
717 		v4l2_subdev_call(go->sd_audio, audio, s_routing,
718 			go->board_info->aud_inputs[aud_input].audio_input, 0, 0);
719 		go->aud_input = aud_input;
720 	}
721 }
722 
723 static int vidioc_s_input(struct file *file, void *priv, unsigned int input)
724 {
725 	struct go7007 *go = video_drvdata(file);
726 
727 	if (input >= go->board_info->num_inputs)
728 		return -EINVAL;
729 	if (vb2_is_busy(&go->vidq))
730 		return -EBUSY;
731 
732 	go->input = input;
733 	go7007_s_input(go);
734 
735 	return 0;
736 }
737 
738 static int vidioc_g_tuner(struct file *file, void *priv,
739 				struct v4l2_tuner *t)
740 {
741 	struct go7007 *go = video_drvdata(file);
742 
743 	if (t->index != 0)
744 		return -EINVAL;
745 
746 	strlcpy(t->name, "Tuner", sizeof(t->name));
747 	return call_all(&go->v4l2_dev, tuner, g_tuner, t);
748 }
749 
750 static int vidioc_s_tuner(struct file *file, void *priv,
751 				const struct v4l2_tuner *t)
752 {
753 	struct go7007 *go = video_drvdata(file);
754 
755 	if (t->index != 0)
756 		return -EINVAL;
757 
758 	return call_all(&go->v4l2_dev, tuner, s_tuner, t);
759 }
760 
761 static int vidioc_g_frequency(struct file *file, void *priv,
762 				struct v4l2_frequency *f)
763 {
764 	struct go7007 *go = video_drvdata(file);
765 
766 	if (f->tuner)
767 		return -EINVAL;
768 
769 	return call_all(&go->v4l2_dev, tuner, g_frequency, f);
770 }
771 
772 static int vidioc_s_frequency(struct file *file, void *priv,
773 				const struct v4l2_frequency *f)
774 {
775 	struct go7007 *go = video_drvdata(file);
776 
777 	if (f->tuner)
778 		return -EINVAL;
779 
780 	return call_all(&go->v4l2_dev, tuner, s_frequency, f);
781 }
782 
783 static int vidioc_log_status(struct file *file, void *priv)
784 {
785 	struct go7007 *go = video_drvdata(file);
786 
787 	v4l2_ctrl_log_status(file, priv);
788 	return call_all(&go->v4l2_dev, core, log_status);
789 }
790 
791 static int vidioc_subscribe_event(struct v4l2_fh *fh,
792 				const struct v4l2_event_subscription *sub)
793 {
794 
795 	switch (sub->type) {
796 	case V4L2_EVENT_CTRL:
797 		return v4l2_ctrl_subscribe_event(fh, sub);
798 	case V4L2_EVENT_MOTION_DET:
799 		/* Allow for up to 30 events (1 second for NTSC) to be
800 		 * stored. */
801 		return v4l2_event_subscribe(fh, sub, 30, NULL);
802 	}
803 	return -EINVAL;
804 }
805 
806 
807 static int go7007_s_ctrl(struct v4l2_ctrl *ctrl)
808 {
809 	struct go7007 *go =
810 		container_of(ctrl->handler, struct go7007, hdl);
811 	unsigned y;
812 	u8 *mt;
813 
814 	switch (ctrl->id) {
815 	case V4L2_CID_PIXEL_THRESHOLD0:
816 		go->modet[0].pixel_threshold = ctrl->val;
817 		break;
818 	case V4L2_CID_MOTION_THRESHOLD0:
819 		go->modet[0].motion_threshold = ctrl->val;
820 		break;
821 	case V4L2_CID_MB_THRESHOLD0:
822 		go->modet[0].mb_threshold = ctrl->val;
823 		break;
824 	case V4L2_CID_PIXEL_THRESHOLD1:
825 		go->modet[1].pixel_threshold = ctrl->val;
826 		break;
827 	case V4L2_CID_MOTION_THRESHOLD1:
828 		go->modet[1].motion_threshold = ctrl->val;
829 		break;
830 	case V4L2_CID_MB_THRESHOLD1:
831 		go->modet[1].mb_threshold = ctrl->val;
832 		break;
833 	case V4L2_CID_PIXEL_THRESHOLD2:
834 		go->modet[2].pixel_threshold = ctrl->val;
835 		break;
836 	case V4L2_CID_MOTION_THRESHOLD2:
837 		go->modet[2].motion_threshold = ctrl->val;
838 		break;
839 	case V4L2_CID_MB_THRESHOLD2:
840 		go->modet[2].mb_threshold = ctrl->val;
841 		break;
842 	case V4L2_CID_PIXEL_THRESHOLD3:
843 		go->modet[3].pixel_threshold = ctrl->val;
844 		break;
845 	case V4L2_CID_MOTION_THRESHOLD3:
846 		go->modet[3].motion_threshold = ctrl->val;
847 		break;
848 	case V4L2_CID_MB_THRESHOLD3:
849 		go->modet[3].mb_threshold = ctrl->val;
850 		break;
851 	case V4L2_CID_DETECT_MD_REGION_GRID:
852 		mt = go->modet_map;
853 		for (y = 0; y < go->height / 16; y++, mt += go->width / 16)
854 			memcpy(mt, ctrl->p_new.p_u8 + y * (720 / 16), go->width / 16);
855 		break;
856 	default:
857 		return -EINVAL;
858 	}
859 	return 0;
860 }
861 
862 static struct v4l2_file_operations go7007_fops = {
863 	.owner		= THIS_MODULE,
864 	.open		= v4l2_fh_open,
865 	.release	= vb2_fop_release,
866 	.unlocked_ioctl	= video_ioctl2,
867 	.read		= vb2_fop_read,
868 	.mmap		= vb2_fop_mmap,
869 	.poll		= vb2_fop_poll,
870 };
871 
872 static const struct v4l2_ioctl_ops video_ioctl_ops = {
873 	.vidioc_querycap          = vidioc_querycap,
874 	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
875 	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
876 	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
877 	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
878 	.vidioc_reqbufs           = vb2_ioctl_reqbufs,
879 	.vidioc_querybuf          = vb2_ioctl_querybuf,
880 	.vidioc_qbuf              = vb2_ioctl_qbuf,
881 	.vidioc_dqbuf             = vb2_ioctl_dqbuf,
882 	.vidioc_g_std             = vidioc_g_std,
883 	.vidioc_s_std             = vidioc_s_std,
884 	.vidioc_querystd          = vidioc_querystd,
885 	.vidioc_enum_input        = vidioc_enum_input,
886 	.vidioc_g_input           = vidioc_g_input,
887 	.vidioc_s_input           = vidioc_s_input,
888 	.vidioc_enumaudio         = vidioc_enumaudio,
889 	.vidioc_g_audio           = vidioc_g_audio,
890 	.vidioc_s_audio           = vidioc_s_audio,
891 	.vidioc_streamon          = vb2_ioctl_streamon,
892 	.vidioc_streamoff         = vb2_ioctl_streamoff,
893 	.vidioc_g_tuner           = vidioc_g_tuner,
894 	.vidioc_s_tuner           = vidioc_s_tuner,
895 	.vidioc_g_frequency       = vidioc_g_frequency,
896 	.vidioc_s_frequency       = vidioc_s_frequency,
897 	.vidioc_g_parm            = vidioc_g_parm,
898 	.vidioc_s_parm            = vidioc_s_parm,
899 	.vidioc_enum_framesizes   = vidioc_enum_framesizes,
900 	.vidioc_enum_frameintervals = vidioc_enum_frameintervals,
901 	.vidioc_log_status        = vidioc_log_status,
902 	.vidioc_subscribe_event   = vidioc_subscribe_event,
903 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
904 };
905 
906 static struct video_device go7007_template = {
907 	.name		= "go7007",
908 	.fops		= &go7007_fops,
909 	.release	= video_device_release_empty,
910 	.ioctl_ops	= &video_ioctl_ops,
911 	.tvnorms	= V4L2_STD_ALL,
912 };
913 
914 static const struct v4l2_ctrl_ops go7007_ctrl_ops = {
915 	.s_ctrl = go7007_s_ctrl,
916 };
917 
918 static const struct v4l2_ctrl_config go7007_pixel_threshold0_ctrl = {
919 	.ops = &go7007_ctrl_ops,
920 	.id = V4L2_CID_PIXEL_THRESHOLD0,
921 	.name = "Pixel Threshold Region 0",
922 	.type = V4L2_CTRL_TYPE_INTEGER,
923 	.def = 20,
924 	.max = 32767,
925 	.step = 1,
926 };
927 
928 static const struct v4l2_ctrl_config go7007_motion_threshold0_ctrl = {
929 	.ops = &go7007_ctrl_ops,
930 	.id = V4L2_CID_MOTION_THRESHOLD0,
931 	.name = "Motion Threshold Region 0",
932 	.type = V4L2_CTRL_TYPE_INTEGER,
933 	.def = 80,
934 	.max = 32767,
935 	.step = 1,
936 };
937 
938 static const struct v4l2_ctrl_config go7007_mb_threshold0_ctrl = {
939 	.ops = &go7007_ctrl_ops,
940 	.id = V4L2_CID_MB_THRESHOLD0,
941 	.name = "MB Threshold Region 0",
942 	.type = V4L2_CTRL_TYPE_INTEGER,
943 	.def = 200,
944 	.max = 32767,
945 	.step = 1,
946 };
947 
948 static const struct v4l2_ctrl_config go7007_pixel_threshold1_ctrl = {
949 	.ops = &go7007_ctrl_ops,
950 	.id = V4L2_CID_PIXEL_THRESHOLD1,
951 	.name = "Pixel Threshold Region 1",
952 	.type = V4L2_CTRL_TYPE_INTEGER,
953 	.def = 20,
954 	.max = 32767,
955 	.step = 1,
956 };
957 
958 static const struct v4l2_ctrl_config go7007_motion_threshold1_ctrl = {
959 	.ops = &go7007_ctrl_ops,
960 	.id = V4L2_CID_MOTION_THRESHOLD1,
961 	.name = "Motion Threshold Region 1",
962 	.type = V4L2_CTRL_TYPE_INTEGER,
963 	.def = 80,
964 	.max = 32767,
965 	.step = 1,
966 };
967 
968 static const struct v4l2_ctrl_config go7007_mb_threshold1_ctrl = {
969 	.ops = &go7007_ctrl_ops,
970 	.id = V4L2_CID_MB_THRESHOLD1,
971 	.name = "MB Threshold Region 1",
972 	.type = V4L2_CTRL_TYPE_INTEGER,
973 	.def = 200,
974 	.max = 32767,
975 	.step = 1,
976 };
977 
978 static const struct v4l2_ctrl_config go7007_pixel_threshold2_ctrl = {
979 	.ops = &go7007_ctrl_ops,
980 	.id = V4L2_CID_PIXEL_THRESHOLD2,
981 	.name = "Pixel Threshold Region 2",
982 	.type = V4L2_CTRL_TYPE_INTEGER,
983 	.def = 20,
984 	.max = 32767,
985 	.step = 1,
986 };
987 
988 static const struct v4l2_ctrl_config go7007_motion_threshold2_ctrl = {
989 	.ops = &go7007_ctrl_ops,
990 	.id = V4L2_CID_MOTION_THRESHOLD2,
991 	.name = "Motion Threshold Region 2",
992 	.type = V4L2_CTRL_TYPE_INTEGER,
993 	.def = 80,
994 	.max = 32767,
995 	.step = 1,
996 };
997 
998 static const struct v4l2_ctrl_config go7007_mb_threshold2_ctrl = {
999 	.ops = &go7007_ctrl_ops,
1000 	.id = V4L2_CID_MB_THRESHOLD2,
1001 	.name = "MB Threshold Region 2",
1002 	.type = V4L2_CTRL_TYPE_INTEGER,
1003 	.def = 200,
1004 	.max = 32767,
1005 	.step = 1,
1006 };
1007 
1008 static const struct v4l2_ctrl_config go7007_pixel_threshold3_ctrl = {
1009 	.ops = &go7007_ctrl_ops,
1010 	.id = V4L2_CID_PIXEL_THRESHOLD3,
1011 	.name = "Pixel Threshold Region 3",
1012 	.type = V4L2_CTRL_TYPE_INTEGER,
1013 	.def = 20,
1014 	.max = 32767,
1015 	.step = 1,
1016 };
1017 
1018 static const struct v4l2_ctrl_config go7007_motion_threshold3_ctrl = {
1019 	.ops = &go7007_ctrl_ops,
1020 	.id = V4L2_CID_MOTION_THRESHOLD3,
1021 	.name = "Motion Threshold Region 3",
1022 	.type = V4L2_CTRL_TYPE_INTEGER,
1023 	.def = 80,
1024 	.max = 32767,
1025 	.step = 1,
1026 };
1027 
1028 static const struct v4l2_ctrl_config go7007_mb_threshold3_ctrl = {
1029 	.ops = &go7007_ctrl_ops,
1030 	.id = V4L2_CID_MB_THRESHOLD3,
1031 	.name = "MB Threshold Region 3",
1032 	.type = V4L2_CTRL_TYPE_INTEGER,
1033 	.def = 200,
1034 	.max = 32767,
1035 	.step = 1,
1036 };
1037 
1038 static const struct v4l2_ctrl_config go7007_mb_regions_ctrl = {
1039 	.ops = &go7007_ctrl_ops,
1040 	.id = V4L2_CID_DETECT_MD_REGION_GRID,
1041 	.dims = { 576 / 16, 720 / 16 },
1042 	.max = 3,
1043 	.step = 1,
1044 };
1045 
1046 int go7007_v4l2_ctrl_init(struct go7007 *go)
1047 {
1048 	struct v4l2_ctrl_handler *hdl = &go->hdl;
1049 	struct v4l2_ctrl *ctrl;
1050 
1051 	v4l2_ctrl_handler_init(hdl, 22);
1052 	go->mpeg_video_gop_size = v4l2_ctrl_new_std(hdl, NULL,
1053 			V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, 34, 1, 15);
1054 	go->mpeg_video_gop_closure = v4l2_ctrl_new_std(hdl, NULL,
1055 			V4L2_CID_MPEG_VIDEO_GOP_CLOSURE, 0, 1, 1, 1);
1056 	go->mpeg_video_bitrate = v4l2_ctrl_new_std(hdl, NULL,
1057 			V4L2_CID_MPEG_VIDEO_BITRATE,
1058 			64000, 10000000, 1, 9800000);
1059 	go->mpeg_video_b_frames = v4l2_ctrl_new_std(hdl, NULL,
1060 			V4L2_CID_MPEG_VIDEO_B_FRAMES, 0, 2, 2, 0);
1061 	go->mpeg_video_rep_seqheader = v4l2_ctrl_new_std(hdl, NULL,
1062 			V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, 0, 1, 1, 1);
1063 
1064 	go->mpeg_video_aspect_ratio = v4l2_ctrl_new_std_menu(hdl, NULL,
1065 			V4L2_CID_MPEG_VIDEO_ASPECT,
1066 			V4L2_MPEG_VIDEO_ASPECT_16x9, 0,
1067 			V4L2_MPEG_VIDEO_ASPECT_1x1);
1068 	ctrl = v4l2_ctrl_new_std(hdl, NULL,
1069 			V4L2_CID_JPEG_ACTIVE_MARKER, 0,
1070 			V4L2_JPEG_ACTIVE_MARKER_DQT |
1071 			V4L2_JPEG_ACTIVE_MARKER_DHT, 0,
1072 			V4L2_JPEG_ACTIVE_MARKER_DQT |
1073 			V4L2_JPEG_ACTIVE_MARKER_DHT);
1074 	if (ctrl)
1075 		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1076 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold0_ctrl, NULL);
1077 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold0_ctrl, NULL);
1078 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold0_ctrl, NULL);
1079 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold1_ctrl, NULL);
1080 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold1_ctrl, NULL);
1081 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold1_ctrl, NULL);
1082 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold2_ctrl, NULL);
1083 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold2_ctrl, NULL);
1084 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold2_ctrl, NULL);
1085 	v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold3_ctrl, NULL);
1086 	v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold3_ctrl, NULL);
1087 	v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold3_ctrl, NULL);
1088 	v4l2_ctrl_new_custom(hdl, &go7007_mb_regions_ctrl, NULL);
1089 	go->modet_mode = v4l2_ctrl_new_std_menu(hdl, NULL,
1090 			V4L2_CID_DETECT_MD_MODE,
1091 			V4L2_DETECT_MD_MODE_REGION_GRID,
1092 			1 << V4L2_DETECT_MD_MODE_THRESHOLD_GRID,
1093 			V4L2_DETECT_MD_MODE_DISABLED);
1094 	if (hdl->error) {
1095 		int rv = hdl->error;
1096 
1097 		v4l2_err(&go->v4l2_dev, "Could not register controls\n");
1098 		return rv;
1099 	}
1100 	go->v4l2_dev.ctrl_handler = hdl;
1101 	return 0;
1102 }
1103 
1104 int go7007_v4l2_init(struct go7007 *go)
1105 {
1106 	struct video_device *vdev = &go->vdev;
1107 	int rv;
1108 
1109 	mutex_init(&go->serialize_lock);
1110 	mutex_init(&go->queue_lock);
1111 
1112 	INIT_LIST_HEAD(&go->vidq_active);
1113 	go->vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1114 	go->vidq.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1115 	go->vidq.ops = &go7007_video_qops;
1116 	go->vidq.mem_ops = &vb2_vmalloc_memops;
1117 	go->vidq.drv_priv = go;
1118 	go->vidq.buf_struct_size = sizeof(struct go7007_buffer);
1119 	go->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1120 	go->vidq.lock = &go->queue_lock;
1121 	rv = vb2_queue_init(&go->vidq);
1122 	if (rv)
1123 		return rv;
1124 	*vdev = go7007_template;
1125 	vdev->lock = &go->serialize_lock;
1126 	vdev->queue = &go->vidq;
1127 	video_set_drvdata(vdev, go);
1128 	vdev->v4l2_dev = &go->v4l2_dev;
1129 	if (!v4l2_device_has_op(&go->v4l2_dev, video, querystd))
1130 		v4l2_disable_ioctl(vdev, VIDIOC_QUERYSTD);
1131 	if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER)) {
1132 		v4l2_disable_ioctl(vdev, VIDIOC_S_FREQUENCY);
1133 		v4l2_disable_ioctl(vdev, VIDIOC_G_FREQUENCY);
1134 		v4l2_disable_ioctl(vdev, VIDIOC_S_TUNER);
1135 		v4l2_disable_ioctl(vdev, VIDIOC_G_TUNER);
1136 	} else {
1137 		struct v4l2_frequency f = {
1138 			.type = V4L2_TUNER_ANALOG_TV,
1139 			.frequency = 980,
1140 		};
1141 
1142 		call_all(&go->v4l2_dev, tuner, s_frequency, &f);
1143 	}
1144 	if (!(go->board_info->sensor_flags & GO7007_SENSOR_TV)) {
1145 		v4l2_disable_ioctl(vdev, VIDIOC_G_STD);
1146 		v4l2_disable_ioctl(vdev, VIDIOC_S_STD);
1147 		vdev->tvnorms = 0;
1148 	}
1149 	if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING)
1150 		v4l2_disable_ioctl(vdev, VIDIOC_ENUM_FRAMESIZES);
1151 	if (go->board_info->num_aud_inputs == 0) {
1152 		v4l2_disable_ioctl(vdev, VIDIOC_G_AUDIO);
1153 		v4l2_disable_ioctl(vdev, VIDIOC_S_AUDIO);
1154 		v4l2_disable_ioctl(vdev, VIDIOC_ENUMAUDIO);
1155 	}
1156 	/* Setup correct crystal frequency on this board */
1157 	if (go->board_info->sensor_flags & GO7007_SENSOR_SAA7115)
1158 		v4l2_subdev_call(go->sd_video, video, s_crystal_freq,
1159 				SAA7115_FREQ_24_576_MHZ,
1160 				SAA7115_FREQ_FL_APLL | SAA7115_FREQ_FL_UCGC |
1161 				SAA7115_FREQ_FL_DOUBLE_ASCLK);
1162 	go7007_s_input(go);
1163 	if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1164 		go7007_s_std(go);
1165 	rv = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1166 	if (rv < 0)
1167 		return rv;
1168 	dev_info(go->dev, "registered device %s [v4l2]\n",
1169 		 video_device_node_name(vdev));
1170 
1171 	return 0;
1172 }
1173 
1174 void go7007_v4l2_remove(struct go7007 *go)
1175 {
1176 	v4l2_ctrl_handler_free(&go->hdl);
1177 }
1178