1/*
2    init/start/stop/exit stream functions
3    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
4    Copyright (C) 2004  Chris Kennedy <c@groovy.org>
5    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21
22/* License: GPL
23 * Author: Kevin Thayer <nufan_wfk at yahoo dot com>
24 *
25 * This file will hold API related functions, both internal (firmware api)
26 * and external (v4l2, etc)
27 *
28 * -----
29 * MPG600/MPG160 support by  T.Adachi <tadachi@tadachi-net.com>
30 *                      and Takeru KOMORIYA<komoriya@paken.org>
31 *
32 * AVerMedia M179 GPIO info by Chris Pinkham <cpinkham@bc2va.org>
33 *                using information provided by Jiun-Kuei Jung @ AVerMedia.
34 */
35
36#include "ivtv-driver.h"
37#include "ivtv-fileops.h"
38#include "ivtv-queue.h"
39#include "ivtv-mailbox.h"
40#include "ivtv-ioctl.h"
41#include "ivtv-irq.h"
42#include "ivtv-yuv.h"
43#include "ivtv-cards.h"
44#include "ivtv-streams.h"
45#include "ivtv-firmware.h"
46#include <media/v4l2-event.h>
47
48static const struct v4l2_file_operations ivtv_v4l2_enc_fops = {
49	.owner = THIS_MODULE,
50	.read = ivtv_v4l2_read,
51	.write = ivtv_v4l2_write,
52	.open = ivtv_v4l2_open,
53	.unlocked_ioctl = ivtv_v4l2_ioctl,
54	.release = ivtv_v4l2_close,
55	.poll = ivtv_v4l2_enc_poll,
56};
57
58static const struct v4l2_file_operations ivtv_v4l2_dec_fops = {
59	.owner = THIS_MODULE,
60	.read = ivtv_v4l2_read,
61	.write = ivtv_v4l2_write,
62	.open = ivtv_v4l2_open,
63	.unlocked_ioctl = ivtv_v4l2_ioctl,
64	.release = ivtv_v4l2_close,
65	.poll = ivtv_v4l2_dec_poll,
66};
67
68#define IVTV_V4L2_DEC_MPG_OFFSET  16	/* offset from 0 to register decoder mpg v4l2 minors on */
69#define IVTV_V4L2_ENC_PCM_OFFSET  24	/* offset from 0 to register pcm v4l2 minors on */
70#define IVTV_V4L2_ENC_YUV_OFFSET  32	/* offset from 0 to register yuv v4l2 minors on */
71#define IVTV_V4L2_DEC_YUV_OFFSET  48	/* offset from 0 to register decoder yuv v4l2 minors on */
72#define IVTV_V4L2_DEC_VBI_OFFSET   8	/* offset from 0 to register decoder vbi input v4l2 minors on */
73#define IVTV_V4L2_DEC_VOUT_OFFSET 16	/* offset from 0 to register vbi output v4l2 minors on */
74
75static struct {
76	const char *name;
77	int vfl_type;
78	int num_offset;
79	int dma, pio;
80	enum v4l2_buf_type buf_type;
81	u32 v4l2_caps;
82	const struct v4l2_file_operations *fops;
83} ivtv_stream_info[] = {
84	{	/* IVTV_ENC_STREAM_TYPE_MPG */
85		"encoder MPG",
86		VFL_TYPE_GRABBER, 0,
87		PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VIDEO_CAPTURE,
88		V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
89			V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
90		&ivtv_v4l2_enc_fops
91	},
92	{	/* IVTV_ENC_STREAM_TYPE_YUV */
93		"encoder YUV",
94		VFL_TYPE_GRABBER, IVTV_V4L2_ENC_YUV_OFFSET,
95		PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VIDEO_CAPTURE,
96		V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
97			V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
98		&ivtv_v4l2_enc_fops
99	},
100	{	/* IVTV_ENC_STREAM_TYPE_VBI */
101		"encoder VBI",
102		VFL_TYPE_VBI, 0,
103		PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VBI_CAPTURE,
104		V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_CAPTURE | V4L2_CAP_TUNER |
105			V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
106		&ivtv_v4l2_enc_fops
107	},
108	{	/* IVTV_ENC_STREAM_TYPE_PCM */
109		"encoder PCM",
110		VFL_TYPE_GRABBER, IVTV_V4L2_ENC_PCM_OFFSET,
111		PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_PRIVATE,
112		V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
113		&ivtv_v4l2_enc_fops
114	},
115	{	/* IVTV_ENC_STREAM_TYPE_RAD */
116		"encoder radio",
117		VFL_TYPE_RADIO, 0,
118		PCI_DMA_NONE, 1, V4L2_BUF_TYPE_PRIVATE,
119		V4L2_CAP_RADIO | V4L2_CAP_TUNER,
120		&ivtv_v4l2_enc_fops
121	},
122	{	/* IVTV_DEC_STREAM_TYPE_MPG */
123		"decoder MPG",
124		VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET,
125		PCI_DMA_TODEVICE, 0, V4L2_BUF_TYPE_VIDEO_OUTPUT,
126		V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
127		&ivtv_v4l2_dec_fops
128	},
129	{	/* IVTV_DEC_STREAM_TYPE_VBI */
130		"decoder VBI",
131		VFL_TYPE_VBI, IVTV_V4L2_DEC_VBI_OFFSET,
132		PCI_DMA_NONE, 1, V4L2_BUF_TYPE_VBI_CAPTURE,
133		V4L2_CAP_SLICED_VBI_CAPTURE | V4L2_CAP_READWRITE,
134		&ivtv_v4l2_enc_fops
135	},
136	{	/* IVTV_DEC_STREAM_TYPE_VOUT */
137		"decoder VOUT",
138		VFL_TYPE_VBI, IVTV_V4L2_DEC_VOUT_OFFSET,
139		PCI_DMA_NONE, 1, V4L2_BUF_TYPE_VBI_OUTPUT,
140		V4L2_CAP_SLICED_VBI_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
141		&ivtv_v4l2_dec_fops
142	},
143	{	/* IVTV_DEC_STREAM_TYPE_YUV */
144		"decoder YUV",
145		VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET,
146		PCI_DMA_TODEVICE, 0, V4L2_BUF_TYPE_VIDEO_OUTPUT,
147		V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
148		&ivtv_v4l2_dec_fops
149	}
150};
151
152static void ivtv_stream_init(struct ivtv *itv, int type)
153{
154	struct ivtv_stream *s = &itv->streams[type];
155	struct video_device *vdev = s->vdev;
156
157	/* we need to keep vdev, so restore it afterwards */
158	memset(s, 0, sizeof(*s));
159	s->vdev = vdev;
160
161	/* initialize ivtv_stream fields */
162	s->itv = itv;
163	s->type = type;
164	s->name = ivtv_stream_info[type].name;
165	s->caps = ivtv_stream_info[type].v4l2_caps;
166
167	if (ivtv_stream_info[type].pio)
168		s->dma = PCI_DMA_NONE;
169	else
170		s->dma = ivtv_stream_info[type].dma;
171	s->buf_size = itv->stream_buf_size[type];
172	if (s->buf_size)
173		s->buffers = (itv->options.kilobytes[type] * 1024 + s->buf_size - 1) / s->buf_size;
174	spin_lock_init(&s->qlock);
175	init_waitqueue_head(&s->waitq);
176	s->sg_handle = IVTV_DMA_UNMAPPED;
177	ivtv_queue_init(&s->q_free);
178	ivtv_queue_init(&s->q_full);
179	ivtv_queue_init(&s->q_dma);
180	ivtv_queue_init(&s->q_predma);
181	ivtv_queue_init(&s->q_io);
182}
183
184static int ivtv_prep_dev(struct ivtv *itv, int type)
185{
186	struct ivtv_stream *s = &itv->streams[type];
187	int num_offset = ivtv_stream_info[type].num_offset;
188	int num = itv->instance + ivtv_first_minor + num_offset;
189
190	/* These four fields are always initialized. If vdev == NULL, then
191	   this stream is not in use. In that case no other fields but these
192	   four can be used. */
193	s->vdev = NULL;
194	s->itv = itv;
195	s->type = type;
196	s->name = ivtv_stream_info[type].name;
197
198	/* Check whether the radio is supported */
199	if (type == IVTV_ENC_STREAM_TYPE_RAD && !(itv->v4l2_cap & V4L2_CAP_RADIO))
200		return 0;
201	if (type >= IVTV_DEC_STREAM_TYPE_MPG && !(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
202		return 0;
203
204	/* User explicitly selected 0 buffers for these streams, so don't
205	   create them. */
206	if (ivtv_stream_info[type].dma != PCI_DMA_NONE &&
207	    itv->options.kilobytes[type] == 0) {
208		IVTV_INFO("Disabled %s device\n", ivtv_stream_info[type].name);
209		return 0;
210	}
211
212	ivtv_stream_init(itv, type);
213
214	/* allocate and initialize the v4l2 video device structure */
215	s->vdev = video_device_alloc();
216	if (s->vdev == NULL) {
217		IVTV_ERR("Couldn't allocate v4l2 video_device for %s\n", s->name);
218		return -ENOMEM;
219	}
220
221	snprintf(s->vdev->name, sizeof(s->vdev->name), "%s %s",
222			itv->v4l2_dev.name, s->name);
223
224	s->vdev->num = num;
225	s->vdev->v4l2_dev = &itv->v4l2_dev;
226	s->vdev->fops = ivtv_stream_info[type].fops;
227	s->vdev->ctrl_handler = itv->v4l2_dev.ctrl_handler;
228	s->vdev->release = video_device_release;
229	s->vdev->tvnorms = V4L2_STD_ALL;
230	s->vdev->lock = &itv->serialize_lock;
231	set_bit(V4L2_FL_USE_FH_PRIO, &s->vdev->flags);
232	ivtv_set_funcs(s->vdev);
233	return 0;
234}
235
236/* Initialize v4l2 variables and prepare v4l2 devices */
237int ivtv_streams_setup(struct ivtv *itv)
238{
239	int type;
240
241	/* Setup V4L2 Devices */
242	for (type = 0; type < IVTV_MAX_STREAMS; type++) {
243		/* Prepare device */
244		if (ivtv_prep_dev(itv, type))
245			break;
246
247		if (itv->streams[type].vdev == NULL)
248			continue;
249
250		/* Allocate Stream */
251		if (ivtv_stream_alloc(&itv->streams[type]))
252			break;
253	}
254	if (type == IVTV_MAX_STREAMS)
255		return 0;
256
257	/* One or more streams could not be initialized. Clean 'em all up. */
258	ivtv_streams_cleanup(itv, 0);
259	return -ENOMEM;
260}
261
262static int ivtv_reg_dev(struct ivtv *itv, int type)
263{
264	struct ivtv_stream *s = &itv->streams[type];
265	int vfl_type = ivtv_stream_info[type].vfl_type;
266	const char *name;
267	int num;
268
269	if (s->vdev == NULL)
270		return 0;
271
272	num = s->vdev->num;
273	/* card number + user defined offset + device offset */
274	if (type != IVTV_ENC_STREAM_TYPE_MPG) {
275		struct ivtv_stream *s_mpg = &itv->streams[IVTV_ENC_STREAM_TYPE_MPG];
276
277		if (s_mpg->vdev)
278			num = s_mpg->vdev->num + ivtv_stream_info[type].num_offset;
279	}
280	video_set_drvdata(s->vdev, s);
281
282	/* Register device. First try the desired minor, then any free one. */
283	if (video_register_device_no_warn(s->vdev, vfl_type, num)) {
284		IVTV_ERR("Couldn't register v4l2 device for %s (device node number %d)\n",
285				s->name, num);
286		video_device_release(s->vdev);
287		s->vdev = NULL;
288		return -ENOMEM;
289	}
290	name = video_device_node_name(s->vdev);
291
292	switch (vfl_type) {
293	case VFL_TYPE_GRABBER:
294		IVTV_INFO("Registered device %s for %s (%d kB)\n",
295			name, s->name, itv->options.kilobytes[type]);
296		break;
297	case VFL_TYPE_RADIO:
298		IVTV_INFO("Registered device %s for %s\n",
299			name, s->name);
300		break;
301	case VFL_TYPE_VBI:
302		if (itv->options.kilobytes[type])
303			IVTV_INFO("Registered device %s for %s (%d kB)\n",
304				name, s->name, itv->options.kilobytes[type]);
305		else
306			IVTV_INFO("Registered device %s for %s\n",
307				name, s->name);
308		break;
309	}
310	return 0;
311}
312
313/* Register v4l2 devices */
314int ivtv_streams_register(struct ivtv *itv)
315{
316	int type;
317	int err = 0;
318
319	/* Register V4L2 devices */
320	for (type = 0; type < IVTV_MAX_STREAMS; type++)
321		err |= ivtv_reg_dev(itv, type);
322
323	if (err == 0)
324		return 0;
325
326	/* One or more streams could not be initialized. Clean 'em all up. */
327	ivtv_streams_cleanup(itv, 1);
328	return -ENOMEM;
329}
330
331/* Unregister v4l2 devices */
332void ivtv_streams_cleanup(struct ivtv *itv, int unregister)
333{
334	int type;
335
336	/* Teardown all streams */
337	for (type = 0; type < IVTV_MAX_STREAMS; type++) {
338		struct video_device *vdev = itv->streams[type].vdev;
339
340		itv->streams[type].vdev = NULL;
341		if (vdev == NULL)
342			continue;
343
344		ivtv_stream_free(&itv->streams[type]);
345		/* Unregister or release device */
346		if (unregister)
347			video_unregister_device(vdev);
348		else
349			video_device_release(vdev);
350	}
351}
352
353static void ivtv_vbi_setup(struct ivtv *itv)
354{
355	int raw = ivtv_raw_vbi(itv);
356	u32 data[CX2341X_MBOX_MAX_DATA];
357	int lines;
358	int i;
359
360	/* Reset VBI */
361	ivtv_vapi(itv, CX2341X_ENC_SET_VBI_LINE, 5, 0xffff , 0, 0, 0, 0);
362
363	/* setup VBI registers */
364	if (raw)
365		v4l2_subdev_call(itv->sd_video, vbi, s_raw_fmt, &itv->vbi.in.fmt.vbi);
366	else
367		v4l2_subdev_call(itv->sd_video, vbi, s_sliced_fmt, &itv->vbi.in.fmt.sliced);
368
369	/* determine number of lines and total number of VBI bytes.
370	   A raw line takes 1443 bytes: 2 * 720 + 4 byte frame header - 1
371	   The '- 1' byte is probably an unused U or V byte. Or something...
372	   A sliced line takes 51 bytes: 4 byte frame header, 4 byte internal
373	   header, 42 data bytes + checksum (to be confirmed) */
374	if (raw) {
375		lines = itv->vbi.count * 2;
376	} else {
377		lines = itv->is_60hz ? 24 : 38;
378		if (itv->is_60hz && (itv->hw_flags & IVTV_HW_CX25840))
379			lines += 2;
380	}
381
382	itv->vbi.enc_size = lines * (raw ? itv->vbi.raw_size : itv->vbi.sliced_size);
383
384	/* Note: sliced vs raw flag doesn't seem to have any effect
385	   TODO: check mode (0x02) value with older ivtv versions. */
386	data[0] = raw | 0x02 | (0xbd << 8);
387
388	/* Every X number of frames a VBI interrupt arrives (frames as in 25 or 30 fps) */
389	data[1] = 1;
390	/* The VBI frames are stored in a ringbuffer with this size (with a VBI frame as unit) */
391	data[2] = raw ? 4 : 4 * (itv->vbi.raw_size / itv->vbi.enc_size);
392	/* The start/stop codes determine which VBI lines end up in the raw VBI data area.
393	   The codes are from table 24 in the saa7115 datasheet. Each raw/sliced/video line
394	   is framed with codes FF0000XX where XX is the SAV/EAV (Start/End of Active Video)
395	   code. These values for raw VBI are obtained from a driver disassembly. The sliced
396	   start/stop codes was deduced from this, but they do not appear in the driver.
397	   Other code pairs that I found are: 0x250E6249/0x13545454 and 0x25256262/0x38137F54.
398	   However, I have no idea what these values are for. */
399	if (itv->hw_flags & IVTV_HW_CX25840) {
400		/* Setup VBI for the cx25840 digitizer */
401		if (raw) {
402			data[3] = 0x20602060;
403			data[4] = 0x30703070;
404		} else {
405			data[3] = 0xB0F0B0F0;
406			data[4] = 0xA0E0A0E0;
407		}
408		/* Lines per frame */
409		data[5] = lines;
410		/* bytes per line */
411		data[6] = (raw ? itv->vbi.raw_size : itv->vbi.sliced_size);
412	} else {
413		/* Setup VBI for the saa7115 digitizer */
414		if (raw) {
415			data[3] = 0x25256262;
416			data[4] = 0x387F7F7F;
417		} else {
418			data[3] = 0xABABECEC;
419			data[4] = 0xB6F1F1F1;
420		}
421		/* Lines per frame */
422		data[5] = lines;
423		/* bytes per line */
424		data[6] = itv->vbi.enc_size / lines;
425	}
426
427	IVTV_DEBUG_INFO(
428		"Setup VBI API header 0x%08x pkts %d buffs %d ln %d sz %d\n",
429			data[0], data[1], data[2], data[5], data[6]);
430
431	ivtv_api(itv, CX2341X_ENC_SET_VBI_CONFIG, 7, data);
432
433	/* returns the VBI encoder memory area. */
434	itv->vbi.enc_start = data[2];
435	itv->vbi.fpi = data[0];
436	if (!itv->vbi.fpi)
437		itv->vbi.fpi = 1;
438
439	IVTV_DEBUG_INFO("Setup VBI start 0x%08x frames %d fpi %d\n",
440		itv->vbi.enc_start, data[1], itv->vbi.fpi);
441
442	/* select VBI lines.
443	   Note that the sliced argument seems to have no effect. */
444	for (i = 2; i <= 24; i++) {
445		int valid;
446
447		if (itv->is_60hz) {
448			valid = i >= 10 && i < 22;
449		} else {
450			valid = i >= 6 && i < 24;
451		}
452		ivtv_vapi(itv, CX2341X_ENC_SET_VBI_LINE, 5, i - 1,
453				valid, 0 , 0, 0);
454		ivtv_vapi(itv, CX2341X_ENC_SET_VBI_LINE, 5, (i - 1) | 0x80000000,
455				valid, 0, 0, 0);
456	}
457
458	/* Remaining VBI questions:
459	   - Is it possible to select particular VBI lines only for inclusion in the MPEG
460	   stream? Currently you can only get the first X lines.
461	   - Is mixed raw and sliced VBI possible?
462	   - What's the meaning of the raw/sliced flag?
463	   - What's the meaning of params 2, 3 & 4 of the Select VBI command? */
464}
465
466int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s)
467{
468	u32 data[CX2341X_MBOX_MAX_DATA];
469	struct ivtv *itv = s->itv;
470	int captype = 0, subtype = 0;
471	int enable_passthrough = 0;
472
473	if (s->vdev == NULL)
474		return -EINVAL;
475
476	IVTV_DEBUG_INFO("Start encoder stream %s\n", s->name);
477
478	switch (s->type) {
479	case IVTV_ENC_STREAM_TYPE_MPG:
480		captype = 0;
481		subtype = 3;
482
483		/* Stop Passthrough */
484		if (itv->output_mode == OUT_PASSTHROUGH) {
485			ivtv_passthrough_mode(itv, 0);
486			enable_passthrough = 1;
487		}
488		itv->mpg_data_received = itv->vbi_data_inserted = 0;
489		itv->dualwatch_jiffies = jiffies;
490		itv->dualwatch_stereo_mode = v4l2_ctrl_g_ctrl(itv->cxhdl.audio_mode);
491		itv->search_pack_header = 0;
492		break;
493
494	case IVTV_ENC_STREAM_TYPE_YUV:
495		if (itv->output_mode == OUT_PASSTHROUGH) {
496			captype = 2;
497			subtype = 11;	/* video+audio+decoder */
498			break;
499		}
500		captype = 1;
501		subtype = 1;
502		break;
503	case IVTV_ENC_STREAM_TYPE_PCM:
504		captype = 1;
505		subtype = 2;
506		break;
507	case IVTV_ENC_STREAM_TYPE_VBI:
508		captype = 1;
509		subtype = 4;
510
511		itv->vbi.frame = 0;
512		itv->vbi.inserted_frame = 0;
513		memset(itv->vbi.sliced_mpeg_size,
514			0, sizeof(itv->vbi.sliced_mpeg_size));
515		break;
516	default:
517		return -EINVAL;
518	}
519	s->subtype = subtype;
520	s->buffers_stolen = 0;
521
522	/* Clear Streamoff flags in case left from last capture */
523	clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
524
525	if (atomic_read(&itv->capturing) == 0) {
526		int digitizer;
527
528		/* Always use frame based mode. Experiments have demonstrated that byte
529		   stream based mode results in dropped frames and corruption. Not often,
530		   but occasionally. Many thanks go to Leonard Orb who spent a lot of
531		   effort and time trying to trace the cause of the drop outs. */
532		/* 1 frame per DMA */
533		/*ivtv_vapi(itv, CX2341X_ENC_SET_DMA_BLOCK_SIZE, 2, 128, 0); */
534		ivtv_vapi(itv, CX2341X_ENC_SET_DMA_BLOCK_SIZE, 2, 1, 1);
535
536		/* Stuff from Windows, we don't know what it is */
537		ivtv_vapi(itv, CX2341X_ENC_SET_VERT_CROP_LINE, 1, 0);
538		/* According to the docs, this should be correct. However, this is
539		   untested. I don't dare enable this without having tested it.
540		   Only very few old cards actually have this hardware combination.
541		ivtv_vapi(itv, CX2341X_ENC_SET_VERT_CROP_LINE, 1,
542			((itv->hw_flags & IVTV_HW_SAA7114) && itv->is_60hz) ? 10001 : 0);
543		*/
544		ivtv_vapi(itv, CX2341X_ENC_MISC, 2, 3, !itv->has_cx23415);
545		ivtv_vapi(itv, CX2341X_ENC_MISC, 2, 8, 0);
546		ivtv_vapi(itv, CX2341X_ENC_MISC, 2, 4, 1);
547		ivtv_vapi(itv, CX2341X_ENC_MISC, 1, 12);
548
549		/* assign placeholder */
550		ivtv_vapi(itv, CX2341X_ENC_SET_PLACEHOLDER, 12,
551			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
552
553		if (itv->card->hw_all & (IVTV_HW_SAA7115 | IVTV_HW_SAA717X))
554		    digitizer = 0xF1;
555		else if (itv->card->hw_all & IVTV_HW_SAA7114)
556		    digitizer = 0xEF;
557		else /* cx25840 */
558		    digitizer = 0x140;
559
560		ivtv_vapi(itv, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, digitizer, digitizer);
561
562		/* Setup VBI */
563		if (itv->v4l2_cap & V4L2_CAP_VBI_CAPTURE) {
564			ivtv_vbi_setup(itv);
565		}
566
567		/* assign program index info. Mask 7: select I/P/B, Num_req: 400 max */
568		ivtv_vapi_result(itv, data, CX2341X_ENC_SET_PGM_INDEX_INFO, 2, 7, 400);
569		itv->pgm_info_offset = data[0];
570		itv->pgm_info_num = data[1];
571		itv->pgm_info_write_idx = 0;
572		itv->pgm_info_read_idx = 0;
573
574		IVTV_DEBUG_INFO("PGM Index at 0x%08x with %d elements\n",
575				itv->pgm_info_offset, itv->pgm_info_num);
576
577		/* Setup API for Stream */
578		cx2341x_handler_setup(&itv->cxhdl);
579
580		/* mute if capturing radio */
581		if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
582			ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1,
583				1 | (v4l2_ctrl_g_ctrl(itv->cxhdl.video_mute_yuv) << 8));
584	}
585
586	/* Vsync Setup */
587	if (itv->has_cx23415 && !test_and_set_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) {
588		/* event notification (on) */
589		ivtv_vapi(itv, CX2341X_ENC_SET_EVENT_NOTIFICATION, 4, 0, 1, IVTV_IRQ_ENC_VIM_RST, -1);
590		ivtv_clear_irq_mask(itv, IVTV_IRQ_ENC_VIM_RST);
591	}
592
593	if (atomic_read(&itv->capturing) == 0) {
594		/* Clear all Pending Interrupts */
595		ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
596
597		clear_bit(IVTV_F_I_EOS, &itv->i_flags);
598
599		cx2341x_handler_set_busy(&itv->cxhdl, 1);
600
601		/* Initialize Digitizer for Capture */
602		/* Avoid tinny audio problem - ensure audio clocks are going */
603		v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1);
604		/* Avoid unpredictable PCI bus hang - disable video clocks */
605		v4l2_subdev_call(itv->sd_video, video, s_stream, 0);
606		ivtv_msleep_timeout(300, 0);
607		ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0);
608		v4l2_subdev_call(itv->sd_video, video, s_stream, 1);
609	}
610
611	/* begin_capture */
612	if (ivtv_vapi(itv, CX2341X_ENC_START_CAPTURE, 2, captype, subtype))
613	{
614		IVTV_DEBUG_WARN( "Error starting capture!\n");
615		return -EINVAL;
616	}
617
618	/* Start Passthrough */
619	if (enable_passthrough) {
620		ivtv_passthrough_mode(itv, 1);
621	}
622
623	if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
624		ivtv_clear_irq_mask(itv, IVTV_IRQ_ENC_VBI_CAP);
625	else
626		ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
627
628	/* you're live! sit back and await interrupts :) */
629	atomic_inc(&itv->capturing);
630	return 0;
631}
632
633static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s)
634{
635	u32 data[CX2341X_MBOX_MAX_DATA];
636	struct ivtv *itv = s->itv;
637	int datatype;
638	u16 width;
639	u16 height;
640
641	if (s->vdev == NULL)
642		return -EINVAL;
643
644	IVTV_DEBUG_INFO("Setting some initial decoder settings\n");
645
646	width = itv->cxhdl.width;
647	height = itv->cxhdl.height;
648
649	/* set audio mode to left/stereo  for dual/stereo mode. */
650	ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
651
652	/* set number of internal decoder buffers */
653	ivtv_vapi(itv, CX2341X_DEC_SET_DISPLAY_BUFFERS, 1, 0);
654
655	/* prebuffering */
656	ivtv_vapi(itv, CX2341X_DEC_SET_PREBUFFERING, 1, 1);
657
658	/* extract from user packets */
659	ivtv_vapi_result(itv, data, CX2341X_DEC_EXTRACT_VBI, 1, 1);
660	itv->vbi.dec_start = data[0];
661
662	IVTV_DEBUG_INFO("Decoder VBI RE-Insert start 0x%08x size 0x%08x\n",
663		itv->vbi.dec_start, data[1]);
664
665	/* set decoder source settings */
666	/* Data type: 0 = mpeg from host,
667	   1 = yuv from encoder,
668	   2 = yuv_from_host */
669	switch (s->type) {
670	case IVTV_DEC_STREAM_TYPE_YUV:
671		if (itv->output_mode == OUT_PASSTHROUGH) {
672			datatype = 1;
673		} else {
674			/* Fake size to avoid switching video standard */
675			datatype = 2;
676			width = 720;
677			height = itv->is_out_50hz ? 576 : 480;
678		}
679		IVTV_DEBUG_INFO("Setup DEC YUV Stream data[0] = %d\n", datatype);
680		break;
681	case IVTV_DEC_STREAM_TYPE_MPG:
682	default:
683		datatype = 0;
684		break;
685	}
686	if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype,
687			width, height, itv->cxhdl.audio_properties)) {
688		IVTV_DEBUG_WARN("Couldn't initialize decoder source\n");
689	}
690
691	/* Decoder sometimes dies here, so wait a moment */
692	ivtv_msleep_timeout(10, 0);
693
694	/* Known failure point for firmware, so check */
695	return ivtv_firmware_check(itv, "ivtv_setup_v4l2_decode_stream");
696}
697
698int ivtv_start_v4l2_decode_stream(struct ivtv_stream *s, int gop_offset)
699{
700	struct ivtv *itv = s->itv;
701	int rc;
702
703	if (s->vdev == NULL)
704		return -EINVAL;
705
706	if (test_and_set_bit(IVTV_F_S_STREAMING, &s->s_flags))
707		return 0;	/* already started */
708
709	IVTV_DEBUG_INFO("Starting decode stream %s (gop_offset %d)\n", s->name, gop_offset);
710
711	rc = ivtv_setup_v4l2_decode_stream(s);
712	if (rc < 0) {
713		clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
714		return rc;
715	}
716
717	/* set dma size to 65536 bytes */
718	ivtv_vapi(itv, CX2341X_DEC_SET_DMA_BLOCK_SIZE, 1, 65536);
719
720	/* Clear Streamoff */
721	clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
722
723	/* Zero out decoder counters */
724	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[0]);
725	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[1]);
726	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[2]);
727	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[3]);
728	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[0]);
729	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[1]);
730	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[2]);
731	writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[3]);
732
733	/* turn on notification of dual/stereo mode change */
734	ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 1, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
735
736	/* start playback */
737	ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, gop_offset, 0);
738
739	/* Let things settle before we actually start */
740	ivtv_msleep_timeout(10, 0);
741
742	/* Clear the following Interrupt mask bits for decoding */
743	ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
744	IVTV_DEBUG_IRQ("IRQ Mask is now: 0x%08x\n", itv->irqmask);
745
746	/* you're live! sit back and await interrupts :) */
747	atomic_inc(&itv->decoding);
748	return 0;
749}
750
751void ivtv_stop_all_captures(struct ivtv *itv)
752{
753	int i;
754
755	for (i = IVTV_MAX_STREAMS - 1; i >= 0; i--) {
756		struct ivtv_stream *s = &itv->streams[i];
757
758		if (s->vdev == NULL)
759			continue;
760		if (test_bit(IVTV_F_S_STREAMING, &s->s_flags)) {
761			ivtv_stop_v4l2_encode_stream(s, 0);
762		}
763	}
764}
765
766int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
767{
768	struct ivtv *itv = s->itv;
769	DECLARE_WAITQUEUE(wait, current);
770	int cap_type;
771	int stopmode;
772
773	if (s->vdev == NULL)
774		return -EINVAL;
775
776	/* This function assumes that you are allowed to stop the capture
777	   and that we are actually capturing */
778
779	IVTV_DEBUG_INFO("Stop Capture\n");
780
781	if (s->type == IVTV_DEC_STREAM_TYPE_VOUT)
782		return 0;
783	if (atomic_read(&itv->capturing) == 0)
784		return 0;
785
786	switch (s->type) {
787	case IVTV_ENC_STREAM_TYPE_YUV:
788		cap_type = 1;
789		break;
790	case IVTV_ENC_STREAM_TYPE_PCM:
791		cap_type = 1;
792		break;
793	case IVTV_ENC_STREAM_TYPE_VBI:
794		cap_type = 1;
795		break;
796	case IVTV_ENC_STREAM_TYPE_MPG:
797	default:
798		cap_type = 0;
799		break;
800	}
801
802	/* Stop Capture Mode */
803	if (s->type == IVTV_ENC_STREAM_TYPE_MPG && gop_end) {
804		stopmode = 0;
805	} else {
806		stopmode = 1;
807	}
808
809	/* end_capture */
810	/* when: 0 =  end of GOP  1 = NOW!, type: 0 = mpeg, subtype: 3 = video+audio */
811	ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, stopmode, cap_type, s->subtype);
812
813	if (!test_bit(IVTV_F_S_PASSTHROUGH, &s->s_flags)) {
814		if (s->type == IVTV_ENC_STREAM_TYPE_MPG && gop_end) {
815			/* only run these if we're shutting down the last cap */
816			unsigned long duration;
817			unsigned long then = jiffies;
818
819			add_wait_queue(&itv->eos_waitq, &wait);
820
821			set_current_state(TASK_INTERRUPTIBLE);
822
823			/* wait 2s for EOS interrupt */
824			while (!test_bit(IVTV_F_I_EOS, &itv->i_flags) &&
825				time_before(jiffies,
826					    then + msecs_to_jiffies(2000))) {
827				schedule_timeout(msecs_to_jiffies(10));
828			}
829
830			/* To convert jiffies to ms, we must multiply by 1000
831			 * and divide by HZ.  To avoid runtime division, we
832			 * convert this to multiplication by 1000/HZ.
833			 * Since integer division truncates, we get the best
834			 * accuracy if we do a rounding calculation of the constant.
835			 * Think of the case where HZ is 1024.
836			 */
837			duration = ((1000 + HZ / 2) / HZ) * (jiffies - then);
838
839			if (!test_bit(IVTV_F_I_EOS, &itv->i_flags)) {
840				IVTV_DEBUG_WARN("%s: EOS interrupt not received! stopping anyway.\n", s->name);
841				IVTV_DEBUG_WARN("%s: waited %lu ms.\n", s->name, duration);
842			} else {
843				IVTV_DEBUG_INFO("%s: EOS took %lu ms to occur.\n", s->name, duration);
844			}
845			set_current_state(TASK_RUNNING);
846			remove_wait_queue(&itv->eos_waitq, &wait);
847			set_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
848		}
849
850		/* Handle any pending interrupts */
851		ivtv_msleep_timeout(100, 0);
852	}
853
854	atomic_dec(&itv->capturing);
855
856	/* Clear capture and no-read bits */
857	clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
858
859	if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
860		ivtv_set_irq_mask(itv, IVTV_IRQ_ENC_VBI_CAP);
861
862	if (atomic_read(&itv->capturing) > 0) {
863		return 0;
864	}
865
866	cx2341x_handler_set_busy(&itv->cxhdl, 0);
867
868	/* Set the following Interrupt mask bits for capture */
869	ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
870	del_timer(&itv->dma_timer);
871
872	/* event notification (off) */
873	if (test_and_clear_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) {
874		/* type: 0 = refresh */
875		/* on/off: 0 = off, intr: 0x10000000, mbox_id: -1: none */
876		ivtv_vapi(itv, CX2341X_ENC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_ENC_VIM_RST, -1);
877		ivtv_set_irq_mask(itv, IVTV_IRQ_ENC_VIM_RST);
878	}
879
880	/* Raw-passthrough is implied on start. Make sure it's stopped so
881	   the encoder will re-initialize when next started */
882	ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, 1, 2, 7);
883
884	wake_up(&s->waitq);
885
886	return 0;
887}
888
889int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts)
890{
891	static const struct v4l2_event ev = {
892		.type = V4L2_EVENT_EOS,
893	};
894	struct ivtv *itv = s->itv;
895
896	if (s->vdev == NULL)
897		return -EINVAL;
898
899	if (s->type != IVTV_DEC_STREAM_TYPE_YUV && s->type != IVTV_DEC_STREAM_TYPE_MPG)
900		return -EINVAL;
901
902	if (!test_bit(IVTV_F_S_STREAMING, &s->s_flags))
903		return 0;
904
905	IVTV_DEBUG_INFO("Stop Decode at %llu, flags: %x\n", (unsigned long long)pts, flags);
906
907	/* Stop Decoder */
908	if (!(flags & V4L2_DEC_CMD_STOP_IMMEDIATELY) || pts) {
909		u32 tmp = 0;
910
911		/* Wait until the decoder is no longer running */
912		if (pts) {
913			ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3,
914				0, (u32)(pts & 0xffffffff), (u32)(pts >> 32));
915		}
916		while (1) {
917			u32 data[CX2341X_MBOX_MAX_DATA];
918			ivtv_vapi_result(itv, data, CX2341X_DEC_GET_XFER_INFO, 0);
919			if (s->q_full.buffers + s->q_dma.buffers == 0) {
920				if (tmp == data[3])
921					break;
922				tmp = data[3];
923			}
924			if (ivtv_msleep_timeout(100, 1))
925				break;
926		}
927	}
928	ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3, flags & V4L2_DEC_CMD_STOP_TO_BLACK, 0, 0);
929
930	/* turn off notification of dual/stereo mode change */
931	ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
932
933	ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
934	del_timer(&itv->dma_timer);
935
936	clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
937	clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
938	ivtv_flush_queues(s);
939
940	/* decoder needs time to settle */
941	ivtv_msleep_timeout(40, 0);
942
943	/* decrement decoding */
944	atomic_dec(&itv->decoding);
945
946	set_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags);
947	wake_up(&itv->event_waitq);
948	v4l2_event_queue(s->vdev, &ev);
949
950	/* wake up wait queues */
951	wake_up(&s->waitq);
952
953	return 0;
954}
955
956int ivtv_passthrough_mode(struct ivtv *itv, int enable)
957{
958	struct ivtv_stream *yuv_stream = &itv->streams[IVTV_ENC_STREAM_TYPE_YUV];
959	struct ivtv_stream *dec_stream = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
960
961	if (yuv_stream->vdev == NULL || dec_stream->vdev == NULL)
962		return -EINVAL;
963
964	IVTV_DEBUG_INFO("ivtv ioctl: Select passthrough mode\n");
965
966	/* Prevent others from starting/stopping streams while we
967	   initiate/terminate passthrough mode */
968	if (enable) {
969		if (itv->output_mode == OUT_PASSTHROUGH) {
970			return 0;
971		}
972		if (ivtv_set_output_mode(itv, OUT_PASSTHROUGH) != OUT_PASSTHROUGH)
973			return -EBUSY;
974
975		/* Fully initialize stream, and then unflag init */
976		set_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags);
977		set_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags);
978
979		/* Setup YUV Decoder */
980		ivtv_setup_v4l2_decode_stream(dec_stream);
981
982		/* Start Decoder */
983		ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, 0, 1);
984		atomic_inc(&itv->decoding);
985
986		/* Setup capture if not already done */
987		if (atomic_read(&itv->capturing) == 0) {
988			cx2341x_handler_setup(&itv->cxhdl);
989			cx2341x_handler_set_busy(&itv->cxhdl, 1);
990		}
991
992		/* Start Passthrough Mode */
993		ivtv_vapi(itv, CX2341X_ENC_START_CAPTURE, 2, 2, 11);
994		atomic_inc(&itv->capturing);
995		return 0;
996	}
997
998	if (itv->output_mode != OUT_PASSTHROUGH)
999		return 0;
1000
1001	/* Stop Passthrough Mode */
1002	ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, 1, 2, 11);
1003	ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3, 1, 0, 0);
1004
1005	atomic_dec(&itv->capturing);
1006	atomic_dec(&itv->decoding);
1007	clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags);
1008	clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags);
1009	itv->output_mode = OUT_NONE;
1010	if (atomic_read(&itv->capturing) == 0)
1011		cx2341x_handler_set_busy(&itv->cxhdl, 0);
1012
1013	return 0;
1014}
1015