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