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