3 Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com>
4 Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl>
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.
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.
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
21 #include "ivtv-driver.h"
22 #include "ivtv-version.h"
23 #include "ivtv-mailbox.h"
25 #include "ivtv-queue.h"
26 #include "ivtv-fileops.h"
28 #include "ivtv-routing.h"
29 #include "ivtv-streams.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>
41 u16
ivtv_service2vbi(int type
)
44 case V4L2_SLICED_TELETEXT_B
:
45 return IVTV_SLICED_TYPE_TELETEXT_B
;
46 case V4L2_SLICED_CAPTION_525
:
47 return IVTV_SLICED_TYPE_CAPTION_525
;
48 case V4L2_SLICED_WSS_625
:
49 return IVTV_SLICED_TYPE_WSS_625
;
51 return IVTV_SLICED_TYPE_VPS
;
57 static int valid_service_line(int field
, int line
, int is_pal
)
59 return (is_pal
&& line
>= 6 && (line
!= 23 || field
== 0)) ||
60 (!is_pal
&& line
>= 10 && line
< 22);
63 static u16
select_service_from_set(int field
, int line
, u16 set
, int is_pal
)
65 u16 valid_set
= (is_pal
? V4L2_SLICED_VBI_625
: V4L2_SLICED_VBI_525
);
68 set
= set
& valid_set
;
69 if (set
== 0 || !valid_service_line(field
, line
, is_pal
)) {
73 if (line
== 21 && (set
& V4L2_SLICED_CAPTION_525
))
74 return V4L2_SLICED_CAPTION_525
;
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
;
84 for (i
= 0; i
< 32; i
++) {
91 void ivtv_expand_service_set(struct v4l2_sliced_vbi_format
*fmt
, int is_pal
)
93 u16 set
= fmt
->service_set
;
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
);
104 static void check_service_set(struct v4l2_sliced_vbi_format
*fmt
, int is_pal
)
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
);
115 u16
ivtv_get_service_set(struct v4l2_sliced_vbi_format
*fmt
)
120 for (f
= 0; f
< 2; f
++) {
121 for (l
= 0; l
< 24; l
++) {
122 set
|= fmt
->service_lines
[f
][l
];
128 void ivtv_set_osd_alpha(struct ivtv
*itv
)
130 ivtv_vapi(itv
, CX2341X_OSD_SET_GLOBAL_ALPHA
, 3,
131 itv
->osd_global_alpha_state
, itv
->osd_global_alpha
, !itv
->osd_local_alpha_state
);
132 ivtv_vapi(itv
, CX2341X_OSD_SET_CHROMA_KEY
, 2, itv
->osd_chroma_key_state
, itv
->osd_chroma_key
);
135 int ivtv_set_speed(struct ivtv
*itv
, int speed
)
137 u32 data
[CX2341X_MBOX_MAX_DATA
];
138 struct ivtv_stream
*s
;
139 int single_step
= (speed
== 1 || speed
== -1);
142 if (speed
== 0) speed
= 1000;
145 if (speed
== itv
->speed
&& !single_step
)
148 s
= &itv
->streams
[IVTV_DEC_STREAM_TYPE_MPG
];
150 if (single_step
&& (speed
< 0) == (itv
->speed
< 0)) {
151 /* Single step video and no need to change direction */
152 ivtv_vapi(itv
, CX2341X_DEC_STEP_VIDEO
, 1, 0);
157 /* Need to change direction */
158 speed
= speed
< 0 ? -1000 : 1000;
160 data
[0] = (speed
> 1000 || speed
< -1000) ? 0x80000000 : 0;
161 data
[0] |= (speed
> 1000 || speed
< -1500) ? 0x40000000 : 0;
162 data
[1] = (speed
< 0);
163 data
[2] = speed
< 0 ? 3 : 7;
164 data
[3] = v4l2_ctrl_g_ctrl(itv
->cxhdl
.video_b_frames
);
165 data
[4] = (speed
== 1500 || speed
== 500) ? itv
->speed_mute_audio
: 0;
169 if (speed
== 1500 || speed
== -1500) data
[0] |= 1;
170 else if (speed
== 2000 || speed
== -2000) data
[0] |= 2;
171 else if (speed
> -1000 && speed
< 0) data
[0] |= (-1000 / speed
);
172 else if (speed
< 1000 && speed
> 0) data
[0] |= (1000 / speed
);
174 /* If not decoding, just change speed setting */
175 if (atomic_read(&itv
->decoding
) > 0) {
178 /* Stop all DMA and decoding activity */
179 ivtv_vapi(itv
, CX2341X_DEC_PAUSE_PLAYBACK
, 1, 0);
181 /* Wait for any DMA to finish */
182 mutex_unlock(&itv
->serialize_lock
);
183 prepare_to_wait(&itv
->dma_waitq
, &wait
, TASK_INTERRUPTIBLE
);
184 while (test_bit(IVTV_F_I_DMA
, &itv
->i_flags
)) {
185 got_sig
= signal_pending(current
);
191 finish_wait(&itv
->dma_waitq
, &wait
);
192 mutex_lock(&itv
->serialize_lock
);
196 /* Change Speed safely */
197 ivtv_api(itv
, CX2341X_DEC_SET_PLAYBACK_SPEED
, 7, data
);
198 IVTV_DEBUG_INFO("Setting Speed to 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
199 data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6]);
202 speed
= (speed
< 0) ? -1 : 1;
203 ivtv_vapi(itv
, CX2341X_DEC_STEP_VIDEO
, 1, 0);
209 static int ivtv_validate_speed(int cur_speed
, int new_speed
)
211 int fact
= new_speed
< 0 ? -1 : 1;
217 new_speed
= -new_speed
;
219 cur_speed
= -cur_speed
;
221 if (cur_speed
<= new_speed
) {
222 if (new_speed
> 1500)
224 if (new_speed
> 1000)
228 if (new_speed
>= 2000)
230 if (new_speed
>= 1500)
232 if (new_speed
>= 1000)
237 if (new_speed
== 1 || new_speed
== 1000)
238 return fact
* new_speed
;
241 new_speed
= 1000 / new_speed
;
242 if (1000 / cur_speed
== new_speed
)
243 new_speed
+= (cur_speed
< s
) ? -1 : 1;
244 if (new_speed
> 60) return 1000 / (fact
* 60);
245 return 1000 / (fact
* new_speed
);
248 static int ivtv_video_command(struct ivtv
*itv
, struct ivtv_open_id
*id
,
249 struct video_command
*vc
, int try)
251 struct ivtv_stream
*s
= &itv
->streams
[IVTV_DEC_STREAM_TYPE_MPG
];
253 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
257 case VIDEO_CMD_PLAY
: {
259 vc
->play
.speed
= ivtv_validate_speed(itv
->speed
, vc
->play
.speed
);
260 if (vc
->play
.speed
< 0)
261 vc
->play
.format
= VIDEO_PLAY_FMT_GOP
;
264 if (ivtv_set_output_mode(itv
, OUT_MPG
) != OUT_MPG
)
266 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED
, &itv
->i_flags
)) {
267 /* forces ivtv_set_speed to be called */
270 return ivtv_start_decoding(id
, vc
->play
.speed
);
274 vc
->flags
&= VIDEO_CMD_STOP_IMMEDIATELY
|VIDEO_CMD_STOP_TO_BLACK
;
275 if (vc
->flags
& VIDEO_CMD_STOP_IMMEDIATELY
)
278 if (atomic_read(&itv
->decoding
) == 0)
280 if (itv
->output_mode
!= OUT_MPG
)
283 itv
->output_mode
= OUT_NONE
;
284 return ivtv_stop_v4l2_decode_stream(s
, vc
->flags
, vc
->stop
.pts
);
286 case VIDEO_CMD_FREEZE
:
287 vc
->flags
&= VIDEO_CMD_FREEZE_TO_BLACK
;
289 if (itv
->output_mode
!= OUT_MPG
)
291 if (atomic_read(&itv
->decoding
) > 0) {
292 ivtv_vapi(itv
, CX2341X_DEC_PAUSE_PLAYBACK
, 1,
293 (vc
->flags
& VIDEO_CMD_FREEZE_TO_BLACK
) ? 1 : 0);
294 set_bit(IVTV_F_I_DEC_PAUSED
, &itv
->i_flags
);
298 case VIDEO_CMD_CONTINUE
:
301 if (itv
->output_mode
!= OUT_MPG
)
303 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED
, &itv
->i_flags
)) {
304 int speed
= itv
->speed
;
306 return ivtv_start_decoding(id
, speed
);
316 static int ivtv_g_fmt_sliced_vbi_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
318 struct ivtv
*itv
= fh2id(fh
)->itv
;
319 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
321 vbifmt
->reserved
[0] = 0;
322 vbifmt
->reserved
[1] = 0;
323 if (!(itv
->v4l2_cap
& V4L2_CAP_SLICED_VBI_OUTPUT
))
325 vbifmt
->io_size
= sizeof(struct v4l2_sliced_vbi_data
) * 36;
327 vbifmt
->service_lines
[0][21] = V4L2_SLICED_CAPTION_525
;
328 vbifmt
->service_lines
[1][21] = V4L2_SLICED_CAPTION_525
;
330 vbifmt
->service_lines
[0][23] = V4L2_SLICED_WSS_625
;
331 vbifmt
->service_lines
[0][16] = V4L2_SLICED_VPS
;
333 vbifmt
->service_set
= ivtv_get_service_set(vbifmt
);
337 static int ivtv_g_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
339 struct ivtv_open_id
*id
= fh2id(fh
);
340 struct ivtv
*itv
= id
->itv
;
341 struct v4l2_pix_format
*pixfmt
= &fmt
->fmt
.pix
;
343 pixfmt
->width
= itv
->cxhdl
.width
;
344 pixfmt
->height
= itv
->cxhdl
.height
;
345 pixfmt
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
346 pixfmt
->field
= V4L2_FIELD_INTERLACED
;
348 if (id
->type
== IVTV_ENC_STREAM_TYPE_YUV
) {
349 pixfmt
->pixelformat
= V4L2_PIX_FMT_HM12
;
350 /* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
351 pixfmt
->sizeimage
= pixfmt
->height
* 720 * 3 / 2;
352 pixfmt
->bytesperline
= 720;
354 pixfmt
->pixelformat
= V4L2_PIX_FMT_MPEG
;
355 pixfmt
->sizeimage
= 128 * 1024;
356 pixfmt
->bytesperline
= 0;
361 static int ivtv_g_fmt_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
363 struct ivtv
*itv
= fh2id(fh
)->itv
;
364 struct v4l2_vbi_format
*vbifmt
= &fmt
->fmt
.vbi
;
366 vbifmt
->sampling_rate
= 27000000;
367 vbifmt
->offset
= 248;
368 vbifmt
->samples_per_line
= itv
->vbi
.raw_decoder_line_size
- 4;
369 vbifmt
->sample_format
= V4L2_PIX_FMT_GREY
;
370 vbifmt
->start
[0] = itv
->vbi
.start
[0];
371 vbifmt
->start
[1] = itv
->vbi
.start
[1];
372 vbifmt
->count
[0] = vbifmt
->count
[1] = itv
->vbi
.count
;
374 vbifmt
->reserved
[0] = 0;
375 vbifmt
->reserved
[1] = 0;
379 static int ivtv_g_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
381 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
382 struct ivtv_open_id
*id
= fh2id(fh
);
383 struct ivtv
*itv
= id
->itv
;
385 vbifmt
->reserved
[0] = 0;
386 vbifmt
->reserved
[1] = 0;
387 vbifmt
->io_size
= sizeof(struct v4l2_sliced_vbi_data
) * 36;
389 if (id
->type
== IVTV_DEC_STREAM_TYPE_VBI
) {
390 vbifmt
->service_set
= itv
->is_50hz
? V4L2_SLICED_VBI_625
:
392 ivtv_expand_service_set(vbifmt
, itv
->is_50hz
);
396 v4l2_subdev_call(itv
->sd_video
, vbi
, g_sliced_fmt
, vbifmt
);
397 vbifmt
->service_set
= ivtv_get_service_set(vbifmt
);
401 static int ivtv_g_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
403 struct ivtv_open_id
*id
= fh2id(fh
);
404 struct ivtv
*itv
= id
->itv
;
405 struct v4l2_pix_format
*pixfmt
= &fmt
->fmt
.pix
;
407 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
409 pixfmt
->width
= itv
->main_rect
.width
;
410 pixfmt
->height
= itv
->main_rect
.height
;
411 pixfmt
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
412 pixfmt
->field
= V4L2_FIELD_INTERLACED
;
414 if (id
->type
== IVTV_DEC_STREAM_TYPE_YUV
) {
415 switch (itv
->yuv_info
.lace_mode
& IVTV_YUV_MODE_MASK
) {
416 case IVTV_YUV_MODE_INTERLACED
:
417 pixfmt
->field
= (itv
->yuv_info
.lace_mode
& IVTV_YUV_SYNC_MASK
) ?
418 V4L2_FIELD_INTERLACED_BT
: V4L2_FIELD_INTERLACED_TB
;
420 case IVTV_YUV_MODE_PROGRESSIVE
:
421 pixfmt
->field
= V4L2_FIELD_NONE
;
424 pixfmt
->field
= V4L2_FIELD_ANY
;
427 pixfmt
->pixelformat
= V4L2_PIX_FMT_HM12
;
428 pixfmt
->bytesperline
= 720;
429 pixfmt
->width
= itv
->yuv_info
.v4l2_src_w
;
430 pixfmt
->height
= itv
->yuv_info
.v4l2_src_h
;
431 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
433 1080 * ((pixfmt
->height
+ 31) & ~31);
435 pixfmt
->pixelformat
= V4L2_PIX_FMT_MPEG
;
436 pixfmt
->sizeimage
= 128 * 1024;
437 pixfmt
->bytesperline
= 0;
442 static int ivtv_g_fmt_vid_out_overlay(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
444 struct ivtv
*itv
= fh2id(fh
)->itv
;
445 struct v4l2_window
*winfmt
= &fmt
->fmt
.win
;
447 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
449 winfmt
->chromakey
= itv
->osd_chroma_key
;
450 winfmt
->global_alpha
= itv
->osd_global_alpha
;
451 winfmt
->field
= V4L2_FIELD_INTERLACED
;
452 winfmt
->clips
= NULL
;
453 winfmt
->clipcount
= 0;
454 winfmt
->bitmap
= NULL
;
455 winfmt
->w
.top
= winfmt
->w
.left
= 0;
456 winfmt
->w
.width
= itv
->osd_rect
.width
;
457 winfmt
->w
.height
= itv
->osd_rect
.height
;
461 static int ivtv_try_fmt_sliced_vbi_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
463 return ivtv_g_fmt_sliced_vbi_out(file
, fh
, fmt
);
466 static int ivtv_try_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
468 struct ivtv_open_id
*id
= fh2id(fh
);
469 struct ivtv
*itv
= id
->itv
;
470 int w
= fmt
->fmt
.pix
.width
;
471 int h
= fmt
->fmt
.pix
.height
;
476 if (id
->type
== IVTV_ENC_STREAM_TYPE_YUV
) {
477 /* YUV height must be a multiple of 32 */
481 h
= min(h
, itv
->is_50hz
? 576 : 480);
483 ivtv_g_fmt_vid_cap(file
, fh
, fmt
);
484 fmt
->fmt
.pix
.width
= w
;
485 fmt
->fmt
.pix
.height
= h
;
489 static int ivtv_try_fmt_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
491 return ivtv_g_fmt_vbi_cap(file
, fh
, fmt
);
494 static int ivtv_try_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
496 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
497 struct ivtv_open_id
*id
= fh2id(fh
);
498 struct ivtv
*itv
= id
->itv
;
500 if (id
->type
== IVTV_DEC_STREAM_TYPE_VBI
)
501 return ivtv_g_fmt_sliced_vbi_cap(file
, fh
, fmt
);
503 /* set sliced VBI capture format */
504 vbifmt
->io_size
= sizeof(struct v4l2_sliced_vbi_data
) * 36;
505 vbifmt
->reserved
[0] = 0;
506 vbifmt
->reserved
[1] = 0;
508 if (vbifmt
->service_set
)
509 ivtv_expand_service_set(vbifmt
, itv
->is_50hz
);
510 check_service_set(vbifmt
, itv
->is_50hz
);
511 vbifmt
->service_set
= ivtv_get_service_set(vbifmt
);
515 static int ivtv_try_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
517 struct ivtv_open_id
*id
= fh2id(fh
);
518 s32 w
= fmt
->fmt
.pix
.width
;
519 s32 h
= fmt
->fmt
.pix
.height
;
520 int field
= fmt
->fmt
.pix
.field
;
521 int ret
= ivtv_g_fmt_vid_out(file
, fh
, fmt
);
525 /* Why can the height be 576 even when the output is NTSC?
527 Internally the buffers of the PVR350 are always set to 720x576. The
528 decoded video frame will always be placed in the top left corner of
529 this buffer. For any video which is not 720x576, the buffer will
530 then be cropped to remove the unused right and lower areas, with
531 the remaining image being scaled by the hardware to fit the display
532 area. The video can be scaled both up and down, so a 720x480 video
533 can be displayed full-screen on PAL and a 720x576 video can be
534 displayed without cropping on NTSC.
536 Note that the scaling only occurs on the video stream, the osd
537 resolution is locked to the broadcast standard and not scaled.
539 Thanks to Ian Armstrong for this explanation. */
542 if (id
->type
== IVTV_DEC_STREAM_TYPE_YUV
)
543 fmt
->fmt
.pix
.field
= field
;
544 fmt
->fmt
.pix
.width
= w
;
545 fmt
->fmt
.pix
.height
= h
;
549 static int ivtv_try_fmt_vid_out_overlay(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
551 struct ivtv
*itv
= fh2id(fh
)->itv
;
552 u32 chromakey
= fmt
->fmt
.win
.chromakey
;
553 u8 global_alpha
= fmt
->fmt
.win
.global_alpha
;
555 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
557 ivtv_g_fmt_vid_out_overlay(file
, fh
, fmt
);
558 fmt
->fmt
.win
.chromakey
= chromakey
;
559 fmt
->fmt
.win
.global_alpha
= global_alpha
;
563 static int ivtv_s_fmt_sliced_vbi_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
565 return ivtv_g_fmt_sliced_vbi_out(file
, fh
, fmt
);
568 static int ivtv_s_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
570 struct ivtv_open_id
*id
= fh2id(fh
);
571 struct ivtv
*itv
= id
->itv
;
572 struct v4l2_mbus_framefmt mbus_fmt
;
573 int ret
= ivtv_try_fmt_vid_cap(file
, fh
, fmt
);
574 int w
= fmt
->fmt
.pix
.width
;
575 int h
= fmt
->fmt
.pix
.height
;
580 if (itv
->cxhdl
.width
== w
&& itv
->cxhdl
.height
== h
)
583 if (atomic_read(&itv
->capturing
) > 0)
586 itv
->cxhdl
.width
= w
;
587 itv
->cxhdl
.height
= h
;
588 if (v4l2_ctrl_g_ctrl(itv
->cxhdl
.video_encoding
) == V4L2_MPEG_VIDEO_ENCODING_MPEG_1
)
589 fmt
->fmt
.pix
.width
/= 2;
590 mbus_fmt
.width
= fmt
->fmt
.pix
.width
;
592 mbus_fmt
.code
= V4L2_MBUS_FMT_FIXED
;
593 v4l2_subdev_call(itv
->sd_video
, video
, s_mbus_fmt
, &mbus_fmt
);
594 return ivtv_g_fmt_vid_cap(file
, fh
, fmt
);
597 static int ivtv_s_fmt_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
599 struct ivtv
*itv
= fh2id(fh
)->itv
;
601 if (!ivtv_raw_vbi(itv
) && atomic_read(&itv
->capturing
) > 0)
603 itv
->vbi
.sliced_in
->service_set
= 0;
604 itv
->vbi
.in
.type
= V4L2_BUF_TYPE_VBI_CAPTURE
;
605 v4l2_subdev_call(itv
->sd_video
, vbi
, s_raw_fmt
, &fmt
->fmt
.vbi
);
606 return ivtv_g_fmt_vbi_cap(file
, fh
, fmt
);
609 static int ivtv_s_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
611 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
612 struct ivtv_open_id
*id
= fh2id(fh
);
613 struct ivtv
*itv
= id
->itv
;
614 int ret
= ivtv_try_fmt_sliced_vbi_cap(file
, fh
, fmt
);
616 if (ret
|| id
->type
== IVTV_DEC_STREAM_TYPE_VBI
)
619 check_service_set(vbifmt
, itv
->is_50hz
);
620 if (ivtv_raw_vbi(itv
) && atomic_read(&itv
->capturing
) > 0)
622 itv
->vbi
.in
.type
= V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
;
623 v4l2_subdev_call(itv
->sd_video
, vbi
, s_sliced_fmt
, vbifmt
);
624 memcpy(itv
->vbi
.sliced_in
, vbifmt
, sizeof(*itv
->vbi
.sliced_in
));
628 static int ivtv_s_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
630 struct ivtv_open_id
*id
= fh2id(fh
);
631 struct ivtv
*itv
= id
->itv
;
632 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
633 int ret
= ivtv_try_fmt_vid_out(file
, fh
, fmt
);
638 if (id
->type
!= IVTV_DEC_STREAM_TYPE_YUV
)
641 /* Return now if we already have some frame data */
645 yi
->v4l2_src_w
= fmt
->fmt
.pix
.width
;
646 yi
->v4l2_src_h
= fmt
->fmt
.pix
.height
;
648 switch (fmt
->fmt
.pix
.field
) {
649 case V4L2_FIELD_NONE
:
650 yi
->lace_mode
= IVTV_YUV_MODE_PROGRESSIVE
;
653 yi
->lace_mode
= IVTV_YUV_MODE_AUTO
;
655 case V4L2_FIELD_INTERLACED_BT
:
657 IVTV_YUV_MODE_INTERLACED
|IVTV_YUV_SYNC_ODD
;
659 case V4L2_FIELD_INTERLACED_TB
:
661 yi
->lace_mode
= IVTV_YUV_MODE_INTERLACED
;
664 yi
->lace_sync_field
= (yi
->lace_mode
& IVTV_YUV_SYNC_MASK
) == IVTV_YUV_SYNC_EVEN
? 0 : 1;
666 if (test_bit(IVTV_F_I_DEC_YUV
, &itv
->i_flags
))
667 itv
->dma_data_req_size
=
668 1080 * ((yi
->v4l2_src_h
+ 31) & ~31);
673 static int ivtv_s_fmt_vid_out_overlay(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
675 struct ivtv
*itv
= fh2id(fh
)->itv
;
676 int ret
= ivtv_try_fmt_vid_out_overlay(file
, fh
, fmt
);
679 itv
->osd_chroma_key
= fmt
->fmt
.win
.chromakey
;
680 itv
->osd_global_alpha
= fmt
->fmt
.win
.global_alpha
;
681 ivtv_set_osd_alpha(itv
);
686 static int ivtv_g_chip_ident(struct file
*file
, void *fh
, struct v4l2_dbg_chip_ident
*chip
)
688 struct ivtv
*itv
= fh2id(fh
)->itv
;
690 chip
->ident
= V4L2_IDENT_NONE
;
692 if (chip
->match
.type
== V4L2_CHIP_MATCH_HOST
) {
693 if (v4l2_chip_match_host(&chip
->match
))
694 chip
->ident
= itv
->has_cx23415
? V4L2_IDENT_CX23415
: V4L2_IDENT_CX23416
;
697 if (chip
->match
.type
!= V4L2_CHIP_MATCH_I2C_DRIVER
&&
698 chip
->match
.type
!= V4L2_CHIP_MATCH_I2C_ADDR
)
700 /* TODO: is this correct? */
701 return ivtv_call_all_err(itv
, core
, g_chip_ident
, chip
);
704 #ifdef CONFIG_VIDEO_ADV_DEBUG
705 static int ivtv_itvc(struct ivtv
*itv
, unsigned int cmd
, void *arg
)
707 struct v4l2_dbg_register
*regs
= arg
;
708 volatile u8 __iomem
*reg_start
;
710 if (!capable(CAP_SYS_ADMIN
))
712 if (regs
->reg
>= IVTV_REG_OFFSET
&& regs
->reg
< IVTV_REG_OFFSET
+ IVTV_REG_SIZE
)
713 reg_start
= itv
->reg_mem
- IVTV_REG_OFFSET
;
714 else if (itv
->has_cx23415
&& regs
->reg
>= IVTV_DECODER_OFFSET
&&
715 regs
->reg
< IVTV_DECODER_OFFSET
+ IVTV_DECODER_SIZE
)
716 reg_start
= itv
->dec_mem
- IVTV_DECODER_OFFSET
;
717 else if (regs
->reg
< IVTV_ENCODER_SIZE
)
718 reg_start
= itv
->enc_mem
;
723 if (cmd
== VIDIOC_DBG_G_REGISTER
)
724 regs
->val
= readl(regs
->reg
+ reg_start
);
726 writel(regs
->val
, regs
->reg
+ reg_start
);
730 static int ivtv_g_register(struct file
*file
, void *fh
, struct v4l2_dbg_register
*reg
)
732 struct ivtv
*itv
= fh2id(fh
)->itv
;
734 if (v4l2_chip_match_host(®
->match
))
735 return ivtv_itvc(itv
, VIDIOC_DBG_G_REGISTER
, reg
);
736 /* TODO: subdev errors should not be ignored, this should become a
737 subdev helper function. */
738 ivtv_call_all(itv
, core
, g_register
, reg
);
742 static int ivtv_s_register(struct file
*file
, void *fh
, struct v4l2_dbg_register
*reg
)
744 struct ivtv
*itv
= fh2id(fh
)->itv
;
746 if (v4l2_chip_match_host(®
->match
))
747 return ivtv_itvc(itv
, VIDIOC_DBG_S_REGISTER
, reg
);
748 /* TODO: subdev errors should not be ignored, this should become a
749 subdev helper function. */
750 ivtv_call_all(itv
, core
, s_register
, reg
);
755 static int ivtv_querycap(struct file
*file
, void *fh
, struct v4l2_capability
*vcap
)
757 struct ivtv
*itv
= fh2id(fh
)->itv
;
759 strlcpy(vcap
->driver
, IVTV_DRIVER_NAME
, sizeof(vcap
->driver
));
760 strlcpy(vcap
->card
, itv
->card_name
, sizeof(vcap
->card
));
761 snprintf(vcap
->bus_info
, sizeof(vcap
->bus_info
), "PCI:%s", pci_name(itv
->pdev
));
762 vcap
->capabilities
= itv
->v4l2_cap
; /* capabilities */
766 static int ivtv_enumaudio(struct file
*file
, void *fh
, struct v4l2_audio
*vin
)
768 struct ivtv
*itv
= fh2id(fh
)->itv
;
770 return ivtv_get_audio_input(itv
, vin
->index
, vin
);
773 static int ivtv_g_audio(struct file
*file
, void *fh
, struct v4l2_audio
*vin
)
775 struct ivtv
*itv
= fh2id(fh
)->itv
;
777 vin
->index
= itv
->audio_input
;
778 return ivtv_get_audio_input(itv
, vin
->index
, vin
);
781 static int ivtv_s_audio(struct file
*file
, void *fh
, struct v4l2_audio
*vout
)
783 struct ivtv
*itv
= fh2id(fh
)->itv
;
785 if (vout
->index
>= itv
->nof_audio_inputs
)
788 itv
->audio_input
= vout
->index
;
789 ivtv_audio_set_io(itv
);
794 static int ivtv_enumaudout(struct file
*file
, void *fh
, struct v4l2_audioout
*vin
)
796 struct ivtv
*itv
= fh2id(fh
)->itv
;
798 /* set it to defaults from our table */
799 return ivtv_get_audio_output(itv
, vin
->index
, vin
);
802 static int ivtv_g_audout(struct file
*file
, void *fh
, struct v4l2_audioout
*vin
)
804 struct ivtv
*itv
= fh2id(fh
)->itv
;
807 return ivtv_get_audio_output(itv
, vin
->index
, vin
);
810 static int ivtv_s_audout(struct file
*file
, void *fh
, struct v4l2_audioout
*vout
)
812 struct ivtv
*itv
= fh2id(fh
)->itv
;
814 return ivtv_get_audio_output(itv
, vout
->index
, vout
);
817 static int ivtv_enum_input(struct file
*file
, void *fh
, struct v4l2_input
*vin
)
819 struct ivtv
*itv
= fh2id(fh
)->itv
;
821 /* set it to defaults from our table */
822 return ivtv_get_input(itv
, vin
->index
, vin
);
825 static int ivtv_enum_output(struct file
*file
, void *fh
, struct v4l2_output
*vout
)
827 struct ivtv
*itv
= fh2id(fh
)->itv
;
829 return ivtv_get_output(itv
, vout
->index
, vout
);
832 static int ivtv_cropcap(struct file
*file
, void *fh
, struct v4l2_cropcap
*cropcap
)
834 struct ivtv_open_id
*id
= fh2id(fh
);
835 struct ivtv
*itv
= id
->itv
;
836 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
839 streamtype
= id
->type
;
841 if (cropcap
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
843 cropcap
->bounds
.top
= cropcap
->bounds
.left
= 0;
844 cropcap
->bounds
.width
= 720;
845 if (cropcap
->type
== V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
846 cropcap
->bounds
.height
= itv
->is_50hz
? 576 : 480;
847 cropcap
->pixelaspect
.numerator
= itv
->is_50hz
? 59 : 10;
848 cropcap
->pixelaspect
.denominator
= itv
->is_50hz
? 54 : 11;
849 } else if (streamtype
== IVTV_DEC_STREAM_TYPE_YUV
) {
851 cropcap
->bounds
.width
= yi
->osd_full_w
;
852 cropcap
->bounds
.height
= yi
->osd_full_h
;
854 cropcap
->bounds
.width
= 720;
855 cropcap
->bounds
.height
=
856 itv
->is_out_50hz
? 576 : 480;
858 cropcap
->pixelaspect
.numerator
= itv
->is_out_50hz
? 59 : 10;
859 cropcap
->pixelaspect
.denominator
= itv
->is_out_50hz
? 54 : 11;
861 cropcap
->bounds
.height
= itv
->is_out_50hz
? 576 : 480;
862 cropcap
->pixelaspect
.numerator
= itv
->is_out_50hz
? 59 : 10;
863 cropcap
->pixelaspect
.denominator
= itv
->is_out_50hz
? 54 : 11;
865 cropcap
->defrect
= cropcap
->bounds
;
869 static int ivtv_s_crop(struct file
*file
, void *fh
, struct v4l2_crop
*crop
)
871 struct ivtv_open_id
*id
= fh2id(fh
);
872 struct ivtv
*itv
= id
->itv
;
873 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
876 streamtype
= id
->type
;
878 if (crop
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
&&
879 (itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
)) {
880 if (streamtype
== IVTV_DEC_STREAM_TYPE_YUV
) {
881 yi
->main_rect
= crop
->c
;
884 if (!ivtv_vapi(itv
, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW
, 4,
885 crop
->c
.width
, crop
->c
.height
, crop
->c
.left
, crop
->c
.top
)) {
886 itv
->main_rect
= crop
->c
;
895 static int ivtv_g_crop(struct file
*file
, void *fh
, struct v4l2_crop
*crop
)
897 struct ivtv_open_id
*id
= fh2id(fh
);
898 struct ivtv
*itv
= id
->itv
;
899 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
902 streamtype
= id
->type
;
904 if (crop
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
&&
905 (itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
)) {
906 if (streamtype
== IVTV_DEC_STREAM_TYPE_YUV
)
907 crop
->c
= yi
->main_rect
;
909 crop
->c
= itv
->main_rect
;
915 static int ivtv_enum_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_fmtdesc
*fmt
)
917 static struct v4l2_fmtdesc formats
[] = {
919 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12
,
922 { 1, 0, V4L2_FMT_FLAG_COMPRESSED
,
923 "MPEG", V4L2_PIX_FMT_MPEG
,
927 enum v4l2_buf_type type
= fmt
->type
;
932 *fmt
= formats
[fmt
->index
];
937 static int ivtv_enum_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_fmtdesc
*fmt
)
939 struct ivtv
*itv
= fh2id(fh
)->itv
;
941 static struct v4l2_fmtdesc formats
[] = {
943 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12
,
946 { 1, 0, V4L2_FMT_FLAG_COMPRESSED
,
947 "MPEG", V4L2_PIX_FMT_MPEG
,
951 enum v4l2_buf_type type
= fmt
->type
;
953 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
959 *fmt
= formats
[fmt
->index
];
965 static int ivtv_g_input(struct file
*file
, void *fh
, unsigned int *i
)
967 struct ivtv
*itv
= fh2id(fh
)->itv
;
969 *i
= itv
->active_input
;
974 int ivtv_s_input(struct file
*file
, void *fh
, unsigned int inp
)
976 struct ivtv
*itv
= fh2id(fh
)->itv
;
978 if (inp
< 0 || inp
>= itv
->nof_inputs
)
981 if (inp
== itv
->active_input
) {
982 IVTV_DEBUG_INFO("Input unchanged\n");
986 if (atomic_read(&itv
->capturing
) > 0) {
990 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
991 itv
->active_input
, inp
);
993 itv
->active_input
= inp
;
994 /* Set the audio input to whatever is appropriate for the
996 itv
->audio_input
= itv
->card
->video_inputs
[inp
].audio_index
;
998 /* prevent others from messing with the streams until
999 we're finished changing inputs. */
1001 ivtv_video_set_io(itv
);
1002 ivtv_audio_set_io(itv
);
1008 static int ivtv_g_output(struct file
*file
, void *fh
, unsigned int *i
)
1010 struct ivtv
*itv
= fh2id(fh
)->itv
;
1012 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1015 *i
= itv
->active_output
;
1020 static int ivtv_s_output(struct file
*file
, void *fh
, unsigned int outp
)
1022 struct ivtv
*itv
= fh2id(fh
)->itv
;
1024 if (outp
>= itv
->card
->nof_outputs
)
1027 if (outp
== itv
->active_output
) {
1028 IVTV_DEBUG_INFO("Output unchanged\n");
1031 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1032 itv
->active_output
, outp
);
1034 itv
->active_output
= outp
;
1035 ivtv_call_hw(itv
, IVTV_HW_SAA7127
, video
, s_routing
,
1036 SAA7127_INPUT_TYPE_NORMAL
,
1037 itv
->card
->video_outputs
[outp
].video_output
, 0);
1042 static int ivtv_g_frequency(struct file
*file
, void *fh
, struct v4l2_frequency
*vf
)
1044 struct ivtv
*itv
= fh2id(fh
)->itv
;
1049 ivtv_call_all(itv
, tuner
, g_frequency
, vf
);
1053 int ivtv_s_frequency(struct file
*file
, void *fh
, struct v4l2_frequency
*vf
)
1055 struct ivtv
*itv
= fh2id(fh
)->itv
;
1061 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf
->frequency
);
1062 ivtv_call_all(itv
, tuner
, s_frequency
, vf
);
1067 static int ivtv_g_std(struct file
*file
, void *fh
, v4l2_std_id
*std
)
1069 struct ivtv
*itv
= fh2id(fh
)->itv
;
1075 void ivtv_s_std_enc(struct ivtv
*itv
, v4l2_std_id
*std
)
1078 itv
->is_60hz
= (*std
& V4L2_STD_525_60
) ? 1 : 0;
1079 itv
->is_50hz
= !itv
->is_60hz
;
1080 cx2341x_handler_set_50hz(&itv
->cxhdl
, itv
->is_50hz
);
1081 itv
->cxhdl
.width
= 720;
1082 itv
->cxhdl
.height
= itv
->is_50hz
? 576 : 480;
1083 itv
->vbi
.count
= itv
->is_50hz
? 18 : 12;
1084 itv
->vbi
.start
[0] = itv
->is_50hz
? 6 : 10;
1085 itv
->vbi
.start
[1] = itv
->is_50hz
? 318 : 273;
1087 if (itv
->hw_flags
& IVTV_HW_CX25840
)
1088 itv
->vbi
.sliced_decoder_line_size
= itv
->is_60hz
? 272 : 284;
1091 ivtv_call_all(itv
, core
, s_std
, itv
->std
);
1094 void ivtv_s_std_dec(struct ivtv
*itv
, v4l2_std_id
*std
)
1096 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
1100 /* set display standard */
1101 itv
->std_out
= *std
;
1102 itv
->is_out_60hz
= (*std
& V4L2_STD_525_60
) ? 1 : 0;
1103 itv
->is_out_50hz
= !itv
->is_out_60hz
;
1104 ivtv_call_all(itv
, video
, s_std_output
, itv
->std_out
);
1107 * The next firmware call is time sensitive. Time it to
1108 * avoid risk of a hard lock, by trying to ensure the call
1109 * happens within the first 100 lines of the top field.
1110 * Make 4 attempts to sync to the decoder before giving up.
1112 mutex_unlock(&itv
->serialize_lock
);
1113 for (f
= 0; f
< 4; f
++) {
1114 prepare_to_wait(&itv
->vsync_waitq
, &wait
,
1115 TASK_UNINTERRUPTIBLE
);
1116 if ((read_reg(IVTV_REG_DEC_LINE_FIELD
) >> 16) < 100)
1118 schedule_timeout(msecs_to_jiffies(25));
1120 finish_wait(&itv
->vsync_waitq
, &wait
);
1121 mutex_lock(&itv
->serialize_lock
);
1124 IVTV_WARN("Mode change failed to sync to decoder\n");
1126 ivtv_vapi(itv
, CX2341X_DEC_SET_STANDARD
, 1, itv
->is_out_50hz
);
1127 itv
->main_rect
.left
= 0;
1128 itv
->main_rect
.top
= 0;
1129 itv
->main_rect
.width
= 720;
1130 itv
->main_rect
.height
= itv
->is_out_50hz
? 576 : 480;
1131 ivtv_vapi(itv
, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW
, 4,
1132 720, itv
->main_rect
.height
, 0, 0);
1133 yi
->main_rect
= itv
->main_rect
;
1134 if (!itv
->osd_info
) {
1135 yi
->osd_full_w
= 720;
1136 yi
->osd_full_h
= itv
->is_out_50hz
? 576 : 480;
1140 int ivtv_s_std(struct file
*file
, void *fh
, v4l2_std_id
*std
)
1142 struct ivtv
*itv
= fh2id(fh
)->itv
;
1144 if ((*std
& V4L2_STD_ALL
) == 0)
1147 if (*std
== itv
->std
)
1150 if (test_bit(IVTV_F_I_RADIO_USER
, &itv
->i_flags
) ||
1151 atomic_read(&itv
->capturing
) > 0 ||
1152 atomic_read(&itv
->decoding
) > 0) {
1153 /* Switching standard would mess with already running
1154 streams, prevent that by returning EBUSY. */
1158 IVTV_DEBUG_INFO("Switching standard to %llx.\n",
1159 (unsigned long long)itv
->std
);
1161 ivtv_s_std_enc(itv
, std
);
1162 if (itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
)
1163 ivtv_s_std_dec(itv
, std
);
1168 static int ivtv_s_tuner(struct file
*file
, void *fh
, struct v4l2_tuner
*vt
)
1170 struct ivtv_open_id
*id
= fh2id(fh
);
1171 struct ivtv
*itv
= id
->itv
;
1176 ivtv_call_all(itv
, tuner
, s_tuner
, vt
);
1181 static int ivtv_g_tuner(struct file
*file
, void *fh
, struct v4l2_tuner
*vt
)
1183 struct ivtv
*itv
= fh2id(fh
)->itv
;
1188 ivtv_call_all(itv
, tuner
, g_tuner
, vt
);
1190 if (vt
->type
== V4L2_TUNER_RADIO
)
1191 strlcpy(vt
->name
, "ivtv Radio Tuner", sizeof(vt
->name
));
1193 strlcpy(vt
->name
, "ivtv TV Tuner", sizeof(vt
->name
));
1197 static int ivtv_g_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_sliced_vbi_cap
*cap
)
1199 struct ivtv
*itv
= fh2id(fh
)->itv
;
1200 int set
= itv
->is_50hz
? V4L2_SLICED_VBI_625
: V4L2_SLICED_VBI_525
;
1203 if (cap
->type
== V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
) {
1204 for (f
= 0; f
< 2; f
++) {
1205 for (l
= 0; l
< 24; l
++) {
1206 if (valid_service_line(f
, l
, itv
->is_50hz
))
1207 cap
->service_lines
[f
][l
] = set
;
1210 } else if (cap
->type
== V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
) {
1211 if (!(itv
->v4l2_cap
& V4L2_CAP_SLICED_VBI_OUTPUT
))
1214 cap
->service_lines
[0][21] = V4L2_SLICED_CAPTION_525
;
1215 cap
->service_lines
[1][21] = V4L2_SLICED_CAPTION_525
;
1217 cap
->service_lines
[0][23] = V4L2_SLICED_WSS_625
;
1218 cap
->service_lines
[0][16] = V4L2_SLICED_VPS
;
1225 for (f
= 0; f
< 2; f
++)
1226 for (l
= 0; l
< 24; l
++)
1227 set
|= cap
->service_lines
[f
][l
];
1228 cap
->service_set
= set
;
1232 static int ivtv_g_enc_index(struct file
*file
, void *fh
, struct v4l2_enc_idx
*idx
)
1234 struct ivtv
*itv
= fh2id(fh
)->itv
;
1235 struct v4l2_enc_idx_entry
*e
= idx
->entry
;
1239 entries
= (itv
->pgm_info_write_idx
+ IVTV_MAX_PGM_INDEX
- itv
->pgm_info_read_idx
) %
1241 if (entries
> V4L2_ENC_IDX_ENTRIES
)
1242 entries
= V4L2_ENC_IDX_ENTRIES
;
1244 for (i
= 0; i
< entries
; i
++) {
1245 *e
= itv
->pgm_info
[(itv
->pgm_info_read_idx
+ i
) % IVTV_MAX_PGM_INDEX
];
1246 if ((e
->flags
& V4L2_ENC_IDX_FRAME_MASK
) <= V4L2_ENC_IDX_FRAME_B
) {
1251 itv
->pgm_info_read_idx
= (itv
->pgm_info_read_idx
+ idx
->entries
) % IVTV_MAX_PGM_INDEX
;
1255 static int ivtv_encoder_cmd(struct file
*file
, void *fh
, struct v4l2_encoder_cmd
*enc
)
1257 struct ivtv_open_id
*id
= fh2id(fh
);
1258 struct ivtv
*itv
= id
->itv
;
1262 case V4L2_ENC_CMD_START
:
1263 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1265 return ivtv_start_capture(id
);
1267 case V4L2_ENC_CMD_STOP
:
1268 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1269 enc
->flags
&= V4L2_ENC_CMD_STOP_AT_GOP_END
;
1270 ivtv_stop_capture(id
, enc
->flags
& V4L2_ENC_CMD_STOP_AT_GOP_END
);
1273 case V4L2_ENC_CMD_PAUSE
:
1274 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1277 if (!atomic_read(&itv
->capturing
))
1279 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED
, &itv
->i_flags
))
1283 ivtv_vapi(itv
, CX2341X_ENC_PAUSE_ENCODER
, 1, 0);
1286 case V4L2_ENC_CMD_RESUME
:
1287 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1290 if (!atomic_read(&itv
->capturing
))
1293 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED
, &itv
->i_flags
))
1296 ivtv_vapi(itv
, CX2341X_ENC_PAUSE_ENCODER
, 1, 1);
1300 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc
->cmd
);
1307 static int ivtv_try_encoder_cmd(struct file
*file
, void *fh
, struct v4l2_encoder_cmd
*enc
)
1309 struct ivtv
*itv
= fh2id(fh
)->itv
;
1312 case V4L2_ENC_CMD_START
:
1313 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1317 case V4L2_ENC_CMD_STOP
:
1318 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1319 enc
->flags
&= V4L2_ENC_CMD_STOP_AT_GOP_END
;
1322 case V4L2_ENC_CMD_PAUSE
:
1323 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1327 case V4L2_ENC_CMD_RESUME
:
1328 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1332 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc
->cmd
);
1337 static int ivtv_g_fbuf(struct file
*file
, void *fh
, struct v4l2_framebuffer
*fb
)
1339 struct ivtv
*itv
= fh2id(fh
)->itv
;
1340 u32 data
[CX2341X_MBOX_MAX_DATA
];
1341 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
1344 static u32 pixel_format
[16] = {
1345 V4L2_PIX_FMT_PAL8
, /* Uses a 256-entry RGB colormap */
1346 V4L2_PIX_FMT_RGB565
,
1347 V4L2_PIX_FMT_RGB555
,
1348 V4L2_PIX_FMT_RGB444
,
1353 V4L2_PIX_FMT_PAL8
, /* Uses a 256-entry YUV colormap */
1354 V4L2_PIX_FMT_YUV565
,
1355 V4L2_PIX_FMT_YUV555
,
1356 V4L2_PIX_FMT_YUV444
,
1363 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT_OVERLAY
))
1365 if (!itv
->osd_video_pbase
)
1368 fb
->capability
= V4L2_FBUF_CAP_EXTERNOVERLAY
| V4L2_FBUF_CAP_CHROMAKEY
|
1369 V4L2_FBUF_CAP_GLOBAL_ALPHA
;
1371 ivtv_vapi_result(itv
, data
, CX2341X_OSD_GET_STATE
, 0);
1372 data
[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1373 pixfmt
= (data
[0] >> 3) & 0xf;
1375 fb
->fmt
.pixelformat
= pixel_format
[pixfmt
];
1376 fb
->fmt
.width
= itv
->osd_rect
.width
;
1377 fb
->fmt
.height
= itv
->osd_rect
.height
;
1378 fb
->fmt
.field
= V4L2_FIELD_INTERLACED
;
1379 fb
->fmt
.bytesperline
= fb
->fmt
.width
;
1380 fb
->fmt
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
1381 fb
->fmt
.field
= V4L2_FIELD_INTERLACED
;
1383 if (fb
->fmt
.pixelformat
!= V4L2_PIX_FMT_PAL8
)
1384 fb
->fmt
.bytesperline
*= 2;
1385 if (fb
->fmt
.pixelformat
== V4L2_PIX_FMT_RGB32
||
1386 fb
->fmt
.pixelformat
== V4L2_PIX_FMT_YUV32
)
1387 fb
->fmt
.bytesperline
*= 2;
1388 fb
->fmt
.sizeimage
= fb
->fmt
.bytesperline
* fb
->fmt
.height
;
1389 fb
->base
= (void *)itv
->osd_video_pbase
;
1392 if (itv
->osd_chroma_key_state
)
1393 fb
->flags
|= V4L2_FBUF_FLAG_CHROMAKEY
;
1395 if (itv
->osd_global_alpha_state
)
1396 fb
->flags
|= V4L2_FBUF_FLAG_GLOBAL_ALPHA
;
1399 fb
->flags
|= V4L2_FBUF_FLAG_OVERLAY
;
1403 /* no local alpha for RGB565 or unknown formats */
1404 if (pixfmt
== 1 || pixfmt
> 4)
1407 /* 16-bit formats have inverted local alpha */
1408 if (pixfmt
== 2 || pixfmt
== 3)
1409 fb
->capability
|= V4L2_FBUF_CAP_LOCAL_INV_ALPHA
;
1411 fb
->capability
|= V4L2_FBUF_CAP_LOCAL_ALPHA
;
1413 if (itv
->osd_local_alpha_state
) {
1414 /* 16-bit formats have inverted local alpha */
1415 if (pixfmt
== 2 || pixfmt
== 3)
1416 fb
->flags
|= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA
;
1418 fb
->flags
|= V4L2_FBUF_FLAG_LOCAL_ALPHA
;
1424 static int ivtv_s_fbuf(struct file
*file
, void *fh
, struct v4l2_framebuffer
*fb
)
1426 struct ivtv_open_id
*id
= fh2id(fh
);
1427 struct ivtv
*itv
= id
->itv
;
1428 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
1430 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT_OVERLAY
))
1432 if (!itv
->osd_video_pbase
)
1435 itv
->osd_global_alpha_state
= (fb
->flags
& V4L2_FBUF_FLAG_GLOBAL_ALPHA
) != 0;
1436 itv
->osd_local_alpha_state
=
1437 (fb
->flags
& (V4L2_FBUF_FLAG_LOCAL_ALPHA
|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA
)) != 0;
1438 itv
->osd_chroma_key_state
= (fb
->flags
& V4L2_FBUF_FLAG_CHROMAKEY
) != 0;
1439 ivtv_set_osd_alpha(itv
);
1440 yi
->track_osd
= (fb
->flags
& V4L2_FBUF_FLAG_OVERLAY
) != 0;
1441 return ivtv_g_fbuf(file
, fh
, fb
);
1444 static int ivtv_overlay(struct file
*file
, void *fh
, unsigned int on
)
1446 struct ivtv_open_id
*id
= fh2id(fh
);
1447 struct ivtv
*itv
= id
->itv
;
1449 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT_OVERLAY
))
1452 ivtv_vapi(itv
, CX2341X_OSD_SET_STATE
, 1, on
!= 0);
1457 static int ivtv_subscribe_event(struct v4l2_fh
*fh
, struct v4l2_event_subscription
*sub
)
1459 switch (sub
->type
) {
1460 case V4L2_EVENT_VSYNC
:
1461 case V4L2_EVENT_EOS
:
1462 case V4L2_EVENT_CTRL
:
1463 return v4l2_event_subscribe(fh
, sub
, 0);
1469 static int ivtv_log_status(struct file
*file
, void *fh
)
1471 struct ivtv
*itv
= fh2id(fh
)->itv
;
1472 u32 data
[CX2341X_MBOX_MAX_DATA
];
1474 int has_output
= itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
;
1475 struct v4l2_input vidin
;
1476 struct v4l2_audio audin
;
1479 IVTV_INFO("================= START STATUS CARD #%d =================\n",
1481 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION
, itv
->card_name
);
1482 if (itv
->hw_flags
& IVTV_HW_TVEEPROM
) {
1485 ivtv_read_eeprom(itv
, &tv
);
1487 ivtv_call_all(itv
, core
, log_status
);
1488 ivtv_get_input(itv
, itv
->active_input
, &vidin
);
1489 ivtv_get_audio_input(itv
, itv
->audio_input
, &audin
);
1490 IVTV_INFO("Video Input: %s\n", vidin
.name
);
1491 IVTV_INFO("Audio Input: %s%s\n", audin
.name
,
1492 (itv
->dualwatch_stereo_mode
& ~0x300) == 0x200 ? " (Bilingual)" : "");
1494 struct v4l2_output vidout
;
1495 struct v4l2_audioout audout
;
1496 int mode
= itv
->output_mode
;
1497 static const char * const output_modes
[5] = {
1504 static const char * const audio_modes
[5] = {
1511 static const char * const alpha_mode
[4] = {
1517 static const char * const pixel_format
[16] = {
1536 ivtv_get_output(itv
, itv
->active_output
, &vidout
);
1537 ivtv_get_audio_output(itv
, 0, &audout
);
1538 IVTV_INFO("Video Output: %s\n", vidout
.name
);
1539 IVTV_INFO("Audio Output: %s (Stereo/Bilingual: %s/%s)\n", audout
.name
,
1540 audio_modes
[itv
->audio_stereo_mode
],
1541 audio_modes
[itv
->audio_bilingual_mode
]);
1542 if (mode
< 0 || mode
> OUT_PASSTHROUGH
)
1544 IVTV_INFO("Output Mode: %s\n", output_modes
[mode
]);
1545 ivtv_vapi_result(itv
, data
, CX2341X_OSD_GET_STATE
, 0);
1546 data
[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1547 IVTV_INFO("Overlay: %s, Alpha: %s, Pixel Format: %s\n",
1548 data
[0] & 1 ? "On" : "Off",
1549 alpha_mode
[(data
[0] >> 1) & 0x3],
1550 pixel_format
[(data
[0] >> 3) & 0xf]);
1552 IVTV_INFO("Tuner: %s\n",
1553 test_bit(IVTV_F_I_RADIO_USER
, &itv
->i_flags
) ? "Radio" : "TV");
1554 v4l2_ctrl_handler_log_status(&itv
->cxhdl
.hdl
, itv
->v4l2_dev
.name
);
1555 IVTV_INFO("Status flags: 0x%08lx\n", itv
->i_flags
);
1556 for (i
= 0; i
< IVTV_MAX_STREAMS
; i
++) {
1557 struct ivtv_stream
*s
= &itv
->streams
[i
];
1559 if (s
->vdev
== NULL
|| s
->buffers
== 0)
1561 IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s
->name
, s
->s_flags
,
1562 (s
->buffers
- s
->q_free
.buffers
) * 100 / s
->buffers
,
1563 (s
->buffers
* s
->buf_size
) / 1024, s
->buffers
);
1566 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1567 (long long)itv
->mpg_data_received
,
1568 (long long)itv
->vbi_data_inserted
);
1569 IVTV_INFO("================== END STATUS CARD #%d ==================\n",
1575 static int ivtv_decoder_ioctls(struct file
*filp
, unsigned int cmd
, void *arg
)
1577 struct ivtv_open_id
*id
= fh2id(filp
->private_data
);
1578 struct ivtv
*itv
= id
->itv
;
1579 int nonblocking
= filp
->f_flags
& O_NONBLOCK
;
1580 struct ivtv_stream
*s
= &itv
->streams
[id
->type
];
1581 unsigned long iarg
= (unsigned long)arg
;
1584 case IVTV_IOC_DMA_FRAME
: {
1585 struct ivtv_dma_frame
*args
= arg
;
1587 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1588 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1590 if (args
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
1592 if (itv
->output_mode
== OUT_UDMA_YUV
&& args
->y_source
== NULL
)
1594 if (ivtv_start_decoding(id
, id
->type
)) {
1597 if (ivtv_set_output_mode(itv
, OUT_UDMA_YUV
) != OUT_UDMA_YUV
) {
1598 ivtv_release_stream(s
);
1601 /* Mark that this file handle started the UDMA_YUV mode */
1603 if (args
->y_source
== NULL
)
1605 return ivtv_yuv_prep_frame(itv
, args
);
1608 case VIDEO_GET_PTS
: {
1609 u32 data
[CX2341X_MBOX_MAX_DATA
];
1612 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1613 if (s
->type
< IVTV_DEC_STREAM_TYPE_MPG
) {
1617 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1620 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS
, &itv
->i_flags
)) {
1621 *pts
= (u64
) ((u64
)itv
->last_dec_timing
[2] << 32) |
1622 (u64
)itv
->last_dec_timing
[1];
1626 if (atomic_read(&itv
->decoding
)) {
1627 if (ivtv_api(itv
, CX2341X_DEC_GET_TIMING_INFO
, 5, data
)) {
1628 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1631 memcpy(itv
->last_dec_timing
, data
, sizeof(itv
->last_dec_timing
));
1632 set_bit(IVTV_F_I_VALID_DEC_TIMINGS
, &itv
->i_flags
);
1633 *pts
= (u64
) ((u64
) data
[2] << 32) | (u64
) data
[1];
1634 /*timing->scr = (u64) (((u64) data[4] << 32) | (u64) (data[3]));*/
1639 case VIDEO_GET_FRAME_COUNT
: {
1640 u32 data
[CX2341X_MBOX_MAX_DATA
];
1643 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1644 if (s
->type
< IVTV_DEC_STREAM_TYPE_MPG
) {
1648 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1651 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS
, &itv
->i_flags
)) {
1652 *frame
= itv
->last_dec_timing
[0];
1656 if (atomic_read(&itv
->decoding
)) {
1657 if (ivtv_api(itv
, CX2341X_DEC_GET_TIMING_INFO
, 5, data
)) {
1658 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1661 memcpy(itv
->last_dec_timing
, data
, sizeof(itv
->last_dec_timing
));
1662 set_bit(IVTV_F_I_VALID_DEC_TIMINGS
, &itv
->i_flags
);
1669 struct video_command vc
;
1671 IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1672 memset(&vc
, 0, sizeof(vc
));
1673 vc
.cmd
= VIDEO_CMD_PLAY
;
1674 return ivtv_video_command(itv
, id
, &vc
, 0);
1678 struct video_command vc
;
1680 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1681 memset(&vc
, 0, sizeof(vc
));
1682 vc
.cmd
= VIDEO_CMD_STOP
;
1683 vc
.flags
= VIDEO_CMD_STOP_TO_BLACK
| VIDEO_CMD_STOP_IMMEDIATELY
;
1684 return ivtv_video_command(itv
, id
, &vc
, 0);
1687 case VIDEO_FREEZE
: {
1688 struct video_command vc
;
1690 IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1691 memset(&vc
, 0, sizeof(vc
));
1692 vc
.cmd
= VIDEO_CMD_FREEZE
;
1693 return ivtv_video_command(itv
, id
, &vc
, 0);
1696 case VIDEO_CONTINUE
: {
1697 struct video_command vc
;
1699 IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1700 memset(&vc
, 0, sizeof(vc
));
1701 vc
.cmd
= VIDEO_CMD_CONTINUE
;
1702 return ivtv_video_command(itv
, id
, &vc
, 0);
1706 case VIDEO_TRY_COMMAND
: {
1707 struct video_command
*vc
= arg
;
1708 int try = (cmd
== VIDEO_TRY_COMMAND
);
1711 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", vc
->cmd
);
1713 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", vc
->cmd
);
1714 return ivtv_video_command(itv
, id
, vc
, try);
1717 case VIDEO_GET_EVENT
: {
1718 struct video_event
*ev
= arg
;
1721 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1722 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1724 memset(ev
, 0, sizeof(*ev
));
1725 set_bit(IVTV_F_I_EV_VSYNC_ENABLED
, &itv
->i_flags
);
1728 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED
, &itv
->i_flags
))
1729 ev
->type
= VIDEO_EVENT_DECODER_STOPPED
;
1730 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC
, &itv
->i_flags
)) {
1731 ev
->type
= VIDEO_EVENT_VSYNC
;
1732 ev
->u
.vsync_field
= test_bit(IVTV_F_I_EV_VSYNC_FIELD
, &itv
->i_flags
) ?
1733 VIDEO_VSYNC_FIELD_ODD
: VIDEO_VSYNC_FIELD_EVEN
;
1734 if (itv
->output_mode
== OUT_UDMA_YUV
&&
1735 (itv
->yuv_info
.lace_mode
& IVTV_YUV_MODE_MASK
) ==
1736 IVTV_YUV_MODE_PROGRESSIVE
) {
1737 ev
->u
.vsync_field
= VIDEO_VSYNC_FIELD_PROGRESSIVE
;
1744 /* Wait for event. Note that serialize_lock is locked,
1745 so to allow other processes to access the driver while
1746 we are waiting unlock first and later lock again. */
1747 mutex_unlock(&itv
->serialize_lock
);
1748 prepare_to_wait(&itv
->event_waitq
, &wait
, TASK_INTERRUPTIBLE
);
1749 if (!test_bit(IVTV_F_I_EV_DEC_STOPPED
, &itv
->i_flags
) &&
1750 !test_bit(IVTV_F_I_EV_VSYNC
, &itv
->i_flags
))
1752 finish_wait(&itv
->event_waitq
, &wait
);
1753 mutex_lock(&itv
->serialize_lock
);
1754 if (signal_pending(current
)) {
1755 /* return if a signal was received */
1756 IVTV_DEBUG_INFO("User stopped wait for event\n");
1763 case VIDEO_SELECT_SOURCE
:
1764 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1765 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1767 return ivtv_passthrough_mode(itv
, iarg
== VIDEO_SOURCE_DEMUX
);
1769 case AUDIO_SET_MUTE
:
1770 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1771 itv
->speed_mute_audio
= iarg
;
1774 case AUDIO_CHANNEL_SELECT
:
1775 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1776 if (iarg
> AUDIO_STEREO_SWAPPED
)
1778 itv
->audio_stereo_mode
= iarg
;
1779 ivtv_vapi(itv
, CX2341X_DEC_SET_AUDIO_MODE
, 2, itv
->audio_bilingual_mode
, itv
->audio_stereo_mode
);
1782 case AUDIO_BILINGUAL_CHANNEL_SELECT
:
1783 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1784 if (iarg
> AUDIO_STEREO_SWAPPED
)
1786 itv
->audio_bilingual_mode
= iarg
;
1787 ivtv_vapi(itv
, CX2341X_DEC_SET_AUDIO_MODE
, 2, itv
->audio_bilingual_mode
, itv
->audio_stereo_mode
);
1796 static long ivtv_default(struct file
*file
, void *fh
, bool valid_prio
,
1799 struct ivtv
*itv
= fh2id(fh
)->itv
;
1806 case VIDEO_CONTINUE
:
1808 case VIDEO_SELECT_SOURCE
:
1809 case AUDIO_SET_MUTE
:
1810 case AUDIO_CHANNEL_SELECT
:
1811 case AUDIO_BILINGUAL_CHANNEL_SELECT
:
1817 case VIDIOC_INT_RESET
: {
1818 u32 val
= *(u32
*)arg
;
1820 if ((val
== 0 && itv
->options
.newi2c
) || (val
& 0x01))
1821 ivtv_reset_ir_gpio(itv
);
1823 v4l2_subdev_call(itv
->sd_video
, core
, reset
, 0);
1827 case IVTV_IOC_DMA_FRAME
:
1829 case VIDEO_GET_FRAME_COUNT
:
1830 case VIDEO_GET_EVENT
:
1834 case VIDEO_CONTINUE
:
1836 case VIDEO_TRY_COMMAND
:
1837 case VIDEO_SELECT_SOURCE
:
1838 case AUDIO_SET_MUTE
:
1839 case AUDIO_CHANNEL_SELECT
:
1840 case AUDIO_BILINGUAL_CHANNEL_SELECT
:
1841 return ivtv_decoder_ioctls(file
, cmd
, (void *)arg
);
1849 long ivtv_v4l2_ioctl(struct file
*filp
, unsigned int cmd
, unsigned long arg
)
1851 struct video_device
*vfd
= video_devdata(filp
);
1854 if (ivtv_debug
& IVTV_DBGFLG_IOCTL
)
1855 vfd
->debug
= V4L2_DEBUG_IOCTL
| V4L2_DEBUG_IOCTL_ARG
;
1856 ret
= video_ioctl2(filp
, cmd
, arg
);
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_enum_fmt_vid_out
= ivtv_enum_fmt_vid_out
,
1893 .vidioc_g_fmt_vid_cap
= ivtv_g_fmt_vid_cap
,
1894 .vidioc_g_fmt_vbi_cap
= ivtv_g_fmt_vbi_cap
,
1895 .vidioc_g_fmt_sliced_vbi_cap
= ivtv_g_fmt_sliced_vbi_cap
,
1896 .vidioc_g_fmt_vid_out
= ivtv_g_fmt_vid_out
,
1897 .vidioc_g_fmt_vid_out_overlay
= ivtv_g_fmt_vid_out_overlay
,
1898 .vidioc_g_fmt_sliced_vbi_out
= ivtv_g_fmt_sliced_vbi_out
,
1899 .vidioc_s_fmt_vid_cap
= ivtv_s_fmt_vid_cap
,
1900 .vidioc_s_fmt_vbi_cap
= ivtv_s_fmt_vbi_cap
,
1901 .vidioc_s_fmt_sliced_vbi_cap
= ivtv_s_fmt_sliced_vbi_cap
,
1902 .vidioc_s_fmt_vid_out
= ivtv_s_fmt_vid_out
,
1903 .vidioc_s_fmt_vid_out_overlay
= ivtv_s_fmt_vid_out_overlay
,
1904 .vidioc_s_fmt_sliced_vbi_out
= ivtv_s_fmt_sliced_vbi_out
,
1905 .vidioc_try_fmt_vid_cap
= ivtv_try_fmt_vid_cap
,
1906 .vidioc_try_fmt_vbi_cap
= ivtv_try_fmt_vbi_cap
,
1907 .vidioc_try_fmt_sliced_vbi_cap
= ivtv_try_fmt_sliced_vbi_cap
,
1908 .vidioc_try_fmt_vid_out
= ivtv_try_fmt_vid_out
,
1909 .vidioc_try_fmt_vid_out_overlay
= ivtv_try_fmt_vid_out_overlay
,
1910 .vidioc_try_fmt_sliced_vbi_out
= ivtv_try_fmt_sliced_vbi_out
,
1911 .vidioc_g_sliced_vbi_cap
= ivtv_g_sliced_vbi_cap
,
1912 .vidioc_g_chip_ident
= ivtv_g_chip_ident
,
1913 #ifdef CONFIG_VIDEO_ADV_DEBUG
1914 .vidioc_g_register
= ivtv_g_register
,
1915 .vidioc_s_register
= ivtv_s_register
,
1917 .vidioc_default
= ivtv_default
,
1918 .vidioc_subscribe_event
= ivtv_subscribe_event
,
1919 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1922 void ivtv_set_funcs(struct video_device
*vdev
)
1924 vdev
->ioctl_ops
= &ivtv_ioctl_ops
;