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