brintos

brintos / linux-shallow public Read only

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