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