1 /*
2     ioctl system call
3     Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
4     Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 
21 #include "ivtv-driver.h"
22 #include "ivtv-version.h"
23 #include "ivtv-mailbox.h"
24 #include "ivtv-i2c.h"
25 #include "ivtv-queue.h"
26 #include "ivtv-fileops.h"
27 #include "ivtv-vbi.h"
28 #include "ivtv-routing.h"
29 #include "ivtv-streams.h"
30 #include "ivtv-yuv.h"
31 #include "ivtv-ioctl.h"
32 #include "ivtv-gpio.h"
33 #include "ivtv-controls.h"
34 #include "ivtv-cards.h"
35 #include <media/saa7127.h>
36 #include <media/tveeprom.h>
37 #include <media/v4l2-chip-ident.h>
38 #include <media/v4l2-event.h>
39 #include <linux/dvb/audio.h>
40 
41 u16 ivtv_service2vbi(int type)
42 {
43 	switch (type) {
44 		case V4L2_SLICED_TELETEXT_B:
45 			return IVTV_SLICED_TYPE_TELETEXT_B;
46 		case V4L2_SLICED_CAPTION_525:
47 			return IVTV_SLICED_TYPE_CAPTION_525;
48 		case V4L2_SLICED_WSS_625:
49 			return IVTV_SLICED_TYPE_WSS_625;
50 		case V4L2_SLICED_VPS:
51 			return IVTV_SLICED_TYPE_VPS;
52 		default:
53 			return 0;
54 	}
55 }
56 
57 static int valid_service_line(int field, int line, int is_pal)
58 {
59 	return (is_pal && line >= 6 && (line != 23 || field == 0)) ||
60 	       (!is_pal && line >= 10 && line < 22);
61 }
62 
63 static u16 select_service_from_set(int field, int line, u16 set, int is_pal)
64 {
65 	u16 valid_set = (is_pal ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525);
66 	int i;
67 
68 	set = set & valid_set;
69 	if (set == 0 || !valid_service_line(field, line, is_pal)) {
70 		return 0;
71 	}
72 	if (!is_pal) {
73 		if (line == 21 && (set & V4L2_SLICED_CAPTION_525))
74 			return V4L2_SLICED_CAPTION_525;
75 	}
76 	else {
77 		if (line == 16 && field == 0 && (set & V4L2_SLICED_VPS))
78 			return V4L2_SLICED_VPS;
79 		if (line == 23 && field == 0 && (set & V4L2_SLICED_WSS_625))
80 			return V4L2_SLICED_WSS_625;
81 		if (line == 23)
82 			return 0;
83 	}
84 	for (i = 0; i < 32; i++) {
85 		if ((1 << i) & set)
86 			return 1 << i;
87 	}
88 	return 0;
89 }
90 
91 void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
92 {
93 	u16 set = fmt->service_set;
94 	int f, l;
95 
96 	fmt->service_set = 0;
97 	for (f = 0; f < 2; f++) {
98 		for (l = 0; l < 24; l++) {
99 			fmt->service_lines[f][l] = select_service_from_set(f, l, set, is_pal);
100 		}
101 	}
102 }
103 
104 static void check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
105 {
106 	int f, l;
107 
108 	for (f = 0; f < 2; f++) {
109 		for (l = 0; l < 24; l++) {
110 			fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
111 		}
112 	}
113 }
114 
115 u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt)
116 {
117 	int f, l;
118 	u16 set = 0;
119 
120 	for (f = 0; f < 2; f++) {
121 		for (l = 0; l < 24; l++) {
122 			set |= fmt->service_lines[f][l];
123 		}
124 	}
125 	return set;
126 }
127 
128 void ivtv_set_osd_alpha(struct ivtv *itv)
129 {
130 	ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
131 		itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
132 	ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
133 }
134 
135 int ivtv_set_speed(struct ivtv *itv, int speed)
136 {
137 	u32 data[CX2341X_MBOX_MAX_DATA];
138 	int single_step = (speed == 1 || speed == -1);
139 	DEFINE_WAIT(wait);
140 
141 	if (speed == 0) speed = 1000;
142 
143 	/* No change? */
144 	if (speed == itv->speed && !single_step)
145 		return 0;
146 
147 	if (single_step && (speed < 0) == (itv->speed < 0)) {
148 		/* Single step video and no need to change direction */
149 		ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
150 		itv->speed = speed;
151 		return 0;
152 	}
153 	if (single_step)
154 		/* Need to change direction */
155 		speed = speed < 0 ? -1000 : 1000;
156 
157 	data[0] = (speed > 1000 || speed < -1000) ? 0x80000000 : 0;
158 	data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0;
159 	data[1] = (speed < 0);
160 	data[2] = speed < 0 ? 3 : 7;
161 	data[3] = v4l2_ctrl_g_ctrl(itv->cxhdl.video_b_frames);
162 	data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0;
163 	data[5] = 0;
164 	data[6] = 0;
165 
166 	if (speed == 1500 || speed == -1500) data[0] |= 1;
167 	else if (speed == 2000 || speed == -2000) data[0] |= 2;
168 	else if (speed > -1000 && speed < 0) data[0] |= (-1000 / speed);
169 	else if (speed < 1000 && speed > 0) data[0] |= (1000 / speed);
170 
171 	/* If not decoding, just change speed setting */
172 	if (atomic_read(&itv->decoding) > 0) {
173 		int got_sig = 0;
174 
175 		/* Stop all DMA and decoding activity */
176 		ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
177 
178 		/* Wait for any DMA to finish */
179 		mutex_unlock(&itv->serialize_lock);
180 		prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE);
181 		while (test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
182 			got_sig = signal_pending(current);
183 			if (got_sig)
184 				break;
185 			got_sig = 0;
186 			schedule();
187 		}
188 		finish_wait(&itv->dma_waitq, &wait);
189 		mutex_lock(&itv->serialize_lock);
190 		if (got_sig)
191 			return -EINTR;
192 
193 		/* Change Speed safely */
194 		ivtv_api(itv, CX2341X_DEC_SET_PLAYBACK_SPEED, 7, data);
195 		IVTV_DEBUG_INFO("Setting Speed to 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
196 				data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
197 	}
198 	if (single_step) {
199 		speed = (speed < 0) ? -1 : 1;
200 		ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
201 	}
202 	itv->speed = speed;
203 	return 0;
204 }
205 
206 static int ivtv_validate_speed(int cur_speed, int new_speed)
207 {
208 	int fact = new_speed < 0 ? -1 : 1;
209 	int s;
210 
211 	if (cur_speed == 0)
212 		cur_speed = 1000;
213 	if (new_speed < 0)
214 		new_speed = -new_speed;
215 	if (cur_speed < 0)
216 		cur_speed = -cur_speed;
217 
218 	if (cur_speed <= new_speed) {
219 		if (new_speed > 1500)
220 			return fact * 2000;
221 		if (new_speed > 1000)
222 			return fact * 1500;
223 	}
224 	else {
225 		if (new_speed >= 2000)
226 			return fact * 2000;
227 		if (new_speed >= 1500)
228 			return fact * 1500;
229 		if (new_speed >= 1000)
230 			return fact * 1000;
231 	}
232 	if (new_speed == 0)
233 		return 1000;
234 	if (new_speed == 1 || new_speed == 1000)
235 		return fact * new_speed;
236 
237 	s = new_speed;
238 	new_speed = 1000 / new_speed;
239 	if (1000 / cur_speed == new_speed)
240 		new_speed += (cur_speed < s) ? -1 : 1;
241 	if (new_speed > 60) return 1000 / (fact * 60);
242 	return 1000 / (fact * new_speed);
243 }
244 
245 static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
246 		struct v4l2_decoder_cmd *dc, int try)
247 {
248 	struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
249 
250 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
251 		return -EINVAL;
252 
253 	switch (dc->cmd) {
254 	case V4L2_DEC_CMD_START: {
255 		dc->flags &= V4L2_DEC_CMD_START_MUTE_AUDIO;
256 		dc->start.speed = ivtv_validate_speed(itv->speed, dc->start.speed);
257 		if (dc->start.speed < 0)
258 			dc->start.format = V4L2_DEC_START_FMT_GOP;
259 		else
260 			dc->start.format = V4L2_DEC_START_FMT_NONE;
261 		if (dc->start.speed != 500 && dc->start.speed != 1500)
262 			dc->flags = dc->start.speed == 1000 ? 0 :
263 					V4L2_DEC_CMD_START_MUTE_AUDIO;
264 		if (try) break;
265 
266 		itv->speed_mute_audio = dc->flags & V4L2_DEC_CMD_START_MUTE_AUDIO;
267 		if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
268 			return -EBUSY;
269 		if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
270 			/* forces ivtv_set_speed to be called */
271 			itv->speed = 0;
272 		}
273 		return ivtv_start_decoding(id, dc->start.speed);
274 	}
275 
276 	case V4L2_DEC_CMD_STOP:
277 		dc->flags &= V4L2_DEC_CMD_STOP_IMMEDIATELY | V4L2_DEC_CMD_STOP_TO_BLACK;
278 		if (dc->flags & V4L2_DEC_CMD_STOP_IMMEDIATELY)
279 			dc->stop.pts = 0;
280 		if (try) break;
281 		if (atomic_read(&itv->decoding) == 0)
282 			return 0;
283 		if (itv->output_mode != OUT_MPG)
284 			return -EBUSY;
285 
286 		itv->output_mode = OUT_NONE;
287 		return ivtv_stop_v4l2_decode_stream(s, dc->flags, dc->stop.pts);
288 
289 	case V4L2_DEC_CMD_PAUSE:
290 		dc->flags &= V4L2_DEC_CMD_PAUSE_TO_BLACK;
291 		if (try) break;
292 		if (!atomic_read(&itv->decoding))
293 			return -EPERM;
294 		if (itv->output_mode != OUT_MPG)
295 			return -EBUSY;
296 		if (atomic_read(&itv->decoding) > 0) {
297 			ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
298 				(dc->flags & V4L2_DEC_CMD_PAUSE_TO_BLACK) ? 1 : 0);
299 			set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
300 		}
301 		break;
302 
303 	case V4L2_DEC_CMD_RESUME:
304 		dc->flags = 0;
305 		if (try) break;
306 		if (!atomic_read(&itv->decoding))
307 			return -EPERM;
308 		if (itv->output_mode != OUT_MPG)
309 			return -EBUSY;
310 		if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
311 			int speed = itv->speed;
312 			itv->speed = 0;
313 			return ivtv_start_decoding(id, speed);
314 		}
315 		break;
316 
317 	default:
318 		return -EINVAL;
319 	}
320 	return 0;
321 }
322 
323 static int ivtv_g_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
324 {
325 	struct ivtv *itv = fh2id(fh)->itv;
326 	struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
327 
328 	vbifmt->reserved[0] = 0;
329 	vbifmt->reserved[1] = 0;
330 	if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
331 		return -EINVAL;
332 	vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
333 	memset(vbifmt->service_lines, 0, sizeof(vbifmt->service_lines));
334 	if (itv->is_60hz) {
335 		vbifmt->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
336 		vbifmt->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
337 	} else {
338 		vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625;
339 		vbifmt->service_lines[0][16] = V4L2_SLICED_VPS;
340 	}
341 	vbifmt->service_set = ivtv_get_service_set(vbifmt);
342 	return 0;
343 }
344 
345 static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
346 {
347 	struct ivtv_open_id *id = fh2id(fh);
348 	struct ivtv *itv = id->itv;
349 	struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
350 
351 	pixfmt->width = itv->cxhdl.width;
352 	pixfmt->height = itv->cxhdl.height;
353 	pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
354 	pixfmt->field = V4L2_FIELD_INTERLACED;
355 	pixfmt->priv = 0;
356 	if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
357 		pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
358 		/* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
359 		pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
360 		pixfmt->bytesperline = 720;
361 	} else {
362 		pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
363 		pixfmt->sizeimage = 128 * 1024;
364 		pixfmt->bytesperline = 0;
365 	}
366 	return 0;
367 }
368 
369 static int ivtv_g_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
370 {
371 	struct ivtv *itv = fh2id(fh)->itv;
372 	struct v4l2_vbi_format *vbifmt = &fmt->fmt.vbi;
373 
374 	vbifmt->sampling_rate = 27000000;
375 	vbifmt->offset = 248;
376 	vbifmt->samples_per_line = itv->vbi.raw_decoder_line_size - 4;
377 	vbifmt->sample_format = V4L2_PIX_FMT_GREY;
378 	vbifmt->start[0] = itv->vbi.start[0];
379 	vbifmt->start[1] = itv->vbi.start[1];
380 	vbifmt->count[0] = vbifmt->count[1] = itv->vbi.count;
381 	vbifmt->flags = 0;
382 	vbifmt->reserved[0] = 0;
383 	vbifmt->reserved[1] = 0;
384 	return 0;
385 }
386 
387 static int ivtv_g_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
388 {
389 	struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
390 	struct ivtv_open_id *id = fh2id(fh);
391 	struct ivtv *itv = id->itv;
392 
393 	vbifmt->reserved[0] = 0;
394 	vbifmt->reserved[1] = 0;
395 	vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
396 
397 	if (id->type == IVTV_DEC_STREAM_TYPE_VBI) {
398 		vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
399 			V4L2_SLICED_VBI_525;
400 		ivtv_expand_service_set(vbifmt, itv->is_50hz);
401 		vbifmt->service_set = ivtv_get_service_set(vbifmt);
402 		return 0;
403 	}
404 
405 	v4l2_subdev_call(itv->sd_video, vbi, g_sliced_fmt, vbifmt);
406 	vbifmt->service_set = ivtv_get_service_set(vbifmt);
407 	return 0;
408 }
409 
410 static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
411 {
412 	struct ivtv_open_id *id = fh2id(fh);
413 	struct ivtv *itv = id->itv;
414 	struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
415 
416 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
417 		return -EINVAL;
418 	pixfmt->width = itv->main_rect.width;
419 	pixfmt->height = itv->main_rect.height;
420 	pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
421 	pixfmt->field = V4L2_FIELD_INTERLACED;
422 	pixfmt->priv = 0;
423 	if (id->type == IVTV_DEC_STREAM_TYPE_YUV) {
424 		switch (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) {
425 		case IVTV_YUV_MODE_INTERLACED:
426 			pixfmt->field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) ?
427 				V4L2_FIELD_INTERLACED_BT : V4L2_FIELD_INTERLACED_TB;
428 			break;
429 		case IVTV_YUV_MODE_PROGRESSIVE:
430 			pixfmt->field = V4L2_FIELD_NONE;
431 			break;
432 		default:
433 			pixfmt->field = V4L2_FIELD_ANY;
434 			break;
435 		}
436 		pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
437 		pixfmt->bytesperline = 720;
438 		pixfmt->width = itv->yuv_info.v4l2_src_w;
439 		pixfmt->height = itv->yuv_info.v4l2_src_h;
440 		/* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
441 		pixfmt->sizeimage =
442 			1080 * ((pixfmt->height + 31) & ~31);
443 	} else {
444 		pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
445 		pixfmt->sizeimage = 128 * 1024;
446 		pixfmt->bytesperline = 0;
447 	}
448 	return 0;
449 }
450 
451 static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
452 {
453 	struct ivtv *itv = fh2id(fh)->itv;
454 	struct v4l2_window *winfmt = &fmt->fmt.win;
455 
456 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
457 		return -EINVAL;
458 	winfmt->chromakey = itv->osd_chroma_key;
459 	winfmt->global_alpha = itv->osd_global_alpha;
460 	winfmt->field = V4L2_FIELD_INTERLACED;
461 	winfmt->clips = NULL;
462 	winfmt->clipcount = 0;
463 	winfmt->bitmap = NULL;
464 	winfmt->w.top = winfmt->w.left = 0;
465 	winfmt->w.width = itv->osd_rect.width;
466 	winfmt->w.height = itv->osd_rect.height;
467 	return 0;
468 }
469 
470 static int ivtv_try_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
471 {
472 	return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
473 }
474 
475 static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
476 {
477 	struct ivtv_open_id *id = fh2id(fh);
478 	struct ivtv *itv = id->itv;
479 	int w = fmt->fmt.pix.width;
480 	int h = fmt->fmt.pix.height;
481 	int min_h = 2;
482 
483 	w = min(w, 720);
484 	w = max(w, 2);
485 	if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
486 		/* YUV height must be a multiple of 32 */
487 		h &= ~0x1f;
488 		min_h = 32;
489 	}
490 	h = min(h, itv->is_50hz ? 576 : 480);
491 	h = max(h, min_h);
492 	ivtv_g_fmt_vid_cap(file, fh, fmt);
493 	fmt->fmt.pix.width = w;
494 	fmt->fmt.pix.height = h;
495 	return 0;
496 }
497 
498 static int ivtv_try_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
499 {
500 	return ivtv_g_fmt_vbi_cap(file, fh, fmt);
501 }
502 
503 static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
504 {
505 	struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
506 	struct ivtv_open_id *id = fh2id(fh);
507 	struct ivtv *itv = id->itv;
508 
509 	if (id->type == IVTV_DEC_STREAM_TYPE_VBI)
510 		return ivtv_g_fmt_sliced_vbi_cap(file, fh, fmt);
511 
512 	/* set sliced VBI capture format */
513 	vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
514 	vbifmt->reserved[0] = 0;
515 	vbifmt->reserved[1] = 0;
516 
517 	if (vbifmt->service_set)
518 		ivtv_expand_service_set(vbifmt, itv->is_50hz);
519 	check_service_set(vbifmt, itv->is_50hz);
520 	vbifmt->service_set = ivtv_get_service_set(vbifmt);
521 	return 0;
522 }
523 
524 static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
525 {
526 	struct ivtv_open_id *id = fh2id(fh);
527 	s32 w = fmt->fmt.pix.width;
528 	s32 h = fmt->fmt.pix.height;
529 	int field = fmt->fmt.pix.field;
530 	int ret = ivtv_g_fmt_vid_out(file, fh, fmt);
531 
532 	w = min(w, 720);
533 	w = max(w, 2);
534 	/* Why can the height be 576 even when the output is NTSC?
535 
536 	   Internally the buffers of the PVR350 are always set to 720x576. The
537 	   decoded video frame will always be placed in the top left corner of
538 	   this buffer. For any video which is not 720x576, the buffer will
539 	   then be cropped to remove the unused right and lower areas, with
540 	   the remaining image being scaled by the hardware to fit the display
541 	   area. The video can be scaled both up and down, so a 720x480 video
542 	   can be displayed full-screen on PAL and a 720x576 video can be
543 	   displayed without cropping on NTSC.
544 
545 	   Note that the scaling only occurs on the video stream, the osd
546 	   resolution is locked to the broadcast standard and not scaled.
547 
548 	   Thanks to Ian Armstrong for this explanation. */
549 	h = min(h, 576);
550 	h = max(h, 2);
551 	if (id->type == IVTV_DEC_STREAM_TYPE_YUV)
552 		fmt->fmt.pix.field = field;
553 	fmt->fmt.pix.width = w;
554 	fmt->fmt.pix.height = h;
555 	return ret;
556 }
557 
558 static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
559 {
560 	struct ivtv *itv = fh2id(fh)->itv;
561 	u32 chromakey = fmt->fmt.win.chromakey;
562 	u8 global_alpha = fmt->fmt.win.global_alpha;
563 
564 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
565 		return -EINVAL;
566 	ivtv_g_fmt_vid_out_overlay(file, fh, fmt);
567 	fmt->fmt.win.chromakey = chromakey;
568 	fmt->fmt.win.global_alpha = global_alpha;
569 	return 0;
570 }
571 
572 static int ivtv_s_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
573 {
574 	return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
575 }
576 
577 static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
578 {
579 	struct ivtv_open_id *id = fh2id(fh);
580 	struct ivtv *itv = id->itv;
581 	struct v4l2_mbus_framefmt mbus_fmt;
582 	int ret = ivtv_try_fmt_vid_cap(file, fh, fmt);
583 	int w = fmt->fmt.pix.width;
584 	int h = fmt->fmt.pix.height;
585 
586 	if (ret)
587 		return ret;
588 
589 	if (itv->cxhdl.width == w && itv->cxhdl.height == h)
590 		return 0;
591 
592 	if (atomic_read(&itv->capturing) > 0)
593 		return -EBUSY;
594 
595 	itv->cxhdl.width = w;
596 	itv->cxhdl.height = h;
597 	if (v4l2_ctrl_g_ctrl(itv->cxhdl.video_encoding) == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
598 		fmt->fmt.pix.width /= 2;
599 	mbus_fmt.width = fmt->fmt.pix.width;
600 	mbus_fmt.height = h;
601 	mbus_fmt.code = V4L2_MBUS_FMT_FIXED;
602 	v4l2_subdev_call(itv->sd_video, video, s_mbus_fmt, &mbus_fmt);
603 	return ivtv_g_fmt_vid_cap(file, fh, fmt);
604 }
605 
606 static int ivtv_s_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
607 {
608 	struct ivtv *itv = fh2id(fh)->itv;
609 
610 	if (!ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
611 		return -EBUSY;
612 	itv->vbi.sliced_in->service_set = 0;
613 	itv->vbi.in.type = V4L2_BUF_TYPE_VBI_CAPTURE;
614 	v4l2_subdev_call(itv->sd_video, vbi, s_raw_fmt, &fmt->fmt.vbi);
615 	return ivtv_g_fmt_vbi_cap(file, fh, fmt);
616 }
617 
618 static int ivtv_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
619 {
620 	struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
621 	struct ivtv_open_id *id = fh2id(fh);
622 	struct ivtv *itv = id->itv;
623 	int ret = ivtv_try_fmt_sliced_vbi_cap(file, fh, fmt);
624 
625 	if (ret || id->type == IVTV_DEC_STREAM_TYPE_VBI)
626 		return ret;
627 
628 	check_service_set(vbifmt, itv->is_50hz);
629 	if (ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
630 		return -EBUSY;
631 	itv->vbi.in.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
632 	v4l2_subdev_call(itv->sd_video, vbi, s_sliced_fmt, vbifmt);
633 	memcpy(itv->vbi.sliced_in, vbifmt, sizeof(*itv->vbi.sliced_in));
634 	return 0;
635 }
636 
637 static int ivtv_s_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
638 {
639 	struct ivtv_open_id *id = fh2id(fh);
640 	struct ivtv *itv = id->itv;
641 	struct yuv_playback_info *yi = &itv->yuv_info;
642 	int ret = ivtv_try_fmt_vid_out(file, fh, fmt);
643 
644 	if (ret)
645 		return ret;
646 
647 	if (id->type != IVTV_DEC_STREAM_TYPE_YUV)
648 		return 0;
649 
650 	/* Return now if we already have some frame data */
651 	if (yi->stream_size)
652 		return -EBUSY;
653 
654 	yi->v4l2_src_w = fmt->fmt.pix.width;
655 	yi->v4l2_src_h = fmt->fmt.pix.height;
656 
657 	switch (fmt->fmt.pix.field) {
658 	case V4L2_FIELD_NONE:
659 		yi->lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
660 		break;
661 	case V4L2_FIELD_ANY:
662 		yi->lace_mode = IVTV_YUV_MODE_AUTO;
663 		break;
664 	case V4L2_FIELD_INTERLACED_BT:
665 		yi->lace_mode =
666 			IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
667 		break;
668 	case V4L2_FIELD_INTERLACED_TB:
669 	default:
670 		yi->lace_mode = IVTV_YUV_MODE_INTERLACED;
671 		break;
672 	}
673 	yi->lace_sync_field = (yi->lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
674 
675 	if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
676 		itv->dma_data_req_size =
677 			1080 * ((yi->v4l2_src_h + 31) & ~31);
678 
679 	return 0;
680 }
681 
682 static int ivtv_s_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
683 {
684 	struct ivtv *itv = fh2id(fh)->itv;
685 	int ret = ivtv_try_fmt_vid_out_overlay(file, fh, fmt);
686 
687 	if (ret == 0) {
688 		itv->osd_chroma_key = fmt->fmt.win.chromakey;
689 		itv->osd_global_alpha = fmt->fmt.win.global_alpha;
690 		ivtv_set_osd_alpha(itv);
691 	}
692 	return ret;
693 }
694 
695 static int ivtv_g_chip_ident(struct file *file, void *fh, struct v4l2_dbg_chip_ident *chip)
696 {
697 	struct ivtv *itv = fh2id(fh)->itv;
698 
699 	chip->ident = V4L2_IDENT_NONE;
700 	chip->revision = 0;
701 	if (chip->match.type == V4L2_CHIP_MATCH_HOST) {
702 		if (v4l2_chip_match_host(&chip->match))
703 			chip->ident = itv->has_cx23415 ? V4L2_IDENT_CX23415 : V4L2_IDENT_CX23416;
704 		return 0;
705 	}
706 	if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER &&
707 	    chip->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
708 		return -EINVAL;
709 	/* TODO: is this correct? */
710 	return ivtv_call_all_err(itv, core, g_chip_ident, chip);
711 }
712 
713 #ifdef CONFIG_VIDEO_ADV_DEBUG
714 static int ivtv_itvc(struct ivtv *itv, bool get, u64 reg, u64 *val)
715 {
716 	volatile u8 __iomem *reg_start;
717 
718 	if (!capable(CAP_SYS_ADMIN))
719 		return -EPERM;
720 	if (reg >= IVTV_REG_OFFSET && reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
721 		reg_start = itv->reg_mem - IVTV_REG_OFFSET;
722 	else if (itv->has_cx23415 && reg >= IVTV_DECODER_OFFSET &&
723 			reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
724 		reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
725 	else if (reg < IVTV_ENCODER_SIZE)
726 		reg_start = itv->enc_mem;
727 	else
728 		return -EINVAL;
729 
730 	if (get)
731 		*val = readl(reg + reg_start);
732 	else
733 		writel(*val, reg + reg_start);
734 	return 0;
735 }
736 
737 static int ivtv_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
738 {
739 	struct ivtv *itv = fh2id(fh)->itv;
740 
741 	if (v4l2_chip_match_host(&reg->match)) {
742 		reg->size = 4;
743 		return ivtv_itvc(itv, true, reg->reg, &reg->val);
744 	}
745 	/* TODO: subdev errors should not be ignored, this should become a
746 	   subdev helper function. */
747 	ivtv_call_all(itv, core, g_register, reg);
748 	return 0;
749 }
750 
751 static int ivtv_s_register(struct file *file, void *fh, const struct v4l2_dbg_register *reg)
752 {
753 	struct ivtv *itv = fh2id(fh)->itv;
754 
755 	if (v4l2_chip_match_host(&reg->match)) {
756 		u64 val = reg->val;
757 
758 		return ivtv_itvc(itv, false, reg->reg, &val);
759 	}
760 	/* TODO: subdev errors should not be ignored, this should become a
761 	   subdev helper function. */
762 	ivtv_call_all(itv, core, s_register, reg);
763 	return 0;
764 }
765 #endif
766 
767 static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vcap)
768 {
769 	struct ivtv_open_id *id = fh2id(file->private_data);
770 	struct ivtv *itv = id->itv;
771 	struct ivtv_stream *s = &itv->streams[id->type];
772 
773 	strlcpy(vcap->driver, IVTV_DRIVER_NAME, sizeof(vcap->driver));
774 	strlcpy(vcap->card, itv->card_name, sizeof(vcap->card));
775 	snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev));
776 	vcap->capabilities = itv->v4l2_cap | V4L2_CAP_DEVICE_CAPS;
777 	vcap->device_caps = s->caps;
778 	return 0;
779 }
780 
781 static int ivtv_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
782 {
783 	struct ivtv *itv = fh2id(fh)->itv;
784 
785 	return ivtv_get_audio_input(itv, vin->index, vin);
786 }
787 
788 static int ivtv_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
789 {
790 	struct ivtv *itv = fh2id(fh)->itv;
791 
792 	vin->index = itv->audio_input;
793 	return ivtv_get_audio_input(itv, vin->index, vin);
794 }
795 
796 static int ivtv_s_audio(struct file *file, void *fh, const struct v4l2_audio *vout)
797 {
798 	struct ivtv *itv = fh2id(fh)->itv;
799 
800 	if (vout->index >= itv->nof_audio_inputs)
801 		return -EINVAL;
802 
803 	itv->audio_input = vout->index;
804 	ivtv_audio_set_io(itv);
805 
806 	return 0;
807 }
808 
809 static int ivtv_enumaudout(struct file *file, void *fh, struct v4l2_audioout *vin)
810 {
811 	struct ivtv *itv = fh2id(fh)->itv;
812 
813 	/* set it to defaults from our table */
814 	return ivtv_get_audio_output(itv, vin->index, vin);
815 }
816 
817 static int ivtv_g_audout(struct file *file, void *fh, struct v4l2_audioout *vin)
818 {
819 	struct ivtv *itv = fh2id(fh)->itv;
820 
821 	vin->index = 0;
822 	return ivtv_get_audio_output(itv, vin->index, vin);
823 }
824 
825 static int ivtv_s_audout(struct file *file, void *fh, const struct v4l2_audioout *vout)
826 {
827 	struct ivtv *itv = fh2id(fh)->itv;
828 
829 	if (itv->card->video_outputs == NULL || vout->index != 0)
830 		return -EINVAL;
831 	return 0;
832 }
833 
834 static int ivtv_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
835 {
836 	struct ivtv *itv = fh2id(fh)->itv;
837 
838 	/* set it to defaults from our table */
839 	return ivtv_get_input(itv, vin->index, vin);
840 }
841 
842 static int ivtv_enum_output(struct file *file, void *fh, struct v4l2_output *vout)
843 {
844 	struct ivtv *itv = fh2id(fh)->itv;
845 
846 	return ivtv_get_output(itv, vout->index, vout);
847 }
848 
849 static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
850 {
851 	struct ivtv_open_id *id = fh2id(fh);
852 	struct ivtv *itv = id->itv;
853 	struct yuv_playback_info *yi = &itv->yuv_info;
854 	int streamtype;
855 
856 	streamtype = id->type;
857 
858 	if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
859 		return -EINVAL;
860 	cropcap->bounds.top = cropcap->bounds.left = 0;
861 	cropcap->bounds.width = 720;
862 	if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
863 		cropcap->bounds.height = itv->is_50hz ? 576 : 480;
864 		cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
865 		cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
866 	} else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
867 		if (yi->track_osd) {
868 			cropcap->bounds.width = yi->osd_full_w;
869 			cropcap->bounds.height = yi->osd_full_h;
870 		} else {
871 			cropcap->bounds.width = 720;
872 			cropcap->bounds.height =
873 					itv->is_out_50hz ? 576 : 480;
874 		}
875 		cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
876 		cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
877 	} else {
878 		cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
879 		cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
880 		cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
881 	}
882 	cropcap->defrect = cropcap->bounds;
883 	return 0;
884 }
885 
886 static int ivtv_s_crop(struct file *file, void *fh, const struct v4l2_crop *crop)
887 {
888 	struct ivtv_open_id *id = fh2id(fh);
889 	struct ivtv *itv = id->itv;
890 	struct yuv_playback_info *yi = &itv->yuv_info;
891 	int streamtype;
892 
893 	streamtype = id->type;
894 
895 	if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
896 	    (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
897 		if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
898 			yi->main_rect = crop->c;
899 			return 0;
900 		} else {
901 			if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
902 				crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
903 				itv->main_rect = crop->c;
904 				return 0;
905 			}
906 		}
907 		return -EINVAL;
908 	}
909 	return -EINVAL;
910 }
911 
912 static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
913 {
914 	struct ivtv_open_id *id = fh2id(fh);
915 	struct ivtv *itv = id->itv;
916 	struct yuv_playback_info *yi = &itv->yuv_info;
917 	int streamtype;
918 
919 	streamtype = id->type;
920 
921 	if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
922 	    (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
923 		if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
924 			crop->c = yi->main_rect;
925 		else
926 			crop->c = itv->main_rect;
927 		return 0;
928 	}
929 	return -EINVAL;
930 }
931 
932 static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
933 {
934 	static const struct v4l2_fmtdesc hm12 = {
935 		0, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0,
936 		"HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
937 		{ 0, 0, 0, 0 }
938 	};
939 	static const struct v4l2_fmtdesc mpeg = {
940 		0, V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FMT_FLAG_COMPRESSED,
941 		"MPEG", V4L2_PIX_FMT_MPEG,
942 		{ 0, 0, 0, 0 }
943 	};
944 	struct ivtv *itv = fh2id(fh)->itv;
945 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
946 
947 	if (fmt->index)
948 		return -EINVAL;
949 	if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
950 		*fmt = mpeg;
951 	else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
952 		*fmt = hm12;
953 	else
954 		return -EINVAL;
955 	return 0;
956 }
957 
958 static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
959 {
960 	static const struct v4l2_fmtdesc hm12 = {
961 		0, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0,
962 		"HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
963 		{ 0, 0, 0, 0 }
964 	};
965 	static const struct v4l2_fmtdesc mpeg = {
966 		0, V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_FMT_FLAG_COMPRESSED,
967 		"MPEG", V4L2_PIX_FMT_MPEG,
968 		{ 0, 0, 0, 0 }
969 	};
970 	struct ivtv *itv = fh2id(fh)->itv;
971 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
972 
973 	if (fmt->index)
974 		return -EINVAL;
975 	if (s->type == IVTV_DEC_STREAM_TYPE_MPG)
976 		*fmt = mpeg;
977 	else if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
978 		*fmt = hm12;
979 	else
980 		return -EINVAL;
981 	return 0;
982 }
983 
984 static int ivtv_g_input(struct file *file, void *fh, unsigned int *i)
985 {
986 	struct ivtv *itv = fh2id(fh)->itv;
987 
988 	*i = itv->active_input;
989 
990 	return 0;
991 }
992 
993 int ivtv_s_input(struct file *file, void *fh, unsigned int inp)
994 {
995 	struct ivtv *itv = fh2id(fh)->itv;
996 	v4l2_std_id std;
997 	int i;
998 
999 	if (inp >= itv->nof_inputs)
1000 		return -EINVAL;
1001 
1002 	if (inp == itv->active_input) {
1003 		IVTV_DEBUG_INFO("Input unchanged\n");
1004 		return 0;
1005 	}
1006 
1007 	if (atomic_read(&itv->capturing) > 0) {
1008 		return -EBUSY;
1009 	}
1010 
1011 	IVTV_DEBUG_INFO("Changing input from %d to %d\n",
1012 			itv->active_input, inp);
1013 
1014 	itv->active_input = inp;
1015 	/* Set the audio input to whatever is appropriate for the
1016 	   input type. */
1017 	itv->audio_input = itv->card->video_inputs[inp].audio_index;
1018 
1019 	if (itv->card->video_inputs[inp].video_type == IVTV_CARD_INPUT_VID_TUNER)
1020 		std = itv->tuner_std;
1021 	else
1022 		std = V4L2_STD_ALL;
1023 	for (i = 0; i <= IVTV_ENC_STREAM_TYPE_VBI; i++)
1024 		itv->streams[i].vdev->tvnorms = std;
1025 
1026 	/* prevent others from messing with the streams until
1027 	   we're finished changing inputs. */
1028 	ivtv_mute(itv);
1029 	ivtv_video_set_io(itv);
1030 	ivtv_audio_set_io(itv);
1031 	ivtv_unmute(itv);
1032 
1033 	return 0;
1034 }
1035 
1036 static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
1037 {
1038 	struct ivtv *itv = fh2id(fh)->itv;
1039 
1040 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1041 		return -EINVAL;
1042 
1043 	*i = itv->active_output;
1044 
1045 	return 0;
1046 }
1047 
1048 static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
1049 {
1050 	struct ivtv *itv = fh2id(fh)->itv;
1051 
1052 	if (outp >= itv->card->nof_outputs)
1053 		return -EINVAL;
1054 
1055 	if (outp == itv->active_output) {
1056 		IVTV_DEBUG_INFO("Output unchanged\n");
1057 		return 0;
1058 	}
1059 	IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1060 		   itv->active_output, outp);
1061 
1062 	itv->active_output = outp;
1063 	ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
1064 			SAA7127_INPUT_TYPE_NORMAL,
1065 			itv->card->video_outputs[outp].video_output, 0);
1066 
1067 	return 0;
1068 }
1069 
1070 static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1071 {
1072 	struct ivtv *itv = fh2id(fh)->itv;
1073 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
1074 
1075 	if (s->vdev->vfl_dir)
1076 		return -ENOTTY;
1077 	if (vf->tuner != 0)
1078 		return -EINVAL;
1079 
1080 	ivtv_call_all(itv, tuner, g_frequency, vf);
1081 	return 0;
1082 }
1083 
1084 int ivtv_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)
1085 {
1086 	struct ivtv *itv = fh2id(fh)->itv;
1087 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
1088 
1089 	if (s->vdev->vfl_dir)
1090 		return -ENOTTY;
1091 	if (vf->tuner != 0)
1092 		return -EINVAL;
1093 
1094 	ivtv_mute(itv);
1095 	IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf->frequency);
1096 	ivtv_call_all(itv, tuner, s_frequency, vf);
1097 	ivtv_unmute(itv);
1098 	return 0;
1099 }
1100 
1101 static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
1102 {
1103 	struct ivtv *itv = fh2id(fh)->itv;
1104 
1105 	*std = itv->std;
1106 	return 0;
1107 }
1108 
1109 void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id std)
1110 {
1111 	itv->std = std;
1112 	itv->is_60hz = (std & V4L2_STD_525_60) ? 1 : 0;
1113 	itv->is_50hz = !itv->is_60hz;
1114 	cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz);
1115 	itv->cxhdl.width = 720;
1116 	itv->cxhdl.height = itv->is_50hz ? 576 : 480;
1117 	itv->vbi.count = itv->is_50hz ? 18 : 12;
1118 	itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1119 	itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1120 
1121 	if (itv->hw_flags & IVTV_HW_CX25840)
1122 		itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1123 
1124 	/* Tuner */
1125 	ivtv_call_all(itv, core, s_std, itv->std);
1126 }
1127 
1128 void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id std)
1129 {
1130 	struct yuv_playback_info *yi = &itv->yuv_info;
1131 	DEFINE_WAIT(wait);
1132 	int f;
1133 
1134 	/* set display standard */
1135 	itv->std_out = std;
1136 	itv->is_out_60hz = (std & V4L2_STD_525_60) ? 1 : 0;
1137 	itv->is_out_50hz = !itv->is_out_60hz;
1138 	ivtv_call_all(itv, video, s_std_output, itv->std_out);
1139 
1140 	/*
1141 	 * The next firmware call is time sensitive. Time it to
1142 	 * avoid risk of a hard lock, by trying to ensure the call
1143 	 * happens within the first 100 lines of the top field.
1144 	 * Make 4 attempts to sync to the decoder before giving up.
1145 	 */
1146 	mutex_unlock(&itv->serialize_lock);
1147 	for (f = 0; f < 4; f++) {
1148 		prepare_to_wait(&itv->vsync_waitq, &wait,
1149 				TASK_UNINTERRUPTIBLE);
1150 		if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
1151 			break;
1152 		schedule_timeout(msecs_to_jiffies(25));
1153 	}
1154 	finish_wait(&itv->vsync_waitq, &wait);
1155 	mutex_lock(&itv->serialize_lock);
1156 
1157 	if (f == 4)
1158 		IVTV_WARN("Mode change failed to sync to decoder\n");
1159 
1160 	ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1161 	itv->main_rect.left = 0;
1162 	itv->main_rect.top = 0;
1163 	itv->main_rect.width = 720;
1164 	itv->main_rect.height = itv->is_out_50hz ? 576 : 480;
1165 	ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1166 		720, itv->main_rect.height, 0, 0);
1167 	yi->main_rect = itv->main_rect;
1168 	if (!itv->osd_info) {
1169 		yi->osd_full_w = 720;
1170 		yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1171 	}
1172 }
1173 
1174 static int ivtv_s_std(struct file *file, void *fh, v4l2_std_id std)
1175 {
1176 	struct ivtv *itv = fh2id(fh)->itv;
1177 
1178 	if ((std & V4L2_STD_ALL) == 0)
1179 		return -EINVAL;
1180 
1181 	if (std == itv->std)
1182 		return 0;
1183 
1184 	if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1185 	    atomic_read(&itv->capturing) > 0 ||
1186 	    atomic_read(&itv->decoding) > 0) {
1187 		/* Switching standard would mess with already running
1188 		   streams, prevent that by returning EBUSY. */
1189 		return -EBUSY;
1190 	}
1191 
1192 	IVTV_DEBUG_INFO("Switching standard to %llx.\n",
1193 		(unsigned long long)itv->std);
1194 
1195 	ivtv_s_std_enc(itv, std);
1196 	if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
1197 		ivtv_s_std_dec(itv, std);
1198 
1199 	return 0;
1200 }
1201 
1202 static int ivtv_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)
1203 {
1204 	struct ivtv_open_id *id = fh2id(fh);
1205 	struct ivtv *itv = id->itv;
1206 
1207 	if (vt->index != 0)
1208 		return -EINVAL;
1209 
1210 	ivtv_call_all(itv, tuner, s_tuner, vt);
1211 
1212 	return 0;
1213 }
1214 
1215 static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1216 {
1217 	struct ivtv *itv = fh2id(fh)->itv;
1218 
1219 	if (vt->index != 0)
1220 		return -EINVAL;
1221 
1222 	ivtv_call_all(itv, tuner, g_tuner, vt);
1223 
1224 	if (vt->type == V4L2_TUNER_RADIO)
1225 		strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
1226 	else
1227 		strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
1228 	return 0;
1229 }
1230 
1231 static int ivtv_g_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_sliced_vbi_cap *cap)
1232 {
1233 	struct ivtv *itv = fh2id(fh)->itv;
1234 	int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1235 	int f, l;
1236 
1237 	if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1238 		for (f = 0; f < 2; f++) {
1239 			for (l = 0; l < 24; l++) {
1240 				if (valid_service_line(f, l, itv->is_50hz))
1241 					cap->service_lines[f][l] = set;
1242 			}
1243 		}
1244 	} else if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1245 		if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1246 			return -EINVAL;
1247 		if (itv->is_60hz) {
1248 			cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1249 			cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1250 		} else {
1251 			cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1252 			cap->service_lines[0][16] = V4L2_SLICED_VPS;
1253 		}
1254 	} else {
1255 		return -EINVAL;
1256 	}
1257 
1258 	set = 0;
1259 	for (f = 0; f < 2; f++)
1260 		for (l = 0; l < 24; l++)
1261 			set |= cap->service_lines[f][l];
1262 	cap->service_set = set;
1263 	return 0;
1264 }
1265 
1266 static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *idx)
1267 {
1268 	struct ivtv *itv = fh2id(fh)->itv;
1269 	struct v4l2_enc_idx_entry *e = idx->entry;
1270 	int entries;
1271 	int i;
1272 
1273 	entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1274 				IVTV_MAX_PGM_INDEX;
1275 	if (entries > V4L2_ENC_IDX_ENTRIES)
1276 		entries = V4L2_ENC_IDX_ENTRIES;
1277 	idx->entries = 0;
1278 	idx->entries_cap = IVTV_MAX_PGM_INDEX;
1279 	if (!atomic_read(&itv->capturing))
1280 		return 0;
1281 	for (i = 0; i < entries; i++) {
1282 		*e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1283 		if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1284 			idx->entries++;
1285 			e++;
1286 		}
1287 	}
1288 	itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1289 	return 0;
1290 }
1291 
1292 static int ivtv_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1293 {
1294 	struct ivtv_open_id *id = fh2id(fh);
1295 	struct ivtv *itv = id->itv;
1296 
1297 
1298 	switch (enc->cmd) {
1299 	case V4L2_ENC_CMD_START:
1300 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1301 		enc->flags = 0;
1302 		return ivtv_start_capture(id);
1303 
1304 	case V4L2_ENC_CMD_STOP:
1305 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1306 		enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1307 		ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1308 		return 0;
1309 
1310 	case V4L2_ENC_CMD_PAUSE:
1311 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1312 		enc->flags = 0;
1313 
1314 		if (!atomic_read(&itv->capturing))
1315 			return -EPERM;
1316 		if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1317 			return 0;
1318 
1319 		ivtv_mute(itv);
1320 		ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1321 		break;
1322 
1323 	case V4L2_ENC_CMD_RESUME:
1324 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1325 		enc->flags = 0;
1326 
1327 		if (!atomic_read(&itv->capturing))
1328 			return -EPERM;
1329 
1330 		if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1331 			return 0;
1332 
1333 		ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1334 		ivtv_unmute(itv);
1335 		break;
1336 	default:
1337 		IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1338 		return -EINVAL;
1339 	}
1340 
1341 	return 0;
1342 }
1343 
1344 static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1345 {
1346 	struct ivtv *itv = fh2id(fh)->itv;
1347 
1348 	switch (enc->cmd) {
1349 	case V4L2_ENC_CMD_START:
1350 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1351 		enc->flags = 0;
1352 		return 0;
1353 
1354 	case V4L2_ENC_CMD_STOP:
1355 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1356 		enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1357 		return 0;
1358 
1359 	case V4L2_ENC_CMD_PAUSE:
1360 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1361 		enc->flags = 0;
1362 		return 0;
1363 
1364 	case V4L2_ENC_CMD_RESUME:
1365 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1366 		enc->flags = 0;
1367 		return 0;
1368 	default:
1369 		IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1370 		return -EINVAL;
1371 	}
1372 }
1373 
1374 static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1375 {
1376 	struct ivtv *itv = fh2id(fh)->itv;
1377 	u32 data[CX2341X_MBOX_MAX_DATA];
1378 	struct yuv_playback_info *yi = &itv->yuv_info;
1379 
1380 	int pixfmt;
1381 	static u32 pixel_format[16] = {
1382 		V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1383 		V4L2_PIX_FMT_RGB565,
1384 		V4L2_PIX_FMT_RGB555,
1385 		V4L2_PIX_FMT_RGB444,
1386 		V4L2_PIX_FMT_RGB32,
1387 		0,
1388 		0,
1389 		0,
1390 		V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1391 		V4L2_PIX_FMT_YUV565,
1392 		V4L2_PIX_FMT_YUV555,
1393 		V4L2_PIX_FMT_YUV444,
1394 		V4L2_PIX_FMT_YUV32,
1395 		0,
1396 		0,
1397 		0,
1398 	};
1399 
1400 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1401 		return -EINVAL;
1402 	if (!itv->osd_video_pbase)
1403 		return -EINVAL;
1404 
1405 	fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1406 		V4L2_FBUF_CAP_GLOBAL_ALPHA;
1407 
1408 	ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1409 	data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1410 	pixfmt = (data[0] >> 3) & 0xf;
1411 
1412 	fb->fmt.pixelformat = pixel_format[pixfmt];
1413 	fb->fmt.width = itv->osd_rect.width;
1414 	fb->fmt.height = itv->osd_rect.height;
1415 	fb->fmt.field = V4L2_FIELD_INTERLACED;
1416 	fb->fmt.bytesperline = fb->fmt.width;
1417 	fb->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
1418 	fb->fmt.field = V4L2_FIELD_INTERLACED;
1419 	fb->fmt.priv = 0;
1420 	if (fb->fmt.pixelformat != V4L2_PIX_FMT_PAL8)
1421 		fb->fmt.bytesperline *= 2;
1422 	if (fb->fmt.pixelformat == V4L2_PIX_FMT_RGB32 ||
1423 	    fb->fmt.pixelformat == V4L2_PIX_FMT_YUV32)
1424 		fb->fmt.bytesperline *= 2;
1425 	fb->fmt.sizeimage = fb->fmt.bytesperline * fb->fmt.height;
1426 	fb->base = (void *)itv->osd_video_pbase;
1427 	fb->flags = 0;
1428 
1429 	if (itv->osd_chroma_key_state)
1430 		fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1431 
1432 	if (itv->osd_global_alpha_state)
1433 		fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1434 
1435 	if (yi->track_osd)
1436 		fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1437 
1438 	pixfmt &= 7;
1439 
1440 	/* no local alpha for RGB565 or unknown formats */
1441 	if (pixfmt == 1 || pixfmt > 4)
1442 		return 0;
1443 
1444 	/* 16-bit formats have inverted local alpha */
1445 	if (pixfmt == 2 || pixfmt == 3)
1446 		fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1447 	else
1448 		fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1449 
1450 	if (itv->osd_local_alpha_state) {
1451 		/* 16-bit formats have inverted local alpha */
1452 		if (pixfmt == 2 || pixfmt == 3)
1453 			fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1454 		else
1455 			fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1456 	}
1457 
1458 	return 0;
1459 }
1460 
1461 static int ivtv_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *fb)
1462 {
1463 	struct ivtv_open_id *id = fh2id(fh);
1464 	struct ivtv *itv = id->itv;
1465 	struct yuv_playback_info *yi = &itv->yuv_info;
1466 
1467 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1468 		return -EINVAL;
1469 	if (!itv->osd_video_pbase)
1470 		return -EINVAL;
1471 
1472 	itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1473 	itv->osd_local_alpha_state =
1474 		(fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1475 	itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1476 	ivtv_set_osd_alpha(itv);
1477 	yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1478 	return 0;
1479 }
1480 
1481 static int ivtv_overlay(struct file *file, void *fh, unsigned int on)
1482 {
1483 	struct ivtv_open_id *id = fh2id(fh);
1484 	struct ivtv *itv = id->itv;
1485 
1486 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1487 		return -EINVAL;
1488 
1489 	ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0);
1490 
1491 	return 0;
1492 }
1493 
1494 static int ivtv_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub)
1495 {
1496 	switch (sub->type) {
1497 	case V4L2_EVENT_VSYNC:
1498 	case V4L2_EVENT_EOS:
1499 		return v4l2_event_subscribe(fh, sub, 0, NULL);
1500 	case V4L2_EVENT_CTRL:
1501 		return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
1502 	default:
1503 		return -EINVAL;
1504 	}
1505 }
1506 
1507 static int ivtv_log_status(struct file *file, void *fh)
1508 {
1509 	struct ivtv *itv = fh2id(fh)->itv;
1510 	u32 data[CX2341X_MBOX_MAX_DATA];
1511 
1512 	int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1513 	struct v4l2_input vidin;
1514 	struct v4l2_audio audin;
1515 	int i;
1516 
1517 	IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1518 	if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1519 		struct tveeprom tv;
1520 
1521 		ivtv_read_eeprom(itv, &tv);
1522 	}
1523 	ivtv_call_all(itv, core, log_status);
1524 	ivtv_get_input(itv, itv->active_input, &vidin);
1525 	ivtv_get_audio_input(itv, itv->audio_input, &audin);
1526 	IVTV_INFO("Video Input:  %s\n", vidin.name);
1527 	IVTV_INFO("Audio Input:  %s%s\n", audin.name,
1528 		(itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1529 	if (has_output) {
1530 		struct v4l2_output vidout;
1531 		struct v4l2_audioout audout;
1532 		int mode = itv->output_mode;
1533 		static const char * const output_modes[5] = {
1534 			"None",
1535 			"MPEG Streaming",
1536 			"YUV Streaming",
1537 			"YUV Frames",
1538 			"Passthrough",
1539 		};
1540 		static const char * const alpha_mode[4] = {
1541 			"None",
1542 			"Global",
1543 			"Local",
1544 			"Global and Local"
1545 		};
1546 		static const char * const pixel_format[16] = {
1547 			"ARGB Indexed",
1548 			"RGB 5:6:5",
1549 			"ARGB 1:5:5:5",
1550 			"ARGB 1:4:4:4",
1551 			"ARGB 8:8:8:8",
1552 			"5",
1553 			"6",
1554 			"7",
1555 			"AYUV Indexed",
1556 			"YUV 5:6:5",
1557 			"AYUV 1:5:5:5",
1558 			"AYUV 1:4:4:4",
1559 			"AYUV 8:8:8:8",
1560 			"13",
1561 			"14",
1562 			"15",
1563 		};
1564 
1565 		ivtv_get_output(itv, itv->active_output, &vidout);
1566 		ivtv_get_audio_output(itv, 0, &audout);
1567 		IVTV_INFO("Video Output: %s\n", vidout.name);
1568 		if (mode < 0 || mode > OUT_PASSTHROUGH)
1569 			mode = OUT_NONE;
1570 		IVTV_INFO("Output Mode:  %s\n", output_modes[mode]);
1571 		ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1572 		data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1573 		IVTV_INFO("Overlay:      %s, Alpha: %s, Pixel Format: %s\n",
1574 			data[0] & 1 ? "On" : "Off",
1575 			alpha_mode[(data[0] >> 1) & 0x3],
1576 			pixel_format[(data[0] >> 3) & 0xf]);
1577 	}
1578 	IVTV_INFO("Tuner:  %s\n",
1579 		test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1580 	v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
1581 	IVTV_INFO("Status flags:    0x%08lx\n", itv->i_flags);
1582 	for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1583 		struct ivtv_stream *s = &itv->streams[i];
1584 
1585 		if (s->vdev == NULL || s->buffers == 0)
1586 			continue;
1587 		IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1588 				(s->buffers - s->q_free.buffers) * 100 / s->buffers,
1589 				(s->buffers * s->buf_size) / 1024, s->buffers);
1590 	}
1591 
1592 	IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1593 			(long long)itv->mpg_data_received,
1594 			(long long)itv->vbi_data_inserted);
1595 	return 0;
1596 }
1597 
1598 static int ivtv_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *dec)
1599 {
1600 	struct ivtv_open_id *id = fh2id(file->private_data);
1601 	struct ivtv *itv = id->itv;
1602 
1603 	IVTV_DEBUG_IOCTL("VIDIOC_DECODER_CMD %d\n", dec->cmd);
1604 	return ivtv_video_command(itv, id, dec, false);
1605 }
1606 
1607 static int ivtv_try_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *dec)
1608 {
1609 	struct ivtv_open_id *id = fh2id(file->private_data);
1610 	struct ivtv *itv = id->itv;
1611 
1612 	IVTV_DEBUG_IOCTL("VIDIOC_TRY_DECODER_CMD %d\n", dec->cmd);
1613 	return ivtv_video_command(itv, id, dec, true);
1614 }
1615 
1616 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1617 {
1618 	struct ivtv_open_id *id = fh2id(filp->private_data);
1619 	struct ivtv *itv = id->itv;
1620 	int nonblocking = filp->f_flags & O_NONBLOCK;
1621 	struct ivtv_stream *s = &itv->streams[id->type];
1622 	unsigned long iarg = (unsigned long)arg;
1623 
1624 	switch (cmd) {
1625 	case IVTV_IOC_DMA_FRAME: {
1626 		struct ivtv_dma_frame *args = arg;
1627 
1628 		IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1629 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1630 			return -EINVAL;
1631 		if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1632 			return -EINVAL;
1633 		if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1634 			return 0;
1635 		if (ivtv_start_decoding(id, id->type)) {
1636 			return -EBUSY;
1637 		}
1638 		if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1639 			ivtv_release_stream(s);
1640 			return -EBUSY;
1641 		}
1642 		/* Mark that this file handle started the UDMA_YUV mode */
1643 		id->yuv_frames = 1;
1644 		if (args->y_source == NULL)
1645 			return 0;
1646 		return ivtv_yuv_prep_frame(itv, args);
1647 	}
1648 
1649 	case IVTV_IOC_PASSTHROUGH_MODE:
1650 		IVTV_DEBUG_IOCTL("IVTV_IOC_PASSTHROUGH_MODE\n");
1651 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1652 			return -EINVAL;
1653 		return ivtv_passthrough_mode(itv, *(int *)arg != 0);
1654 
1655 	case VIDEO_GET_PTS: {
1656 		s64 *pts = arg;
1657 		s64 frame;
1658 
1659 		IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1660 		if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1661 			*pts = s->dma_pts;
1662 			break;
1663 		}
1664 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1665 			return -EINVAL;
1666 		return ivtv_g_pts_frame(itv, pts, &frame);
1667 	}
1668 
1669 	case VIDEO_GET_FRAME_COUNT: {
1670 		s64 *frame = arg;
1671 		s64 pts;
1672 
1673 		IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1674 		if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1675 			*frame = 0;
1676 			break;
1677 		}
1678 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1679 			return -EINVAL;
1680 		return ivtv_g_pts_frame(itv, &pts, frame);
1681 	}
1682 
1683 	case VIDEO_PLAY: {
1684 		struct v4l2_decoder_cmd dc;
1685 
1686 		IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1687 		memset(&dc, 0, sizeof(dc));
1688 		dc.cmd = V4L2_DEC_CMD_START;
1689 		return ivtv_video_command(itv, id, &dc, 0);
1690 	}
1691 
1692 	case VIDEO_STOP: {
1693 		struct v4l2_decoder_cmd dc;
1694 
1695 		IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1696 		memset(&dc, 0, sizeof(dc));
1697 		dc.cmd = V4L2_DEC_CMD_STOP;
1698 		dc.flags = V4L2_DEC_CMD_STOP_TO_BLACK | V4L2_DEC_CMD_STOP_IMMEDIATELY;
1699 		return ivtv_video_command(itv, id, &dc, 0);
1700 	}
1701 
1702 	case VIDEO_FREEZE: {
1703 		struct v4l2_decoder_cmd dc;
1704 
1705 		IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1706 		memset(&dc, 0, sizeof(dc));
1707 		dc.cmd = V4L2_DEC_CMD_PAUSE;
1708 		return ivtv_video_command(itv, id, &dc, 0);
1709 	}
1710 
1711 	case VIDEO_CONTINUE: {
1712 		struct v4l2_decoder_cmd dc;
1713 
1714 		IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1715 		memset(&dc, 0, sizeof(dc));
1716 		dc.cmd = V4L2_DEC_CMD_RESUME;
1717 		return ivtv_video_command(itv, id, &dc, 0);
1718 	}
1719 
1720 	case VIDEO_COMMAND:
1721 	case VIDEO_TRY_COMMAND: {
1722 		/* Note: struct v4l2_decoder_cmd has the same layout as
1723 		   struct video_command */
1724 		struct v4l2_decoder_cmd *dc = arg;
1725 		int try = (cmd == VIDEO_TRY_COMMAND);
1726 
1727 		if (try)
1728 			IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", dc->cmd);
1729 		else
1730 			IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", dc->cmd);
1731 		return ivtv_video_command(itv, id, dc, try);
1732 	}
1733 
1734 	case VIDEO_GET_EVENT: {
1735 		struct video_event *ev = arg;
1736 		DEFINE_WAIT(wait);
1737 
1738 		IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1739 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1740 			return -EINVAL;
1741 		memset(ev, 0, sizeof(*ev));
1742 		set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1743 
1744 		while (1) {
1745 			if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1746 				ev->type = VIDEO_EVENT_DECODER_STOPPED;
1747 			else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1748 				ev->type = VIDEO_EVENT_VSYNC;
1749 				ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1750 					VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1751 				if (itv->output_mode == OUT_UDMA_YUV &&
1752 					(itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1753 								IVTV_YUV_MODE_PROGRESSIVE) {
1754 					ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1755 				}
1756 			}
1757 			if (ev->type)
1758 				return 0;
1759 			if (nonblocking)
1760 				return -EAGAIN;
1761 			/* Wait for event. Note that serialize_lock is locked,
1762 			   so to allow other processes to access the driver while
1763 			   we are waiting unlock first and later lock again. */
1764 			mutex_unlock(&itv->serialize_lock);
1765 			prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1766 			if (!test_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags) &&
1767 			    !test_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags))
1768 				schedule();
1769 			finish_wait(&itv->event_waitq, &wait);
1770 			mutex_lock(&itv->serialize_lock);
1771 			if (signal_pending(current)) {
1772 				/* return if a signal was received */
1773 				IVTV_DEBUG_INFO("User stopped wait for event\n");
1774 				return -EINTR;
1775 			}
1776 		}
1777 		break;
1778 	}
1779 
1780 	case VIDEO_SELECT_SOURCE:
1781 		IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1782 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1783 			return -EINVAL;
1784 		return ivtv_passthrough_mode(itv, iarg == VIDEO_SOURCE_DEMUX);
1785 
1786 	case AUDIO_SET_MUTE:
1787 		IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1788 		itv->speed_mute_audio = iarg;
1789 		return 0;
1790 
1791 	case AUDIO_CHANNEL_SELECT:
1792 		IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1793 		if (iarg > AUDIO_STEREO_SWAPPED)
1794 			return -EINVAL;
1795 		return v4l2_ctrl_s_ctrl(itv->ctrl_audio_playback, iarg + 1);
1796 
1797 	case AUDIO_BILINGUAL_CHANNEL_SELECT:
1798 		IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1799 		if (iarg > AUDIO_STEREO_SWAPPED)
1800 			return -EINVAL;
1801 		return v4l2_ctrl_s_ctrl(itv->ctrl_audio_multilingual_playback, iarg + 1);
1802 
1803 	default:
1804 		return -EINVAL;
1805 	}
1806 	return 0;
1807 }
1808 
1809 static long ivtv_default(struct file *file, void *fh, bool valid_prio,
1810 			 unsigned int cmd, void *arg)
1811 {
1812 	struct ivtv *itv = fh2id(fh)->itv;
1813 
1814 	if (!valid_prio) {
1815 		switch (cmd) {
1816 		case IVTV_IOC_PASSTHROUGH_MODE:
1817 		case VIDEO_PLAY:
1818 		case VIDEO_STOP:
1819 		case VIDEO_FREEZE:
1820 		case VIDEO_CONTINUE:
1821 		case VIDEO_COMMAND:
1822 		case VIDEO_SELECT_SOURCE:
1823 		case AUDIO_SET_MUTE:
1824 		case AUDIO_CHANNEL_SELECT:
1825 		case AUDIO_BILINGUAL_CHANNEL_SELECT:
1826 			return -EBUSY;
1827 		}
1828 	}
1829 
1830 	switch (cmd) {
1831 	case VIDIOC_INT_RESET: {
1832 		u32 val = *(u32 *)arg;
1833 
1834 		if ((val == 0 && itv->options.newi2c) || (val & 0x01))
1835 			ivtv_reset_ir_gpio(itv);
1836 		if (val & 0x02)
1837 			v4l2_subdev_call(itv->sd_video, core, reset, 0);
1838 		break;
1839 	}
1840 
1841 	case IVTV_IOC_DMA_FRAME:
1842 	case IVTV_IOC_PASSTHROUGH_MODE:
1843 	case VIDEO_GET_PTS:
1844 	case VIDEO_GET_FRAME_COUNT:
1845 	case VIDEO_GET_EVENT:
1846 	case VIDEO_PLAY:
1847 	case VIDEO_STOP:
1848 	case VIDEO_FREEZE:
1849 	case VIDEO_CONTINUE:
1850 	case VIDEO_COMMAND:
1851 	case VIDEO_TRY_COMMAND:
1852 	case VIDEO_SELECT_SOURCE:
1853 	case AUDIO_SET_MUTE:
1854 	case AUDIO_CHANNEL_SELECT:
1855 	case AUDIO_BILINGUAL_CHANNEL_SELECT:
1856 		return ivtv_decoder_ioctls(file, cmd, (void *)arg);
1857 
1858 	default:
1859 		return -ENOTTY;
1860 	}
1861 	return 0;
1862 }
1863 
1864 static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1865 	.vidioc_querycap    		    = ivtv_querycap,
1866 	.vidioc_s_audio     		    = ivtv_s_audio,
1867 	.vidioc_g_audio     		    = ivtv_g_audio,
1868 	.vidioc_enumaudio   		    = ivtv_enumaudio,
1869 	.vidioc_s_audout     		    = ivtv_s_audout,
1870 	.vidioc_g_audout     		    = ivtv_g_audout,
1871 	.vidioc_enum_input   		    = ivtv_enum_input,
1872 	.vidioc_enum_output   		    = ivtv_enum_output,
1873 	.vidioc_enumaudout   		    = ivtv_enumaudout,
1874 	.vidioc_cropcap       		    = ivtv_cropcap,
1875 	.vidioc_s_crop       		    = ivtv_s_crop,
1876 	.vidioc_g_crop       		    = ivtv_g_crop,
1877 	.vidioc_g_input      		    = ivtv_g_input,
1878 	.vidioc_s_input      		    = ivtv_s_input,
1879 	.vidioc_g_output     		    = ivtv_g_output,
1880 	.vidioc_s_output     		    = ivtv_s_output,
1881 	.vidioc_g_frequency 		    = ivtv_g_frequency,
1882 	.vidioc_s_frequency  		    = ivtv_s_frequency,
1883 	.vidioc_s_tuner      		    = ivtv_s_tuner,
1884 	.vidioc_g_tuner      		    = ivtv_g_tuner,
1885 	.vidioc_g_enc_index 		    = ivtv_g_enc_index,
1886 	.vidioc_g_fbuf			    = ivtv_g_fbuf,
1887 	.vidioc_s_fbuf			    = ivtv_s_fbuf,
1888 	.vidioc_g_std 			    = ivtv_g_std,
1889 	.vidioc_s_std 			    = ivtv_s_std,
1890 	.vidioc_overlay			    = ivtv_overlay,
1891 	.vidioc_log_status		    = ivtv_log_status,
1892 	.vidioc_enum_fmt_vid_cap 	    = ivtv_enum_fmt_vid_cap,
1893 	.vidioc_encoder_cmd  		    = ivtv_encoder_cmd,
1894 	.vidioc_try_encoder_cmd 	    = ivtv_try_encoder_cmd,
1895 	.vidioc_decoder_cmd		    = ivtv_decoder_cmd,
1896 	.vidioc_try_decoder_cmd		    = ivtv_try_decoder_cmd,
1897 	.vidioc_enum_fmt_vid_out 	    = ivtv_enum_fmt_vid_out,
1898 	.vidioc_g_fmt_vid_cap 		    = ivtv_g_fmt_vid_cap,
1899 	.vidioc_g_fmt_vbi_cap		    = ivtv_g_fmt_vbi_cap,
1900 	.vidioc_g_fmt_sliced_vbi_cap        = ivtv_g_fmt_sliced_vbi_cap,
1901 	.vidioc_g_fmt_vid_out               = ivtv_g_fmt_vid_out,
1902 	.vidioc_g_fmt_vid_out_overlay       = ivtv_g_fmt_vid_out_overlay,
1903 	.vidioc_g_fmt_sliced_vbi_out        = ivtv_g_fmt_sliced_vbi_out,
1904 	.vidioc_s_fmt_vid_cap  		    = ivtv_s_fmt_vid_cap,
1905 	.vidioc_s_fmt_vbi_cap 		    = ivtv_s_fmt_vbi_cap,
1906 	.vidioc_s_fmt_sliced_vbi_cap        = ivtv_s_fmt_sliced_vbi_cap,
1907 	.vidioc_s_fmt_vid_out               = ivtv_s_fmt_vid_out,
1908 	.vidioc_s_fmt_vid_out_overlay       = ivtv_s_fmt_vid_out_overlay,
1909 	.vidioc_s_fmt_sliced_vbi_out        = ivtv_s_fmt_sliced_vbi_out,
1910 	.vidioc_try_fmt_vid_cap  	    = ivtv_try_fmt_vid_cap,
1911 	.vidioc_try_fmt_vbi_cap		    = ivtv_try_fmt_vbi_cap,
1912 	.vidioc_try_fmt_sliced_vbi_cap      = ivtv_try_fmt_sliced_vbi_cap,
1913 	.vidioc_try_fmt_vid_out 	    = ivtv_try_fmt_vid_out,
1914 	.vidioc_try_fmt_vid_out_overlay     = ivtv_try_fmt_vid_out_overlay,
1915 	.vidioc_try_fmt_sliced_vbi_out 	    = ivtv_try_fmt_sliced_vbi_out,
1916 	.vidioc_g_sliced_vbi_cap 	    = ivtv_g_sliced_vbi_cap,
1917 	.vidioc_g_chip_ident 		    = ivtv_g_chip_ident,
1918 #ifdef CONFIG_VIDEO_ADV_DEBUG
1919 	.vidioc_g_register 		    = ivtv_g_register,
1920 	.vidioc_s_register 		    = ivtv_s_register,
1921 #endif
1922 	.vidioc_default 		    = ivtv_default,
1923 	.vidioc_subscribe_event 	    = ivtv_subscribe_event,
1924 	.vidioc_unsubscribe_event 	    = v4l2_event_unsubscribe,
1925 };
1926 
1927 void ivtv_set_funcs(struct video_device *vdev)
1928 {
1929 	vdev->ioctl_ops = &ivtv_ioctl_ops;
1930 }
1931