3 Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com>
4 Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "ivtv-driver.h"
22 #include "ivtv-version.h"
23 #include "ivtv-mailbox.h"
25 #include "ivtv-queue.h"
26 #include "ivtv-fileops.h"
28 #include "ivtv-routing.h"
29 #include "ivtv-streams.h"
31 #include "ivtv-ioctl.h"
32 #include "ivtv-gpio.h"
33 #include "ivtv-controls.h"
34 #include "ivtv-cards.h"
35 #include <media/saa7127.h>
36 #include <media/tveeprom.h>
37 #include <media/v4l2-chip-ident.h>
38 #include <media/v4l2-event.h>
39 #include <linux/dvb/audio.h>
41 u16 ivtv_service2vbi(int type)
44 case V4L2_SLICED_TELETEXT_B:
45 return IVTV_SLICED_TYPE_TELETEXT_B;
46 case V4L2_SLICED_CAPTION_525:
47 return IVTV_SLICED_TYPE_CAPTION_525;
48 case V4L2_SLICED_WSS_625:
49 return IVTV_SLICED_TYPE_WSS_625;
51 return IVTV_SLICED_TYPE_VPS;
57 static int valid_service_line(int field, int line, int is_pal)
59 return (is_pal && line >= 6 && (line != 23 || field == 0)) ||
60 (!is_pal && line >= 10 && line < 22);
63 static u16 select_service_from_set(int field, int line, u16 set, int is_pal)
65 u16 valid_set = (is_pal ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525);
68 set = set & valid_set;
69 if (set == 0 || !valid_service_line(field, line, is_pal)) {
73 if (line == 21 && (set & V4L2_SLICED_CAPTION_525))
74 return V4L2_SLICED_CAPTION_525;
77 if (line == 16 && field == 0 && (set & V4L2_SLICED_VPS))
78 return V4L2_SLICED_VPS;
79 if (line == 23 && field == 0 && (set & V4L2_SLICED_WSS_625))
80 return V4L2_SLICED_WSS_625;
84 for (i = 0; i < 32; i++) {
91 void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
93 u16 set = fmt->service_set;
97 for (f = 0; f < 2; f++) {
98 for (l = 0; l < 24; l++) {
99 fmt->service_lines[f][l] = select_service_from_set(f, l, set, is_pal);
104 static void check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
108 for (f = 0; f < 2; f++) {
109 for (l = 0; l < 24; l++) {
110 fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
115 u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt)
120 for (f = 0; f < 2; f++) {
121 for (l = 0; l < 24; l++) {
122 set |= fmt->service_lines[f][l];
128 void ivtv_set_osd_alpha(struct ivtv *itv)
130 ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
131 itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
132 ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
135 int ivtv_set_speed(struct ivtv *itv, int speed)
137 u32 data[CX2341X_MBOX_MAX_DATA];
138 struct ivtv_stream *s;
139 int single_step = (speed == 1 || speed == -1);
142 if (speed == 0) speed = 1000;
145 if (speed == itv->speed && !single_step)
148 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
150 if (single_step && (speed < 0) == (itv->speed < 0)) {
151 /* Single step video and no need to change direction */
152 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
157 /* Need to change direction */
158 speed = speed < 0 ? -1000 : 1000;
160 data[0] = (speed > 1000 || speed < -1000) ? 0x80000000 : 0;
161 data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0;
162 data[1] = (speed < 0);
163 data[2] = speed < 0 ? 3 : 7;
164 data[3] = v4l2_ctrl_g_ctrl(itv->cxhdl.video_b_frames);
165 data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0;
169 if (speed == 1500 || speed == -1500) data[0] |= 1;
170 else if (speed == 2000 || speed == -2000) data[0] |= 2;
171 else if (speed > -1000 && speed < 0) data[0] |= (-1000 / speed);
172 else if (speed < 1000 && speed > 0) data[0] |= (1000 / speed);
174 /* If not decoding, just change speed setting */
175 if (atomic_read(&itv->decoding) > 0) {
178 /* Stop all DMA and decoding activity */
179 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
181 /* Wait for any DMA to finish */
182 prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE);
183 while (test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
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 = fh2id(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 = fh2id(fh);
338 struct ivtv *itv = id->itv;
339 struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
341 pixfmt->width = itv->cxhdl.width;
342 pixfmt->height = itv->cxhdl.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*720) + UV=(h*(720/2))) */
349 pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
350 pixfmt->bytesperline = 720;
352 pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
353 pixfmt->sizeimage = 128 * 1024;
354 pixfmt->bytesperline = 0;
359 static int ivtv_g_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
361 struct ivtv *itv = fh2id(fh)->itv;
362 struct v4l2_vbi_format *vbifmt = &fmt->fmt.vbi;
364 vbifmt->sampling_rate = 27000000;
365 vbifmt->offset = 248;
366 vbifmt->samples_per_line = itv->vbi.raw_decoder_line_size - 4;
367 vbifmt->sample_format = V4L2_PIX_FMT_GREY;
368 vbifmt->start[0] = itv->vbi.start[0];
369 vbifmt->start[1] = itv->vbi.start[1];
370 vbifmt->count[0] = vbifmt->count[1] = itv->vbi.count;
372 vbifmt->reserved[0] = 0;
373 vbifmt->reserved[1] = 0;
377 static int ivtv_g_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
379 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
380 struct ivtv_open_id *id = fh2id(fh);
381 struct ivtv *itv = id->itv;
383 vbifmt->reserved[0] = 0;
384 vbifmt->reserved[1] = 0;
385 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
387 if (id->type == IVTV_DEC_STREAM_TYPE_VBI) {
388 vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
390 ivtv_expand_service_set(vbifmt, itv->is_50hz);
394 v4l2_subdev_call(itv->sd_video, vbi, g_sliced_fmt, vbifmt);
395 vbifmt->service_set = ivtv_get_service_set(vbifmt);
399 static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
401 struct ivtv_open_id *id = fh2id(fh);
402 struct ivtv *itv = id->itv;
403 struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
405 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
407 pixfmt->width = itv->main_rect.width;
408 pixfmt->height = itv->main_rect.height;
409 pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
410 pixfmt->field = V4L2_FIELD_INTERLACED;
412 if (id->type == IVTV_DEC_STREAM_TYPE_YUV) {
413 switch (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) {
414 case IVTV_YUV_MODE_INTERLACED:
415 pixfmt->field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) ?
416 V4L2_FIELD_INTERLACED_BT : V4L2_FIELD_INTERLACED_TB;
418 case IVTV_YUV_MODE_PROGRESSIVE:
419 pixfmt->field = V4L2_FIELD_NONE;
422 pixfmt->field = V4L2_FIELD_ANY;
425 pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
426 pixfmt->bytesperline = 720;
427 pixfmt->width = itv->yuv_info.v4l2_src_w;
428 pixfmt->height = itv->yuv_info.v4l2_src_h;
429 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
431 1080 * ((pixfmt->height + 31) & ~31);
433 pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
434 pixfmt->sizeimage = 128 * 1024;
435 pixfmt->bytesperline = 0;
440 static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
442 struct ivtv *itv = fh2id(fh)->itv;
443 struct v4l2_window *winfmt = &fmt->fmt.win;
445 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
447 winfmt->chromakey = itv->osd_chroma_key;
448 winfmt->global_alpha = itv->osd_global_alpha;
449 winfmt->field = V4L2_FIELD_INTERLACED;
450 winfmt->clips = NULL;
451 winfmt->clipcount = 0;
452 winfmt->bitmap = NULL;
453 winfmt->w.top = winfmt->w.left = 0;
454 winfmt->w.width = itv->osd_rect.width;
455 winfmt->w.height = itv->osd_rect.height;
459 static int ivtv_try_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
461 return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
464 static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
466 struct ivtv_open_id *id = fh2id(fh);
467 struct ivtv *itv = id->itv;
468 int w = fmt->fmt.pix.width;
469 int h = fmt->fmt.pix.height;
474 if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
475 /* YUV height must be a multiple of 32 */
479 h = min(h, itv->is_50hz ? 576 : 480);
481 ivtv_g_fmt_vid_cap(file, fh, fmt);
482 fmt->fmt.pix.width = w;
483 fmt->fmt.pix.height = h;
487 static int ivtv_try_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
489 return ivtv_g_fmt_vbi_cap(file, fh, fmt);
492 static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
494 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
495 struct ivtv_open_id *id = fh2id(fh);
496 struct ivtv *itv = id->itv;
498 if (id->type == IVTV_DEC_STREAM_TYPE_VBI)
499 return ivtv_g_fmt_sliced_vbi_cap(file, fh, fmt);
501 /* set sliced VBI capture format */
502 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
503 vbifmt->reserved[0] = 0;
504 vbifmt->reserved[1] = 0;
506 if (vbifmt->service_set)
507 ivtv_expand_service_set(vbifmt, itv->is_50hz);
508 check_service_set(vbifmt, itv->is_50hz);
509 vbifmt->service_set = ivtv_get_service_set(vbifmt);
513 static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
515 struct ivtv_open_id *id = fh2id(fh);
516 s32 w = fmt->fmt.pix.width;
517 s32 h = fmt->fmt.pix.height;
518 int field = fmt->fmt.pix.field;
519 int ret = ivtv_g_fmt_vid_out(file, fh, fmt);
523 /* Why can the height be 576 even when the output is NTSC?
525 Internally the buffers of the PVR350 are always set to 720x576. The
526 decoded video frame will always be placed in the top left corner of
527 this buffer. For any video which is not 720x576, the buffer will
528 then be cropped to remove the unused right and lower areas, with
529 the remaining image being scaled by the hardware to fit the display
530 area. The video can be scaled both up and down, so a 720x480 video
531 can be displayed full-screen on PAL and a 720x576 video can be
532 displayed without cropping on NTSC.
534 Note that the scaling only occurs on the video stream, the osd
535 resolution is locked to the broadcast standard and not scaled.
537 Thanks to Ian Armstrong for this explanation. */
540 if (id->type == IVTV_DEC_STREAM_TYPE_YUV)
541 fmt->fmt.pix.field = field;
542 fmt->fmt.pix.width = w;
543 fmt->fmt.pix.height = h;
547 static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
549 struct ivtv *itv = fh2id(fh)->itv;
550 u32 chromakey = fmt->fmt.win.chromakey;
551 u8 global_alpha = fmt->fmt.win.global_alpha;
553 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
555 ivtv_g_fmt_vid_out_overlay(file, fh, fmt);
556 fmt->fmt.win.chromakey = chromakey;
557 fmt->fmt.win.global_alpha = global_alpha;
561 static int ivtv_s_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
563 return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
566 static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
568 struct ivtv_open_id *id = fh2id(fh);
569 struct ivtv *itv = id->itv;
570 struct v4l2_mbus_framefmt mbus_fmt;
571 int ret = ivtv_try_fmt_vid_cap(file, fh, fmt);
572 int w = fmt->fmt.pix.width;
573 int h = fmt->fmt.pix.height;
578 if (itv->cxhdl.width == w && itv->cxhdl.height == h)
581 if (atomic_read(&itv->capturing) > 0)
584 itv->cxhdl.width = w;
585 itv->cxhdl.height = h;
586 if (v4l2_ctrl_g_ctrl(itv->cxhdl.video_encoding) == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
587 fmt->fmt.pix.width /= 2;
588 mbus_fmt.width = fmt->fmt.pix.width;
590 mbus_fmt.code = V4L2_MBUS_FMT_FIXED;
591 v4l2_subdev_call(itv->sd_video, video, s_mbus_fmt, &mbus_fmt);
592 return ivtv_g_fmt_vid_cap(file, fh, fmt);
595 static int ivtv_s_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
597 struct ivtv *itv = fh2id(fh)->itv;
599 if (!ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
601 itv->vbi.sliced_in->service_set = 0;
602 itv->vbi.in.type = V4L2_BUF_TYPE_VBI_CAPTURE;
603 v4l2_subdev_call(itv->sd_video, vbi, s_raw_fmt, &fmt->fmt.vbi);
604 return ivtv_g_fmt_vbi_cap(file, fh, fmt);
607 static int ivtv_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
609 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
610 struct ivtv_open_id *id = fh2id(fh);
611 struct ivtv *itv = id->itv;
612 int ret = ivtv_try_fmt_sliced_vbi_cap(file, fh, fmt);
614 if (ret || id->type == IVTV_DEC_STREAM_TYPE_VBI)
617 check_service_set(vbifmt, itv->is_50hz);
618 if (ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
620 itv->vbi.in.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
621 v4l2_subdev_call(itv->sd_video, vbi, s_sliced_fmt, vbifmt);
622 memcpy(itv->vbi.sliced_in, vbifmt, sizeof(*itv->vbi.sliced_in));
626 static int ivtv_s_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
628 struct ivtv_open_id *id = fh2id(fh);
629 struct ivtv *itv = id->itv;
630 struct yuv_playback_info *yi = &itv->yuv_info;
631 int ret = ivtv_try_fmt_vid_out(file, fh, fmt);
636 if (id->type != IVTV_DEC_STREAM_TYPE_YUV)
639 /* Return now if we already have some frame data */
643 yi->v4l2_src_w = fmt->fmt.pix.width;
644 yi->v4l2_src_h = fmt->fmt.pix.height;
646 switch (fmt->fmt.pix.field) {
647 case V4L2_FIELD_NONE:
648 yi->lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
651 yi->lace_mode = IVTV_YUV_MODE_AUTO;
653 case V4L2_FIELD_INTERLACED_BT:
655 IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
657 case V4L2_FIELD_INTERLACED_TB:
659 yi->lace_mode = IVTV_YUV_MODE_INTERLACED;
662 yi->lace_sync_field = (yi->lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
664 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
665 itv->dma_data_req_size =
666 1080 * ((yi->v4l2_src_h + 31) & ~31);
671 static int ivtv_s_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
673 struct ivtv *itv = fh2id(fh)->itv;
674 int ret = ivtv_try_fmt_vid_out_overlay(file, fh, fmt);
677 itv->osd_chroma_key = fmt->fmt.win.chromakey;
678 itv->osd_global_alpha = fmt->fmt.win.global_alpha;
679 ivtv_set_osd_alpha(itv);
684 static int ivtv_g_chip_ident(struct file *file, void *fh, struct v4l2_dbg_chip_ident *chip)
686 struct ivtv *itv = fh2id(fh)->itv;
688 chip->ident = V4L2_IDENT_NONE;
690 if (chip->match.type == V4L2_CHIP_MATCH_HOST) {
691 if (v4l2_chip_match_host(&chip->match))
692 chip->ident = itv->has_cx23415 ? V4L2_IDENT_CX23415 : V4L2_IDENT_CX23416;
695 if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER &&
696 chip->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
698 /* TODO: is this correct? */
699 return ivtv_call_all_err(itv, core, g_chip_ident, chip);
702 #ifdef CONFIG_VIDEO_ADV_DEBUG
703 static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
705 struct v4l2_dbg_register *regs = arg;
706 volatile u8 __iomem *reg_start;
708 if (!capable(CAP_SYS_ADMIN))
710 if (regs->reg >= IVTV_REG_OFFSET && regs->reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
711 reg_start = itv->reg_mem - IVTV_REG_OFFSET;
712 else if (itv->has_cx23415 && regs->reg >= IVTV_DECODER_OFFSET &&
713 regs->reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
714 reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
715 else if (regs->reg < IVTV_ENCODER_SIZE)
716 reg_start = itv->enc_mem;
721 if (cmd == VIDIOC_DBG_G_REGISTER)
722 regs->val = readl(regs->reg + reg_start);
724 writel(regs->val, regs->reg + reg_start);
728 static int ivtv_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
730 struct ivtv *itv = fh2id(fh)->itv;
732 if (v4l2_chip_match_host(®->match))
733 return ivtv_itvc(itv, VIDIOC_DBG_G_REGISTER, reg);
734 /* TODO: subdev errors should not be ignored, this should become a
735 subdev helper function. */
736 ivtv_call_all(itv, core, g_register, reg);
740 static int ivtv_s_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
742 struct ivtv *itv = fh2id(fh)->itv;
744 if (v4l2_chip_match_host(®->match))
745 return ivtv_itvc(itv, VIDIOC_DBG_S_REGISTER, reg);
746 /* TODO: subdev errors should not be ignored, this should become a
747 subdev helper function. */
748 ivtv_call_all(itv, core, s_register, reg);
753 static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vcap)
755 struct ivtv *itv = fh2id(fh)->itv;
757 strlcpy(vcap->driver, IVTV_DRIVER_NAME, sizeof(vcap->driver));
758 strlcpy(vcap->card, itv->card_name, sizeof(vcap->card));
759 snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev));
760 vcap->capabilities = itv->v4l2_cap; /* capabilities */
764 static int ivtv_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
766 struct ivtv *itv = fh2id(fh)->itv;
768 return ivtv_get_audio_input(itv, vin->index, vin);
771 static int ivtv_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
773 struct ivtv *itv = fh2id(fh)->itv;
775 vin->index = itv->audio_input;
776 return ivtv_get_audio_input(itv, vin->index, vin);
779 static int ivtv_s_audio(struct file *file, void *fh, struct v4l2_audio *vout)
781 struct ivtv *itv = fh2id(fh)->itv;
783 if (vout->index >= itv->nof_audio_inputs)
786 itv->audio_input = vout->index;
787 ivtv_audio_set_io(itv);
792 static int ivtv_enumaudout(struct file *file, void *fh, struct v4l2_audioout *vin)
794 struct ivtv *itv = fh2id(fh)->itv;
796 /* set it to defaults from our table */
797 return ivtv_get_audio_output(itv, vin->index, vin);
800 static int ivtv_g_audout(struct file *file, void *fh, struct v4l2_audioout *vin)
802 struct ivtv *itv = fh2id(fh)->itv;
805 return ivtv_get_audio_output(itv, vin->index, vin);
808 static int ivtv_s_audout(struct file *file, void *fh, struct v4l2_audioout *vout)
810 struct ivtv *itv = fh2id(fh)->itv;
812 return ivtv_get_audio_output(itv, vout->index, vout);
815 static int ivtv_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
817 struct ivtv *itv = fh2id(fh)->itv;
819 /* set it to defaults from our table */
820 return ivtv_get_input(itv, vin->index, vin);
823 static int ivtv_enum_output(struct file *file, void *fh, struct v4l2_output *vout)
825 struct ivtv *itv = fh2id(fh)->itv;
827 return ivtv_get_output(itv, vout->index, vout);
830 static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
832 struct ivtv_open_id *id = fh2id(fh);
833 struct ivtv *itv = id->itv;
834 struct yuv_playback_info *yi = &itv->yuv_info;
837 streamtype = id->type;
839 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
841 cropcap->bounds.top = cropcap->bounds.left = 0;
842 cropcap->bounds.width = 720;
843 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
844 cropcap->bounds.height = itv->is_50hz ? 576 : 480;
845 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
846 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
847 } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
849 cropcap->bounds.width = yi->osd_full_w;
850 cropcap->bounds.height = yi->osd_full_h;
852 cropcap->bounds.width = 720;
853 cropcap->bounds.height =
854 itv->is_out_50hz ? 576 : 480;
856 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
857 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
859 cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
860 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
861 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
863 cropcap->defrect = cropcap->bounds;
867 static int ivtv_s_crop(struct file *file, void *fh, struct v4l2_crop *crop)
869 struct ivtv_open_id *id = fh2id(fh);
870 struct ivtv *itv = id->itv;
871 struct yuv_playback_info *yi = &itv->yuv_info;
874 streamtype = id->type;
876 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
877 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
878 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
879 yi->main_rect = crop->c;
882 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
883 crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
884 itv->main_rect = crop->c;
893 static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
895 struct ivtv_open_id *id = fh2id(fh);
896 struct ivtv *itv = id->itv;
897 struct yuv_playback_info *yi = &itv->yuv_info;
900 streamtype = id->type;
902 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
903 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
904 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
905 crop->c = yi->main_rect;
907 crop->c = itv->main_rect;
913 static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
915 static struct v4l2_fmtdesc formats[] = {
917 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
920 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
921 "MPEG", V4L2_PIX_FMT_MPEG,
925 enum v4l2_buf_type type = fmt->type;
930 *fmt = formats[fmt->index];
935 static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
937 struct ivtv *itv = fh2id(fh)->itv;
939 static struct v4l2_fmtdesc formats[] = {
941 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
944 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
945 "MPEG", V4L2_PIX_FMT_MPEG,
949 enum v4l2_buf_type type = fmt->type;
951 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
957 *fmt = formats[fmt->index];
963 static int ivtv_g_input(struct file *file, void *fh, unsigned int *i)
965 struct ivtv *itv = fh2id(fh)->itv;
967 *i = itv->active_input;
972 int ivtv_s_input(struct file *file, void *fh, unsigned int inp)
974 struct ivtv *itv = fh2id(fh)->itv;
976 if (inp < 0 || inp >= itv->nof_inputs)
979 if (inp == itv->active_input) {
980 IVTV_DEBUG_INFO("Input unchanged\n");
984 if (atomic_read(&itv->capturing) > 0) {
988 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
989 itv->active_input, inp);
991 itv->active_input = inp;
992 /* Set the audio input to whatever is appropriate for the
994 itv->audio_input = itv->card->video_inputs[inp].audio_index;
996 /* prevent others from messing with the streams until
997 we're finished changing inputs. */
999 ivtv_video_set_io(itv);
1000 ivtv_audio_set_io(itv);
1006 static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
1008 struct ivtv *itv = fh2id(fh)->itv;
1010 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1013 *i = itv->active_output;
1018 static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
1020 struct ivtv *itv = fh2id(fh)->itv;
1022 if (outp >= itv->card->nof_outputs)
1025 if (outp == itv->active_output) {
1026 IVTV_DEBUG_INFO("Output unchanged\n");
1029 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1030 itv->active_output, outp);
1032 itv->active_output = outp;
1033 ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
1034 SAA7127_INPUT_TYPE_NORMAL,
1035 itv->card->video_outputs[outp].video_output, 0);
1040 static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1042 struct ivtv *itv = fh2id(fh)->itv;
1047 ivtv_call_all(itv, tuner, g_frequency, vf);
1051 int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1053 struct ivtv *itv = fh2id(fh)->itv;
1059 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf->frequency);
1060 ivtv_call_all(itv, tuner, s_frequency, vf);
1065 static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
1067 struct ivtv *itv = fh2id(fh)->itv;
1073 void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id *std)
1076 itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
1077 itv->is_50hz = !itv->is_60hz;
1078 cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz);
1079 itv->cxhdl.width = 720;
1080 itv->cxhdl.height = itv->is_50hz ? 576 : 480;
1081 itv->vbi.count = itv->is_50hz ? 18 : 12;
1082 itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1083 itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1085 if (itv->hw_flags & IVTV_HW_CX25840)
1086 itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1089 ivtv_call_all(itv, core, s_std, itv->std);
1092 void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std)
1094 struct yuv_playback_info *yi = &itv->yuv_info;
1098 /* set display standard */
1099 itv->std_out = *std;
1100 itv->is_out_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
1101 itv->is_out_50hz = !itv->is_out_60hz;
1102 ivtv_call_all(itv, video, s_std_output, itv->std_out);
1105 * The next firmware call is time sensitive. Time it to
1106 * avoid risk of a hard lock, by trying to ensure the call
1107 * happens within the first 100 lines of the top field.
1108 * Make 4 attempts to sync to the decoder before giving up.
1110 for (f = 0; f < 4; f++) {
1111 prepare_to_wait(&itv->vsync_waitq, &wait,
1112 TASK_UNINTERRUPTIBLE);
1113 if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
1115 schedule_timeout(msecs_to_jiffies(25));
1117 finish_wait(&itv->vsync_waitq, &wait);
1120 IVTV_WARN("Mode change failed to sync to decoder\n");
1122 ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1123 itv->main_rect.left = 0;
1124 itv->main_rect.top = 0;
1125 itv->main_rect.width = 720;
1126 itv->main_rect.height = itv->is_out_50hz ? 576 : 480;
1127 ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1128 720, itv->main_rect.height, 0, 0);
1129 yi->main_rect = itv->main_rect;
1130 if (!itv->osd_info) {
1131 yi->osd_full_w = 720;
1132 yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1136 int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
1138 struct ivtv *itv = fh2id(fh)->itv;
1140 if ((*std & V4L2_STD_ALL) == 0)
1143 if (*std == itv->std)
1146 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1147 atomic_read(&itv->capturing) > 0 ||
1148 atomic_read(&itv->decoding) > 0) {
1149 /* Switching standard would mess with already running
1150 streams, prevent that by returning EBUSY. */
1154 IVTV_DEBUG_INFO("Switching standard to %llx.\n",
1155 (unsigned long long)itv->std);
1157 ivtv_s_std_enc(itv, std);
1158 if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
1159 ivtv_s_std_dec(itv, std);
1164 static int ivtv_s_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1166 struct ivtv_open_id *id = fh2id(fh);
1167 struct ivtv *itv = id->itv;
1172 ivtv_call_all(itv, tuner, s_tuner, vt);
1177 static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1179 struct ivtv *itv = fh2id(fh)->itv;
1184 ivtv_call_all(itv, tuner, g_tuner, vt);
1186 if (vt->type == V4L2_TUNER_RADIO)
1187 strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
1189 strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
1193 static int ivtv_g_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_sliced_vbi_cap *cap)
1195 struct ivtv *itv = fh2id(fh)->itv;
1196 int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1199 if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1200 for (f = 0; f < 2; f++) {
1201 for (l = 0; l < 24; l++) {
1202 if (valid_service_line(f, l, itv->is_50hz))
1203 cap->service_lines[f][l] = set;
1208 if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1209 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1212 cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1213 cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1215 cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1216 cap->service_lines[0][16] = V4L2_SLICED_VPS;
1223 static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *idx)
1225 struct ivtv *itv = fh2id(fh)->itv;
1226 struct v4l2_enc_idx_entry *e = idx->entry;
1230 entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1232 if (entries > V4L2_ENC_IDX_ENTRIES)
1233 entries = V4L2_ENC_IDX_ENTRIES;
1235 for (i = 0; i < entries; i++) {
1236 *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1237 if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1242 itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1246 static int ivtv_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1248 struct ivtv_open_id *id = fh2id(fh);
1249 struct ivtv *itv = id->itv;
1253 case V4L2_ENC_CMD_START:
1254 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1256 return ivtv_start_capture(id);
1258 case V4L2_ENC_CMD_STOP:
1259 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1260 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1261 ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1264 case V4L2_ENC_CMD_PAUSE:
1265 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1268 if (!atomic_read(&itv->capturing))
1270 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1274 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1277 case V4L2_ENC_CMD_RESUME:
1278 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1281 if (!atomic_read(&itv->capturing))
1284 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1287 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1291 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1298 static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1300 struct ivtv *itv = fh2id(fh)->itv;
1303 case V4L2_ENC_CMD_START:
1304 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1308 case V4L2_ENC_CMD_STOP:
1309 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1310 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1313 case V4L2_ENC_CMD_PAUSE:
1314 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1318 case V4L2_ENC_CMD_RESUME:
1319 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1323 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1328 static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1330 struct ivtv *itv = fh2id(fh)->itv;
1331 u32 data[CX2341X_MBOX_MAX_DATA];
1332 struct yuv_playback_info *yi = &itv->yuv_info;
1335 static u32 pixel_format[16] = {
1336 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1337 V4L2_PIX_FMT_RGB565,
1338 V4L2_PIX_FMT_RGB555,
1339 V4L2_PIX_FMT_RGB444,
1344 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1345 V4L2_PIX_FMT_YUV565,
1346 V4L2_PIX_FMT_YUV555,
1347 V4L2_PIX_FMT_YUV444,
1354 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1356 if (!itv->osd_video_pbase)
1359 fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1360 V4L2_FBUF_CAP_GLOBAL_ALPHA;
1362 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1363 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1364 pixfmt = (data[0] >> 3) & 0xf;
1366 fb->fmt.pixelformat = pixel_format[pixfmt];
1367 fb->fmt.width = itv->osd_rect.width;
1368 fb->fmt.height = itv->osd_rect.height;
1369 fb->fmt.field = V4L2_FIELD_INTERLACED;
1370 fb->fmt.bytesperline = fb->fmt.width;
1371 fb->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
1372 fb->fmt.field = V4L2_FIELD_INTERLACED;
1374 if (fb->fmt.pixelformat != V4L2_PIX_FMT_PAL8)
1375 fb->fmt.bytesperline *= 2;
1376 if (fb->fmt.pixelformat == V4L2_PIX_FMT_RGB32 ||
1377 fb->fmt.pixelformat == V4L2_PIX_FMT_YUV32)
1378 fb->fmt.bytesperline *= 2;
1379 fb->fmt.sizeimage = fb->fmt.bytesperline * fb->fmt.height;
1380 fb->base = (void *)itv->osd_video_pbase;
1383 if (itv->osd_chroma_key_state)
1384 fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1386 if (itv->osd_global_alpha_state)
1387 fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1390 fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1394 /* no local alpha for RGB565 or unknown formats */
1395 if (pixfmt == 1 || pixfmt > 4)
1398 /* 16-bit formats have inverted local alpha */
1399 if (pixfmt == 2 || pixfmt == 3)
1400 fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1402 fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1404 if (itv->osd_local_alpha_state) {
1405 /* 16-bit formats have inverted local alpha */
1406 if (pixfmt == 2 || pixfmt == 3)
1407 fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1409 fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1415 static int ivtv_s_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1417 struct ivtv_open_id *id = fh2id(fh);
1418 struct ivtv *itv = id->itv;
1419 struct yuv_playback_info *yi = &itv->yuv_info;
1421 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1423 if (!itv->osd_video_pbase)
1426 itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1427 itv->osd_local_alpha_state =
1428 (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1429 itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1430 ivtv_set_osd_alpha(itv);
1431 yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1432 return ivtv_g_fbuf(file, fh, fb);
1435 static int ivtv_overlay(struct file *file, void *fh, unsigned int on)
1437 struct ivtv_open_id *id = fh2id(fh);
1438 struct ivtv *itv = id->itv;
1440 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1443 ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0);
1448 static int ivtv_subscribe_event(struct v4l2_fh *fh, struct v4l2_event_subscription *sub)
1450 switch (sub->type) {
1451 case V4L2_EVENT_VSYNC:
1452 case V4L2_EVENT_EOS:
1454 case V4L2_EVENT_CTRL:
1455 return v4l2_ctrl_subscribe_fh(fh, sub, 0);
1459 return v4l2_event_subscribe(fh, sub);
1462 static int ivtv_log_status(struct file *file, void *fh)
1464 struct ivtv *itv = fh2id(fh)->itv;
1465 u32 data[CX2341X_MBOX_MAX_DATA];
1467 int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1468 struct v4l2_input vidin;
1469 struct v4l2_audio audin;
1472 IVTV_INFO("================= START STATUS CARD #%d =================\n",
1474 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1475 if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1478 ivtv_read_eeprom(itv, &tv);
1480 ivtv_call_all(itv, core, log_status);
1481 ivtv_get_input(itv, itv->active_input, &vidin);
1482 ivtv_get_audio_input(itv, itv->audio_input, &audin);
1483 IVTV_INFO("Video Input: %s\n", vidin.name);
1484 IVTV_INFO("Audio Input: %s%s\n", audin.name,
1485 (itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1487 struct v4l2_output vidout;
1488 struct v4l2_audioout audout;
1489 int mode = itv->output_mode;
1490 static const char * const output_modes[5] = {
1497 static const char * const audio_modes[5] = {
1504 static const char * const alpha_mode[4] = {
1510 static const char * const pixel_format[16] = {
1529 ivtv_get_output(itv, itv->active_output, &vidout);
1530 ivtv_get_audio_output(itv, 0, &audout);
1531 IVTV_INFO("Video Output: %s\n", vidout.name);
1532 IVTV_INFO("Audio Output: %s (Stereo/Bilingual: %s/%s)\n", audout.name,
1533 audio_modes[itv->audio_stereo_mode],
1534 audio_modes[itv->audio_bilingual_mode]);
1535 if (mode < 0 || mode > OUT_PASSTHROUGH)
1537 IVTV_INFO("Output Mode: %s\n", output_modes[mode]);
1538 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1539 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1540 IVTV_INFO("Overlay: %s, Alpha: %s, Pixel Format: %s\n",
1541 data[0] & 1 ? "On" : "Off",
1542 alpha_mode[(data[0] >> 1) & 0x3],
1543 pixel_format[(data[0] >> 3) & 0xf]);
1545 IVTV_INFO("Tuner: %s\n",
1546 test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1547 v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
1548 IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
1549 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1550 struct ivtv_stream *s = &itv->streams[i];
1552 if (s->vdev == NULL || s->buffers == 0)
1554 IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1555 (s->buffers - s->q_free.buffers) * 100 / s->buffers,
1556 (s->buffers * s->buf_size) / 1024, s->buffers);
1559 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1560 (long long)itv->mpg_data_received,
1561 (long long)itv->vbi_data_inserted);
1562 IVTV_INFO("================== END STATUS CARD #%d ==================\n",
1568 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1570 struct ivtv_open_id *id = fh2id(filp->private_data);
1571 struct ivtv *itv = id->itv;
1572 int nonblocking = filp->f_flags & O_NONBLOCK;
1573 struct ivtv_stream *s = &itv->streams[id->type];
1574 unsigned long iarg = (unsigned long)arg;
1577 case IVTV_IOC_DMA_FRAME: {
1578 struct ivtv_dma_frame *args = arg;
1580 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1581 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1583 if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1585 if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1587 if (ivtv_start_decoding(id, id->type)) {
1590 if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1591 ivtv_release_stream(s);
1594 /* Mark that this file handle started the UDMA_YUV mode */
1596 if (args->y_source == NULL)
1598 return ivtv_yuv_prep_frame(itv, args);
1601 case VIDEO_GET_PTS: {
1602 u32 data[CX2341X_MBOX_MAX_DATA];
1605 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1606 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1610 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1613 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1614 *pts = (u64) ((u64)itv->last_dec_timing[2] << 32) |
1615 (u64)itv->last_dec_timing[1];
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);
1626 *pts = (u64) ((u64) data[2] << 32) | (u64) data[1];
1627 /*timing->scr = (u64) (((u64) data[4] << 32) | (u64) (data[3]));*/
1632 case VIDEO_GET_FRAME_COUNT: {
1633 u32 data[CX2341X_MBOX_MAX_DATA];
1636 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1637 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1641 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1644 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1645 *frame = itv->last_dec_timing[0];
1649 if (atomic_read(&itv->decoding)) {
1650 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1651 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1654 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1655 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1662 struct video_command vc;
1664 IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1665 memset(&vc, 0, sizeof(vc));
1666 vc.cmd = VIDEO_CMD_PLAY;
1667 return ivtv_video_command(itv, id, &vc, 0);
1671 struct video_command vc;
1673 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1674 memset(&vc, 0, sizeof(vc));
1675 vc.cmd = VIDEO_CMD_STOP;
1676 vc.flags = VIDEO_CMD_STOP_TO_BLACK | VIDEO_CMD_STOP_IMMEDIATELY;
1677 return ivtv_video_command(itv, id, &vc, 0);
1680 case VIDEO_FREEZE: {
1681 struct video_command vc;
1683 IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1684 memset(&vc, 0, sizeof(vc));
1685 vc.cmd = VIDEO_CMD_FREEZE;
1686 return ivtv_video_command(itv, id, &vc, 0);
1689 case VIDEO_CONTINUE: {
1690 struct video_command vc;
1692 IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1693 memset(&vc, 0, sizeof(vc));
1694 vc.cmd = VIDEO_CMD_CONTINUE;
1695 return ivtv_video_command(itv, id, &vc, 0);
1699 case VIDEO_TRY_COMMAND: {
1700 struct video_command *vc = arg;
1701 int try = (cmd == VIDEO_TRY_COMMAND);
1704 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", vc->cmd);
1706 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", vc->cmd);
1707 return ivtv_video_command(itv, id, vc, try);
1710 case VIDEO_GET_EVENT: {
1711 struct video_event *ev = arg;
1714 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1715 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1717 memset(ev, 0, sizeof(*ev));
1718 set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1721 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1722 ev->type = VIDEO_EVENT_DECODER_STOPPED;
1723 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1724 ev->type = VIDEO_EVENT_VSYNC;
1725 ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1726 VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1727 if (itv->output_mode == OUT_UDMA_YUV &&
1728 (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1729 IVTV_YUV_MODE_PROGRESSIVE) {
1730 ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1737 /* Wait for event. Note that serialize_lock is locked,
1738 so to allow other processes to access the driver while
1739 we are waiting unlock first and later lock again. */
1740 mutex_unlock(&itv->serialize_lock);
1741 prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1742 if (!test_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags) &&
1743 !test_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags))
1745 finish_wait(&itv->event_waitq, &wait);
1746 mutex_lock(&itv->serialize_lock);
1747 if (signal_pending(current)) {
1748 /* return if a signal was received */
1749 IVTV_DEBUG_INFO("User stopped wait for event\n");
1756 case VIDEO_SELECT_SOURCE:
1757 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1758 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1760 return ivtv_passthrough_mode(itv, iarg == VIDEO_SOURCE_DEMUX);
1762 case AUDIO_SET_MUTE:
1763 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1764 itv->speed_mute_audio = iarg;
1767 case AUDIO_CHANNEL_SELECT:
1768 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1769 if (iarg > AUDIO_STEREO_SWAPPED)
1771 itv->audio_stereo_mode = iarg;
1772 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1775 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1776 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1777 if (iarg > AUDIO_STEREO_SWAPPED)
1779 itv->audio_bilingual_mode = iarg;
1780 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1789 static long ivtv_default(struct file *file, void *fh, bool valid_prio,
1792 struct ivtv *itv = fh2id(fh)->itv;
1799 case VIDEO_CONTINUE:
1801 case VIDEO_SELECT_SOURCE:
1802 case AUDIO_SET_MUTE:
1803 case AUDIO_CHANNEL_SELECT:
1804 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1810 case VIDIOC_INT_RESET: {
1811 u32 val = *(u32 *)arg;
1813 if ((val == 0 && itv->options.newi2c) || (val & 0x01))
1814 ivtv_reset_ir_gpio(itv);
1816 v4l2_subdev_call(itv->sd_video, core, reset, 0);
1820 case IVTV_IOC_DMA_FRAME:
1822 case VIDEO_GET_FRAME_COUNT:
1823 case VIDEO_GET_EVENT:
1827 case VIDEO_CONTINUE:
1829 case VIDEO_TRY_COMMAND:
1830 case VIDEO_SELECT_SOURCE:
1831 case AUDIO_SET_MUTE:
1832 case AUDIO_CHANNEL_SELECT:
1833 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1834 return ivtv_decoder_ioctls(file, cmd, (void *)arg);
1842 static long ivtv_serialized_ioctl(struct ivtv *itv, struct file *filp,
1843 unsigned int cmd, unsigned long arg)
1845 struct video_device *vfd = video_devdata(filp);
1848 if (ivtv_debug & IVTV_DBGFLG_IOCTL)
1849 vfd->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
1850 ret = video_ioctl2(filp, cmd, arg);
1855 long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1857 struct ivtv_open_id *id = fh2id(filp->private_data);
1858 struct ivtv *itv = id->itv;
1861 /* DQEVENT can block, so this should not run with the serialize lock */
1862 if (cmd == VIDIOC_DQEVENT)
1863 return ivtv_serialized_ioctl(itv, filp, cmd, arg);
1864 mutex_lock(&itv->serialize_lock);
1865 res = ivtv_serialized_ioctl(itv, filp, cmd, arg);
1866 mutex_unlock(&itv->serialize_lock);
1870 static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1871 .vidioc_querycap = ivtv_querycap,
1872 .vidioc_s_audio = ivtv_s_audio,
1873 .vidioc_g_audio = ivtv_g_audio,
1874 .vidioc_enumaudio = ivtv_enumaudio,
1875 .vidioc_s_audout = ivtv_s_audout,
1876 .vidioc_g_audout = ivtv_g_audout,
1877 .vidioc_enum_input = ivtv_enum_input,
1878 .vidioc_enum_output = ivtv_enum_output,
1879 .vidioc_enumaudout = ivtv_enumaudout,
1880 .vidioc_cropcap = ivtv_cropcap,
1881 .vidioc_s_crop = ivtv_s_crop,
1882 .vidioc_g_crop = ivtv_g_crop,
1883 .vidioc_g_input = ivtv_g_input,
1884 .vidioc_s_input = ivtv_s_input,
1885 .vidioc_g_output = ivtv_g_output,
1886 .vidioc_s_output = ivtv_s_output,
1887 .vidioc_g_frequency = ivtv_g_frequency,
1888 .vidioc_s_frequency = ivtv_s_frequency,
1889 .vidioc_s_tuner = ivtv_s_tuner,
1890 .vidioc_g_tuner = ivtv_g_tuner,
1891 .vidioc_g_enc_index = ivtv_g_enc_index,
1892 .vidioc_g_fbuf = ivtv_g_fbuf,
1893 .vidioc_s_fbuf = ivtv_s_fbuf,
1894 .vidioc_g_std = ivtv_g_std,
1895 .vidioc_s_std = ivtv_s_std,
1896 .vidioc_overlay = ivtv_overlay,
1897 .vidioc_log_status = ivtv_log_status,
1898 .vidioc_enum_fmt_vid_cap = ivtv_enum_fmt_vid_cap,
1899 .vidioc_encoder_cmd = ivtv_encoder_cmd,
1900 .vidioc_try_encoder_cmd = ivtv_try_encoder_cmd,
1901 .vidioc_enum_fmt_vid_out = ivtv_enum_fmt_vid_out,
1902 .vidioc_g_fmt_vid_cap = ivtv_g_fmt_vid_cap,
1903 .vidioc_g_fmt_vbi_cap = ivtv_g_fmt_vbi_cap,
1904 .vidioc_g_fmt_sliced_vbi_cap = ivtv_g_fmt_sliced_vbi_cap,
1905 .vidioc_g_fmt_vid_out = ivtv_g_fmt_vid_out,
1906 .vidioc_g_fmt_vid_out_overlay = ivtv_g_fmt_vid_out_overlay,
1907 .vidioc_g_fmt_sliced_vbi_out = ivtv_g_fmt_sliced_vbi_out,
1908 .vidioc_s_fmt_vid_cap = ivtv_s_fmt_vid_cap,
1909 .vidioc_s_fmt_vbi_cap = ivtv_s_fmt_vbi_cap,
1910 .vidioc_s_fmt_sliced_vbi_cap = ivtv_s_fmt_sliced_vbi_cap,
1911 .vidioc_s_fmt_vid_out = ivtv_s_fmt_vid_out,
1912 .vidioc_s_fmt_vid_out_overlay = ivtv_s_fmt_vid_out_overlay,
1913 .vidioc_s_fmt_sliced_vbi_out = ivtv_s_fmt_sliced_vbi_out,
1914 .vidioc_try_fmt_vid_cap = ivtv_try_fmt_vid_cap,
1915 .vidioc_try_fmt_vbi_cap = ivtv_try_fmt_vbi_cap,
1916 .vidioc_try_fmt_sliced_vbi_cap = ivtv_try_fmt_sliced_vbi_cap,
1917 .vidioc_try_fmt_vid_out = ivtv_try_fmt_vid_out,
1918 .vidioc_try_fmt_vid_out_overlay = ivtv_try_fmt_vid_out_overlay,
1919 .vidioc_try_fmt_sliced_vbi_out = ivtv_try_fmt_sliced_vbi_out,
1920 .vidioc_g_sliced_vbi_cap = ivtv_g_sliced_vbi_cap,
1921 .vidioc_g_chip_ident = ivtv_g_chip_ident,
1922 #ifdef CONFIG_VIDEO_ADV_DEBUG
1923 .vidioc_g_register = ivtv_g_register,
1924 .vidioc_s_register = ivtv_s_register,
1926 .vidioc_default = ivtv_default,
1927 .vidioc_subscribe_event = ivtv_subscribe_event,
1928 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1931 void ivtv_set_funcs(struct video_device *vdev)
1933 vdev->ioctl_ops = &ivtv_ioctl_ops;