blob: de4288cc188933d6e4100fb162dcab9099a14238 [file] [log] [blame]
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001/*
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"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030038#include "ivtv-queue.h"
39#include "ivtv-mailbox.h"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030040#include "ivtv-ioctl.h"
Hans Verkuil33c0fca2007-08-23 06:32:46 -030041#include "ivtv-irq.h"
Hans Verkuil612570f2007-08-23 05:42:59 -030042#include "ivtv-yuv.h"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030043#include "ivtv-cards.h"
Hans Verkuil612570f2007-08-23 05:42:59 -030044#include "ivtv-streams.h"
Hans Verkuil09250192010-03-27 14:10:13 -030045#include <media/v4l2-event.h>
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030046
Hans Verkuilbec43662008-12-30 06:58:20 -030047static const struct v4l2_file_operations ivtv_v4l2_enc_fops = {
Hans Verkuildaf20d92008-05-12 11:21:58 -030048 .owner = THIS_MODULE,
49 .read = ivtv_v4l2_read,
50 .write = ivtv_v4l2_write,
51 .open = ivtv_v4l2_open,
Hans Verkuil09882f02008-10-18 13:42:24 -030052 .unlocked_ioctl = ivtv_v4l2_ioctl,
Hans Verkuildaf20d92008-05-12 11:21:58 -030053 .release = ivtv_v4l2_close,
54 .poll = ivtv_v4l2_enc_poll,
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030055};
56
Hans Verkuilbec43662008-12-30 06:58:20 -030057static const struct v4l2_file_operations ivtv_v4l2_dec_fops = {
Hans Verkuildaf20d92008-05-12 11:21:58 -030058 .owner = THIS_MODULE,
59 .read = ivtv_v4l2_read,
60 .write = ivtv_v4l2_write,
61 .open = ivtv_v4l2_open,
Hans Verkuil09882f02008-10-18 13:42:24 -030062 .unlocked_ioctl = ivtv_v4l2_ioctl,
Hans Verkuildaf20d92008-05-12 11:21:58 -030063 .release = ivtv_v4l2_close,
64 .poll = ivtv_v4l2_dec_poll,
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030065};
66
Hans Verkuil33c0fca2007-08-23 06:32:46 -030067#define IVTV_V4L2_DEC_MPG_OFFSET 16 /* offset from 0 to register decoder mpg v4l2 minors on */
68#define IVTV_V4L2_ENC_PCM_OFFSET 24 /* offset from 0 to register pcm v4l2 minors on */
69#define IVTV_V4L2_ENC_YUV_OFFSET 32 /* offset from 0 to register yuv v4l2 minors on */
70#define IVTV_V4L2_DEC_YUV_OFFSET 48 /* offset from 0 to register decoder yuv v4l2 minors on */
71#define IVTV_V4L2_DEC_VBI_OFFSET 8 /* offset from 0 to register decoder vbi input v4l2 minors on */
72#define IVTV_V4L2_DEC_VOUT_OFFSET 16 /* offset from 0 to register vbi output v4l2 minors on */
73
Hans Verkuil31ec1352007-03-03 08:50:42 -030074static struct {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030075 const char *name;
76 int vfl_type;
Hans Verkuildd896012008-10-04 08:36:54 -030077 int num_offset;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030078 int dma, pio;
79 enum v4l2_buf_type buf_type;
Hans Verkuilbec43662008-12-30 06:58:20 -030080 const struct v4l2_file_operations *fops;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030081} ivtv_stream_info[] = {
82 { /* IVTV_ENC_STREAM_TYPE_MPG */
Hans Verkuil7c03a442007-08-19 18:59:42 -030083 "encoder MPG",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030084 VFL_TYPE_GRABBER, 0,
85 PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VIDEO_CAPTURE,
86 &ivtv_v4l2_enc_fops
87 },
88 { /* IVTV_ENC_STREAM_TYPE_YUV */
89 "encoder YUV",
90 VFL_TYPE_GRABBER, IVTV_V4L2_ENC_YUV_OFFSET,
91 PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VIDEO_CAPTURE,
92 &ivtv_v4l2_enc_fops
93 },
94 { /* IVTV_ENC_STREAM_TYPE_VBI */
95 "encoder VBI",
96 VFL_TYPE_VBI, 0,
97 PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_VBI_CAPTURE,
98 &ivtv_v4l2_enc_fops
99 },
100 { /* IVTV_ENC_STREAM_TYPE_PCM */
Hans Verkuil7c03a442007-08-19 18:59:42 -0300101 "encoder PCM",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300102 VFL_TYPE_GRABBER, IVTV_V4L2_ENC_PCM_OFFSET,
103 PCI_DMA_FROMDEVICE, 0, V4L2_BUF_TYPE_PRIVATE,
104 &ivtv_v4l2_enc_fops
105 },
106 { /* IVTV_ENC_STREAM_TYPE_RAD */
107 "encoder radio",
108 VFL_TYPE_RADIO, 0,
109 PCI_DMA_NONE, 1, V4L2_BUF_TYPE_PRIVATE,
110 &ivtv_v4l2_enc_fops
111 },
112 { /* IVTV_DEC_STREAM_TYPE_MPG */
Hans Verkuil7c03a442007-08-19 18:59:42 -0300113 "decoder MPG",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300114 VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET,
115 PCI_DMA_TODEVICE, 0, V4L2_BUF_TYPE_VIDEO_OUTPUT,
116 &ivtv_v4l2_dec_fops
117 },
118 { /* IVTV_DEC_STREAM_TYPE_VBI */
119 "decoder VBI",
120 VFL_TYPE_VBI, IVTV_V4L2_DEC_VBI_OFFSET,
121 PCI_DMA_NONE, 1, V4L2_BUF_TYPE_VBI_CAPTURE,
122 &ivtv_v4l2_enc_fops
123 },
124 { /* IVTV_DEC_STREAM_TYPE_VOUT */
125 "decoder VOUT",
126 VFL_TYPE_VBI, IVTV_V4L2_DEC_VOUT_OFFSET,
127 PCI_DMA_NONE, 1, V4L2_BUF_TYPE_VBI_OUTPUT,
128 &ivtv_v4l2_dec_fops
129 },
130 { /* IVTV_DEC_STREAM_TYPE_YUV */
131 "decoder YUV",
132 VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET,
133 PCI_DMA_TODEVICE, 0, V4L2_BUF_TYPE_VIDEO_OUTPUT,
134 &ivtv_v4l2_dec_fops
135 }
136};
137
138static void ivtv_stream_init(struct ivtv *itv, int type)
139{
140 struct ivtv_stream *s = &itv->streams[type];
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300141 struct video_device *vdev = s->vdev;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300142
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300143 /* we need to keep vdev, so restore it afterwards */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300144 memset(s, 0, sizeof(*s));
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300145 s->vdev = vdev;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300146
147 /* initialize ivtv_stream fields */
148 s->itv = itv;
149 s->type = type;
150 s->name = ivtv_stream_info[type].name;
151
152 if (ivtv_stream_info[type].pio)
153 s->dma = PCI_DMA_NONE;
154 else
155 s->dma = ivtv_stream_info[type].dma;
156 s->buf_size = itv->stream_buf_size[type];
157 if (s->buf_size)
Hans Verkuil313e91e2007-08-19 05:32:33 -0300158 s->buffers = (itv->options.kilobytes[type] * 1024 + s->buf_size - 1) / s->buf_size;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300159 spin_lock_init(&s->qlock);
160 init_waitqueue_head(&s->waitq);
161 s->id = -1;
Hans Verkuil37093b12007-07-28 19:45:50 -0300162 s->sg_handle = IVTV_DMA_UNMAPPED;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300163 ivtv_queue_init(&s->q_free);
164 ivtv_queue_init(&s->q_full);
165 ivtv_queue_init(&s->q_dma);
166 ivtv_queue_init(&s->q_predma);
167 ivtv_queue_init(&s->q_io);
168}
169
Hans Verkuil18e16f92007-10-13 05:54:48 -0300170static int ivtv_prep_dev(struct ivtv *itv, int type)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300171{
172 struct ivtv_stream *s = &itv->streams[type];
Hans Verkuildd896012008-10-04 08:36:54 -0300173 int num_offset = ivtv_stream_info[type].num_offset;
Hans Verkuil67ec09f2008-11-29 19:38:23 -0300174 int num = itv->instance + ivtv_first_minor + num_offset;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300175
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300176 /* These four fields are always initialized. If vdev == NULL, then
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300177 this stream is not in use. In that case no other fields but these
178 four can be used. */
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300179 s->vdev = NULL;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300180 s->itv = itv;
181 s->type = type;
182 s->name = ivtv_stream_info[type].name;
183
184 /* Check whether the radio is supported */
185 if (type == IVTV_ENC_STREAM_TYPE_RAD && !(itv->v4l2_cap & V4L2_CAP_RADIO))
186 return 0;
187 if (type >= IVTV_DEC_STREAM_TYPE_MPG && !(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
188 return 0;
189
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300190 /* User explicitly selected 0 buffers for these streams, so don't
191 create them. */
Hans Verkuil18e16f92007-10-13 05:54:48 -0300192 if (ivtv_stream_info[type].dma != PCI_DMA_NONE &&
Hans Verkuil313e91e2007-08-19 05:32:33 -0300193 itv->options.kilobytes[type] == 0) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300194 IVTV_INFO("Disabled %s device\n", ivtv_stream_info[type].name);
195 return 0;
196 }
197
198 ivtv_stream_init(itv, type);
199
200 /* allocate and initialize the v4l2 video device structure */
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300201 s->vdev = video_device_alloc();
202 if (s->vdev == NULL) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300203 IVTV_ERR("Couldn't allocate v4l2 video_device for %s\n", s->name);
204 return -ENOMEM;
205 }
206
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300207 snprintf(s->vdev->name, sizeof(s->vdev->name), "%s %s",
208 itv->v4l2_dev.name, s->name);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300209
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300210 s->vdev->num = num;
211 s->vdev->v4l2_dev = &itv->v4l2_dev;
212 s->vdev->fops = ivtv_stream_info[type].fops;
213 s->vdev->release = video_device_release;
214 s->vdev->tvnorms = V4L2_STD_ALL;
215 ivtv_set_funcs(s->vdev);
Hans Verkuil18e16f92007-10-13 05:54:48 -0300216 return 0;
217}
218
219/* Initialize v4l2 variables and prepare v4l2 devices */
220int ivtv_streams_setup(struct ivtv *itv)
221{
222 int type;
223
224 /* Setup V4L2 Devices */
225 for (type = 0; type < IVTV_MAX_STREAMS; type++) {
226 /* Prepare device */
227 if (ivtv_prep_dev(itv, type))
228 break;
229
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300230 if (itv->streams[type].vdev == NULL)
Hans Verkuil18e16f92007-10-13 05:54:48 -0300231 continue;
232
233 /* Allocate Stream */
234 if (ivtv_stream_alloc(&itv->streams[type]))
235 break;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300236 }
Hans Verkuil18e16f92007-10-13 05:54:48 -0300237 if (type == IVTV_MAX_STREAMS)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300238 return 0;
Hans Verkuil18e16f92007-10-13 05:54:48 -0300239
240 /* One or more streams could not be initialized. Clean 'em all up. */
Hans Verkuil3f983872008-05-01 10:31:12 -0300241 ivtv_streams_cleanup(itv, 0);
Hans Verkuil18e16f92007-10-13 05:54:48 -0300242 return -ENOMEM;
243}
244
245static int ivtv_reg_dev(struct ivtv *itv, int type)
246{
247 struct ivtv_stream *s = &itv->streams[type];
248 int vfl_type = ivtv_stream_info[type].vfl_type;
Laurent Pinchart38c7c032009-11-27 13:57:15 -0300249 const char *name;
Hans Verkuildd896012008-10-04 08:36:54 -0300250 int num;
Hans Verkuil18e16f92007-10-13 05:54:48 -0300251
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300252 if (s->vdev == NULL)
Hans Verkuil18e16f92007-10-13 05:54:48 -0300253 return 0;
254
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300255 num = s->vdev->num;
Hans Verkuildd896012008-10-04 08:36:54 -0300256 /* card number + user defined offset + device offset */
257 if (type != IVTV_ENC_STREAM_TYPE_MPG) {
258 struct ivtv_stream *s_mpg = &itv->streams[IVTV_ENC_STREAM_TYPE_MPG];
259
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300260 if (s_mpg->vdev)
261 num = s_mpg->vdev->num + ivtv_stream_info[type].num_offset;
Hans Verkuildd896012008-10-04 08:36:54 -0300262 }
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300263 video_set_drvdata(s->vdev, s);
Hans Verkuildd896012008-10-04 08:36:54 -0300264
Hans Verkuil18e16f92007-10-13 05:54:48 -0300265 /* Register device. First try the desired minor, then any free one. */
Hans Verkuil6b5270d2009-09-06 07:54:00 -0300266 if (video_register_device_no_warn(s->vdev, vfl_type, num)) {
Hans Verkuil581644d2009-06-19 11:54:00 -0300267 IVTV_ERR("Couldn't register v4l2 device for %s (device node number %d)\n",
Hans Verkuildd896012008-10-04 08:36:54 -0300268 s->name, num);
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300269 video_device_release(s->vdev);
270 s->vdev = NULL;
Hans Verkuil18e16f92007-10-13 05:54:48 -0300271 return -ENOMEM;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300272 }
Laurent Pinchart38c7c032009-11-27 13:57:15 -0300273 name = video_device_node_name(s->vdev);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300274
275 switch (vfl_type) {
276 case VFL_TYPE_GRABBER:
Laurent Pinchart38c7c032009-11-27 13:57:15 -0300277 IVTV_INFO("Registered device %s for %s (%d kB)\n",
278 name, s->name, itv->options.kilobytes[type]);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300279 break;
280 case VFL_TYPE_RADIO:
Laurent Pinchart38c7c032009-11-27 13:57:15 -0300281 IVTV_INFO("Registered device %s for %s\n",
282 name, s->name);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300283 break;
284 case VFL_TYPE_VBI:
Hans Verkuil313e91e2007-08-19 05:32:33 -0300285 if (itv->options.kilobytes[type])
Laurent Pinchart38c7c032009-11-27 13:57:15 -0300286 IVTV_INFO("Registered device %s for %s (%d kB)\n",
287 name, s->name, itv->options.kilobytes[type]);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300288 else
Laurent Pinchart38c7c032009-11-27 13:57:15 -0300289 IVTV_INFO("Registered device %s for %s\n",
290 name, s->name);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300291 break;
292 }
293 return 0;
294}
295
Hans Verkuil18e16f92007-10-13 05:54:48 -0300296/* Register v4l2 devices */
297int ivtv_streams_register(struct ivtv *itv)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300298{
299 int type;
Hans Verkuil18e16f92007-10-13 05:54:48 -0300300 int err = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300301
Hans Verkuil18e16f92007-10-13 05:54:48 -0300302 /* Register V4L2 devices */
303 for (type = 0; type < IVTV_MAX_STREAMS; type++)
304 err |= ivtv_reg_dev(itv, type);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300305
Hans Verkuil18e16f92007-10-13 05:54:48 -0300306 if (err == 0)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300307 return 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300308
309 /* One or more streams could not be initialized. Clean 'em all up. */
Hans Verkuil3f983872008-05-01 10:31:12 -0300310 ivtv_streams_cleanup(itv, 1);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300311 return -ENOMEM;
312}
313
314/* Unregister v4l2 devices */
Hans Verkuil3f983872008-05-01 10:31:12 -0300315void ivtv_streams_cleanup(struct ivtv *itv, int unregister)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300316{
317 int type;
318
319 /* Teardown all streams */
320 for (type = 0; type < IVTV_MAX_STREAMS; type++) {
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300321 struct video_device *vdev = itv->streams[type].vdev;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300322
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300323 itv->streams[type].vdev = NULL;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300324 if (vdev == NULL)
325 continue;
326
327 ivtv_stream_free(&itv->streams[type]);
Hans Verkuil3f983872008-05-01 10:31:12 -0300328 /* Unregister or release device */
329 if (unregister)
330 video_unregister_device(vdev);
331 else
332 video_device_release(vdev);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300333 }
334}
335
336static void ivtv_vbi_setup(struct ivtv *itv)
337{
Hans Verkuila8b86432008-10-04 08:05:30 -0300338 int raw = ivtv_raw_vbi(itv);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300339 u32 data[CX2341X_MBOX_MAX_DATA];
340 int lines;
341 int i;
342
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300343 /* Reset VBI */
344 ivtv_vapi(itv, CX2341X_ENC_SET_VBI_LINE, 5, 0xffff , 0, 0, 0, 0);
345
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300346 /* setup VBI registers */
Hans Verkuil4ff07902010-03-14 12:18:18 -0300347 if (raw)
348 v4l2_subdev_call(itv->sd_video, vbi, s_raw_fmt, &itv->vbi.in.fmt.vbi);
349 else
350 v4l2_subdev_call(itv->sd_video, vbi, s_sliced_fmt, &itv->vbi.in.fmt.sliced);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300351
352 /* determine number of lines and total number of VBI bytes.
353 A raw line takes 1443 bytes: 2 * 720 + 4 byte frame header - 1
354 The '- 1' byte is probably an unused U or V byte. Or something...
355 A sliced line takes 51 bytes: 4 byte frame header, 4 byte internal
356 header, 42 data bytes + checksum (to be confirmed) */
357 if (raw) {
358 lines = itv->vbi.count * 2;
359 } else {
360 lines = itv->is_60hz ? 24 : 38;
361 if (itv->is_60hz && (itv->hw_flags & IVTV_HW_CX25840))
362 lines += 2;
363 }
364
365 itv->vbi.enc_size = lines * (raw ? itv->vbi.raw_size : itv->vbi.sliced_size);
366
367 /* Note: sliced vs raw flag doesn't seem to have any effect
368 TODO: check mode (0x02) value with older ivtv versions. */
369 data[0] = raw | 0x02 | (0xbd << 8);
370
371 /* Every X number of frames a VBI interrupt arrives (frames as in 25 or 30 fps) */
372 data[1] = 1;
373 /* The VBI frames are stored in a ringbuffer with this size (with a VBI frame as unit) */
Hans Verkuild526afe2008-09-03 16:47:14 -0300374 data[2] = raw ? 4 : 4 * (itv->vbi.raw_size / itv->vbi.enc_size);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300375 /* The start/stop codes determine which VBI lines end up in the raw VBI data area.
376 The codes are from table 24 in the saa7115 datasheet. Each raw/sliced/video line
377 is framed with codes FF0000XX where XX is the SAV/EAV (Start/End of Active Video)
378 code. These values for raw VBI are obtained from a driver disassembly. The sliced
379 start/stop codes was deduced from this, but they do not appear in the driver.
380 Other code pairs that I found are: 0x250E6249/0x13545454 and 0x25256262/0x38137F54.
381 However, I have no idea what these values are for. */
382 if (itv->hw_flags & IVTV_HW_CX25840) {
383 /* Setup VBI for the cx25840 digitizer */
384 if (raw) {
385 data[3] = 0x20602060;
386 data[4] = 0x30703070;
387 } else {
388 data[3] = 0xB0F0B0F0;
389 data[4] = 0xA0E0A0E0;
390 }
391 /* Lines per frame */
392 data[5] = lines;
393 /* bytes per line */
394 data[6] = (raw ? itv->vbi.raw_size : itv->vbi.sliced_size);
395 } else {
396 /* Setup VBI for the saa7115 digitizer */
397 if (raw) {
398 data[3] = 0x25256262;
399 data[4] = 0x387F7F7F;
400 } else {
401 data[3] = 0xABABECEC;
402 data[4] = 0xB6F1F1F1;
403 }
404 /* Lines per frame */
405 data[5] = lines;
406 /* bytes per line */
407 data[6] = itv->vbi.enc_size / lines;
408 }
409
410 IVTV_DEBUG_INFO(
411 "Setup VBI API header 0x%08x pkts %d buffs %d ln %d sz %d\n",
412 data[0], data[1], data[2], data[5], data[6]);
413
414 ivtv_api(itv, CX2341X_ENC_SET_VBI_CONFIG, 7, data);
415
416 /* returns the VBI encoder memory area. */
417 itv->vbi.enc_start = data[2];
418 itv->vbi.fpi = data[0];
419 if (!itv->vbi.fpi)
420 itv->vbi.fpi = 1;
421
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300422 IVTV_DEBUG_INFO("Setup VBI start 0x%08x frames %d fpi %d\n",
423 itv->vbi.enc_start, data[1], itv->vbi.fpi);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300424
425 /* select VBI lines.
426 Note that the sliced argument seems to have no effect. */
427 for (i = 2; i <= 24; i++) {
428 int valid;
429
430 if (itv->is_60hz) {
431 valid = i >= 10 && i < 22;
432 } else {
433 valid = i >= 6 && i < 24;
434 }
435 ivtv_vapi(itv, CX2341X_ENC_SET_VBI_LINE, 5, i - 1,
436 valid, 0 , 0, 0);
437 ivtv_vapi(itv, CX2341X_ENC_SET_VBI_LINE, 5, (i - 1) | 0x80000000,
438 valid, 0, 0, 0);
439 }
440
441 /* Remaining VBI questions:
442 - Is it possible to select particular VBI lines only for inclusion in the MPEG
443 stream? Currently you can only get the first X lines.
444 - Is mixed raw and sliced VBI possible?
445 - What's the meaning of the raw/sliced flag?
446 - What's the meaning of params 2, 3 & 4 of the Select VBI command? */
447}
448
449int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s)
450{
451 u32 data[CX2341X_MBOX_MAX_DATA];
452 struct ivtv *itv = s->itv;
Hans Verkuil254d6eb2007-10-14 17:19:37 -0300453 struct cx2341x_mpeg_params *p = &itv->params;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300454 int captype = 0, subtype = 0;
455 int enable_passthrough = 0;
456
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300457 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300458 return -EINVAL;
459
460 IVTV_DEBUG_INFO("Start encoder stream %s\n", s->name);
461
462 switch (s->type) {
463 case IVTV_ENC_STREAM_TYPE_MPG:
464 captype = 0;
465 subtype = 3;
466
467 /* Stop Passthrough */
468 if (itv->output_mode == OUT_PASSTHROUGH) {
469 ivtv_passthrough_mode(itv, 0);
470 enable_passthrough = 1;
471 }
472 itv->mpg_data_received = itv->vbi_data_inserted = 0;
473 itv->dualwatch_jiffies = jiffies;
Hans Verkuil254d6eb2007-10-14 17:19:37 -0300474 itv->dualwatch_stereo_mode = p->audio_properties & 0x0300;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300475 itv->search_pack_header = 0;
476 break;
477
478 case IVTV_ENC_STREAM_TYPE_YUV:
479 if (itv->output_mode == OUT_PASSTHROUGH) {
480 captype = 2;
481 subtype = 11; /* video+audio+decoder */
482 break;
483 }
484 captype = 1;
485 subtype = 1;
486 break;
487 case IVTV_ENC_STREAM_TYPE_PCM:
488 captype = 1;
489 subtype = 2;
490 break;
491 case IVTV_ENC_STREAM_TYPE_VBI:
492 captype = 1;
493 subtype = 4;
494
495 itv->vbi.frame = 0;
496 itv->vbi.inserted_frame = 0;
497 memset(itv->vbi.sliced_mpeg_size,
498 0, sizeof(itv->vbi.sliced_mpeg_size));
499 break;
500 default:
501 return -EINVAL;
502 }
503 s->subtype = subtype;
504 s->buffers_stolen = 0;
505
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300506 /* Clear Streamoff flags in case left from last capture */
507 clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
508
509 if (atomic_read(&itv->capturing) == 0) {
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300510 int digitizer;
511
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300512 /* Always use frame based mode. Experiments have demonstrated that byte
513 stream based mode results in dropped frames and corruption. Not often,
514 but occasionally. Many thanks go to Leonard Orb who spent a lot of
515 effort and time trying to trace the cause of the drop outs. */
516 /* 1 frame per DMA */
517 /*ivtv_vapi(itv, CX2341X_ENC_SET_DMA_BLOCK_SIZE, 2, 128, 0); */
518 ivtv_vapi(itv, CX2341X_ENC_SET_DMA_BLOCK_SIZE, 2, 1, 1);
519
520 /* Stuff from Windows, we don't know what it is */
521 ivtv_vapi(itv, CX2341X_ENC_SET_VERT_CROP_LINE, 1, 0);
522 /* According to the docs, this should be correct. However, this is
523 untested. I don't dare enable this without having tested it.
524 Only very few old cards actually have this hardware combination.
525 ivtv_vapi(itv, CX2341X_ENC_SET_VERT_CROP_LINE, 1,
526 ((itv->hw_flags & IVTV_HW_SAA7114) && itv->is_60hz) ? 10001 : 0);
527 */
528 ivtv_vapi(itv, CX2341X_ENC_MISC, 2, 3, !itv->has_cx23415);
529 ivtv_vapi(itv, CX2341X_ENC_MISC, 2, 8, 0);
530 ivtv_vapi(itv, CX2341X_ENC_MISC, 2, 4, 1);
531 ivtv_vapi(itv, CX2341X_ENC_MISC, 1, 12);
532
533 /* assign placeholder */
534 ivtv_vapi(itv, CX2341X_ENC_SET_PLACEHOLDER, 12,
535 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
536
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300537 if (itv->card->hw_all & (IVTV_HW_SAA7115 | IVTV_HW_SAA717X))
538 digitizer = 0xF1;
539 else if (itv->card->hw_all & IVTV_HW_SAA7114)
540 digitizer = 0xEF;
541 else /* cx25840 */
542 digitizer = 0x140;
543
544 ivtv_vapi(itv, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, digitizer, digitizer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300545
546 /* Setup VBI */
547 if (itv->v4l2_cap & V4L2_CAP_VBI_CAPTURE) {
548 ivtv_vbi_setup(itv);
549 }
550
551 /* assign program index info. Mask 7: select I/P/B, Num_req: 400 max */
552 ivtv_vapi_result(itv, data, CX2341X_ENC_SET_PGM_INDEX_INFO, 2, 7, 400);
553 itv->pgm_info_offset = data[0];
554 itv->pgm_info_num = data[1];
555 itv->pgm_info_write_idx = 0;
556 itv->pgm_info_read_idx = 0;
557
558 IVTV_DEBUG_INFO("PGM Index at 0x%08x with %d elements\n",
559 itv->pgm_info_offset, itv->pgm_info_num);
560
561 /* Setup API for Stream */
Hans Verkuil254d6eb2007-10-14 17:19:37 -0300562 cx2341x_update(itv, ivtv_api_func, NULL, p);
563
564 /* mute if capturing radio */
565 if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
566 ivtv_vapi(itv, CX2341X_ENC_MUTE_VIDEO, 1,
567 1 | (p->video_mute_yuv << 8));
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300568 }
569
570 /* Vsync Setup */
571 if (itv->has_cx23415 && !test_and_set_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) {
572 /* event notification (on) */
573 ivtv_vapi(itv, CX2341X_ENC_SET_EVENT_NOTIFICATION, 4, 0, 1, IVTV_IRQ_ENC_VIM_RST, -1);
574 ivtv_clear_irq_mask(itv, IVTV_IRQ_ENC_VIM_RST);
575 }
576
577 if (atomic_read(&itv->capturing) == 0) {
578 /* Clear all Pending Interrupts */
579 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
580
581 clear_bit(IVTV_F_I_EOS, &itv->i_flags);
582
583 /* Initialize Digitizer for Capture */
Andy Walls3ccc6462009-12-24 13:06:08 -0300584 /* Avoid tinny audio problem - ensure audio clocks are going */
585 v4l2_subdev_call(itv->sd_audio, audio, s_stream, 1);
586 /* Avoid unpredictable PCI bus hang - disable video clocks */
Hans Verkuil67ec09f2008-11-29 19:38:23 -0300587 v4l2_subdev_call(itv->sd_video, video, s_stream, 0);
Andy Walls283328c2010-03-06 21:08:35 -0300588 ivtv_msleep_timeout(300, 1);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300589 ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0);
Hans Verkuil67ec09f2008-11-29 19:38:23 -0300590 v4l2_subdev_call(itv->sd_video, video, s_stream, 1);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300591 }
592
593 /* begin_capture */
594 if (ivtv_vapi(itv, CX2341X_ENC_START_CAPTURE, 2, captype, subtype))
595 {
596 IVTV_DEBUG_WARN( "Error starting capture!\n");
597 return -EINVAL;
598 }
599
600 /* Start Passthrough */
601 if (enable_passthrough) {
602 ivtv_passthrough_mode(itv, 1);
603 }
604
605 if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
606 ivtv_clear_irq_mask(itv, IVTV_IRQ_ENC_VBI_CAP);
607 else
608 ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
609
610 /* you're live! sit back and await interrupts :) */
611 atomic_inc(&itv->capturing);
612 return 0;
613}
614
615static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s)
616{
617 u32 data[CX2341X_MBOX_MAX_DATA];
618 struct ivtv *itv = s->itv;
Hans Verkuil254d6eb2007-10-14 17:19:37 -0300619 struct cx2341x_mpeg_params *p = &itv->params;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300620 int datatype;
621
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300622 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300623 return -EINVAL;
624
625 IVTV_DEBUG_INFO("Setting some initial decoder settings\n");
626
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300627 /* set audio mode to left/stereo for dual/stereo mode. */
628 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
629
630 /* set number of internal decoder buffers */
631 ivtv_vapi(itv, CX2341X_DEC_SET_DISPLAY_BUFFERS, 1, 0);
632
633 /* prebuffering */
634 ivtv_vapi(itv, CX2341X_DEC_SET_PREBUFFERING, 1, 1);
635
636 /* extract from user packets */
637 ivtv_vapi_result(itv, data, CX2341X_DEC_EXTRACT_VBI, 1, 1);
638 itv->vbi.dec_start = data[0];
639
640 IVTV_DEBUG_INFO("Decoder VBI RE-Insert start 0x%08x size 0x%08x\n",
641 itv->vbi.dec_start, data[1]);
642
643 /* set decoder source settings */
644 /* Data type: 0 = mpeg from host,
645 1 = yuv from encoder,
646 2 = yuv_from_host */
647 switch (s->type) {
648 case IVTV_DEC_STREAM_TYPE_YUV:
649 datatype = itv->output_mode == OUT_PASSTHROUGH ? 1 : 2;
650 IVTV_DEBUG_INFO("Setup DEC YUV Stream data[0] = %d\n", datatype);
651 break;
652 case IVTV_DEC_STREAM_TYPE_MPG:
653 default:
654 datatype = 0;
655 break;
656 }
657 if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype,
Hans Verkuil254d6eb2007-10-14 17:19:37 -0300658 p->width, p->height, p->audio_properties)) {
Hans Verkuil5a338c32007-07-22 09:39:56 -0300659 IVTV_DEBUG_WARN("Couldn't initialize decoder source\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300660 }
661 return 0;
662}
663
664int ivtv_start_v4l2_decode_stream(struct ivtv_stream *s, int gop_offset)
665{
666 struct ivtv *itv = s->itv;
667
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300668 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300669 return -EINVAL;
670
671 if (test_and_set_bit(IVTV_F_S_STREAMING, &s->s_flags))
672 return 0; /* already started */
673
674 IVTV_DEBUG_INFO("Starting decode stream %s (gop_offset %d)\n", s->name, gop_offset);
675
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300676 ivtv_setup_v4l2_decode_stream(s);
677
678 /* set dma size to 65536 bytes */
679 ivtv_vapi(itv, CX2341X_DEC_SET_DMA_BLOCK_SIZE, 1, 65536);
680
Ian Armstrong77aded62007-11-05 14:27:09 -0300681 /* Clear Streamoff */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300682 clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
683
684 /* Zero out decoder counters */
Hans Verkuil33c0fca2007-08-23 06:32:46 -0300685 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[0]);
686 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[1]);
687 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[2]);
688 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[3]);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300689 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[0]);
690 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[1]);
691 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[2]);
692 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[3]);
693
694 /* turn on notification of dual/stereo mode change */
695 ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 1, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
696
697 /* start playback */
698 ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, gop_offset, 0);
699
700 /* Clear the following Interrupt mask bits for decoding */
701 ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
702 IVTV_DEBUG_IRQ("IRQ Mask is now: 0x%08x\n", itv->irqmask);
703
704 /* you're live! sit back and await interrupts :) */
705 atomic_inc(&itv->decoding);
706 return 0;
707}
708
709void ivtv_stop_all_captures(struct ivtv *itv)
710{
711 int i;
712
713 for (i = IVTV_MAX_STREAMS - 1; i >= 0; i--) {
714 struct ivtv_stream *s = &itv->streams[i];
715
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300716 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300717 continue;
718 if (test_bit(IVTV_F_S_STREAMING, &s->s_flags)) {
719 ivtv_stop_v4l2_encode_stream(s, 0);
720 }
721 }
722}
723
724int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
725{
726 struct ivtv *itv = s->itv;
727 DECLARE_WAITQUEUE(wait, current);
728 int cap_type;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300729 int stopmode;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300730
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300731 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300732 return -EINVAL;
733
734 /* This function assumes that you are allowed to stop the capture
735 and that we are actually capturing */
736
737 IVTV_DEBUG_INFO("Stop Capture\n");
738
739 if (s->type == IVTV_DEC_STREAM_TYPE_VOUT)
740 return 0;
741 if (atomic_read(&itv->capturing) == 0)
742 return 0;
743
744 switch (s->type) {
745 case IVTV_ENC_STREAM_TYPE_YUV:
746 cap_type = 1;
747 break;
748 case IVTV_ENC_STREAM_TYPE_PCM:
749 cap_type = 1;
750 break;
751 case IVTV_ENC_STREAM_TYPE_VBI:
752 cap_type = 1;
753 break;
754 case IVTV_ENC_STREAM_TYPE_MPG:
755 default:
756 cap_type = 0;
757 break;
758 }
759
760 /* Stop Capture Mode */
761 if (s->type == IVTV_ENC_STREAM_TYPE_MPG && gop_end) {
762 stopmode = 0;
763 } else {
764 stopmode = 1;
765 }
766
767 /* end_capture */
768 /* when: 0 = end of GOP 1 = NOW!, type: 0 = mpeg, subtype: 3 = video+audio */
769 ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, stopmode, cap_type, s->subtype);
770
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300771 if (!test_bit(IVTV_F_S_PASSTHROUGH, &s->s_flags)) {
772 if (s->type == IVTV_ENC_STREAM_TYPE_MPG && gop_end) {
773 /* only run these if we're shutting down the last cap */
774 unsigned long duration;
Hans Verkuil559e1962007-08-23 17:51:07 -0300775 unsigned long then = jiffies;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300776
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300777 add_wait_queue(&itv->eos_waitq, &wait);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300778
779 set_current_state(TASK_INTERRUPTIBLE);
780
781 /* wait 2s for EOS interrupt */
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300782 while (!test_bit(IVTV_F_I_EOS, &itv->i_flags) &&
Julia Lawall168c6262008-04-16 16:13:15 -0300783 time_before(jiffies,
784 then + msecs_to_jiffies(2000))) {
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300785 schedule_timeout(msecs_to_jiffies(10));
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300786 }
787
788 /* To convert jiffies to ms, we must multiply by 1000
789 * and divide by HZ. To avoid runtime division, we
790 * convert this to multiplication by 1000/HZ.
791 * Since integer division truncates, we get the best
792 * accuracy if we do a rounding calculation of the constant.
793 * Think of the case where HZ is 1024.
794 */
795 duration = ((1000 + HZ / 2) / HZ) * (jiffies - then);
796
797 if (!test_bit(IVTV_F_I_EOS, &itv->i_flags)) {
798 IVTV_DEBUG_WARN("%s: EOS interrupt not received! stopping anyway.\n", s->name);
799 IVTV_DEBUG_WARN("%s: waited %lu ms.\n", s->name, duration);
800 } else {
801 IVTV_DEBUG_INFO("%s: EOS took %lu ms to occur.\n", s->name, duration);
802 }
803 set_current_state(TASK_RUNNING);
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300804 remove_wait_queue(&itv->eos_waitq, &wait);
Hans Verkuil559e1962007-08-23 17:51:07 -0300805 set_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300806 }
807
Hans Verkuil3562c432007-08-18 11:46:05 -0300808 /* Handle any pending interrupts */
809 ivtv_msleep_timeout(100, 1);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300810 }
811
812 atomic_dec(&itv->capturing);
813
814 /* Clear capture and no-read bits */
815 clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
816
817 if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
818 ivtv_set_irq_mask(itv, IVTV_IRQ_ENC_VBI_CAP);
819
820 if (atomic_read(&itv->capturing) > 0) {
821 return 0;
822 }
823
824 /* Set the following Interrupt mask bits for capture */
825 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
Hans Verkuile17a06b2007-08-18 15:48:42 -0300826 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300827
Hans Verkuilf8859692007-07-10 14:58:33 -0300828 /* event notification (off) */
829 if (test_and_clear_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) {
830 /* type: 0 = refresh */
831 /* on/off: 0 = off, intr: 0x10000000, mbox_id: -1: none */
832 ivtv_vapi(itv, CX2341X_ENC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_ENC_VIM_RST, -1);
833 ivtv_set_irq_mask(itv, IVTV_IRQ_ENC_VIM_RST);
834 }
835
Ian Armstrong9a766d52010-03-06 21:37:04 -0300836 /* Raw-passthrough is implied on start. Make sure it's stopped so
837 the encoder will re-initialize when next started */
838 ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, 1, 2, 7);
839
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300840 wake_up(&s->waitq);
841
842 return 0;
843}
844
845int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts)
846{
Hans Verkuil09250192010-03-27 14:10:13 -0300847 static const struct v4l2_event ev = {
848 .type = V4L2_EVENT_EOS,
849 };
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300850 struct ivtv *itv = s->itv;
851
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300852 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300853 return -EINVAL;
854
855 if (s->type != IVTV_DEC_STREAM_TYPE_YUV && s->type != IVTV_DEC_STREAM_TYPE_MPG)
856 return -EINVAL;
857
858 if (!test_bit(IVTV_F_S_STREAMING, &s->s_flags))
859 return 0;
860
Hans Verkuilc4385092007-06-07 09:04:03 -0300861 IVTV_DEBUG_INFO("Stop Decode at %llu, flags: %x\n", (unsigned long long)pts, flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300862
863 /* Stop Decoder */
864 if (!(flags & VIDEO_CMD_STOP_IMMEDIATELY) || pts) {
865 u32 tmp = 0;
866
867 /* Wait until the decoder is no longer running */
868 if (pts) {
869 ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3,
870 0, (u32)(pts & 0xffffffff), (u32)(pts >> 32));
871 }
872 while (1) {
873 u32 data[CX2341X_MBOX_MAX_DATA];
874 ivtv_vapi_result(itv, data, CX2341X_DEC_GET_XFER_INFO, 0);
875 if (s->q_full.buffers + s->q_dma.buffers == 0) {
876 if (tmp == data[3])
877 break;
878 tmp = data[3];
879 }
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300880 if (ivtv_msleep_timeout(100, 1))
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300881 break;
882 }
883 }
884 ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3, flags & VIDEO_CMD_STOP_TO_BLACK, 0, 0);
885
886 /* turn off notification of dual/stereo mode change */
887 ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
888
889 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
Hans Verkuile17a06b2007-08-18 15:48:42 -0300890 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300891
892 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
893 clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
894 ivtv_flush_queues(s);
895
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300896 /* decrement decoding */
897 atomic_dec(&itv->decoding);
898
899 set_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags);
900 wake_up(&itv->event_waitq);
Hans Verkuil09250192010-03-27 14:10:13 -0300901 v4l2_event_queue(s->vdev, &ev);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300902
903 /* wake up wait queues */
904 wake_up(&s->waitq);
905
906 return 0;
907}
908
909int ivtv_passthrough_mode(struct ivtv *itv, int enable)
910{
911 struct ivtv_stream *yuv_stream = &itv->streams[IVTV_ENC_STREAM_TYPE_YUV];
912 struct ivtv_stream *dec_stream = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
913
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300914 if (yuv_stream->vdev == NULL || dec_stream->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300915 return -EINVAL;
916
917 IVTV_DEBUG_INFO("ivtv ioctl: Select passthrough mode\n");
918
919 /* Prevent others from starting/stopping streams while we
920 initiate/terminate passthrough mode */
921 if (enable) {
922 if (itv->output_mode == OUT_PASSTHROUGH) {
923 return 0;
924 }
925 if (ivtv_set_output_mode(itv, OUT_PASSTHROUGH) != OUT_PASSTHROUGH)
926 return -EBUSY;
927
928 /* Fully initialize stream, and then unflag init */
929 set_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags);
930 set_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags);
931
932 /* Setup YUV Decoder */
933 ivtv_setup_v4l2_decode_stream(dec_stream);
934
935 /* Start Decoder */
936 ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, 0, 1);
937 atomic_inc(&itv->decoding);
938
939 /* Setup capture if not already done */
940 if (atomic_read(&itv->capturing) == 0) {
941 cx2341x_update(itv, ivtv_api_func, NULL, &itv->params);
942 }
943
944 /* Start Passthrough Mode */
945 ivtv_vapi(itv, CX2341X_ENC_START_CAPTURE, 2, 2, 11);
946 atomic_inc(&itv->capturing);
947 return 0;
948 }
949
950 if (itv->output_mode != OUT_PASSTHROUGH)
951 return 0;
952
953 /* Stop Passthrough Mode */
954 ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, 1, 2, 11);
955 ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3, 1, 0, 0);
956
957 atomic_dec(&itv->capturing);
958 atomic_dec(&itv->decoding);
959 clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags);
960 clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags);
961 itv->output_mode = OUT_NONE;
962
963 return 0;
964}