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