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