Merge tag 'armsoc-dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[deliverable/linux.git] / drivers / media / usb / go7007 / go7007-v4l2.c
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
14 #include <linux/module.h>
15 #include <linux/delay.h>
16 #include <linux/sched.h>
17 #include <linux/spinlock.h>
18 #include <linux/slab.h>
19 #include <linux/fs.h>
20 #include <linux/unistd.h>
21 #include <linux/time.h>
22 #include <linux/vmalloc.h>
23 #include <linux/pagemap.h>
24 #include <linux/i2c.h>
25 #include <linux/mutex.h>
26 #include <linux/uaccess.h>
27 #include <linux/videodev2.h>
28 #include <media/v4l2-common.h>
29 #include <media/v4l2-ioctl.h>
30 #include <media/v4l2-subdev.h>
31 #include <media/v4l2-event.h>
32 #include <media/videobuf2-vmalloc.h>
33 #include <media/i2c/saa7115.h>
34
35 #include "go7007-priv.h"
36
37 #define call_all(dev, o, f, args...) \
38 v4l2_device_call_until_err(dev, 0, o, f, ##args)
39
40 static bool valid_pixelformat(u32 pixelformat)
41 {
42 switch (pixelformat) {
43 case V4L2_PIX_FMT_MJPEG:
44 case V4L2_PIX_FMT_MPEG1:
45 case V4L2_PIX_FMT_MPEG2:
46 case V4L2_PIX_FMT_MPEG4:
47 return true;
48 default:
49 return false;
50 }
51 }
52
53 static u32 get_frame_type_flag(struct go7007_buffer *vb, int format)
54 {
55 u8 *ptr = vb2_plane_vaddr(&vb->vb.vb2_buf, 0);
56
57 switch (format) {
58 case V4L2_PIX_FMT_MJPEG:
59 return V4L2_BUF_FLAG_KEYFRAME;
60 case V4L2_PIX_FMT_MPEG4:
61 switch ((ptr[vb->frame_offset + 4] >> 6) & 0x3) {
62 case 0:
63 return V4L2_BUF_FLAG_KEYFRAME;
64 case 1:
65 return V4L2_BUF_FLAG_PFRAME;
66 case 2:
67 return V4L2_BUF_FLAG_BFRAME;
68 default:
69 return 0;
70 }
71 case V4L2_PIX_FMT_MPEG1:
72 case V4L2_PIX_FMT_MPEG2:
73 switch ((ptr[vb->frame_offset + 5] >> 3) & 0x7) {
74 case 1:
75 return V4L2_BUF_FLAG_KEYFRAME;
76 case 2:
77 return V4L2_BUF_FLAG_PFRAME;
78 case 3:
79 return V4L2_BUF_FLAG_BFRAME;
80 default:
81 return 0;
82 }
83 }
84
85 return 0;
86 }
87
88 static void get_resolution(struct go7007 *go, int *width, int *height)
89 {
90 switch (go->standard) {
91 case GO7007_STD_NTSC:
92 *width = 720;
93 *height = 480;
94 break;
95 case GO7007_STD_PAL:
96 *width = 720;
97 *height = 576;
98 break;
99 case GO7007_STD_OTHER:
100 default:
101 *width = go->board_info->sensor_width;
102 *height = go->board_info->sensor_height;
103 break;
104 }
105 }
106
107 static void set_formatting(struct go7007 *go)
108 {
109 if (go->format == V4L2_PIX_FMT_MJPEG) {
110 go->pali = 0;
111 go->aspect_ratio = GO7007_RATIO_1_1;
112 go->gop_size = 0;
113 go->ipb = 0;
114 go->closed_gop = 0;
115 go->repeat_seqhead = 0;
116 go->seq_header_enable = 0;
117 go->gop_header_enable = 0;
118 go->dvd_mode = 0;
119 return;
120 }
121
122 switch (go->format) {
123 case V4L2_PIX_FMT_MPEG1:
124 go->pali = 0;
125 break;
126 default:
127 case V4L2_PIX_FMT_MPEG2:
128 go->pali = 0x48;
129 break;
130 case V4L2_PIX_FMT_MPEG4:
131 /* For future reference: this is the list of MPEG4
132 * profiles that are available, although they are
133 * untested:
134 *
135 * Profile pali
136 * -------------- ----
137 * PROFILE_S_L0 0x08
138 * PROFILE_S_L1 0x01
139 * PROFILE_S_L2 0x02
140 * PROFILE_S_L3 0x03
141 * PROFILE_ARTS_L1 0x91
142 * PROFILE_ARTS_L2 0x92
143 * PROFILE_ARTS_L3 0x93
144 * PROFILE_ARTS_L4 0x94
145 * PROFILE_AS_L0 0xf0
146 * PROFILE_AS_L1 0xf1
147 * PROFILE_AS_L2 0xf2
148 * PROFILE_AS_L3 0xf3
149 * PROFILE_AS_L4 0xf4
150 * PROFILE_AS_L5 0xf5
151 */
152 go->pali = 0xf5;
153 break;
154 }
155 go->gop_size = v4l2_ctrl_g_ctrl(go->mpeg_video_gop_size);
156 go->closed_gop = v4l2_ctrl_g_ctrl(go->mpeg_video_gop_closure);
157 go->ipb = v4l2_ctrl_g_ctrl(go->mpeg_video_b_frames) != 0;
158 go->bitrate = v4l2_ctrl_g_ctrl(go->mpeg_video_bitrate);
159 go->repeat_seqhead = v4l2_ctrl_g_ctrl(go->mpeg_video_rep_seqheader);
160 go->gop_header_enable = 1;
161 go->dvd_mode = 0;
162 if (go->format == V4L2_PIX_FMT_MPEG2)
163 go->dvd_mode =
164 go->bitrate == 9800000 &&
165 go->gop_size == 15 &&
166 go->ipb == 0 &&
167 go->repeat_seqhead == 1 &&
168 go->closed_gop;
169
170 switch (v4l2_ctrl_g_ctrl(go->mpeg_video_aspect_ratio)) {
171 default:
172 case V4L2_MPEG_VIDEO_ASPECT_1x1:
173 go->aspect_ratio = GO7007_RATIO_1_1;
174 break;
175 case V4L2_MPEG_VIDEO_ASPECT_4x3:
176 go->aspect_ratio = GO7007_RATIO_4_3;
177 break;
178 case V4L2_MPEG_VIDEO_ASPECT_16x9:
179 go->aspect_ratio = GO7007_RATIO_16_9;
180 break;
181 }
182 }
183
184 static int set_capture_size(struct go7007 *go, struct v4l2_format *fmt, int try)
185 {
186 int sensor_height = 0, sensor_width = 0;
187 int width, height;
188
189 if (fmt != NULL && !valid_pixelformat(fmt->fmt.pix.pixelformat))
190 return -EINVAL;
191
192 get_resolution(go, &sensor_width, &sensor_height);
193
194 if (fmt == NULL) {
195 width = sensor_width;
196 height = sensor_height;
197 } else if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
198 if (fmt->fmt.pix.width > sensor_width)
199 width = sensor_width;
200 else if (fmt->fmt.pix.width < 144)
201 width = 144;
202 else
203 width = fmt->fmt.pix.width & ~0x0f;
204
205 if (fmt->fmt.pix.height > sensor_height)
206 height = sensor_height;
207 else if (fmt->fmt.pix.height < 96)
208 height = 96;
209 else
210 height = fmt->fmt.pix.height & ~0x0f;
211 } else {
212 width = fmt->fmt.pix.width;
213
214 if (width <= sensor_width / 4) {
215 width = sensor_width / 4;
216 height = sensor_height / 4;
217 } else if (width <= sensor_width / 2) {
218 width = sensor_width / 2;
219 height = sensor_height / 2;
220 } else {
221 width = sensor_width;
222 height = sensor_height;
223 }
224 width &= ~0xf;
225 height &= ~0xf;
226 }
227
228 if (fmt != NULL) {
229 u32 pixelformat = fmt->fmt.pix.pixelformat;
230
231 memset(fmt, 0, sizeof(*fmt));
232 fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
233 fmt->fmt.pix.width = width;
234 fmt->fmt.pix.height = height;
235 fmt->fmt.pix.pixelformat = pixelformat;
236 fmt->fmt.pix.field = V4L2_FIELD_NONE;
237 fmt->fmt.pix.bytesperline = 0;
238 fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
239 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
240 }
241
242 if (try)
243 return 0;
244
245 if (fmt)
246 go->format = fmt->fmt.pix.pixelformat;
247 go->width = width;
248 go->height = height;
249 go->encoder_h_offset = go->board_info->sensor_h_offset;
250 go->encoder_v_offset = go->board_info->sensor_v_offset;
251
252 if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING) {
253 struct v4l2_subdev_format format = {
254 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
255 };
256
257 format.format.code = MEDIA_BUS_FMT_FIXED;
258 format.format.width = fmt ? fmt->fmt.pix.width : width;
259 format.format.height = height;
260 go->encoder_h_halve = 0;
261 go->encoder_v_halve = 0;
262 go->encoder_subsample = 0;
263 call_all(&go->v4l2_dev, pad, set_fmt, NULL, &format);
264 } else {
265 if (width <= sensor_width / 4) {
266 go->encoder_h_halve = 1;
267 go->encoder_v_halve = 1;
268 go->encoder_subsample = 1;
269 } else if (width <= sensor_width / 2) {
270 go->encoder_h_halve = 1;
271 go->encoder_v_halve = 1;
272 go->encoder_subsample = 0;
273 } else {
274 go->encoder_h_halve = 0;
275 go->encoder_v_halve = 0;
276 go->encoder_subsample = 0;
277 }
278 }
279 return 0;
280 }
281
282 static int vidioc_querycap(struct file *file, void *priv,
283 struct v4l2_capability *cap)
284 {
285 struct go7007 *go = video_drvdata(file);
286
287 strlcpy(cap->driver, "go7007", sizeof(cap->driver));
288 strlcpy(cap->card, go->name, sizeof(cap->card));
289 strlcpy(cap->bus_info, go->bus_info, sizeof(cap->bus_info));
290
291 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
292 V4L2_CAP_STREAMING;
293
294 if (go->board_info->num_aud_inputs)
295 cap->device_caps |= V4L2_CAP_AUDIO;
296 if (go->board_info->flags & GO7007_BOARD_HAS_TUNER)
297 cap->device_caps |= V4L2_CAP_TUNER;
298 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
299 return 0;
300 }
301
302 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
303 struct v4l2_fmtdesc *fmt)
304 {
305 char *desc = NULL;
306
307 switch (fmt->index) {
308 case 0:
309 fmt->pixelformat = V4L2_PIX_FMT_MJPEG;
310 desc = "Motion JPEG";
311 break;
312 case 1:
313 fmt->pixelformat = V4L2_PIX_FMT_MPEG1;
314 desc = "MPEG-1 ES";
315 break;
316 case 2:
317 fmt->pixelformat = V4L2_PIX_FMT_MPEG2;
318 desc = "MPEG-2 ES";
319 break;
320 case 3:
321 fmt->pixelformat = V4L2_PIX_FMT_MPEG4;
322 desc = "MPEG-4 ES";
323 break;
324 default:
325 return -EINVAL;
326 }
327 fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
328 fmt->flags = V4L2_FMT_FLAG_COMPRESSED;
329
330 strncpy(fmt->description, desc, sizeof(fmt->description));
331
332 return 0;
333 }
334
335 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
336 struct v4l2_format *fmt)
337 {
338 struct go7007 *go = video_drvdata(file);
339
340 fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
341 fmt->fmt.pix.width = go->width;
342 fmt->fmt.pix.height = go->height;
343 fmt->fmt.pix.pixelformat = go->format;
344 fmt->fmt.pix.field = V4L2_FIELD_NONE;
345 fmt->fmt.pix.bytesperline = 0;
346 fmt->fmt.pix.sizeimage = GO7007_BUF_SIZE;
347 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
348
349 return 0;
350 }
351
352 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
353 struct v4l2_format *fmt)
354 {
355 struct go7007 *go = video_drvdata(file);
356
357 return set_capture_size(go, fmt, 1);
358 }
359
360 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
361 struct v4l2_format *fmt)
362 {
363 struct go7007 *go = video_drvdata(file);
364
365 if (vb2_is_busy(&go->vidq))
366 return -EBUSY;
367
368 return set_capture_size(go, fmt, 0);
369 }
370
371 static int go7007_queue_setup(struct vb2_queue *q,
372 unsigned int *num_buffers, unsigned int *num_planes,
373 unsigned int sizes[], void *alloc_ctxs[])
374 {
375 sizes[0] = GO7007_BUF_SIZE;
376 *num_planes = 1;
377
378 if (*num_buffers < 2)
379 *num_buffers = 2;
380
381 return 0;
382 }
383
384 static void go7007_buf_queue(struct vb2_buffer *vb)
385 {
386 struct vb2_queue *vq = vb->vb2_queue;
387 struct go7007 *go = vb2_get_drv_priv(vq);
388 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
389 struct go7007_buffer *go7007_vb =
390 container_of(vbuf, struct go7007_buffer, vb);
391 unsigned long flags;
392
393 spin_lock_irqsave(&go->spinlock, flags);
394 list_add_tail(&go7007_vb->list, &go->vidq_active);
395 spin_unlock_irqrestore(&go->spinlock, flags);
396 }
397
398 static int go7007_buf_prepare(struct vb2_buffer *vb)
399 {
400 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
401 struct go7007_buffer *go7007_vb =
402 container_of(vbuf, struct go7007_buffer, vb);
403
404 go7007_vb->modet_active = 0;
405 go7007_vb->frame_offset = 0;
406 vb->planes[0].bytesused = 0;
407 return 0;
408 }
409
410 static void go7007_buf_finish(struct vb2_buffer *vb)
411 {
412 struct vb2_queue *vq = vb->vb2_queue;
413 struct go7007 *go = vb2_get_drv_priv(vq);
414 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
415 struct go7007_buffer *go7007_vb =
416 container_of(vbuf, struct go7007_buffer, vb);
417 u32 frame_type_flag = get_frame_type_flag(go7007_vb, go->format);
418
419 vbuf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_BFRAME |
420 V4L2_BUF_FLAG_PFRAME);
421 vbuf->flags |= frame_type_flag;
422 vbuf->field = V4L2_FIELD_NONE;
423 }
424
425 static int go7007_start_streaming(struct vb2_queue *q, unsigned int count)
426 {
427 struct go7007 *go = vb2_get_drv_priv(q);
428 int ret;
429
430 set_formatting(go);
431 mutex_lock(&go->hw_lock);
432 go->next_seq = 0;
433 go->active_buf = NULL;
434 go->modet_event_status = 0;
435 q->streaming = 1;
436 if (go7007_start_encoder(go) < 0)
437 ret = -EIO;
438 else
439 ret = 0;
440 mutex_unlock(&go->hw_lock);
441 if (ret) {
442 q->streaming = 0;
443 return ret;
444 }
445 call_all(&go->v4l2_dev, video, s_stream, 1);
446 v4l2_ctrl_grab(go->mpeg_video_gop_size, true);
447 v4l2_ctrl_grab(go->mpeg_video_gop_closure, true);
448 v4l2_ctrl_grab(go->mpeg_video_bitrate, true);
449 v4l2_ctrl_grab(go->mpeg_video_aspect_ratio, true);
450 /* Turn on Capture LED */
451 if (go->board_id == GO7007_BOARDID_ADS_USBAV_709)
452 go7007_write_addr(go, 0x3c82, 0x0005);
453 return ret;
454 }
455
456 static void go7007_stop_streaming(struct vb2_queue *q)
457 {
458 struct go7007 *go = vb2_get_drv_priv(q);
459 unsigned long flags;
460
461 q->streaming = 0;
462 go7007_stream_stop(go);
463 mutex_lock(&go->hw_lock);
464 go7007_reset_encoder(go);
465 mutex_unlock(&go->hw_lock);
466 call_all(&go->v4l2_dev, video, s_stream, 0);
467
468 spin_lock_irqsave(&go->spinlock, flags);
469 INIT_LIST_HEAD(&go->vidq_active);
470 spin_unlock_irqrestore(&go->spinlock, flags);
471 v4l2_ctrl_grab(go->mpeg_video_gop_size, false);
472 v4l2_ctrl_grab(go->mpeg_video_gop_closure, false);
473 v4l2_ctrl_grab(go->mpeg_video_bitrate, false);
474 v4l2_ctrl_grab(go->mpeg_video_aspect_ratio, false);
475 /* Turn on Capture LED */
476 if (go->board_id == GO7007_BOARDID_ADS_USBAV_709)
477 go7007_write_addr(go, 0x3c82, 0x000d);
478 }
479
480 static struct vb2_ops go7007_video_qops = {
481 .queue_setup = go7007_queue_setup,
482 .buf_queue = go7007_buf_queue,
483 .buf_prepare = go7007_buf_prepare,
484 .buf_finish = go7007_buf_finish,
485 .start_streaming = go7007_start_streaming,
486 .stop_streaming = go7007_stop_streaming,
487 .wait_prepare = vb2_ops_wait_prepare,
488 .wait_finish = vb2_ops_wait_finish,
489 };
490
491 static int vidioc_g_parm(struct file *filp, void *priv,
492 struct v4l2_streamparm *parm)
493 {
494 struct go7007 *go = video_drvdata(filp);
495 struct v4l2_fract timeperframe = {
496 .numerator = 1001 * go->fps_scale,
497 .denominator = go->sensor_framerate,
498 };
499
500 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
501 return -EINVAL;
502
503 parm->parm.capture.readbuffers = 2;
504 parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
505 parm->parm.capture.timeperframe = timeperframe;
506
507 return 0;
508 }
509
510 static int vidioc_s_parm(struct file *filp, void *priv,
511 struct v4l2_streamparm *parm)
512 {
513 struct go7007 *go = video_drvdata(filp);
514 unsigned int n, d;
515
516 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
517 return -EINVAL;
518
519 n = go->sensor_framerate *
520 parm->parm.capture.timeperframe.numerator;
521 d = 1001 * parm->parm.capture.timeperframe.denominator;
522 if (n != 0 && d != 0 && n > d)
523 go->fps_scale = (n + d/2) / d;
524 else
525 go->fps_scale = 1;
526
527 return vidioc_g_parm(filp, priv, parm);
528 }
529
530 /* VIDIOC_ENUMSTD on go7007 were used for enumerating the supported fps and
531 its resolution, when the device is not connected to TV.
532 This is were an API abuse, probably used by the lack of specific IOCTL's to
533 enumerate it, by the time the driver was written.
534
535 However, since kernel 2.6.19, two new ioctls (VIDIOC_ENUM_FRAMEINTERVALS
536 and VIDIOC_ENUM_FRAMESIZES) were added for this purpose.
537
538 The two functions below implement the newer ioctls
539 */
540 static int vidioc_enum_framesizes(struct file *filp, void *priv,
541 struct v4l2_frmsizeenum *fsize)
542 {
543 struct go7007 *go = video_drvdata(filp);
544 int width, height;
545
546 if (fsize->index > 2)
547 return -EINVAL;
548
549 if (!valid_pixelformat(fsize->pixel_format))
550 return -EINVAL;
551
552 get_resolution(go, &width, &height);
553 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
554 fsize->discrete.width = (width >> fsize->index) & ~0xf;
555 fsize->discrete.height = (height >> fsize->index) & ~0xf;
556 return 0;
557 }
558
559 static int vidioc_enum_frameintervals(struct file *filp, void *priv,
560 struct v4l2_frmivalenum *fival)
561 {
562 struct go7007 *go = video_drvdata(filp);
563 int width, height;
564 int i;
565
566 if (fival->index > 4)
567 return -EINVAL;
568
569 if (!valid_pixelformat(fival->pixel_format))
570 return -EINVAL;
571
572 if (!(go->board_info->sensor_flags & GO7007_SENSOR_SCALING)) {
573 get_resolution(go, &width, &height);
574 for (i = 0; i <= 2; i++)
575 if (fival->width == ((width >> i) & ~0xf) &&
576 fival->height == ((height >> i) & ~0xf))
577 break;
578 if (i > 2)
579 return -EINVAL;
580 }
581 fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
582 fival->discrete.numerator = 1001 * (fival->index + 1);
583 fival->discrete.denominator = go->sensor_framerate;
584 return 0;
585 }
586
587 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *std)
588 {
589 struct go7007 *go = video_drvdata(file);
590
591 *std = go->std;
592 return 0;
593 }
594
595 static int go7007_s_std(struct go7007 *go)
596 {
597 if (go->std & V4L2_STD_625_50) {
598 go->standard = GO7007_STD_PAL;
599 go->sensor_framerate = 25025;
600 } else {
601 go->standard = GO7007_STD_NTSC;
602 go->sensor_framerate = 30000;
603 }
604
605 call_all(&go->v4l2_dev, video, s_std, go->std);
606 set_capture_size(go, NULL, 0);
607 return 0;
608 }
609
610 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id std)
611 {
612 struct go7007 *go = video_drvdata(file);
613
614 if (vb2_is_busy(&go->vidq))
615 return -EBUSY;
616
617 go->std = std;
618
619 return go7007_s_std(go);
620 }
621
622 static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *std)
623 {
624 struct go7007 *go = video_drvdata(file);
625
626 return call_all(&go->v4l2_dev, video, querystd, std);
627 }
628
629 static int vidioc_enum_input(struct file *file, void *priv,
630 struct v4l2_input *inp)
631 {
632 struct go7007 *go = video_drvdata(file);
633
634 if (inp->index >= go->board_info->num_inputs)
635 return -EINVAL;
636
637 strncpy(inp->name, go->board_info->inputs[inp->index].name,
638 sizeof(inp->name));
639
640 /* If this board has a tuner, it will be the first input */
641 if ((go->board_info->flags & GO7007_BOARD_HAS_TUNER) &&
642 inp->index == 0)
643 inp->type = V4L2_INPUT_TYPE_TUNER;
644 else
645 inp->type = V4L2_INPUT_TYPE_CAMERA;
646
647 if (go->board_info->num_aud_inputs)
648 inp->audioset = (1 << go->board_info->num_aud_inputs) - 1;
649 else
650 inp->audioset = 0;
651 inp->tuner = 0;
652 if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
653 inp->std = video_devdata(file)->tvnorms;
654 else
655 inp->std = 0;
656
657 return 0;
658 }
659
660
661 static int vidioc_g_input(struct file *file, void *priv, unsigned int *input)
662 {
663 struct go7007 *go = video_drvdata(file);
664
665 *input = go->input;
666
667 return 0;
668 }
669
670 static int vidioc_enumaudio(struct file *file, void *fh, struct v4l2_audio *a)
671 {
672 struct go7007 *go = video_drvdata(file);
673
674 if (a->index >= go->board_info->num_aud_inputs)
675 return -EINVAL;
676 strlcpy(a->name, go->board_info->aud_inputs[a->index].name,
677 sizeof(a->name));
678 a->capability = V4L2_AUDCAP_STEREO;
679 return 0;
680 }
681
682 static int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *a)
683 {
684 struct go7007 *go = video_drvdata(file);
685
686 a->index = go->aud_input;
687 strlcpy(a->name, go->board_info->aud_inputs[go->aud_input].name,
688 sizeof(a->name));
689 a->capability = V4L2_AUDCAP_STEREO;
690 return 0;
691 }
692
693 static int vidioc_s_audio(struct file *file, void *fh,
694 const struct v4l2_audio *a)
695 {
696 struct go7007 *go = video_drvdata(file);
697
698 if (a->index >= go->board_info->num_aud_inputs)
699 return -EINVAL;
700 go->aud_input = a->index;
701 v4l2_subdev_call(go->sd_audio, audio, s_routing,
702 go->board_info->aud_inputs[go->aud_input].audio_input, 0, 0);
703 return 0;
704 }
705
706 static void go7007_s_input(struct go7007 *go)
707 {
708 unsigned int input = go->input;
709
710 v4l2_subdev_call(go->sd_video, video, s_routing,
711 go->board_info->inputs[input].video_input, 0,
712 go->board_info->video_config);
713 if (go->board_info->num_aud_inputs) {
714 int aud_input = go->board_info->inputs[input].audio_index;
715
716 v4l2_subdev_call(go->sd_audio, audio, s_routing,
717 go->board_info->aud_inputs[aud_input].audio_input, 0, 0);
718 go->aud_input = aud_input;
719 }
720 }
721
722 static int vidioc_s_input(struct file *file, void *priv, unsigned int input)
723 {
724 struct go7007 *go = video_drvdata(file);
725
726 if (input >= go->board_info->num_inputs)
727 return -EINVAL;
728 if (vb2_is_busy(&go->vidq))
729 return -EBUSY;
730
731 go->input = input;
732 go7007_s_input(go);
733
734 return 0;
735 }
736
737 static int vidioc_g_tuner(struct file *file, void *priv,
738 struct v4l2_tuner *t)
739 {
740 struct go7007 *go = video_drvdata(file);
741
742 if (t->index != 0)
743 return -EINVAL;
744
745 strlcpy(t->name, "Tuner", sizeof(t->name));
746 return call_all(&go->v4l2_dev, tuner, g_tuner, t);
747 }
748
749 static int vidioc_s_tuner(struct file *file, void *priv,
750 const struct v4l2_tuner *t)
751 {
752 struct go7007 *go = video_drvdata(file);
753
754 if (t->index != 0)
755 return -EINVAL;
756
757 return call_all(&go->v4l2_dev, tuner, s_tuner, t);
758 }
759
760 static int vidioc_g_frequency(struct file *file, void *priv,
761 struct v4l2_frequency *f)
762 {
763 struct go7007 *go = video_drvdata(file);
764
765 if (f->tuner)
766 return -EINVAL;
767
768 return call_all(&go->v4l2_dev, tuner, g_frequency, f);
769 }
770
771 static int vidioc_s_frequency(struct file *file, void *priv,
772 const struct v4l2_frequency *f)
773 {
774 struct go7007 *go = video_drvdata(file);
775
776 if (f->tuner)
777 return -EINVAL;
778
779 return call_all(&go->v4l2_dev, tuner, s_frequency, f);
780 }
781
782 static int vidioc_log_status(struct file *file, void *priv)
783 {
784 struct go7007 *go = video_drvdata(file);
785
786 v4l2_ctrl_log_status(file, priv);
787 return call_all(&go->v4l2_dev, core, log_status);
788 }
789
790 static int vidioc_subscribe_event(struct v4l2_fh *fh,
791 const struct v4l2_event_subscription *sub)
792 {
793
794 switch (sub->type) {
795 case V4L2_EVENT_CTRL:
796 return v4l2_ctrl_subscribe_event(fh, sub);
797 case V4L2_EVENT_MOTION_DET:
798 /* Allow for up to 30 events (1 second for NTSC) to be
799 * stored. */
800 return v4l2_event_subscribe(fh, sub, 30, NULL);
801 }
802 return -EINVAL;
803 }
804
805
806 static int go7007_s_ctrl(struct v4l2_ctrl *ctrl)
807 {
808 struct go7007 *go =
809 container_of(ctrl->handler, struct go7007, hdl);
810 unsigned y;
811 u8 *mt;
812
813 switch (ctrl->id) {
814 case V4L2_CID_PIXEL_THRESHOLD0:
815 go->modet[0].pixel_threshold = ctrl->val;
816 break;
817 case V4L2_CID_MOTION_THRESHOLD0:
818 go->modet[0].motion_threshold = ctrl->val;
819 break;
820 case V4L2_CID_MB_THRESHOLD0:
821 go->modet[0].mb_threshold = ctrl->val;
822 break;
823 case V4L2_CID_PIXEL_THRESHOLD1:
824 go->modet[1].pixel_threshold = ctrl->val;
825 break;
826 case V4L2_CID_MOTION_THRESHOLD1:
827 go->modet[1].motion_threshold = ctrl->val;
828 break;
829 case V4L2_CID_MB_THRESHOLD1:
830 go->modet[1].mb_threshold = ctrl->val;
831 break;
832 case V4L2_CID_PIXEL_THRESHOLD2:
833 go->modet[2].pixel_threshold = ctrl->val;
834 break;
835 case V4L2_CID_MOTION_THRESHOLD2:
836 go->modet[2].motion_threshold = ctrl->val;
837 break;
838 case V4L2_CID_MB_THRESHOLD2:
839 go->modet[2].mb_threshold = ctrl->val;
840 break;
841 case V4L2_CID_PIXEL_THRESHOLD3:
842 go->modet[3].pixel_threshold = ctrl->val;
843 break;
844 case V4L2_CID_MOTION_THRESHOLD3:
845 go->modet[3].motion_threshold = ctrl->val;
846 break;
847 case V4L2_CID_MB_THRESHOLD3:
848 go->modet[3].mb_threshold = ctrl->val;
849 break;
850 case V4L2_CID_DETECT_MD_REGION_GRID:
851 mt = go->modet_map;
852 for (y = 0; y < go->height / 16; y++, mt += go->width / 16)
853 memcpy(mt, ctrl->p_new.p_u8 + y * (720 / 16), go->width / 16);
854 break;
855 default:
856 return -EINVAL;
857 }
858 return 0;
859 }
860
861 static struct v4l2_file_operations go7007_fops = {
862 .owner = THIS_MODULE,
863 .open = v4l2_fh_open,
864 .release = vb2_fop_release,
865 .unlocked_ioctl = video_ioctl2,
866 .read = vb2_fop_read,
867 .mmap = vb2_fop_mmap,
868 .poll = vb2_fop_poll,
869 };
870
871 static const struct v4l2_ioctl_ops video_ioctl_ops = {
872 .vidioc_querycap = vidioc_querycap,
873 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
874 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
875 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
876 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
877 .vidioc_reqbufs = vb2_ioctl_reqbufs,
878 .vidioc_querybuf = vb2_ioctl_querybuf,
879 .vidioc_qbuf = vb2_ioctl_qbuf,
880 .vidioc_dqbuf = vb2_ioctl_dqbuf,
881 .vidioc_g_std = vidioc_g_std,
882 .vidioc_s_std = vidioc_s_std,
883 .vidioc_querystd = vidioc_querystd,
884 .vidioc_enum_input = vidioc_enum_input,
885 .vidioc_g_input = vidioc_g_input,
886 .vidioc_s_input = vidioc_s_input,
887 .vidioc_enumaudio = vidioc_enumaudio,
888 .vidioc_g_audio = vidioc_g_audio,
889 .vidioc_s_audio = vidioc_s_audio,
890 .vidioc_streamon = vb2_ioctl_streamon,
891 .vidioc_streamoff = vb2_ioctl_streamoff,
892 .vidioc_g_tuner = vidioc_g_tuner,
893 .vidioc_s_tuner = vidioc_s_tuner,
894 .vidioc_g_frequency = vidioc_g_frequency,
895 .vidioc_s_frequency = vidioc_s_frequency,
896 .vidioc_g_parm = vidioc_g_parm,
897 .vidioc_s_parm = vidioc_s_parm,
898 .vidioc_enum_framesizes = vidioc_enum_framesizes,
899 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
900 .vidioc_log_status = vidioc_log_status,
901 .vidioc_subscribe_event = vidioc_subscribe_event,
902 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
903 };
904
905 static struct video_device go7007_template = {
906 .name = "go7007",
907 .fops = &go7007_fops,
908 .release = video_device_release_empty,
909 .ioctl_ops = &video_ioctl_ops,
910 .tvnorms = V4L2_STD_ALL,
911 };
912
913 static const struct v4l2_ctrl_ops go7007_ctrl_ops = {
914 .s_ctrl = go7007_s_ctrl,
915 };
916
917 static const struct v4l2_ctrl_config go7007_pixel_threshold0_ctrl = {
918 .ops = &go7007_ctrl_ops,
919 .id = V4L2_CID_PIXEL_THRESHOLD0,
920 .name = "Pixel Threshold Region 0",
921 .type = V4L2_CTRL_TYPE_INTEGER,
922 .def = 20,
923 .max = 32767,
924 .step = 1,
925 };
926
927 static const struct v4l2_ctrl_config go7007_motion_threshold0_ctrl = {
928 .ops = &go7007_ctrl_ops,
929 .id = V4L2_CID_MOTION_THRESHOLD0,
930 .name = "Motion Threshold Region 0",
931 .type = V4L2_CTRL_TYPE_INTEGER,
932 .def = 80,
933 .max = 32767,
934 .step = 1,
935 };
936
937 static const struct v4l2_ctrl_config go7007_mb_threshold0_ctrl = {
938 .ops = &go7007_ctrl_ops,
939 .id = V4L2_CID_MB_THRESHOLD0,
940 .name = "MB Threshold Region 0",
941 .type = V4L2_CTRL_TYPE_INTEGER,
942 .def = 200,
943 .max = 32767,
944 .step = 1,
945 };
946
947 static const struct v4l2_ctrl_config go7007_pixel_threshold1_ctrl = {
948 .ops = &go7007_ctrl_ops,
949 .id = V4L2_CID_PIXEL_THRESHOLD1,
950 .name = "Pixel Threshold Region 1",
951 .type = V4L2_CTRL_TYPE_INTEGER,
952 .def = 20,
953 .max = 32767,
954 .step = 1,
955 };
956
957 static const struct v4l2_ctrl_config go7007_motion_threshold1_ctrl = {
958 .ops = &go7007_ctrl_ops,
959 .id = V4L2_CID_MOTION_THRESHOLD1,
960 .name = "Motion Threshold Region 1",
961 .type = V4L2_CTRL_TYPE_INTEGER,
962 .def = 80,
963 .max = 32767,
964 .step = 1,
965 };
966
967 static const struct v4l2_ctrl_config go7007_mb_threshold1_ctrl = {
968 .ops = &go7007_ctrl_ops,
969 .id = V4L2_CID_MB_THRESHOLD1,
970 .name = "MB Threshold Region 1",
971 .type = V4L2_CTRL_TYPE_INTEGER,
972 .def = 200,
973 .max = 32767,
974 .step = 1,
975 };
976
977 static const struct v4l2_ctrl_config go7007_pixel_threshold2_ctrl = {
978 .ops = &go7007_ctrl_ops,
979 .id = V4L2_CID_PIXEL_THRESHOLD2,
980 .name = "Pixel Threshold Region 2",
981 .type = V4L2_CTRL_TYPE_INTEGER,
982 .def = 20,
983 .max = 32767,
984 .step = 1,
985 };
986
987 static const struct v4l2_ctrl_config go7007_motion_threshold2_ctrl = {
988 .ops = &go7007_ctrl_ops,
989 .id = V4L2_CID_MOTION_THRESHOLD2,
990 .name = "Motion Threshold Region 2",
991 .type = V4L2_CTRL_TYPE_INTEGER,
992 .def = 80,
993 .max = 32767,
994 .step = 1,
995 };
996
997 static const struct v4l2_ctrl_config go7007_mb_threshold2_ctrl = {
998 .ops = &go7007_ctrl_ops,
999 .id = V4L2_CID_MB_THRESHOLD2,
1000 .name = "MB Threshold Region 2",
1001 .type = V4L2_CTRL_TYPE_INTEGER,
1002 .def = 200,
1003 .max = 32767,
1004 .step = 1,
1005 };
1006
1007 static const struct v4l2_ctrl_config go7007_pixel_threshold3_ctrl = {
1008 .ops = &go7007_ctrl_ops,
1009 .id = V4L2_CID_PIXEL_THRESHOLD3,
1010 .name = "Pixel Threshold Region 3",
1011 .type = V4L2_CTRL_TYPE_INTEGER,
1012 .def = 20,
1013 .max = 32767,
1014 .step = 1,
1015 };
1016
1017 static const struct v4l2_ctrl_config go7007_motion_threshold3_ctrl = {
1018 .ops = &go7007_ctrl_ops,
1019 .id = V4L2_CID_MOTION_THRESHOLD3,
1020 .name = "Motion Threshold Region 3",
1021 .type = V4L2_CTRL_TYPE_INTEGER,
1022 .def = 80,
1023 .max = 32767,
1024 .step = 1,
1025 };
1026
1027 static const struct v4l2_ctrl_config go7007_mb_threshold3_ctrl = {
1028 .ops = &go7007_ctrl_ops,
1029 .id = V4L2_CID_MB_THRESHOLD3,
1030 .name = "MB Threshold Region 3",
1031 .type = V4L2_CTRL_TYPE_INTEGER,
1032 .def = 200,
1033 .max = 32767,
1034 .step = 1,
1035 };
1036
1037 static const struct v4l2_ctrl_config go7007_mb_regions_ctrl = {
1038 .ops = &go7007_ctrl_ops,
1039 .id = V4L2_CID_DETECT_MD_REGION_GRID,
1040 .dims = { 576 / 16, 720 / 16 },
1041 .max = 3,
1042 .step = 1,
1043 };
1044
1045 int go7007_v4l2_ctrl_init(struct go7007 *go)
1046 {
1047 struct v4l2_ctrl_handler *hdl = &go->hdl;
1048 struct v4l2_ctrl *ctrl;
1049
1050 v4l2_ctrl_handler_init(hdl, 22);
1051 go->mpeg_video_gop_size = v4l2_ctrl_new_std(hdl, NULL,
1052 V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, 34, 1, 15);
1053 go->mpeg_video_gop_closure = v4l2_ctrl_new_std(hdl, NULL,
1054 V4L2_CID_MPEG_VIDEO_GOP_CLOSURE, 0, 1, 1, 1);
1055 go->mpeg_video_bitrate = v4l2_ctrl_new_std(hdl, NULL,
1056 V4L2_CID_MPEG_VIDEO_BITRATE,
1057 64000, 10000000, 1, 9800000);
1058 go->mpeg_video_b_frames = v4l2_ctrl_new_std(hdl, NULL,
1059 V4L2_CID_MPEG_VIDEO_B_FRAMES, 0, 2, 2, 0);
1060 go->mpeg_video_rep_seqheader = v4l2_ctrl_new_std(hdl, NULL,
1061 V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, 0, 1, 1, 1);
1062
1063 go->mpeg_video_aspect_ratio = v4l2_ctrl_new_std_menu(hdl, NULL,
1064 V4L2_CID_MPEG_VIDEO_ASPECT,
1065 V4L2_MPEG_VIDEO_ASPECT_16x9, 0,
1066 V4L2_MPEG_VIDEO_ASPECT_1x1);
1067 ctrl = v4l2_ctrl_new_std(hdl, NULL,
1068 V4L2_CID_JPEG_ACTIVE_MARKER, 0,
1069 V4L2_JPEG_ACTIVE_MARKER_DQT |
1070 V4L2_JPEG_ACTIVE_MARKER_DHT, 0,
1071 V4L2_JPEG_ACTIVE_MARKER_DQT |
1072 V4L2_JPEG_ACTIVE_MARKER_DHT);
1073 if (ctrl)
1074 ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1075 v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold0_ctrl, NULL);
1076 v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold0_ctrl, NULL);
1077 v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold0_ctrl, NULL);
1078 v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold1_ctrl, NULL);
1079 v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold1_ctrl, NULL);
1080 v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold1_ctrl, NULL);
1081 v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold2_ctrl, NULL);
1082 v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold2_ctrl, NULL);
1083 v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold2_ctrl, NULL);
1084 v4l2_ctrl_new_custom(hdl, &go7007_pixel_threshold3_ctrl, NULL);
1085 v4l2_ctrl_new_custom(hdl, &go7007_motion_threshold3_ctrl, NULL);
1086 v4l2_ctrl_new_custom(hdl, &go7007_mb_threshold3_ctrl, NULL);
1087 v4l2_ctrl_new_custom(hdl, &go7007_mb_regions_ctrl, NULL);
1088 go->modet_mode = v4l2_ctrl_new_std_menu(hdl, NULL,
1089 V4L2_CID_DETECT_MD_MODE,
1090 V4L2_DETECT_MD_MODE_REGION_GRID,
1091 1 << V4L2_DETECT_MD_MODE_THRESHOLD_GRID,
1092 V4L2_DETECT_MD_MODE_DISABLED);
1093 if (hdl->error) {
1094 int rv = hdl->error;
1095
1096 v4l2_err(&go->v4l2_dev, "Could not register controls\n");
1097 return rv;
1098 }
1099 go->v4l2_dev.ctrl_handler = hdl;
1100 return 0;
1101 }
1102
1103 int go7007_v4l2_init(struct go7007 *go)
1104 {
1105 struct video_device *vdev = &go->vdev;
1106 int rv;
1107
1108 mutex_init(&go->serialize_lock);
1109 mutex_init(&go->queue_lock);
1110
1111 INIT_LIST_HEAD(&go->vidq_active);
1112 go->vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1113 go->vidq.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1114 go->vidq.ops = &go7007_video_qops;
1115 go->vidq.mem_ops = &vb2_vmalloc_memops;
1116 go->vidq.drv_priv = go;
1117 go->vidq.buf_struct_size = sizeof(struct go7007_buffer);
1118 go->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1119 go->vidq.lock = &go->queue_lock;
1120 rv = vb2_queue_init(&go->vidq);
1121 if (rv)
1122 return rv;
1123 *vdev = go7007_template;
1124 vdev->lock = &go->serialize_lock;
1125 vdev->queue = &go->vidq;
1126 video_set_drvdata(vdev, go);
1127 vdev->v4l2_dev = &go->v4l2_dev;
1128 if (!v4l2_device_has_op(&go->v4l2_dev, video, querystd))
1129 v4l2_disable_ioctl(vdev, VIDIOC_QUERYSTD);
1130 if (!(go->board_info->flags & GO7007_BOARD_HAS_TUNER)) {
1131 v4l2_disable_ioctl(vdev, VIDIOC_S_FREQUENCY);
1132 v4l2_disable_ioctl(vdev, VIDIOC_G_FREQUENCY);
1133 v4l2_disable_ioctl(vdev, VIDIOC_S_TUNER);
1134 v4l2_disable_ioctl(vdev, VIDIOC_G_TUNER);
1135 } else {
1136 struct v4l2_frequency f = {
1137 .type = V4L2_TUNER_ANALOG_TV,
1138 .frequency = 980,
1139 };
1140
1141 call_all(&go->v4l2_dev, tuner, s_frequency, &f);
1142 }
1143 if (!(go->board_info->sensor_flags & GO7007_SENSOR_TV)) {
1144 v4l2_disable_ioctl(vdev, VIDIOC_G_STD);
1145 v4l2_disable_ioctl(vdev, VIDIOC_S_STD);
1146 vdev->tvnorms = 0;
1147 }
1148 if (go->board_info->sensor_flags & GO7007_SENSOR_SCALING)
1149 v4l2_disable_ioctl(vdev, VIDIOC_ENUM_FRAMESIZES);
1150 if (go->board_info->num_aud_inputs == 0) {
1151 v4l2_disable_ioctl(vdev, VIDIOC_G_AUDIO);
1152 v4l2_disable_ioctl(vdev, VIDIOC_S_AUDIO);
1153 v4l2_disable_ioctl(vdev, VIDIOC_ENUMAUDIO);
1154 }
1155 /* Setup correct crystal frequency on this board */
1156 if (go->board_info->sensor_flags & GO7007_SENSOR_SAA7115)
1157 v4l2_subdev_call(go->sd_video, video, s_crystal_freq,
1158 SAA7115_FREQ_24_576_MHZ,
1159 SAA7115_FREQ_FL_APLL | SAA7115_FREQ_FL_UCGC |
1160 SAA7115_FREQ_FL_DOUBLE_ASCLK);
1161 go7007_s_input(go);
1162 if (go->board_info->sensor_flags & GO7007_SENSOR_TV)
1163 go7007_s_std(go);
1164 rv = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1165 if (rv < 0)
1166 return rv;
1167 dev_info(go->dev, "registered device %s [v4l2]\n",
1168 video_device_node_name(vdev));
1169
1170 return 0;
1171 }
1172
1173 void go7007_v4l2_remove(struct go7007 *go)
1174 {
1175 v4l2_ctrl_handler_free(&go->hdl);
1176 }
This page took 0.07099 seconds and 5 git commands to generate.