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