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 <linux/dvb/audio.h>
39 #include <linux/i2c-id.h>
41 u16 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 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 int check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
109 for (f = 0; f < 2; f++) {
110 for (l = 0; l < 24; l++) {
111 fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
112 set |= fmt->service_lines[f][l];
118 u16 get_service_set(struct v4l2_sliced_vbi_format *fmt)
123 for (f = 0; f < 2; f++) {
124 for (l = 0; l < 24; l++) {
125 set |= fmt->service_lines[f][l];
131 static const struct {
135 { V4L2_STD_PAL_BG | V4L2_STD_PAL_H, "PAL-BGH" },
136 { V4L2_STD_PAL_DK, "PAL-DK" },
137 { V4L2_STD_PAL_I, "PAL-I" },
138 { V4L2_STD_PAL_M, "PAL-M" },
139 { V4L2_STD_PAL_N, "PAL-N" },
140 { V4L2_STD_PAL_Nc, "PAL-Nc" },
141 { V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H, "SECAM-BGH" },
142 { V4L2_STD_SECAM_DK, "SECAM-DK" },
143 { V4L2_STD_SECAM_L, "SECAM-L" },
144 { V4L2_STD_SECAM_LC, "SECAM-L'" },
145 { V4L2_STD_NTSC_M, "NTSC-M" },
146 { V4L2_STD_NTSC_M_JP, "NTSC-J" },
147 { V4L2_STD_NTSC_M_KR, "NTSC-K" },
150 static const struct v4l2_standard ivtv_std_60hz =
152 .frameperiod = {.numerator = 1001, .denominator = 30000},
156 static const struct v4l2_standard ivtv_std_50hz =
158 .frameperiod = {.numerator = 1, .denominator = 25},
162 void ivtv_set_osd_alpha(struct ivtv *itv)
164 ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
165 itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
166 ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
169 int ivtv_set_speed(struct ivtv *itv, int speed)
171 u32 data[CX2341X_MBOX_MAX_DATA];
172 struct ivtv_stream *s;
173 int single_step = (speed == 1 || speed == -1);
176 if (speed == 0) speed = 1000;
179 if (speed == itv->speed && !single_step)
182 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
184 if (single_step && (speed < 0) == (itv->speed < 0)) {
185 /* Single step video and no need to change direction */
186 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
191 /* Need to change direction */
192 speed = speed < 0 ? -1000 : 1000;
194 data[0] = (speed > 1000 || speed < -1000) ? 0x80000000 : 0;
195 data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0;
196 data[1] = (speed < 0);
197 data[2] = speed < 0 ? 3 : 7;
198 data[3] = itv->params.video_b_frames;
199 data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0;
203 if (speed == 1500 || speed == -1500) data[0] |= 1;
204 else if (speed == 2000 || speed == -2000) data[0] |= 2;
205 else if (speed > -1000 && speed < 0) data[0] |= (-1000 / speed);
206 else if (speed < 1000 && speed > 0) data[0] |= (1000 / speed);
208 /* If not decoding, just change speed setting */
209 if (atomic_read(&itv->decoding) > 0) {
212 /* Stop all DMA and decoding activity */
213 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
215 /* Wait for any DMA to finish */
216 prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE);
217 while (itv->i_flags & IVTV_F_I_DMA) {
218 got_sig = signal_pending(current);
224 finish_wait(&itv->dma_waitq, &wait);
228 /* Change Speed safely */
229 ivtv_api(itv, CX2341X_DEC_SET_PLAYBACK_SPEED, 7, data);
230 IVTV_DEBUG_INFO("Setting Speed to 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
231 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
234 speed = (speed < 0) ? -1 : 1;
235 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
241 static int ivtv_validate_speed(int cur_speed, int new_speed)
243 int fact = new_speed < 0 ? -1 : 1;
246 if (new_speed < 0) new_speed = -new_speed;
247 if (cur_speed < 0) cur_speed = -cur_speed;
249 if (cur_speed <= new_speed) {
250 if (new_speed > 1500) return fact * 2000;
251 if (new_speed > 1000) return fact * 1500;
254 if (new_speed >= 2000) return fact * 2000;
255 if (new_speed >= 1500) return fact * 1500;
256 if (new_speed >= 1000) return fact * 1000;
258 if (new_speed == 0) return 1000;
259 if (new_speed == 1 || new_speed == 1000) return fact * new_speed;
262 new_speed = 1000 / new_speed;
263 if (1000 / cur_speed == new_speed)
264 new_speed += (cur_speed < s) ? -1 : 1;
265 if (new_speed > 60) return 1000 / (fact * 60);
266 return 1000 / (fact * new_speed);
269 static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
270 struct video_command *vc, int try)
272 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
274 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
278 case VIDEO_CMD_PLAY: {
280 vc->play.speed = ivtv_validate_speed(itv->speed, vc->play.speed);
281 if (vc->play.speed < 0)
282 vc->play.format = VIDEO_PLAY_FMT_GOP;
285 if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
287 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
288 /* forces ivtv_set_speed to be called */
291 return ivtv_start_decoding(id, vc->play.speed);
295 vc->flags &= VIDEO_CMD_STOP_IMMEDIATELY|VIDEO_CMD_STOP_TO_BLACK;
296 if (vc->flags & VIDEO_CMD_STOP_IMMEDIATELY)
299 if (atomic_read(&itv->decoding) == 0)
301 if (itv->output_mode != OUT_MPG)
304 itv->output_mode = OUT_NONE;
305 return ivtv_stop_v4l2_decode_stream(s, vc->flags, vc->stop.pts);
307 case VIDEO_CMD_FREEZE:
308 vc->flags &= VIDEO_CMD_FREEZE_TO_BLACK;
310 if (itv->output_mode != OUT_MPG)
312 if (atomic_read(&itv->decoding) > 0) {
313 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
314 (vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 0);
315 set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
319 case VIDEO_CMD_CONTINUE:
322 if (itv->output_mode != OUT_MPG)
324 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
325 int speed = itv->speed;
327 return ivtv_start_decoding(id, speed);
337 static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
339 struct v4l2_register *regs = arg;
341 volatile u8 __iomem *reg_start;
343 if (!capable(CAP_SYS_ADMIN))
345 if (regs->reg >= IVTV_REG_OFFSET && regs->reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
346 reg_start = itv->reg_mem - IVTV_REG_OFFSET;
347 else if (itv->has_cx23415 && regs->reg >= IVTV_DECODER_OFFSET &&
348 regs->reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
349 reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
350 else if (regs->reg >= 0 && regs->reg < IVTV_ENCODER_SIZE)
351 reg_start = itv->enc_mem;
355 spin_lock_irqsave(&ivtv_cards_lock, flags);
356 if (cmd == VIDIOC_DBG_G_REGISTER) {
357 regs->val = readl(regs->reg + reg_start);
359 writel(regs->val, regs->reg + reg_start);
361 spin_unlock_irqrestore(&ivtv_cards_lock, flags);
365 static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fmt)
368 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
369 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
371 fmt->fmt.pix.width = itv->main_rect.width;
372 fmt->fmt.pix.height = itv->main_rect.height;
373 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
374 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
375 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
376 switch (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) {
377 case IVTV_YUV_MODE_INTERLACED:
378 fmt->fmt.pix.field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) ?
379 V4L2_FIELD_INTERLACED_BT : V4L2_FIELD_INTERLACED_TB;
381 case IVTV_YUV_MODE_PROGRESSIVE:
382 fmt->fmt.pix.field = V4L2_FIELD_NONE;
385 fmt->fmt.pix.field = V4L2_FIELD_ANY;
388 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_HM12;
389 fmt->fmt.pix.bytesperline = 720;
390 fmt->fmt.pix.width = itv->yuv_info.v4l2_src_w;
391 fmt->fmt.pix.height = itv->yuv_info.v4l2_src_h;
392 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
393 fmt->fmt.pix.sizeimage =
394 1080 * ((fmt->fmt.pix.height + 31) & ~31);
395 } else if (streamtype == IVTV_ENC_STREAM_TYPE_YUV) {
396 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_HM12;
397 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
398 fmt->fmt.pix.sizeimage =
399 fmt->fmt.pix.height * fmt->fmt.pix.width +
400 fmt->fmt.pix.height * (fmt->fmt.pix.width / 2);
402 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
403 fmt->fmt.pix.sizeimage = 128 * 1024;
407 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
408 fmt->fmt.pix.width = itv->params.width;
409 fmt->fmt.pix.height = itv->params.height;
410 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
411 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
412 if (streamtype == IVTV_ENC_STREAM_TYPE_YUV ||
413 streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
414 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_HM12;
415 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
416 fmt->fmt.pix.sizeimage =
417 fmt->fmt.pix.height * fmt->fmt.pix.width +
418 fmt->fmt.pix.height * (fmt->fmt.pix.width / 2);
420 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
421 fmt->fmt.pix.sizeimage = 128 * 1024;
425 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
426 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
428 fmt->fmt.win.chromakey = itv->osd_chroma_key;
429 fmt->fmt.win.global_alpha = itv->osd_global_alpha;
432 case V4L2_BUF_TYPE_VBI_CAPTURE:
433 fmt->fmt.vbi.sampling_rate = 27000000;
434 fmt->fmt.vbi.offset = 248;
435 fmt->fmt.vbi.samples_per_line = itv->vbi.raw_decoder_line_size - 4;
436 fmt->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
437 fmt->fmt.vbi.start[0] = itv->vbi.start[0];
438 fmt->fmt.vbi.start[1] = itv->vbi.start[1];
439 fmt->fmt.vbi.count[0] = fmt->fmt.vbi.count[1] = itv->vbi.count;
442 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
444 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
446 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
448 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
449 memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved));
450 memset(vbifmt->service_lines, 0, sizeof(vbifmt->service_lines));
452 vbifmt->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
453 vbifmt->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
455 vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625;
456 vbifmt->service_lines[0][16] = V4L2_SLICED_VPS;
458 vbifmt->service_set = get_service_set(vbifmt);
462 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
464 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
466 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
467 memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved));
468 memset(vbifmt->service_lines, 0, sizeof(vbifmt->service_lines));
470 if (streamtype == IVTV_DEC_STREAM_TYPE_VBI) {
471 vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
473 expand_service_set(vbifmt, itv->is_50hz);
477 itv->video_dec_func(itv, VIDIOC_G_FMT, fmt);
478 vbifmt->service_set = get_service_set(vbifmt);
481 case V4L2_BUF_TYPE_VBI_OUTPUT:
482 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
489 static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype,
490 struct v4l2_format *fmt, int set_fmt)
492 struct yuv_playback_info *yi = &itv->yuv_info;
493 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
496 if (fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
500 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
502 field = fmt->fmt.pix.field;
505 r.width = fmt->fmt.pix.width;
506 r.height = fmt->fmt.pix.height;
507 ivtv_get_fmt(itv, streamtype, fmt);
508 fmt->fmt.pix.width = r.width;
509 fmt->fmt.pix.height = r.height;
510 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
511 fmt->fmt.pix.field = field;
512 if (fmt->fmt.pix.width < 2)
513 fmt->fmt.pix.width = 2;
514 if (fmt->fmt.pix.width > 720)
515 fmt->fmt.pix.width = 720;
516 if (fmt->fmt.pix.height < 2)
517 fmt->fmt.pix.height = 2;
518 if (fmt->fmt.pix.height > 576)
519 fmt->fmt.pix.height = 576;
521 if (set_fmt && streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
522 /* Return now if we already have some frame data */
526 yi->v4l2_src_w = r.width;
527 yi->v4l2_src_h = r.height;
530 case V4L2_FIELD_NONE:
531 yi->lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
534 yi->lace_mode = IVTV_YUV_MODE_AUTO;
536 case V4L2_FIELD_INTERLACED_BT:
538 IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
540 case V4L2_FIELD_INTERLACED_TB:
542 yi->lace_mode = IVTV_YUV_MODE_INTERLACED;
545 yi->lace_sync_field = (yi->lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
547 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
548 itv->dma_data_req_size =
549 1080 * ((yi->v4l2_src_h + 31) & ~31);
551 /* Force update of yuv registers */
552 yi->yuv_forced_update = 1;
558 if (fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY) {
559 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
562 itv->osd_chroma_key = fmt->fmt.win.chromakey;
563 itv->osd_global_alpha = fmt->fmt.win.global_alpha;
564 ivtv_set_osd_alpha(itv);
569 /* set window size */
570 if (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
571 struct cx2341x_mpeg_params *p = &itv->params;
572 int w = fmt->fmt.pix.width;
573 int h = fmt->fmt.pix.height;
575 if (w > 720) w = 720;
576 else if (w < 1) w = 1;
577 if (h > (itv->is_50hz ? 576 : 480)) h = (itv->is_50hz ? 576 : 480);
578 else if (h < 2) h = 2;
579 ivtv_get_fmt(itv, streamtype, fmt);
580 fmt->fmt.pix.width = w;
581 fmt->fmt.pix.height = h;
583 if (!set_fmt || (p->width == w && p->height == h))
585 if (atomic_read(&itv->capturing) > 0)
590 if (w != 720 || h != (itv->is_50hz ? 576 : 480))
591 p->video_temporal_filter = 0;
593 p->video_temporal_filter = 8;
594 if (p->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
595 fmt->fmt.pix.width /= 2;
596 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
597 return ivtv_get_fmt(itv, streamtype, fmt);
600 /* set raw VBI format */
601 if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
602 if (set_fmt && atomic_read(&itv->capturing) > 0) {
606 itv->vbi.sliced_in->service_set = 0;
607 itv->video_dec_func(itv, VIDIOC_S_FMT, &itv->vbi.in);
609 return ivtv_get_fmt(itv, streamtype, fmt);
612 /* set sliced VBI output
613 In principle the user could request that only certain
614 VBI types are output and that the others are ignored.
615 I.e., suppress CC in the even fields or only output
616 WSS and no VPS. Currently though there is no choice. */
617 if (fmt->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
618 return ivtv_get_fmt(itv, streamtype, fmt);
620 /* any else but sliced VBI capture is an error */
621 if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
624 if (streamtype == IVTV_DEC_STREAM_TYPE_VBI)
625 return ivtv_get_fmt(itv, streamtype, fmt);
627 /* set sliced VBI capture format */
628 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
629 memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved));
631 if (vbifmt->service_set)
632 expand_service_set(vbifmt, itv->is_50hz);
633 set = check_service_set(vbifmt, itv->is_50hz);
634 vbifmt->service_set = get_service_set(vbifmt);
640 if (atomic_read(&itv->capturing) > 0) {
643 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
644 memcpy(itv->vbi.sliced_in, vbifmt, sizeof(*itv->vbi.sliced_in));
648 static int ivtv_debug_ioctls(struct file *filp, unsigned int cmd, void *arg)
650 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
651 struct ivtv *itv = id->itv;
652 struct v4l2_register *reg = arg;
655 /* ioctls to allow direct access to the encoder registers for testing */
656 case VIDIOC_DBG_G_REGISTER:
657 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
658 return ivtv_itvc(itv, cmd, arg);
659 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
660 return ivtv_i2c_id(itv, reg->match_chip, cmd, arg);
661 return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
663 case VIDIOC_DBG_S_REGISTER:
664 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
665 return ivtv_itvc(itv, cmd, arg);
666 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
667 return ivtv_i2c_id(itv, reg->match_chip, cmd, arg);
668 return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
670 case VIDIOC_G_CHIP_IDENT: {
671 struct v4l2_chip_ident *chip = arg;
673 chip->ident = V4L2_IDENT_NONE;
675 if (reg->match_type == V4L2_CHIP_MATCH_HOST) {
676 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
677 chip->ident = itv->has_cx23415 ? V4L2_IDENT_CX23415 : V4L2_IDENT_CX23416;
680 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
681 return ivtv_i2c_id(itv, reg->match_chip, cmd, arg);
682 if (reg->match_type == V4L2_CHIP_MATCH_I2C_ADDR)
683 return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
687 case VIDIOC_INT_S_AUDIO_ROUTING: {
688 struct v4l2_routing *route = arg;
690 ivtv_i2c_hw(itv, itv->card->hw_audio, VIDIOC_INT_S_AUDIO_ROUTING, route);
694 case VIDIOC_INT_RESET: {
695 u32 val = *(u32 *)arg;
697 if ((val == 0 && itv->options.newi2c) || (val & 0x01)) {
698 ivtv_reset_ir_gpio(itv);
701 itv->video_dec_func(itv, cmd, NULL);
712 int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void *arg)
714 struct ivtv_open_id *id = NULL;
715 struct yuv_playback_info *yi = &itv->yuv_info;
716 u32 data[CX2341X_MBOX_MAX_DATA];
720 id = (struct ivtv_open_id *)filp->private_data;
721 streamtype = id->type;
725 case VIDIOC_G_PRIORITY:
727 enum v4l2_priority *p = arg;
729 *p = v4l2_prio_max(&itv->prio);
733 case VIDIOC_S_PRIORITY:
735 enum v4l2_priority *prio = arg;
737 return v4l2_prio_change(&itv->prio, &id->prio, *prio);
740 case VIDIOC_QUERYCAP:{
741 struct v4l2_capability *vcap = arg;
743 memset(vcap, 0, sizeof(*vcap));
744 strcpy(vcap->driver, IVTV_DRIVER_NAME); /* driver name */
745 strcpy(vcap->card, itv->card_name); /* card type */
746 strcpy(vcap->bus_info, pci_name(itv->dev)); /* bus info... */
747 vcap->version = IVTV_DRIVER_VERSION; /* version */
748 vcap->capabilities = itv->v4l2_cap; /* capabilities */
750 /* reserved.. must set to 0! */
751 vcap->reserved[0] = vcap->reserved[1] =
752 vcap->reserved[2] = vcap->reserved[3] = 0;
756 case VIDIOC_ENUMAUDIO:{
757 struct v4l2_audio *vin = arg;
759 return ivtv_get_audio_input(itv, vin->index, vin);
762 case VIDIOC_G_AUDIO:{
763 struct v4l2_audio *vin = arg;
765 vin->index = itv->audio_input;
766 return ivtv_get_audio_input(itv, vin->index, vin);
769 case VIDIOC_S_AUDIO:{
770 struct v4l2_audio *vout = arg;
772 if (vout->index >= itv->nof_audio_inputs)
774 itv->audio_input = vout->index;
775 ivtv_audio_set_io(itv);
779 case VIDIOC_ENUMAUDOUT:{
780 struct v4l2_audioout *vin = arg;
782 /* set it to defaults from our table */
783 return ivtv_get_audio_output(itv, vin->index, vin);
786 case VIDIOC_G_AUDOUT:{
787 struct v4l2_audioout *vin = arg;
790 return ivtv_get_audio_output(itv, vin->index, vin);
793 case VIDIOC_S_AUDOUT:{
794 struct v4l2_audioout *vout = arg;
796 return ivtv_get_audio_output(itv, vout->index, vout);
799 case VIDIOC_ENUMINPUT:{
800 struct v4l2_input *vin = arg;
802 /* set it to defaults from our table */
803 return ivtv_get_input(itv, vin->index, vin);
806 case VIDIOC_ENUMOUTPUT:{
807 struct v4l2_output *vout = arg;
809 return ivtv_get_output(itv, vout->index, vout);
814 struct v4l2_format *fmt = arg;
816 return ivtv_try_or_set_fmt(itv, id->type, fmt, cmd == VIDIOC_S_FMT);
820 struct v4l2_format *fmt = arg;
821 int type = fmt->type;
823 memset(fmt, 0, sizeof(*fmt));
825 return ivtv_get_fmt(itv, id->type, fmt);
828 case VIDIOC_CROPCAP: {
829 struct v4l2_cropcap *cropcap = arg;
831 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
832 cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
834 cropcap->bounds.top = cropcap->bounds.left = 0;
835 cropcap->bounds.width = 720;
836 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
837 cropcap->bounds.height = itv->is_50hz ? 576 : 480;
838 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
839 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
840 } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
842 cropcap->bounds.width = yi->osd_full_w;
843 cropcap->bounds.height = yi->osd_full_h;
845 cropcap->bounds.width = 720;
846 cropcap->bounds.height =
847 itv->is_out_50hz ? 576 : 480;
849 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
850 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
852 cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
853 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
854 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
856 cropcap->defrect = cropcap->bounds;
860 case VIDIOC_S_CROP: {
861 struct v4l2_crop *crop = arg;
863 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
864 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
865 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
866 yi->main_rect = crop->c;
869 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
870 crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
871 itv->main_rect = crop->c;
877 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
879 return itv->video_dec_func(itv, VIDIOC_S_CROP, arg);
882 case VIDIOC_G_CROP: {
883 struct v4l2_crop *crop = arg;
885 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
886 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
887 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
888 crop->c = yi->main_rect;
890 crop->c = itv->main_rect;
893 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
895 return itv->video_dec_func(itv, VIDIOC_G_CROP, arg);
898 case VIDIOC_ENUM_FMT: {
899 static struct v4l2_fmtdesc formats[] = {
901 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
904 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
905 "MPEG", V4L2_PIX_FMT_MPEG,
909 struct v4l2_fmtdesc *fmt = arg;
910 enum v4l2_buf_type type = fmt->type;
913 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
915 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
916 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
924 *fmt = formats[fmt->index];
929 case VIDIOC_G_INPUT:{
930 *(int *)arg = itv->active_input;
934 case VIDIOC_S_INPUT:{
935 int inp = *(int *)arg;
937 if (inp < 0 || inp >= itv->nof_inputs)
940 if (inp == itv->active_input) {
941 IVTV_DEBUG_INFO("Input unchanged\n");
944 if (atomic_read(&itv->capturing) > 0) {
947 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
948 itv->active_input, inp);
950 itv->active_input = inp;
951 /* Set the audio input to whatever is appropriate for the
953 itv->audio_input = itv->card->video_inputs[inp].audio_index;
955 /* prevent others from messing with the streams until
956 we're finished changing inputs. */
958 ivtv_video_set_io(itv);
959 ivtv_audio_set_io(itv);
964 case VIDIOC_G_OUTPUT:{
965 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
967 *(int *)arg = itv->active_output;
971 case VIDIOC_S_OUTPUT:{
972 int outp = *(int *)arg;
973 struct v4l2_routing route;
975 if (outp >= itv->card->nof_outputs)
978 if (outp == itv->active_output) {
979 IVTV_DEBUG_INFO("Output unchanged\n");
982 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
983 itv->active_output, outp);
985 itv->active_output = outp;
986 route.input = SAA7127_INPUT_TYPE_NORMAL;
987 route.output = itv->card->video_outputs[outp].video_output;
988 ivtv_saa7127(itv, VIDIOC_INT_S_VIDEO_ROUTING, &route);
992 case VIDIOC_G_FREQUENCY:{
993 struct v4l2_frequency *vf = arg;
997 ivtv_call_i2c_clients(itv, cmd, arg);
1001 case VIDIOC_S_FREQUENCY:{
1002 struct v4l2_frequency vf = *(struct v4l2_frequency *)arg;
1008 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf.frequency);
1009 ivtv_call_i2c_clients(itv, cmd, &vf);
1014 case VIDIOC_ENUMSTD:{
1015 struct v4l2_standard *vs = arg;
1016 int idx = vs->index;
1018 if (idx < 0 || idx >= ARRAY_SIZE(enum_stds))
1021 *vs = (enum_stds[idx].std & V4L2_STD_525_60) ?
1022 ivtv_std_60hz : ivtv_std_50hz;
1024 vs->id = enum_stds[idx].std;
1025 strcpy(vs->name, enum_stds[idx].name);
1030 *(v4l2_std_id *) arg = itv->std;
1034 case VIDIOC_S_STD: {
1035 v4l2_std_id std = *(v4l2_std_id *) arg;
1037 if ((std & V4L2_STD_ALL) == 0)
1040 if (std == itv->std)
1043 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1044 atomic_read(&itv->capturing) > 0 ||
1045 atomic_read(&itv->decoding) > 0) {
1046 /* Switching standard would turn off the radio or mess
1047 with already running streams, prevent that by
1053 itv->is_60hz = (std & V4L2_STD_525_60) ? 1 : 0;
1054 itv->params.is_50hz = itv->is_50hz = !itv->is_60hz;
1055 itv->params.width = 720;
1056 itv->params.height = itv->is_50hz ? 576 : 480;
1057 itv->vbi.count = itv->is_50hz ? 18 : 12;
1058 itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1059 itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1060 if (itv->hw_flags & IVTV_HW_CX25840) {
1061 itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1063 IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std);
1066 ivtv_call_i2c_clients(itv, VIDIOC_S_STD, &itv->std);
1068 if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
1069 /* set display standard */
1071 itv->is_out_60hz = itv->is_60hz;
1072 itv->is_out_50hz = itv->is_50hz;
1073 ivtv_call_i2c_clients(itv, VIDIOC_INT_S_STD_OUTPUT, &itv->std_out);
1074 ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1075 itv->main_rect.left = itv->main_rect.top = 0;
1076 itv->main_rect.width = 720;
1077 itv->main_rect.height = itv->params.height;
1078 ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1079 720, itv->main_rect.height, 0, 0);
1080 yi->main_rect = itv->main_rect;
1081 if (!itv->osd_info) {
1082 yi->osd_full_w = 720;
1083 yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1089 case VIDIOC_S_TUNER: { /* Setting tuner can only set audio mode */
1090 struct v4l2_tuner *vt = arg;
1095 ivtv_call_i2c_clients(itv, VIDIOC_S_TUNER, vt);
1099 case VIDIOC_G_TUNER: {
1100 struct v4l2_tuner *vt = arg;
1105 memset(vt, 0, sizeof(*vt));
1106 ivtv_call_i2c_clients(itv, VIDIOC_G_TUNER, vt);
1108 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) {
1109 strcpy(vt->name, "ivtv Radio Tuner");
1110 vt->type = V4L2_TUNER_RADIO;
1112 strcpy(vt->name, "ivtv TV Tuner");
1113 vt->type = V4L2_TUNER_ANALOG_TV;
1118 case VIDIOC_G_SLICED_VBI_CAP: {
1119 struct v4l2_sliced_vbi_cap *cap = arg;
1120 int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1122 enum v4l2_buf_type type = cap->type;
1124 memset(cap, 0, sizeof(*cap));
1126 if (type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1127 for (f = 0; f < 2; f++) {
1128 for (l = 0; l < 24; l++) {
1129 if (valid_service_line(f, l, itv->is_50hz)) {
1130 cap->service_lines[f][l] = set;
1136 if (type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1137 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1140 cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1141 cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1143 cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1144 cap->service_lines[0][16] = V4L2_SLICED_VPS;
1151 case VIDIOC_G_ENC_INDEX: {
1152 struct v4l2_enc_idx *idx = arg;
1153 struct v4l2_enc_idx_entry *e = idx->entry;
1157 entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1159 if (entries > V4L2_ENC_IDX_ENTRIES)
1160 entries = V4L2_ENC_IDX_ENTRIES;
1162 for (i = 0; i < entries; i++) {
1163 *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1164 if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1169 itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1173 case VIDIOC_ENCODER_CMD:
1174 case VIDIOC_TRY_ENCODER_CMD: {
1175 struct v4l2_encoder_cmd *enc = arg;
1176 int try = cmd == VIDIOC_TRY_ENCODER_CMD;
1178 memset(&enc->raw, 0, sizeof(enc->raw));
1180 case V4L2_ENC_CMD_START:
1181 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1185 return ivtv_start_capture(id);
1187 case V4L2_ENC_CMD_STOP:
1188 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1189 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1192 ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1195 case V4L2_ENC_CMD_PAUSE:
1196 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1200 if (!atomic_read(&itv->capturing))
1202 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1205 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1208 case V4L2_ENC_CMD_RESUME:
1209 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1213 if (!atomic_read(&itv->capturing))
1215 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1217 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1221 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1227 case VIDIOC_G_FBUF: {
1228 struct v4l2_framebuffer *fb = arg;
1230 static u32 pixel_format[16] = {
1231 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1232 V4L2_PIX_FMT_RGB565,
1233 V4L2_PIX_FMT_RGB555,
1234 V4L2_PIX_FMT_RGB444,
1239 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1240 V4L2_PIX_FMT_YUV565,
1241 V4L2_PIX_FMT_YUV555,
1242 V4L2_PIX_FMT_YUV444,
1249 memset(fb, 0, sizeof(*fb));
1250 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1252 fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1253 V4L2_FBUF_CAP_GLOBAL_ALPHA;
1254 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1255 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1256 pixfmt = (data[0] >> 3) & 0xf;
1257 fb->fmt.pixelformat = pixel_format[pixfmt];
1258 fb->fmt.width = itv->osd_rect.width;
1259 fb->fmt.height = itv->osd_rect.height;
1260 fb->base = (void *)itv->osd_video_pbase;
1261 if (itv->osd_chroma_key_state)
1262 fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1263 if (itv->osd_global_alpha_state)
1264 fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1266 /* no local alpha for RGB565 or unknown formats */
1267 if (pixfmt == 1 || pixfmt > 4)
1269 /* 16-bit formats have inverted local alpha */
1270 if (pixfmt == 2 || pixfmt == 3)
1271 fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1273 fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1274 if (itv->osd_local_alpha_state) {
1275 /* 16-bit formats have inverted local alpha */
1276 if (pixfmt == 2 || pixfmt == 3)
1277 fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1279 fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1282 fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1286 case VIDIOC_S_FBUF: {
1287 struct v4l2_framebuffer *fb = arg;
1289 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1291 itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1292 itv->osd_local_alpha_state =
1293 (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1294 itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1295 ivtv_set_osd_alpha(itv);
1296 yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1300 case VIDIOC_OVERLAY: {
1303 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1305 ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, *on != 0);
1309 case VIDIOC_LOG_STATUS:
1311 int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1312 struct v4l2_input vidin;
1313 struct v4l2_audio audin;
1316 IVTV_INFO("================= START STATUS CARD #%d =================\n", itv->num);
1317 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1318 if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1321 ivtv_read_eeprom(itv, &tv);
1323 ivtv_call_i2c_clients(itv, VIDIOC_LOG_STATUS, NULL);
1324 ivtv_get_input(itv, itv->active_input, &vidin);
1325 ivtv_get_audio_input(itv, itv->audio_input, &audin);
1326 IVTV_INFO("Video Input: %s\n", vidin.name);
1327 IVTV_INFO("Audio Input: %s%s\n", audin.name,
1328 (itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1330 struct v4l2_output vidout;
1331 struct v4l2_audioout audout;
1332 int mode = itv->output_mode;
1333 static const char * const output_modes[5] = {
1340 static const char * const audio_modes[5] = {
1347 static const char * const alpha_mode[4] = {
1353 static const char * const pixel_format[16] = {
1372 ivtv_get_output(itv, itv->active_output, &vidout);
1373 ivtv_get_audio_output(itv, 0, &audout);
1374 IVTV_INFO("Video Output: %s\n", vidout.name);
1375 IVTV_INFO("Audio Output: %s (Stereo/Bilingual: %s/%s)\n", audout.name,
1376 audio_modes[itv->audio_stereo_mode],
1377 audio_modes[itv->audio_bilingual_mode]);
1378 if (mode < 0 || mode > OUT_PASSTHROUGH)
1380 IVTV_INFO("Output Mode: %s\n", output_modes[mode]);
1381 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1382 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1383 IVTV_INFO("Overlay: %s, Alpha: %s, Pixel Format: %s\n",
1384 data[0] & 1 ? "On" : "Off",
1385 alpha_mode[(data[0] >> 1) & 0x3],
1386 pixel_format[(data[0] >> 3) & 0xf]);
1388 IVTV_INFO("Tuner: %s\n",
1389 test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1390 cx2341x_log_status(&itv->params, itv->name);
1391 IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
1392 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1393 struct ivtv_stream *s = &itv->streams[i];
1395 if (s->v4l2dev == NULL || s->buffers == 0)
1397 IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1398 (s->buffers - s->q_free.buffers) * 100 / s->buffers,
1399 (s->buffers * s->buf_size) / 1024, s->buffers);
1401 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n", (long long)itv->mpg_data_received, (long long)itv->vbi_data_inserted);
1402 IVTV_INFO("================== END STATUS CARD #%d ==================\n", itv->num);
1412 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1414 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1415 struct ivtv *itv = id->itv;
1416 int nonblocking = filp->f_flags & O_NONBLOCK;
1417 struct ivtv_stream *s = &itv->streams[id->type];
1420 case IVTV_IOC_DMA_FRAME: {
1421 struct ivtv_dma_frame *args = arg;
1423 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1424 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1426 if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1428 if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1430 if (ivtv_claim_stream(id, id->type)) {
1433 if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1434 ivtv_release_stream(s);
1437 /* Mark that this file handle started the UDMA_YUV mode */
1439 if (args->y_source == NULL)
1441 return ivtv_yuv_prep_frame(itv, args);
1444 case VIDEO_GET_PTS: {
1445 u32 data[CX2341X_MBOX_MAX_DATA];
1448 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1449 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1453 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1456 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1457 *pts = (u64) ((u64)itv->last_dec_timing[2] << 32) |
1458 (u64)itv->last_dec_timing[1];
1462 if (atomic_read(&itv->decoding)) {
1463 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1464 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1467 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1468 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1469 *pts = (u64) ((u64) data[2] << 32) | (u64) data[1];
1470 /*timing->scr = (u64) (((u64) data[4] << 32) | (u64) (data[3]));*/
1475 case VIDEO_GET_FRAME_COUNT: {
1476 u32 data[CX2341X_MBOX_MAX_DATA];
1479 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1480 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1484 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1487 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1488 *frame = itv->last_dec_timing[0];
1492 if (atomic_read(&itv->decoding)) {
1493 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1494 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1497 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1498 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1505 struct video_command vc;
1507 IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1508 memset(&vc, 0, sizeof(vc));
1509 vc.cmd = VIDEO_CMD_PLAY;
1510 return ivtv_video_command(itv, id, &vc, 0);
1514 struct video_command vc;
1516 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1517 memset(&vc, 0, sizeof(vc));
1518 vc.cmd = VIDEO_CMD_STOP;
1519 vc.flags = VIDEO_CMD_STOP_TO_BLACK | VIDEO_CMD_STOP_IMMEDIATELY;
1520 return ivtv_video_command(itv, id, &vc, 0);
1523 case VIDEO_FREEZE: {
1524 struct video_command vc;
1526 IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1527 memset(&vc, 0, sizeof(vc));
1528 vc.cmd = VIDEO_CMD_FREEZE;
1529 return ivtv_video_command(itv, id, &vc, 0);
1532 case VIDEO_CONTINUE: {
1533 struct video_command vc;
1535 IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1536 memset(&vc, 0, sizeof(vc));
1537 vc.cmd = VIDEO_CMD_CONTINUE;
1538 return ivtv_video_command(itv, id, &vc, 0);
1542 case VIDEO_TRY_COMMAND: {
1543 struct video_command *vc = arg;
1544 int try = (cmd == VIDEO_TRY_COMMAND);
1547 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", vc->cmd);
1549 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", vc->cmd);
1550 return ivtv_video_command(itv, id, vc, try);
1553 case VIDEO_GET_EVENT: {
1554 struct video_event *ev = arg;
1557 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1558 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1560 memset(ev, 0, sizeof(*ev));
1561 set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1564 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1565 ev->type = VIDEO_EVENT_DECODER_STOPPED;
1566 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1567 ev->type = VIDEO_EVENT_VSYNC;
1568 ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1569 VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1570 if (itv->output_mode == OUT_UDMA_YUV &&
1571 (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1572 IVTV_YUV_MODE_PROGRESSIVE) {
1573 ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1580 /* Wait for event. Note that serialize_lock is locked,
1581 so to allow other processes to access the driver while
1582 we are waiting unlock first and later lock again. */
1583 mutex_unlock(&itv->serialize_lock);
1584 prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1585 if ((itv->i_flags & (IVTV_F_I_EV_DEC_STOPPED|IVTV_F_I_EV_VSYNC)) == 0)
1587 finish_wait(&itv->event_waitq, &wait);
1588 mutex_lock(&itv->serialize_lock);
1589 if (signal_pending(current)) {
1590 /* return if a signal was received */
1591 IVTV_DEBUG_INFO("User stopped wait for event\n");
1604 static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
1605 unsigned int cmd, void *arg)
1607 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1608 struct ivtv *itv = id->itv;
1611 /* check priority */
1615 case VIDIOC_S_INPUT:
1616 case VIDIOC_S_OUTPUT:
1617 case VIDIOC_S_TUNER:
1618 case VIDIOC_S_FREQUENCY:
1621 case VIDIOC_S_AUDIO:
1622 case VIDIOC_S_AUDOUT:
1623 case VIDIOC_S_EXT_CTRLS:
1625 case VIDIOC_OVERLAY:
1626 ret = v4l2_prio_check(&itv->prio, &id->prio);
1632 case VIDIOC_DBG_G_REGISTER:
1633 case VIDIOC_DBG_S_REGISTER:
1634 case VIDIOC_G_CHIP_IDENT:
1635 case VIDIOC_INT_S_AUDIO_ROUTING:
1636 case VIDIOC_INT_RESET:
1637 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
1638 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
1639 v4l_printk_ioctl(cmd);
1641 return ivtv_debug_ioctls(filp, cmd, arg);
1643 case VIDIOC_G_PRIORITY:
1644 case VIDIOC_S_PRIORITY:
1645 case VIDIOC_QUERYCAP:
1646 case VIDIOC_ENUMINPUT:
1647 case VIDIOC_G_INPUT:
1648 case VIDIOC_S_INPUT:
1649 case VIDIOC_ENUMOUTPUT:
1650 case VIDIOC_G_OUTPUT:
1651 case VIDIOC_S_OUTPUT:
1654 case VIDIOC_TRY_FMT:
1655 case VIDIOC_ENUM_FMT:
1656 case VIDIOC_CROPCAP:
1659 case VIDIOC_G_FREQUENCY:
1660 case VIDIOC_S_FREQUENCY:
1661 case VIDIOC_ENUMSTD:
1664 case VIDIOC_S_TUNER:
1665 case VIDIOC_G_TUNER:
1666 case VIDIOC_ENUMAUDIO:
1667 case VIDIOC_S_AUDIO:
1668 case VIDIOC_G_AUDIO:
1669 case VIDIOC_ENUMAUDOUT:
1670 case VIDIOC_S_AUDOUT:
1671 case VIDIOC_G_AUDOUT:
1672 case VIDIOC_G_SLICED_VBI_CAP:
1673 case VIDIOC_LOG_STATUS:
1674 case VIDIOC_G_ENC_INDEX:
1675 case VIDIOC_ENCODER_CMD:
1676 case VIDIOC_TRY_ENCODER_CMD:
1679 case VIDIOC_OVERLAY:
1680 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
1681 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
1682 v4l_printk_ioctl(cmd);
1684 return ivtv_v4l2_ioctls(itv, filp, cmd, arg);
1686 case VIDIOC_QUERYMENU:
1687 case VIDIOC_QUERYCTRL:
1690 case VIDIOC_S_EXT_CTRLS:
1691 case VIDIOC_G_EXT_CTRLS:
1692 case VIDIOC_TRY_EXT_CTRLS:
1693 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
1694 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
1695 v4l_printk_ioctl(cmd);
1697 return ivtv_control_ioctls(itv, cmd, arg);
1699 case IVTV_IOC_DMA_FRAME:
1701 case VIDEO_GET_FRAME_COUNT:
1702 case VIDEO_GET_EVENT:
1706 case VIDEO_CONTINUE:
1708 case VIDEO_TRY_COMMAND:
1709 return ivtv_decoder_ioctls(filp, cmd, arg);
1711 case 0x00005401: /* Handle isatty() calls */
1714 return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
1715 ivtv_v4l2_do_ioctl);
1720 static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct file *filp,
1721 unsigned int cmd, unsigned long arg)
1723 /* Filter dvb ioctls that cannot be handled by video_usercopy */
1725 case VIDEO_SELECT_SOURCE:
1726 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1727 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1729 return ivtv_passthrough_mode(itv, arg == VIDEO_SOURCE_DEMUX);
1731 case AUDIO_SET_MUTE:
1732 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1733 itv->speed_mute_audio = arg;
1736 case AUDIO_CHANNEL_SELECT:
1737 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1738 if (arg > AUDIO_STEREO_SWAPPED)
1740 itv->audio_stereo_mode = arg;
1741 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1744 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1745 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1746 if (arg > AUDIO_STEREO_SWAPPED)
1748 itv->audio_bilingual_mode = arg;
1749 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1755 return video_usercopy(inode, filp, cmd, arg, ivtv_v4l2_do_ioctl);
1758 int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
1761 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1762 struct ivtv *itv = id->itv;
1765 mutex_lock(&itv->serialize_lock);
1766 res = ivtv_serialized_ioctl(itv, inode, filp, cmd, arg);
1767 mutex_unlock(&itv->serialize_lock);