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