cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ivtv-ioctl.c (48231B)


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