Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
go7007-v4l2.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2006 Micronas USA Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License (Version 2) as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
16  */
17 
18 #include <linux/module.h>
19 #include <linux/init.h>
20 #include <linux/version.h>
21 #include <linux/delay.h>
22 #include <linux/sched.h>
23 #include <linux/spinlock.h>
24 #include <linux/slab.h>
25 #include <linux/fs.h>
26 #include <linux/unistd.h>
27 #include <linux/time.h>
28 #include <linux/vmalloc.h>
29 #include <linux/pagemap.h>
30 #include <linux/videodev2.h>
31 #include <media/v4l2-common.h>
32 #include <media/v4l2-ioctl.h>
33 #include <media/v4l2-subdev.h>
34 #include <linux/i2c.h>
35 #include <linux/mutex.h>
36 #include <linux/uaccess.h>
37 
38 #include "go7007.h"
39 #include "go7007-priv.h"
40 #include "wis-i2c.h"
41 
42 /* Temporary defines until accepted in v4l-dvb */
43 #ifndef V4L2_MPEG_STREAM_TYPE_MPEG_ELEM
44 #define V4L2_MPEG_STREAM_TYPE_MPEG_ELEM 6 /* MPEG elementary stream */
45 #endif
46 #ifndef V4L2_MPEG_VIDEO_ENCODING_MPEG_4
47 #define V4L2_MPEG_VIDEO_ENCODING_MPEG_4 3
48 #endif
49 
50 #define call_all(dev, o, f, args...) \
51  v4l2_device_call_until_err(dev, 0, o, f, ##args)
52 
53 static void deactivate_buffer(struct go7007_buffer *gobuf)
54 {
55  int i;
56 
57  if (gobuf->state != BUF_STATE_IDLE) {
58  list_del(&gobuf->stream);
59  gobuf->state = BUF_STATE_IDLE;
60  }
61  if (gobuf->page_count > 0) {
62  for (i = 0; i < gobuf->page_count; ++i)
63  page_cache_release(gobuf->pages[i]);
64  gobuf->page_count = 0;
65  }
66 }
67 
68 static void abort_queued(struct go7007 *go)
69 {
70  struct go7007_buffer *gobuf, *next;
71 
72  list_for_each_entry_safe(gobuf, next, &go->stream, stream) {
73  deactivate_buffer(gobuf);
74  }
75 }
76 
77 static int go7007_streamoff(struct go7007 *go)
78 {
79  unsigned long flags;
80 
81  mutex_lock(&go->hw_lock);
82  if (go->streaming) {
83  go->streaming = 0;
85  spin_lock_irqsave(&go->spinlock, flags);
86  abort_queued(go);
87  spin_unlock_irqrestore(&go->spinlock, flags);
89  }
90  mutex_unlock(&go->hw_lock);
91  return 0;
92 }
93 
94 static int go7007_open(struct file *file)
95 {
96  struct go7007 *go = video_get_drvdata(video_devdata(file));
97  struct go7007_file *gofh;
98 
99  if (go->status != STATUS_ONLINE)
100  return -EBUSY;
101  gofh = kmalloc(sizeof(struct go7007_file), GFP_KERNEL);
102  if (gofh == NULL)
103  return -ENOMEM;
104  ++go->ref_count;
105  gofh->go = go;
106  mutex_init(&gofh->lock);
107  gofh->buf_count = 0;
108  file->private_data = gofh;
109  return 0;
110 }
111 
112 static int go7007_release(struct file *file)
113 {
114  struct go7007_file *gofh = file->private_data;
115  struct go7007 *go = gofh->go;
116 
117  if (gofh->buf_count > 0) {
118  go7007_streamoff(go);
119  go->in_use = 0;
120  kfree(gofh->bufs);
121  gofh->buf_count = 0;
122  }
123  kfree(gofh);
124  if (--go->ref_count == 0)
125  kfree(go);
126  file->private_data = NULL;
127  return 0;
128 }
129 
130 static u32 get_frame_type_flag(struct go7007_buffer *gobuf, int format)
131 {
132  u8 *f = page_address(gobuf->pages[0]);
133 
134  switch (format) {
135  case GO7007_FORMAT_MJPEG:
136  return V4L2_BUF_FLAG_KEYFRAME;
137  case GO7007_FORMAT_MPEG4:
138  switch ((f[gobuf->frame_offset + 4] >> 6) & 0x3) {
139  case 0:
140  return V4L2_BUF_FLAG_KEYFRAME;
141  case 1:
142  return V4L2_BUF_FLAG_PFRAME;
143  case 2:
144  return V4L2_BUF_FLAG_BFRAME;
145  default:
146  return 0;
147  }
148  case GO7007_FORMAT_MPEG1:
149  case GO7007_FORMAT_MPEG2:
150  switch ((f[gobuf->frame_offset + 5] >> 3) & 0x7) {
151  case 1:
152  return V4L2_BUF_FLAG_KEYFRAME;
153  case 2:
154  return V4L2_BUF_FLAG_PFRAME;
155  case 3:
156  return V4L2_BUF_FLAG_BFRAME;
157  default:
158  return 0;
159  }
160  }
161 
162  return 0;
163 }
164 
165 static int set_capture_size(struct go7007 *go, struct v4l2_format *fmt, int try)
166 {
167  int sensor_height = 0, sensor_width = 0;
168  int width, height, i;
169 
170  if (fmt != NULL && fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG &&
171  fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MPEG &&
172  fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MPEG4)
173  return -EINVAL;
174 
175  switch (go->standard) {
176  case GO7007_STD_NTSC:
177  sensor_width = 720;
178  sensor_height = 480;
179  break;
180  case GO7007_STD_PAL:
181  sensor_width = 720;
182  sensor_height = 576;
183  break;
184  case GO7007_STD_OTHER:
185  sensor_width = go->board_info->sensor_width;
186  sensor_height = go->board_info->sensor_height;
187  break;
188  }
189 
190  if (fmt == NULL) {
191  width = sensor_width;
192  height = sensor_height;
193  } else if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
194  if (fmt->fmt.pix.width > sensor_width)
195  width = sensor_width;
196  else if (fmt->fmt.pix.width < 144)
197  width = 144;
198  else
199  width = fmt->fmt.pix.width & ~0x0f;
200 
201  if (fmt->fmt.pix.height > sensor_height)
202  height = sensor_height;
203  else if (fmt->fmt.pix.height < 96)
204  height = 96;
205  else
206  height = fmt->fmt.pix.height & ~0x0f;
207  } else {
208  int requested_size = fmt->fmt.pix.width * fmt->fmt.pix.height;
209  int sensor_size = sensor_width * sensor_height;
210 
211  if (64 * requested_size < 9 * sensor_size) {
212  width = sensor_width / 4;
213  height = sensor_height / 4;
214  } else if (64 * requested_size < 36 * sensor_size) {
215  width = sensor_width / 2;
216  height = sensor_height / 2;
217  } else {
218  width = sensor_width;
219  height = sensor_height;
220  }
221  width &= ~0xf;
222  height &= ~0xf;
223  }
224 
225  if (fmt != NULL) {
226  u32 pixelformat = fmt->fmt.pix.pixelformat;
227 
228  memset(fmt, 0, sizeof(*fmt));
230  fmt->fmt.pix.width = width;
231  fmt->fmt.pix.height = height;
232  fmt->fmt.pix.pixelformat = pixelformat;
233  fmt->fmt.pix.field = V4L2_FIELD_NONE;
234  fmt->fmt.pix.bytesperline = 0;
235  fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
236  fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* ?? */
237  }
238 
239  if (try)
240  return 0;
241 
242  go->width = width;
243  go->height = height;
244  go->encoder_h_offset = go->board_info->sensor_h_offset;
245  go->encoder_v_offset = go->board_info->sensor_v_offset;
246  for (i = 0; i < 4; ++i)
247  go->modet[i].enable = 0;
248  for (i = 0; i < 1624; ++i)
249  go->modet_map[i] = 0;
250 
251  if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
252  struct v4l2_mbus_framefmt mbus_fmt;
253 
254  mbus_fmt.code = V4L2_MBUS_FMT_FIXED;
255  if (fmt != NULL)
256  mbus_fmt.width = fmt->fmt.pix.width;
257  else
258  mbus_fmt.width = width;
259 
260  if (height > sensor_height / 2) {
261  mbus_fmt.height = height / 2;
262  go->encoder_v_halve = 0;
263  } else {
264  mbus_fmt.height = height;
265  go->encoder_v_halve = 1;
266  }
267  call_all(&go->v4l2_dev, video, s_mbus_fmt, &mbus_fmt);
268  } else {
269  if (width <= sensor_width / 4) {
270  go->encoder_h_halve = 1;
271  go->encoder_v_halve = 1;
272  go->encoder_subsample = 1;
273  } else if (width <= sensor_width / 2) {
274  go->encoder_h_halve = 1;
275  go->encoder_v_halve = 1;
276  go->encoder_subsample = 0;
277  } else {
278  go->encoder_h_halve = 0;
279  go->encoder_v_halve = 0;
280  go->encoder_subsample = 0;
281  }
282  }
283 
284  if (fmt == NULL)
285  return 0;
286 
287  switch (fmt->fmt.pix.pixelformat) {
288  case V4L2_PIX_FMT_MPEG:
289  if (go->format == GO7007_FORMAT_MPEG1 ||
290  go->format == GO7007_FORMAT_MPEG2 ||
292  break;
294  go->pali = 0;
296  go->gop_size = go->sensor_framerate / 1000;
297  go->ipb = 0;
298  go->closed_gop = 1;
299  go->repeat_seqhead = 1;
300  go->seq_header_enable = 1;
301  go->gop_header_enable = 1;
302  go->dvd_mode = 0;
303  break;
304  /* Backwards compatibility only! */
305  case V4L2_PIX_FMT_MPEG4:
306  if (go->format == GO7007_FORMAT_MPEG4)
307  break;
309  go->pali = 0xf5;
311  go->gop_size = go->sensor_framerate / 1000;
312  go->ipb = 0;
313  go->closed_gop = 1;
314  go->repeat_seqhead = 1;
315  go->seq_header_enable = 1;
316  go->gop_header_enable = 1;
317  go->dvd_mode = 0;
318  break;
319  case V4L2_PIX_FMT_MJPEG:
321  go->pali = 0;
323  go->gop_size = 0;
324  go->ipb = 0;
325  go->closed_gop = 0;
326  go->repeat_seqhead = 0;
327  go->seq_header_enable = 0;
328  go->gop_header_enable = 0;
329  go->dvd_mode = 0;
330  break;
331  }
332  return 0;
333 }
334 
335 #if 0
336 static int clip_to_modet_map(struct go7007 *go, int region,
337  struct v4l2_clip *clip_list)
338 {
339  struct v4l2_clip clip, *clip_ptr;
340  int x, y, mbnum;
341 
342  /* Check if coordinates are OK and if any macroblocks are already
343  * used by other regions (besides 0) */
344  clip_ptr = clip_list;
345  while (clip_ptr) {
346  if (copy_from_user(&clip, clip_ptr, sizeof(clip)))
347  return -EFAULT;
348  if (clip.c.left < 0 || (clip.c.left & 0xF) ||
349  clip.c.width <= 0 || (clip.c.width & 0xF))
350  return -EINVAL;
351  if (clip.c.left + clip.c.width > go->width)
352  return -EINVAL;
353  if (clip.c.top < 0 || (clip.c.top & 0xF) ||
354  clip.c.height <= 0 || (clip.c.height & 0xF))
355  return -EINVAL;
356  if (clip.c.top + clip.c.height > go->height)
357  return -EINVAL;
358  for (y = 0; y < clip.c.height; y += 16)
359  for (x = 0; x < clip.c.width; x += 16) {
360  mbnum = (go->width >> 4) *
361  ((clip.c.top + y) >> 4) +
362  ((clip.c.left + x) >> 4);
363  if (go->modet_map[mbnum] != 0 &&
364  go->modet_map[mbnum] != region)
365  return -EBUSY;
366  }
367  clip_ptr = clip.next;
368  }
369 
370  /* Clear old region macroblocks */
371  for (mbnum = 0; mbnum < 1624; ++mbnum)
372  if (go->modet_map[mbnum] == region)
373  go->modet_map[mbnum] = 0;
374 
375  /* Claim macroblocks in this list */
376  clip_ptr = clip_list;
377  while (clip_ptr) {
378  if (copy_from_user(&clip, clip_ptr, sizeof(clip)))
379  return -EFAULT;
380  for (y = 0; y < clip.c.height; y += 16)
381  for (x = 0; x < clip.c.width; x += 16) {
382  mbnum = (go->width >> 4) *
383  ((clip.c.top + y) >> 4) +
384  ((clip.c.left + x) >> 4);
385  go->modet_map[mbnum] = region;
386  }
387  clip_ptr = clip.next;
388  }
389  return 0;
390 }
391 #endif
392 
393 static int mpeg_query_ctrl(struct v4l2_queryctrl *ctrl)
394 {
395  static const u32 mpeg_ctrls[] = {
403  0
404  };
405  static const u32 *ctrl_classes[] = {
406  mpeg_ctrls,
407  NULL
408  };
409 
410  ctrl->id = v4l2_ctrl_next(ctrl_classes, ctrl->id);
411 
412  switch (ctrl->id) {
413  case V4L2_CID_MPEG_CLASS:
414  return v4l2_ctrl_query_fill(ctrl, 0, 0, 0, 0);
416  return v4l2_ctrl_query_fill(ctrl,
421  return v4l2_ctrl_query_fill(ctrl,
426  return v4l2_ctrl_query_fill(ctrl,
431  return v4l2_ctrl_query_fill(ctrl, 0, 34, 1, 15);
433  return v4l2_ctrl_query_fill(ctrl, 0, 1, 1, 0);
435  return v4l2_ctrl_query_fill(ctrl,
436  64000,
437  10000000, 1,
438  1500000);
439  default:
440  return -EINVAL;
441  }
442  return 0;
443 }
444 
445 static int mpeg_s_ctrl(struct v4l2_control *ctrl, struct go7007 *go)
446 {
447  /* pretty sure we can't change any of these while streaming */
448  if (go->streaming)
449  return -EBUSY;
450 
451  switch (ctrl->id) {
453  switch (ctrl->value) {
456  go->bitrate = 9800000;
457  go->gop_size = 15;
458  go->pali = 0x48;
459  go->closed_gop = 1;
460  go->repeat_seqhead = 0;
461  go->seq_header_enable = 1;
462  go->gop_header_enable = 1;
463  go->dvd_mode = 1;
464  break;
466  /* todo: */
467  break;
468  default:
469  return -EINVAL;
470  }
471  break;
473  switch (ctrl->value) {
476  go->pali = 0;
477  break;
480  /*if (mpeg->pali >> 24 == 2)
481  go->pali = mpeg->pali & 0xff;
482  else*/
483  go->pali = 0x48;
484  break;
487  /*if (mpeg->pali >> 24 == 4)
488  go->pali = mpeg->pali & 0xff;
489  else*/
490  go->pali = 0xf5;
491  break;
492  default:
493  return -EINVAL;
494  }
495  go->gop_header_enable =
496  /*mpeg->flags & GO7007_MPEG_OMIT_GOP_HEADER
497  ? 0 :*/ 1;
498  /*if (mpeg->flags & GO7007_MPEG_REPEAT_SEQHEADER)
499  go->repeat_seqhead = 1;
500  else*/
501  go->repeat_seqhead = 0;
502  go->dvd_mode = 0;
503  break;
505  if (go->format == GO7007_FORMAT_MJPEG)
506  return -EINVAL;
507  switch (ctrl->value) {
510  break;
513  break;
516  break;
518  default:
519  return -EINVAL;
520  }
521  break;
523  if (ctrl->value < 0 || ctrl->value > 34)
524  return -EINVAL;
525  go->gop_size = ctrl->value;
526  break;
528  if (ctrl->value != 0 && ctrl->value != 1)
529  return -EINVAL;
530  go->closed_gop = ctrl->value;
531  break;
533  /* Upper bound is kind of arbitrary here */
534  if (ctrl->value < 64000 || ctrl->value > 10000000)
535  return -EINVAL;
536  go->bitrate = ctrl->value;
537  break;
538  default:
539  return -EINVAL;
540  }
541  return 0;
542 }
543 
544 static int mpeg_g_ctrl(struct v4l2_control *ctrl, struct go7007 *go)
545 {
546  switch (ctrl->id) {
548  if (go->dvd_mode)
550  else
552  break;
554  switch (go->format) {
555  case GO7007_FORMAT_MPEG1:
557  break;
558  case GO7007_FORMAT_MPEG2:
560  break;
561  case GO7007_FORMAT_MPEG4:
563  break;
564  default:
565  return -EINVAL;
566  }
567  break;
569  switch (go->aspect_ratio) {
570  case GO7007_RATIO_1_1:
572  break;
573  case GO7007_RATIO_4_3:
575  break;
576  case GO7007_RATIO_16_9:
578  break;
579  default:
580  return -EINVAL;
581  }
582  break;
584  ctrl->value = go->gop_size;
585  break;
587  ctrl->value = go->closed_gop;
588  break;
590  ctrl->value = go->bitrate;
591  break;
592  default:
593  return -EINVAL;
594  }
595  return 0;
596 }
597 
598 static int vidioc_querycap(struct file *file, void *priv,
599  struct v4l2_capability *cap)
600 {
601  struct go7007 *go = ((struct go7007_file *) priv)->go;
602 
603  strlcpy(cap->driver, "go7007", sizeof(cap->driver));
604  strlcpy(cap->card, go->name, sizeof(cap->card));
605 #if 0
606  strlcpy(cap->bus_info, dev_name(&dev->udev->dev), sizeof(cap->bus_info));
607 #endif
608 
609  cap->version = KERNEL_VERSION(0, 9, 8);
610 
612  V4L2_CAP_STREAMING; /* | V4L2_CAP_AUDIO; */
613 
614  if (go->board_info->flags & GO7007_BOARD_HAS_TUNER)
616 
617  return 0;
618 }
619 
620 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
621  struct v4l2_fmtdesc *fmt)
622 {
623  char *desc = NULL;
624 
625  switch (fmt->index) {
626  case 0:
628  desc = "Motion-JPEG";
629  break;
630  case 1:
632  desc = "MPEG1/MPEG2/MPEG4";
633  break;
634  default:
635  return -EINVAL;
636  }
639 
640  strncpy(fmt->description, desc, sizeof(fmt->description));
641 
642  return 0;
643 }
644 
645 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
646  struct v4l2_format *fmt)
647 {
648  struct go7007 *go = ((struct go7007_file *) priv)->go;
649 
651  fmt->fmt.pix.width = go->width;
652  fmt->fmt.pix.height = go->height;
653  fmt->fmt.pix.pixelformat = (go->format == GO7007_FORMAT_MJPEG) ?
655  fmt->fmt.pix.field = V4L2_FIELD_NONE;
656  fmt->fmt.pix.bytesperline = 0;
657  fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
658  fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
659 
660  return 0;
661 }
662 
663 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
664  struct v4l2_format *fmt)
665 {
666  struct go7007 *go = ((struct go7007_file *) priv)->go;
667 
668  return set_capture_size(go, fmt, 1);
669 }
670 
671 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
672  struct v4l2_format *fmt)
673 {
674  struct go7007 *go = ((struct go7007_file *) priv)->go;
675 
676  if (go->streaming)
677  return -EBUSY;
678 
679  return set_capture_size(go, fmt, 0);
680 }
681 
682 static int vidioc_reqbufs(struct file *file, void *priv,
683  struct v4l2_requestbuffers *req)
684 {
685  struct go7007_file *gofh = priv;
686  struct go7007 *go = gofh->go;
687  int retval = -EBUSY;
688  unsigned int count, i;
689 
690  if (go->streaming)
691  return retval;
692 
693  if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
694  req->memory != V4L2_MEMORY_MMAP)
695  return -EINVAL;
696 
697  mutex_lock(&gofh->lock);
698  for (i = 0; i < gofh->buf_count; ++i)
699  if (gofh->bufs[i].mapped > 0)
700  goto unlock_and_return;
701 
702  mutex_lock(&go->hw_lock);
703  if (go->in_use > 0 && gofh->buf_count == 0) {
704  mutex_unlock(&go->hw_lock);
705  goto unlock_and_return;
706  }
707 
708  if (gofh->buf_count > 0)
709  kfree(gofh->bufs);
710 
711  retval = -ENOMEM;
712  count = req->count;
713  if (count > 0) {
714  if (count < 2)
715  count = 2;
716  if (count > 32)
717  count = 32;
718 
719  gofh->bufs = kcalloc(count, sizeof(struct go7007_buffer),
720  GFP_KERNEL);
721 
722  if (!gofh->bufs) {
723  mutex_unlock(&go->hw_lock);
724  goto unlock_and_return;
725  }
726 
727  for (i = 0; i < count; ++i) {
728  gofh->bufs[i].go = go;
729  gofh->bufs[i].index = i;
730  gofh->bufs[i].state = BUF_STATE_IDLE;
731  gofh->bufs[i].mapped = 0;
732  }
733 
734  go->in_use = 1;
735  } else {
736  go->in_use = 0;
737  }
738 
739  gofh->buf_count = count;
740  mutex_unlock(&go->hw_lock);
741  mutex_unlock(&gofh->lock);
742 
743  memset(req, 0, sizeof(*req));
744 
745  req->count = count;
747  req->memory = V4L2_MEMORY_MMAP;
748 
749  return 0;
750 
751 unlock_and_return:
752  mutex_unlock(&gofh->lock);
753  return retval;
754 }
755 
756 static int vidioc_querybuf(struct file *file, void *priv,
757  struct v4l2_buffer *buf)
758 {
759  struct go7007_file *gofh = priv;
760  int retval = -EINVAL;
761  unsigned int index;
762 
763  if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
764  return retval;
765 
766  index = buf->index;
767 
768  mutex_lock(&gofh->lock);
769  if (index >= gofh->buf_count)
770  goto unlock_and_return;
771 
772  memset(buf, 0, sizeof(*buf));
773  buf->index = index;
775 
776  switch (gofh->bufs[index].state) {
777  case BUF_STATE_QUEUED:
779  break;
780  case BUF_STATE_DONE:
781  buf->flags = V4L2_BUF_FLAG_DONE;
782  break;
783  default:
784  buf->flags = 0;
785  }
786 
787  if (gofh->bufs[index].mapped)
788  buf->flags |= V4L2_BUF_FLAG_MAPPED;
789  buf->memory = V4L2_MEMORY_MMAP;
790  buf->m.offset = index * GO7007_BUF_SIZE;
791  buf->length = GO7007_BUF_SIZE;
792  mutex_unlock(&gofh->lock);
793 
794  return 0;
795 
796 unlock_and_return:
797  mutex_unlock(&gofh->lock);
798  return retval;
799 }
800 
801 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
802 {
803  struct go7007_file *gofh = priv;
804  struct go7007 *go = gofh->go;
805  struct go7007_buffer *gobuf;
806  unsigned long flags;
807  int retval = -EINVAL;
808  int ret;
809 
810  if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
811  buf->memory != V4L2_MEMORY_MMAP)
812  return retval;
813 
814  mutex_lock(&gofh->lock);
815  if (buf->index < 0 || buf->index >= gofh->buf_count)
816  goto unlock_and_return;
817 
818  gobuf = &gofh->bufs[buf->index];
819  if (!gobuf->mapped)
820  goto unlock_and_return;
821 
822  retval = -EBUSY;
823  if (gobuf->state != BUF_STATE_IDLE)
824  goto unlock_and_return;
825 
826  /* offset will be 0 until we really support USERPTR streaming */
827  gobuf->offset = gobuf->user_addr & ~PAGE_MASK;
828  gobuf->bytesused = 0;
829  gobuf->frame_offset = 0;
830  gobuf->modet_active = 0;
831  if (gobuf->offset > 0)
832  gobuf->page_count = GO7007_BUF_PAGES + 1;
833  else
834  gobuf->page_count = GO7007_BUF_PAGES;
835 
836  retval = -ENOMEM;
837  down_read(&current->mm->mmap_sem);
838  ret = get_user_pages(current, current->mm,
839  gobuf->user_addr & PAGE_MASK, gobuf->page_count,
840  1, 1, gobuf->pages, NULL);
841  up_read(&current->mm->mmap_sem);
842 
843  if (ret != gobuf->page_count) {
844  int i;
845  for (i = 0; i < ret; ++i)
846  page_cache_release(gobuf->pages[i]);
847  gobuf->page_count = 0;
848  goto unlock_and_return;
849  }
850 
851  gobuf->state = BUF_STATE_QUEUED;
852  spin_lock_irqsave(&go->spinlock, flags);
853  list_add_tail(&gobuf->stream, &go->stream);
854  spin_unlock_irqrestore(&go->spinlock, flags);
855  mutex_unlock(&gofh->lock);
856 
857  return 0;
858 
859 unlock_and_return:
860  mutex_unlock(&gofh->lock);
861  return retval;
862 }
863 
864 
865 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
866 {
867  struct go7007_file *gofh = priv;
868  struct go7007 *go = gofh->go;
869  struct go7007_buffer *gobuf;
870  int retval = -EINVAL;
871  unsigned long flags;
872  u32 frame_type_flag;
873  DEFINE_WAIT(wait);
874 
875  if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
876  return retval;
877  if (buf->memory != V4L2_MEMORY_MMAP)
878  return retval;
879 
880  mutex_lock(&gofh->lock);
881  if (list_empty(&go->stream))
882  goto unlock_and_return;
883  gobuf = list_entry(go->stream.next,
884  struct go7007_buffer, stream);
885 
886  retval = -EAGAIN;
887  if (gobuf->state != BUF_STATE_DONE &&
888  !(file->f_flags & O_NONBLOCK)) {
889  for (;;) {
892  if (gobuf->state == BUF_STATE_DONE)
893  break;
894  if (signal_pending(current)) {
895  retval = -ERESTARTSYS;
896  break;
897  }
898  schedule();
899  }
900  finish_wait(&go->frame_waitq, &wait);
901  }
902  if (gobuf->state != BUF_STATE_DONE)
903  goto unlock_and_return;
904 
905  spin_lock_irqsave(&go->spinlock, flags);
906  deactivate_buffer(gobuf);
907  spin_unlock_irqrestore(&go->spinlock, flags);
908  frame_type_flag = get_frame_type_flag(gobuf, go->format);
909  gobuf->state = BUF_STATE_IDLE;
910 
911  memset(buf, 0, sizeof(*buf));
912  buf->index = gobuf->index;
914  buf->bytesused = gobuf->bytesused;
915  buf->flags = V4L2_BUF_FLAG_MAPPED | frame_type_flag;
916  buf->field = V4L2_FIELD_NONE;
917  buf->timestamp = gobuf->timestamp;
918  buf->sequence = gobuf->seq;
919  buf->memory = V4L2_MEMORY_MMAP;
920  buf->m.offset = gobuf->index * GO7007_BUF_SIZE;
921  buf->length = GO7007_BUF_SIZE;
922  buf->reserved = gobuf->modet_active;
923 
924  mutex_unlock(&gofh->lock);
925  return 0;
926 
927 unlock_and_return:
928  mutex_unlock(&gofh->lock);
929  return retval;
930 }
931 
932 static int vidioc_streamon(struct file *file, void *priv,
933  enum v4l2_buf_type type)
934 {
935  struct go7007_file *gofh = priv;
936  struct go7007 *go = gofh->go;
937  int retval = 0;
938 
939  if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
940  return -EINVAL;
941 
942  mutex_lock(&gofh->lock);
943  mutex_lock(&go->hw_lock);
944 
945  if (!go->streaming) {
946  go->streaming = 1;
947  go->next_seq = 0;
948  go->active_buf = NULL;
949  if (go7007_start_encoder(go) < 0)
950  retval = -EIO;
951  else
952  retval = 0;
953  }
954  mutex_unlock(&go->hw_lock);
955  mutex_unlock(&gofh->lock);
956 
957  return retval;
958 }
959 
960 static int vidioc_streamoff(struct file *file, void *priv,
961  enum v4l2_buf_type type)
962 {
963  struct go7007_file *gofh = priv;
964  struct go7007 *go = gofh->go;
965 
966  if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
967  return -EINVAL;
968  mutex_lock(&gofh->lock);
969  go7007_streamoff(go);
970  mutex_unlock(&gofh->lock);
971 
972  return 0;
973 }
974 
975 static int vidioc_queryctrl(struct file *file, void *priv,
976  struct v4l2_queryctrl *query)
977 {
978  struct go7007 *go = ((struct go7007_file *) priv)->go;
979  int id = query->id;
980 
981  if (0 == call_all(&go->v4l2_dev, core, queryctrl, query))
982  return 0;
983 
984  query->id = id;
985  return mpeg_query_ctrl(query);
986 }
987 
988 static int vidioc_g_ctrl(struct file *file, void *priv,
989  struct v4l2_control *ctrl)
990 {
991  struct go7007 *go = ((struct go7007_file *) priv)->go;
992 
993  if (0 == call_all(&go->v4l2_dev, core, g_ctrl, ctrl))
994  return 0;
995 
996  return mpeg_g_ctrl(ctrl, go);
997 }
998 
999 static int vidioc_s_ctrl(struct file *file, void *priv,
1000  struct v4l2_control *ctrl)
1001 {
1002  struct go7007 *go = ((struct go7007_file *) priv)->go;
1003 
1004  if (0 == call_all(&go->v4l2_dev, core, s_ctrl, ctrl))
1005  return 0;
1006 
1007  return mpeg_s_ctrl(ctrl, go);
1008 }
1009 
1010 static int vidioc_g_parm(struct file *filp, void *priv,
1011  struct v4l2_streamparm *parm)
1012 {
1013  struct go7007 *go = ((struct go7007_file *) priv)->go;
1014  struct v4l2_fract timeperframe = {
1015  .numerator = 1001 * go->fps_scale,
1016  .denominator = go->sensor_framerate,
1017  };
1018 
1019  if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1020  return -EINVAL;
1021 
1022  parm->parm.capture.capability |= V4L2_CAP_TIMEPERFRAME;
1023  parm->parm.capture.timeperframe = timeperframe;
1024 
1025  return 0;
1026 }
1027 
1028 static int vidioc_s_parm(struct file *filp, void *priv,
1029  struct v4l2_streamparm *parm)
1030 {
1031  struct go7007 *go = ((struct go7007_file *) priv)->go;
1032  unsigned int n, d;
1033 
1034  if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1035  return -EINVAL;
1036  if (parm->parm.capture.capturemode != 0)
1037  return -EINVAL;
1038 
1039  n = go->sensor_framerate *
1040  parm->parm.capture.timeperframe.numerator;
1041  d = 1001 * parm->parm.capture.timeperframe.denominator;
1042  if (n != 0 && d != 0 && n > d)
1043  go->fps_scale = (n + d/2) / d;
1044  else
1045  go->fps_scale = 1;
1046 
1047  return 0;
1048 }
1049 
1050 /* VIDIOC_ENUMSTD on go7007 were used for enumerating the supported fps and
1051  its resolution, when the device is not connected to TV.
1052  This is were an API abuse, probably used by the lack of specific IOCTL's to
1053  enumerate it, by the time the driver was written.
1054 
1055  However, since kernel 2.6.19, two new ioctls (VIDIOC_ENUM_FRAMEINTERVALS
1056  and VIDIOC_ENUM_FRAMESIZES) were added for this purpose.
1057 
1058  The two functions below implement the newer ioctls
1059 */
1060 static int vidioc_enum_framesizes(struct file *filp, void *priv,
1061  struct v4l2_frmsizeenum *fsize)
1062 {
1063  struct go7007 *go = ((struct go7007_file *) priv)->go;
1064 
1065  /* Return -EINVAL, if it is a TV board */
1066  if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) ||
1067  (go->board_info->sensor_flags & GO7007_SENSOR_TV))
1068  return -EINVAL;
1069 
1070  if (fsize->index > 0)
1071  return -EINVAL;
1072 
1074  fsize->discrete.width = go->board_info->sensor_width;
1075  fsize->discrete.height = go->board_info->sensor_height;
1076 
1077  return 0;
1078 }
1079 
1080 static int vidioc_enum_frameintervals(struct file *filp, void *priv,
1081  struct v4l2_frmivalenum *fival)
1082 {
1083  struct go7007 *go = ((struct go7007_file *) priv)->go;
1084 
1085  /* Return -EINVAL, if it is a TV board */
1086  if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) ||
1087  (go->board_info->sensor_flags & GO7007_SENSOR_TV))
1088  return -EINVAL;
1089 
1090  if (fival->index > 0)
1091  return -EINVAL;
1092 
1094  fival->discrete.numerator = 1001;
1095  fival->discrete.denominator = go->board_info->sensor_framerate;
1096 
1097  return 0;
1098 }
1099 
1100 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *std)
1101 {
1102  struct go7007 *go = ((struct go7007_file *) priv)->go;
1103 
1104  switch (go->standard) {
1105  case GO7007_STD_NTSC:
1106  *std = V4L2_STD_NTSC;
1107  break;
1108  case GO7007_STD_PAL:
1109  *std = V4L2_STD_PAL;
1110  break;
1111  default:
1112  return -EINVAL;
1113  }
1114 
1115  return 0;
1116 }
1117 
1118 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *std)
1119 {
1120  struct go7007 *go = ((struct go7007_file *) priv)->go;
1121 
1122  if (go->streaming)
1123  return -EBUSY;
1124 
1125  if (!(go->board_info->sensor_flags & GO7007_SENSOR_TV) && *std != 0)
1126  return -EINVAL;
1127 
1128  if (*std == 0)
1129  return -EINVAL;
1130 
1131  if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
1132  go->input == go->board_info->num_inputs - 1) {
1133  if (!go->i2c_adapter_online)
1134  return -EIO;
1135  if (call_all(&go->v4l2_dev, core, s_std, *std) < 0)
1136  return -EINVAL;
1137  }
1138 
1139  if (*std & V4L2_STD_NTSC) {
1140  go->standard = GO7007_STD_NTSC;
1141  go->sensor_framerate = 30000;
1142  } else if (*std & V4L2_STD_PAL) {
1143  go->standard = GO7007_STD_PAL;
1144  go->sensor_framerate = 25025;
1145  } else if (*std & V4L2_STD_SECAM) {
1146  go->standard = GO7007_STD_PAL;
1147  go->sensor_framerate = 25025;
1148  } else
1149  return -EINVAL;
1150 
1151  call_all(&go->v4l2_dev, core, s_std, *std);
1152  set_capture_size(go, NULL, 0);
1153 
1154  return 0;
1155 }
1156 
1157 static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *std)
1158 {
1159  struct go7007 *go = ((struct go7007_file *) priv)->go;
1160 
1161  if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
1162  go->input == go->board_info->num_inputs - 1) {
1163  if (!go->i2c_adapter_online)
1164  return -EIO;
1165  return call_all(&go->v4l2_dev, video, querystd, std);
1166  } else if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1167  *std = V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM;
1168  else
1169  *std = 0;
1170 
1171  return 0;
1172 }
1173 
1174 static int vidioc_enum_input(struct file *file, void *priv,
1175  struct v4l2_input *inp)
1176 {
1177  struct go7007 *go = ((struct go7007_file *) priv)->go;
1178 
1179  if (inp->index >= go->board_info->num_inputs)
1180  return -EINVAL;
1181 
1182  strncpy(inp->name, go->board_info->inputs[inp->index].name,
1183  sizeof(inp->name));
1184 
1185  /* If this board has a tuner, it will be the last input */
1186  if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
1187  inp->index == go->board_info->num_inputs - 1)
1188  inp->type = V4L2_INPUT_TYPE_TUNER;
1189  else
1191 
1192  inp->audioset = 0;
1193  inp->tuner = 0;
1194  if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1195  inp->std = V4L2_STD_NTSC | V4L2_STD_PAL |
1197  else
1198  inp->std = 0;
1199 
1200  return 0;
1201 }
1202 
1203 
1204 static int vidioc_g_input(struct file *file, void *priv, unsigned int *input)
1205 {
1206  struct go7007 *go = ((struct go7007_file *) priv)->go;
1207 
1208  *input = go->input;
1209 
1210  return 0;
1211 }
1212 
1213 static int vidioc_s_input(struct file *file, void *priv, unsigned int input)
1214 {
1215  struct go7007 *go = ((struct go7007_file *) priv)->go;
1216 
1217  if (input >= go->board_info->num_inputs)
1218  return -EINVAL;
1219  if (go->streaming)
1220  return -EBUSY;
1221 
1222  go->input = input;
1223 
1224  return call_all(&go->v4l2_dev, video, s_routing, input, 0, 0);
1225 }
1226 
1227 static int vidioc_g_tuner(struct file *file, void *priv,
1228  struct v4l2_tuner *t)
1229 {
1230  struct go7007 *go = ((struct go7007_file *) priv)->go;
1231 
1232  if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1233  return -EINVAL;
1234  if (t->index != 0)
1235  return -EINVAL;
1236  if (!go->i2c_adapter_online)
1237  return -EIO;
1238 
1239  return call_all(&go->v4l2_dev, tuner, g_tuner, t);
1240 }
1241 
1242 static int vidioc_s_tuner(struct file *file, void *priv,
1243  struct v4l2_tuner *t)
1244 {
1245  struct go7007 *go = ((struct go7007_file *) priv)->go;
1246 
1247  if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1248  return -EINVAL;
1249  if (t->index != 0)
1250  return -EINVAL;
1251  if (!go->i2c_adapter_online)
1252  return -EIO;
1253 
1254  switch (go->board_id) {
1257  /* No selectable options currently */
1258  if (t->audmode != V4L2_TUNER_MODE_STEREO)
1259  return -EINVAL;
1260  break;
1261  }
1262 
1263  return call_all(&go->v4l2_dev, tuner, s_tuner, t);
1264 }
1265 
1266 static int vidioc_g_frequency(struct file *file, void *priv,
1267  struct v4l2_frequency *f)
1268 {
1269  struct go7007 *go = ((struct go7007_file *) priv)->go;
1270 
1271  if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1272  return -EINVAL;
1273  if (!go->i2c_adapter_online)
1274  return -EIO;
1275 
1277 
1278  return call_all(&go->v4l2_dev, tuner, g_frequency, f);
1279 }
1280 
1281 static int vidioc_s_frequency(struct file *file, void *priv,
1282  struct v4l2_frequency *f)
1283 {
1284  struct go7007 *go = ((struct go7007_file *) priv)->go;
1285 
1286  if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER))
1287  return -EINVAL;
1288  if (!go->i2c_adapter_online)
1289  return -EIO;
1290 
1291  return call_all(&go->v4l2_dev, tuner, s_frequency, f);
1292 }
1293 
1294 static int vidioc_cropcap(struct file *file, void *priv,
1295  struct v4l2_cropcap *cropcap)
1296 {
1297  struct go7007 *go = ((struct go7007_file *) priv)->go;
1298 
1299  if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1300  return -EINVAL;
1301 
1302  /* These specify the raw input of the sensor */
1303  switch (go->standard) {
1304  case GO7007_STD_NTSC:
1305  cropcap->bounds.top = 0;
1306  cropcap->bounds.left = 0;
1307  cropcap->bounds.width = 720;
1308  cropcap->bounds.height = 480;
1309  cropcap->defrect.top = 0;
1310  cropcap->defrect.left = 0;
1311  cropcap->defrect.width = 720;
1312  cropcap->defrect.height = 480;
1313  break;
1314  case GO7007_STD_PAL:
1315  cropcap->bounds.top = 0;
1316  cropcap->bounds.left = 0;
1317  cropcap->bounds.width = 720;
1318  cropcap->bounds.height = 576;
1319  cropcap->defrect.top = 0;
1320  cropcap->defrect.left = 0;
1321  cropcap->defrect.width = 720;
1322  cropcap->defrect.height = 576;
1323  break;
1324  case GO7007_STD_OTHER:
1325  cropcap->bounds.top = 0;
1326  cropcap->bounds.left = 0;
1327  cropcap->bounds.width = go->board_info->sensor_width;
1328  cropcap->bounds.height = go->board_info->sensor_height;
1329  cropcap->defrect.top = 0;
1330  cropcap->defrect.left = 0;
1331  cropcap->defrect.width = go->board_info->sensor_width;
1332  cropcap->defrect.height = go->board_info->sensor_height;
1333  break;
1334  }
1335 
1336  return 0;
1337 }
1338 
1339 static int vidioc_g_crop(struct file *file, void *priv, struct v4l2_crop *crop)
1340 {
1341  struct go7007 *go = ((struct go7007_file *) priv)->go;
1342 
1343  if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1344  return -EINVAL;
1345 
1347 
1348  /* These specify the raw input of the sensor */
1349  switch (go->standard) {
1350  case GO7007_STD_NTSC:
1351  crop->c.top = 0;
1352  crop->c.left = 0;
1353  crop->c.width = 720;
1354  crop->c.height = 480;
1355  break;
1356  case GO7007_STD_PAL:
1357  crop->c.top = 0;
1358  crop->c.left = 0;
1359  crop->c.width = 720;
1360  crop->c.height = 576;
1361  break;
1362  case GO7007_STD_OTHER:
1363  crop->c.top = 0;
1364  crop->c.left = 0;
1365  crop->c.width = go->board_info->sensor_width;
1366  crop->c.height = go->board_info->sensor_height;
1367  break;
1368  }
1369 
1370  return 0;
1371 }
1372 
1373 /* FIXME: vidioc_s_crop is not really implemented!!!
1374  */
1375 static int vidioc_s_crop(struct file *file, void *priv, const struct v4l2_crop *crop)
1376 {
1377  if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1378  return -EINVAL;
1379 
1380  return 0;
1381 }
1382 
1383 static int vidioc_g_jpegcomp(struct file *file, void *priv,
1384  struct v4l2_jpegcompression *params)
1385 {
1386  memset(params, 0, sizeof(*params));
1387  params->quality = 50; /* ?? */
1390 
1391  return 0;
1392 }
1393 
1394 static int vidioc_s_jpegcomp(struct file *file, void *priv,
1395  const struct v4l2_jpegcompression *params)
1396 {
1397  if (params->quality != 50 ||
1398  params->jpeg_markers != (V4L2_JPEG_MARKER_DHT |
1400  return -EINVAL;
1401 
1402  return 0;
1403 }
1404 
1405 /* FIXME:
1406  Those ioctls are private, and not needed, since several standard
1407  extended controls already provide streaming control.
1408  So, those ioctls should be converted into vidioc_g_ext_ctrls()
1409  and vidioc_s_ext_ctrls()
1410  */
1411 
1412 #if 0
1413  /* Temporary ioctls for controlling compression characteristics */
1414  case GO7007IOC_S_BITRATE:
1415  {
1416  int *bitrate = arg;
1417 
1418  if (go->streaming)
1419  return -EINVAL;
1420  /* Upper bound is kind of arbitrary here */
1421  if (*bitrate < 64000 || *bitrate > 10000000)
1422  return -EINVAL;
1423  go->bitrate = *bitrate;
1424  return 0;
1425  }
1426  case GO7007IOC_G_BITRATE:
1427  {
1428  int *bitrate = arg;
1429 
1430  *bitrate = go->bitrate;
1431  return 0;
1432  }
1434  {
1435  struct go7007_comp_params *comp = arg;
1436 
1437  if (go->format == GO7007_FORMAT_MJPEG)
1438  return -EINVAL;
1439  if (comp->gop_size > 0)
1440  go->gop_size = comp->gop_size;
1441  else
1442  go->gop_size = go->sensor_framerate / 1000;
1443  if (go->gop_size != 15)
1444  go->dvd_mode = 0;
1445  /*go->ipb = comp->max_b_frames > 0;*/ /* completely untested */
1446  if (go->board_info->sensor_flags & GO7007_SENSOR_TV) {
1447  switch (comp->aspect_ratio) {
1451  break;
1455  break;
1456  default:
1458  break;
1459  }
1460  }
1461  if (comp->flags & GO7007_COMP_OMIT_SEQ_HEADER) {
1462  go->dvd_mode = 0;
1463  go->seq_header_enable = 0;
1464  } else {
1465  go->seq_header_enable = 1;
1466  }
1467  /* fall-through */
1468  }
1470  {
1471  struct go7007_comp_params *comp = arg;
1472 
1473  if (go->format == GO7007_FORMAT_MJPEG)
1474  return -EINVAL;
1475  memset(comp, 0, sizeof(*comp));
1476  comp->gop_size = go->gop_size;
1477  comp->max_b_frames = go->ipb ? 2 : 0;
1478  switch (go->aspect_ratio) {
1479  case GO7007_RATIO_4_3:
1480  if (go->standard == GO7007_STD_NTSC)
1481  comp->aspect_ratio =
1483  else
1484  comp->aspect_ratio =
1486  break;
1487  case GO7007_RATIO_16_9:
1488  if (go->standard == GO7007_STD_NTSC)
1489  comp->aspect_ratio =
1491  else
1492  comp->aspect_ratio =
1494  break;
1495  default:
1497  break;
1498  }
1499  if (go->closed_gop)
1500  comp->flags |= GO7007_COMP_CLOSED_GOP;
1501  if (!go->seq_header_enable)
1503  return 0;
1504  }
1506  {
1507  struct go7007_mpeg_params *mpeg = arg;
1508 
1509  if (go->format != GO7007_FORMAT_MPEG1 &&
1510  go->format != GO7007_FORMAT_MPEG2 &&
1511  go->format != GO7007_FORMAT_MPEG4)
1512  return -EINVAL;
1513 
1514  if (mpeg->flags & GO7007_MPEG_FORCE_DVD_MODE) {
1516  go->bitrate = 9800000;
1517  go->gop_size = 15;
1518  go->pali = 0x48;
1519  go->closed_gop = 1;
1520  go->repeat_seqhead = 0;
1521  go->seq_header_enable = 1;
1522  go->gop_header_enable = 1;
1523  go->dvd_mode = 1;
1524  } else {
1525  switch (mpeg->mpeg_video_standard) {
1528  go->pali = 0;
1529  break;
1532  if (mpeg->pali >> 24 == 2)
1533  go->pali = mpeg->pali & 0xff;
1534  else
1535  go->pali = 0x48;
1536  break;
1539  if (mpeg->pali >> 24 == 4)
1540  go->pali = mpeg->pali & 0xff;
1541  else
1542  go->pali = 0xf5;
1543  break;
1544  default:
1545  return -EINVAL;
1546  }
1547  go->gop_header_enable =
1549  ? 0 : 1;
1550  if (mpeg->flags & GO7007_MPEG_REPEAT_SEQHEADER)
1551  go->repeat_seqhead = 1;
1552  else
1553  go->repeat_seqhead = 0;
1554  go->dvd_mode = 0;
1555  }
1556  /* fall-through */
1557  }
1559  {
1560  struct go7007_mpeg_params *mpeg = arg;
1561 
1562  memset(mpeg, 0, sizeof(*mpeg));
1563  switch (go->format) {
1564  case GO7007_FORMAT_MPEG1:
1566  mpeg->pali = 0;
1567  break;
1568  case GO7007_FORMAT_MPEG2:
1570  mpeg->pali = GO7007_MPEG_PROFILE(2, go->pali);
1571  break;
1572  case GO7007_FORMAT_MPEG4:
1574  mpeg->pali = GO7007_MPEG_PROFILE(4, go->pali);
1575  break;
1576  default:
1577  return -EINVAL;
1578  }
1579  if (!go->gop_header_enable)
1581  if (go->repeat_seqhead)
1583  if (go->dvd_mode)
1585  return 0;
1586  }
1587  case GO7007IOC_S_MD_PARAMS:
1588  {
1589  struct go7007_md_params *mdp = arg;
1590 
1591  if (mdp->region > 3)
1592  return -EINVAL;
1593  if (mdp->trigger > 0) {
1594  go->modet[mdp->region].pixel_threshold =
1595  mdp->pixel_threshold >> 1;
1596  go->modet[mdp->region].motion_threshold =
1597  mdp->motion_threshold >> 1;
1598  go->modet[mdp->region].mb_threshold =
1599  mdp->trigger >> 1;
1600  go->modet[mdp->region].enable = 1;
1601  } else
1602  go->modet[mdp->region].enable = 0;
1603  /* fall-through */
1604  }
1605  case GO7007IOC_G_MD_PARAMS:
1606  {
1607  struct go7007_md_params *mdp = arg;
1608  int region = mdp->region;
1609 
1610  if (mdp->region > 3)
1611  return -EINVAL;
1612  memset(mdp, 0, sizeof(struct go7007_md_params));
1613  mdp->region = region;
1614  if (!go->modet[region].enable)
1615  return 0;
1616  mdp->pixel_threshold =
1617  (go->modet[region].pixel_threshold << 1) + 1;
1618  mdp->motion_threshold =
1619  (go->modet[region].motion_threshold << 1) + 1;
1620  mdp->trigger =
1621  (go->modet[region].mb_threshold << 1) + 1;
1622  return 0;
1623  }
1624  case GO7007IOC_S_MD_REGION:
1625  {
1626  struct go7007_md_region *region = arg;
1627 
1628  if (region->region < 1 || region->region > 3)
1629  return -EINVAL;
1630  return clip_to_modet_map(go, region->region, region->clips);
1631  }
1632 #endif
1633 
1634 static ssize_t go7007_read(struct file *file, char __user *data,
1635  size_t count, loff_t *ppos)
1636 {
1637  return -EINVAL;
1638 }
1639 
1640 static void go7007_vm_open(struct vm_area_struct *vma)
1641 {
1642  struct go7007_buffer *gobuf = vma->vm_private_data;
1643 
1644  ++gobuf->mapped;
1645 }
1646 
1647 static void go7007_vm_close(struct vm_area_struct *vma)
1648 {
1649  struct go7007_buffer *gobuf = vma->vm_private_data;
1650  unsigned long flags;
1651 
1652  if (--gobuf->mapped == 0) {
1653  spin_lock_irqsave(&gobuf->go->spinlock, flags);
1654  deactivate_buffer(gobuf);
1655  spin_unlock_irqrestore(&gobuf->go->spinlock, flags);
1656  }
1657 }
1658 
1659 /* Copied from videobuf-dma-sg.c */
1660 static int go7007_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1661 {
1662  struct page *page;
1663 
1664  page = alloc_page(GFP_USER | __GFP_DMA32);
1665  if (!page)
1666  return VM_FAULT_OOM;
1667  clear_user_highpage(page, (unsigned long)vmf->virtual_address);
1668  vmf->page = page;
1669  return 0;
1670 }
1671 
1672 static struct vm_operations_struct go7007_vm_ops = {
1673  .open = go7007_vm_open,
1674  .close = go7007_vm_close,
1675  .fault = go7007_vm_fault,
1676 };
1677 
1678 static int go7007_mmap(struct file *file, struct vm_area_struct *vma)
1679 {
1680  struct go7007_file *gofh = file->private_data;
1681  unsigned int index;
1682 
1683  if (gofh->go->status != STATUS_ONLINE)
1684  return -EIO;
1685  if (!(vma->vm_flags & VM_SHARED))
1686  return -EINVAL; /* only support VM_SHARED mapping */
1687  if (vma->vm_end - vma->vm_start != GO7007_BUF_SIZE)
1688  return -EINVAL; /* must map exactly one full buffer */
1689  mutex_lock(&gofh->lock);
1690  index = vma->vm_pgoff / GO7007_BUF_PAGES;
1691  if (index >= gofh->buf_count) {
1692  mutex_unlock(&gofh->lock);
1693  return -EINVAL; /* trying to map beyond requested buffers */
1694  }
1695  if (index * GO7007_BUF_PAGES != vma->vm_pgoff) {
1696  mutex_unlock(&gofh->lock);
1697  return -EINVAL; /* offset is not aligned on buffer boundary */
1698  }
1699  if (gofh->bufs[index].mapped > 0) {
1700  mutex_unlock(&gofh->lock);
1701  return -EBUSY;
1702  }
1703  gofh->bufs[index].mapped = 1;
1704  gofh->bufs[index].user_addr = vma->vm_start;
1705  vma->vm_ops = &go7007_vm_ops;
1706  vma->vm_flags |= VM_DONTEXPAND;
1707  vma->vm_flags &= ~VM_IO;
1708  vma->vm_private_data = &gofh->bufs[index];
1709  mutex_unlock(&gofh->lock);
1710  return 0;
1711 }
1712 
1713 static unsigned int go7007_poll(struct file *file, poll_table *wait)
1714 {
1715  struct go7007_file *gofh = file->private_data;
1716  struct go7007_buffer *gobuf;
1717 
1718  if (list_empty(&gofh->go->stream))
1719  return POLLERR;
1720  gobuf = list_entry(gofh->go->stream.next, struct go7007_buffer, stream);
1721  poll_wait(file, &gofh->go->frame_waitq, wait);
1722  if (gobuf->state == BUF_STATE_DONE)
1723  return POLLIN | POLLRDNORM;
1724  return 0;
1725 }
1726 
1727 static void go7007_vfl_release(struct video_device *vfd)
1728 {
1729  struct go7007 *go = video_get_drvdata(vfd);
1730 
1731  video_device_release(vfd);
1732  if (--go->ref_count == 0)
1733  kfree(go);
1734 }
1735 
1736 static struct v4l2_file_operations go7007_fops = {
1737  .owner = THIS_MODULE,
1738  .open = go7007_open,
1739  .release = go7007_release,
1740  .ioctl = video_ioctl2,
1741  .read = go7007_read,
1742  .mmap = go7007_mmap,
1743  .poll = go7007_poll,
1744 };
1745 
1746 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1747  .vidioc_querycap = vidioc_querycap,
1748  .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1749  .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1750  .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1751  .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1752  .vidioc_reqbufs = vidioc_reqbufs,
1753  .vidioc_querybuf = vidioc_querybuf,
1754  .vidioc_qbuf = vidioc_qbuf,
1755  .vidioc_dqbuf = vidioc_dqbuf,
1756  .vidioc_g_std = vidioc_g_std,
1757  .vidioc_s_std = vidioc_s_std,
1758  .vidioc_querystd = vidioc_querystd,
1759  .vidioc_enum_input = vidioc_enum_input,
1760  .vidioc_g_input = vidioc_g_input,
1761  .vidioc_s_input = vidioc_s_input,
1762  .vidioc_queryctrl = vidioc_queryctrl,
1763  .vidioc_g_ctrl = vidioc_g_ctrl,
1764  .vidioc_s_ctrl = vidioc_s_ctrl,
1765  .vidioc_streamon = vidioc_streamon,
1766  .vidioc_streamoff = vidioc_streamoff,
1767  .vidioc_g_tuner = vidioc_g_tuner,
1768  .vidioc_s_tuner = vidioc_s_tuner,
1769  .vidioc_g_frequency = vidioc_g_frequency,
1770  .vidioc_s_frequency = vidioc_s_frequency,
1771  .vidioc_g_parm = vidioc_g_parm,
1772  .vidioc_s_parm = vidioc_s_parm,
1773  .vidioc_enum_framesizes = vidioc_enum_framesizes,
1774  .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1775  .vidioc_cropcap = vidioc_cropcap,
1776  .vidioc_g_crop = vidioc_g_crop,
1777  .vidioc_s_crop = vidioc_s_crop,
1778  .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1779  .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1780 };
1781 
1782 static struct video_device go7007_template = {
1783  .name = "go7007",
1784  .fops = &go7007_fops,
1785  .release = go7007_vfl_release,
1786  .ioctl_ops = &video_ioctl_ops,
1787  .tvnorms = V4L2_STD_ALL,
1788  .current_norm = V4L2_STD_NTSC,
1789 };
1790 
1791 int go7007_v4l2_init(struct go7007 *go)
1792 {
1793  int rv;
1794 
1795  go->video_dev = video_device_alloc();
1796  if (go->video_dev == NULL)
1797  return -ENOMEM;
1798  *go->video_dev = go7007_template;
1799  go->video_dev->parent = go->dev;
1800  rv = video_register_device(go->video_dev, VFL_TYPE_GRABBER, -1);
1801  if (rv < 0) {
1803  go->video_dev = NULL;
1804  return rv;
1805  }
1806  rv = v4l2_device_register(go->dev, &go->v4l2_dev);
1807  if (rv < 0) {
1809  go->video_dev = NULL;
1810  return rv;
1811  }
1812  video_set_drvdata(go->video_dev, go);
1813  ++go->ref_count;
1814  printk(KERN_INFO "%s: registered device %s [v4l2]\n",
1815  go->video_dev->name, video_device_node_name(go->video_dev));
1816 
1817  return 0;
1818 }
1819 
1820 void go7007_v4l2_remove(struct go7007 *go)
1821 {
1822  unsigned long flags;
1823 
1824  mutex_lock(&go->hw_lock);
1825  if (go->streaming) {
1826  go->streaming = 0;
1827  go7007_stream_stop(go);
1828  spin_lock_irqsave(&go->spinlock, flags);
1829  abort_queued(go);
1830  spin_unlock_irqrestore(&go->spinlock, flags);
1831  }
1832  mutex_unlock(&go->hw_lock);
1833  if (go->video_dev)
1836 }