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 int single_step
= (speed
== 1 || speed
== -1);
141 if (speed
== 0) speed
= 1000;
144 if (speed
== itv
->speed
&& !single_step
)
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);
154 /* Need to change direction */
155 speed
= speed
< 0 ? -1000 : 1000;
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;
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
);
171 /* If not decoding, just change speed setting */
172 if (atomic_read(&itv
->decoding
) > 0) {
175 /* Stop all DMA and decoding activity */
176 ivtv_vapi(itv
, CX2341X_DEC_PAUSE_PLAYBACK
, 1, 0);
178 /* Wait for any DMA to finish */
179 mutex_unlock(&itv
->serialize_lock
);
180 prepare_to_wait(&itv
->dma_waitq
, &wait
, TASK_INTERRUPTIBLE
);
181 while (test_bit(IVTV_F_I_DMA
, &itv
->i_flags
)) {
182 got_sig
= signal_pending(current
);
188 finish_wait(&itv
->dma_waitq
, &wait
);
189 mutex_lock(&itv
->serialize_lock
);
193 /* Change Speed safely */
194 ivtv_api(itv
, CX2341X_DEC_SET_PLAYBACK_SPEED
, 7, data
);
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]);
199 speed
= (speed
< 0) ? -1 : 1;
200 ivtv_vapi(itv
, CX2341X_DEC_STEP_VIDEO
, 1, 0);
206 static int ivtv_validate_speed(int cur_speed
, int new_speed
)
208 int fact
= new_speed
< 0 ? -1 : 1;
214 new_speed
= -new_speed
;
216 cur_speed
= -cur_speed
;
218 if (cur_speed
<= new_speed
) {
219 if (new_speed
> 1500)
221 if (new_speed
> 1000)
225 if (new_speed
>= 2000)
227 if (new_speed
>= 1500)
229 if (new_speed
>= 1000)
234 if (new_speed
== 1 || new_speed
== 1000)
235 return fact
* 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
);
245 static int ivtv_video_command(struct ivtv
*itv
, struct ivtv_open_id
*id
,
246 struct v4l2_decoder_cmd
*dc
, int try)
248 struct ivtv_stream
*s
= &itv
->streams
[IVTV_DEC_STREAM_TYPE_MPG
];
250 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
254 case V4L2_DEC_CMD_START
: {
255 dc
->flags
&= V4L2_DEC_CMD_START_MUTE_AUDIO
;
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
;
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 :
263 V4L2_DEC_CMD_START_MUTE_AUDIO
;
266 itv
->speed_mute_audio
= dc
->flags
& V4L2_DEC_CMD_START_MUTE_AUDIO
;
267 if (ivtv_set_output_mode(itv
, OUT_MPG
) != OUT_MPG
)
269 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED
, &itv
->i_flags
)) {
270 /* forces ivtv_set_speed to be called */
273 return ivtv_start_decoding(id
, dc
->start
.speed
);
276 case V4L2_DEC_CMD_STOP
:
277 dc
->flags
&= V4L2_DEC_CMD_STOP_IMMEDIATELY
| V4L2_DEC_CMD_STOP_TO_BLACK
;
278 if (dc
->flags
& V4L2_DEC_CMD_STOP_IMMEDIATELY
)
281 if (atomic_read(&itv
->decoding
) == 0)
283 if (itv
->output_mode
!= OUT_MPG
)
286 itv
->output_mode
= OUT_NONE
;
287 return ivtv_stop_v4l2_decode_stream(s
, dc
->flags
, dc
->stop
.pts
);
289 case V4L2_DEC_CMD_PAUSE
:
290 dc
->flags
&= V4L2_DEC_CMD_PAUSE_TO_BLACK
;
292 if (!atomic_read(&itv
->decoding
))
294 if (itv
->output_mode
!= OUT_MPG
)
296 if (atomic_read(&itv
->decoding
) > 0) {
297 ivtv_vapi(itv
, CX2341X_DEC_PAUSE_PLAYBACK
, 1,
298 (dc
->flags
& V4L2_DEC_CMD_PAUSE_TO_BLACK
) ? 1 : 0);
299 set_bit(IVTV_F_I_DEC_PAUSED
, &itv
->i_flags
);
303 case V4L2_DEC_CMD_RESUME
:
306 if (!atomic_read(&itv
->decoding
))
308 if (itv
->output_mode
!= OUT_MPG
)
310 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED
, &itv
->i_flags
)) {
311 int speed
= itv
->speed
;
313 return ivtv_start_decoding(id
, speed
);
323 static int ivtv_g_fmt_sliced_vbi_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
325 struct ivtv
*itv
= fh2id(fh
)->itv
;
326 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
328 vbifmt
->reserved
[0] = 0;
329 vbifmt
->reserved
[1] = 0;
330 if (!(itv
->v4l2_cap
& V4L2_CAP_SLICED_VBI_OUTPUT
))
332 vbifmt
->io_size
= sizeof(struct v4l2_sliced_vbi_data
) * 36;
333 memset(vbifmt
->service_lines
, 0, sizeof(vbifmt
->service_lines
));
335 vbifmt
->service_lines
[0][21] = V4L2_SLICED_CAPTION_525
;
336 vbifmt
->service_lines
[1][21] = V4L2_SLICED_CAPTION_525
;
338 vbifmt
->service_lines
[0][23] = V4L2_SLICED_WSS_625
;
339 vbifmt
->service_lines
[0][16] = V4L2_SLICED_VPS
;
341 vbifmt
->service_set
= ivtv_get_service_set(vbifmt
);
345 static int ivtv_g_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
347 struct ivtv_open_id
*id
= fh2id(fh
);
348 struct ivtv
*itv
= id
->itv
;
349 struct v4l2_pix_format
*pixfmt
= &fmt
->fmt
.pix
;
351 pixfmt
->width
= itv
->cxhdl
.width
;
352 pixfmt
->height
= itv
->cxhdl
.height
;
353 pixfmt
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
354 pixfmt
->field
= V4L2_FIELD_INTERLACED
;
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;
362 pixfmt
->pixelformat
= V4L2_PIX_FMT_MPEG
;
363 pixfmt
->sizeimage
= 128 * 1024;
364 pixfmt
->bytesperline
= 0;
369 static int ivtv_g_fmt_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
371 struct ivtv
*itv
= fh2id(fh
)->itv
;
372 struct v4l2_vbi_format
*vbifmt
= &fmt
->fmt
.vbi
;
374 vbifmt
->sampling_rate
= 27000000;
375 vbifmt
->offset
= 248;
376 vbifmt
->samples_per_line
= itv
->vbi
.raw_decoder_line_size
- 4;
377 vbifmt
->sample_format
= V4L2_PIX_FMT_GREY
;
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
;
382 vbifmt
->reserved
[0] = 0;
383 vbifmt
->reserved
[1] = 0;
387 static int ivtv_g_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
389 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
390 struct ivtv_open_id
*id
= fh2id(fh
);
391 struct ivtv
*itv
= id
->itv
;
393 vbifmt
->reserved
[0] = 0;
394 vbifmt
->reserved
[1] = 0;
395 vbifmt
->io_size
= sizeof(struct v4l2_sliced_vbi_data
) * 36;
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
);
405 v4l2_subdev_call(itv
->sd_video
, vbi
, g_sliced_fmt
, vbifmt
);
406 vbifmt
->service_set
= ivtv_get_service_set(vbifmt
);
410 static int ivtv_g_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
412 struct ivtv_open_id
*id
= fh2id(fh
);
413 struct ivtv
*itv
= id
->itv
;
414 struct v4l2_pix_format
*pixfmt
= &fmt
->fmt
.pix
;
416 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
418 pixfmt
->width
= itv
->main_rect
.width
;
419 pixfmt
->height
= itv
->main_rect
.height
;
420 pixfmt
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
421 pixfmt
->field
= V4L2_FIELD_INTERLACED
;
423 if (id
->type
== IVTV_DEC_STREAM_TYPE_YUV
) {
424 switch (itv
->yuv_info
.lace_mode
& IVTV_YUV_MODE_MASK
) {
425 case IVTV_YUV_MODE_INTERLACED
:
426 pixfmt
->field
= (itv
->yuv_info
.lace_mode
& IVTV_YUV_SYNC_MASK
) ?
427 V4L2_FIELD_INTERLACED_BT
: V4L2_FIELD_INTERLACED_TB
;
429 case IVTV_YUV_MODE_PROGRESSIVE
:
430 pixfmt
->field
= V4L2_FIELD_NONE
;
433 pixfmt
->field
= V4L2_FIELD_ANY
;
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))) */
442 1080 * ((pixfmt
->height
+ 31) & ~31);
444 pixfmt
->pixelformat
= V4L2_PIX_FMT_MPEG
;
445 pixfmt
->sizeimage
= 128 * 1024;
446 pixfmt
->bytesperline
= 0;
451 static int ivtv_g_fmt_vid_out_overlay(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
453 struct ivtv
*itv
= fh2id(fh
)->itv
;
454 struct v4l2_window
*winfmt
= &fmt
->fmt
.win
;
456 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
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
;
470 static int ivtv_try_fmt_sliced_vbi_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
472 return ivtv_g_fmt_sliced_vbi_out(file
, fh
, fmt
);
475 static int ivtv_try_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
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
;
485 if (id
->type
== IVTV_ENC_STREAM_TYPE_YUV
) {
486 /* YUV height must be a multiple of 32 */
490 h
= min(h
, itv
->is_50hz
? 576 : 480);
492 ivtv_g_fmt_vid_cap(file
, fh
, fmt
);
493 fmt
->fmt
.pix
.width
= w
;
494 fmt
->fmt
.pix
.height
= h
;
498 static int ivtv_try_fmt_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
500 return ivtv_g_fmt_vbi_cap(file
, fh
, fmt
);
503 static int ivtv_try_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
505 struct v4l2_sliced_vbi_format
*vbifmt
= &fmt
->fmt
.sliced
;
506 struct ivtv_open_id
*id
= fh2id(fh
);
507 struct ivtv
*itv
= id
->itv
;
509 if (id
->type
== IVTV_DEC_STREAM_TYPE_VBI
)
510 return ivtv_g_fmt_sliced_vbi_cap(file
, fh
, fmt
);
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;
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
);
524 static int ivtv_try_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
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
);
534 /* Why can the height be 576 even when the output is NTSC?
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.
545 Note that the scaling only occurs on the video stream, the osd
546 resolution is locked to the broadcast standard and not scaled.
548 Thanks to Ian Armstrong for this explanation. */
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
;
558 static int ivtv_try_fmt_vid_out_overlay(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
560 struct ivtv
*itv
= fh2id(fh
)->itv
;
561 u32 chromakey
= fmt
->fmt
.win
.chromakey
;
562 u8 global_alpha
= fmt
->fmt
.win
.global_alpha
;
564 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
566 ivtv_g_fmt_vid_out_overlay(file
, fh
, fmt
);
567 fmt
->fmt
.win
.chromakey
= chromakey
;
568 fmt
->fmt
.win
.global_alpha
= global_alpha
;
572 static int ivtv_s_fmt_sliced_vbi_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
574 return ivtv_g_fmt_sliced_vbi_out(file
, fh
, fmt
);
577 static int ivtv_s_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
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
;
589 if (itv
->cxhdl
.width
== w
&& itv
->cxhdl
.height
== h
)
592 if (atomic_read(&itv
->capturing
) > 0)
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
;
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
);
606 static int ivtv_s_fmt_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
608 struct ivtv
*itv
= fh2id(fh
)->itv
;
610 if (!ivtv_raw_vbi(itv
) && atomic_read(&itv
->capturing
) > 0)
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
);
618 static int ivtv_s_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
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
);
625 if (ret
|| id
->type
== IVTV_DEC_STREAM_TYPE_VBI
)
628 check_service_set(vbifmt
, itv
->is_50hz
);
629 if (ivtv_raw_vbi(itv
) && atomic_read(&itv
->capturing
) > 0)
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
));
637 static int ivtv_s_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
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
);
647 if (id
->type
!= IVTV_DEC_STREAM_TYPE_YUV
)
650 /* Return now if we already have some frame data */
654 yi
->v4l2_src_w
= fmt
->fmt
.pix
.width
;
655 yi
->v4l2_src_h
= fmt
->fmt
.pix
.height
;
657 switch (fmt
->fmt
.pix
.field
) {
658 case V4L2_FIELD_NONE
:
659 yi
->lace_mode
= IVTV_YUV_MODE_PROGRESSIVE
;
662 yi
->lace_mode
= IVTV_YUV_MODE_AUTO
;
664 case V4L2_FIELD_INTERLACED_BT
:
666 IVTV_YUV_MODE_INTERLACED
|IVTV_YUV_SYNC_ODD
;
668 case V4L2_FIELD_INTERLACED_TB
:
670 yi
->lace_mode
= IVTV_YUV_MODE_INTERLACED
;
673 yi
->lace_sync_field
= (yi
->lace_mode
& IVTV_YUV_SYNC_MASK
) == IVTV_YUV_SYNC_EVEN
? 0 : 1;
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);
682 static int ivtv_s_fmt_vid_out_overlay(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
684 struct ivtv
*itv
= fh2id(fh
)->itv
;
685 int ret
= ivtv_try_fmt_vid_out_overlay(file
, fh
, fmt
);
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
);
695 static int ivtv_g_chip_ident(struct file
*file
, void *fh
, struct v4l2_dbg_chip_ident
*chip
)
697 struct ivtv
*itv
= fh2id(fh
)->itv
;
699 chip
->ident
= V4L2_IDENT_NONE
;
701 if (chip
->match
.type
== V4L2_CHIP_MATCH_HOST
) {
702 if (v4l2_chip_match_host(&chip
->match
))
703 chip
->ident
= itv
->has_cx23415
? V4L2_IDENT_CX23415
: V4L2_IDENT_CX23416
;
706 if (chip
->match
.type
!= V4L2_CHIP_MATCH_I2C_DRIVER
&&
707 chip
->match
.type
!= V4L2_CHIP_MATCH_I2C_ADDR
)
709 /* TODO: is this correct? */
710 return ivtv_call_all_err(itv
, core
, g_chip_ident
, chip
);
713 #ifdef CONFIG_VIDEO_ADV_DEBUG
714 static int ivtv_itvc(struct ivtv
*itv
, unsigned int cmd
, void *arg
)
716 struct v4l2_dbg_register
*regs
= arg
;
717 volatile u8 __iomem
*reg_start
;
719 if (!capable(CAP_SYS_ADMIN
))
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
&&
724 regs
->reg
< IVTV_DECODER_OFFSET
+ IVTV_DECODER_SIZE
)
725 reg_start
= itv
->dec_mem
- IVTV_DECODER_OFFSET
;
726 else if (regs
->reg
< IVTV_ENCODER_SIZE
)
727 reg_start
= itv
->enc_mem
;
732 if (cmd
== VIDIOC_DBG_G_REGISTER
)
733 regs
->val
= readl(regs
->reg
+ reg_start
);
735 writel(regs
->val
, regs
->reg
+ reg_start
);
739 static int ivtv_g_register(struct file
*file
, void *fh
, struct v4l2_dbg_register
*reg
)
741 struct ivtv
*itv
= fh2id(fh
)->itv
;
743 if (v4l2_chip_match_host(®
->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
);
751 static int ivtv_s_register(struct file
*file
, void *fh
, struct v4l2_dbg_register
*reg
)
753 struct ivtv
*itv
= fh2id(fh
)->itv
;
755 if (v4l2_chip_match_host(®
->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
);
764 static int ivtv_querycap(struct file
*file
, void *fh
, struct v4l2_capability
*vcap
)
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
];
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
));
773 vcap
->capabilities
= itv
->v4l2_cap
| V4L2_CAP_DEVICE_CAPS
;
774 vcap
->device_caps
= s
->caps
;
778 static int ivtv_enumaudio(struct file
*file
, void *fh
, struct v4l2_audio
*vin
)
780 struct ivtv
*itv
= fh2id(fh
)->itv
;
782 return ivtv_get_audio_input(itv
, vin
->index
, vin
);
785 static int ivtv_g_audio(struct file
*file
, void *fh
, struct v4l2_audio
*vin
)
787 struct ivtv
*itv
= fh2id(fh
)->itv
;
789 vin
->index
= itv
->audio_input
;
790 return ivtv_get_audio_input(itv
, vin
->index
, vin
);
793 static int ivtv_s_audio(struct file
*file
, void *fh
, const struct v4l2_audio
*vout
)
795 struct ivtv
*itv
= fh2id(fh
)->itv
;
797 if (vout
->index
>= itv
->nof_audio_inputs
)
800 itv
->audio_input
= vout
->index
;
801 ivtv_audio_set_io(itv
);
806 static int ivtv_enumaudout(struct file
*file
, void *fh
, struct v4l2_audioout
*vin
)
808 struct ivtv
*itv
= fh2id(fh
)->itv
;
810 /* set it to defaults from our table */
811 return ivtv_get_audio_output(itv
, vin
->index
, vin
);
814 static int ivtv_g_audout(struct file
*file
, void *fh
, struct v4l2_audioout
*vin
)
816 struct ivtv
*itv
= fh2id(fh
)->itv
;
819 return ivtv_get_audio_output(itv
, vin
->index
, vin
);
822 static int ivtv_s_audout(struct file
*file
, void *fh
, const struct v4l2_audioout
*vout
)
824 struct ivtv
*itv
= fh2id(fh
)->itv
;
826 if (itv
->card
->video_outputs
== NULL
|| vout
->index
!= 0)
831 static int ivtv_enum_input(struct file
*file
, void *fh
, struct v4l2_input
*vin
)
833 struct ivtv
*itv
= fh2id(fh
)->itv
;
835 /* set it to defaults from our table */
836 return ivtv_get_input(itv
, vin
->index
, vin
);
839 static int ivtv_enum_output(struct file
*file
, void *fh
, struct v4l2_output
*vout
)
841 struct ivtv
*itv
= fh2id(fh
)->itv
;
843 return ivtv_get_output(itv
, vout
->index
, vout
);
846 static int ivtv_cropcap(struct file
*file
, void *fh
, struct v4l2_cropcap
*cropcap
)
848 struct ivtv_open_id
*id
= fh2id(fh
);
849 struct ivtv
*itv
= id
->itv
;
850 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
853 streamtype
= id
->type
;
855 if (cropcap
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
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
) {
865 cropcap
->bounds
.width
= yi
->osd_full_w
;
866 cropcap
->bounds
.height
= yi
->osd_full_h
;
868 cropcap
->bounds
.width
= 720;
869 cropcap
->bounds
.height
=
870 itv
->is_out_50hz
? 576 : 480;
872 cropcap
->pixelaspect
.numerator
= itv
->is_out_50hz
? 59 : 10;
873 cropcap
->pixelaspect
.denominator
= itv
->is_out_50hz
? 54 : 11;
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;
879 cropcap
->defrect
= cropcap
->bounds
;
883 static int ivtv_s_crop(struct file
*file
, void *fh
, const struct v4l2_crop
*crop
)
885 struct ivtv_open_id
*id
= fh2id(fh
);
886 struct ivtv
*itv
= id
->itv
;
887 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
890 streamtype
= id
->type
;
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
;
898 if (!ivtv_vapi(itv
, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW
, 4,
899 crop
->c
.width
, crop
->c
.height
, crop
->c
.left
, crop
->c
.top
)) {
900 itv
->main_rect
= crop
->c
;
909 static int ivtv_g_crop(struct file
*file
, void *fh
, struct v4l2_crop
*crop
)
911 struct ivtv_open_id
*id
= fh2id(fh
);
912 struct ivtv
*itv
= id
->itv
;
913 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
916 streamtype
= id
->type
;
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
;
923 crop
->c
= itv
->main_rect
;
929 static int ivtv_enum_fmt_vid_cap(struct file
*file
, void *fh
, struct v4l2_fmtdesc
*fmt
)
931 static const struct v4l2_fmtdesc hm12
= {
932 0, V4L2_BUF_TYPE_VIDEO_CAPTURE
, 0,
933 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12
,
936 static const struct v4l2_fmtdesc mpeg
= {
937 0, V4L2_BUF_TYPE_VIDEO_CAPTURE
, V4L2_FMT_FLAG_COMPRESSED
,
938 "MPEG", V4L2_PIX_FMT_MPEG
,
941 struct ivtv
*itv
= fh2id(fh
)->itv
;
942 struct ivtv_stream
*s
= &itv
->streams
[fh2id(fh
)->type
];
946 if (s
->type
== IVTV_ENC_STREAM_TYPE_MPG
)
948 else if (s
->type
== IVTV_ENC_STREAM_TYPE_YUV
)
955 static int ivtv_enum_fmt_vid_out(struct file
*file
, void *fh
, struct v4l2_fmtdesc
*fmt
)
957 static const struct v4l2_fmtdesc hm12
= {
958 0, V4L2_BUF_TYPE_VIDEO_OUTPUT
, 0,
959 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12
,
962 static const struct v4l2_fmtdesc mpeg
= {
963 0, V4L2_BUF_TYPE_VIDEO_OUTPUT
, V4L2_FMT_FLAG_COMPRESSED
,
964 "MPEG", V4L2_PIX_FMT_MPEG
,
967 struct ivtv
*itv
= fh2id(fh
)->itv
;
968 struct ivtv_stream
*s
= &itv
->streams
[fh2id(fh
)->type
];
972 if (s
->type
== IVTV_DEC_STREAM_TYPE_MPG
)
974 else if (s
->type
== IVTV_DEC_STREAM_TYPE_YUV
)
981 static int ivtv_g_input(struct file
*file
, void *fh
, unsigned int *i
)
983 struct ivtv
*itv
= fh2id(fh
)->itv
;
985 *i
= itv
->active_input
;
990 int ivtv_s_input(struct file
*file
, void *fh
, unsigned int inp
)
992 struct ivtv
*itv
= fh2id(fh
)->itv
;
996 if (inp
>= itv
->nof_inputs
)
999 if (inp
== itv
->active_input
) {
1000 IVTV_DEBUG_INFO("Input unchanged\n");
1004 if (atomic_read(&itv
->capturing
) > 0) {
1008 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
1009 itv
->active_input
, inp
);
1011 itv
->active_input
= inp
;
1012 /* Set the audio input to whatever is appropriate for the
1014 itv
->audio_input
= itv
->card
->video_inputs
[inp
].audio_index
;
1016 if (itv
->card
->video_inputs
[inp
].video_type
== IVTV_CARD_INPUT_VID_TUNER
)
1017 std
= itv
->tuner_std
;
1020 for (i
= 0; i
<= IVTV_ENC_STREAM_TYPE_VBI
; i
++)
1021 itv
->streams
[i
].vdev
->tvnorms
= std
;
1023 /* prevent others from messing with the streams until
1024 we're finished changing inputs. */
1026 ivtv_video_set_io(itv
);
1027 ivtv_audio_set_io(itv
);
1033 static int ivtv_g_output(struct file
*file
, void *fh
, unsigned int *i
)
1035 struct ivtv
*itv
= fh2id(fh
)->itv
;
1037 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1040 *i
= itv
->active_output
;
1045 static int ivtv_s_output(struct file
*file
, void *fh
, unsigned int outp
)
1047 struct ivtv
*itv
= fh2id(fh
)->itv
;
1049 if (outp
>= itv
->card
->nof_outputs
)
1052 if (outp
== itv
->active_output
) {
1053 IVTV_DEBUG_INFO("Output unchanged\n");
1056 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1057 itv
->active_output
, outp
);
1059 itv
->active_output
= outp
;
1060 ivtv_call_hw(itv
, IVTV_HW_SAA7127
, video
, s_routing
,
1061 SAA7127_INPUT_TYPE_NORMAL
,
1062 itv
->card
->video_outputs
[outp
].video_output
, 0);
1067 static int ivtv_g_frequency(struct file
*file
, void *fh
, struct v4l2_frequency
*vf
)
1069 struct ivtv
*itv
= fh2id(fh
)->itv
;
1070 struct ivtv_stream
*s
= &itv
->streams
[fh2id(fh
)->type
];
1072 if (s
->vdev
->vfl_dir
)
1077 ivtv_call_all(itv
, tuner
, g_frequency
, vf
);
1081 int ivtv_s_frequency(struct file
*file
, void *fh
, const struct v4l2_frequency
*vf
)
1083 struct ivtv
*itv
= fh2id(fh
)->itv
;
1084 struct ivtv_stream
*s
= &itv
->streams
[fh2id(fh
)->type
];
1086 if (s
->vdev
->vfl_dir
)
1092 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf
->frequency
);
1093 ivtv_call_all(itv
, tuner
, s_frequency
, vf
);
1098 static int ivtv_g_std(struct file
*file
, void *fh
, v4l2_std_id
*std
)
1100 struct ivtv
*itv
= fh2id(fh
)->itv
;
1106 void ivtv_s_std_enc(struct ivtv
*itv
, v4l2_std_id
*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;
1118 if (itv
->hw_flags
& IVTV_HW_CX25840
)
1119 itv
->vbi
.sliced_decoder_line_size
= itv
->is_60hz
? 272 : 284;
1122 ivtv_call_all(itv
, core
, s_std
, itv
->std
);
1125 void ivtv_s_std_dec(struct ivtv
*itv
, v4l2_std_id
*std
)
1127 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
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
);
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.
1143 mutex_unlock(&itv
->serialize_lock
);
1144 for (f
= 0; f
< 4; f
++) {
1145 prepare_to_wait(&itv
->vsync_waitq
, &wait
,
1146 TASK_UNINTERRUPTIBLE
);
1147 if ((read_reg(IVTV_REG_DEC_LINE_FIELD
) >> 16) < 100)
1149 schedule_timeout(msecs_to_jiffies(25));
1151 finish_wait(&itv
->vsync_waitq
, &wait
);
1152 mutex_lock(&itv
->serialize_lock
);
1155 IVTV_WARN("Mode change failed to sync to decoder\n");
1157 ivtv_vapi(itv
, CX2341X_DEC_SET_STANDARD
, 1, itv
->is_out_50hz
);
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;
1162 ivtv_vapi(itv
, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW
, 4,
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;
1171 static int ivtv_s_std(struct file
*file
, void *fh
, v4l2_std_id
*std
)
1173 struct ivtv
*itv
= fh2id(fh
)->itv
;
1175 if ((*std
& V4L2_STD_ALL
) == 0)
1178 if (*std
== itv
->std
)
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. */
1189 IVTV_DEBUG_INFO("Switching standard to %llx.\n",
1190 (unsigned long long)itv
->std
);
1192 ivtv_s_std_enc(itv
, std
);
1193 if (itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
)
1194 ivtv_s_std_dec(itv
, std
);
1199 static int ivtv_s_tuner(struct file
*file
, void *fh
, struct v4l2_tuner
*vt
)
1201 struct ivtv_open_id
*id
= fh2id(fh
);
1202 struct ivtv
*itv
= id
->itv
;
1207 ivtv_call_all(itv
, tuner
, s_tuner
, vt
);
1212 static int ivtv_g_tuner(struct file
*file
, void *fh
, struct v4l2_tuner
*vt
)
1214 struct ivtv
*itv
= fh2id(fh
)->itv
;
1219 ivtv_call_all(itv
, tuner
, g_tuner
, vt
);
1221 if (vt
->type
== V4L2_TUNER_RADIO
)
1222 strlcpy(vt
->name
, "ivtv Radio Tuner", sizeof(vt
->name
));
1224 strlcpy(vt
->name
, "ivtv TV Tuner", sizeof(vt
->name
));
1228 static int ivtv_g_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_sliced_vbi_cap
*cap
)
1230 struct ivtv
*itv
= fh2id(fh
)->itv
;
1231 int set
= itv
->is_50hz
? V4L2_SLICED_VBI_625
: V4L2_SLICED_VBI_525
;
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
;
1241 } else if (cap
->type
== V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
) {
1242 if (!(itv
->v4l2_cap
& V4L2_CAP_SLICED_VBI_OUTPUT
))
1245 cap
->service_lines
[0][21] = V4L2_SLICED_CAPTION_525
;
1246 cap
->service_lines
[1][21] = V4L2_SLICED_CAPTION_525
;
1248 cap
->service_lines
[0][23] = V4L2_SLICED_WSS_625
;
1249 cap
->service_lines
[0][16] = V4L2_SLICED_VPS
;
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
;
1263 static int ivtv_g_enc_index(struct file
*file
, void *fh
, struct v4l2_enc_idx
*idx
)
1265 struct ivtv
*itv
= fh2id(fh
)->itv
;
1266 struct v4l2_enc_idx_entry
*e
= idx
->entry
;
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
;
1275 idx
->entries_cap
= IVTV_MAX_PGM_INDEX
;
1276 if (!atomic_read(&itv
->capturing
))
1278 for (i
= 0; i
< entries
; i
++) {
1279 *e
= itv
->pgm_info
[(itv
->pgm_info_read_idx
+ i
) % IVTV_MAX_PGM_INDEX
];
1280 if ((e
->flags
& V4L2_ENC_IDX_FRAME_MASK
) <= V4L2_ENC_IDX_FRAME_B
) {
1285 itv
->pgm_info_read_idx
= (itv
->pgm_info_read_idx
+ idx
->entries
) % IVTV_MAX_PGM_INDEX
;
1289 static int ivtv_encoder_cmd(struct file
*file
, void *fh
, struct v4l2_encoder_cmd
*enc
)
1291 struct ivtv_open_id
*id
= fh2id(fh
);
1292 struct ivtv
*itv
= id
->itv
;
1296 case V4L2_ENC_CMD_START
:
1297 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1299 return ivtv_start_capture(id
);
1301 case V4L2_ENC_CMD_STOP
:
1302 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1303 enc
->flags
&= V4L2_ENC_CMD_STOP_AT_GOP_END
;
1304 ivtv_stop_capture(id
, enc
->flags
& V4L2_ENC_CMD_STOP_AT_GOP_END
);
1307 case V4L2_ENC_CMD_PAUSE
:
1308 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1311 if (!atomic_read(&itv
->capturing
))
1313 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED
, &itv
->i_flags
))
1317 ivtv_vapi(itv
, CX2341X_ENC_PAUSE_ENCODER
, 1, 0);
1320 case V4L2_ENC_CMD_RESUME
:
1321 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1324 if (!atomic_read(&itv
->capturing
))
1327 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED
, &itv
->i_flags
))
1330 ivtv_vapi(itv
, CX2341X_ENC_PAUSE_ENCODER
, 1, 1);
1334 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc
->cmd
);
1341 static int ivtv_try_encoder_cmd(struct file
*file
, void *fh
, struct v4l2_encoder_cmd
*enc
)
1343 struct ivtv
*itv
= fh2id(fh
)->itv
;
1346 case V4L2_ENC_CMD_START
:
1347 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1351 case V4L2_ENC_CMD_STOP
:
1352 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1353 enc
->flags
&= V4L2_ENC_CMD_STOP_AT_GOP_END
;
1356 case V4L2_ENC_CMD_PAUSE
:
1357 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1361 case V4L2_ENC_CMD_RESUME
:
1362 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1366 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc
->cmd
);
1371 static int ivtv_g_fbuf(struct file
*file
, void *fh
, struct v4l2_framebuffer
*fb
)
1373 struct ivtv
*itv
= fh2id(fh
)->itv
;
1374 u32 data
[CX2341X_MBOX_MAX_DATA
];
1375 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
1378 static u32 pixel_format
[16] = {
1379 V4L2_PIX_FMT_PAL8
, /* Uses a 256-entry RGB colormap */
1380 V4L2_PIX_FMT_RGB565
,
1381 V4L2_PIX_FMT_RGB555
,
1382 V4L2_PIX_FMT_RGB444
,
1387 V4L2_PIX_FMT_PAL8
, /* Uses a 256-entry YUV colormap */
1388 V4L2_PIX_FMT_YUV565
,
1389 V4L2_PIX_FMT_YUV555
,
1390 V4L2_PIX_FMT_YUV444
,
1397 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT_OVERLAY
))
1399 if (!itv
->osd_video_pbase
)
1402 fb
->capability
= V4L2_FBUF_CAP_EXTERNOVERLAY
| V4L2_FBUF_CAP_CHROMAKEY
|
1403 V4L2_FBUF_CAP_GLOBAL_ALPHA
;
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;
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
;
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
;
1426 if (itv
->osd_chroma_key_state
)
1427 fb
->flags
|= V4L2_FBUF_FLAG_CHROMAKEY
;
1429 if (itv
->osd_global_alpha_state
)
1430 fb
->flags
|= V4L2_FBUF_FLAG_GLOBAL_ALPHA
;
1433 fb
->flags
|= V4L2_FBUF_FLAG_OVERLAY
;
1437 /* no local alpha for RGB565 or unknown formats */
1438 if (pixfmt
== 1 || pixfmt
> 4)
1441 /* 16-bit formats have inverted local alpha */
1442 if (pixfmt
== 2 || pixfmt
== 3)
1443 fb
->capability
|= V4L2_FBUF_CAP_LOCAL_INV_ALPHA
;
1445 fb
->capability
|= V4L2_FBUF_CAP_LOCAL_ALPHA
;
1447 if (itv
->osd_local_alpha_state
) {
1448 /* 16-bit formats have inverted local alpha */
1449 if (pixfmt
== 2 || pixfmt
== 3)
1450 fb
->flags
|= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA
;
1452 fb
->flags
|= V4L2_FBUF_FLAG_LOCAL_ALPHA
;
1458 static int ivtv_s_fbuf(struct file
*file
, void *fh
, const struct v4l2_framebuffer
*fb
)
1460 struct ivtv_open_id
*id
= fh2id(fh
);
1461 struct ivtv
*itv
= id
->itv
;
1462 struct yuv_playback_info
*yi
= &itv
->yuv_info
;
1464 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT_OVERLAY
))
1466 if (!itv
->osd_video_pbase
)
1469 itv
->osd_global_alpha_state
= (fb
->flags
& V4L2_FBUF_FLAG_GLOBAL_ALPHA
) != 0;
1470 itv
->osd_local_alpha_state
=
1471 (fb
->flags
& (V4L2_FBUF_FLAG_LOCAL_ALPHA
|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA
)) != 0;
1472 itv
->osd_chroma_key_state
= (fb
->flags
& V4L2_FBUF_FLAG_CHROMAKEY
) != 0;
1473 ivtv_set_osd_alpha(itv
);
1474 yi
->track_osd
= (fb
->flags
& V4L2_FBUF_FLAG_OVERLAY
) != 0;
1478 static int ivtv_overlay(struct file
*file
, void *fh
, unsigned int on
)
1480 struct ivtv_open_id
*id
= fh2id(fh
);
1481 struct ivtv
*itv
= id
->itv
;
1483 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT_OVERLAY
))
1486 ivtv_vapi(itv
, CX2341X_OSD_SET_STATE
, 1, on
!= 0);
1491 static int ivtv_subscribe_event(struct v4l2_fh
*fh
, const struct v4l2_event_subscription
*sub
)
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
);
1504 static int ivtv_log_status(struct file
*file
, void *fh
)
1506 struct ivtv
*itv
= fh2id(fh
)->itv
;
1507 u32 data
[CX2341X_MBOX_MAX_DATA
];
1509 int has_output
= itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
;
1510 struct v4l2_input vidin
;
1511 struct v4l2_audio audin
;
1514 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION
, itv
->card_name
);
1515 if (itv
->hw_flags
& IVTV_HW_TVEEPROM
) {
1518 ivtv_read_eeprom(itv
, &tv
);
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)" : "");
1527 struct v4l2_output vidout
;
1528 struct v4l2_audioout audout
;
1529 int mode
= itv
->output_mode
;
1530 static const char * const output_modes
[5] = {
1537 static const char * const alpha_mode
[4] = {
1543 static const char * const pixel_format
[16] = {
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
)
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]);
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
];
1582 if (s
->vdev
== NULL
|| s
->buffers
== 0)
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
);
1589 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1590 (long long)itv
->mpg_data_received
,
1591 (long long)itv
->vbi_data_inserted
);
1595 static int ivtv_decoder_cmd(struct file
*file
, void *fh
, struct v4l2_decoder_cmd
*dec
)
1597 struct ivtv_open_id
*id
= fh2id(file
->private_data
);
1598 struct ivtv
*itv
= id
->itv
;
1600 IVTV_DEBUG_IOCTL("VIDIOC_DECODER_CMD %d\n", dec
->cmd
);
1601 return ivtv_video_command(itv
, id
, dec
, false);
1604 static int ivtv_try_decoder_cmd(struct file
*file
, void *fh
, struct v4l2_decoder_cmd
*dec
)
1606 struct ivtv_open_id
*id
= fh2id(file
->private_data
);
1607 struct ivtv
*itv
= id
->itv
;
1609 IVTV_DEBUG_IOCTL("VIDIOC_TRY_DECODER_CMD %d\n", dec
->cmd
);
1610 return ivtv_video_command(itv
, id
, dec
, true);
1613 static int ivtv_decoder_ioctls(struct file
*filp
, unsigned int cmd
, void *arg
)
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
;
1622 case IVTV_IOC_DMA_FRAME
: {
1623 struct ivtv_dma_frame
*args
= arg
;
1625 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1626 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1628 if (args
->type
!= V4L2_BUF_TYPE_VIDEO_OUTPUT
)
1630 if (itv
->output_mode
== OUT_UDMA_YUV
&& args
->y_source
== NULL
)
1632 if (ivtv_start_decoding(id
, id
->type
)) {
1635 if (ivtv_set_output_mode(itv
, OUT_UDMA_YUV
) != OUT_UDMA_YUV
) {
1636 ivtv_release_stream(s
);
1639 /* Mark that this file handle started the UDMA_YUV mode */
1641 if (args
->y_source
== NULL
)
1643 return ivtv_yuv_prep_frame(itv
, args
);
1646 case IVTV_IOC_PASSTHROUGH_MODE
:
1647 IVTV_DEBUG_IOCTL("IVTV_IOC_PASSTHROUGH_MODE\n");
1648 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1650 return ivtv_passthrough_mode(itv
, *(int *)arg
!= 0);
1652 case VIDEO_GET_PTS
: {
1656 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1657 if (s
->type
< IVTV_DEC_STREAM_TYPE_MPG
) {
1661 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1663 return ivtv_g_pts_frame(itv
, pts
, &frame
);
1666 case VIDEO_GET_FRAME_COUNT
: {
1670 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1671 if (s
->type
< IVTV_DEC_STREAM_TYPE_MPG
) {
1675 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1677 return ivtv_g_pts_frame(itv
, &pts
, frame
);
1681 struct v4l2_decoder_cmd dc
;
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);
1690 struct v4l2_decoder_cmd dc
;
1692 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1693 memset(&dc
, 0, sizeof(dc
));
1694 dc
.cmd
= V4L2_DEC_CMD_STOP
;
1695 dc
.flags
= V4L2_DEC_CMD_STOP_TO_BLACK
| V4L2_DEC_CMD_STOP_IMMEDIATELY
;
1696 return ivtv_video_command(itv
, id
, &dc
, 0);
1699 case VIDEO_FREEZE
: {
1700 struct v4l2_decoder_cmd dc
;
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);
1708 case VIDEO_CONTINUE
: {
1709 struct v4l2_decoder_cmd dc
;
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);
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
);
1725 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", dc
->cmd
);
1727 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", dc
->cmd
);
1728 return ivtv_video_command(itv
, id
, dc
, try);
1731 case VIDEO_GET_EVENT
: {
1732 struct video_event
*ev
= arg
;
1735 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1736 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1738 memset(ev
, 0, sizeof(*ev
));
1739 set_bit(IVTV_F_I_EV_VSYNC_ENABLED
, &itv
->i_flags
);
1742 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED
, &itv
->i_flags
))
1743 ev
->type
= VIDEO_EVENT_DECODER_STOPPED
;
1744 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC
, &itv
->i_flags
)) {
1745 ev
->type
= VIDEO_EVENT_VSYNC
;
1746 ev
->u
.vsync_field
= test_bit(IVTV_F_I_EV_VSYNC_FIELD
, &itv
->i_flags
) ?
1747 VIDEO_VSYNC_FIELD_ODD
: VIDEO_VSYNC_FIELD_EVEN
;
1748 if (itv
->output_mode
== OUT_UDMA_YUV
&&
1749 (itv
->yuv_info
.lace_mode
& IVTV_YUV_MODE_MASK
) ==
1750 IVTV_YUV_MODE_PROGRESSIVE
) {
1751 ev
->u
.vsync_field
= VIDEO_VSYNC_FIELD_PROGRESSIVE
;
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. */
1761 mutex_unlock(&itv
->serialize_lock
);
1762 prepare_to_wait(&itv
->event_waitq
, &wait
, TASK_INTERRUPTIBLE
);
1763 if (!test_bit(IVTV_F_I_EV_DEC_STOPPED
, &itv
->i_flags
) &&
1764 !test_bit(IVTV_F_I_EV_VSYNC
, &itv
->i_flags
))
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");
1777 case VIDEO_SELECT_SOURCE
:
1778 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1779 if (!(itv
->v4l2_cap
& V4L2_CAP_VIDEO_OUTPUT
))
1781 return ivtv_passthrough_mode(itv
, iarg
== VIDEO_SOURCE_DEMUX
);
1783 case AUDIO_SET_MUTE
:
1784 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1785 itv
->speed_mute_audio
= iarg
;
1788 case AUDIO_CHANNEL_SELECT
:
1789 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1790 if (iarg
> AUDIO_STEREO_SWAPPED
)
1792 return v4l2_ctrl_s_ctrl(itv
->ctrl_audio_playback
, iarg
+ 1);
1794 case AUDIO_BILINGUAL_CHANNEL_SELECT
:
1795 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1796 if (iarg
> AUDIO_STEREO_SWAPPED
)
1798 return v4l2_ctrl_s_ctrl(itv
->ctrl_audio_multilingual_playback
, iarg
+ 1);
1806 static long ivtv_default(struct file
*file
, void *fh
, bool valid_prio
,
1809 struct ivtv
*itv
= fh2id(fh
)->itv
;
1813 case IVTV_IOC_PASSTHROUGH_MODE
:
1817 case VIDEO_CONTINUE
:
1819 case VIDEO_SELECT_SOURCE
:
1820 case AUDIO_SET_MUTE
:
1821 case AUDIO_CHANNEL_SELECT
:
1822 case AUDIO_BILINGUAL_CHANNEL_SELECT
:
1828 case VIDIOC_INT_RESET
: {
1829 u32 val
= *(u32
*)arg
;
1831 if ((val
== 0 && itv
->options
.newi2c
) || (val
& 0x01))
1832 ivtv_reset_ir_gpio(itv
);
1834 v4l2_subdev_call(itv
->sd_video
, core
, reset
, 0);
1838 case IVTV_IOC_DMA_FRAME
:
1839 case IVTV_IOC_PASSTHROUGH_MODE
:
1841 case VIDEO_GET_FRAME_COUNT
:
1842 case VIDEO_GET_EVENT
:
1846 case VIDEO_CONTINUE
:
1848 case VIDEO_TRY_COMMAND
:
1849 case VIDEO_SELECT_SOURCE
:
1850 case AUDIO_SET_MUTE
:
1851 case AUDIO_CHANNEL_SELECT
:
1852 case AUDIO_BILINGUAL_CHANNEL_SELECT
:
1853 return ivtv_decoder_ioctls(file
, cmd
, (void *)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_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
,
1919 .vidioc_default
= ivtv_default
,
1920 .vidioc_subscribe_event
= ivtv_subscribe_event
,
1921 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1924 void ivtv_set_funcs(struct video_device
*vdev
)
1926 vdev
->ioctl_ops
= &ivtv_ioctl_ops
;