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