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