V4L/DVB (6715): ivtv: Remove unnecessary register update
[linux-2.6/verdex.git] / drivers / media / video / ivtv / ivtv-ioctl.c
blobfd6826f472e3c99ac50029602e0e38ffc136aba7
1 /*
2 ioctl system call
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"
24 #include "ivtv-i2c.h"
25 #include "ivtv-queue.h"
26 #include "ivtv-fileops.h"
27 #include "ivtv-vbi.h"
28 #include "ivtv-routing.h"
29 #include "ivtv-streams.h"
30 #include "ivtv-yuv.h"
31 #include "ivtv-ioctl.h"
32 #include "ivtv-gpio.h"
33 #include "ivtv-controls.h"
34 #include "ivtv-cards.h"
35 #include <media/saa7127.h>
36 #include <media/tveeprom.h>
37 #include <media/v4l2-chip-ident.h>
38 #include <linux/dvb/audio.h>
39 #include <linux/i2c-id.h>
41 u16 service2vbi(int type)
43 switch (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;
50 case V4L2_SLICED_VPS:
51 return IVTV_SLICED_TYPE_VPS;
52 default:
53 return 0;
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);
66 int i;
68 set = set & valid_set;
69 if (set == 0 || !valid_service_line(field, line, is_pal)) {
70 return 0;
72 if (!is_pal) {
73 if (line == 21 && (set & V4L2_SLICED_CAPTION_525))
74 return V4L2_SLICED_CAPTION_525;
76 else {
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;
81 if (line == 23)
82 return 0;
84 for (i = 0; i < 32; i++) {
85 if ((1 << i) & set)
86 return 1 << i;
88 return 0;
91 void expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
93 u16 set = fmt->service_set;
94 int f, l;
96 fmt->service_set = 0;
97 for (f = 0; f < 2; f++) {
98 for (l = 0; l < 24; l++) {
99 fmt->service_lines[f][l] = select_service_from_set(f, l, set, is_pal);
104 static int check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
106 int f, l;
107 u16 set = 0;
109 for (f = 0; f < 2; f++) {
110 for (l = 0; l < 24; l++) {
111 fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
112 set |= fmt->service_lines[f][l];
115 return set != 0;
118 u16 get_service_set(struct v4l2_sliced_vbi_format *fmt)
120 int f, l;
121 u16 set = 0;
123 for (f = 0; f < 2; f++) {
124 for (l = 0; l < 24; l++) {
125 set |= fmt->service_lines[f][l];
128 return set;
131 static const struct {
132 v4l2_std_id std;
133 char *name;
134 } enum_stds[] = {
135 { V4L2_STD_PAL_BG | V4L2_STD_PAL_H, "PAL-BGH" },
136 { V4L2_STD_PAL_DK, "PAL-DK" },
137 { V4L2_STD_PAL_I, "PAL-I" },
138 { V4L2_STD_PAL_M, "PAL-M" },
139 { V4L2_STD_PAL_N, "PAL-N" },
140 { V4L2_STD_PAL_Nc, "PAL-Nc" },
141 { V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H, "SECAM-BGH" },
142 { V4L2_STD_SECAM_DK, "SECAM-DK" },
143 { V4L2_STD_SECAM_L, "SECAM-L" },
144 { V4L2_STD_SECAM_LC, "SECAM-L'" },
145 { V4L2_STD_NTSC_M, "NTSC-M" },
146 { V4L2_STD_NTSC_M_JP, "NTSC-J" },
147 { V4L2_STD_NTSC_M_KR, "NTSC-K" },
150 static const struct v4l2_standard ivtv_std_60hz =
152 .frameperiod = {.numerator = 1001, .denominator = 30000},
153 .framelines = 525,
156 static const struct v4l2_standard ivtv_std_50hz =
158 .frameperiod = {.numerator = 1, .denominator = 25},
159 .framelines = 625,
162 void ivtv_set_osd_alpha(struct ivtv *itv)
164 ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
165 itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
166 ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
169 int ivtv_set_speed(struct ivtv *itv, int speed)
171 u32 data[CX2341X_MBOX_MAX_DATA];
172 struct ivtv_stream *s;
173 int single_step = (speed == 1 || speed == -1);
174 DEFINE_WAIT(wait);
176 if (speed == 0) speed = 1000;
178 /* No change? */
179 if (speed == itv->speed && !single_step)
180 return 0;
182 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
184 if (single_step && (speed < 0) == (itv->speed < 0)) {
185 /* Single step video and no need to change direction */
186 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
187 itv->speed = speed;
188 return 0;
190 if (single_step)
191 /* Need to change direction */
192 speed = speed < 0 ? -1000 : 1000;
194 data[0] = (speed > 1000 || speed < -1000) ? 0x80000000 : 0;
195 data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0;
196 data[1] = (speed < 0);
197 data[2] = speed < 0 ? 3 : 7;
198 data[3] = itv->params.video_b_frames;
199 data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0;
200 data[5] = 0;
201 data[6] = 0;
203 if (speed == 1500 || speed == -1500) data[0] |= 1;
204 else if (speed == 2000 || speed == -2000) data[0] |= 2;
205 else if (speed > -1000 && speed < 0) data[0] |= (-1000 / speed);
206 else if (speed < 1000 && speed > 0) data[0] |= (1000 / speed);
208 /* If not decoding, just change speed setting */
209 if (atomic_read(&itv->decoding) > 0) {
210 int got_sig = 0;
212 /* Stop all DMA and decoding activity */
213 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
215 /* Wait for any DMA to finish */
216 prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE);
217 while (itv->i_flags & IVTV_F_I_DMA) {
218 got_sig = signal_pending(current);
219 if (got_sig)
220 break;
221 got_sig = 0;
222 schedule();
224 finish_wait(&itv->dma_waitq, &wait);
225 if (got_sig)
226 return -EINTR;
228 /* Change Speed safely */
229 ivtv_api(itv, CX2341X_DEC_SET_PLAYBACK_SPEED, 7, data);
230 IVTV_DEBUG_INFO("Setting Speed to 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
231 data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
233 if (single_step) {
234 speed = (speed < 0) ? -1 : 1;
235 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
237 itv->speed = speed;
238 return 0;
241 static int ivtv_validate_speed(int cur_speed, int new_speed)
243 int fact = new_speed < 0 ? -1 : 1;
244 int s;
246 if (new_speed < 0) new_speed = -new_speed;
247 if (cur_speed < 0) cur_speed = -cur_speed;
249 if (cur_speed <= new_speed) {
250 if (new_speed > 1500) return fact * 2000;
251 if (new_speed > 1000) return fact * 1500;
253 else {
254 if (new_speed >= 2000) return fact * 2000;
255 if (new_speed >= 1500) return fact * 1500;
256 if (new_speed >= 1000) return fact * 1000;
258 if (new_speed == 0) return 1000;
259 if (new_speed == 1 || new_speed == 1000) return fact * new_speed;
261 s = new_speed;
262 new_speed = 1000 / new_speed;
263 if (1000 / cur_speed == new_speed)
264 new_speed += (cur_speed < s) ? -1 : 1;
265 if (new_speed > 60) return 1000 / (fact * 60);
266 return 1000 / (fact * new_speed);
269 static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
270 struct video_command *vc, int try)
272 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
274 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
275 return -EINVAL;
277 switch (vc->cmd) {
278 case VIDEO_CMD_PLAY: {
279 vc->flags = 0;
280 vc->play.speed = ivtv_validate_speed(itv->speed, vc->play.speed);
281 if (vc->play.speed < 0)
282 vc->play.format = VIDEO_PLAY_FMT_GOP;
283 if (try) break;
285 if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
286 return -EBUSY;
287 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
288 /* forces ivtv_set_speed to be called */
289 itv->speed = 0;
291 return ivtv_start_decoding(id, vc->play.speed);
294 case VIDEO_CMD_STOP:
295 vc->flags &= VIDEO_CMD_STOP_IMMEDIATELY|VIDEO_CMD_STOP_TO_BLACK;
296 if (vc->flags & VIDEO_CMD_STOP_IMMEDIATELY)
297 vc->stop.pts = 0;
298 if (try) break;
299 if (atomic_read(&itv->decoding) == 0)
300 return 0;
301 if (itv->output_mode != OUT_MPG)
302 return -EBUSY;
304 itv->output_mode = OUT_NONE;
305 return ivtv_stop_v4l2_decode_stream(s, vc->flags, vc->stop.pts);
307 case VIDEO_CMD_FREEZE:
308 vc->flags &= VIDEO_CMD_FREEZE_TO_BLACK;
309 if (try) break;
310 if (itv->output_mode != OUT_MPG)
311 return -EBUSY;
312 if (atomic_read(&itv->decoding) > 0) {
313 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
314 (vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 0);
315 set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
317 break;
319 case VIDEO_CMD_CONTINUE:
320 vc->flags = 0;
321 if (try) break;
322 if (itv->output_mode != OUT_MPG)
323 return -EBUSY;
324 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
325 int speed = itv->speed;
326 itv->speed = 0;
327 return ivtv_start_decoding(id, speed);
329 break;
331 default:
332 return -EINVAL;
334 return 0;
337 static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
339 struct v4l2_register *regs = arg;
340 unsigned long flags;
341 volatile u8 __iomem *reg_start;
343 if (!capable(CAP_SYS_ADMIN))
344 return -EPERM;
345 if (regs->reg >= IVTV_REG_OFFSET && regs->reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
346 reg_start = itv->reg_mem - IVTV_REG_OFFSET;
347 else if (itv->has_cx23415 && regs->reg >= IVTV_DECODER_OFFSET &&
348 regs->reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
349 reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
350 else if (regs->reg >= 0 && regs->reg < IVTV_ENCODER_SIZE)
351 reg_start = itv->enc_mem;
352 else
353 return -EINVAL;
355 spin_lock_irqsave(&ivtv_cards_lock, flags);
356 if (cmd == VIDIOC_DBG_G_REGISTER) {
357 regs->val = readl(regs->reg + reg_start);
358 } else {
359 writel(regs->val, regs->reg + reg_start);
361 spin_unlock_irqrestore(&ivtv_cards_lock, flags);
362 return 0;
365 static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fmt)
367 switch (fmt->type) {
368 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
369 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
370 return -EINVAL;
371 fmt->fmt.pix.width = itv->main_rect.width;
372 fmt->fmt.pix.height = itv->main_rect.height;
373 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
374 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
375 if (itv->output_mode == OUT_UDMA_YUV) {
376 switch (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) {
377 case IVTV_YUV_MODE_INTERLACED:
378 fmt->fmt.pix.field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) ?
379 V4L2_FIELD_INTERLACED_BT : V4L2_FIELD_INTERLACED_TB;
380 break;
381 case IVTV_YUV_MODE_PROGRESSIVE:
382 fmt->fmt.pix.field = V4L2_FIELD_NONE;
383 break;
384 default:
385 fmt->fmt.pix.field = V4L2_FIELD_ANY;
386 break;
388 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_HM12;
389 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
390 fmt->fmt.pix.sizeimage =
391 fmt->fmt.pix.height * fmt->fmt.pix.width +
392 fmt->fmt.pix.height * (fmt->fmt.pix.width / 2);
394 else if (itv->output_mode == OUT_YUV ||
395 streamtype == IVTV_ENC_STREAM_TYPE_YUV ||
396 streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
397 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_HM12;
398 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
399 fmt->fmt.pix.sizeimage =
400 fmt->fmt.pix.height * fmt->fmt.pix.width +
401 fmt->fmt.pix.height * (fmt->fmt.pix.width / 2);
402 } else {
403 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
404 fmt->fmt.pix.sizeimage = 128 * 1024;
406 break;
408 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
409 fmt->fmt.pix.width = itv->params.width;
410 fmt->fmt.pix.height = itv->params.height;
411 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
412 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
413 if (streamtype == IVTV_ENC_STREAM_TYPE_YUV ||
414 streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
415 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_HM12;
416 /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
417 fmt->fmt.pix.sizeimage =
418 fmt->fmt.pix.height * fmt->fmt.pix.width +
419 fmt->fmt.pix.height * (fmt->fmt.pix.width / 2);
420 } else {
421 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
422 fmt->fmt.pix.sizeimage = 128 * 1024;
424 break;
426 case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
427 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
428 return -EINVAL;
429 fmt->fmt.win.chromakey = itv->osd_chroma_key;
430 fmt->fmt.win.global_alpha = itv->osd_global_alpha;
431 break;
433 case V4L2_BUF_TYPE_VBI_CAPTURE:
434 fmt->fmt.vbi.sampling_rate = 27000000;
435 fmt->fmt.vbi.offset = 248;
436 fmt->fmt.vbi.samples_per_line = itv->vbi.raw_decoder_line_size - 4;
437 fmt->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
438 fmt->fmt.vbi.start[0] = itv->vbi.start[0];
439 fmt->fmt.vbi.start[1] = itv->vbi.start[1];
440 fmt->fmt.vbi.count[0] = fmt->fmt.vbi.count[1] = itv->vbi.count;
441 break;
443 case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
445 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
447 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
448 return -EINVAL;
449 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
450 memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved));
451 memset(vbifmt->service_lines, 0, sizeof(vbifmt->service_lines));
452 if (itv->is_60hz) {
453 vbifmt->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
454 vbifmt->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
455 } else {
456 vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625;
457 vbifmt->service_lines[0][16] = V4L2_SLICED_VPS;
459 vbifmt->service_set = get_service_set(vbifmt);
460 break;
463 case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
465 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
467 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
468 memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved));
469 memset(vbifmt->service_lines, 0, sizeof(vbifmt->service_lines));
471 if (streamtype == IVTV_DEC_STREAM_TYPE_VBI) {
472 vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
473 V4L2_SLICED_VBI_525;
474 expand_service_set(vbifmt, itv->is_50hz);
475 break;
478 itv->video_dec_func(itv, VIDIOC_G_FMT, fmt);
479 vbifmt->service_set = get_service_set(vbifmt);
480 break;
482 case V4L2_BUF_TYPE_VBI_OUTPUT:
483 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
484 default:
485 return -EINVAL;
487 return 0;
490 static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype,
491 struct v4l2_format *fmt, int set_fmt)
493 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
494 u16 set;
496 if (fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
497 struct v4l2_rect r;
498 int field;
500 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
501 return -EINVAL;
502 field = fmt->fmt.pix.field;
503 r.top = 0;
504 r.left = 0;
505 r.width = fmt->fmt.pix.width;
506 r.height = fmt->fmt.pix.height;
507 ivtv_get_fmt(itv, streamtype, fmt);
508 if (itv->output_mode != OUT_UDMA_YUV) {
509 /* TODO: would setting the rect also be valid for this mode? */
510 fmt->fmt.pix.width = r.width;
511 fmt->fmt.pix.height = r.height;
513 if (itv->output_mode == OUT_UDMA_YUV) {
514 /* TODO: add checks for validity */
515 fmt->fmt.pix.field = field;
517 if (set_fmt) {
518 if (itv->output_mode == OUT_UDMA_YUV) {
519 switch (field) {
520 case V4L2_FIELD_NONE:
521 itv->yuv_info.lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
522 break;
523 case V4L2_FIELD_ANY:
524 itv->yuv_info.lace_mode = IVTV_YUV_MODE_AUTO;
525 break;
526 case V4L2_FIELD_INTERLACED_BT:
527 itv->yuv_info.lace_mode =
528 IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
529 break;
530 case V4L2_FIELD_INTERLACED_TB:
531 default:
532 itv->yuv_info.lace_mode = IVTV_YUV_MODE_INTERLACED;
533 break;
535 itv->yuv_info.lace_sync_field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
537 /* Force update of yuv registers */
538 itv->yuv_info.yuv_forced_update = 1;
539 return 0;
542 return 0;
545 if (fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY) {
546 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
547 return -EINVAL;
548 if (set_fmt) {
549 itv->osd_chroma_key = fmt->fmt.win.chromakey;
550 itv->osd_global_alpha = fmt->fmt.win.global_alpha;
551 ivtv_set_osd_alpha(itv);
553 return 0;
556 /* set window size */
557 if (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
558 struct cx2341x_mpeg_params *p = &itv->params;
559 int w = fmt->fmt.pix.width;
560 int h = fmt->fmt.pix.height;
562 if (w > 720) w = 720;
563 else if (w < 1) w = 1;
564 if (h > (itv->is_50hz ? 576 : 480)) h = (itv->is_50hz ? 576 : 480);
565 else if (h < 2) h = 2;
566 ivtv_get_fmt(itv, streamtype, fmt);
567 fmt->fmt.pix.width = w;
568 fmt->fmt.pix.height = h;
570 if (!set_fmt || (p->width == w && p->height == h))
571 return 0;
572 if (atomic_read(&itv->capturing) > 0)
573 return -EBUSY;
575 p->width = w;
576 p->height = h;
577 if (w != 720 || h != (itv->is_50hz ? 576 : 480))
578 p->video_temporal_filter = 0;
579 else
580 p->video_temporal_filter = 8;
581 if (p->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
582 fmt->fmt.pix.width /= 2;
583 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
584 return ivtv_get_fmt(itv, streamtype, fmt);
587 /* set raw VBI format */
588 if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
589 if (set_fmt && atomic_read(&itv->capturing) > 0) {
590 return -EBUSY;
592 if (set_fmt) {
593 itv->vbi.sliced_in->service_set = 0;
594 itv->video_dec_func(itv, VIDIOC_S_FMT, &itv->vbi.in);
596 return ivtv_get_fmt(itv, streamtype, fmt);
599 /* set sliced VBI output
600 In principle the user could request that only certain
601 VBI types are output and that the others are ignored.
602 I.e., suppress CC in the even fields or only output
603 WSS and no VPS. Currently though there is no choice. */
604 if (fmt->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
605 return ivtv_get_fmt(itv, streamtype, fmt);
607 /* any else but sliced VBI capture is an error */
608 if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
609 return -EINVAL;
611 if (streamtype == IVTV_DEC_STREAM_TYPE_VBI)
612 return ivtv_get_fmt(itv, streamtype, fmt);
614 /* set sliced VBI capture format */
615 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
616 memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved));
618 if (vbifmt->service_set)
619 expand_service_set(vbifmt, itv->is_50hz);
620 set = check_service_set(vbifmt, itv->is_50hz);
621 vbifmt->service_set = get_service_set(vbifmt);
623 if (!set_fmt)
624 return 0;
625 if (set == 0)
626 return -EINVAL;
627 if (atomic_read(&itv->capturing) > 0) {
628 return -EBUSY;
630 itv->video_dec_func(itv, VIDIOC_S_FMT, fmt);
631 memcpy(itv->vbi.sliced_in, vbifmt, sizeof(*itv->vbi.sliced_in));
632 return 0;
635 static int ivtv_debug_ioctls(struct file *filp, unsigned int cmd, void *arg)
637 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
638 struct ivtv *itv = id->itv;
639 struct v4l2_register *reg = arg;
641 switch (cmd) {
642 /* ioctls to allow direct access to the encoder registers for testing */
643 case VIDIOC_DBG_G_REGISTER:
644 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
645 return ivtv_itvc(itv, cmd, arg);
646 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
647 return ivtv_i2c_id(itv, reg->match_chip, cmd, arg);
648 return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
650 case VIDIOC_DBG_S_REGISTER:
651 if (v4l2_chip_match_host(reg->match_type, reg->match_chip))
652 return ivtv_itvc(itv, cmd, arg);
653 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
654 return ivtv_i2c_id(itv, reg->match_chip, cmd, arg);
655 return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
657 case VIDIOC_G_CHIP_IDENT: {
658 struct v4l2_chip_ident *chip = arg;
660 chip->ident = V4L2_IDENT_NONE;
661 chip->revision = 0;
662 if (reg->match_type == V4L2_CHIP_MATCH_HOST) {
663 if (v4l2_chip_match_host(reg->match_type, reg->match_chip)) {
664 struct v4l2_chip_ident *chip = arg;
666 chip->ident = itv->has_cx23415 ? V4L2_IDENT_CX23415 : V4L2_IDENT_CX23416;
668 return 0;
670 if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER)
671 return ivtv_i2c_id(itv, reg->match_chip, cmd, arg);
672 if (reg->match_type == V4L2_CHIP_MATCH_I2C_ADDR)
673 return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg);
674 return -EINVAL;
677 case VIDIOC_INT_S_AUDIO_ROUTING: {
678 struct v4l2_routing *route = arg;
680 ivtv_i2c_hw(itv, itv->card->hw_audio, VIDIOC_INT_S_AUDIO_ROUTING, route);
681 break;
684 case VIDIOC_INT_RESET: {
685 u32 val = *(u32 *)arg;
687 if ((val == 0 && itv->options.newi2c) || (val & 0x01)) {
688 ivtv_reset_ir_gpio(itv);
690 if (val & 0x02) {
691 itv->video_dec_func(itv, cmd, 0);
693 break;
696 default:
697 return -EINVAL;
699 return 0;
702 int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void *arg)
704 struct ivtv_open_id *id = NULL;
705 u32 data[CX2341X_MBOX_MAX_DATA];
707 if (filp) id = (struct ivtv_open_id *)filp->private_data;
709 switch (cmd) {
710 case VIDIOC_G_PRIORITY:
712 enum v4l2_priority *p = arg;
714 *p = v4l2_prio_max(&itv->prio);
715 break;
718 case VIDIOC_S_PRIORITY:
720 enum v4l2_priority *prio = arg;
722 return v4l2_prio_change(&itv->prio, &id->prio, *prio);
725 case VIDIOC_QUERYCAP:{
726 struct v4l2_capability *vcap = arg;
728 memset(vcap, 0, sizeof(*vcap));
729 strcpy(vcap->driver, IVTV_DRIVER_NAME); /* driver name */
730 strcpy(vcap->card, itv->card_name); /* card type */
731 strcpy(vcap->bus_info, pci_name(itv->dev)); /* bus info... */
732 vcap->version = IVTV_DRIVER_VERSION; /* version */
733 vcap->capabilities = itv->v4l2_cap; /* capabilities */
735 /* reserved.. must set to 0! */
736 vcap->reserved[0] = vcap->reserved[1] =
737 vcap->reserved[2] = vcap->reserved[3] = 0;
738 break;
741 case VIDIOC_ENUMAUDIO:{
742 struct v4l2_audio *vin = arg;
744 return ivtv_get_audio_input(itv, vin->index, vin);
747 case VIDIOC_G_AUDIO:{
748 struct v4l2_audio *vin = arg;
750 vin->index = itv->audio_input;
751 return ivtv_get_audio_input(itv, vin->index, vin);
754 case VIDIOC_S_AUDIO:{
755 struct v4l2_audio *vout = arg;
757 if (vout->index >= itv->nof_audio_inputs)
758 return -EINVAL;
759 itv->audio_input = vout->index;
760 ivtv_audio_set_io(itv);
761 break;
764 case VIDIOC_ENUMAUDOUT:{
765 struct v4l2_audioout *vin = arg;
767 /* set it to defaults from our table */
768 return ivtv_get_audio_output(itv, vin->index, vin);
771 case VIDIOC_G_AUDOUT:{
772 struct v4l2_audioout *vin = arg;
774 vin->index = 0;
775 return ivtv_get_audio_output(itv, vin->index, vin);
778 case VIDIOC_S_AUDOUT:{
779 struct v4l2_audioout *vout = arg;
781 return ivtv_get_audio_output(itv, vout->index, vout);
784 case VIDIOC_ENUMINPUT:{
785 struct v4l2_input *vin = arg;
787 /* set it to defaults from our table */
788 return ivtv_get_input(itv, vin->index, vin);
791 case VIDIOC_ENUMOUTPUT:{
792 struct v4l2_output *vout = arg;
794 return ivtv_get_output(itv, vout->index, vout);
797 case VIDIOC_TRY_FMT:
798 case VIDIOC_S_FMT: {
799 struct v4l2_format *fmt = arg;
801 return ivtv_try_or_set_fmt(itv, id->type, fmt, cmd == VIDIOC_S_FMT);
804 case VIDIOC_G_FMT: {
805 struct v4l2_format *fmt = arg;
806 int type = fmt->type;
808 memset(fmt, 0, sizeof(*fmt));
809 fmt->type = type;
810 return ivtv_get_fmt(itv, id->type, fmt);
813 case VIDIOC_CROPCAP: {
814 struct v4l2_cropcap *cropcap = arg;
816 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
817 cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
818 return -EINVAL;
819 cropcap->bounds.top = cropcap->bounds.left = 0;
820 cropcap->bounds.width = 720;
821 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
822 cropcap->bounds.height = itv->is_50hz ? 576 : 480;
823 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
824 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
825 } else {
826 cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
827 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
828 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
830 cropcap->defrect = cropcap->bounds;
831 return 0;
834 case VIDIOC_S_CROP: {
835 struct v4l2_crop *crop = arg;
837 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
838 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
839 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
840 crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
841 itv->main_rect = crop->c;
842 return 0;
844 return -EINVAL;
846 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
847 return -EINVAL;
848 return itv->video_dec_func(itv, VIDIOC_S_CROP, arg);
851 case VIDIOC_G_CROP: {
852 struct v4l2_crop *crop = arg;
854 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
855 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
856 crop->c = itv->main_rect;
857 return 0;
859 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
860 return -EINVAL;
861 return itv->video_dec_func(itv, VIDIOC_G_CROP, arg);
864 case VIDIOC_ENUM_FMT: {
865 static struct v4l2_fmtdesc formats[] = {
866 { 0, 0, 0,
867 "HM12 (YUV 4:1:1)", V4L2_PIX_FMT_HM12,
868 { 0, 0, 0, 0 }
870 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
871 "MPEG", V4L2_PIX_FMT_MPEG,
872 { 0, 0, 0, 0 }
875 struct v4l2_fmtdesc *fmt = arg;
876 enum v4l2_buf_type type = fmt->type;
878 switch (type) {
879 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
880 break;
881 case V4L2_BUF_TYPE_VIDEO_OUTPUT:
882 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
883 return -EINVAL;
884 break;
885 default:
886 return -EINVAL;
888 if (fmt->index > 1)
889 return -EINVAL;
890 *fmt = formats[fmt->index];
891 fmt->type = type;
892 return 0;
895 case VIDIOC_G_INPUT:{
896 *(int *)arg = itv->active_input;
897 break;
900 case VIDIOC_S_INPUT:{
901 int inp = *(int *)arg;
903 if (inp < 0 || inp >= itv->nof_inputs)
904 return -EINVAL;
906 if (inp == itv->active_input) {
907 IVTV_DEBUG_INFO("Input unchanged\n");
908 break;
910 if (atomic_read(&itv->capturing) > 0) {
911 return -EBUSY;
913 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
914 itv->active_input, inp);
916 itv->active_input = inp;
917 /* Set the audio input to whatever is appropriate for the
918 input type. */
919 itv->audio_input = itv->card->video_inputs[inp].audio_index;
921 /* prevent others from messing with the streams until
922 we're finished changing inputs. */
923 ivtv_mute(itv);
924 ivtv_video_set_io(itv);
925 ivtv_audio_set_io(itv);
926 ivtv_unmute(itv);
927 break;
930 case VIDIOC_G_OUTPUT:{
931 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
932 return -EINVAL;
933 *(int *)arg = itv->active_output;
934 break;
937 case VIDIOC_S_OUTPUT:{
938 int outp = *(int *)arg;
939 struct v4l2_routing route;
941 if (outp >= itv->card->nof_outputs)
942 return -EINVAL;
944 if (outp == itv->active_output) {
945 IVTV_DEBUG_INFO("Output unchanged\n");
946 break;
948 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
949 itv->active_output, outp);
951 itv->active_output = outp;
952 route.input = SAA7127_INPUT_TYPE_NORMAL;
953 route.output = itv->card->video_outputs[outp].video_output;
954 ivtv_saa7127(itv, VIDIOC_INT_S_VIDEO_ROUTING, &route);
955 break;
958 case VIDIOC_G_FREQUENCY:{
959 struct v4l2_frequency *vf = arg;
961 if (vf->tuner != 0)
962 return -EINVAL;
963 ivtv_call_i2c_clients(itv, cmd, arg);
964 break;
967 case VIDIOC_S_FREQUENCY:{
968 struct v4l2_frequency vf = *(struct v4l2_frequency *)arg;
970 if (vf.tuner != 0)
971 return -EINVAL;
973 ivtv_mute(itv);
974 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf.frequency);
975 ivtv_call_i2c_clients(itv, cmd, &vf);
976 ivtv_unmute(itv);
977 break;
980 case VIDIOC_ENUMSTD:{
981 struct v4l2_standard *vs = arg;
982 int idx = vs->index;
984 if (idx < 0 || idx >= ARRAY_SIZE(enum_stds))
985 return -EINVAL;
987 *vs = (enum_stds[idx].std & V4L2_STD_525_60) ?
988 ivtv_std_60hz : ivtv_std_50hz;
989 vs->index = idx;
990 vs->id = enum_stds[idx].std;
991 strcpy(vs->name, enum_stds[idx].name);
992 break;
995 case VIDIOC_G_STD:{
996 *(v4l2_std_id *) arg = itv->std;
997 break;
1000 case VIDIOC_S_STD: {
1001 v4l2_std_id std = *(v4l2_std_id *) arg;
1003 if ((std & V4L2_STD_ALL) == 0)
1004 return -EINVAL;
1006 if (std == itv->std)
1007 break;
1009 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1010 atomic_read(&itv->capturing) > 0 ||
1011 atomic_read(&itv->decoding) > 0) {
1012 /* Switching standard would turn off the radio or mess
1013 with already running streams, prevent that by
1014 returning EBUSY. */
1015 return -EBUSY;
1018 itv->std = std;
1019 itv->is_60hz = (std & V4L2_STD_525_60) ? 1 : 0;
1020 itv->params.is_50hz = itv->is_50hz = !itv->is_60hz;
1021 itv->params.width = 720;
1022 itv->params.height = itv->is_50hz ? 576 : 480;
1023 itv->vbi.count = itv->is_50hz ? 18 : 12;
1024 itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1025 itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1026 if (itv->hw_flags & IVTV_HW_CX25840) {
1027 itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1029 IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std);
1031 /* Tuner */
1032 ivtv_call_i2c_clients(itv, VIDIOC_S_STD, &itv->std);
1034 if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
1035 /* set display standard */
1036 itv->std_out = std;
1037 itv->is_out_60hz = itv->is_60hz;
1038 itv->is_out_50hz = itv->is_50hz;
1039 ivtv_call_i2c_clients(itv, VIDIOC_INT_S_STD_OUTPUT, &itv->std_out);
1040 ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1041 itv->main_rect.left = itv->main_rect.top = 0;
1042 itv->main_rect.width = 720;
1043 itv->main_rect.height = itv->params.height;
1044 ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1045 720, itv->main_rect.height, 0, 0);
1047 break;
1050 case VIDIOC_S_TUNER: { /* Setting tuner can only set audio mode */
1051 struct v4l2_tuner *vt = arg;
1053 if (vt->index != 0)
1054 return -EINVAL;
1056 ivtv_call_i2c_clients(itv, VIDIOC_S_TUNER, vt);
1057 break;
1060 case VIDIOC_G_TUNER: {
1061 struct v4l2_tuner *vt = arg;
1063 if (vt->index != 0)
1064 return -EINVAL;
1066 memset(vt, 0, sizeof(*vt));
1067 ivtv_call_i2c_clients(itv, VIDIOC_G_TUNER, vt);
1069 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) {
1070 strcpy(vt->name, "ivtv Radio Tuner");
1071 vt->type = V4L2_TUNER_RADIO;
1072 } else {
1073 strcpy(vt->name, "ivtv TV Tuner");
1074 vt->type = V4L2_TUNER_ANALOG_TV;
1076 break;
1079 case VIDIOC_G_SLICED_VBI_CAP: {
1080 struct v4l2_sliced_vbi_cap *cap = arg;
1081 int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1082 int f, l;
1083 enum v4l2_buf_type type = cap->type;
1085 memset(cap, 0, sizeof(*cap));
1086 cap->type = type;
1087 if (type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1088 for (f = 0; f < 2; f++) {
1089 for (l = 0; l < 24; l++) {
1090 if (valid_service_line(f, l, itv->is_50hz)) {
1091 cap->service_lines[f][l] = set;
1095 return 0;
1097 if (type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1098 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1099 return -EINVAL;
1100 if (itv->is_60hz) {
1101 cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1102 cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1103 } else {
1104 cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1105 cap->service_lines[0][16] = V4L2_SLICED_VPS;
1107 return 0;
1109 return -EINVAL;
1112 case VIDIOC_G_ENC_INDEX: {
1113 struct v4l2_enc_idx *idx = arg;
1114 struct v4l2_enc_idx_entry *e = idx->entry;
1115 int entries;
1116 int i;
1118 entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1119 IVTV_MAX_PGM_INDEX;
1120 if (entries > V4L2_ENC_IDX_ENTRIES)
1121 entries = V4L2_ENC_IDX_ENTRIES;
1122 idx->entries = 0;
1123 for (i = 0; i < entries; i++) {
1124 *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1125 if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1126 idx->entries++;
1127 e++;
1130 itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1131 break;
1134 case VIDIOC_ENCODER_CMD:
1135 case VIDIOC_TRY_ENCODER_CMD: {
1136 struct v4l2_encoder_cmd *enc = arg;
1137 int try = cmd == VIDIOC_TRY_ENCODER_CMD;
1139 memset(&enc->raw, 0, sizeof(enc->raw));
1140 switch (enc->cmd) {
1141 case V4L2_ENC_CMD_START:
1142 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1143 enc->flags = 0;
1144 if (try)
1145 return 0;
1146 return ivtv_start_capture(id);
1148 case V4L2_ENC_CMD_STOP:
1149 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1150 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1151 if (try)
1152 return 0;
1153 ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1154 return 0;
1156 case V4L2_ENC_CMD_PAUSE:
1157 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1158 enc->flags = 0;
1159 if (try)
1160 return 0;
1161 if (!atomic_read(&itv->capturing))
1162 return -EPERM;
1163 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1164 return 0;
1165 ivtv_mute(itv);
1166 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1167 break;
1169 case V4L2_ENC_CMD_RESUME:
1170 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1171 enc->flags = 0;
1172 if (try)
1173 return 0;
1174 if (!atomic_read(&itv->capturing))
1175 return -EPERM;
1176 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1177 return 0;
1178 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1179 ivtv_unmute(itv);
1180 break;
1181 default:
1182 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1183 return -EINVAL;
1185 break;
1188 case VIDIOC_G_FBUF: {
1189 struct v4l2_framebuffer *fb = arg;
1190 int pixfmt;
1191 static u32 pixel_format[16] = {
1192 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1193 V4L2_PIX_FMT_RGB565,
1194 V4L2_PIX_FMT_RGB555,
1195 V4L2_PIX_FMT_RGB444,
1196 V4L2_PIX_FMT_RGB32,
1200 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1201 V4L2_PIX_FMT_YUV565,
1202 V4L2_PIX_FMT_YUV555,
1203 V4L2_PIX_FMT_YUV444,
1204 V4L2_PIX_FMT_YUV32,
1210 memset(fb, 0, sizeof(*fb));
1211 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1212 return -EINVAL;
1213 fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1214 V4L2_FBUF_CAP_GLOBAL_ALPHA;
1215 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1216 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1217 pixfmt = (data[0] >> 3) & 0xf;
1218 fb->fmt.pixelformat = pixel_format[pixfmt];
1219 fb->fmt.width = itv->osd_rect.width;
1220 fb->fmt.height = itv->osd_rect.height;
1221 fb->base = (void *)itv->osd_video_pbase;
1222 if (itv->osd_chroma_key_state)
1223 fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1224 if (itv->osd_global_alpha_state)
1225 fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1226 pixfmt &= 7;
1227 /* no local alpha for RGB565 or unknown formats */
1228 if (pixfmt == 1 || pixfmt > 4)
1229 break;
1230 /* 16-bit formats have inverted local alpha */
1231 if (pixfmt == 2 || pixfmt == 3)
1232 fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1233 else
1234 fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1235 if (itv->osd_local_alpha_state) {
1236 /* 16-bit formats have inverted local alpha */
1237 if (pixfmt == 2 || pixfmt == 3)
1238 fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1239 else
1240 fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1242 break;
1245 case VIDIOC_S_FBUF: {
1246 struct v4l2_framebuffer *fb = arg;
1248 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1249 return -EINVAL;
1250 itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1251 itv->osd_local_alpha_state =
1252 (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1253 itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1254 ivtv_set_osd_alpha(itv);
1255 break;
1258 case VIDIOC_OVERLAY: {
1259 int *on = arg;
1261 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1262 return -EINVAL;
1263 ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, *on != 0);
1264 break;
1267 case VIDIOC_LOG_STATUS:
1269 int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1270 struct v4l2_input vidin;
1271 struct v4l2_audio audin;
1272 int i;
1274 IVTV_INFO("================= START STATUS CARD #%d =================\n", itv->num);
1275 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1276 if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1277 struct tveeprom tv;
1279 ivtv_read_eeprom(itv, &tv);
1281 ivtv_call_i2c_clients(itv, VIDIOC_LOG_STATUS, NULL);
1282 ivtv_get_input(itv, itv->active_input, &vidin);
1283 ivtv_get_audio_input(itv, itv->audio_input, &audin);
1284 IVTV_INFO("Video Input: %s\n", vidin.name);
1285 IVTV_INFO("Audio Input: %s%s\n", audin.name,
1286 (itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1287 if (has_output) {
1288 struct v4l2_output vidout;
1289 struct v4l2_audioout audout;
1290 int mode = itv->output_mode;
1291 static const char * const output_modes[5] = {
1292 "None",
1293 "MPEG Streaming",
1294 "YUV Streaming",
1295 "YUV Frames",
1296 "Passthrough",
1298 static const char * const audio_modes[5] = {
1299 "Stereo",
1300 "Left",
1301 "Right",
1302 "Mono",
1303 "Swapped"
1305 static const char * const alpha_mode[4] = {
1306 "None",
1307 "Global",
1308 "Local",
1309 "Global and Local"
1311 static const char * const pixel_format[16] = {
1312 "ARGB Indexed",
1313 "RGB 5:6:5",
1314 "ARGB 1:5:5:5",
1315 "ARGB 1:4:4:4",
1316 "ARGB 8:8:8:8",
1317 "5",
1318 "6",
1319 "7",
1320 "AYUV Indexed",
1321 "YUV 5:6:5",
1322 "AYUV 1:5:5:5",
1323 "AYUV 1:4:4:4",
1324 "AYUV 8:8:8:8",
1325 "13",
1326 "14",
1327 "15",
1330 ivtv_get_output(itv, itv->active_output, &vidout);
1331 ivtv_get_audio_output(itv, 0, &audout);
1332 IVTV_INFO("Video Output: %s\n", vidout.name);
1333 IVTV_INFO("Audio Output: %s (Stereo/Bilingual: %s/%s)\n", audout.name,
1334 audio_modes[itv->audio_stereo_mode],
1335 audio_modes[itv->audio_bilingual_mode]);
1336 if (mode < 0 || mode > OUT_PASSTHROUGH)
1337 mode = OUT_NONE;
1338 IVTV_INFO("Output Mode: %s\n", output_modes[mode]);
1339 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1340 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1341 IVTV_INFO("Overlay: %s, Alpha: %s, Pixel Format: %s\n",
1342 data[0] & 1 ? "On" : "Off",
1343 alpha_mode[(data[0] >> 1) & 0x3],
1344 pixel_format[(data[0] >> 3) & 0xf]);
1346 IVTV_INFO("Tuner: %s\n",
1347 test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1348 cx2341x_log_status(&itv->params, itv->name);
1349 IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
1350 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1351 struct ivtv_stream *s = &itv->streams[i];
1353 if (s->v4l2dev == NULL || s->buffers == 0)
1354 continue;
1355 IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1356 (s->buffers - s->q_free.buffers) * 100 / s->buffers,
1357 (s->buffers * s->buf_size) / 1024, s->buffers);
1359 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n", (long long)itv->mpg_data_received, (long long)itv->vbi_data_inserted);
1360 IVTV_INFO("================== END STATUS CARD #%d ==================\n", itv->num);
1361 break;
1364 default:
1365 return -EINVAL;
1367 return 0;
1370 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1372 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1373 struct ivtv *itv = id->itv;
1374 int nonblocking = filp->f_flags & O_NONBLOCK;
1375 struct ivtv_stream *s = &itv->streams[id->type];
1377 switch (cmd) {
1378 case IVTV_IOC_DMA_FRAME: {
1379 struct ivtv_dma_frame *args = arg;
1381 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1382 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1383 return -EINVAL;
1384 if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1385 return -EINVAL;
1386 if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1387 return 0;
1388 if (ivtv_claim_stream(id, id->type)) {
1389 return -EBUSY;
1391 if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1392 ivtv_release_stream(s);
1393 return -EBUSY;
1395 /* Mark that this file handle started the UDMA_YUV mode */
1396 id->yuv_frames = 1;
1397 if (args->y_source == NULL)
1398 return 0;
1399 return ivtv_yuv_prep_frame(itv, args);
1402 case VIDEO_GET_PTS: {
1403 u32 data[CX2341X_MBOX_MAX_DATA];
1404 u64 *pts = arg;
1406 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1407 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1408 *pts = s->dma_pts;
1409 break;
1411 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1412 return -EINVAL;
1414 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1415 *pts = (u64) ((u64)itv->last_dec_timing[2] << 32) |
1416 (u64)itv->last_dec_timing[1];
1417 break;
1419 *pts = 0;
1420 if (atomic_read(&itv->decoding)) {
1421 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1422 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1423 return -EIO;
1425 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1426 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1427 *pts = (u64) ((u64) data[2] << 32) | (u64) data[1];
1428 /*timing->scr = (u64) (((u64) data[4] << 32) | (u64) (data[3]));*/
1430 break;
1433 case VIDEO_GET_FRAME_COUNT: {
1434 u32 data[CX2341X_MBOX_MAX_DATA];
1435 u64 *frame = arg;
1437 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1438 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1439 *frame = 0;
1440 break;
1442 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1443 return -EINVAL;
1445 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1446 *frame = itv->last_dec_timing[0];
1447 break;
1449 *frame = 0;
1450 if (atomic_read(&itv->decoding)) {
1451 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1452 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1453 return -EIO;
1455 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1456 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1457 *frame = data[0];
1459 break;
1462 case VIDEO_PLAY: {
1463 struct video_command vc;
1465 IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1466 memset(&vc, 0, sizeof(vc));
1467 vc.cmd = VIDEO_CMD_PLAY;
1468 return ivtv_video_command(itv, id, &vc, 0);
1471 case VIDEO_STOP: {
1472 struct video_command vc;
1474 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1475 memset(&vc, 0, sizeof(vc));
1476 vc.cmd = VIDEO_CMD_STOP;
1477 vc.flags = VIDEO_CMD_STOP_TO_BLACK | VIDEO_CMD_STOP_IMMEDIATELY;
1478 return ivtv_video_command(itv, id, &vc, 0);
1481 case VIDEO_FREEZE: {
1482 struct video_command vc;
1484 IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1485 memset(&vc, 0, sizeof(vc));
1486 vc.cmd = VIDEO_CMD_FREEZE;
1487 return ivtv_video_command(itv, id, &vc, 0);
1490 case VIDEO_CONTINUE: {
1491 struct video_command vc;
1493 IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1494 memset(&vc, 0, sizeof(vc));
1495 vc.cmd = VIDEO_CMD_CONTINUE;
1496 return ivtv_video_command(itv, id, &vc, 0);
1499 case VIDEO_COMMAND:
1500 case VIDEO_TRY_COMMAND: {
1501 struct video_command *vc = arg;
1502 int try = (cmd == VIDEO_TRY_COMMAND);
1504 if (try)
1505 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", vc->cmd);
1506 else
1507 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", vc->cmd);
1508 return ivtv_video_command(itv, id, vc, try);
1511 case VIDEO_GET_EVENT: {
1512 struct video_event *ev = arg;
1513 DEFINE_WAIT(wait);
1515 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1516 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1517 return -EINVAL;
1518 memset(ev, 0, sizeof(*ev));
1519 set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1521 while (1) {
1522 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1523 ev->type = VIDEO_EVENT_DECODER_STOPPED;
1524 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1525 ev->type = VIDEO_EVENT_VSYNC;
1526 ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1527 VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1528 if (itv->output_mode == OUT_UDMA_YUV &&
1529 (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1530 IVTV_YUV_MODE_PROGRESSIVE) {
1531 ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1534 if (ev->type)
1535 return 0;
1536 if (nonblocking)
1537 return -EAGAIN;
1538 /* Wait for event. Note that serialize_lock is locked,
1539 so to allow other processes to access the driver while
1540 we are waiting unlock first and later lock again. */
1541 mutex_unlock(&itv->serialize_lock);
1542 prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1543 if ((itv->i_flags & (IVTV_F_I_EV_DEC_STOPPED|IVTV_F_I_EV_VSYNC)) == 0)
1544 schedule();
1545 finish_wait(&itv->event_waitq, &wait);
1546 mutex_lock(&itv->serialize_lock);
1547 if (signal_pending(current)) {
1548 /* return if a signal was received */
1549 IVTV_DEBUG_INFO("User stopped wait for event\n");
1550 return -EINTR;
1553 break;
1556 default:
1557 return -EINVAL;
1559 return 0;
1562 static int ivtv_v4l2_do_ioctl(struct inode *inode, struct file *filp,
1563 unsigned int cmd, void *arg)
1565 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1566 struct ivtv *itv = id->itv;
1567 int ret;
1569 /* check priority */
1570 switch (cmd) {
1571 case VIDIOC_S_CTRL:
1572 case VIDIOC_S_STD:
1573 case VIDIOC_S_INPUT:
1574 case VIDIOC_S_OUTPUT:
1575 case VIDIOC_S_TUNER:
1576 case VIDIOC_S_FREQUENCY:
1577 case VIDIOC_S_FMT:
1578 case VIDIOC_S_CROP:
1579 case VIDIOC_S_AUDIO:
1580 case VIDIOC_S_AUDOUT:
1581 case VIDIOC_S_EXT_CTRLS:
1582 case VIDIOC_S_FBUF:
1583 case VIDIOC_OVERLAY:
1584 ret = v4l2_prio_check(&itv->prio, &id->prio);
1585 if (ret)
1586 return ret;
1589 switch (cmd) {
1590 case VIDIOC_DBG_G_REGISTER:
1591 case VIDIOC_DBG_S_REGISTER:
1592 case VIDIOC_G_CHIP_IDENT:
1593 case VIDIOC_INT_S_AUDIO_ROUTING:
1594 case VIDIOC_INT_RESET:
1595 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
1596 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
1597 v4l_printk_ioctl(cmd);
1599 return ivtv_debug_ioctls(filp, cmd, arg);
1601 case VIDIOC_G_PRIORITY:
1602 case VIDIOC_S_PRIORITY:
1603 case VIDIOC_QUERYCAP:
1604 case VIDIOC_ENUMINPUT:
1605 case VIDIOC_G_INPUT:
1606 case VIDIOC_S_INPUT:
1607 case VIDIOC_ENUMOUTPUT:
1608 case VIDIOC_G_OUTPUT:
1609 case VIDIOC_S_OUTPUT:
1610 case VIDIOC_G_FMT:
1611 case VIDIOC_S_FMT:
1612 case VIDIOC_TRY_FMT:
1613 case VIDIOC_ENUM_FMT:
1614 case VIDIOC_CROPCAP:
1615 case VIDIOC_G_CROP:
1616 case VIDIOC_S_CROP:
1617 case VIDIOC_G_FREQUENCY:
1618 case VIDIOC_S_FREQUENCY:
1619 case VIDIOC_ENUMSTD:
1620 case VIDIOC_G_STD:
1621 case VIDIOC_S_STD:
1622 case VIDIOC_S_TUNER:
1623 case VIDIOC_G_TUNER:
1624 case VIDIOC_ENUMAUDIO:
1625 case VIDIOC_S_AUDIO:
1626 case VIDIOC_G_AUDIO:
1627 case VIDIOC_ENUMAUDOUT:
1628 case VIDIOC_S_AUDOUT:
1629 case VIDIOC_G_AUDOUT:
1630 case VIDIOC_G_SLICED_VBI_CAP:
1631 case VIDIOC_LOG_STATUS:
1632 case VIDIOC_G_ENC_INDEX:
1633 case VIDIOC_ENCODER_CMD:
1634 case VIDIOC_TRY_ENCODER_CMD:
1635 case VIDIOC_G_FBUF:
1636 case VIDIOC_S_FBUF:
1637 case VIDIOC_OVERLAY:
1638 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
1639 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
1640 v4l_printk_ioctl(cmd);
1642 return ivtv_v4l2_ioctls(itv, filp, cmd, arg);
1644 case VIDIOC_QUERYMENU:
1645 case VIDIOC_QUERYCTRL:
1646 case VIDIOC_S_CTRL:
1647 case VIDIOC_G_CTRL:
1648 case VIDIOC_S_EXT_CTRLS:
1649 case VIDIOC_G_EXT_CTRLS:
1650 case VIDIOC_TRY_EXT_CTRLS:
1651 if (ivtv_debug & IVTV_DBGFLG_IOCTL) {
1652 printk(KERN_INFO "ivtv%d ioctl: ", itv->num);
1653 v4l_printk_ioctl(cmd);
1655 return ivtv_control_ioctls(itv, cmd, arg);
1657 case IVTV_IOC_DMA_FRAME:
1658 case VIDEO_GET_PTS:
1659 case VIDEO_GET_FRAME_COUNT:
1660 case VIDEO_GET_EVENT:
1661 case VIDEO_PLAY:
1662 case VIDEO_STOP:
1663 case VIDEO_FREEZE:
1664 case VIDEO_CONTINUE:
1665 case VIDEO_COMMAND:
1666 case VIDEO_TRY_COMMAND:
1667 return ivtv_decoder_ioctls(filp, cmd, arg);
1669 case 0x00005401: /* Handle isatty() calls */
1670 return -EINVAL;
1671 default:
1672 return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
1673 ivtv_v4l2_do_ioctl);
1675 return 0;
1678 static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct file *filp,
1679 unsigned int cmd, unsigned long arg)
1681 /* Filter dvb ioctls that cannot be handled by video_usercopy */
1682 switch (cmd) {
1683 case VIDEO_SELECT_SOURCE:
1684 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1685 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1686 return -EINVAL;
1687 return ivtv_passthrough_mode(itv, arg == VIDEO_SOURCE_DEMUX);
1689 case AUDIO_SET_MUTE:
1690 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1691 itv->speed_mute_audio = arg;
1692 return 0;
1694 case AUDIO_CHANNEL_SELECT:
1695 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1696 if (arg > AUDIO_STEREO_SWAPPED)
1697 return -EINVAL;
1698 itv->audio_stereo_mode = arg;
1699 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1700 return 0;
1702 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1703 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1704 if (arg > AUDIO_STEREO_SWAPPED)
1705 return -EINVAL;
1706 itv->audio_bilingual_mode = arg;
1707 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1708 return 0;
1710 default:
1711 break;
1713 return video_usercopy(inode, filp, cmd, arg, ivtv_v4l2_do_ioctl);
1716 int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
1717 unsigned long arg)
1719 struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
1720 struct ivtv *itv = id->itv;
1721 int res;
1723 mutex_lock(&itv->serialize_lock);
1724 res = ivtv_serialized_ioctl(itv, inode, filp, cmd, arg);
1725 mutex_unlock(&itv->serialize_lock);
1726 return res;