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