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  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
16  */
17 
18 #include <linux/module.h>
19 #include <linux/init.h>
20 #include <linux/version.h>
21 #include <linux/delay.h>
22 #include <linux/sched.h>
23 #include <linux/spinlock.h>
24 #include <linux/slab.h>
25 #include <linux/fs.h>
26 #include <linux/unistd.h>
27 #include <linux/time.h>
28 #include <linux/vmalloc.h>
29 #include <linux/pagemap.h>
30 #include <linux/videodev2.h>
31 #include <media/v4l2-common.h>
32 #include <media/v4l2-ioctl.h>
33 #include <media/v4l2-subdev.h>
34 #include <linux/i2c.h>
35 #include <linux/mutex.h>
36 #include <linux/uaccess.h>
37 #include <asm/system.h>
38 
39 #include "go7007.h"
40 #include "go7007-priv.h"
41 #include "wis-i2c.h"
42 
43 /* Temporary defines until accepted in v4l-dvb */
44 #ifndef V4L2_MPEG_STREAM_TYPE_MPEG_ELEM
45 #define	V4L2_MPEG_STREAM_TYPE_MPEG_ELEM   6 /* MPEG elementary stream */
46 #endif
47 #ifndef V4L2_MPEG_VIDEO_ENCODING_MPEG_4
48 #define	V4L2_MPEG_VIDEO_ENCODING_MPEG_4   3
49 #endif
50 
51 #define call_all(dev, o, f, args...) \
52 	v4l2_device_call_until_err(dev, 0, o, f, ##args)
53 
deactivate_buffer(struct go7007_buffer * gobuf)54 static void deactivate_buffer(struct go7007_buffer *gobuf)
55 {
56 	int i;
57 
58 	if (gobuf->state != BUF_STATE_IDLE) {
59 		list_del(&gobuf->stream);
60 		gobuf->state = BUF_STATE_IDLE;
61 	}
62 	if (gobuf->page_count > 0) {
63 		for (i = 0; i < gobuf->page_count; ++i)
64 			page_cache_release(gobuf->pages[i]);
65 		gobuf->page_count = 0;
66 	}
67 }
68 
abort_queued(struct go7007 * go)69 static void abort_queued(struct go7007 *go)
70 {
71 	struct go7007_buffer *gobuf, *next;
72 
73 	list_for_each_entry_safe(gobuf, next, &go->stream, stream) {
74 		deactivate_buffer(gobuf);
75 	}
76 }
77 
go7007_streamoff(struct go7007 * go)78 static int go7007_streamoff(struct go7007 *go)
79 {
80 	int retval = -EINVAL;
81 	unsigned long flags;
82 
83 	mutex_lock(&go->hw_lock);
84 	if (go->streaming) {
85 		go->streaming = 0;
86 		go7007_stream_stop(go);
87 		spin_lock_irqsave(&go->spinlock, flags);
88 		abort_queued(go);
89 		spin_unlock_irqrestore(&go->spinlock, flags);
90 		go7007_reset_encoder(go);
91 		retval = 0;
92 	}
93 	mutex_unlock(&go->hw_lock);
94 	return 0;
95 }
96 
go7007_open(struct file * file)97 static int go7007_open(struct file *file)
98 {
99 	struct go7007 *go = video_get_drvdata(video_devdata(file));
100 	struct go7007_file *gofh;
101 
102 	if (go->status != STATUS_ONLINE)
103 		return -EBUSY;
104 	gofh = kmalloc(sizeof(struct go7007_file), GFP_KERNEL);
105 	if (gofh == NULL)
106 		return -ENOMEM;
107 	++go->ref_count;
108 	gofh->go = go;
109 	mutex_init(&gofh->lock);
110 	gofh->buf_count = 0;
111 	file->private_data = gofh;
112 	return 0;
113 }
114 
go7007_release(struct file * file)115 static int go7007_release(struct file *file)
116 {
117 	struct go7007_file *gofh = file->private_data;
118 	struct go7007 *go = gofh->go;
119 
120 	if (gofh->buf_count > 0) {
121 		go7007_streamoff(go);
122 		go->in_use = 0;
123 		kfree(gofh->bufs);
124 		gofh->buf_count = 0;
125 	}
126 	kfree(gofh);
127 	if (--go->ref_count == 0)
128 		kfree(go);
129 	file->private_data = NULL;
130 	return 0;
131 }
132 
get_frame_type_flag(struct go7007_buffer * gobuf,int format)133 static u32 get_frame_type_flag(struct go7007_buffer *gobuf, int format)
134 {
135 	u8 *f = page_address(gobuf->pages[0]);
136 
137 	switch (format) {
138 	case GO7007_FORMAT_MJPEG:
139 		return V4L2_BUF_FLAG_KEYFRAME;
140 	case GO7007_FORMAT_MPEG4:
141 		switch ((f[gobuf->frame_offset + 4] >> 6) & 0x3) {
142 		case 0:
143 			return V4L2_BUF_FLAG_KEYFRAME;
144 		case 1:
145 			return V4L2_BUF_FLAG_PFRAME;
146 		case 2:
147 			return V4L2_BUF_FLAG_BFRAME;
148 		default:
149 			return 0;
150 		}
151 	case GO7007_FORMAT_MPEG1:
152 	case GO7007_FORMAT_MPEG2:
153 		switch ((f[gobuf->frame_offset + 5] >> 3) & 0x7) {
154 		case 1:
155 			return V4L2_BUF_FLAG_KEYFRAME;
156 		case 2:
157 			return V4L2_BUF_FLAG_PFRAME;
158 		case 3:
159 			return V4L2_BUF_FLAG_BFRAME;
160 		default:
161 			return 0;
162 		}
163 	}
164 
165 	return 0;
166 }
167 
set_capture_size(struct go7007 * go,struct v4l2_format * fmt,int try)168 static int set_capture_size(struct go7007 *go, struct v4l2_format *fmt, int try)
169 {
170 	int sensor_height = 0, sensor_width = 0;
171 	int width, height, i;
172 
173 	if (fmt != NULL && fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG &&
174 			fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MPEG &&
175 			fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MPEG4)
176 		return -EINVAL;
177 
178 	switch (go->standard) {
179 	case GO7007_STD_NTSC:
180 		sensor_width = 720;
181 		sensor_height = 480;
182 		break;
183 	case GO7007_STD_PAL:
184 		sensor_width = 720;
185 		sensor_height = 576;
186 		break;
187 	case GO7007_STD_OTHER:
188 		sensor_width = go->board_info->sensor_width;
189 		sensor_height = go->board_info->sensor_height;
190 		break;
191 	}
192 
193 	if (fmt == NULL) {
194 		width = sensor_width;
195 		height = sensor_height;
196 	} else if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
197 		if (fmt->fmt.pix.width > sensor_width)
198 			width = sensor_width;
199 		else if (fmt->fmt.pix.width < 144)
200 			width = 144;
201 		else
202 			width = fmt->fmt.pix.width & ~0x0f;
203 
204 		if (fmt->fmt.pix.height > sensor_height)
205 			height = sensor_height;
206 		else if (fmt->fmt.pix.height < 96)
207 			height = 96;
208 		else
209 			height = fmt->fmt.pix.height & ~0x0f;
210 	} else {
211 		int requested_size = fmt->fmt.pix.width * fmt->fmt.pix.height;
212 		int sensor_size = sensor_width * sensor_height;
213 
214 		if (64 * requested_size < 9 * sensor_size) {
215 			width = sensor_width / 4;
216 			height = sensor_height / 4;
217 		} else if (64 * requested_size < 36 * sensor_size) {
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 	go->width = width;
246 	go->height = height;
247 	go->encoder_h_offset = go->board_info->sensor_h_offset;
248 	go->encoder_v_offset = go->board_info->sensor_v_offset;
249 	for (i = 0; i < 4; ++i)
250 		go->modet[i].enable = 0;
251 	for (i = 0; i < 1624; ++i)
252 		go->modet_map[i] = 0;
253 
254 	if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
255 		struct v4l2_mbus_framefmt mbus_fmt;
256 
257 		mbus_fmt.code = V4L2_MBUS_FMT_FIXED;
258 		if (fmt != NULL)
259 			mbus_fmt.width = fmt->fmt.pix.width;
260 		else
261 			mbus_fmt.width = width;
262 
263 		if (height > sensor_height / 2) {
264 			mbus_fmt.height = height / 2;
265 			go->encoder_v_halve = 0;
266 		} else {
267 			mbus_fmt.height = height;
268 			go->encoder_v_halve = 1;
269 		}
270 		call_all(&go->v4l2_dev, video, s_mbus_fmt, &mbus_fmt);
271 	} else {
272 		if (width <= sensor_width / 4) {
273 			go->encoder_h_halve = 1;
274 			go->encoder_v_halve = 1;
275 			go->encoder_subsample = 1;
276 		} else if (width <= sensor_width / 2) {
277 			go->encoder_h_halve = 1;
278 			go->encoder_v_halve = 1;
279 			go->encoder_subsample = 0;
280 		} else {
281 			go->encoder_h_halve = 0;
282 			go->encoder_v_halve = 0;
283 			go->encoder_subsample = 0;
284 		}
285 	}
286 
287 	if (fmt == NULL)
288 		return 0;
289 
290 	switch (fmt->fmt.pix.pixelformat) {
291 	case V4L2_PIX_FMT_MPEG:
292 		if (go->format == GO7007_FORMAT_MPEG1 ||
293 				go->format == GO7007_FORMAT_MPEG2 ||
294 				go->format == GO7007_FORMAT_MPEG4)
295 			break;
296 		go->format = GO7007_FORMAT_MPEG1;
297 		go->pali = 0;
298 		go->aspect_ratio = GO7007_RATIO_1_1;
299 		go->gop_size = go->sensor_framerate / 1000;
300 		go->ipb = 0;
301 		go->closed_gop = 1;
302 		go->repeat_seqhead = 1;
303 		go->seq_header_enable = 1;
304 		go->gop_header_enable = 1;
305 		go->dvd_mode = 0;
306 		break;
307 	/* Backwards compatibility only! */
308 	case V4L2_PIX_FMT_MPEG4:
309 		if (go->format == GO7007_FORMAT_MPEG4)
310 			break;
311 		go->format = GO7007_FORMAT_MPEG4;
312 		go->pali = 0xf5;
313 		go->aspect_ratio = GO7007_RATIO_1_1;
314 		go->gop_size = go->sensor_framerate / 1000;
315 		go->ipb = 0;
316 		go->closed_gop = 1;
317 		go->repeat_seqhead = 1;
318 		go->seq_header_enable = 1;
319 		go->gop_header_enable = 1;
320 		go->dvd_mode = 0;
321 		break;
322 	case V4L2_PIX_FMT_MJPEG:
323 		go->format = GO7007_FORMAT_MJPEG;
324 		go->pali = 0;
325 		go->aspect_ratio = GO7007_RATIO_1_1;
326 		go->gop_size = 0;
327 		go->ipb = 0;
328 		go->closed_gop = 0;
329 		go->repeat_seqhead = 0;
330 		go->seq_header_enable = 0;
331 		go->gop_header_enable = 0;
332 		go->dvd_mode = 0;
333 		break;
334 	}
335 	return 0;
336 }
337 
338 #if 0
339 static int clip_to_modet_map(struct go7007 *go, int region,
340 		struct v4l2_clip *clip_list)
341 {
342 	struct v4l2_clip clip, *clip_ptr;
343 	int x, y, mbnum;
344 
345 	/* Check if coordinates are OK and if any macroblocks are already
346 	 * used by other regions (besides 0) */
347 	clip_ptr = clip_list;
348 	while (clip_ptr) {
349 		if (copy_from_user(&clip, clip_ptr, sizeof(clip)))
350 			return -EFAULT;
351 		if (clip.c.left < 0 || (clip.c.left & 0xF) ||
352 				clip.c.width <= 0 || (clip.c.width & 0xF))
353 			return -EINVAL;
354 		if (clip.c.left + clip.c.width > go->width)
355 			return -EINVAL;
356 		if (clip.c.top < 0 || (clip.c.top & 0xF) ||
357 				clip.c.height <= 0 || (clip.c.height & 0xF))
358 			return -EINVAL;
359 		if (clip.c.top + clip.c.height > go->height)
360 			return -EINVAL;
361 		for (y = 0; y < clip.c.height; y += 16)
362 			for (x = 0; x < clip.c.width; x += 16) {
363 				mbnum = (go->width >> 4) *
364 						((clip.c.top + y) >> 4) +
365 					((clip.c.left + x) >> 4);
366 				if (go->modet_map[mbnum] != 0 &&
367 						go->modet_map[mbnum] != region)
368 					return -EBUSY;
369 			}
370 		clip_ptr = clip.next;
371 	}
372 
373 	/* Clear old region macroblocks */
374 	for (mbnum = 0; mbnum < 1624; ++mbnum)
375 		if (go->modet_map[mbnum] == region)
376 			go->modet_map[mbnum] = 0;
377 
378 	/* Claim macroblocks in this list */
379 	clip_ptr = clip_list;
380 	while (clip_ptr) {
381 		if (copy_from_user(&clip, clip_ptr, sizeof(clip)))
382 			return -EFAULT;
383 		for (y = 0; y < clip.c.height; y += 16)
384 			for (x = 0; x < clip.c.width; x += 16) {
385 				mbnum = (go->width >> 4) *
386 						((clip.c.top + y) >> 4) +
387 					((clip.c.left + x) >> 4);
388 				go->modet_map[mbnum] = region;
389 			}
390 		clip_ptr = clip.next;
391 	}
392 	return 0;
393 }
394 #endif
395 
mpeg_query_ctrl(struct v4l2_queryctrl * ctrl)396 static int mpeg_query_ctrl(struct v4l2_queryctrl *ctrl)
397 {
398 	static const u32 mpeg_ctrls[] = {
399 		V4L2_CID_MPEG_CLASS,
400 		V4L2_CID_MPEG_STREAM_TYPE,
401 		V4L2_CID_MPEG_VIDEO_ENCODING,
402 		V4L2_CID_MPEG_VIDEO_ASPECT,
403 		V4L2_CID_MPEG_VIDEO_GOP_SIZE,
404 		V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
405 		V4L2_CID_MPEG_VIDEO_BITRATE,
406 		0
407 	};
408 	static const u32 *ctrl_classes[] = {
409 		mpeg_ctrls,
410 		NULL
411 	};
412 
413 	ctrl->id = v4l2_ctrl_next(ctrl_classes, ctrl->id);
414 
415 	switch (ctrl->id) {
416 	case V4L2_CID_MPEG_CLASS:
417 		return v4l2_ctrl_query_fill(ctrl, 0, 0, 0, 0);
418 	case V4L2_CID_MPEG_STREAM_TYPE:
419 		return v4l2_ctrl_query_fill(ctrl,
420 				V4L2_MPEG_STREAM_TYPE_MPEG2_DVD,
421 				V4L2_MPEG_STREAM_TYPE_MPEG_ELEM, 1,
422 				V4L2_MPEG_STREAM_TYPE_MPEG_ELEM);
423 	case V4L2_CID_MPEG_VIDEO_ENCODING:
424 		return v4l2_ctrl_query_fill(ctrl,
425 				V4L2_MPEG_VIDEO_ENCODING_MPEG_1,
426 				V4L2_MPEG_VIDEO_ENCODING_MPEG_4, 1,
427 				V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
428 	case V4L2_CID_MPEG_VIDEO_ASPECT:
429 		return v4l2_ctrl_query_fill(ctrl,
430 				V4L2_MPEG_VIDEO_ASPECT_1x1,
431 				V4L2_MPEG_VIDEO_ASPECT_16x9, 1,
432 				V4L2_MPEG_VIDEO_ASPECT_1x1);
433 	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
434 		return v4l2_ctrl_query_fill(ctrl, 0, 34, 1, 15);
435 	case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
436 		return v4l2_ctrl_query_fill(ctrl, 0, 1, 1, 0);
437 	case V4L2_CID_MPEG_VIDEO_BITRATE:
438 		return v4l2_ctrl_query_fill(ctrl,
439 				64000,
440 				10000000, 1,
441 				1500000);
442 	default:
443 		return -EINVAL;
444 	}
445 	return 0;
446 }
447 
mpeg_s_ctrl(struct v4l2_control * ctrl,struct go7007 * go)448 static int mpeg_s_ctrl(struct v4l2_control *ctrl, struct go7007 *go)
449 {
450 	/* pretty sure we can't change any of these while streaming */
451 	if (go->streaming)
452 		return -EBUSY;
453 
454 	switch (ctrl->id) {
455 	case V4L2_CID_MPEG_STREAM_TYPE:
456 		switch (ctrl->value) {
457 		case V4L2_MPEG_STREAM_TYPE_MPEG2_DVD:
458 			go->format = GO7007_FORMAT_MPEG2;
459 			go->bitrate = 9800000;
460 			go->gop_size = 15;
461 			go->pali = 0x48;
462 			go->closed_gop = 1;
463 			go->repeat_seqhead = 0;
464 			go->seq_header_enable = 1;
465 			go->gop_header_enable = 1;
466 			go->dvd_mode = 1;
467 			break;
468 		case V4L2_MPEG_STREAM_TYPE_MPEG_ELEM:
469 			/* todo: */
470 			break;
471 		default:
472 			return -EINVAL;
473 		}
474 		break;
475 	case V4L2_CID_MPEG_VIDEO_ENCODING:
476 		switch (ctrl->value) {
477 		case V4L2_MPEG_VIDEO_ENCODING_MPEG_1:
478 			go->format = GO7007_FORMAT_MPEG1;
479 			go->pali = 0;
480 			break;
481 		case V4L2_MPEG_VIDEO_ENCODING_MPEG_2:
482 			go->format = GO7007_FORMAT_MPEG2;
483 			/*if (mpeg->pali >> 24 == 2)
484 				go->pali = mpeg->pali & 0xff;
485 			else*/
486 				go->pali = 0x48;
487 			break;
488 		case V4L2_MPEG_VIDEO_ENCODING_MPEG_4:
489 			go->format = GO7007_FORMAT_MPEG4;
490 			/*if (mpeg->pali >> 24 == 4)
491 				go->pali = mpeg->pali & 0xff;
492 			else*/
493 				go->pali = 0xf5;
494 			break;
495 		default:
496 			return -EINVAL;
497 		}
498 		go->gop_header_enable =
499 			/*mpeg->flags & GO7007_MPEG_OMIT_GOP_HEADER
500 			? 0 :*/ 1;
501 		/*if (mpeg->flags & GO7007_MPEG_REPEAT_SEQHEADER)
502 			go->repeat_seqhead = 1;
503 		else*/
504 			go->repeat_seqhead = 0;
505 		go->dvd_mode = 0;
506 		break;
507 	case V4L2_CID_MPEG_VIDEO_ASPECT:
508 		if (go->format == GO7007_FORMAT_MJPEG)
509 			return -EINVAL;
510 		switch (ctrl->value) {
511 		case V4L2_MPEG_VIDEO_ASPECT_1x1:
512 			go->aspect_ratio = GO7007_RATIO_1_1;
513 			break;
514 		case V4L2_MPEG_VIDEO_ASPECT_4x3:
515 			go->aspect_ratio = GO7007_RATIO_4_3;
516 			break;
517 		case V4L2_MPEG_VIDEO_ASPECT_16x9:
518 			go->aspect_ratio = GO7007_RATIO_16_9;
519 			break;
520 		case V4L2_MPEG_VIDEO_ASPECT_221x100:
521 		default:
522 			return -EINVAL;
523 		}
524 		break;
525 	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
526 		if (ctrl->value < 0 || ctrl->value > 34)
527 			return -EINVAL;
528 		go->gop_size = ctrl->value;
529 		break;
530 	case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
531 		if (ctrl->value != 0 && ctrl->value != 1)
532 			return -EINVAL;
533 		go->closed_gop = ctrl->value;
534 		break;
535 	case V4L2_CID_MPEG_VIDEO_BITRATE:
536 		/* Upper bound is kind of arbitrary here */
537 		if (ctrl->value < 64000 || ctrl->value > 10000000)
538 			return -EINVAL;
539 		go->bitrate = ctrl->value;
540 		break;
541 	default:
542 		return -EINVAL;
543 	}
544 	return 0;
545 }
546 
mpeg_g_ctrl(struct v4l2_control * ctrl,struct go7007 * go)547 static int mpeg_g_ctrl(struct v4l2_control *ctrl, struct go7007 *go)
548 {
549 	switch (ctrl->id) {
550 	case V4L2_CID_MPEG_STREAM_TYPE:
551 		if (go->dvd_mode)
552 			ctrl->value = V4L2_MPEG_STREAM_TYPE_MPEG2_DVD;
553 		else
554 			ctrl->value = V4L2_MPEG_STREAM_TYPE_MPEG_ELEM;
555 		break;
556 	case V4L2_CID_MPEG_VIDEO_ENCODING:
557 		switch (go->format) {
558 		case GO7007_FORMAT_MPEG1:
559 			ctrl->value = V4L2_MPEG_VIDEO_ENCODING_MPEG_1;
560 			break;
561 		case GO7007_FORMAT_MPEG2:
562 			ctrl->value = V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
563 			break;
564 		case GO7007_FORMAT_MPEG4:
565 			ctrl->value = V4L2_MPEG_VIDEO_ENCODING_MPEG_4;
566 			break;
567 		default:
568 			return -EINVAL;
569 		}
570 		break;
571 	case V4L2_CID_MPEG_VIDEO_ASPECT:
572 		switch (go->aspect_ratio) {
573 		case GO7007_RATIO_1_1:
574 			ctrl->value = V4L2_MPEG_VIDEO_ASPECT_1x1;
575 			break;
576 		case GO7007_RATIO_4_3:
577 			ctrl->value = V4L2_MPEG_VIDEO_ASPECT_4x3;
578 			break;
579 		case GO7007_RATIO_16_9:
580 			ctrl->value = V4L2_MPEG_VIDEO_ASPECT_16x9;
581 			break;
582 		default:
583 			return -EINVAL;
584 		}
585 		break;
586 	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
587 		ctrl->value = go->gop_size;
588 		break;
589 	case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
590 		ctrl->value = go->closed_gop;
591 		break;
592 	case V4L2_CID_MPEG_VIDEO_BITRATE:
593 		ctrl->value = go->bitrate;
594 		break;
595 	default:
596 		return -EINVAL;
597 	}
598 	return 0;
599 }
600 
vidioc_querycap(struct file * file,void * priv,struct v4l2_capability * cap)601 static int vidioc_querycap(struct file *file, void  *priv,
602 					struct v4l2_capability *cap)
603 {
604 	struct go7007 *go = ((struct go7007_file *) priv)->go;
605 
606 	strlcpy(cap->driver, "go7007", sizeof(cap->driver));
607 	strlcpy(cap->card, go->name, sizeof(cap->card));
608 #if 0
609 	strlcpy(cap->bus_info, dev_name(&dev->udev->dev), sizeof(cap->bus_info));
610 #endif
611 
612 	cap->version = KERNEL_VERSION(0, 9, 8);
613 
614 	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
615 			    V4L2_CAP_STREAMING; /* | V4L2_CAP_AUDIO; */
616 
617 	if (go->board_info->flags & GO7007_BOARD_HAS_TUNER)
618 		cap->capabilities |= V4L2_CAP_TUNER;
619 
620 	return 0;
621 }
622 
vidioc_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * fmt)623 static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
624 					struct v4l2_fmtdesc *fmt)
625 {
626 	char *desc = NULL;
627 
628 	switch (fmt->index) {
629 	case 0:
630 		fmt->pixelformat = V4L2_PIX_FMT_MJPEG;
631 		desc = "Motion-JPEG";
632 		break;
633 	case 1:
634 		fmt->pixelformat = V4L2_PIX_FMT_MPEG;
635 		desc = "MPEG1/MPEG2/MPEG4";
636 		break;
637 	default:
638 		return -EINVAL;
639 	}
640 	fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
641 	fmt->flags = V4L2_FMT_FLAG_COMPRESSED;
642 
643 	strncpy(fmt->description, desc, sizeof(fmt->description));
644 
645 	return 0;
646 }
647 
vidioc_g_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * fmt)648 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
649 					struct v4l2_format *fmt)
650 {
651 	struct go7007 *go = ((struct go7007_file *) priv)->go;
652 
653 	fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
654 	fmt->fmt.pix.width = go->width;
655 	fmt->fmt.pix.height = go->height;
656 	fmt->fmt.pix.pixelformat = (go->format == GO7007_FORMAT_MJPEG) ?
657 				   V4L2_PIX_FMT_MJPEG : V4L2_PIX_FMT_MPEG;
658 	fmt->fmt.pix.field = V4L2_FIELD_NONE;
659 	fmt->fmt.pix.bytesperline = 0;
660 	fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
661 	fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
662 
663 	return 0;
664 }
665 
vidioc_try_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * fmt)666 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
667 			struct v4l2_format *fmt)
668 {
669 	struct go7007 *go = ((struct go7007_file *) priv)->go;
670 
671 	return set_capture_size(go, fmt, 1);
672 }
673 
vidioc_s_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * fmt)674 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
675 			struct v4l2_format *fmt)
676 {
677 	struct go7007 *go = ((struct go7007_file *) priv)->go;
678 
679 	if (go->streaming)
680 		return -EBUSY;
681 
682 	return set_capture_size(go, fmt, 0);
683 }
684 
vidioc_reqbufs(struct file * file,void * priv,struct v4l2_requestbuffers * req)685 static int vidioc_reqbufs(struct file *file, void *priv,
686 			  struct v4l2_requestbuffers *req)
687 {
688 	struct go7007_file *gofh = priv;
689 	struct go7007 *go = gofh->go;
690 	int retval = -EBUSY;
691 	unsigned int count, i;
692 
693 	if (go->streaming)
694 		return retval;
695 
696 	if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
697 			req->memory != V4L2_MEMORY_MMAP)
698 		return -EINVAL;
699 
700 	mutex_lock(&gofh->lock);
701 	for (i = 0; i < gofh->buf_count; ++i)
702 		if (gofh->bufs[i].mapped > 0)
703 			goto unlock_and_return;
704 
705 	mutex_lock(&go->hw_lock);
706 	if (go->in_use > 0 && gofh->buf_count == 0) {
707 		mutex_unlock(&go->hw_lock);
708 		goto unlock_and_return;
709 	}
710 
711 	if (gofh->buf_count > 0)
712 		kfree(gofh->bufs);
713 
714 	retval = -ENOMEM;
715 	count = req->count;
716 	if (count > 0) {
717 		if (count < 2)
718 			count = 2;
719 		if (count > 32)
720 			count = 32;
721 
722 		gofh->bufs = kcalloc(count, sizeof(struct go7007_buffer),
723 				     GFP_KERNEL);
724 
725 		if (!gofh->bufs) {
726 			mutex_unlock(&go->hw_lock);
727 			goto unlock_and_return;
728 		}
729 
730 		for (i = 0; i < count; ++i) {
731 			gofh->bufs[i].go = go;
732 			gofh->bufs[i].index = i;
733 			gofh->bufs[i].state = BUF_STATE_IDLE;
734 			gofh->bufs[i].mapped = 0;
735 		}
736 
737 		go->in_use = 1;
738 	} else {
739 		go->in_use = 0;
740 	}
741 
742 	gofh->buf_count = count;
743 	mutex_unlock(&go->hw_lock);
744 	mutex_unlock(&gofh->lock);
745 
746 	memset(req, 0, sizeof(*req));
747 
748 	req->count = count;
749 	req->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
750 	req->memory = V4L2_MEMORY_MMAP;
751 
752 	return 0;
753 
754 unlock_and_return:
755 	mutex_unlock(&gofh->lock);
756 	return retval;
757 }
758 
vidioc_querybuf(struct file * file,void * priv,struct v4l2_buffer * buf)759 static int vidioc_querybuf(struct file *file, void *priv,
760 			   struct v4l2_buffer *buf)
761 {
762 	struct go7007_file *gofh = priv;
763 	int retval = -EINVAL;
764 	unsigned int index;
765 
766 	if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
767 		return retval;
768 
769 	index = buf->index;
770 
771 	mutex_lock(&gofh->lock);
772 	if (index >= gofh->buf_count)
773 		goto unlock_and_return;
774 
775 	memset(buf, 0, sizeof(*buf));
776 	buf->index = index;
777 	buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
778 
779 	switch (gofh->bufs[index].state) {
780 	case BUF_STATE_QUEUED:
781 		buf->flags = V4L2_BUF_FLAG_QUEUED;
782 		break;
783 	case BUF_STATE_DONE:
784 		buf->flags = V4L2_BUF_FLAG_DONE;
785 		break;
786 	default:
787 		buf->flags = 0;
788 	}
789 
790 	if (gofh->bufs[index].mapped)
791 		buf->flags |= V4L2_BUF_FLAG_MAPPED;
792 	buf->memory = V4L2_MEMORY_MMAP;
793 	buf->m.offset = index * GO7007_BUF_SIZE;
794 	buf->length = GO7007_BUF_SIZE;
795 	mutex_unlock(&gofh->lock);
796 
797 	return 0;
798 
799 unlock_and_return:
800 	mutex_unlock(&gofh->lock);
801 	return retval;
802 }
803 
vidioc_qbuf(struct file * file,void * priv,struct v4l2_buffer * buf)804 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
805 {
806 	struct go7007_file *gofh = priv;
807 	struct go7007 *go = gofh->go;
808 	struct go7007_buffer *gobuf;
809 	unsigned long flags;
810 	int retval = -EINVAL;
811 	int ret;
812 
813 	if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
814 			buf->memory != V4L2_MEMORY_MMAP)
815 		return retval;
816 
817 	mutex_lock(&gofh->lock);
818 	if (buf->index < 0 || buf->index >= gofh->buf_count)
819 		goto unlock_and_return;
820 
821 	gobuf = &gofh->bufs[buf->index];
822 	if (!gobuf->mapped)
823 		goto unlock_and_return;
824 
825 	retval = -EBUSY;
826 	if (gobuf->state != BUF_STATE_IDLE)
827 		goto unlock_and_return;
828 
829 	/* offset will be 0 until we really support USERPTR streaming */
830 	gobuf->offset = gobuf->user_addr & ~PAGE_MASK;
831 	gobuf->bytesused = 0;
832 	gobuf->frame_offset = 0;
833 	gobuf->modet_active = 0;
834 	if (gobuf->offset > 0)
835 		gobuf->page_count = GO7007_BUF_PAGES + 1;
836 	else
837 		gobuf->page_count = GO7007_BUF_PAGES;
838 
839 	retval = -ENOMEM;
840 	down_read(&current->mm->mmap_sem);
841 	ret = get_user_pages(current, current->mm,
842 			gobuf->user_addr & PAGE_MASK, gobuf->page_count,
843 			1, 1, gobuf->pages, NULL);
844 	up_read(&current->mm->mmap_sem);
845 
846 	if (ret != gobuf->page_count) {
847 		int i;
848 		for (i = 0; i < ret; ++i)
849 			page_cache_release(gobuf->pages[i]);
850 		gobuf->page_count = 0;
851 		goto unlock_and_return;
852 	}
853 
854 	gobuf->state = BUF_STATE_QUEUED;
855 	spin_lock_irqsave(&go->spinlock, flags);
856 	list_add_tail(&gobuf->stream, &go->stream);
857 	spin_unlock_irqrestore(&go->spinlock, flags);
858 	mutex_unlock(&gofh->lock);
859 
860 	return 0;
861 
862 unlock_and_return:
863 	mutex_unlock(&gofh->lock);
864 	return retval;
865 }
866 
867 
vidioc_dqbuf(struct file * file,void * priv,struct v4l2_buffer * buf)868 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
869 {
870 	struct go7007_file *gofh = priv;
871 	struct go7007 *go = gofh->go;
872 	struct go7007_buffer *gobuf;
873 	int retval = -EINVAL;
874 	unsigned long flags;
875 	u32 frame_type_flag;
876 	DEFINE_WAIT(wait);
877 
878 	if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
879 		return retval;
880 	if (buf->memory != V4L2_MEMORY_MMAP)
881 		return retval;
882 
883 	mutex_lock(&gofh->lock);
884 	if (list_empty(&go->stream))
885 		goto unlock_and_return;
886 	gobuf = list_entry(go->stream.next,
887 			struct go7007_buffer, stream);
888 
889 	retval = -EAGAIN;
890 	if (gobuf->state != BUF_STATE_DONE &&
891 			!(file->f_flags & O_NONBLOCK)) {
892 		for (;;) {
893 			prepare_to_wait(&go->frame_waitq, &wait,
894 					TASK_INTERRUPTIBLE);
895 			if (gobuf->state == BUF_STATE_DONE)
896 				break;
897 			if (signal_pending(current)) {
898 				retval = -ERESTARTSYS;
899 				break;
900 			}
901 			schedule();
902 		}
903 		finish_wait(&go->frame_waitq, &wait);
904 	}
905 	if (gobuf->state != BUF_STATE_DONE)
906 		goto unlock_and_return;
907 
908 	spin_lock_irqsave(&go->spinlock, flags);
909 	deactivate_buffer(gobuf);
910 	spin_unlock_irqrestore(&go->spinlock, flags);
911 	frame_type_flag = get_frame_type_flag(gobuf, go->format);
912 	gobuf->state = BUF_STATE_IDLE;
913 
914 	memset(buf, 0, sizeof(*buf));
915 	buf->index = gobuf->index;
916 	buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
917 	buf->bytesused = gobuf->bytesused;
918 	buf->flags = V4L2_BUF_FLAG_MAPPED | frame_type_flag;
919 	buf->field = V4L2_FIELD_NONE;
920 	buf->timestamp = gobuf->timestamp;
921 	buf->sequence = gobuf->seq;
922 	buf->memory = V4L2_MEMORY_MMAP;
923 	buf->m.offset = gobuf->index * GO7007_BUF_SIZE;
924 	buf->length = GO7007_BUF_SIZE;
925 	buf->reserved = gobuf->modet_active;
926 
927 	mutex_unlock(&gofh->lock);
928 	return 0;
929 
930 unlock_and_return:
931 	mutex_unlock(&gofh->lock);
932 	return retval;
933 }
934 
vidioc_streamon(struct file * file,void * priv,enum v4l2_buf_type type)935 static int vidioc_streamon(struct file *file, void *priv,
936 					enum v4l2_buf_type type)
937 {
938 	struct go7007_file *gofh = priv;
939 	struct go7007 *go = gofh->go;
940 	int retval = 0;
941 
942 	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
943 		return -EINVAL;
944 
945 	mutex_lock(&gofh->lock);
946 	mutex_lock(&go->hw_lock);
947 
948 	if (!go->streaming) {
949 		go->streaming = 1;
950 		go->next_seq = 0;
951 		go->active_buf = NULL;
952 		if (go7007_start_encoder(go) < 0)
953 			retval = -EIO;
954 		else
955 			retval = 0;
956 	}
957 	mutex_unlock(&go->hw_lock);
958 	mutex_unlock(&gofh->lock);
959 
960 	return retval;
961 }
962 
vidioc_streamoff(struct file * file,void * priv,enum v4l2_buf_type type)963 static int vidioc_streamoff(struct file *file, void *priv,
964 					enum v4l2_buf_type type)
965 {
966 	struct go7007_file *gofh = priv;
967 	struct go7007 *go = gofh->go;
968 
969 	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
970 		return -EINVAL;
971 	mutex_lock(&gofh->lock);
972 	go7007_streamoff(go);
973 	mutex_unlock(&gofh->lock);
974 
975 	return 0;
976 }
977 
vidioc_queryctrl(struct file * file,void * priv,struct v4l2_queryctrl * query)978 static int vidioc_queryctrl(struct file *file, void *priv,
979 			   struct v4l2_queryctrl *query)
980 {
981 	struct go7007 *go = ((struct go7007_file *) priv)->go;
982 	int id = query->id;
983 
984 	if (0 == call_all(&go->v4l2_dev, core, queryctrl, query))
985 		return 0;
986 
987 	query->id = id;
988 	return mpeg_query_ctrl(query);
989 }
990 
vidioc_g_ctrl(struct file * file,void * priv,struct v4l2_control * ctrl)991 static int vidioc_g_ctrl(struct file *file, void *priv,
992 				struct v4l2_control *ctrl)
993 {
994 	struct go7007 *go = ((struct go7007_file *) priv)->go;
995 
996 	if (0 == call_all(&go->v4l2_dev, core, g_ctrl, ctrl))
997 		return 0;
998 
999 	return mpeg_g_ctrl(ctrl, go);
1000 }
1001 
vidioc_s_ctrl(struct file * file,void * priv,struct v4l2_control * ctrl)1002 static int vidioc_s_ctrl(struct file *file, void *priv,
1003 				struct v4l2_control *ctrl)
1004 {
1005 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1006 
1007 	if (0 == call_all(&go->v4l2_dev, core, s_ctrl, ctrl))
1008 		return 0;
1009 
1010 	return mpeg_s_ctrl(ctrl, go);
1011 }
1012 
vidioc_g_parm(struct file * filp,void * priv,struct v4l2_streamparm * parm)1013 static int vidioc_g_parm(struct file *filp, void *priv,
1014 		struct v4l2_streamparm *parm)
1015 {
1016 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1017 	struct v4l2_fract timeperframe = {
1018 		.numerator = 1001 *  go->fps_scale,
1019 		.denominator = go->sensor_framerate,
1020 	};
1021 
1022 	if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1023 		return -EINVAL;
1024 
1025 	parm->parm.capture.capability |= V4L2_CAP_TIMEPERFRAME;
1026 	parm->parm.capture.timeperframe = timeperframe;
1027 
1028 	return 0;
1029 }
1030 
vidioc_s_parm(struct file * filp,void * priv,struct v4l2_streamparm * parm)1031 static int vidioc_s_parm(struct file *filp, void *priv,
1032 		struct v4l2_streamparm *parm)
1033 {
1034 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1035 	unsigned int n, d;
1036 
1037 	if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1038 		return -EINVAL;
1039 	if (parm->parm.capture.capturemode != 0)
1040 		return -EINVAL;
1041 
1042 	n = go->sensor_framerate *
1043 		parm->parm.capture.timeperframe.numerator;
1044 	d = 1001 * parm->parm.capture.timeperframe.denominator;
1045 	if (n != 0 && d != 0 && n > d)
1046 		go->fps_scale = (n + d/2) / d;
1047 	else
1048 		go->fps_scale = 1;
1049 
1050 	return 0;
1051 }
1052 
1053 /* VIDIOC_ENUMSTD on go7007 were used for enumberating the supported fps and
1054    its resolution, when the device is not connected to TV.
1055    This were an API abuse, probably used by the lack of specific IOCTL's to
1056    enumberate it, by the time the driver were written.
1057 
1058    However, since kernel 2.6.19, two new ioctls (VIDIOC_ENUM_FRAMEINTERVALS
1059    and VIDIOC_ENUM_FRAMESIZES) were added for this purpose.
1060 
1061    The two functions bellow implements the newer ioctls
1062 */
vidioc_enum_framesizes(struct file * filp,void * priv,struct v4l2_frmsizeenum * fsize)1063 static int vidioc_enum_framesizes(struct file *filp, void *priv,
1064 				  struct v4l2_frmsizeenum *fsize)
1065 {
1066 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1067 
1068 	/* Return -EINVAL, if it is a TV board */
1069 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) ||
1070 	    (go->board_info->sensor_flags & GO7007_SENSOR_TV))
1071 		return -EINVAL;
1072 
1073 	if (fsize->index > 0)
1074 		return -EINVAL;
1075 
1076 	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1077 	fsize->discrete.width = go->board_info->sensor_width;
1078 	fsize->discrete.height = go->board_info->sensor_height;
1079 
1080 	return 0;
1081 }
1082 
vidioc_enum_frameintervals(struct file * filp,void * priv,struct v4l2_frmivalenum * fival)1083 static int vidioc_enum_frameintervals(struct file *filp, void *priv,
1084 				      struct v4l2_frmivalenum *fival)
1085 {
1086 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1087 
1088 	/* Return -EINVAL, if it is a TV board */
1089 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) ||
1090 	    (go->board_info->sensor_flags & GO7007_SENSOR_TV))
1091 		return -EINVAL;
1092 
1093 	if (fival->index > 0)
1094 		return -EINVAL;
1095 
1096 	fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1097 	fival->discrete.numerator = 1001;
1098 	fival->discrete.denominator = go->board_info->sensor_framerate;
1099 
1100 	return 0;
1101 }
1102 
vidioc_g_std(struct file * file,void * priv,v4l2_std_id * std)1103 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *std)
1104 {
1105 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1106 
1107 	switch (go->standard) {
1108 	case GO7007_STD_NTSC:
1109 		*std = V4L2_STD_NTSC;
1110 		break;
1111 	case GO7007_STD_PAL:
1112 		*std = V4L2_STD_PAL;
1113 		break;
1114 	default:
1115 		return -EINVAL;
1116 	}
1117 
1118 	return 0;
1119 }
1120 
vidioc_s_std(struct file * file,void * priv,v4l2_std_id * std)1121 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *std)
1122 {
1123 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1124 
1125 	if (go->streaming)
1126 		return -EBUSY;
1127 
1128 	if (!(go->board_info->sensor_flags & GO7007_SENSOR_TV) && *std != 0)
1129 		return -EINVAL;
1130 
1131 	if (*std == 0)
1132 		return -EINVAL;
1133 
1134 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
1135 			go->input == go->board_info->num_inputs - 1) {
1136 		if (!go->i2c_adapter_online)
1137 			return -EIO;
1138 		if (call_all(&go->v4l2_dev, core, s_std, *std) < 0)
1139 			return -EINVAL;
1140 	}
1141 
1142 	if (*std & V4L2_STD_NTSC) {
1143 		go->standard = GO7007_STD_NTSC;
1144 		go->sensor_framerate = 30000;
1145 	} else if (*std & V4L2_STD_PAL) {
1146 		go->standard = GO7007_STD_PAL;
1147 		go->sensor_framerate = 25025;
1148 	} else if (*std & V4L2_STD_SECAM) {
1149 		go->standard = GO7007_STD_PAL;
1150 		go->sensor_framerate = 25025;
1151 	} else
1152 		return -EINVAL;
1153 
1154 	call_all(&go->v4l2_dev, core, s_std, *std);
1155 	set_capture_size(go, NULL, 0);
1156 
1157 	return 0;
1158 }
1159 
vidioc_querystd(struct file * file,void * priv,v4l2_std_id * std)1160 static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *std)
1161 {
1162 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1163 
1164 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
1165 			go->input == go->board_info->num_inputs - 1) {
1166 		if (!go->i2c_adapter_online)
1167 			return -EIO;
1168 		return call_all(&go->v4l2_dev, video, querystd, std);
1169 	} else if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1170 		*std = V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM;
1171 	else
1172 		*std = 0;
1173 
1174 	return 0;
1175 }
1176 
vidioc_enum_input(struct file * file,void * priv,struct v4l2_input * inp)1177 static int vidioc_enum_input(struct file *file, void *priv,
1178 				struct v4l2_input *inp)
1179 {
1180 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1181 
1182 	if (inp->index >= go->board_info->num_inputs)
1183 		return -EINVAL;
1184 
1185 	strncpy(inp->name, go->board_info->inputs[inp->index].name,
1186 			sizeof(inp->name));
1187 
1188 	/* If this board has a tuner, it will be the last input */
1189 	if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
1190 			inp->index == go->board_info->num_inputs - 1)
1191 		inp->type = V4L2_INPUT_TYPE_TUNER;
1192 	else
1193 		inp->type = V4L2_INPUT_TYPE_CAMERA;
1194 
1195 	inp->audioset = 0;
1196 	inp->tuner = 0;
1197 	if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1198 		inp->std = V4L2_STD_NTSC | V4L2_STD_PAL |
1199 						V4L2_STD_SECAM;
1200 	else
1201 		inp->std = 0;
1202 
1203 	return 0;
1204 }
1205 
1206 
vidioc_g_input(struct file * file,void * priv,unsigned int * input)1207 static int vidioc_g_input(struct file *file, void *priv, unsigned int *input)
1208 {
1209 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1210 
1211 	*input = go->input;
1212 
1213 	return 0;
1214 }
1215 
vidioc_s_input(struct file * file,void * priv,unsigned int input)1216 static int vidioc_s_input(struct file *file, void *priv, unsigned int input)
1217 {
1218 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1219 
1220 	if (input >= go->board_info->num_inputs)
1221 		return -EINVAL;
1222 	if (go->streaming)
1223 		return -EBUSY;
1224 
1225 	go->input = input;
1226 
1227 	return call_all(&go->v4l2_dev, video, s_routing, input, 0, 0);
1228 }
1229 
vidioc_g_tuner(struct file * file,void * priv,struct v4l2_tuner * t)1230 static int vidioc_g_tuner(struct file *file, void *priv,
1231 				struct v4l2_tuner *t)
1232 {
1233 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1234 
1235 	if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1236 		return -EINVAL;
1237 	if (t->index != 0)
1238 		return -EINVAL;
1239 	if (!go->i2c_adapter_online)
1240 		return -EIO;
1241 
1242 	return call_all(&go->v4l2_dev, tuner, g_tuner, t);
1243 }
1244 
vidioc_s_tuner(struct file * file,void * priv,struct v4l2_tuner * t)1245 static int vidioc_s_tuner(struct file *file, void *priv,
1246 				struct v4l2_tuner *t)
1247 {
1248 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1249 
1250 	if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1251 		return -EINVAL;
1252 	if (t->index != 0)
1253 		return -EINVAL;
1254 	if (!go->i2c_adapter_online)
1255 		return -EIO;
1256 
1257 	switch (go->board_id) {
1258 	case GO7007_BOARDID_PX_TV402U_NA:
1259 	case GO7007_BOARDID_PX_TV402U_JP:
1260 		/* No selectable options currently */
1261 		if (t->audmode != V4L2_TUNER_MODE_STEREO)
1262 			return -EINVAL;
1263 		break;
1264 	}
1265 
1266 	return call_all(&go->v4l2_dev, tuner, s_tuner, t);
1267 }
1268 
vidioc_g_frequency(struct file * file,void * priv,struct v4l2_frequency * f)1269 static int vidioc_g_frequency(struct file *file, void *priv,
1270 				struct v4l2_frequency *f)
1271 {
1272 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1273 
1274 	if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1275 		return -EINVAL;
1276 	if (!go->i2c_adapter_online)
1277 		return -EIO;
1278 
1279 	f->type = V4L2_TUNER_ANALOG_TV;
1280 
1281 	return call_all(&go->v4l2_dev, tuner, g_frequency, f);
1282 }
1283 
vidioc_s_frequency(struct file * file,void * priv,struct v4l2_frequency * f)1284 static int vidioc_s_frequency(struct file *file, void *priv,
1285 				struct v4l2_frequency *f)
1286 {
1287 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1288 
1289 	if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1290 		return -EINVAL;
1291 	if (!go->i2c_adapter_online)
1292 		return -EIO;
1293 
1294 	return call_all(&go->v4l2_dev, tuner, s_frequency, f);
1295 }
1296 
vidioc_cropcap(struct file * file,void * priv,struct v4l2_cropcap * cropcap)1297 static int vidioc_cropcap(struct file *file, void *priv,
1298 					struct v4l2_cropcap *cropcap)
1299 {
1300 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1301 
1302 	if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1303 		return -EINVAL;
1304 
1305 	/* These specify the raw input of the sensor */
1306 	switch (go->standard) {
1307 	case GO7007_STD_NTSC:
1308 		cropcap->bounds.top = 0;
1309 		cropcap->bounds.left = 0;
1310 		cropcap->bounds.width = 720;
1311 		cropcap->bounds.height = 480;
1312 		cropcap->defrect.top = 0;
1313 		cropcap->defrect.left = 0;
1314 		cropcap->defrect.width = 720;
1315 		cropcap->defrect.height = 480;
1316 		break;
1317 	case GO7007_STD_PAL:
1318 		cropcap->bounds.top = 0;
1319 		cropcap->bounds.left = 0;
1320 		cropcap->bounds.width = 720;
1321 		cropcap->bounds.height = 576;
1322 		cropcap->defrect.top = 0;
1323 		cropcap->defrect.left = 0;
1324 		cropcap->defrect.width = 720;
1325 		cropcap->defrect.height = 576;
1326 		break;
1327 	case GO7007_STD_OTHER:
1328 		cropcap->bounds.top = 0;
1329 		cropcap->bounds.left = 0;
1330 		cropcap->bounds.width = go->board_info->sensor_width;
1331 		cropcap->bounds.height = go->board_info->sensor_height;
1332 		cropcap->defrect.top = 0;
1333 		cropcap->defrect.left = 0;
1334 		cropcap->defrect.width = go->board_info->sensor_width;
1335 		cropcap->defrect.height = go->board_info->sensor_height;
1336 		break;
1337 	}
1338 
1339 	return 0;
1340 }
1341 
vidioc_g_crop(struct file * file,void * priv,struct v4l2_crop * crop)1342 static int vidioc_g_crop(struct file *file, void *priv, struct v4l2_crop *crop)
1343 {
1344 	struct go7007 *go = ((struct go7007_file *) priv)->go;
1345 
1346 	if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1347 		return -EINVAL;
1348 
1349 	crop->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1350 
1351 	/* These specify the raw input of the sensor */
1352 	switch (go->standard) {
1353 	case GO7007_STD_NTSC:
1354 		crop->c.top = 0;
1355 		crop->c.left = 0;
1356 		crop->c.width = 720;
1357 		crop->c.height = 480;
1358 		break;
1359 	case GO7007_STD_PAL:
1360 		crop->c.top = 0;
1361 		crop->c.left = 0;
1362 		crop->c.width = 720;
1363 		crop->c.height = 576;
1364 		break;
1365 	case GO7007_STD_OTHER:
1366 		crop->c.top = 0;
1367 		crop->c.left = 0;
1368 		crop->c.width = go->board_info->sensor_width;
1369 		crop->c.height = go->board_info->sensor_height;
1370 		break;
1371 	}
1372 
1373 	return 0;
1374 }
1375 
1376 /* FIXME: vidioc_s_crop is not really implemented!!!
1377  */
vidioc_s_crop(struct file * file,void * priv,struct v4l2_crop * crop)1378 static int vidioc_s_crop(struct file *file, void *priv, struct v4l2_crop *crop)
1379 {
1380 	if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1381 		return -EINVAL;
1382 
1383 	return 0;
1384 }
1385 
vidioc_g_jpegcomp(struct file * file,void * priv,struct v4l2_jpegcompression * params)1386 static int vidioc_g_jpegcomp(struct file *file, void *priv,
1387 			 struct v4l2_jpegcompression *params)
1388 {
1389 	memset(params, 0, sizeof(*params));
1390 	params->quality = 50; /* ?? */
1391 	params->jpeg_markers = V4L2_JPEG_MARKER_DHT |
1392 				V4L2_JPEG_MARKER_DQT;
1393 
1394 	return 0;
1395 }
1396 
vidioc_s_jpegcomp(struct file * file,void * priv,struct v4l2_jpegcompression * params)1397 static int vidioc_s_jpegcomp(struct file *file, void *priv,
1398 			 struct v4l2_jpegcompression *params)
1399 {
1400 	if (params->quality != 50 ||
1401 			params->jpeg_markers != (V4L2_JPEG_MARKER_DHT |
1402 						V4L2_JPEG_MARKER_DQT))
1403 		return -EINVAL;
1404 
1405 	return 0;
1406 }
1407 
1408 /* FIXME:
1409 	Those ioctls are private, and not needed, since several standard
1410 	extended controls already provide streaming control.
1411 	So, those ioctls should be converted into vidioc_g_ext_ctrls()
1412 	and vidioc_s_ext_ctrls()
1413  */
1414 
1415 #if 0
1416 	/* Temporary ioctls for controlling compression characteristics */
1417 	case GO7007IOC_S_BITRATE:
1418 	{
1419 		int *bitrate = arg;
1420 
1421 		if (go->streaming)
1422 			return -EINVAL;
1423 		/* Upper bound is kind of arbitrary here */
1424 		if (*bitrate < 64000 || *bitrate > 10000000)
1425 			return -EINVAL;
1426 		go->bitrate = *bitrate;
1427 		return 0;
1428 	}
1429 	case GO7007IOC_G_BITRATE:
1430 	{
1431 		int *bitrate = arg;
1432 
1433 		*bitrate = go->bitrate;
1434 		return 0;
1435 	}
1436 	case GO7007IOC_S_COMP_PARAMS:
1437 	{
1438 		struct go7007_comp_params *comp = arg;
1439 
1440 		if (go->format == GO7007_FORMAT_MJPEG)
1441 			return -EINVAL;
1442 		if (comp->gop_size > 0)
1443 			go->gop_size = comp->gop_size;
1444 		else
1445 			go->gop_size = go->sensor_framerate / 1000;
1446 		if (go->gop_size != 15)
1447 			go->dvd_mode = 0;
1448 		/*go->ipb = comp->max_b_frames > 0;*/ /* completely untested */
1449 		if (go->board_info->sensor_flags & GO7007_SENSOR_TV) {
1450 			switch (comp->aspect_ratio) {
1451 			case GO7007_ASPECT_RATIO_4_3_NTSC:
1452 			case GO7007_ASPECT_RATIO_4_3_PAL:
1453 				go->aspect_ratio = GO7007_RATIO_4_3;
1454 				break;
1455 			case GO7007_ASPECT_RATIO_16_9_NTSC:
1456 			case GO7007_ASPECT_RATIO_16_9_PAL:
1457 				go->aspect_ratio = GO7007_RATIO_16_9;
1458 				break;
1459 			default:
1460 				go->aspect_ratio = GO7007_RATIO_1_1;
1461 				break;
1462 			}
1463 		}
1464 		if (comp->flags & GO7007_COMP_OMIT_SEQ_HEADER) {
1465 			go->dvd_mode = 0;
1466 			go->seq_header_enable = 0;
1467 		} else {
1468 			go->seq_header_enable = 1;
1469 		}
1470 		/* fall-through */
1471 	}
1472 	case GO7007IOC_G_COMP_PARAMS:
1473 	{
1474 		struct go7007_comp_params *comp = arg;
1475 
1476 		if (go->format == GO7007_FORMAT_MJPEG)
1477 			return -EINVAL;
1478 		memset(comp, 0, sizeof(*comp));
1479 		comp->gop_size = go->gop_size;
1480 		comp->max_b_frames = go->ipb ? 2 : 0;
1481 		switch (go->aspect_ratio) {
1482 		case GO7007_RATIO_4_3:
1483 			if (go->standard == GO7007_STD_NTSC)
1484 				comp->aspect_ratio =
1485 					GO7007_ASPECT_RATIO_4_3_NTSC;
1486 			else
1487 				comp->aspect_ratio =
1488 					GO7007_ASPECT_RATIO_4_3_PAL;
1489 			break;
1490 		case GO7007_RATIO_16_9:
1491 			if (go->standard == GO7007_STD_NTSC)
1492 				comp->aspect_ratio =
1493 					GO7007_ASPECT_RATIO_16_9_NTSC;
1494 			else
1495 				comp->aspect_ratio =
1496 					GO7007_ASPECT_RATIO_16_9_PAL;
1497 			break;
1498 		default:
1499 			comp->aspect_ratio = GO7007_ASPECT_RATIO_1_1;
1500 			break;
1501 		}
1502 		if (go->closed_gop)
1503 			comp->flags |= GO7007_COMP_CLOSED_GOP;
1504 		if (!go->seq_header_enable)
1505 			comp->flags |= GO7007_COMP_OMIT_SEQ_HEADER;
1506 		return 0;
1507 	}
1508 	case GO7007IOC_S_MPEG_PARAMS:
1509 	{
1510 		struct go7007_mpeg_params *mpeg = arg;
1511 
1512 		if (go->format != GO7007_FORMAT_MPEG1 &&
1513 				go->format != GO7007_FORMAT_MPEG2 &&
1514 				go->format != GO7007_FORMAT_MPEG4)
1515 			return -EINVAL;
1516 
1517 		if (mpeg->flags & GO7007_MPEG_FORCE_DVD_MODE) {
1518 			go->format = GO7007_FORMAT_MPEG2;
1519 			go->bitrate = 9800000;
1520 			go->gop_size = 15;
1521 			go->pali = 0x48;
1522 			go->closed_gop = 1;
1523 			go->repeat_seqhead = 0;
1524 			go->seq_header_enable = 1;
1525 			go->gop_header_enable = 1;
1526 			go->dvd_mode = 1;
1527 		} else {
1528 			switch (mpeg->mpeg_video_standard) {
1529 			case GO7007_MPEG_VIDEO_MPEG1:
1530 				go->format = GO7007_FORMAT_MPEG1;
1531 				go->pali = 0;
1532 				break;
1533 			case GO7007_MPEG_VIDEO_MPEG2:
1534 				go->format = GO7007_FORMAT_MPEG2;
1535 				if (mpeg->pali >> 24 == 2)
1536 					go->pali = mpeg->pali & 0xff;
1537 				else
1538 					go->pali = 0x48;
1539 				break;
1540 			case GO7007_MPEG_VIDEO_MPEG4:
1541 				go->format = GO7007_FORMAT_MPEG4;
1542 				if (mpeg->pali >> 24 == 4)
1543 					go->pali = mpeg->pali & 0xff;
1544 				else
1545 					go->pali = 0xf5;
1546 				break;
1547 			default:
1548 				return -EINVAL;
1549 			}
1550 			go->gop_header_enable =
1551 				mpeg->flags & GO7007_MPEG_OMIT_GOP_HEADER
1552 				? 0 : 1;
1553 			if (mpeg->flags & GO7007_MPEG_REPEAT_SEQHEADER)
1554 				go->repeat_seqhead = 1;
1555 			else
1556 				go->repeat_seqhead = 0;
1557 			go->dvd_mode = 0;
1558 		}
1559 		/* fall-through */
1560 	}
1561 	case GO7007IOC_G_MPEG_PARAMS:
1562 	{
1563 		struct go7007_mpeg_params *mpeg = arg;
1564 
1565 		memset(mpeg, 0, sizeof(*mpeg));
1566 		switch (go->format) {
1567 		case GO7007_FORMAT_MPEG1:
1568 			mpeg->mpeg_video_standard = GO7007_MPEG_VIDEO_MPEG1;
1569 			mpeg->pali = 0;
1570 			break;
1571 		case GO7007_FORMAT_MPEG2:
1572 			mpeg->mpeg_video_standard = GO7007_MPEG_VIDEO_MPEG2;
1573 			mpeg->pali = GO7007_MPEG_PROFILE(2, go->pali);
1574 			break;
1575 		case GO7007_FORMAT_MPEG4:
1576 			mpeg->mpeg_video_standard = GO7007_MPEG_VIDEO_MPEG4;
1577 			mpeg->pali = GO7007_MPEG_PROFILE(4, go->pali);
1578 			break;
1579 		default:
1580 			return -EINVAL;
1581 		}
1582 		if (!go->gop_header_enable)
1583 			mpeg->flags |= GO7007_MPEG_OMIT_GOP_HEADER;
1584 		if (go->repeat_seqhead)
1585 			mpeg->flags |= GO7007_MPEG_REPEAT_SEQHEADER;
1586 		if (go->dvd_mode)
1587 			mpeg->flags |= GO7007_MPEG_FORCE_DVD_MODE;
1588 		return 0;
1589 	}
1590 	case GO7007IOC_S_MD_PARAMS:
1591 	{
1592 		struct go7007_md_params *mdp = arg;
1593 
1594 		if (mdp->region > 3)
1595 			return -EINVAL;
1596 		if (mdp->trigger > 0) {
1597 			go->modet[mdp->region].pixel_threshold =
1598 					mdp->pixel_threshold >> 1;
1599 			go->modet[mdp->region].motion_threshold =
1600 					mdp->motion_threshold >> 1;
1601 			go->modet[mdp->region].mb_threshold =
1602 					mdp->trigger >> 1;
1603 			go->modet[mdp->region].enable = 1;
1604 		} else
1605 			go->modet[mdp->region].enable = 0;
1606 		/* fall-through */
1607 	}
1608 	case GO7007IOC_G_MD_PARAMS:
1609 	{
1610 		struct go7007_md_params *mdp = arg;
1611 		int region = mdp->region;
1612 
1613 		if (mdp->region > 3)
1614 			return -EINVAL;
1615 		memset(mdp, 0, sizeof(struct go7007_md_params));
1616 		mdp->region = region;
1617 		if (!go->modet[region].enable)
1618 			return 0;
1619 		mdp->pixel_threshold =
1620 			(go->modet[region].pixel_threshold << 1) + 1;
1621 		mdp->motion_threshold =
1622 			(go->modet[region].motion_threshold << 1) + 1;
1623 		mdp->trigger =
1624 			(go->modet[region].mb_threshold << 1) + 1;
1625 		return 0;
1626 	}
1627 	case GO7007IOC_S_MD_REGION:
1628 	{
1629 		struct go7007_md_region *region = arg;
1630 
1631 		if (region->region < 1 || region->region > 3)
1632 			return -EINVAL;
1633 		return clip_to_modet_map(go, region->region, region->clips);
1634 	}
1635 #endif
1636 
go7007_read(struct file * file,char __user * data,size_t count,loff_t * ppos)1637 static ssize_t go7007_read(struct file *file, char __user *data,
1638 		size_t count, loff_t *ppos)
1639 {
1640 	return -EINVAL;
1641 }
1642 
go7007_vm_open(struct vm_area_struct * vma)1643 static void go7007_vm_open(struct vm_area_struct *vma)
1644 {
1645 	struct go7007_buffer *gobuf = vma->vm_private_data;
1646 
1647 	++gobuf->mapped;
1648 }
1649 
go7007_vm_close(struct vm_area_struct * vma)1650 static void go7007_vm_close(struct vm_area_struct *vma)
1651 {
1652 	struct go7007_buffer *gobuf = vma->vm_private_data;
1653 	unsigned long flags;
1654 
1655 	if (--gobuf->mapped == 0) {
1656 		spin_lock_irqsave(&gobuf->go->spinlock, flags);
1657 		deactivate_buffer(gobuf);
1658 		spin_unlock_irqrestore(&gobuf->go->spinlock, flags);
1659 	}
1660 }
1661 
1662 /* Copied from videobuf-dma-sg.c */
go7007_vm_fault(struct vm_area_struct * vma,struct vm_fault * vmf)1663 static int go7007_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1664 {
1665 	struct page *page;
1666 
1667 	page = alloc_page(GFP_USER | __GFP_DMA32);
1668 	if (!page)
1669 		return VM_FAULT_OOM;
1670 	clear_user_highpage(page, (unsigned long)vmf->virtual_address);
1671 	vmf->page = page;
1672 	return 0;
1673 }
1674 
1675 static struct vm_operations_struct go7007_vm_ops = {
1676 	.open	= go7007_vm_open,
1677 	.close	= go7007_vm_close,
1678 	.fault	= go7007_vm_fault,
1679 };
1680 
go7007_mmap(struct file * file,struct vm_area_struct * vma)1681 static int go7007_mmap(struct file *file, struct vm_area_struct *vma)
1682 {
1683 	struct go7007_file *gofh = file->private_data;
1684 	unsigned int index;
1685 
1686 	if (gofh->go->status != STATUS_ONLINE)
1687 		return -EIO;
1688 	if (!(vma->vm_flags & VM_SHARED))
1689 		return -EINVAL; /* only support VM_SHARED mapping */
1690 	if (vma->vm_end - vma->vm_start != GO7007_BUF_SIZE)
1691 		return -EINVAL; /* must map exactly one full buffer */
1692 	mutex_lock(&gofh->lock);
1693 	index = vma->vm_pgoff / GO7007_BUF_PAGES;
1694 	if (index >= gofh->buf_count) {
1695 		mutex_unlock(&gofh->lock);
1696 		return -EINVAL; /* trying to map beyond requested buffers */
1697 	}
1698 	if (index * GO7007_BUF_PAGES != vma->vm_pgoff) {
1699 		mutex_unlock(&gofh->lock);
1700 		return -EINVAL; /* offset is not aligned on buffer boundary */
1701 	}
1702 	if (gofh->bufs[index].mapped > 0) {
1703 		mutex_unlock(&gofh->lock);
1704 		return -EBUSY;
1705 	}
1706 	gofh->bufs[index].mapped = 1;
1707 	gofh->bufs[index].user_addr = vma->vm_start;
1708 	vma->vm_ops = &go7007_vm_ops;
1709 	vma->vm_flags |= VM_DONTEXPAND;
1710 	vma->vm_flags &= ~VM_IO;
1711 	vma->vm_private_data = &gofh->bufs[index];
1712 	mutex_unlock(&gofh->lock);
1713 	return 0;
1714 }
1715 
go7007_poll(struct file * file,poll_table * wait)1716 static unsigned int go7007_poll(struct file *file, poll_table *wait)
1717 {
1718 	struct go7007_file *gofh = file->private_data;
1719 	struct go7007_buffer *gobuf;
1720 
1721 	if (list_empty(&gofh->go->stream))
1722 		return POLLERR;
1723 	gobuf = list_entry(gofh->go->stream.next, struct go7007_buffer, stream);
1724 	poll_wait(file, &gofh->go->frame_waitq, wait);
1725 	if (gobuf->state == BUF_STATE_DONE)
1726 		return POLLIN | POLLRDNORM;
1727 	return 0;
1728 }
1729 
go7007_vfl_release(struct video_device * vfd)1730 static void go7007_vfl_release(struct video_device *vfd)
1731 {
1732 	struct go7007 *go = video_get_drvdata(vfd);
1733 
1734 	video_device_release(vfd);
1735 	if (--go->ref_count == 0)
1736 		kfree(go);
1737 }
1738 
1739 static struct v4l2_file_operations go7007_fops = {
1740 	.owner		= THIS_MODULE,
1741 	.open		= go7007_open,
1742 	.release	= go7007_release,
1743 	.ioctl		= video_ioctl2,
1744 	.read		= go7007_read,
1745 	.mmap		= go7007_mmap,
1746 	.poll		= go7007_poll,
1747 };
1748 
1749 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1750 	.vidioc_querycap          = vidioc_querycap,
1751 	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
1752 	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
1753 	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
1754 	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
1755 	.vidioc_reqbufs           = vidioc_reqbufs,
1756 	.vidioc_querybuf          = vidioc_querybuf,
1757 	.vidioc_qbuf              = vidioc_qbuf,
1758 	.vidioc_dqbuf             = vidioc_dqbuf,
1759 	.vidioc_g_std             = vidioc_g_std,
1760 	.vidioc_s_std             = vidioc_s_std,
1761 	.vidioc_querystd          = vidioc_querystd,
1762 	.vidioc_enum_input        = vidioc_enum_input,
1763 	.vidioc_g_input           = vidioc_g_input,
1764 	.vidioc_s_input           = vidioc_s_input,
1765 	.vidioc_queryctrl         = vidioc_queryctrl,
1766 	.vidioc_g_ctrl            = vidioc_g_ctrl,
1767 	.vidioc_s_ctrl            = vidioc_s_ctrl,
1768 	.vidioc_streamon          = vidioc_streamon,
1769 	.vidioc_streamoff         = vidioc_streamoff,
1770 	.vidioc_g_tuner           = vidioc_g_tuner,
1771 	.vidioc_s_tuner           = vidioc_s_tuner,
1772 	.vidioc_g_frequency       = vidioc_g_frequency,
1773 	.vidioc_s_frequency       = vidioc_s_frequency,
1774 	.vidioc_g_parm            = vidioc_g_parm,
1775 	.vidioc_s_parm            = vidioc_s_parm,
1776 	.vidioc_enum_framesizes   = vidioc_enum_framesizes,
1777 	.vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1778 	.vidioc_cropcap           = vidioc_cropcap,
1779 	.vidioc_g_crop            = vidioc_g_crop,
1780 	.vidioc_s_crop            = vidioc_s_crop,
1781 	.vidioc_g_jpegcomp        = vidioc_g_jpegcomp,
1782 	.vidioc_s_jpegcomp        = vidioc_s_jpegcomp,
1783 };
1784 
1785 static struct video_device go7007_template = {
1786 	.name		= "go7007",
1787 	.fops		= &go7007_fops,
1788 	.release	= go7007_vfl_release,
1789 	.ioctl_ops	= &video_ioctl_ops,
1790 	.tvnorms	= V4L2_STD_ALL,
1791 	.current_norm	= V4L2_STD_NTSC,
1792 };
1793 
go7007_v4l2_init(struct go7007 * go)1794 int go7007_v4l2_init(struct go7007 *go)
1795 {
1796 	int rv;
1797 
1798 	go->video_dev = video_device_alloc();
1799 	if (go->video_dev == NULL)
1800 		return -ENOMEM;
1801 	*go->video_dev = go7007_template;
1802 	go->video_dev->parent = go->dev;
1803 	rv = video_register_device(go->video_dev, VFL_TYPE_GRABBER, -1);
1804 	if (rv < 0) {
1805 		video_device_release(go->video_dev);
1806 		go->video_dev = NULL;
1807 		return rv;
1808 	}
1809 	rv = v4l2_device_register(go->dev, &go->v4l2_dev);
1810 	if (rv < 0) {
1811 		video_device_release(go->video_dev);
1812 		go->video_dev = NULL;
1813 		return rv;
1814 	}
1815 	video_set_drvdata(go->video_dev, go);
1816 	++go->ref_count;
1817 	printk(KERN_INFO "%s: registered device %s [v4l2]\n",
1818 	       go->video_dev->name, video_device_node_name(go->video_dev));
1819 
1820 	return 0;
1821 }
1822 
go7007_v4l2_remove(struct go7007 * go)1823 void go7007_v4l2_remove(struct go7007 *go)
1824 {
1825 	unsigned long flags;
1826 
1827 	mutex_lock(&go->hw_lock);
1828 	if (go->streaming) {
1829 		go->streaming = 0;
1830 		go7007_stream_stop(go);
1831 		spin_lock_irqsave(&go->spinlock, flags);
1832 		abort_queued(go);
1833 		spin_unlock_irqrestore(&go->spinlock, flags);
1834 	}
1835 	mutex_unlock(&go->hw_lock);
1836 	if (go->video_dev)
1837 		video_unregister_device(go->video_dev);
1838 	v4l2_device_unregister(&go->v4l2_dev);
1839 }
1840