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>
5
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.
10
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.
15
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
19 */
20
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 <media/v4l2-event.h>
39 #include <linux/dvb/audio.h>
40
ivtv_service2vbi(int type)41 u16 ivtv_service2vbi(int type)
42 {
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;
54 }
55 }
56
valid_service_line(int field,int line,int is_pal)57 static int valid_service_line(int field, int line, int is_pal)
58 {
59 return (is_pal && line >= 6 && (line != 23 || field == 0)) ||
60 (!is_pal && line >= 10 && line < 22);
61 }
62
select_service_from_set(int field,int line,u16 set,int is_pal)63 static u16 select_service_from_set(int field, int line, u16 set, int is_pal)
64 {
65 u16 valid_set = (is_pal ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525);
66 int i;
67
68 set = set & valid_set;
69 if (set == 0 || !valid_service_line(field, line, is_pal)) {
70 return 0;
71 }
72 if (!is_pal) {
73 if (line == 21 && (set & V4L2_SLICED_CAPTION_525))
74 return V4L2_SLICED_CAPTION_525;
75 }
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;
83 }
84 for (i = 0; i < 32; i++) {
85 if ((1 << i) & set)
86 return 1 << i;
87 }
88 return 0;
89 }
90
ivtv_expand_service_set(struct v4l2_sliced_vbi_format * fmt,int is_pal)91 void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
92 {
93 u16 set = fmt->service_set;
94 int f, l;
95
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);
100 }
101 }
102 }
103
check_service_set(struct v4l2_sliced_vbi_format * fmt,int is_pal)104 static void check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
105 {
106 int f, l;
107
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);
111 }
112 }
113 }
114
ivtv_get_service_set(struct v4l2_sliced_vbi_format * fmt)115 u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt)
116 {
117 int f, l;
118 u16 set = 0;
119
120 for (f = 0; f < 2; f++) {
121 for (l = 0; l < 24; l++) {
122 set |= fmt->service_lines[f][l];
123 }
124 }
125 return set;
126 }
127
ivtv_set_osd_alpha(struct ivtv * itv)128 void ivtv_set_osd_alpha(struct ivtv *itv)
129 {
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);
133 }
134
ivtv_set_speed(struct ivtv * itv,int speed)135 int ivtv_set_speed(struct ivtv *itv, int speed)
136 {
137 u32 data[CX2341X_MBOX_MAX_DATA];
138 struct ivtv_stream *s;
139 int single_step = (speed == 1 || speed == -1);
140 DEFINE_WAIT(wait);
141
142 if (speed == 0) speed = 1000;
143
144 /* No change? */
145 if (speed == itv->speed && !single_step)
146 return 0;
147
148 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
149
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);
153 itv->speed = speed;
154 return 0;
155 }
156 if (single_step)
157 /* Need to change direction */
158 speed = speed < 0 ? -1000 : 1000;
159
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;
166 data[5] = 0;
167 data[6] = 0;
168
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);
173
174 /* If not decoding, just change speed setting */
175 if (atomic_read(&itv->decoding) > 0) {
176 int got_sig = 0;
177
178 /* Stop all DMA and decoding activity */
179 ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
180
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);
185 if (got_sig)
186 break;
187 got_sig = 0;
188 schedule();
189 }
190 finish_wait(&itv->dma_waitq, &wait);
191 if (got_sig)
192 return -EINTR;
193
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]);
198 }
199 if (single_step) {
200 speed = (speed < 0) ? -1 : 1;
201 ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
202 }
203 itv->speed = speed;
204 return 0;
205 }
206
ivtv_validate_speed(int cur_speed,int new_speed)207 static int ivtv_validate_speed(int cur_speed, int new_speed)
208 {
209 int fact = new_speed < 0 ? -1 : 1;
210 int s;
211
212 if (cur_speed == 0)
213 cur_speed = 1000;
214 if (new_speed < 0)
215 new_speed = -new_speed;
216 if (cur_speed < 0)
217 cur_speed = -cur_speed;
218
219 if (cur_speed <= new_speed) {
220 if (new_speed > 1500)
221 return fact * 2000;
222 if (new_speed > 1000)
223 return fact * 1500;
224 }
225 else {
226 if (new_speed >= 2000)
227 return fact * 2000;
228 if (new_speed >= 1500)
229 return fact * 1500;
230 if (new_speed >= 1000)
231 return fact * 1000;
232 }
233 if (new_speed == 0)
234 return 1000;
235 if (new_speed == 1 || new_speed == 1000)
236 return fact * new_speed;
237
238 s = 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);
244 }
245
ivtv_video_command(struct ivtv * itv,struct ivtv_open_id * id,struct video_command * vc,int try)246 static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
247 struct video_command *vc, int try)
248 {
249 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
250
251 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
252 return -EINVAL;
253
254 switch (vc->cmd) {
255 case VIDEO_CMD_PLAY: {
256 vc->flags = 0;
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;
260 if (try) break;
261
262 if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
263 return -EBUSY;
264 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
265 /* forces ivtv_set_speed to be called */
266 itv->speed = 0;
267 }
268 return ivtv_start_decoding(id, vc->play.speed);
269 }
270
271 case VIDEO_CMD_STOP:
272 vc->flags &= VIDEO_CMD_STOP_IMMEDIATELY|VIDEO_CMD_STOP_TO_BLACK;
273 if (vc->flags & VIDEO_CMD_STOP_IMMEDIATELY)
274 vc->stop.pts = 0;
275 if (try) break;
276 if (atomic_read(&itv->decoding) == 0)
277 return 0;
278 if (itv->output_mode != OUT_MPG)
279 return -EBUSY;
280
281 itv->output_mode = OUT_NONE;
282 return ivtv_stop_v4l2_decode_stream(s, vc->flags, vc->stop.pts);
283
284 case VIDEO_CMD_FREEZE:
285 vc->flags &= VIDEO_CMD_FREEZE_TO_BLACK;
286 if (try) break;
287 if (itv->output_mode != OUT_MPG)
288 return -EBUSY;
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);
293 }
294 break;
295
296 case VIDEO_CMD_CONTINUE:
297 vc->flags = 0;
298 if (try) break;
299 if (itv->output_mode != OUT_MPG)
300 return -EBUSY;
301 if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
302 int speed = itv->speed;
303 itv->speed = 0;
304 return ivtv_start_decoding(id, speed);
305 }
306 break;
307
308 default:
309 return -EINVAL;
310 }
311 return 0;
312 }
313
ivtv_g_fmt_sliced_vbi_out(struct file * file,void * fh,struct v4l2_format * fmt)314 static int ivtv_g_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
315 {
316 struct ivtv *itv = fh2id(fh)->itv;
317 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
318
319 vbifmt->reserved[0] = 0;
320 vbifmt->reserved[1] = 0;
321 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
322 return -EINVAL;
323 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
324 if (itv->is_60hz) {
325 vbifmt->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
326 vbifmt->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
327 } else {
328 vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625;
329 vbifmt->service_lines[0][16] = V4L2_SLICED_VPS;
330 }
331 vbifmt->service_set = ivtv_get_service_set(vbifmt);
332 return 0;
333 }
334
ivtv_g_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * fmt)335 static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
336 {
337 struct ivtv_open_id *id = fh2id(fh);
338 struct ivtv *itv = id->itv;
339 struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
340
341 pixfmt->width = itv->cxhdl.width;
342 pixfmt->height = itv->cxhdl.height;
343 pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
344 pixfmt->field = V4L2_FIELD_INTERLACED;
345 pixfmt->priv = 0;
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;
351 } else {
352 pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
353 pixfmt->sizeimage = 128 * 1024;
354 pixfmt->bytesperline = 0;
355 }
356 return 0;
357 }
358
ivtv_g_fmt_vbi_cap(struct file * file,void * fh,struct v4l2_format * fmt)359 static int ivtv_g_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
360 {
361 struct ivtv *itv = fh2id(fh)->itv;
362 struct v4l2_vbi_format *vbifmt = &fmt->fmt.vbi;
363
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;
371 vbifmt->flags = 0;
372 vbifmt->reserved[0] = 0;
373 vbifmt->reserved[1] = 0;
374 return 0;
375 }
376
ivtv_g_fmt_sliced_vbi_cap(struct file * file,void * fh,struct v4l2_format * fmt)377 static int ivtv_g_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
378 {
379 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
380 struct ivtv_open_id *id = fh2id(fh);
381 struct ivtv *itv = id->itv;
382
383 vbifmt->reserved[0] = 0;
384 vbifmt->reserved[1] = 0;
385 vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
386
387 if (id->type == IVTV_DEC_STREAM_TYPE_VBI) {
388 vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
389 V4L2_SLICED_VBI_525;
390 ivtv_expand_service_set(vbifmt, itv->is_50hz);
391 return 0;
392 }
393
394 v4l2_subdev_call(itv->sd_video, vbi, g_sliced_fmt, vbifmt);
395 vbifmt->service_set = ivtv_get_service_set(vbifmt);
396 return 0;
397 }
398
ivtv_g_fmt_vid_out(struct file * file,void * fh,struct v4l2_format * fmt)399 static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
400 {
401 struct ivtv_open_id *id = fh2id(fh);
402 struct ivtv *itv = id->itv;
403 struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
404
405 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
406 return -EINVAL;
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;
411 pixfmt->priv = 0;
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;
417 break;
418 case IVTV_YUV_MODE_PROGRESSIVE:
419 pixfmt->field = V4L2_FIELD_NONE;
420 break;
421 default:
422 pixfmt->field = V4L2_FIELD_ANY;
423 break;
424 }
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))) */
430 pixfmt->sizeimage =
431 1080 * ((pixfmt->height + 31) & ~31);
432 } else {
433 pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
434 pixfmt->sizeimage = 128 * 1024;
435 pixfmt->bytesperline = 0;
436 }
437 return 0;
438 }
439
ivtv_g_fmt_vid_out_overlay(struct file * file,void * fh,struct v4l2_format * fmt)440 static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
441 {
442 struct ivtv *itv = fh2id(fh)->itv;
443 struct v4l2_window *winfmt = &fmt->fmt.win;
444
445 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
446 return -EINVAL;
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;
456 return 0;
457 }
458
ivtv_try_fmt_sliced_vbi_out(struct file * file,void * fh,struct v4l2_format * fmt)459 static int ivtv_try_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
460 {
461 return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
462 }
463
ivtv_try_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * fmt)464 static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
465 {
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;
470 int min_h = 2;
471
472 w = min(w, 720);
473 w = max(w, 2);
474 if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
475 /* YUV height must be a multiple of 32 */
476 h &= ~0x1f;
477 min_h = 32;
478 }
479 h = min(h, itv->is_50hz ? 576 : 480);
480 h = max(h, min_h);
481 ivtv_g_fmt_vid_cap(file, fh, fmt);
482 fmt->fmt.pix.width = w;
483 fmt->fmt.pix.height = h;
484 return 0;
485 }
486
ivtv_try_fmt_vbi_cap(struct file * file,void * fh,struct v4l2_format * fmt)487 static int ivtv_try_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
488 {
489 return ivtv_g_fmt_vbi_cap(file, fh, fmt);
490 }
491
ivtv_try_fmt_sliced_vbi_cap(struct file * file,void * fh,struct v4l2_format * fmt)492 static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
493 {
494 struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
495 struct ivtv_open_id *id = fh2id(fh);
496 struct ivtv *itv = id->itv;
497
498 if (id->type == IVTV_DEC_STREAM_TYPE_VBI)
499 return ivtv_g_fmt_sliced_vbi_cap(file, fh, fmt);
500
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;
505
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);
510 return 0;
511 }
512
ivtv_try_fmt_vid_out(struct file * file,void * fh,struct v4l2_format * fmt)513 static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
514 {
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);
520
521 w = min(w, 720);
522 w = max(w, 2);
523 /* Why can the height be 576 even when the output is NTSC?
524
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.
533
534 Note that the scaling only occurs on the video stream, the osd
535 resolution is locked to the broadcast standard and not scaled.
536
537 Thanks to Ian Armstrong for this explanation. */
538 h = min(h, 576);
539 h = max(h, 2);
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;
544 return ret;
545 }
546
ivtv_try_fmt_vid_out_overlay(struct file * file,void * fh,struct v4l2_format * fmt)547 static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
548 {
549 struct ivtv *itv = fh2id(fh)->itv;
550 u32 chromakey = fmt->fmt.win.chromakey;
551 u8 global_alpha = fmt->fmt.win.global_alpha;
552
553 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
554 return -EINVAL;
555 ivtv_g_fmt_vid_out_overlay(file, fh, fmt);
556 fmt->fmt.win.chromakey = chromakey;
557 fmt->fmt.win.global_alpha = global_alpha;
558 return 0;
559 }
560
ivtv_s_fmt_sliced_vbi_out(struct file * file,void * fh,struct v4l2_format * fmt)561 static int ivtv_s_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
562 {
563 return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
564 }
565
ivtv_s_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * fmt)566 static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
567 {
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;
574
575 if (ret)
576 return ret;
577
578 if (itv->cxhdl.width == w && itv->cxhdl.height == h)
579 return 0;
580
581 if (atomic_read(&itv->capturing) > 0)
582 return -EBUSY;
583
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;
589 mbus_fmt.height = h;
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);
593 }
594
ivtv_s_fmt_vbi_cap(struct file * file,void * fh,struct v4l2_format * fmt)595 static int ivtv_s_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
596 {
597 struct ivtv *itv = fh2id(fh)->itv;
598
599 if (!ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
600 return -EBUSY;
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);
605 }
606
ivtv_s_fmt_sliced_vbi_cap(struct file * file,void * fh,struct v4l2_format * fmt)607 static int ivtv_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
608 {
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);
613
614 if (ret || id->type == IVTV_DEC_STREAM_TYPE_VBI)
615 return ret;
616
617 check_service_set(vbifmt, itv->is_50hz);
618 if (ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
619 return -EBUSY;
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));
623 return 0;
624 }
625
ivtv_s_fmt_vid_out(struct file * file,void * fh,struct v4l2_format * fmt)626 static int ivtv_s_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
627 {
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);
632
633 if (ret)
634 return ret;
635
636 if (id->type != IVTV_DEC_STREAM_TYPE_YUV)
637 return 0;
638
639 /* Return now if we already have some frame data */
640 if (yi->stream_size)
641 return -EBUSY;
642
643 yi->v4l2_src_w = fmt->fmt.pix.width;
644 yi->v4l2_src_h = fmt->fmt.pix.height;
645
646 switch (fmt->fmt.pix.field) {
647 case V4L2_FIELD_NONE:
648 yi->lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
649 break;
650 case V4L2_FIELD_ANY:
651 yi->lace_mode = IVTV_YUV_MODE_AUTO;
652 break;
653 case V4L2_FIELD_INTERLACED_BT:
654 yi->lace_mode =
655 IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
656 break;
657 case V4L2_FIELD_INTERLACED_TB:
658 default:
659 yi->lace_mode = IVTV_YUV_MODE_INTERLACED;
660 break;
661 }
662 yi->lace_sync_field = (yi->lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
663
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);
667
668 return 0;
669 }
670
ivtv_s_fmt_vid_out_overlay(struct file * file,void * fh,struct v4l2_format * fmt)671 static int ivtv_s_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
672 {
673 struct ivtv *itv = fh2id(fh)->itv;
674 int ret = ivtv_try_fmt_vid_out_overlay(file, fh, fmt);
675
676 if (ret == 0) {
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);
680 }
681 return ret;
682 }
683
ivtv_g_chip_ident(struct file * file,void * fh,struct v4l2_dbg_chip_ident * chip)684 static int ivtv_g_chip_ident(struct file *file, void *fh, struct v4l2_dbg_chip_ident *chip)
685 {
686 struct ivtv *itv = fh2id(fh)->itv;
687
688 chip->ident = V4L2_IDENT_NONE;
689 chip->revision = 0;
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;
693 return 0;
694 }
695 if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER &&
696 chip->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
697 return -EINVAL;
698 /* TODO: is this correct? */
699 return ivtv_call_all_err(itv, core, g_chip_ident, chip);
700 }
701
702 #ifdef CONFIG_VIDEO_ADV_DEBUG
ivtv_itvc(struct ivtv * itv,unsigned int cmd,void * arg)703 static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
704 {
705 struct v4l2_dbg_register *regs = arg;
706 volatile u8 __iomem *reg_start;
707
708 if (!capable(CAP_SYS_ADMIN))
709 return -EPERM;
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;
717 else
718 return -EINVAL;
719
720 regs->size = 4;
721 if (cmd == VIDIOC_DBG_G_REGISTER)
722 regs->val = readl(regs->reg + reg_start);
723 else
724 writel(regs->val, regs->reg + reg_start);
725 return 0;
726 }
727
ivtv_g_register(struct file * file,void * fh,struct v4l2_dbg_register * reg)728 static int ivtv_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
729 {
730 struct ivtv *itv = fh2id(fh)->itv;
731
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);
737 return 0;
738 }
739
ivtv_s_register(struct file * file,void * fh,struct v4l2_dbg_register * reg)740 static int ivtv_s_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
741 {
742 struct ivtv *itv = fh2id(fh)->itv;
743
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);
749 return 0;
750 }
751 #endif
752
ivtv_querycap(struct file * file,void * fh,struct v4l2_capability * vcap)753 static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vcap)
754 {
755 struct ivtv *itv = fh2id(fh)->itv;
756
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->version = IVTV_DRIVER_VERSION; /* version */
761 vcap->capabilities = itv->v4l2_cap; /* capabilities */
762 return 0;
763 }
764
ivtv_enumaudio(struct file * file,void * fh,struct v4l2_audio * vin)765 static int ivtv_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
766 {
767 struct ivtv *itv = fh2id(fh)->itv;
768
769 return ivtv_get_audio_input(itv, vin->index, vin);
770 }
771
ivtv_g_audio(struct file * file,void * fh,struct v4l2_audio * vin)772 static int ivtv_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
773 {
774 struct ivtv *itv = fh2id(fh)->itv;
775
776 vin->index = itv->audio_input;
777 return ivtv_get_audio_input(itv, vin->index, vin);
778 }
779
ivtv_s_audio(struct file * file,void * fh,struct v4l2_audio * vout)780 static int ivtv_s_audio(struct file *file, void *fh, struct v4l2_audio *vout)
781 {
782 struct ivtv *itv = fh2id(fh)->itv;
783
784 if (vout->index >= itv->nof_audio_inputs)
785 return -EINVAL;
786
787 itv->audio_input = vout->index;
788 ivtv_audio_set_io(itv);
789
790 return 0;
791 }
792
ivtv_enumaudout(struct file * file,void * fh,struct v4l2_audioout * vin)793 static int ivtv_enumaudout(struct file *file, void *fh, struct v4l2_audioout *vin)
794 {
795 struct ivtv *itv = fh2id(fh)->itv;
796
797 /* set it to defaults from our table */
798 return ivtv_get_audio_output(itv, vin->index, vin);
799 }
800
ivtv_g_audout(struct file * file,void * fh,struct v4l2_audioout * vin)801 static int ivtv_g_audout(struct file *file, void *fh, struct v4l2_audioout *vin)
802 {
803 struct ivtv *itv = fh2id(fh)->itv;
804
805 vin->index = 0;
806 return ivtv_get_audio_output(itv, vin->index, vin);
807 }
808
ivtv_s_audout(struct file * file,void * fh,struct v4l2_audioout * vout)809 static int ivtv_s_audout(struct file *file, void *fh, struct v4l2_audioout *vout)
810 {
811 struct ivtv *itv = fh2id(fh)->itv;
812
813 return ivtv_get_audio_output(itv, vout->index, vout);
814 }
815
ivtv_enum_input(struct file * file,void * fh,struct v4l2_input * vin)816 static int ivtv_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
817 {
818 struct ivtv *itv = fh2id(fh)->itv;
819
820 /* set it to defaults from our table */
821 return ivtv_get_input(itv, vin->index, vin);
822 }
823
ivtv_enum_output(struct file * file,void * fh,struct v4l2_output * vout)824 static int ivtv_enum_output(struct file *file, void *fh, struct v4l2_output *vout)
825 {
826 struct ivtv *itv = fh2id(fh)->itv;
827
828 return ivtv_get_output(itv, vout->index, vout);
829 }
830
ivtv_cropcap(struct file * file,void * fh,struct v4l2_cropcap * cropcap)831 static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
832 {
833 struct ivtv_open_id *id = fh2id(fh);
834 struct ivtv *itv = id->itv;
835 struct yuv_playback_info *yi = &itv->yuv_info;
836 int streamtype;
837
838 streamtype = id->type;
839
840 if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
841 return -EINVAL;
842 cropcap->bounds.top = cropcap->bounds.left = 0;
843 cropcap->bounds.width = 720;
844 if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
845 cropcap->bounds.height = itv->is_50hz ? 576 : 480;
846 cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
847 cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
848 } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
849 if (yi->track_osd) {
850 cropcap->bounds.width = yi->osd_full_w;
851 cropcap->bounds.height = yi->osd_full_h;
852 } else {
853 cropcap->bounds.width = 720;
854 cropcap->bounds.height =
855 itv->is_out_50hz ? 576 : 480;
856 }
857 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
858 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
859 } else {
860 cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
861 cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
862 cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
863 }
864 cropcap->defrect = cropcap->bounds;
865 return 0;
866 }
867
ivtv_s_crop(struct file * file,void * fh,struct v4l2_crop * crop)868 static int ivtv_s_crop(struct file *file, void *fh, struct v4l2_crop *crop)
869 {
870 struct ivtv_open_id *id = fh2id(fh);
871 struct ivtv *itv = id->itv;
872 struct yuv_playback_info *yi = &itv->yuv_info;
873 int streamtype;
874
875 streamtype = id->type;
876
877 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
878 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
879 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
880 yi->main_rect = crop->c;
881 return 0;
882 } else {
883 if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
884 crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
885 itv->main_rect = crop->c;
886 return 0;
887 }
888 }
889 return -EINVAL;
890 }
891 return -EINVAL;
892 }
893
ivtv_g_crop(struct file * file,void * fh,struct v4l2_crop * crop)894 static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
895 {
896 struct ivtv_open_id *id = fh2id(fh);
897 struct ivtv *itv = id->itv;
898 struct yuv_playback_info *yi = &itv->yuv_info;
899 int streamtype;
900
901 streamtype = id->type;
902
903 if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
904 (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
905 if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
906 crop->c = yi->main_rect;
907 else
908 crop->c = itv->main_rect;
909 return 0;
910 }
911 return -EINVAL;
912 }
913
ivtv_enum_fmt_vid_cap(struct file * file,void * fh,struct v4l2_fmtdesc * fmt)914 static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
915 {
916 static struct v4l2_fmtdesc formats[] = {
917 { 0, 0, 0,
918 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
919 { 0, 0, 0, 0 }
920 },
921 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
922 "MPEG", V4L2_PIX_FMT_MPEG,
923 { 0, 0, 0, 0 }
924 }
925 };
926 enum v4l2_buf_type type = fmt->type;
927
928 if (fmt->index > 1)
929 return -EINVAL;
930
931 *fmt = formats[fmt->index];
932 fmt->type = type;
933 return 0;
934 }
935
ivtv_enum_fmt_vid_out(struct file * file,void * fh,struct v4l2_fmtdesc * fmt)936 static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
937 {
938 struct ivtv *itv = fh2id(fh)->itv;
939
940 static struct v4l2_fmtdesc formats[] = {
941 { 0, 0, 0,
942 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
943 { 0, 0, 0, 0 }
944 },
945 { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
946 "MPEG", V4L2_PIX_FMT_MPEG,
947 { 0, 0, 0, 0 }
948 }
949 };
950 enum v4l2_buf_type type = fmt->type;
951
952 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
953 return -EINVAL;
954
955 if (fmt->index > 1)
956 return -EINVAL;
957
958 *fmt = formats[fmt->index];
959 fmt->type = type;
960
961 return 0;
962 }
963
ivtv_g_input(struct file * file,void * fh,unsigned int * i)964 static int ivtv_g_input(struct file *file, void *fh, unsigned int *i)
965 {
966 struct ivtv *itv = fh2id(fh)->itv;
967
968 *i = itv->active_input;
969
970 return 0;
971 }
972
ivtv_s_input(struct file * file,void * fh,unsigned int inp)973 int ivtv_s_input(struct file *file, void *fh, unsigned int inp)
974 {
975 struct ivtv *itv = fh2id(fh)->itv;
976
977 if (inp < 0 || inp >= itv->nof_inputs)
978 return -EINVAL;
979
980 if (inp == itv->active_input) {
981 IVTV_DEBUG_INFO("Input unchanged\n");
982 return 0;
983 }
984
985 if (atomic_read(&itv->capturing) > 0) {
986 return -EBUSY;
987 }
988
989 IVTV_DEBUG_INFO("Changing input from %d to %d\n",
990 itv->active_input, inp);
991
992 itv->active_input = inp;
993 /* Set the audio input to whatever is appropriate for the
994 input type. */
995 itv->audio_input = itv->card->video_inputs[inp].audio_index;
996
997 /* prevent others from messing with the streams until
998 we're finished changing inputs. */
999 ivtv_mute(itv);
1000 ivtv_video_set_io(itv);
1001 ivtv_audio_set_io(itv);
1002 ivtv_unmute(itv);
1003
1004 return 0;
1005 }
1006
ivtv_g_output(struct file * file,void * fh,unsigned int * i)1007 static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
1008 {
1009 struct ivtv *itv = fh2id(fh)->itv;
1010
1011 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1012 return -EINVAL;
1013
1014 *i = itv->active_output;
1015
1016 return 0;
1017 }
1018
ivtv_s_output(struct file * file,void * fh,unsigned int outp)1019 static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
1020 {
1021 struct ivtv *itv = fh2id(fh)->itv;
1022
1023 if (outp >= itv->card->nof_outputs)
1024 return -EINVAL;
1025
1026 if (outp == itv->active_output) {
1027 IVTV_DEBUG_INFO("Output unchanged\n");
1028 return 0;
1029 }
1030 IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1031 itv->active_output, outp);
1032
1033 itv->active_output = outp;
1034 ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
1035 SAA7127_INPUT_TYPE_NORMAL,
1036 itv->card->video_outputs[outp].video_output, 0);
1037
1038 return 0;
1039 }
1040
ivtv_g_frequency(struct file * file,void * fh,struct v4l2_frequency * vf)1041 static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1042 {
1043 struct ivtv *itv = fh2id(fh)->itv;
1044
1045 if (vf->tuner != 0)
1046 return -EINVAL;
1047
1048 ivtv_call_all(itv, tuner, g_frequency, vf);
1049 return 0;
1050 }
1051
ivtv_s_frequency(struct file * file,void * fh,struct v4l2_frequency * vf)1052 int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1053 {
1054 struct ivtv *itv = fh2id(fh)->itv;
1055
1056 if (vf->tuner != 0)
1057 return -EINVAL;
1058
1059 ivtv_mute(itv);
1060 IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf->frequency);
1061 ivtv_call_all(itv, tuner, s_frequency, vf);
1062 ivtv_unmute(itv);
1063 return 0;
1064 }
1065
ivtv_g_std(struct file * file,void * fh,v4l2_std_id * std)1066 static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
1067 {
1068 struct ivtv *itv = fh2id(fh)->itv;
1069
1070 *std = itv->std;
1071 return 0;
1072 }
1073
ivtv_s_std(struct file * file,void * fh,v4l2_std_id * std)1074 int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std)
1075 {
1076 DEFINE_WAIT(wait);
1077 struct ivtv *itv = fh2id(fh)->itv;
1078 struct yuv_playback_info *yi = &itv->yuv_info;
1079 int f;
1080
1081 if ((*std & V4L2_STD_ALL) == 0)
1082 return -EINVAL;
1083
1084 if (*std == itv->std)
1085 return 0;
1086
1087 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1088 atomic_read(&itv->capturing) > 0 ||
1089 atomic_read(&itv->decoding) > 0) {
1090 /* Switching standard would turn off the radio or mess
1091 with already running streams, prevent that by
1092 returning EBUSY. */
1093 return -EBUSY;
1094 }
1095
1096 itv->std = *std;
1097 itv->is_60hz = (*std & V4L2_STD_525_60) ? 1 : 0;
1098 itv->is_50hz = !itv->is_60hz;
1099 cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz);
1100 itv->cxhdl.width = 720;
1101 itv->cxhdl.height = itv->is_50hz ? 576 : 480;
1102 itv->vbi.count = itv->is_50hz ? 18 : 12;
1103 itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1104 itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1105
1106 if (itv->hw_flags & IVTV_HW_CX25840)
1107 itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1108
1109 IVTV_DEBUG_INFO("Switching standard to %llx.\n", (unsigned long long)itv->std);
1110
1111 /* Tuner */
1112 ivtv_call_all(itv, core, s_std, itv->std);
1113
1114 if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
1115 /* set display standard */
1116 itv->std_out = *std;
1117 itv->is_out_60hz = itv->is_60hz;
1118 itv->is_out_50hz = itv->is_50hz;
1119 ivtv_call_all(itv, video, s_std_output, itv->std_out);
1120
1121 /*
1122 * The next firmware call is time sensitive. Time it to
1123 * avoid risk of a hard lock, by trying to ensure the call
1124 * happens within the first 100 lines of the top field.
1125 * Make 4 attempts to sync to the decoder before giving up.
1126 */
1127 for (f = 0; f < 4; f++) {
1128 prepare_to_wait(&itv->vsync_waitq, &wait,
1129 TASK_UNINTERRUPTIBLE);
1130 if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
1131 break;
1132 schedule_timeout(msecs_to_jiffies(25));
1133 }
1134 finish_wait(&itv->vsync_waitq, &wait);
1135
1136 if (f == 4)
1137 IVTV_WARN("Mode change failed to sync to decoder\n");
1138
1139 ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1140 itv->main_rect.left = itv->main_rect.top = 0;
1141 itv->main_rect.width = 720;
1142 itv->main_rect.height = itv->cxhdl.height;
1143 ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1144 720, itv->main_rect.height, 0, 0);
1145 yi->main_rect = itv->main_rect;
1146 if (!itv->osd_info) {
1147 yi->osd_full_w = 720;
1148 yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1149 }
1150 }
1151 return 0;
1152 }
1153
ivtv_s_tuner(struct file * file,void * fh,struct v4l2_tuner * vt)1154 static int ivtv_s_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1155 {
1156 struct ivtv_open_id *id = fh2id(fh);
1157 struct ivtv *itv = id->itv;
1158
1159 if (vt->index != 0)
1160 return -EINVAL;
1161
1162 ivtv_call_all(itv, tuner, s_tuner, vt);
1163
1164 return 0;
1165 }
1166
ivtv_g_tuner(struct file * file,void * fh,struct v4l2_tuner * vt)1167 static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1168 {
1169 struct ivtv *itv = fh2id(fh)->itv;
1170
1171 if (vt->index != 0)
1172 return -EINVAL;
1173
1174 ivtv_call_all(itv, tuner, g_tuner, vt);
1175
1176 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags)) {
1177 strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
1178 vt->type = V4L2_TUNER_RADIO;
1179 } else {
1180 strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
1181 vt->type = V4L2_TUNER_ANALOG_TV;
1182 }
1183
1184 return 0;
1185 }
1186
ivtv_g_sliced_vbi_cap(struct file * file,void * fh,struct v4l2_sliced_vbi_cap * cap)1187 static int ivtv_g_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_sliced_vbi_cap *cap)
1188 {
1189 struct ivtv *itv = fh2id(fh)->itv;
1190 int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1191 int f, l;
1192
1193 if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1194 for (f = 0; f < 2; f++) {
1195 for (l = 0; l < 24; l++) {
1196 if (valid_service_line(f, l, itv->is_50hz))
1197 cap->service_lines[f][l] = set;
1198 }
1199 }
1200 return 0;
1201 }
1202 if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1203 if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1204 return -EINVAL;
1205 if (itv->is_60hz) {
1206 cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1207 cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1208 } else {
1209 cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1210 cap->service_lines[0][16] = V4L2_SLICED_VPS;
1211 }
1212 return 0;
1213 }
1214 return -EINVAL;
1215 }
1216
ivtv_g_enc_index(struct file * file,void * fh,struct v4l2_enc_idx * idx)1217 static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *idx)
1218 {
1219 struct ivtv *itv = fh2id(fh)->itv;
1220 struct v4l2_enc_idx_entry *e = idx->entry;
1221 int entries;
1222 int i;
1223
1224 entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1225 IVTV_MAX_PGM_INDEX;
1226 if (entries > V4L2_ENC_IDX_ENTRIES)
1227 entries = V4L2_ENC_IDX_ENTRIES;
1228 idx->entries = 0;
1229 for (i = 0; i < entries; i++) {
1230 *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1231 if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1232 idx->entries++;
1233 e++;
1234 }
1235 }
1236 itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1237 return 0;
1238 }
1239
ivtv_encoder_cmd(struct file * file,void * fh,struct v4l2_encoder_cmd * enc)1240 static int ivtv_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1241 {
1242 struct ivtv_open_id *id = fh2id(fh);
1243 struct ivtv *itv = id->itv;
1244
1245
1246 switch (enc->cmd) {
1247 case V4L2_ENC_CMD_START:
1248 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1249 enc->flags = 0;
1250 return ivtv_start_capture(id);
1251
1252 case V4L2_ENC_CMD_STOP:
1253 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1254 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1255 ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1256 return 0;
1257
1258 case V4L2_ENC_CMD_PAUSE:
1259 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1260 enc->flags = 0;
1261
1262 if (!atomic_read(&itv->capturing))
1263 return -EPERM;
1264 if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1265 return 0;
1266
1267 ivtv_mute(itv);
1268 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1269 break;
1270
1271 case V4L2_ENC_CMD_RESUME:
1272 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1273 enc->flags = 0;
1274
1275 if (!atomic_read(&itv->capturing))
1276 return -EPERM;
1277
1278 if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1279 return 0;
1280
1281 ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1282 ivtv_unmute(itv);
1283 break;
1284 default:
1285 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1286 return -EINVAL;
1287 }
1288
1289 return 0;
1290 }
1291
ivtv_try_encoder_cmd(struct file * file,void * fh,struct v4l2_encoder_cmd * enc)1292 static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1293 {
1294 struct ivtv *itv = fh2id(fh)->itv;
1295
1296 switch (enc->cmd) {
1297 case V4L2_ENC_CMD_START:
1298 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1299 enc->flags = 0;
1300 return 0;
1301
1302 case V4L2_ENC_CMD_STOP:
1303 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1304 enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1305 return 0;
1306
1307 case V4L2_ENC_CMD_PAUSE:
1308 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1309 enc->flags = 0;
1310 return 0;
1311
1312 case V4L2_ENC_CMD_RESUME:
1313 IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1314 enc->flags = 0;
1315 return 0;
1316 default:
1317 IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1318 return -EINVAL;
1319 }
1320 }
1321
ivtv_g_fbuf(struct file * file,void * fh,struct v4l2_framebuffer * fb)1322 static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1323 {
1324 struct ivtv *itv = fh2id(fh)->itv;
1325 u32 data[CX2341X_MBOX_MAX_DATA];
1326 struct yuv_playback_info *yi = &itv->yuv_info;
1327
1328 int pixfmt;
1329 static u32 pixel_format[16] = {
1330 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1331 V4L2_PIX_FMT_RGB565,
1332 V4L2_PIX_FMT_RGB555,
1333 V4L2_PIX_FMT_RGB444,
1334 V4L2_PIX_FMT_RGB32,
1335 0,
1336 0,
1337 0,
1338 V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1339 V4L2_PIX_FMT_YUV565,
1340 V4L2_PIX_FMT_YUV555,
1341 V4L2_PIX_FMT_YUV444,
1342 V4L2_PIX_FMT_YUV32,
1343 0,
1344 0,
1345 0,
1346 };
1347
1348 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1349 return -EINVAL;
1350 if (!itv->osd_video_pbase)
1351 return -EINVAL;
1352
1353 fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1354 V4L2_FBUF_CAP_GLOBAL_ALPHA;
1355
1356 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1357 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1358 pixfmt = (data[0] >> 3) & 0xf;
1359
1360 fb->fmt.pixelformat = pixel_format[pixfmt];
1361 fb->fmt.width = itv->osd_rect.width;
1362 fb->fmt.height = itv->osd_rect.height;
1363 fb->fmt.field = V4L2_FIELD_INTERLACED;
1364 fb->fmt.bytesperline = fb->fmt.width;
1365 fb->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
1366 fb->fmt.field = V4L2_FIELD_INTERLACED;
1367 fb->fmt.priv = 0;
1368 if (fb->fmt.pixelformat != V4L2_PIX_FMT_PAL8)
1369 fb->fmt.bytesperline *= 2;
1370 if (fb->fmt.pixelformat == V4L2_PIX_FMT_RGB32 ||
1371 fb->fmt.pixelformat == V4L2_PIX_FMT_YUV32)
1372 fb->fmt.bytesperline *= 2;
1373 fb->fmt.sizeimage = fb->fmt.bytesperline * fb->fmt.height;
1374 fb->base = (void *)itv->osd_video_pbase;
1375 fb->flags = 0;
1376
1377 if (itv->osd_chroma_key_state)
1378 fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1379
1380 if (itv->osd_global_alpha_state)
1381 fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1382
1383 if (yi->track_osd)
1384 fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1385
1386 pixfmt &= 7;
1387
1388 /* no local alpha for RGB565 or unknown formats */
1389 if (pixfmt == 1 || pixfmt > 4)
1390 return 0;
1391
1392 /* 16-bit formats have inverted local alpha */
1393 if (pixfmt == 2 || pixfmt == 3)
1394 fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1395 else
1396 fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1397
1398 if (itv->osd_local_alpha_state) {
1399 /* 16-bit formats have inverted local alpha */
1400 if (pixfmt == 2 || pixfmt == 3)
1401 fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1402 else
1403 fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1404 }
1405
1406 return 0;
1407 }
1408
ivtv_s_fbuf(struct file * file,void * fh,struct v4l2_framebuffer * fb)1409 static int ivtv_s_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1410 {
1411 struct ivtv_open_id *id = fh2id(fh);
1412 struct ivtv *itv = id->itv;
1413 struct yuv_playback_info *yi = &itv->yuv_info;
1414
1415 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1416 return -EINVAL;
1417 if (!itv->osd_video_pbase)
1418 return -EINVAL;
1419
1420 itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1421 itv->osd_local_alpha_state =
1422 (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1423 itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1424 ivtv_set_osd_alpha(itv);
1425 yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1426 return ivtv_g_fbuf(file, fh, fb);
1427 }
1428
ivtv_overlay(struct file * file,void * fh,unsigned int on)1429 static int ivtv_overlay(struct file *file, void *fh, unsigned int on)
1430 {
1431 struct ivtv_open_id *id = fh2id(fh);
1432 struct ivtv *itv = id->itv;
1433
1434 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1435 return -EINVAL;
1436
1437 ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0);
1438
1439 return 0;
1440 }
1441
ivtv_subscribe_event(struct v4l2_fh * fh,struct v4l2_event_subscription * sub)1442 static int ivtv_subscribe_event(struct v4l2_fh *fh, struct v4l2_event_subscription *sub)
1443 {
1444 switch (sub->type) {
1445 case V4L2_EVENT_VSYNC:
1446 case V4L2_EVENT_EOS:
1447 break;
1448 default:
1449 return -EINVAL;
1450 }
1451 return v4l2_event_subscribe(fh, sub);
1452 }
1453
ivtv_log_status(struct file * file,void * fh)1454 static int ivtv_log_status(struct file *file, void *fh)
1455 {
1456 struct ivtv *itv = fh2id(fh)->itv;
1457 u32 data[CX2341X_MBOX_MAX_DATA];
1458
1459 int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1460 struct v4l2_input vidin;
1461 struct v4l2_audio audin;
1462 int i;
1463
1464 IVTV_INFO("================= START STATUS CARD #%d =================\n",
1465 itv->instance);
1466 IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1467 if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1468 struct tveeprom tv;
1469
1470 ivtv_read_eeprom(itv, &tv);
1471 }
1472 ivtv_call_all(itv, core, log_status);
1473 ivtv_get_input(itv, itv->active_input, &vidin);
1474 ivtv_get_audio_input(itv, itv->audio_input, &audin);
1475 IVTV_INFO("Video Input: %s\n", vidin.name);
1476 IVTV_INFO("Audio Input: %s%s\n", audin.name,
1477 (itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1478 if (has_output) {
1479 struct v4l2_output vidout;
1480 struct v4l2_audioout audout;
1481 int mode = itv->output_mode;
1482 static const char * const output_modes[5] = {
1483 "None",
1484 "MPEG Streaming",
1485 "YUV Streaming",
1486 "YUV Frames",
1487 "Passthrough",
1488 };
1489 static const char * const audio_modes[5] = {
1490 "Stereo",
1491 "Left",
1492 "Right",
1493 "Mono",
1494 "Swapped"
1495 };
1496 static const char * const alpha_mode[4] = {
1497 "None",
1498 "Global",
1499 "Local",
1500 "Global and Local"
1501 };
1502 static const char * const pixel_format[16] = {
1503 "ARGB Indexed",
1504 "RGB 5:6:5",
1505 "ARGB 1:5:5:5",
1506 "ARGB 1:4:4:4",
1507 "ARGB 8:8:8:8",
1508 "5",
1509 "6",
1510 "7",
1511 "AYUV Indexed",
1512 "YUV 5:6:5",
1513 "AYUV 1:5:5:5",
1514 "AYUV 1:4:4:4",
1515 "AYUV 8:8:8:8",
1516 "13",
1517 "14",
1518 "15",
1519 };
1520
1521 ivtv_get_output(itv, itv->active_output, &vidout);
1522 ivtv_get_audio_output(itv, 0, &audout);
1523 IVTV_INFO("Video Output: %s\n", vidout.name);
1524 IVTV_INFO("Audio Output: %s (Stereo/Bilingual: %s/%s)\n", audout.name,
1525 audio_modes[itv->audio_stereo_mode],
1526 audio_modes[itv->audio_bilingual_mode]);
1527 if (mode < 0 || mode > OUT_PASSTHROUGH)
1528 mode = OUT_NONE;
1529 IVTV_INFO("Output Mode: %s\n", output_modes[mode]);
1530 ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1531 data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1532 IVTV_INFO("Overlay: %s, Alpha: %s, Pixel Format: %s\n",
1533 data[0] & 1 ? "On" : "Off",
1534 alpha_mode[(data[0] >> 1) & 0x3],
1535 pixel_format[(data[0] >> 3) & 0xf]);
1536 }
1537 IVTV_INFO("Tuner: %s\n",
1538 test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1539 v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
1540 IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
1541 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1542 struct ivtv_stream *s = &itv->streams[i];
1543
1544 if (s->vdev == NULL || s->buffers == 0)
1545 continue;
1546 IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1547 (s->buffers - s->q_free.buffers) * 100 / s->buffers,
1548 (s->buffers * s->buf_size) / 1024, s->buffers);
1549 }
1550
1551 IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1552 (long long)itv->mpg_data_received,
1553 (long long)itv->vbi_data_inserted);
1554 IVTV_INFO("================== END STATUS CARD #%d ==================\n",
1555 itv->instance);
1556
1557 return 0;
1558 }
1559
ivtv_decoder_ioctls(struct file * filp,unsigned int cmd,void * arg)1560 static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1561 {
1562 struct ivtv_open_id *id = fh2id(filp->private_data);
1563 struct ivtv *itv = id->itv;
1564 int nonblocking = filp->f_flags & O_NONBLOCK;
1565 struct ivtv_stream *s = &itv->streams[id->type];
1566 unsigned long iarg = (unsigned long)arg;
1567
1568 switch (cmd) {
1569 case IVTV_IOC_DMA_FRAME: {
1570 struct ivtv_dma_frame *args = arg;
1571
1572 IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1573 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1574 return -EINVAL;
1575 if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1576 return -EINVAL;
1577 if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1578 return 0;
1579 if (ivtv_start_decoding(id, id->type)) {
1580 return -EBUSY;
1581 }
1582 if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1583 ivtv_release_stream(s);
1584 return -EBUSY;
1585 }
1586 /* Mark that this file handle started the UDMA_YUV mode */
1587 id->yuv_frames = 1;
1588 if (args->y_source == NULL)
1589 return 0;
1590 return ivtv_yuv_prep_frame(itv, args);
1591 }
1592
1593 case VIDEO_GET_PTS: {
1594 u32 data[CX2341X_MBOX_MAX_DATA];
1595 u64 *pts = arg;
1596
1597 IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1598 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1599 *pts = s->dma_pts;
1600 break;
1601 }
1602 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1603 return -EINVAL;
1604
1605 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1606 *pts = (u64) ((u64)itv->last_dec_timing[2] << 32) |
1607 (u64)itv->last_dec_timing[1];
1608 break;
1609 }
1610 *pts = 0;
1611 if (atomic_read(&itv->decoding)) {
1612 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1613 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1614 return -EIO;
1615 }
1616 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1617 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1618 *pts = (u64) ((u64) data[2] << 32) | (u64) data[1];
1619 /*timing->scr = (u64) (((u64) data[4] << 32) | (u64) (data[3]));*/
1620 }
1621 break;
1622 }
1623
1624 case VIDEO_GET_FRAME_COUNT: {
1625 u32 data[CX2341X_MBOX_MAX_DATA];
1626 u64 *frame = arg;
1627
1628 IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1629 if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1630 *frame = 0;
1631 break;
1632 }
1633 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1634 return -EINVAL;
1635
1636 if (test_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags)) {
1637 *frame = itv->last_dec_timing[0];
1638 break;
1639 }
1640 *frame = 0;
1641 if (atomic_read(&itv->decoding)) {
1642 if (ivtv_api(itv, CX2341X_DEC_GET_TIMING_INFO, 5, data)) {
1643 IVTV_DEBUG_WARN("GET_TIMING: couldn't read clock\n");
1644 return -EIO;
1645 }
1646 memcpy(itv->last_dec_timing, data, sizeof(itv->last_dec_timing));
1647 set_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
1648 *frame = data[0];
1649 }
1650 break;
1651 }
1652
1653 case VIDEO_PLAY: {
1654 struct video_command vc;
1655
1656 IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1657 memset(&vc, 0, sizeof(vc));
1658 vc.cmd = VIDEO_CMD_PLAY;
1659 return ivtv_video_command(itv, id, &vc, 0);
1660 }
1661
1662 case VIDEO_STOP: {
1663 struct video_command vc;
1664
1665 IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1666 memset(&vc, 0, sizeof(vc));
1667 vc.cmd = VIDEO_CMD_STOP;
1668 vc.flags = VIDEO_CMD_STOP_TO_BLACK | VIDEO_CMD_STOP_IMMEDIATELY;
1669 return ivtv_video_command(itv, id, &vc, 0);
1670 }
1671
1672 case VIDEO_FREEZE: {
1673 struct video_command vc;
1674
1675 IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1676 memset(&vc, 0, sizeof(vc));
1677 vc.cmd = VIDEO_CMD_FREEZE;
1678 return ivtv_video_command(itv, id, &vc, 0);
1679 }
1680
1681 case VIDEO_CONTINUE: {
1682 struct video_command vc;
1683
1684 IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1685 memset(&vc, 0, sizeof(vc));
1686 vc.cmd = VIDEO_CMD_CONTINUE;
1687 return ivtv_video_command(itv, id, &vc, 0);
1688 }
1689
1690 case VIDEO_COMMAND:
1691 case VIDEO_TRY_COMMAND: {
1692 struct video_command *vc = arg;
1693 int try = (cmd == VIDEO_TRY_COMMAND);
1694
1695 if (try)
1696 IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", vc->cmd);
1697 else
1698 IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", vc->cmd);
1699 return ivtv_video_command(itv, id, vc, try);
1700 }
1701
1702 case VIDEO_GET_EVENT: {
1703 struct video_event *ev = arg;
1704 DEFINE_WAIT(wait);
1705
1706 IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1707 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1708 return -EINVAL;
1709 memset(ev, 0, sizeof(*ev));
1710 set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1711
1712 while (1) {
1713 if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1714 ev->type = VIDEO_EVENT_DECODER_STOPPED;
1715 else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1716 ev->type = VIDEO_EVENT_VSYNC;
1717 ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1718 VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1719 if (itv->output_mode == OUT_UDMA_YUV &&
1720 (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1721 IVTV_YUV_MODE_PROGRESSIVE) {
1722 ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1723 }
1724 }
1725 if (ev->type)
1726 return 0;
1727 if (nonblocking)
1728 return -EAGAIN;
1729 /* Wait for event. Note that serialize_lock is locked,
1730 so to allow other processes to access the driver while
1731 we are waiting unlock first and later lock again. */
1732 mutex_unlock(&itv->serialize_lock);
1733 prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1734 if (!test_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags) &&
1735 !test_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags))
1736 schedule();
1737 finish_wait(&itv->event_waitq, &wait);
1738 mutex_lock(&itv->serialize_lock);
1739 if (signal_pending(current)) {
1740 /* return if a signal was received */
1741 IVTV_DEBUG_INFO("User stopped wait for event\n");
1742 return -EINTR;
1743 }
1744 }
1745 break;
1746 }
1747
1748 case VIDEO_SELECT_SOURCE:
1749 IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1750 if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1751 return -EINVAL;
1752 return ivtv_passthrough_mode(itv, iarg == VIDEO_SOURCE_DEMUX);
1753
1754 case AUDIO_SET_MUTE:
1755 IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1756 itv->speed_mute_audio = iarg;
1757 return 0;
1758
1759 case AUDIO_CHANNEL_SELECT:
1760 IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1761 if (iarg > AUDIO_STEREO_SWAPPED)
1762 return -EINVAL;
1763 itv->audio_stereo_mode = iarg;
1764 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1765 return 0;
1766
1767 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1768 IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1769 if (iarg > AUDIO_STEREO_SWAPPED)
1770 return -EINVAL;
1771 itv->audio_bilingual_mode = iarg;
1772 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
1773 return 0;
1774
1775 default:
1776 return -EINVAL;
1777 }
1778 return 0;
1779 }
1780
ivtv_default(struct file * file,void * fh,bool valid_prio,int cmd,void * arg)1781 static long ivtv_default(struct file *file, void *fh, bool valid_prio,
1782 int cmd, void *arg)
1783 {
1784 struct ivtv *itv = fh2id(fh)->itv;
1785
1786 if (!valid_prio) {
1787 switch (cmd) {
1788 case VIDEO_PLAY:
1789 case VIDEO_STOP:
1790 case VIDEO_FREEZE:
1791 case VIDEO_CONTINUE:
1792 case VIDEO_COMMAND:
1793 case VIDEO_SELECT_SOURCE:
1794 case AUDIO_SET_MUTE:
1795 case AUDIO_CHANNEL_SELECT:
1796 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1797 return -EBUSY;
1798 }
1799 }
1800
1801 switch (cmd) {
1802 case VIDIOC_INT_RESET: {
1803 u32 val = *(u32 *)arg;
1804
1805 if ((val == 0 && itv->options.newi2c) || (val & 0x01))
1806 ivtv_reset_ir_gpio(itv);
1807 if (val & 0x02)
1808 v4l2_subdev_call(itv->sd_video, core, reset, 0);
1809 break;
1810 }
1811
1812 case IVTV_IOC_DMA_FRAME:
1813 case VIDEO_GET_PTS:
1814 case VIDEO_GET_FRAME_COUNT:
1815 case VIDEO_GET_EVENT:
1816 case VIDEO_PLAY:
1817 case VIDEO_STOP:
1818 case VIDEO_FREEZE:
1819 case VIDEO_CONTINUE:
1820 case VIDEO_COMMAND:
1821 case VIDEO_TRY_COMMAND:
1822 case VIDEO_SELECT_SOURCE:
1823 case AUDIO_SET_MUTE:
1824 case AUDIO_CHANNEL_SELECT:
1825 case AUDIO_BILINGUAL_CHANNEL_SELECT:
1826 return ivtv_decoder_ioctls(file, cmd, (void *)arg);
1827
1828 default:
1829 return -EINVAL;
1830 }
1831 return 0;
1832 }
1833
ivtv_serialized_ioctl(struct ivtv * itv,struct file * filp,unsigned int cmd,unsigned long arg)1834 static long ivtv_serialized_ioctl(struct ivtv *itv, struct file *filp,
1835 unsigned int cmd, unsigned long arg)
1836 {
1837 struct video_device *vfd = video_devdata(filp);
1838 long ret;
1839
1840 if (ivtv_debug & IVTV_DBGFLG_IOCTL)
1841 vfd->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
1842 ret = video_ioctl2(filp, cmd, arg);
1843 vfd->debug = 0;
1844 return ret;
1845 }
1846
ivtv_v4l2_ioctl(struct file * filp,unsigned int cmd,unsigned long arg)1847 long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1848 {
1849 struct ivtv_open_id *id = fh2id(filp->private_data);
1850 struct ivtv *itv = id->itv;
1851 long res;
1852
1853 /* DQEVENT can block, so this should not run with the serialize lock */
1854 if (cmd == VIDIOC_DQEVENT)
1855 return ivtv_serialized_ioctl(itv, filp, cmd, arg);
1856 mutex_lock(&itv->serialize_lock);
1857 res = ivtv_serialized_ioctl(itv, filp, cmd, arg);
1858 mutex_unlock(&itv->serialize_lock);
1859 return res;
1860 }
1861
1862 static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1863 .vidioc_querycap = ivtv_querycap,
1864 .vidioc_s_audio = ivtv_s_audio,
1865 .vidioc_g_audio = ivtv_g_audio,
1866 .vidioc_enumaudio = ivtv_enumaudio,
1867 .vidioc_s_audout = ivtv_s_audout,
1868 .vidioc_g_audout = ivtv_g_audout,
1869 .vidioc_enum_input = ivtv_enum_input,
1870 .vidioc_enum_output = ivtv_enum_output,
1871 .vidioc_enumaudout = ivtv_enumaudout,
1872 .vidioc_cropcap = ivtv_cropcap,
1873 .vidioc_s_crop = ivtv_s_crop,
1874 .vidioc_g_crop = ivtv_g_crop,
1875 .vidioc_g_input = ivtv_g_input,
1876 .vidioc_s_input = ivtv_s_input,
1877 .vidioc_g_output = ivtv_g_output,
1878 .vidioc_s_output = ivtv_s_output,
1879 .vidioc_g_frequency = ivtv_g_frequency,
1880 .vidioc_s_frequency = ivtv_s_frequency,
1881 .vidioc_s_tuner = ivtv_s_tuner,
1882 .vidioc_g_tuner = ivtv_g_tuner,
1883 .vidioc_g_enc_index = ivtv_g_enc_index,
1884 .vidioc_g_fbuf = ivtv_g_fbuf,
1885 .vidioc_s_fbuf = ivtv_s_fbuf,
1886 .vidioc_g_std = ivtv_g_std,
1887 .vidioc_s_std = ivtv_s_std,
1888 .vidioc_overlay = ivtv_overlay,
1889 .vidioc_log_status = ivtv_log_status,
1890 .vidioc_enum_fmt_vid_cap = ivtv_enum_fmt_vid_cap,
1891 .vidioc_encoder_cmd = ivtv_encoder_cmd,
1892 .vidioc_try_encoder_cmd = ivtv_try_encoder_cmd,
1893 .vidioc_enum_fmt_vid_out = ivtv_enum_fmt_vid_out,
1894 .vidioc_g_fmt_vid_cap = ivtv_g_fmt_vid_cap,
1895 .vidioc_g_fmt_vbi_cap = ivtv_g_fmt_vbi_cap,
1896 .vidioc_g_fmt_sliced_vbi_cap = ivtv_g_fmt_sliced_vbi_cap,
1897 .vidioc_g_fmt_vid_out = ivtv_g_fmt_vid_out,
1898 .vidioc_g_fmt_vid_out_overlay = ivtv_g_fmt_vid_out_overlay,
1899 .vidioc_g_fmt_sliced_vbi_out = ivtv_g_fmt_sliced_vbi_out,
1900 .vidioc_s_fmt_vid_cap = ivtv_s_fmt_vid_cap,
1901 .vidioc_s_fmt_vbi_cap = ivtv_s_fmt_vbi_cap,
1902 .vidioc_s_fmt_sliced_vbi_cap = ivtv_s_fmt_sliced_vbi_cap,
1903 .vidioc_s_fmt_vid_out = ivtv_s_fmt_vid_out,
1904 .vidioc_s_fmt_vid_out_overlay = ivtv_s_fmt_vid_out_overlay,
1905 .vidioc_s_fmt_sliced_vbi_out = ivtv_s_fmt_sliced_vbi_out,
1906 .vidioc_try_fmt_vid_cap = ivtv_try_fmt_vid_cap,
1907 .vidioc_try_fmt_vbi_cap = ivtv_try_fmt_vbi_cap,
1908 .vidioc_try_fmt_sliced_vbi_cap = ivtv_try_fmt_sliced_vbi_cap,
1909 .vidioc_try_fmt_vid_out = ivtv_try_fmt_vid_out,
1910 .vidioc_try_fmt_vid_out_overlay = ivtv_try_fmt_vid_out_overlay,
1911 .vidioc_try_fmt_sliced_vbi_out = ivtv_try_fmt_sliced_vbi_out,
1912 .vidioc_g_sliced_vbi_cap = ivtv_g_sliced_vbi_cap,
1913 .vidioc_g_chip_ident = ivtv_g_chip_ident,
1914 #ifdef CONFIG_VIDEO_ADV_DEBUG
1915 .vidioc_g_register = ivtv_g_register,
1916 .vidioc_s_register = ivtv_s_register,
1917 #endif
1918 .vidioc_default = ivtv_default,
1919 .vidioc_subscribe_event = ivtv_subscribe_event,
1920 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1921 };
1922
ivtv_set_funcs(struct video_device * vdev)1923 void ivtv_set_funcs(struct video_device *vdev)
1924 {
1925 vdev->ioctl_ops = &ivtv_ioctl_ops;
1926 }
1927