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