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->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->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, &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->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->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->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