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 ivtv_service2vbi(int type)
44 case V4L2_SLICED_TELETEXT_B:
45 return IVTV_SLICED_TYPE_TELETEXT_B;
46 case V4L2_SLICED_CAPTION_525:
47 return IVTV_SLICED_TYPE_CAPTION_525;
48 case V4L2_SLICED_WSS_625:
49 return IVTV_SLICED_TYPE_WSS_625;
51 return IVTV_SLICED_TYPE_VPS;
57 static int valid_service_line(int field, int line, int is_pal)
59 return (is_pal && line >= 6 && (line != 23 || field == 0)) ||
60 (!is_pal && line >= 10 && line < 22);
63 static u16 select_service_from_set(int field, int line, u16 set, int is_pal)
65 u16 valid_set = (is_pal ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525);
68 set = set & valid_set;
69 if (set == 0 || !valid_service_line(field, line, is_pal)) {
73 if (line == 21 && (set & V4L2_SLICED_CAPTION_525))
74 return V4L2_SLICED_CAPTION_525;
77 if (line == 16 && field == 0 && (set & V4L2_SLICED_VPS))
78 return V4L2_SLICED_VPS;
79 if (line == 23 && field == 0 && (set & V4L2_SLICED_WSS_625))
80 return V4L2_SLICED_WSS_625;
84 for (i = 0; i < 32; i++) {
91 void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
93 u16 set = fmt->service_set;
97 for (f = 0; f < 2; f++) {
98 for (l = 0; l < 24; l++) {
99 fmt->service_lines[f][l] = select_service_from_set(f, l, set, is_pal);
104 static void check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
108 for (f = 0; f < 2; f++) {
109 for (l = 0; l < 24; l++) {
110 fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
115 u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt)
120 for (f = 0; f < 2; f++) {
121 for (l = 0; l < 24; l++) {
122 set |= fmt->service_lines[f][l];
128 void ivtv_set_osd_alpha(struct ivtv *itv)
130 ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
131 itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
132 ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
135 int ivtv_set_speed(struct ivtv *itv, int speed)
137 u32 data[CX2341X_MBOX_MAX_DATA];
138 struct ivtv_stream *s;
139 int single_step = (speed == 1 || speed == -1);
142 if (speed == 0) speed = 1000;
145 if (speed == itv->speed && !single_step)
148 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
150 if (single_step && (speed < 0) == (itv->speed < 0)) {
151 /* Single step video and no need to change direction */
152 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
157 /* Need to change direction */
158 speed = speed < 0 ? -1000 : 1000;
160 data[0] = (speed > 1000 || speed < -1000) ? 0x80000000 : 0;
161 data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0;
162 data[1] = (speed < 0);
163 data[2] = speed < 0 ? 3 : 7;
164 data[3] = itv->params.video_b_frames;
165 data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0;
169 if (speed == 1500 || speed == -1500) data[0] |= 1;
170 else if (speed == 2000 || speed == -2000) data[0] |= 2;
171 else if (speed > -1000 && speed < 0) data[0] |= (-1000 / speed);
172 else if (speed < 1000 && speed > 0) data[0] |= (1000 / speed);
174 /* If not decoding, just change speed setting */
175 if (atomic_read(&itv->decoding) > 0) {
178 /* Stop all DMA and decoding activity */
179 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
181 /* Wait for any DMA to finish */
182 prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE);
183 while (itv->i_flags & IVTV_F_I_DMA) {
184 got_sig = signal_pending(current);
190 finish_wait(&itv->dma_waitq, &wait);
194 /* Change Speed safely */
195 ivtv_api(itv, CX2341X_DEC_SET_PLAYBACK_SPEED, 7, data);
196 IVTV_DEBUG_INFO("Setting Speed to 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
197 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
200 speed = (speed < 0) ? -1 : 1;
201 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
207 static int ivtv_validate_speed(int cur_speed, int new_speed)
209 int fact = new_speed < 0 ? -1 : 1;
215 new_speed = -new_speed;
217 cur_speed = -cur_speed;
219 if (cur_speed <= new_speed) {
220 if (new_speed > 1500)
222 if (new_speed > 1000)
226 if (new_speed >= 2000)
228 if (new_speed >= 1500)
230 if (new_speed >= 1000)
235 if (new_speed == 1 || new_speed == 1000)
236 return fact * new_speed;
239 new_speed = 1000 / new_speed;
240 if (1000 / cur_speed == new_speed)
241 new_speed += (cur_speed < s) ? -1 : 1;
242 if (new_speed > 60) return 1000 / (fact * 60);
243 return 1000 / (fact * new_speed);
246 static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
247 struct video_command *vc, int try)
249 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
251 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
255 case VIDEO_CMD_PLAY: {
257 vc->play.speed = ivtv_validate_speed(itv->speed, vc->play.speed);
258 if (vc->play.speed < 0)
259 vc->play.format = VIDEO_PLAY_FMT_GOP;
262 if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
264 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
265 /* forces ivtv_set_speed to be called */
268 return ivtv_start_decoding(id, vc->play.speed);
272 vc->flags &= VIDEO_CMD_STOP_IMMEDIATELY|VIDEO_CMD_STOP_TO_BLACK;
273 if (vc->flags & VIDEO_CMD_STOP_IMMEDIATELY)
276 if (atomic_read(&itv->decoding) == 0)
278 if (itv->output_mode != OUT_MPG)
281 itv->output_mode = OUT_NONE;
282 return ivtv_stop_v4l2_decode_stream(s, vc->flags, vc->stop.pts);
284 case VIDEO_CMD_FREEZE:
285 vc->flags &= VIDEO_CMD_FREEZE_TO_BLACK;
287 if (itv->output_mode != OUT_MPG)
289 if (atomic_read(&itv->decoding) > 0) {
290 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
291 (vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 0);
292 set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
296 case VIDEO_CMD_CONTINUE:
299 if (itv->output_mode != OUT_MPG)
301 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
302 int speed = itv->speed;
304 return ivtv_start_decoding(id, speed);
314 static int ivtv_g_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
316 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
317 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
319 vbifmt->reserved[0] = 0;
320 vbifmt->reserved[1] = 0;
321 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
323 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
325 vbifmt->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
326 vbifmt->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
328 vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625;
329 vbifmt->service_lines[0][16] = V4L2_SLICED_VPS;
331 vbifmt->service_set = ivtv_get_service_set(vbifmt);
335 static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
337 struct ivtv_open_id *id = fh;
338 struct ivtv *itv = id->itv;
339 struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
341 pixfmt->width = itv->params.width;
342 pixfmt->height = itv->params.height;
343 pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
344 pixfmt->field = V4L2_FIELD_INTERLACED;
346 if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
347 pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
348 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
350 pixfmt->height * pixfmt->width +
351 pixfmt->height * (pixfmt->width / 2);
352 pixfmt->bytesperline = 720;
354 pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
355 pixfmt->sizeimage = 128 * 1024;
356 pixfmt->bytesperline = 0;
361 static int ivtv_g_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
363 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
364 struct v4l2_vbi_format *vbifmt = &fmt->fmt.vbi;
366 vbifmt->sampling_rate = 27000000;
367 vbifmt->offset = 248;
368 vbifmt->samples_per_line = itv->vbi.raw_decoder_line_size - 4;
369 vbifmt->sample_format = V4L2_PIX_FMT_GREY;
370 vbifmt->start[0] = itv->vbi.start[0];
371 vbifmt->start[1] = itv->vbi.start[1];
372 vbifmt->count[0] = vbifmt->count[1] = itv->vbi.count;
374 vbifmt->reserved[0] = 0;
375 vbifmt->reserved[1] = 0;
379 static int ivtv_g_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
381 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
382 struct ivtv_open_id *id = fh;
383 struct ivtv *itv = id->itv;
385 vbifmt->reserved[0] = 0;
386 vbifmt->reserved[1] = 0;
387 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
389 if (id->type == IVTV_DEC_STREAM_TYPE_VBI) {
390 vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
392 ivtv_expand_service_set(vbifmt, itv->is_50hz);
396 itv->video_dec_func(itv, VIDIOC_G_FMT, fmt);
397 vbifmt->service_set = ivtv_get_service_set(vbifmt);
401 static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
403 struct ivtv_open_id *id = fh;
404 struct ivtv *itv = id->itv;
405 struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
407 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
409 pixfmt->width = itv->main_rect.width;
410 pixfmt->height = itv->main_rect.height;
411 pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
412 pixfmt->field = V4L2_FIELD_INTERLACED;
414 if (id->type == IVTV_DEC_STREAM_TYPE_YUV) {
415 switch (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) {
416 case IVTV_YUV_MODE_INTERLACED:
417 pixfmt->field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) ?
418 V4L2_FIELD_INTERLACED_BT : V4L2_FIELD_INTERLACED_TB;
420 case IVTV_YUV_MODE_PROGRESSIVE:
421 pixfmt->field = V4L2_FIELD_NONE;
424 pixfmt->field = V4L2_FIELD_ANY;
427 pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
428 pixfmt->bytesperline = 720;
429 pixfmt->width = itv->yuv_info.v4l2_src_w;
430 pixfmt->height = itv->yuv_info.v4l2_src_h;
431 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
433 1080 * ((pixfmt->height + 31) & ~31);
435 pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
436 pixfmt->sizeimage = 128 * 1024;
437 pixfmt->bytesperline = 0;
442 static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
444 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
445 struct v4l2_window *winfmt = &fmt->fmt.win;
447 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
449 winfmt->chromakey = itv->osd_chroma_key;
450 winfmt->global_alpha = itv->osd_global_alpha;
451 winfmt->field = V4L2_FIELD_INTERLACED;
452 winfmt->clips = NULL;
453 winfmt->clipcount = 0;
454 winfmt->bitmap = NULL;
455 winfmt->w.top = winfmt->w.left = 0;
456 winfmt->w.width = itv->osd_rect.width;
457 winfmt->w.height = itv->osd_rect.height;
461 static int ivtv_try_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
463 return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
466 static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
468 struct ivtv_open_id *id = fh;
469 struct ivtv *itv = id->itv;
470 int w = fmt->fmt.pix.width;
471 int h = fmt->fmt.pix.height;
475 h = min(h, itv->is_50hz ? 576 : 480);
477 ivtv_g_fmt_vid_cap(file, fh, fmt);
478 fmt->fmt.pix.width = w;
479 fmt->fmt.pix.height = h;
483 static int ivtv_try_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
485 return ivtv_g_fmt_vbi_cap(file, fh, fmt);
488 static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
490 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
491 struct ivtv_open_id *id = fh;
492 struct ivtv *itv = id->itv;
494 if (id->type == IVTV_DEC_STREAM_TYPE_VBI)
495 return ivtv_g_fmt_sliced_vbi_cap(file, fh, fmt);
497 /* set sliced VBI capture format */
498 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
499 vbifmt->reserved[0] = 0;
500 vbifmt->reserved[1] = 0;
502 if (vbifmt->service_set)
503 ivtv_expand_service_set(vbifmt, itv->is_50hz);
504 check_service_set(vbifmt, itv->is_50hz);
505 vbifmt->service_set = ivtv_get_service_set(vbifmt);
509 static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
511 struct ivtv_open_id *id = fh;
512 s32 w = fmt->fmt.pix.width;
513 s32 h = fmt->fmt.pix.height;
514 int field = fmt->fmt.pix.field;
515 int ret = ivtv_g_fmt_vid_out(file, fh, fmt);
519 /* Why can the height be 576 even when the output is NTSC?
521 Internally the buffers of the PVR350 are always set to 720x576. The
522 decoded video frame will always be placed in the top left corner of
523 this buffer. For any video which is not 720x576, the buffer will
524 then be cropped to remove the unused right and lower areas, with
525 the remaining image being scaled by the hardware to fit the display
526 area. The video can be scaled both up and down, so a 720x480 video
527 can be displayed full-screen on PAL and a 720x576 video can be
528 displayed without cropping on NTSC.
530 Note that the scaling only occurs on the video stream, the osd
531 resolution is locked to the broadcast standard and not scaled.
533 Thanks to Ian Armstrong for this explanation. */
536 if (id->type == IVTV_DEC_STREAM_TYPE_YUV)
537 fmt->fmt.pix.field = field;
538 fmt->fmt.pix.width = w;
539 fmt->fmt.pix.height = h;
543 static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
545 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
546 u32 chromakey = fmt->fmt.win.chromakey;
547 u8 global_alpha = fmt->fmt.win.global_alpha;
549 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
551 ivtv_g_fmt_vid_out_overlay(file, fh, fmt);
552 fmt->fmt.win.chromakey = chromakey;
553 fmt->fmt.win.global_alpha = global_alpha;
557 static int ivtv_s_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
559 return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
562 static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
564 struct ivtv_open_id *id = fh;
565 struct ivtv *itv = id->itv;
566 struct cx2341x_mpeg_params *p = &itv->params;
567 int ret = ivtv_try_fmt_vid_cap(file, fh, fmt);
568 int w = fmt->fmt.pix.width;
569 int h = fmt->fmt.pix.height;
574 if (p->width == w && p->height == h)
577 if (atomic_read(&itv->capturing) > 0)
582 if (p->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
583 fmt->fmt.pix.width /= 2;
584 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
585 return ivtv_g_fmt_vid_cap(file, fh, fmt);
588 static int ivtv_s_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
590 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
592 if (!ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
594 itv->vbi.sliced_in->service_set = 0;
595 itv->vbi.in.type = V4L2_BUF_TYPE_VBI_CAPTURE;
596 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
597 return ivtv_g_fmt_vbi_cap(file, fh, fmt);
600 static int ivtv_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
602 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
603 struct ivtv_open_id *id = fh;
604 struct ivtv *itv = id->itv;
605 int ret = ivtv_try_fmt_sliced_vbi_cap(file, fh, fmt);
607 if (ret || id->type == IVTV_DEC_STREAM_TYPE_VBI)
610 check_service_set(vbifmt, itv->is_50hz);
611 if (ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
613 itv->vbi.in.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
614 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
615 memcpy(itv->vbi.sliced_in, vbifmt, sizeof(*itv->vbi.sliced_in));
619 static int ivtv_s_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
621 struct ivtv_open_id *id = fh;
622 struct ivtv *itv = id->itv;
623 struct yuv_playback_info *yi = &itv->yuv_info;
624 int ret = ivtv_try_fmt_vid_out(file, fh, fmt);
629 if (id->type != IVTV_DEC_STREAM_TYPE_YUV)
632 /* Return now if we already have some frame data */
636 yi->v4l2_src_w = fmt->fmt.pix.width;
637 yi->v4l2_src_h = fmt->fmt.pix.height;
639 switch (fmt->fmt.pix.field) {
640 case V4L2_FIELD_NONE:
641 yi->lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
644 yi->lace_mode = IVTV_YUV_MODE_AUTO;
646 case V4L2_FIELD_INTERLACED_BT:
648 IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
650 case V4L2_FIELD_INTERLACED_TB:
652 yi->lace_mode = IVTV_YUV_MODE_INTERLACED;
655 yi->lace_sync_field = (yi->lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
657 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
658 itv->dma_data_req_size =
659 1080 * ((yi->v4l2_src_h + 31) & ~31);
664 static int ivtv_s_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
666 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
667 int ret = ivtv_try_fmt_vid_out_overlay(file, fh, fmt);
670 itv->osd_chroma_key = fmt->fmt.win.chromakey;
671 itv->osd_global_alpha = fmt->fmt.win.global_alpha;
672 ivtv_set_osd_alpha(itv);
677 static int ivtv_g_chip_ident(struct file *file, void *fh, struct v4l2_chip_ident *chip)
679 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
681 chip->ident = V4L2_IDENT_NONE;
683 if (chip->match_type == V4L2_CHIP_MATCH_HOST) {
684 if (v4l2_chip_match_host(chip->match_type, chip->match_chip))
685 chip->ident = itv->has_cx23415 ? V4L2_IDENT_CX23415 : V4L2_IDENT_CX23416;
688 if (chip->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
689 return ivtv_i2c_id(itv, chip->match_chip, VIDIOC_G_CHIP_IDENT, chip);
690 if (chip->match_type == V4L2_CHIP_MATCH_I2C_ADDR)
691 return ivtv_call_i2c_client(itv, chip->match_chip, VIDIOC_G_CHIP_IDENT, chip);
695 #ifdef CONFIG_VIDEO_ADV_DEBUG
696 static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
698 struct v4l2_register *regs = arg;
700 volatile u8 __iomem *reg_start;
702 if (!capable(CAP_SYS_ADMIN))
704 if (regs->reg >= IVTV_REG_OFFSET && regs->reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
705 reg_start = itv->reg_mem - IVTV_REG_OFFSET;
706 else if (itv->has_cx23415 && regs->reg >= IVTV_DECODER_OFFSET &&
707 regs->reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
708 reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
709 else if (regs->reg >= 0 && regs->reg < IVTV_ENCODER_SIZE)
710 reg_start = itv->enc_mem;
714 spin_lock_irqsave(&ivtv_cards_lock, flags);
715 if (cmd == VIDIOC_DBG_G_REGISTER)
716 regs->val = readl(regs->reg + reg_start);
718 writel(regs->val, regs->reg + reg_start);
719 spin_unlock_irqrestore(&ivtv_cards_lock, flags);
723 static int ivtv_g_register(struct file *file, void *fh, struct v4l2_register *reg)
725 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
727 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
728 return ivtv_itvc(itv, VIDIOC_DBG_G_REGISTER, reg);
729 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
730 return ivtv_i2c_id(itv, reg->match_chip, VIDIOC_DBG_G_REGISTER, reg);
731 return ivtv_call_i2c_client(itv, reg->match_chip, VIDIOC_DBG_G_REGISTER, reg);
734 static int ivtv_s_register(struct file *file, void *fh, struct v4l2_register *reg)
736 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
738 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
739 return ivtv_itvc(itv, VIDIOC_DBG_S_REGISTER, reg);
740 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
741 return ivtv_i2c_id(itv, reg->match_chip, VIDIOC_DBG_S_REGISTER, reg);
742 return ivtv_call_i2c_client(itv, reg->match_chip, VIDIOC_DBG_S_REGISTER, reg);
746 static int ivtv_g_priority(struct file *file, void *fh, enum v4l2_priority *p)
748 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
750 *p = v4l2_prio_max(&itv->prio);
755 static int ivtv_s_priority(struct file *file, void *fh, enum v4l2_priority prio)
757 struct ivtv_open_id *id = fh;
758 struct ivtv *itv = id->itv;
760 return v4l2_prio_change(&itv->prio, &id->prio, prio);
763 static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vcap)
765 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
767 strlcpy(vcap->driver, IVTV_DRIVER_NAME, sizeof(vcap->driver));
768 strlcpy(vcap->card, itv->card_name, sizeof(vcap->card));
769 snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->dev));
770 vcap->version = IVTV_DRIVER_VERSION; /* version */
771 vcap->capabilities = itv->v4l2_cap; /* capabilities */
775 static int ivtv_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
777 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
779 return ivtv_get_audio_input(itv, vin->index, vin);
782 static int ivtv_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
784 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
786 vin->index = itv->audio_input;
787 return ivtv_get_audio_input(itv, vin->index, vin);
790 static int ivtv_s_audio(struct file *file, void *fh, struct v4l2_audio *vout)
792 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
794 if (vout->index >= itv->nof_audio_inputs)
797 itv->audio_input = vout->index;
798 ivtv_audio_set_io(itv);
803 static int ivtv_enumaudout(struct file *file, void *fh, struct v4l2_audioout *vin)
805 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
807 /* set it to defaults from our table */
808 return ivtv_get_audio_output(itv, vin->index, vin);
811 static int ivtv_g_audout(struct file *file, void *fh, struct v4l2_audioout *vin)
813 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
816 return ivtv_get_audio_output(itv, vin->index, vin);
819 static int ivtv_s_audout(struct file *file, void *fh, struct v4l2_audioout *vout)
821 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
823 return ivtv_get_audio_output(itv, vout->index, vout);
826 static int ivtv_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
828 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
830 /* set it to defaults from our table */
831 return ivtv_get_input(itv, vin->index, vin);
834 static int ivtv_enum_output(struct file *file, void *fh, struct v4l2_output *vout)
836 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
838 return ivtv_get_output(itv, vout->index, vout);
841 static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
843 struct ivtv_open_id *id = fh;
844 struct ivtv *itv = id->itv;
845 struct yuv_playback_info *yi = &itv->yuv_info;
848 streamtype = id->type;
850 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
852 cropcap->bounds.top = cropcap->bounds.left = 0;
853 cropcap->bounds.width = 720;
854 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
855 cropcap->bounds.height = itv->is_50hz ? 576 : 480;
856 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
857 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
858 } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
860 cropcap->bounds.width = yi->osd_full_w;
861 cropcap->bounds.height = yi->osd_full_h;
863 cropcap->bounds.width = 720;
864 cropcap->bounds.height =
865 itv->is_out_50hz ? 576 : 480;
867 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
868 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
870 cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
871 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
872 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
874 cropcap->defrect = cropcap->bounds;
878 static int ivtv_s_crop(struct file *file, void *fh, struct v4l2_crop *crop)
880 struct ivtv_open_id *id = fh;
881 struct ivtv *itv = id->itv;
882 struct yuv_playback_info *yi = &itv->yuv_info;
885 streamtype = id->type;
887 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
888 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
889 /* Should be replaced */
890 /* v4l_printk_ioctl(VIDIOC_S_CROP); */
893 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
894 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
895 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
896 yi->main_rect = crop->c;
899 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
900 crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
901 itv->main_rect = crop->c;
910 static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
912 struct ivtv_open_id *id = fh;
913 struct ivtv *itv = id->itv;
914 struct yuv_playback_info *yi = &itv->yuv_info;
917 streamtype = id->type;
919 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
920 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
921 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
922 crop->c = yi->main_rect;
924 crop->c = itv->main_rect;
930 static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
932 static struct v4l2_fmtdesc formats[] = {
934 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
937 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
938 "MPEG", V4L2_PIX_FMT_MPEG,
942 enum v4l2_buf_type type = fmt->type;
947 *fmt = formats[fmt->index];
952 static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
954 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
956 static struct v4l2_fmtdesc formats[] = {
958 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
961 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
962 "MPEG", V4L2_PIX_FMT_MPEG,
966 enum v4l2_buf_type type = fmt->type;
968 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
974 *fmt = formats[fmt->index];
980 static int ivtv_g_input(struct file *file, void *fh, unsigned int *i)
982 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
984 *i = itv->active_input;
989 int ivtv_s_input(struct file *file, void *fh, unsigned int inp)
991 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
993 if (inp < 0 || inp >= itv->nof_inputs)
996 if (inp == itv->active_input) {
997 IVTV_DEBUG_INFO("Input unchanged\n");
1001 if (atomic_read(&itv->capturing) > 0) {
1005 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
1006 itv->active_input, inp);
1008 itv->active_input = inp;
1009 /* Set the audio input to whatever is appropriate for the
1011 itv->audio_input = itv->card->video_inputs[inp].audio_index;
1013 /* prevent others from messing with the streams until
1014 we're finished changing inputs. */
1016 ivtv_video_set_io(itv);
1017 ivtv_audio_set_io(itv);
1023 static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
1025 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1027 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1030 *i = itv->active_output;
1035 static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
1037 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1038 struct v4l2_routing route;
1040 if (outp >= itv->card->nof_outputs)
1043 if (outp == itv->active_output) {
1044 IVTV_DEBUG_INFO("Output unchanged\n");
1047 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1048 itv->active_output, outp);
1050 itv->active_output = outp;
1051 route.input = SAA7127_INPUT_TYPE_NORMAL;
1052 route.output = itv->card->video_outputs[outp].video_output;
1053 ivtv_saa7127(itv, VIDIOC_INT_S_VIDEO_ROUTING, &route);
1058 static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1060 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1065 ivtv_call_i2c_clients(itv, VIDIOC_G_FREQUENCY, vf);
1069 int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1071 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1077 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf->frequency);
1078 ivtv_call_i2c_clients(itv, VIDIOC_S_FREQUENCY, vf);
1083 static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
1085 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1091 int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
1093 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1094 struct yuv_playback_info *yi = &itv->yuv_info;
1096 if ((*std & V4L2_STD_ALL) == 0)
1099 if (*std == itv->std)
1102 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1103 atomic_read(&itv->capturing) > 0 ||
1104 atomic_read(&itv->decoding) > 0) {
1105 /* Switching standard would turn off the radio or mess
1106 with already running streams, prevent that by
1112 itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
1113 itv->params.is_50hz = itv->is_50hz = !itv->is_60hz;
1114 itv->params.width = 720;
1115 itv->params.height = itv->is_50hz ? 576 : 480;
1116 itv->vbi.count = itv->is_50hz ? 18 : 12;
1117 itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1118 itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1120 if (itv->hw_flags & IVTV_HW_CX25840)
1121 itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1123 IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std);
1126 ivtv_call_i2c_clients(itv, VIDIOC_S_STD, &itv->std);
1128 if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
1129 /* set display standard */
1130 itv->std_out = *std;
1131 itv->is_out_60hz = itv->is_60hz;
1132 itv->is_out_50hz = itv->is_50hz;
1133 ivtv_call_i2c_clients(itv, VIDIOC_INT_S_STD_OUTPUT, &itv->std_out);
1134 ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1135 itv->main_rect.left = itv->main_rect.top = 0;
1136 itv->main_rect.width = 720;
1137 itv->main_rect.height = itv->params.height;
1138 ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1139 720, itv->main_rect.height, 0, 0);
1140 yi->main_rect = itv->main_rect;
1141 if (!itv->osd_info) {
1142 yi->osd_full_w = 720;
1143 yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1149 static int ivtv_s_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1151 struct ivtv_open_id *id = fh;
1152 struct ivtv *itv = id->itv;
1157 ivtv_call_i2c_clients(itv, VIDIOC_S_TUNER, vt);
1162 static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1164 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1169 ivtv_call_i2c_clients(itv, VIDIOC_G_TUNER, vt);
1171 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) {
1172 strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
1173 vt->type = V4L2_TUNER_RADIO;
1175 strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
1176 vt->type = V4L2_TUNER_ANALOG_TV;
1182 static int ivtv_g_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_sliced_vbi_cap *cap)
1184 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1185 int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1188 if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1189 for (f = 0; f < 2; f++) {
1190 for (l = 0; l < 24; l++) {
1191 if (valid_service_line(f, l, itv->is_50hz))
1192 cap->service_lines[f][l] = set;
1197 if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1198 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1201 cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1202 cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1204 cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1205 cap->service_lines[0][16] = V4L2_SLICED_VPS;
1212 static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *idx)
1214 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1215 struct v4l2_enc_idx_entry *e = idx->entry;
1219 entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1221 if (entries > V4L2_ENC_IDX_ENTRIES)
1222 entries = V4L2_ENC_IDX_ENTRIES;
1224 for (i = 0; i < entries; i++) {
1225 *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1226 if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1231 itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1235 static int ivtv_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1237 struct ivtv_open_id *id = fh;
1238 struct ivtv *itv = id->itv;
1242 case V4L2_ENC_CMD_START:
1243 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1245 return ivtv_start_capture(id);
1247 case V4L2_ENC_CMD_STOP:
1248 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1249 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1250 ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1253 case V4L2_ENC_CMD_PAUSE:
1254 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1257 if (!atomic_read(&itv->capturing))
1259 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1263 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1266 case V4L2_ENC_CMD_RESUME:
1267 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1270 if (!atomic_read(&itv->capturing))
1273 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1276 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1280 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1287 static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1289 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1292 case V4L2_ENC_CMD_START:
1293 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1297 case V4L2_ENC_CMD_STOP:
1298 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1299 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1302 case V4L2_ENC_CMD_PAUSE:
1303 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1307 case V4L2_ENC_CMD_RESUME:
1308 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1312 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1317 static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1319 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1320 u32 data[CX2341X_MBOX_MAX_DATA];
1321 struct yuv_playback_info *yi = &itv->yuv_info;
1324 static u32 pixel_format[16] = {
1325 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1326 V4L2_PIX_FMT_RGB565,
1327 V4L2_PIX_FMT_RGB555,
1328 V4L2_PIX_FMT_RGB444,
1333 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1334 V4L2_PIX_FMT_YUV565,
1335 V4L2_PIX_FMT_YUV555,
1336 V4L2_PIX_FMT_YUV444,
1343 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1345 if (!itv->osd_video_pbase)
1348 fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1349 V4L2_FBUF_CAP_GLOBAL_ALPHA;
1351 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1352 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1353 pixfmt = (data[0] >> 3) & 0xf;
1355 fb->fmt.pixelformat = pixel_format[pixfmt];
1356 fb->fmt.width = itv->osd_rect.width;
1357 fb->fmt.height = itv->osd_rect.height;
1358 fb->fmt.field = V4L2_FIELD_INTERLACED;
1359 fb->fmt.bytesperline = fb->fmt.width;
1360 fb->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
1361 fb->fmt.field = V4L2_FIELD_INTERLACED;
1363 if (fb->fmt.pixelformat != V4L2_PIX_FMT_PAL8)
1364 fb->fmt.bytesperline *= 2;
1365 if (fb->fmt.pixelformat == V4L2_PIX_FMT_RGB32 ||
1366 fb->fmt.pixelformat == V4L2_PIX_FMT_YUV32)
1367 fb->fmt.bytesperline *= 2;
1368 fb->fmt.sizeimage = fb->fmt.bytesperline * fb->fmt.height;
1369 fb->base = (void *)itv->osd_video_pbase;
1372 if (itv->osd_chroma_key_state)
1373 fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1375 if (itv->osd_global_alpha_state)
1376 fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1379 fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1383 /* no local alpha for RGB565 or unknown formats */
1384 if (pixfmt == 1 || pixfmt > 4)
1387 /* 16-bit formats have inverted local alpha */
1388 if (pixfmt == 2 || pixfmt == 3)
1389 fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1391 fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1393 if (itv->osd_local_alpha_state) {
1394 /* 16-bit formats have inverted local alpha */
1395 if (pixfmt == 2 || pixfmt == 3)
1396 fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1398 fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1404 static int ivtv_s_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1406 struct ivtv_open_id *id = fh;
1407 struct ivtv *itv = id->itv;
1408 struct yuv_playback_info *yi = &itv->yuv_info;
1410 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1412 if (!itv->osd_video_pbase)
1415 itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1416 itv->osd_local_alpha_state =
1417 (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1418 itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1419 ivtv_set_osd_alpha(itv);
1420 yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1421 return ivtv_g_fbuf(file, fh, fb);
1424 static int ivtv_overlay(struct file *file, void *fh, unsigned int on)
1426 struct ivtv_open_id *id = fh;
1427 struct ivtv *itv = id->itv;
1429 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1432 ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0);
1437 static int ivtv_log_status(struct file *file, void *fh)
1439 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1440 u32 data[CX2341X_MBOX_MAX_DATA];
1442 int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1443 struct v4l2_input vidin;
1444 struct v4l2_audio audin;
1447 IVTV_INFO("================= START STATUS CARD #%d =================\n", itv->num);
1448 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1449 if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1452 ivtv_read_eeprom(itv, &tv);
1454 ivtv_call_i2c_clients(itv, VIDIOC_LOG_STATUS, NULL);
1455 ivtv_get_input(itv, itv->active_input, &vidin);
1456 ivtv_get_audio_input(itv, itv->audio_input, &audin);
1457 IVTV_INFO("Video Input: %s\n", vidin.name);
1458 IVTV_INFO("Audio Input: %s%s\n", audin.name,
1459 (itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1461 struct v4l2_output vidout;
1462 struct v4l2_audioout audout;
1463 int mode = itv->output_mode;
1464 static const char * const output_modes[5] = {
1471 static const char * const audio_modes[5] = {
1478 static const char * const alpha_mode[4] = {
1484 static const char * const pixel_format[16] = {
1503 ivtv_get_output(itv, itv->active_output, &vidout);
1504 ivtv_get_audio_output(itv, 0, &audout);
1505 IVTV_INFO("Video Output: %s\n", vidout.name);
1506 IVTV_INFO("Audio Output: %s (Stereo/Bilingual: %s/%s)\n", audout.name,
1507 audio_modes[itv->audio_stereo_mode],
1508 audio_modes[itv->audio_bilingual_mode]);
1509 if (mode < 0 || mode > OUT_PASSTHROUGH)
1511 IVTV_INFO("Output Mode: %s\n", output_modes[mode]);
1512 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1513 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1514 IVTV_INFO("Overlay: %s, Alpha: %s, Pixel Format: %s\n",
1515 data[0] & 1 ? "On" : "Off",
1516 alpha_mode[(data[0] >> 1) & 0x3],
1517 pixel_format[(data[0] >> 3) & 0xf]);
1519 IVTV_INFO("Tuner: %s\n",
1520 test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1521 cx2341x_log_status(&itv->params, itv->name);
1522 IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
1523 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1524 struct ivtv_stream *s = &itv->streams[i];
1526 if (s->v4l2dev == NULL || s->buffers == 0)
1528 IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1529 (s->buffers - s->q_free.buffers) * 100 / s->buffers,
1530 (s->buffers * s->buf_size) / 1024, s->buffers);
1533 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n", (long long)itv->mpg_data_received, (long long)itv->vbi_data_inserted);
1534 IVTV_INFO("================== END STATUS CARD #%d ==================\n", itv->num);
1539 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1541 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1542 struct ivtv *itv = id->itv;
1543 int nonblocking = filp->f_flags & O_NONBLOCK;
1544 struct ivtv_stream *s = &itv->streams[id->type];
1547 case IVTV_IOC_DMA_FRAME: {
1548 struct ivtv_dma_frame *args = arg;
1550 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1551 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1553 if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1555 if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1557 if (ivtv_start_decoding(id, id->type)) {
1560 if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1561 ivtv_release_stream(s);
1564 /* Mark that this file handle started the UDMA_YUV mode */
1566 if (args->y_source == NULL)
1568 return ivtv_yuv_prep_frame(itv, args);
1571 case VIDEO_GET_PTS: {
1572 u32 data[CX2341X_MBOX_MAX_DATA];
1575 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1576 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1580 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1583 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1584 *pts = (u64) ((u64)itv->last_dec_timing[2] << 32) |
1585 (u64)itv->last_dec_timing[1];
1589 if (atomic_read(&itv->decoding)) {
1590 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1591 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1594 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1595 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1596 *pts = (u64) ((u64) data[2] << 32) | (u64) data[1];
1597 /*timing->scr = (u64) (((u64) data[4] << 32) | (u64) (data[3]));*/
1602 case VIDEO_GET_FRAME_COUNT: {
1603 u32 data[CX2341X_MBOX_MAX_DATA];
1606 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1607 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1611 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1614 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1615 *frame = itv->last_dec_timing[0];
1619 if (atomic_read(&itv->decoding)) {
1620 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1621 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1624 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1625 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1632 struct video_command vc;
1634 IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1635 memset(&vc, 0, sizeof(vc));
1636 vc.cmd = VIDEO_CMD_PLAY;
1637 return ivtv_video_command(itv, id, &vc, 0);
1641 struct video_command vc;
1643 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1644 memset(&vc, 0, sizeof(vc));
1645 vc.cmd = VIDEO_CMD_STOP;
1646 vc.flags = VIDEO_CMD_STOP_TO_BLACK | VIDEO_CMD_STOP_IMMEDIATELY;
1647 return ivtv_video_command(itv, id, &vc, 0);
1650 case VIDEO_FREEZE: {
1651 struct video_command vc;
1653 IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1654 memset(&vc, 0, sizeof(vc));
1655 vc.cmd = VIDEO_CMD_FREEZE;
1656 return ivtv_video_command(itv, id, &vc, 0);
1659 case VIDEO_CONTINUE: {
1660 struct video_command vc;
1662 IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1663 memset(&vc, 0, sizeof(vc));
1664 vc.cmd = VIDEO_CMD_CONTINUE;
1665 return ivtv_video_command(itv, id, &vc, 0);
1669 case VIDEO_TRY_COMMAND: {
1670 struct video_command *vc = arg;
1671 int try = (cmd == VIDEO_TRY_COMMAND);
1674 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", vc->cmd);
1676 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", vc->cmd);
1677 return ivtv_video_command(itv, id, vc, try);
1680 case VIDEO_GET_EVENT: {
1681 struct video_event *ev = arg;
1684 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1685 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1687 memset(ev, 0, sizeof(*ev));
1688 set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1691 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1692 ev->type = VIDEO_EVENT_DECODER_STOPPED;
1693 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1694 ev->type = VIDEO_EVENT_VSYNC;
1695 ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1696 VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1697 if (itv->output_mode == OUT_UDMA_YUV &&
1698 (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1699 IVTV_YUV_MODE_PROGRESSIVE) {
1700 ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1707 /* Wait for event. Note that serialize_lock is locked,
1708 so to allow other processes to access the driver while
1709 we are waiting unlock first and later lock again. */
1710 mutex_unlock(&itv->serialize_lock);
1711 prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1712 if ((itv->i_flags & (IVTV_F_I_EV_DEC_STOPPED|IVTV_F_I_EV_VSYNC)) == 0)
1714 finish_wait(&itv->event_waitq, &wait);
1715 mutex_lock(&itv->serialize_lock);
1716 if (signal_pending(current)) {
1717 /* return if a signal was received */
1718 IVTV_DEBUG_INFO("User stopped wait for event\n");
1731 static int ivtv_default(struct file *file, void *fh, int cmd, void *arg)
1733 struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
1736 case VIDIOC_INT_S_AUDIO_ROUTING: {
1737 struct v4l2_routing *route = arg;
1739 ivtv_i2c_hw(itv, itv->card->hw_audio, VIDIOC_INT_S_AUDIO_ROUTING, route);
1743 case VIDIOC_INT_RESET: {
1744 u32 val = *(u32 *)arg;
1746 if ((val == 0 && itv->options.newi2c) || (val & 0x01))
1747 ivtv_reset_ir_gpio(itv);
1749 itv->video_dec_func(itv, cmd, NULL);
1759 static long ivtv_serialized_ioctl(struct ivtv *itv, struct file *filp,
1760 unsigned int cmd, unsigned long arg)
1762 struct video_device *vfd = video_devdata(filp);
1763 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1766 /* Filter dvb ioctls that cannot be handled by the v4l ioctl framework */
1768 case VIDEO_SELECT_SOURCE:
1769 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1770 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1772 return ivtv_passthrough_mode(itv, arg == VIDEO_SOURCE_DEMUX);
1774 case AUDIO_SET_MUTE:
1775 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1776 itv->speed_mute_audio = arg;
1779 case AUDIO_CHANNEL_SELECT:
1780 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1781 if (arg > AUDIO_STEREO_SWAPPED)
1783 itv->audio_stereo_mode = arg;
1784 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1787 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1788 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1789 if (arg > AUDIO_STEREO_SWAPPED)
1791 itv->audio_bilingual_mode = arg;
1792 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1795 case IVTV_IOC_DMA_FRAME:
1797 case VIDEO_GET_FRAME_COUNT:
1798 case VIDEO_GET_EVENT:
1802 case VIDEO_CONTINUE:
1804 case VIDEO_TRY_COMMAND:
1805 return ivtv_decoder_ioctls(filp, cmd, (void *)arg);
1811 /* check priority */
1815 case VIDIOC_S_INPUT:
1816 case VIDIOC_S_OUTPUT:
1817 case VIDIOC_S_TUNER:
1818 case VIDIOC_S_FREQUENCY:
1821 case VIDIOC_S_AUDIO:
1822 case VIDIOC_S_AUDOUT:
1823 case VIDIOC_S_EXT_CTRLS:
1825 case VIDIOC_OVERLAY:
1826 ret = v4l2_prio_check(&itv->prio, &id->prio);
1831 if (ivtv_debug & IVTV_DBGFLG_IOCTL)
1832 vfd->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
1833 ret = __video_ioctl2(filp, cmd, arg);
1838 long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1840 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1841 struct ivtv *itv = id->itv;
1844 mutex_lock(&itv->serialize_lock);
1845 res = ivtv_serialized_ioctl(itv, filp, cmd, arg);
1846 mutex_unlock(&itv->serialize_lock);
1850 static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1851 .vidioc_querycap = ivtv_querycap,
1852 .vidioc_g_priority = ivtv_g_priority,
1853 .vidioc_s_priority = ivtv_s_priority,
1854 .vidioc_s_audio = ivtv_s_audio,
1855 .vidioc_g_audio = ivtv_g_audio,
1856 .vidioc_enumaudio = ivtv_enumaudio,
1857 .vidioc_s_audout = ivtv_s_audout,
1858 .vidioc_g_audout = ivtv_g_audout,
1859 .vidioc_enum_input = ivtv_enum_input,
1860 .vidioc_enum_output = ivtv_enum_output,
1861 .vidioc_enumaudout = ivtv_enumaudout,
1862 .vidioc_cropcap = ivtv_cropcap,
1863 .vidioc_s_crop = ivtv_s_crop,
1864 .vidioc_g_crop = ivtv_g_crop,
1865 .vidioc_g_input = ivtv_g_input,
1866 .vidioc_s_input = ivtv_s_input,
1867 .vidioc_g_output = ivtv_g_output,
1868 .vidioc_s_output = ivtv_s_output,
1869 .vidioc_g_frequency = ivtv_g_frequency,
1870 .vidioc_s_frequency = ivtv_s_frequency,
1871 .vidioc_s_tuner = ivtv_s_tuner,
1872 .vidioc_g_tuner = ivtv_g_tuner,
1873 .vidioc_g_enc_index = ivtv_g_enc_index,
1874 .vidioc_g_fbuf = ivtv_g_fbuf,
1875 .vidioc_s_fbuf = ivtv_s_fbuf,
1876 .vidioc_g_std = ivtv_g_std,
1877 .vidioc_s_std = ivtv_s_std,
1878 .vidioc_overlay = ivtv_overlay,
1879 .vidioc_log_status = ivtv_log_status,
1880 .vidioc_enum_fmt_vid_cap = ivtv_enum_fmt_vid_cap,
1881 .vidioc_encoder_cmd = ivtv_encoder_cmd,
1882 .vidioc_try_encoder_cmd = ivtv_try_encoder_cmd,
1883 .vidioc_enum_fmt_vid_out = ivtv_enum_fmt_vid_out,
1884 .vidioc_g_fmt_vid_cap = ivtv_g_fmt_vid_cap,
1885 .vidioc_g_fmt_vbi_cap = ivtv_g_fmt_vbi_cap,
1886 .vidioc_g_fmt_sliced_vbi_cap = ivtv_g_fmt_sliced_vbi_cap,
1887 .vidioc_g_fmt_vid_out = ivtv_g_fmt_vid_out,
1888 .vidioc_g_fmt_vid_out_overlay = ivtv_g_fmt_vid_out_overlay,
1889 .vidioc_g_fmt_sliced_vbi_out = ivtv_g_fmt_sliced_vbi_out,
1890 .vidioc_s_fmt_vid_cap = ivtv_s_fmt_vid_cap,
1891 .vidioc_s_fmt_vbi_cap = ivtv_s_fmt_vbi_cap,
1892 .vidioc_s_fmt_sliced_vbi_cap = ivtv_s_fmt_sliced_vbi_cap,
1893 .vidioc_s_fmt_vid_out = ivtv_s_fmt_vid_out,
1894 .vidioc_s_fmt_vid_out_overlay = ivtv_s_fmt_vid_out_overlay,
1895 .vidioc_s_fmt_sliced_vbi_out = ivtv_s_fmt_sliced_vbi_out,
1896 .vidioc_try_fmt_vid_cap = ivtv_try_fmt_vid_cap,
1897 .vidioc_try_fmt_vbi_cap = ivtv_try_fmt_vbi_cap,
1898 .vidioc_try_fmt_sliced_vbi_cap = ivtv_try_fmt_sliced_vbi_cap,
1899 .vidioc_try_fmt_vid_out = ivtv_try_fmt_vid_out,
1900 .vidioc_try_fmt_vid_out_overlay = ivtv_try_fmt_vid_out_overlay,
1901 .vidioc_try_fmt_sliced_vbi_out = ivtv_try_fmt_sliced_vbi_out,
1902 .vidioc_g_sliced_vbi_cap = ivtv_g_sliced_vbi_cap,
1903 .vidioc_g_chip_ident = ivtv_g_chip_ident,
1904 #ifdef CONFIG_VIDEO_ADV_DEBUG
1905 .vidioc_g_register = ivtv_g_register,
1906 .vidioc_s_register = ivtv_s_register,
1908 .vidioc_default = ivtv_default,
1909 .vidioc_queryctrl = ivtv_queryctrl,
1910 .vidioc_querymenu = ivtv_querymenu,
1911 .vidioc_g_ext_ctrls = ivtv_g_ext_ctrls,
1912 .vidioc_s_ext_ctrls = ivtv_s_ext_ctrls,
1913 .vidioc_try_ext_ctrls = ivtv_try_ext_ctrls,
1916 void ivtv_set_funcs(struct video_device *vdev)
1918 vdev->ioctl_ops = &ivtv_ioctl_ops;