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, unsigned int cmd, void *arg)
715 {
716 	struct v4l2_dbg_register *regs = arg;
717 	volatile u8 __iomem *reg_start;
718 
719 	if (!capable(CAP_SYS_ADMIN))
720 		return -EPERM;
721 	if (regs->reg >= IVTV_REG_OFFSET && regs->reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
722 		reg_start = itv->reg_mem - IVTV_REG_OFFSET;
723 	else if (itv->has_cx23415 && regs->reg >= IVTV_DECODER_OFFSET &&
724 			regs->reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
725 		reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
726 	else if (regs->reg < IVTV_ENCODER_SIZE)
727 		reg_start = itv->enc_mem;
728 	else
729 		return -EINVAL;
730 
731 	regs->size = 4;
732 	if (cmd == VIDIOC_DBG_G_REGISTER)
733 		regs->val = readl(regs->reg + reg_start);
734 	else
735 		writel(regs->val, regs->reg + reg_start);
736 	return 0;
737 }
738 
739 static int ivtv_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
740 {
741 	struct ivtv *itv = fh2id(fh)->itv;
742 
743 	if (v4l2_chip_match_host(&reg->match))
744 		return ivtv_itvc(itv, VIDIOC_DBG_G_REGISTER, reg);
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, struct v4l2_dbg_register *reg)
752 {
753 	struct ivtv *itv = fh2id(fh)->itv;
754 
755 	if (v4l2_chip_match_host(&reg->match))
756 		return ivtv_itvc(itv, VIDIOC_DBG_S_REGISTER, reg);
757 	/* TODO: subdev errors should not be ignored, this should become a
758 	   subdev helper function. */
759 	ivtv_call_all(itv, core, s_register, reg);
760 	return 0;
761 }
762 #endif
763 
764 static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vcap)
765 {
766 	struct ivtv_open_id *id = fh2id(file->private_data);
767 	struct ivtv *itv = id->itv;
768 	struct ivtv_stream *s = &itv->streams[id->type];
769 
770 	strlcpy(vcap->driver, IVTV_DRIVER_NAME, sizeof(vcap->driver));
771 	strlcpy(vcap->card, itv->card_name, sizeof(vcap->card));
772 	snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev));
773 	vcap->capabilities = itv->v4l2_cap | V4L2_CAP_DEVICE_CAPS;
774 	vcap->device_caps = s->caps;
775 	return 0;
776 }
777 
778 static int ivtv_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
779 {
780 	struct ivtv *itv = fh2id(fh)->itv;
781 
782 	return ivtv_get_audio_input(itv, vin->index, vin);
783 }
784 
785 static int ivtv_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
786 {
787 	struct ivtv *itv = fh2id(fh)->itv;
788 
789 	vin->index = itv->audio_input;
790 	return ivtv_get_audio_input(itv, vin->index, vin);
791 }
792 
793 static int ivtv_s_audio(struct file *file, void *fh, const struct v4l2_audio *vout)
794 {
795 	struct ivtv *itv = fh2id(fh)->itv;
796 
797 	if (vout->index >= itv->nof_audio_inputs)
798 		return -EINVAL;
799 
800 	itv->audio_input = vout->index;
801 	ivtv_audio_set_io(itv);
802 
803 	return 0;
804 }
805 
806 static int ivtv_enumaudout(struct file *file, void *fh, struct v4l2_audioout *vin)
807 {
808 	struct ivtv *itv = fh2id(fh)->itv;
809 
810 	/* set it to defaults from our table */
811 	return ivtv_get_audio_output(itv, vin->index, vin);
812 }
813 
814 static int ivtv_g_audout(struct file *file, void *fh, struct v4l2_audioout *vin)
815 {
816 	struct ivtv *itv = fh2id(fh)->itv;
817 
818 	vin->index = 0;
819 	return ivtv_get_audio_output(itv, vin->index, vin);
820 }
821 
822 static int ivtv_s_audout(struct file *file, void *fh, const struct v4l2_audioout *vout)
823 {
824 	struct ivtv *itv = fh2id(fh)->itv;
825 
826 	if (itv->card->video_outputs == NULL || vout->index != 0)
827 		return -EINVAL;
828 	return 0;
829 }
830 
831 static int ivtv_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
832 {
833 	struct ivtv *itv = fh2id(fh)->itv;
834 
835 	/* set it to defaults from our table */
836 	return ivtv_get_input(itv, vin->index, vin);
837 }
838 
839 static int ivtv_enum_output(struct file *file, void *fh, struct v4l2_output *vout)
840 {
841 	struct ivtv *itv = fh2id(fh)->itv;
842 
843 	return ivtv_get_output(itv, vout->index, vout);
844 }
845 
846 static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
847 {
848 	struct ivtv_open_id *id = fh2id(fh);
849 	struct ivtv *itv = id->itv;
850 	struct yuv_playback_info *yi = &itv->yuv_info;
851 	int streamtype;
852 
853 	streamtype = id->type;
854 
855 	if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
856 		return -EINVAL;
857 	cropcap->bounds.top = cropcap->bounds.left = 0;
858 	cropcap->bounds.width = 720;
859 	if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
860 		cropcap->bounds.height = itv->is_50hz ? 576 : 480;
861 		cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
862 		cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
863 	} else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
864 		if (yi->track_osd) {
865 			cropcap->bounds.width = yi->osd_full_w;
866 			cropcap->bounds.height = yi->osd_full_h;
867 		} else {
868 			cropcap->bounds.width = 720;
869 			cropcap->bounds.height =
870 					itv->is_out_50hz ? 576 : 480;
871 		}
872 		cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
873 		cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
874 	} else {
875 		cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
876 		cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
877 		cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
878 	}
879 	cropcap->defrect = cropcap->bounds;
880 	return 0;
881 }
882 
883 static int ivtv_s_crop(struct file *file, void *fh, const struct v4l2_crop *crop)
884 {
885 	struct ivtv_open_id *id = fh2id(fh);
886 	struct ivtv *itv = id->itv;
887 	struct yuv_playback_info *yi = &itv->yuv_info;
888 	int streamtype;
889 
890 	streamtype = id->type;
891 
892 	if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
893 	    (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
894 		if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
895 			yi->main_rect = crop->c;
896 			return 0;
897 		} else {
898 			if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
899 				crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
900 				itv->main_rect = crop->c;
901 				return 0;
902 			}
903 		}
904 		return -EINVAL;
905 	}
906 	return -EINVAL;
907 }
908 
909 static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
910 {
911 	struct ivtv_open_id *id = fh2id(fh);
912 	struct ivtv *itv = id->itv;
913 	struct yuv_playback_info *yi = &itv->yuv_info;
914 	int streamtype;
915 
916 	streamtype = id->type;
917 
918 	if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
919 	    (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
920 		if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
921 			crop->c = yi->main_rect;
922 		else
923 			crop->c = itv->main_rect;
924 		return 0;
925 	}
926 	return -EINVAL;
927 }
928 
929 static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
930 {
931 	static const struct v4l2_fmtdesc hm12 = {
932 		0, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0,
933 		"HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
934 		{ 0, 0, 0, 0 }
935 	};
936 	static const struct v4l2_fmtdesc mpeg = {
937 		0, V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FMT_FLAG_COMPRESSED,
938 		"MPEG", V4L2_PIX_FMT_MPEG,
939 		{ 0, 0, 0, 0 }
940 	};
941 	struct ivtv *itv = fh2id(fh)->itv;
942 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
943 
944 	if (fmt->index)
945 		return -EINVAL;
946 	if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
947 		*fmt = mpeg;
948 	else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
949 		*fmt = hm12;
950 	else
951 		return -EINVAL;
952 	return 0;
953 }
954 
955 static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
956 {
957 	static const struct v4l2_fmtdesc hm12 = {
958 		0, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0,
959 		"HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
960 		{ 0, 0, 0, 0 }
961 	};
962 	static const struct v4l2_fmtdesc mpeg = {
963 		0, V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_FMT_FLAG_COMPRESSED,
964 		"MPEG", V4L2_PIX_FMT_MPEG,
965 		{ 0, 0, 0, 0 }
966 	};
967 	struct ivtv *itv = fh2id(fh)->itv;
968 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
969 
970 	if (fmt->index)
971 		return -EINVAL;
972 	if (s->type == IVTV_DEC_STREAM_TYPE_MPG)
973 		*fmt = mpeg;
974 	else if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
975 		*fmt = hm12;
976 	else
977 		return -EINVAL;
978 	return 0;
979 }
980 
981 static int ivtv_g_input(struct file *file, void *fh, unsigned int *i)
982 {
983 	struct ivtv *itv = fh2id(fh)->itv;
984 
985 	*i = itv->active_input;
986 
987 	return 0;
988 }
989 
990 int ivtv_s_input(struct file *file, void *fh, unsigned int inp)
991 {
992 	struct ivtv *itv = fh2id(fh)->itv;
993 	v4l2_std_id std;
994 	int i;
995 
996 	if (inp < 0 || inp >= itv->nof_inputs)
997 		return -EINVAL;
998 
999 	if (inp == itv->active_input) {
1000 		IVTV_DEBUG_INFO("Input unchanged\n");
1001 		return 0;
1002 	}
1003 
1004 	if (atomic_read(&itv->capturing) > 0) {
1005 		return -EBUSY;
1006 	}
1007 
1008 	IVTV_DEBUG_INFO("Changing input from %d to %d\n",
1009 			itv->active_input, inp);
1010 
1011 	itv->active_input = inp;
1012 	/* Set the audio input to whatever is appropriate for the
1013 	   input type. */
1014 	itv->audio_input = itv->card->video_inputs[inp].audio_index;
1015 
1016 	if (itv->card->video_inputs[inp].video_type == IVTV_CARD_INPUT_VID_TUNER)
1017 		std = itv->tuner_std;
1018 	else
1019 		std = V4L2_STD_ALL;
1020 	for (i = 0; i <= IVTV_ENC_STREAM_TYPE_VBI; i++)
1021 		itv->streams[i].vdev->tvnorms = std;
1022 
1023 	/* prevent others from messing with the streams until
1024 	   we're finished changing inputs. */
1025 	ivtv_mute(itv);
1026 	ivtv_video_set_io(itv);
1027 	ivtv_audio_set_io(itv);
1028 	ivtv_unmute(itv);
1029 
1030 	return 0;
1031 }
1032 
1033 static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
1034 {
1035 	struct ivtv *itv = fh2id(fh)->itv;
1036 
1037 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1038 		return -EINVAL;
1039 
1040 	*i = itv->active_output;
1041 
1042 	return 0;
1043 }
1044 
1045 static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
1046 {
1047 	struct ivtv *itv = fh2id(fh)->itv;
1048 
1049 	if (outp >= itv->card->nof_outputs)
1050 		return -EINVAL;
1051 
1052 	if (outp == itv->active_output) {
1053 		IVTV_DEBUG_INFO("Output unchanged\n");
1054 		return 0;
1055 	}
1056 	IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1057 		   itv->active_output, outp);
1058 
1059 	itv->active_output = outp;
1060 	ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
1061 			SAA7127_INPUT_TYPE_NORMAL,
1062 			itv->card->video_outputs[outp].video_output, 0);
1063 
1064 	return 0;
1065 }
1066 
1067 static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1068 {
1069 	struct ivtv *itv = fh2id(fh)->itv;
1070 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
1071 
1072 	if (s->vdev->vfl_dir)
1073 		return -ENOTTY;
1074 	if (vf->tuner != 0)
1075 		return -EINVAL;
1076 
1077 	ivtv_call_all(itv, tuner, g_frequency, vf);
1078 	return 0;
1079 }
1080 
1081 int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1082 {
1083 	struct ivtv *itv = fh2id(fh)->itv;
1084 	struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
1085 
1086 	if (s->vdev->vfl_dir)
1087 		return -ENOTTY;
1088 	if (vf->tuner != 0)
1089 		return -EINVAL;
1090 
1091 	ivtv_mute(itv);
1092 	IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf->frequency);
1093 	ivtv_call_all(itv, tuner, s_frequency, vf);
1094 	ivtv_unmute(itv);
1095 	return 0;
1096 }
1097 
1098 static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
1099 {
1100 	struct ivtv *itv = fh2id(fh)->itv;
1101 
1102 	*std = itv->std;
1103 	return 0;
1104 }
1105 
1106 void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id *std)
1107 {
1108 	itv->std = *std;
1109 	itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
1110 	itv->is_50hz = !itv->is_60hz;
1111 	cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz);
1112 	itv->cxhdl.width = 720;
1113 	itv->cxhdl.height = itv->is_50hz ? 576 : 480;
1114 	itv->vbi.count = itv->is_50hz ? 18 : 12;
1115 	itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1116 	itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1117 
1118 	if (itv->hw_flags & IVTV_HW_CX25840)
1119 		itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1120 
1121 	/* Tuner */
1122 	ivtv_call_all(itv, core, s_std, itv->std);
1123 }
1124 
1125 void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std)
1126 {
1127 	struct yuv_playback_info *yi = &itv->yuv_info;
1128 	DEFINE_WAIT(wait);
1129 	int f;
1130 
1131 	/* set display standard */
1132 	itv->std_out = *std;
1133 	itv->is_out_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
1134 	itv->is_out_50hz = !itv->is_out_60hz;
1135 	ivtv_call_all(itv, video, s_std_output, itv->std_out);
1136 
1137 	/*
1138 	 * The next firmware call is time sensitive. Time it to
1139 	 * avoid risk of a hard lock, by trying to ensure the call
1140 	 * happens within the first 100 lines of the top field.
1141 	 * Make 4 attempts to sync to the decoder before giving up.
1142 	 */
1143 	mutex_unlock(&itv->serialize_lock);
1144 	for (f = 0; f < 4; f++) {
1145 		prepare_to_wait(&itv->vsync_waitq, &wait,
1146 				TASK_UNINTERRUPTIBLE);
1147 		if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
1148 			break;
1149 		schedule_timeout(msecs_to_jiffies(25));
1150 	}
1151 	finish_wait(&itv->vsync_waitq, &wait);
1152 	mutex_lock(&itv->serialize_lock);
1153 
1154 	if (f == 4)
1155 		IVTV_WARN("Mode change failed to sync to decoder\n");
1156 
1157 	ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1158 	itv->main_rect.left = 0;
1159 	itv->main_rect.top = 0;
1160 	itv->main_rect.width = 720;
1161 	itv->main_rect.height = itv->is_out_50hz ? 576 : 480;
1162 	ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1163 		720, itv->main_rect.height, 0, 0);
1164 	yi->main_rect = itv->main_rect;
1165 	if (!itv->osd_info) {
1166 		yi->osd_full_w = 720;
1167 		yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1168 	}
1169 }
1170 
1171 int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
1172 {
1173 	struct ivtv *itv = fh2id(fh)->itv;
1174 
1175 	if ((*std & V4L2_STD_ALL) == 0)
1176 		return -EINVAL;
1177 
1178 	if (*std == itv->std)
1179 		return 0;
1180 
1181 	if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1182 	    atomic_read(&itv->capturing) > 0 ||
1183 	    atomic_read(&itv->decoding) > 0) {
1184 		/* Switching standard would mess with already running
1185 		   streams, prevent that by returning EBUSY. */
1186 		return -EBUSY;
1187 	}
1188 
1189 	IVTV_DEBUG_INFO("Switching standard to %llx.\n",
1190 		(unsigned long long)itv->std);
1191 
1192 	ivtv_s_std_enc(itv, std);
1193 	if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
1194 		ivtv_s_std_dec(itv, std);
1195 
1196 	return 0;
1197 }
1198 
1199 static int ivtv_s_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1200 {
1201 	struct ivtv_open_id *id = fh2id(fh);
1202 	struct ivtv *itv = id->itv;
1203 
1204 	if (vt->index != 0)
1205 		return -EINVAL;
1206 
1207 	ivtv_call_all(itv, tuner, s_tuner, vt);
1208 
1209 	return 0;
1210 }
1211 
1212 static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1213 {
1214 	struct ivtv *itv = fh2id(fh)->itv;
1215 
1216 	if (vt->index != 0)
1217 		return -EINVAL;
1218 
1219 	ivtv_call_all(itv, tuner, g_tuner, vt);
1220 
1221 	if (vt->type == V4L2_TUNER_RADIO)
1222 		strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
1223 	else
1224 		strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
1225 	return 0;
1226 }
1227 
1228 static int ivtv_g_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_sliced_vbi_cap *cap)
1229 {
1230 	struct ivtv *itv = fh2id(fh)->itv;
1231 	int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1232 	int f, l;
1233 
1234 	if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1235 		for (f = 0; f < 2; f++) {
1236 			for (l = 0; l < 24; l++) {
1237 				if (valid_service_line(f, l, itv->is_50hz))
1238 					cap->service_lines[f][l] = set;
1239 			}
1240 		}
1241 	} else if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1242 		if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1243 			return -EINVAL;
1244 		if (itv->is_60hz) {
1245 			cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1246 			cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1247 		} else {
1248 			cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1249 			cap->service_lines[0][16] = V4L2_SLICED_VPS;
1250 		}
1251 	} else {
1252 		return -EINVAL;
1253 	}
1254 
1255 	set = 0;
1256 	for (f = 0; f < 2; f++)
1257 		for (l = 0; l < 24; l++)
1258 			set |= cap->service_lines[f][l];
1259 	cap->service_set = set;
1260 	return 0;
1261 }
1262 
1263 static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *idx)
1264 {
1265 	struct ivtv *itv = fh2id(fh)->itv;
1266 	struct v4l2_enc_idx_entry *e = idx->entry;
1267 	int entries;
1268 	int i;
1269 
1270 	entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1271 				IVTV_MAX_PGM_INDEX;
1272 	if (entries > V4L2_ENC_IDX_ENTRIES)
1273 		entries = V4L2_ENC_IDX_ENTRIES;
1274 	idx->entries = 0;
1275 	idx->entries_cap = IVTV_MAX_PGM_INDEX;
1276 	if (!atomic_read(&itv->capturing))
1277 		return 0;
1278 	for (i = 0; i < entries; i++) {
1279 		*e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1280 		if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1281 			idx->entries++;
1282 			e++;
1283 		}
1284 	}
1285 	itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1286 	return 0;
1287 }
1288 
1289 static int ivtv_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1290 {
1291 	struct ivtv_open_id *id = fh2id(fh);
1292 	struct ivtv *itv = id->itv;
1293 
1294 
1295 	switch (enc->cmd) {
1296 	case V4L2_ENC_CMD_START:
1297 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1298 		enc->flags = 0;
1299 		return ivtv_start_capture(id);
1300 
1301 	case V4L2_ENC_CMD_STOP:
1302 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1303 		enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1304 		ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1305 		return 0;
1306 
1307 	case V4L2_ENC_CMD_PAUSE:
1308 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1309 		enc->flags = 0;
1310 
1311 		if (!atomic_read(&itv->capturing))
1312 			return -EPERM;
1313 		if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1314 			return 0;
1315 
1316 		ivtv_mute(itv);
1317 		ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1318 		break;
1319 
1320 	case V4L2_ENC_CMD_RESUME:
1321 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1322 		enc->flags = 0;
1323 
1324 		if (!atomic_read(&itv->capturing))
1325 			return -EPERM;
1326 
1327 		if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1328 			return 0;
1329 
1330 		ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1331 		ivtv_unmute(itv);
1332 		break;
1333 	default:
1334 		IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1335 		return -EINVAL;
1336 	}
1337 
1338 	return 0;
1339 }
1340 
1341 static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1342 {
1343 	struct ivtv *itv = fh2id(fh)->itv;
1344 
1345 	switch (enc->cmd) {
1346 	case V4L2_ENC_CMD_START:
1347 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1348 		enc->flags = 0;
1349 		return 0;
1350 
1351 	case V4L2_ENC_CMD_STOP:
1352 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1353 		enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1354 		return 0;
1355 
1356 	case V4L2_ENC_CMD_PAUSE:
1357 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1358 		enc->flags = 0;
1359 		return 0;
1360 
1361 	case V4L2_ENC_CMD_RESUME:
1362 		IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1363 		enc->flags = 0;
1364 		return 0;
1365 	default:
1366 		IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1367 		return -EINVAL;
1368 	}
1369 }
1370 
1371 static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1372 {
1373 	struct ivtv *itv = fh2id(fh)->itv;
1374 	u32 data[CX2341X_MBOX_MAX_DATA];
1375 	struct yuv_playback_info *yi = &itv->yuv_info;
1376 
1377 	int pixfmt;
1378 	static u32 pixel_format[16] = {
1379 		V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1380 		V4L2_PIX_FMT_RGB565,
1381 		V4L2_PIX_FMT_RGB555,
1382 		V4L2_PIX_FMT_RGB444,
1383 		V4L2_PIX_FMT_RGB32,
1384 		0,
1385 		0,
1386 		0,
1387 		V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1388 		V4L2_PIX_FMT_YUV565,
1389 		V4L2_PIX_FMT_YUV555,
1390 		V4L2_PIX_FMT_YUV444,
1391 		V4L2_PIX_FMT_YUV32,
1392 		0,
1393 		0,
1394 		0,
1395 	};
1396 
1397 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1398 		return -EINVAL;
1399 	if (!itv->osd_video_pbase)
1400 		return -EINVAL;
1401 
1402 	fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1403 		V4L2_FBUF_CAP_GLOBAL_ALPHA;
1404 
1405 	ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1406 	data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1407 	pixfmt = (data[0] >> 3) & 0xf;
1408 
1409 	fb->fmt.pixelformat = pixel_format[pixfmt];
1410 	fb->fmt.width = itv->osd_rect.width;
1411 	fb->fmt.height = itv->osd_rect.height;
1412 	fb->fmt.field = V4L2_FIELD_INTERLACED;
1413 	fb->fmt.bytesperline = fb->fmt.width;
1414 	fb->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
1415 	fb->fmt.field = V4L2_FIELD_INTERLACED;
1416 	fb->fmt.priv = 0;
1417 	if (fb->fmt.pixelformat != V4L2_PIX_FMT_PAL8)
1418 		fb->fmt.bytesperline *= 2;
1419 	if (fb->fmt.pixelformat == V4L2_PIX_FMT_RGB32 ||
1420 	    fb->fmt.pixelformat == V4L2_PIX_FMT_YUV32)
1421 		fb->fmt.bytesperline *= 2;
1422 	fb->fmt.sizeimage = fb->fmt.bytesperline * fb->fmt.height;
1423 	fb->base = (void *)itv->osd_video_pbase;
1424 	fb->flags = 0;
1425 
1426 	if (itv->osd_chroma_key_state)
1427 		fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1428 
1429 	if (itv->osd_global_alpha_state)
1430 		fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1431 
1432 	if (yi->track_osd)
1433 		fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1434 
1435 	pixfmt &= 7;
1436 
1437 	/* no local alpha for RGB565 or unknown formats */
1438 	if (pixfmt == 1 || pixfmt > 4)
1439 		return 0;
1440 
1441 	/* 16-bit formats have inverted local alpha */
1442 	if (pixfmt == 2 || pixfmt == 3)
1443 		fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1444 	else
1445 		fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1446 
1447 	if (itv->osd_local_alpha_state) {
1448 		/* 16-bit formats have inverted local alpha */
1449 		if (pixfmt == 2 || pixfmt == 3)
1450 			fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1451 		else
1452 			fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1453 	}
1454 
1455 	return 0;
1456 }
1457 
1458 static int ivtv_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *fb)
1459 {
1460 	struct ivtv_open_id *id = fh2id(fh);
1461 	struct ivtv *itv = id->itv;
1462 	struct yuv_playback_info *yi = &itv->yuv_info;
1463 
1464 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1465 		return -EINVAL;
1466 	if (!itv->osd_video_pbase)
1467 		return -EINVAL;
1468 
1469 	itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1470 	itv->osd_local_alpha_state =
1471 		(fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1472 	itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1473 	ivtv_set_osd_alpha(itv);
1474 	yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1475 	return 0;
1476 }
1477 
1478 static int ivtv_overlay(struct file *file, void *fh, unsigned int on)
1479 {
1480 	struct ivtv_open_id *id = fh2id(fh);
1481 	struct ivtv *itv = id->itv;
1482 
1483 	if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1484 		return -EINVAL;
1485 
1486 	ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0);
1487 
1488 	return 0;
1489 }
1490 
1491 static int ivtv_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub)
1492 {
1493 	switch (sub->type) {
1494 	case V4L2_EVENT_VSYNC:
1495 	case V4L2_EVENT_EOS:
1496 		return v4l2_event_subscribe(fh, sub, 0, NULL);
1497 	case V4L2_EVENT_CTRL:
1498 		return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
1499 	default:
1500 		return -EINVAL;
1501 	}
1502 }
1503 
1504 static int ivtv_log_status(struct file *file, void *fh)
1505 {
1506 	struct ivtv *itv = fh2id(fh)->itv;
1507 	u32 data[CX2341X_MBOX_MAX_DATA];
1508 
1509 	int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1510 	struct v4l2_input vidin;
1511 	struct v4l2_audio audin;
1512 	int i;
1513 
1514 	IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1515 	if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1516 		struct tveeprom tv;
1517 
1518 		ivtv_read_eeprom(itv, &tv);
1519 	}
1520 	ivtv_call_all(itv, core, log_status);
1521 	ivtv_get_input(itv, itv->active_input, &vidin);
1522 	ivtv_get_audio_input(itv, itv->audio_input, &audin);
1523 	IVTV_INFO("Video Input:  %s\n", vidin.name);
1524 	IVTV_INFO("Audio Input:  %s%s\n", audin.name,
1525 		(itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1526 	if (has_output) {
1527 		struct v4l2_output vidout;
1528 		struct v4l2_audioout audout;
1529 		int mode = itv->output_mode;
1530 		static const char * const output_modes[5] = {
1531 			"None",
1532 			"MPEG Streaming",
1533 			"YUV Streaming",
1534 			"YUV Frames",
1535 			"Passthrough",
1536 		};
1537 		static const char * const alpha_mode[4] = {
1538 			"None",
1539 			"Global",
1540 			"Local",
1541 			"Global and Local"
1542 		};
1543 		static const char * const pixel_format[16] = {
1544 			"ARGB Indexed",
1545 			"RGB 5:6:5",
1546 			"ARGB 1:5:5:5",
1547 			"ARGB 1:4:4:4",
1548 			"ARGB 8:8:8:8",
1549 			"5",
1550 			"6",
1551 			"7",
1552 			"AYUV Indexed",
1553 			"YUV 5:6:5",
1554 			"AYUV 1:5:5:5",
1555 			"AYUV 1:4:4:4",
1556 			"AYUV 8:8:8:8",
1557 			"13",
1558 			"14",
1559 			"15",
1560 		};
1561 
1562 		ivtv_get_output(itv, itv->active_output, &vidout);
1563 		ivtv_get_audio_output(itv, 0, &audout);
1564 		IVTV_INFO("Video Output: %s\n", vidout.name);
1565 		if (mode < 0 || mode > OUT_PASSTHROUGH)
1566 			mode = OUT_NONE;
1567 		IVTV_INFO("Output Mode:  %s\n", output_modes[mode]);
1568 		ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1569 		data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1570 		IVTV_INFO("Overlay:      %s, Alpha: %s, Pixel Format: %s\n",
1571 			data[0] & 1 ? "On" : "Off",
1572 			alpha_mode[(data[0] >> 1) & 0x3],
1573 			pixel_format[(data[0] >> 3) & 0xf]);
1574 	}
1575 	IVTV_INFO("Tuner:  %s\n",
1576 		test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1577 	v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
1578 	IVTV_INFO("Status flags:    0x%08lx\n", itv->i_flags);
1579 	for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1580 		struct ivtv_stream *s = &itv->streams[i];
1581 
1582 		if (s->vdev == NULL || s->buffers == 0)
1583 			continue;
1584 		IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1585 				(s->buffers - s->q_free.buffers) * 100 / s->buffers,
1586 				(s->buffers * s->buf_size) / 1024, s->buffers);
1587 	}
1588 
1589 	IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1590 			(long long)itv->mpg_data_received,
1591 			(long long)itv->vbi_data_inserted);
1592 	return 0;
1593 }
1594 
1595 static int ivtv_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *dec)
1596 {
1597 	struct ivtv_open_id *id = fh2id(file->private_data);
1598 	struct ivtv *itv = id->itv;
1599 
1600 	IVTV_DEBUG_IOCTL("VIDIOC_DECODER_CMD %d\n", dec->cmd);
1601 	return ivtv_video_command(itv, id, dec, false);
1602 }
1603 
1604 static int ivtv_try_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *dec)
1605 {
1606 	struct ivtv_open_id *id = fh2id(file->private_data);
1607 	struct ivtv *itv = id->itv;
1608 
1609 	IVTV_DEBUG_IOCTL("VIDIOC_TRY_DECODER_CMD %d\n", dec->cmd);
1610 	return ivtv_video_command(itv, id, dec, true);
1611 }
1612 
1613 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1614 {
1615 	struct ivtv_open_id *id = fh2id(filp->private_data);
1616 	struct ivtv *itv = id->itv;
1617 	int nonblocking = filp->f_flags & O_NONBLOCK;
1618 	struct ivtv_stream *s = &itv->streams[id->type];
1619 	unsigned long iarg = (unsigned long)arg;
1620 
1621 	switch (cmd) {
1622 	case IVTV_IOC_DMA_FRAME: {
1623 		struct ivtv_dma_frame *args = arg;
1624 
1625 		IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1626 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1627 			return -EINVAL;
1628 		if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1629 			return -EINVAL;
1630 		if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1631 			return 0;
1632 		if (ivtv_start_decoding(id, id->type)) {
1633 			return -EBUSY;
1634 		}
1635 		if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1636 			ivtv_release_stream(s);
1637 			return -EBUSY;
1638 		}
1639 		/* Mark that this file handle started the UDMA_YUV mode */
1640 		id->yuv_frames = 1;
1641 		if (args->y_source == NULL)
1642 			return 0;
1643 		return ivtv_yuv_prep_frame(itv, args);
1644 	}
1645 
1646 	case IVTV_IOC_PASSTHROUGH_MODE:
1647 		IVTV_DEBUG_IOCTL("IVTV_IOC_PASSTHROUGH_MODE\n");
1648 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1649 			return -EINVAL;
1650 		return ivtv_passthrough_mode(itv, *(int *)arg != 0);
1651 
1652 	case VIDEO_GET_PTS: {
1653 		s64 *pts = arg;
1654 		s64 frame;
1655 
1656 		IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1657 		if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1658 			*pts = s->dma_pts;
1659 			break;
1660 		}
1661 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1662 			return -EINVAL;
1663 		return ivtv_g_pts_frame(itv, pts, &frame);
1664 	}
1665 
1666 	case VIDEO_GET_FRAME_COUNT: {
1667 		s64 *frame = arg;
1668 		s64 pts;
1669 
1670 		IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1671 		if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1672 			*frame = 0;
1673 			break;
1674 		}
1675 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1676 			return -EINVAL;
1677 		return ivtv_g_pts_frame(itv, &pts, frame);
1678 	}
1679 
1680 	case VIDEO_PLAY: {
1681 		struct v4l2_decoder_cmd dc;
1682 
1683 		IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1684 		memset(&dc, 0, sizeof(dc));
1685 		dc.cmd = V4L2_DEC_CMD_START;
1686 		return ivtv_video_command(itv, id, &dc, 0);
1687 	}
1688 
1689 	case VIDEO_STOP: {
1690 		struct v4l2_decoder_cmd dc;
1691 
1692 		IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1693 		memset(&dc, 0, sizeof(dc));
1694 		dc.cmd = V4L2_DEC_CMD_STOP;
1695 		dc.flags = V4L2_DEC_CMD_STOP_TO_BLACK | V4L2_DEC_CMD_STOP_IMMEDIATELY;
1696 		return ivtv_video_command(itv, id, &dc, 0);
1697 	}
1698 
1699 	case VIDEO_FREEZE: {
1700 		struct v4l2_decoder_cmd dc;
1701 
1702 		IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1703 		memset(&dc, 0, sizeof(dc));
1704 		dc.cmd = V4L2_DEC_CMD_PAUSE;
1705 		return ivtv_video_command(itv, id, &dc, 0);
1706 	}
1707 
1708 	case VIDEO_CONTINUE: {
1709 		struct v4l2_decoder_cmd dc;
1710 
1711 		IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1712 		memset(&dc, 0, sizeof(dc));
1713 		dc.cmd = V4L2_DEC_CMD_RESUME;
1714 		return ivtv_video_command(itv, id, &dc, 0);
1715 	}
1716 
1717 	case VIDEO_COMMAND:
1718 	case VIDEO_TRY_COMMAND: {
1719 		/* Note: struct v4l2_decoder_cmd has the same layout as
1720 		   struct video_command */
1721 		struct v4l2_decoder_cmd *dc = arg;
1722 		int try = (cmd == VIDEO_TRY_COMMAND);
1723 
1724 		if (try)
1725 			IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", dc->cmd);
1726 		else
1727 			IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", dc->cmd);
1728 		return ivtv_video_command(itv, id, dc, try);
1729 	}
1730 
1731 	case VIDEO_GET_EVENT: {
1732 		struct video_event *ev = arg;
1733 		DEFINE_WAIT(wait);
1734 
1735 		IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1736 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1737 			return -EINVAL;
1738 		memset(ev, 0, sizeof(*ev));
1739 		set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1740 
1741 		while (1) {
1742 			if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1743 				ev->type = VIDEO_EVENT_DECODER_STOPPED;
1744 			else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1745 				ev->type = VIDEO_EVENT_VSYNC;
1746 				ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1747 					VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1748 				if (itv->output_mode == OUT_UDMA_YUV &&
1749 					(itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1750 								IVTV_YUV_MODE_PROGRESSIVE) {
1751 					ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1752 				}
1753 			}
1754 			if (ev->type)
1755 				return 0;
1756 			if (nonblocking)
1757 				return -EAGAIN;
1758 			/* Wait for event. Note that serialize_lock is locked,
1759 			   so to allow other processes to access the driver while
1760 			   we are waiting unlock first and later lock again. */
1761 			mutex_unlock(&itv->serialize_lock);
1762 			prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1763 			if (!test_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags) &&
1764 			    !test_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags))
1765 				schedule();
1766 			finish_wait(&itv->event_waitq, &wait);
1767 			mutex_lock(&itv->serialize_lock);
1768 			if (signal_pending(current)) {
1769 				/* return if a signal was received */
1770 				IVTV_DEBUG_INFO("User stopped wait for event\n");
1771 				return -EINTR;
1772 			}
1773 		}
1774 		break;
1775 	}
1776 
1777 	case VIDEO_SELECT_SOURCE:
1778 		IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1779 		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1780 			return -EINVAL;
1781 		return ivtv_passthrough_mode(itv, iarg == VIDEO_SOURCE_DEMUX);
1782 
1783 	case AUDIO_SET_MUTE:
1784 		IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1785 		itv->speed_mute_audio = iarg;
1786 		return 0;
1787 
1788 	case AUDIO_CHANNEL_SELECT:
1789 		IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1790 		if (iarg > AUDIO_STEREO_SWAPPED)
1791 			return -EINVAL;
1792 		return v4l2_ctrl_s_ctrl(itv->ctrl_audio_playback, iarg + 1);
1793 
1794 	case AUDIO_BILINGUAL_CHANNEL_SELECT:
1795 		IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1796 		if (iarg > AUDIO_STEREO_SWAPPED)
1797 			return -EINVAL;
1798 		return v4l2_ctrl_s_ctrl(itv->ctrl_audio_multilingual_playback, iarg + 1);
1799 
1800 	default:
1801 		return -EINVAL;
1802 	}
1803 	return 0;
1804 }
1805 
1806 static long ivtv_default(struct file *file, void *fh, bool valid_prio,
1807 			 int cmd, void *arg)
1808 {
1809 	struct ivtv *itv = fh2id(fh)->itv;
1810 
1811 	if (!valid_prio) {
1812 		switch (cmd) {
1813 		case IVTV_IOC_PASSTHROUGH_MODE:
1814 		case VIDEO_PLAY:
1815 		case VIDEO_STOP:
1816 		case VIDEO_FREEZE:
1817 		case VIDEO_CONTINUE:
1818 		case VIDEO_COMMAND:
1819 		case VIDEO_SELECT_SOURCE:
1820 		case AUDIO_SET_MUTE:
1821 		case AUDIO_CHANNEL_SELECT:
1822 		case AUDIO_BILINGUAL_CHANNEL_SELECT:
1823 			return -EBUSY;
1824 		}
1825 	}
1826 
1827 	switch (cmd) {
1828 	case VIDIOC_INT_RESET: {
1829 		u32 val = *(u32 *)arg;
1830 
1831 		if ((val == 0 && itv->options.newi2c) || (val & 0x01))
1832 			ivtv_reset_ir_gpio(itv);
1833 		if (val & 0x02)
1834 			v4l2_subdev_call(itv->sd_video, core, reset, 0);
1835 		break;
1836 	}
1837 
1838 	case IVTV_IOC_DMA_FRAME:
1839 	case IVTV_IOC_PASSTHROUGH_MODE:
1840 	case VIDEO_GET_PTS:
1841 	case VIDEO_GET_FRAME_COUNT:
1842 	case VIDEO_GET_EVENT:
1843 	case VIDEO_PLAY:
1844 	case VIDEO_STOP:
1845 	case VIDEO_FREEZE:
1846 	case VIDEO_CONTINUE:
1847 	case VIDEO_COMMAND:
1848 	case VIDEO_TRY_COMMAND:
1849 	case VIDEO_SELECT_SOURCE:
1850 	case AUDIO_SET_MUTE:
1851 	case AUDIO_CHANNEL_SELECT:
1852 	case AUDIO_BILINGUAL_CHANNEL_SELECT:
1853 		return ivtv_decoder_ioctls(file, cmd, (void *)arg);
1854 
1855 	default:
1856 		return -ENOTTY;
1857 	}
1858 	return 0;
1859 }
1860 
1861 static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1862 	.vidioc_querycap    		    = ivtv_querycap,
1863 	.vidioc_s_audio     		    = ivtv_s_audio,
1864 	.vidioc_g_audio     		    = ivtv_g_audio,
1865 	.vidioc_enumaudio   		    = ivtv_enumaudio,
1866 	.vidioc_s_audout     		    = ivtv_s_audout,
1867 	.vidioc_g_audout     		    = ivtv_g_audout,
1868 	.vidioc_enum_input   		    = ivtv_enum_input,
1869 	.vidioc_enum_output   		    = ivtv_enum_output,
1870 	.vidioc_enumaudout   		    = ivtv_enumaudout,
1871 	.vidioc_cropcap       		    = ivtv_cropcap,
1872 	.vidioc_s_crop       		    = ivtv_s_crop,
1873 	.vidioc_g_crop       		    = ivtv_g_crop,
1874 	.vidioc_g_input      		    = ivtv_g_input,
1875 	.vidioc_s_input      		    = ivtv_s_input,
1876 	.vidioc_g_output     		    = ivtv_g_output,
1877 	.vidioc_s_output     		    = ivtv_s_output,
1878 	.vidioc_g_frequency 		    = ivtv_g_frequency,
1879 	.vidioc_s_frequency  		    = ivtv_s_frequency,
1880 	.vidioc_s_tuner      		    = ivtv_s_tuner,
1881 	.vidioc_g_tuner      		    = ivtv_g_tuner,
1882 	.vidioc_g_enc_index 		    = ivtv_g_enc_index,
1883 	.vidioc_g_fbuf			    = ivtv_g_fbuf,
1884 	.vidioc_s_fbuf			    = ivtv_s_fbuf,
1885 	.vidioc_g_std 			    = ivtv_g_std,
1886 	.vidioc_s_std 			    = ivtv_s_std,
1887 	.vidioc_overlay			    = ivtv_overlay,
1888 	.vidioc_log_status		    = ivtv_log_status,
1889 	.vidioc_enum_fmt_vid_cap 	    = ivtv_enum_fmt_vid_cap,
1890 	.vidioc_encoder_cmd  		    = ivtv_encoder_cmd,
1891 	.vidioc_try_encoder_cmd 	    = ivtv_try_encoder_cmd,
1892 	.vidioc_decoder_cmd		    = ivtv_decoder_cmd,
1893 	.vidioc_try_decoder_cmd		    = ivtv_try_decoder_cmd,
1894 	.vidioc_enum_fmt_vid_out 	    = ivtv_enum_fmt_vid_out,
1895 	.vidioc_g_fmt_vid_cap 		    = ivtv_g_fmt_vid_cap,
1896 	.vidioc_g_fmt_vbi_cap		    = ivtv_g_fmt_vbi_cap,
1897 	.vidioc_g_fmt_sliced_vbi_cap        = ivtv_g_fmt_sliced_vbi_cap,
1898 	.vidioc_g_fmt_vid_out               = ivtv_g_fmt_vid_out,
1899 	.vidioc_g_fmt_vid_out_overlay       = ivtv_g_fmt_vid_out_overlay,
1900 	.vidioc_g_fmt_sliced_vbi_out        = ivtv_g_fmt_sliced_vbi_out,
1901 	.vidioc_s_fmt_vid_cap  		    = ivtv_s_fmt_vid_cap,
1902 	.vidioc_s_fmt_vbi_cap 		    = ivtv_s_fmt_vbi_cap,
1903 	.vidioc_s_fmt_sliced_vbi_cap        = ivtv_s_fmt_sliced_vbi_cap,
1904 	.vidioc_s_fmt_vid_out               = ivtv_s_fmt_vid_out,
1905 	.vidioc_s_fmt_vid_out_overlay       = ivtv_s_fmt_vid_out_overlay,
1906 	.vidioc_s_fmt_sliced_vbi_out        = ivtv_s_fmt_sliced_vbi_out,
1907 	.vidioc_try_fmt_vid_cap  	    = ivtv_try_fmt_vid_cap,
1908 	.vidioc_try_fmt_vbi_cap		    = ivtv_try_fmt_vbi_cap,
1909 	.vidioc_try_fmt_sliced_vbi_cap      = ivtv_try_fmt_sliced_vbi_cap,
1910 	.vidioc_try_fmt_vid_out 	    = ivtv_try_fmt_vid_out,
1911 	.vidioc_try_fmt_vid_out_overlay     = ivtv_try_fmt_vid_out_overlay,
1912 	.vidioc_try_fmt_sliced_vbi_out 	    = ivtv_try_fmt_sliced_vbi_out,
1913 	.vidioc_g_sliced_vbi_cap 	    = ivtv_g_sliced_vbi_cap,
1914 	.vidioc_g_chip_ident 		    = ivtv_g_chip_ident,
1915 #ifdef CONFIG_VIDEO_ADV_DEBUG
1916 	.vidioc_g_register 		    = ivtv_g_register,
1917 	.vidioc_s_register 		    = ivtv_s_register,
1918 #endif
1919 	.vidioc_default 		    = ivtv_default,
1920 	.vidioc_subscribe_event 	    = ivtv_subscribe_event,
1921 	.vidioc_unsubscribe_event 	    = v4l2_event_unsubscribe,
1922 };
1923 
1924 void ivtv_set_funcs(struct video_device *vdev)
1925 {
1926 	vdev->ioctl_ops = &ivtv_ioctl_ops;
1927 }
1928