blob: 5441dc205966b7a5550ddb2a57ed3dc97b67ce43 [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;
Ian Armstrongbd62307b2010-05-23 22:19:11 -0300621 u16 width;
622 u16 height;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300623
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300624 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300625 return -EINVAL;
626
627 IVTV_DEBUG_INFO("Setting some initial decoder settings\n");
628
Ian Armstrongbd62307b2010-05-23 22:19:11 -0300629 width = p->width;
630 height = p->height;
631
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300632 /* set audio mode to left/stereo for dual/stereo mode. */
633 ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
634
635 /* set number of internal decoder buffers */
636 ivtv_vapi(itv, CX2341X_DEC_SET_DISPLAY_BUFFERS, 1, 0);
637
638 /* prebuffering */
639 ivtv_vapi(itv, CX2341X_DEC_SET_PREBUFFERING, 1, 1);
640
641 /* extract from user packets */
642 ivtv_vapi_result(itv, data, CX2341X_DEC_EXTRACT_VBI, 1, 1);
643 itv->vbi.dec_start = data[0];
644
645 IVTV_DEBUG_INFO("Decoder VBI RE-Insert start 0x%08x size 0x%08x\n",
646 itv->vbi.dec_start, data[1]);
647
648 /* set decoder source settings */
649 /* Data type: 0 = mpeg from host,
650 1 = yuv from encoder,
651 2 = yuv_from_host */
652 switch (s->type) {
653 case IVTV_DEC_STREAM_TYPE_YUV:
Ian Armstrongbd62307b2010-05-23 22:19:11 -0300654 if (itv->output_mode == OUT_PASSTHROUGH) {
655 datatype = 1;
656 } else {
657 /* Fake size to avoid switching video standard */
658 datatype = 2;
659 width = 720;
660 height = itv->is_out_50hz ? 576 : 480;
661 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300662 IVTV_DEBUG_INFO("Setup DEC YUV Stream data[0] = %d\n", datatype);
663 break;
664 case IVTV_DEC_STREAM_TYPE_MPG:
665 default:
666 datatype = 0;
667 break;
668 }
669 if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype,
Ian Armstrongbd62307b2010-05-23 22:19:11 -0300670 width, height, p->audio_properties)) {
Hans Verkuil5a338c32007-07-22 09:39:56 -0300671 IVTV_DEBUG_WARN("Couldn't initialize decoder source\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300672 }
673 return 0;
674}
675
676int ivtv_start_v4l2_decode_stream(struct ivtv_stream *s, int gop_offset)
677{
678 struct ivtv *itv = s->itv;
679
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300680 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300681 return -EINVAL;
682
683 if (test_and_set_bit(IVTV_F_S_STREAMING, &s->s_flags))
684 return 0; /* already started */
685
686 IVTV_DEBUG_INFO("Starting decode stream %s (gop_offset %d)\n", s->name, gop_offset);
687
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300688 ivtv_setup_v4l2_decode_stream(s);
689
690 /* set dma size to 65536 bytes */
691 ivtv_vapi(itv, CX2341X_DEC_SET_DMA_BLOCK_SIZE, 1, 65536);
692
Ian Armstrong77aded62007-11-05 14:27:09 -0300693 /* Clear Streamoff */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300694 clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
695
696 /* Zero out decoder counters */
Hans Verkuil33c0fca2007-08-23 06:32:46 -0300697 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[0]);
698 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[1]);
699 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[2]);
700 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA_END].data[3]);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300701 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[0]);
702 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[1]);
703 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[2]);
704 writel(0, &itv->dec_mbox.mbox[IVTV_MBOX_DMA].data[3]);
705
706 /* turn on notification of dual/stereo mode change */
707 ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 1, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
708
709 /* start playback */
710 ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, gop_offset, 0);
711
712 /* Clear the following Interrupt mask bits for decoding */
713 ivtv_clear_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
714 IVTV_DEBUG_IRQ("IRQ Mask is now: 0x%08x\n", itv->irqmask);
715
716 /* you're live! sit back and await interrupts :) */
717 atomic_inc(&itv->decoding);
718 return 0;
719}
720
721void ivtv_stop_all_captures(struct ivtv *itv)
722{
723 int i;
724
725 for (i = IVTV_MAX_STREAMS - 1; i >= 0; i--) {
726 struct ivtv_stream *s = &itv->streams[i];
727
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300728 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300729 continue;
730 if (test_bit(IVTV_F_S_STREAMING, &s->s_flags)) {
731 ivtv_stop_v4l2_encode_stream(s, 0);
732 }
733 }
734}
735
736int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
737{
738 struct ivtv *itv = s->itv;
739 DECLARE_WAITQUEUE(wait, current);
740 int cap_type;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300741 int stopmode;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300742
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300743 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300744 return -EINVAL;
745
746 /* This function assumes that you are allowed to stop the capture
747 and that we are actually capturing */
748
749 IVTV_DEBUG_INFO("Stop Capture\n");
750
751 if (s->type == IVTV_DEC_STREAM_TYPE_VOUT)
752 return 0;
753 if (atomic_read(&itv->capturing) == 0)
754 return 0;
755
756 switch (s->type) {
757 case IVTV_ENC_STREAM_TYPE_YUV:
758 cap_type = 1;
759 break;
760 case IVTV_ENC_STREAM_TYPE_PCM:
761 cap_type = 1;
762 break;
763 case IVTV_ENC_STREAM_TYPE_VBI:
764 cap_type = 1;
765 break;
766 case IVTV_ENC_STREAM_TYPE_MPG:
767 default:
768 cap_type = 0;
769 break;
770 }
771
772 /* Stop Capture Mode */
773 if (s->type == IVTV_ENC_STREAM_TYPE_MPG && gop_end) {
774 stopmode = 0;
775 } else {
776 stopmode = 1;
777 }
778
779 /* end_capture */
780 /* when: 0 = end of GOP 1 = NOW!, type: 0 = mpeg, subtype: 3 = video+audio */
781 ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, stopmode, cap_type, s->subtype);
782
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300783 if (!test_bit(IVTV_F_S_PASSTHROUGH, &s->s_flags)) {
784 if (s->type == IVTV_ENC_STREAM_TYPE_MPG && gop_end) {
785 /* only run these if we're shutting down the last cap */
786 unsigned long duration;
Hans Verkuil559e1962007-08-23 17:51:07 -0300787 unsigned long then = jiffies;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300788
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300789 add_wait_queue(&itv->eos_waitq, &wait);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300790
791 set_current_state(TASK_INTERRUPTIBLE);
792
793 /* wait 2s for EOS interrupt */
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300794 while (!test_bit(IVTV_F_I_EOS, &itv->i_flags) &&
Julia Lawall168c6262008-04-16 16:13:15 -0300795 time_before(jiffies,
796 then + msecs_to_jiffies(2000))) {
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300797 schedule_timeout(msecs_to_jiffies(10));
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300798 }
799
800 /* To convert jiffies to ms, we must multiply by 1000
801 * and divide by HZ. To avoid runtime division, we
802 * convert this to multiplication by 1000/HZ.
803 * Since integer division truncates, we get the best
804 * accuracy if we do a rounding calculation of the constant.
805 * Think of the case where HZ is 1024.
806 */
807 duration = ((1000 + HZ / 2) / HZ) * (jiffies - then);
808
809 if (!test_bit(IVTV_F_I_EOS, &itv->i_flags)) {
810 IVTV_DEBUG_WARN("%s: EOS interrupt not received! stopping anyway.\n", s->name);
811 IVTV_DEBUG_WARN("%s: waited %lu ms.\n", s->name, duration);
812 } else {
813 IVTV_DEBUG_INFO("%s: EOS took %lu ms to occur.\n", s->name, duration);
814 }
815 set_current_state(TASK_RUNNING);
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300816 remove_wait_queue(&itv->eos_waitq, &wait);
Hans Verkuil559e1962007-08-23 17:51:07 -0300817 set_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300818 }
819
Hans Verkuil3562c432007-08-18 11:46:05 -0300820 /* Handle any pending interrupts */
821 ivtv_msleep_timeout(100, 1);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300822 }
823
824 atomic_dec(&itv->capturing);
825
826 /* Clear capture and no-read bits */
827 clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
828
829 if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
830 ivtv_set_irq_mask(itv, IVTV_IRQ_ENC_VBI_CAP);
831
832 if (atomic_read(&itv->capturing) > 0) {
833 return 0;
834 }
835
836 /* Set the following Interrupt mask bits for capture */
837 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_CAPTURE);
Hans Verkuile17a06b2007-08-18 15:48:42 -0300838 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300839
Hans Verkuilf8859692007-07-10 14:58:33 -0300840 /* event notification (off) */
841 if (test_and_clear_bit(IVTV_F_I_DIG_RST, &itv->i_flags)) {
842 /* type: 0 = refresh */
843 /* on/off: 0 = off, intr: 0x10000000, mbox_id: -1: none */
844 ivtv_vapi(itv, CX2341X_ENC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_ENC_VIM_RST, -1);
845 ivtv_set_irq_mask(itv, IVTV_IRQ_ENC_VIM_RST);
846 }
847
Ian Armstrong9a766d52010-03-06 21:37:04 -0300848 /* Raw-passthrough is implied on start. Make sure it's stopped so
849 the encoder will re-initialize when next started */
850 ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, 1, 2, 7);
851
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300852 wake_up(&s->waitq);
853
854 return 0;
855}
856
857int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts)
858{
Hans Verkuil09250192010-03-27 14:10:13 -0300859 static const struct v4l2_event ev = {
860 .type = V4L2_EVENT_EOS,
861 };
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300862 struct ivtv *itv = s->itv;
863
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300864 if (s->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300865 return -EINVAL;
866
867 if (s->type != IVTV_DEC_STREAM_TYPE_YUV && s->type != IVTV_DEC_STREAM_TYPE_MPG)
868 return -EINVAL;
869
870 if (!test_bit(IVTV_F_S_STREAMING, &s->s_flags))
871 return 0;
872
Hans Verkuilc4385092007-06-07 09:04:03 -0300873 IVTV_DEBUG_INFO("Stop Decode at %llu, flags: %x\n", (unsigned long long)pts, flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300874
875 /* Stop Decoder */
876 if (!(flags & VIDEO_CMD_STOP_IMMEDIATELY) || pts) {
877 u32 tmp = 0;
878
879 /* Wait until the decoder is no longer running */
880 if (pts) {
881 ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3,
882 0, (u32)(pts & 0xffffffff), (u32)(pts >> 32));
883 }
884 while (1) {
885 u32 data[CX2341X_MBOX_MAX_DATA];
886 ivtv_vapi_result(itv, data, CX2341X_DEC_GET_XFER_INFO, 0);
887 if (s->q_full.buffers + s->q_dma.buffers == 0) {
888 if (tmp == data[3])
889 break;
890 tmp = data[3];
891 }
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300892 if (ivtv_msleep_timeout(100, 1))
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300893 break;
894 }
895 }
896 ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3, flags & VIDEO_CMD_STOP_TO_BLACK, 0, 0);
897
898 /* turn off notification of dual/stereo mode change */
899 ivtv_vapi(itv, CX2341X_DEC_SET_EVENT_NOTIFICATION, 4, 0, 0, IVTV_IRQ_DEC_AUD_MODE_CHG, -1);
900
901 ivtv_set_irq_mask(itv, IVTV_IRQ_MASK_DECODE);
Hans Verkuile17a06b2007-08-18 15:48:42 -0300902 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300903
904 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
905 clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
906 ivtv_flush_queues(s);
907
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300908 /* decrement decoding */
909 atomic_dec(&itv->decoding);
910
911 set_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags);
912 wake_up(&itv->event_waitq);
Hans Verkuil09250192010-03-27 14:10:13 -0300913 v4l2_event_queue(s->vdev, &ev);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300914
915 /* wake up wait queues */
916 wake_up(&s->waitq);
917
918 return 0;
919}
920
921int ivtv_passthrough_mode(struct ivtv *itv, int enable)
922{
923 struct ivtv_stream *yuv_stream = &itv->streams[IVTV_ENC_STREAM_TYPE_YUV];
924 struct ivtv_stream *dec_stream = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
925
Hans Verkuil8ac05ae2009-02-07 07:02:27 -0300926 if (yuv_stream->vdev == NULL || dec_stream->vdev == NULL)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300927 return -EINVAL;
928
929 IVTV_DEBUG_INFO("ivtv ioctl: Select passthrough mode\n");
930
931 /* Prevent others from starting/stopping streams while we
932 initiate/terminate passthrough mode */
933 if (enable) {
934 if (itv->output_mode == OUT_PASSTHROUGH) {
935 return 0;
936 }
937 if (ivtv_set_output_mode(itv, OUT_PASSTHROUGH) != OUT_PASSTHROUGH)
938 return -EBUSY;
939
940 /* Fully initialize stream, and then unflag init */
941 set_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags);
942 set_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags);
943
944 /* Setup YUV Decoder */
945 ivtv_setup_v4l2_decode_stream(dec_stream);
946
947 /* Start Decoder */
948 ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, 0, 1);
949 atomic_inc(&itv->decoding);
950
951 /* Setup capture if not already done */
952 if (atomic_read(&itv->capturing) == 0) {
953 cx2341x_update(itv, ivtv_api_func, NULL, &itv->params);
954 }
955
956 /* Start Passthrough Mode */
957 ivtv_vapi(itv, CX2341X_ENC_START_CAPTURE, 2, 2, 11);
958 atomic_inc(&itv->capturing);
959 return 0;
960 }
961
962 if (itv->output_mode != OUT_PASSTHROUGH)
963 return 0;
964
965 /* Stop Passthrough Mode */
966 ivtv_vapi(itv, CX2341X_ENC_STOP_CAPTURE, 3, 1, 2, 11);
967 ivtv_vapi(itv, CX2341X_DEC_STOP_PLAYBACK, 3, 1, 0, 0);
968
969 atomic_dec(&itv->capturing);
970 atomic_dec(&itv->decoding);
971 clear_bit(IVTV_F_S_PASSTHROUGH, &dec_stream->s_flags);
972 clear_bit(IVTV_F_S_STREAMING, &dec_stream->s_flags);
973 itv->output_mode = OUT_NONE;
974
975 return 0;
976}