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