]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/media/video/vivi.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi...
[mirror_ubuntu-artful-kernel.git] / drivers / media / video / vivi.c
1 /*
2 * Virtual Video driver - This code emulates a real video device with v4l2 api
3 *
4 * Copyright (c) 2006 by:
5 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
6 * Ted Walther <ted--a.t--enumera.com>
7 * John Sokol <sokol--a.t--videotechnology.com>
8 * http://v4l.videotechnology.com/
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the BSD Licence, GNU General Public License
12 * as published by the Free Software Foundation; either version 2 of the
13 * License, or (at your option) any later version
14 */
15 #include <linux/module.h>
16 #include <linux/delay.h>
17 #include <linux/errno.h>
18 #include <linux/fs.h>
19 #include <linux/kernel.h>
20 #include <linux/slab.h>
21 #include <linux/mm.h>
22 #include <linux/ioport.h>
23 #include <linux/init.h>
24 #include <linux/sched.h>
25 #include <linux/pci.h>
26 #include <linux/random.h>
27 #include <linux/version.h>
28 #include <linux/mutex.h>
29 #include <linux/videodev2.h>
30 #include <linux/dma-mapping.h>
31 #ifdef CONFIG_VIDEO_V4L1_COMPAT
32 /* Include V4L1 specific functions. Should be removed soon */
33 #include <linux/videodev.h>
34 #endif
35 #include <linux/interrupt.h>
36 #include <media/videobuf-vmalloc.h>
37 #include <media/v4l2-common.h>
38 #include <media/v4l2-ioctl.h>
39 #include <linux/kthread.h>
40 #include <linux/highmem.h>
41 #include <linux/freezer.h>
42
43 #define VIVI_MODULE_NAME "vivi"
44
45 /* Wake up at about 30 fps */
46 #define WAKE_NUMERATOR 30
47 #define WAKE_DENOMINATOR 1001
48 #define BUFFER_TIMEOUT msecs_to_jiffies(500) /* 0.5 seconds */
49
50 #include "font.h"
51
52 #define VIVI_MAJOR_VERSION 0
53 #define VIVI_MINOR_VERSION 5
54 #define VIVI_RELEASE 0
55 #define VIVI_VERSION \
56 KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
57
58 /* Declare static vars that will be used as parameters */
59 static unsigned int vid_limit = 16; /* Video memory limit, in Mb */
60 static int video_nr = -1; /* /dev/videoN, -1 for autodetect */
61 static int n_devs = 1; /* Number of virtual devices */
62
63 /* supported controls */
64 static struct v4l2_queryctrl vivi_qctrl[] = {
65 {
66 .id = V4L2_CID_AUDIO_VOLUME,
67 .name = "Volume",
68 .minimum = 0,
69 .maximum = 65535,
70 .step = 65535/100,
71 .default_value = 65535,
72 .flags = 0,
73 .type = V4L2_CTRL_TYPE_INTEGER,
74 }, {
75 .id = V4L2_CID_BRIGHTNESS,
76 .type = V4L2_CTRL_TYPE_INTEGER,
77 .name = "Brightness",
78 .minimum = 0,
79 .maximum = 255,
80 .step = 1,
81 .default_value = 127,
82 .flags = 0,
83 }, {
84 .id = V4L2_CID_CONTRAST,
85 .type = V4L2_CTRL_TYPE_INTEGER,
86 .name = "Contrast",
87 .minimum = 0,
88 .maximum = 255,
89 .step = 0x1,
90 .default_value = 0x10,
91 .flags = 0,
92 }, {
93 .id = V4L2_CID_SATURATION,
94 .type = V4L2_CTRL_TYPE_INTEGER,
95 .name = "Saturation",
96 .minimum = 0,
97 .maximum = 255,
98 .step = 0x1,
99 .default_value = 127,
100 .flags = 0,
101 }, {
102 .id = V4L2_CID_HUE,
103 .type = V4L2_CTRL_TYPE_INTEGER,
104 .name = "Hue",
105 .minimum = -128,
106 .maximum = 127,
107 .step = 0x1,
108 .default_value = 0,
109 .flags = 0,
110 }
111 };
112
113 static int qctl_regs[ARRAY_SIZE(vivi_qctrl)];
114
115 #define dprintk(dev, level, fmt, arg...) \
116 do { \
117 if (dev->vfd->debug >= (level)) \
118 printk(KERN_DEBUG "vivi: " fmt , ## arg); \
119 } while (0)
120
121 /* ------------------------------------------------------------------
122 Basic structures
123 ------------------------------------------------------------------*/
124
125 struct vivi_fmt {
126 char *name;
127 u32 fourcc; /* v4l2 format id */
128 int depth;
129 };
130
131 static struct vivi_fmt formats[] = {
132 {
133 .name = "4:2:2, packed, YUYV",
134 .fourcc = V4L2_PIX_FMT_YUYV,
135 .depth = 16,
136 },
137 {
138 .name = "4:2:2, packed, UYVY",
139 .fourcc = V4L2_PIX_FMT_UYVY,
140 .depth = 16,
141 },
142 {
143 .name = "RGB565 (LE)",
144 .fourcc = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
145 .depth = 16,
146 },
147 {
148 .name = "RGB565 (BE)",
149 .fourcc = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
150 .depth = 16,
151 },
152 {
153 .name = "RGB555 (LE)",
154 .fourcc = V4L2_PIX_FMT_RGB555, /* gggbbbbb arrrrrgg */
155 .depth = 16,
156 },
157 {
158 .name = "RGB555 (BE)",
159 .fourcc = V4L2_PIX_FMT_RGB555X, /* arrrrrgg gggbbbbb */
160 .depth = 16,
161 },
162 };
163
164 static struct vivi_fmt *get_format(struct v4l2_format *f)
165 {
166 struct vivi_fmt *fmt;
167 unsigned int k;
168
169 for (k = 0; k < ARRAY_SIZE(formats); k++) {
170 fmt = &formats[k];
171 if (fmt->fourcc == f->fmt.pix.pixelformat)
172 break;
173 }
174
175 if (k == ARRAY_SIZE(formats))
176 return NULL;
177
178 return &formats[k];
179 }
180
181 struct sg_to_addr {
182 int pos;
183 struct scatterlist *sg;
184 };
185
186 /* buffer for one video frame */
187 struct vivi_buffer {
188 /* common v4l buffer stuff -- must be first */
189 struct videobuf_buffer vb;
190
191 struct vivi_fmt *fmt;
192 };
193
194 struct vivi_dmaqueue {
195 struct list_head active;
196
197 /* thread for generating video stream*/
198 struct task_struct *kthread;
199 wait_queue_head_t wq;
200 /* Counters to control fps rate */
201 int frame;
202 int ini_jiffies;
203 };
204
205 static LIST_HEAD(vivi_devlist);
206
207 struct vivi_dev {
208 struct list_head vivi_devlist;
209
210 spinlock_t slock;
211 struct mutex mutex;
212
213 int users;
214
215 /* various device info */
216 struct video_device *vfd;
217
218 struct vivi_dmaqueue vidq;
219
220 /* Several counters */
221 int h, m, s, ms;
222 unsigned long jiffies;
223 char timestr[13];
224
225 int mv_count; /* Controls bars movement */
226 };
227
228 struct vivi_fh {
229 struct vivi_dev *dev;
230
231 /* video capture */
232 struct vivi_fmt *fmt;
233 unsigned int width, height;
234 struct videobuf_queue vb_vidq;
235
236 enum v4l2_buf_type type;
237 unsigned char bars[8][3];
238 };
239
240 /* ------------------------------------------------------------------
241 DMA and thread functions
242 ------------------------------------------------------------------*/
243
244 /* Bars and Colors should match positions */
245
246 enum colors {
247 WHITE,
248 AMBAR,
249 CYAN,
250 GREEN,
251 MAGENTA,
252 RED,
253 BLUE,
254 BLACK,
255 };
256
257 static u8 bars[8][3] = {
258 /* R G B */
259 {204, 204, 204}, /* white */
260 {208, 208, 0}, /* ambar */
261 { 0, 206, 206}, /* cyan */
262 { 0, 239, 0}, /* green */
263 {239, 0, 239}, /* magenta */
264 {205, 0, 0}, /* red */
265 { 0, 0, 255}, /* blue */
266 { 0, 0, 0}, /* black */
267 };
268
269 #define TO_Y(r, g, b) \
270 (((16829 * r + 33039 * g + 6416 * b + 32768) >> 16) + 16)
271 /* RGB to V(Cr) Color transform */
272 #define TO_V(r, g, b) \
273 (((28784 * r - 24103 * g - 4681 * b + 32768) >> 16) + 128)
274 /* RGB to U(Cb) Color transform */
275 #define TO_U(r, g, b) \
276 (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
277
278 #define TSTAMP_MIN_Y 24
279 #define TSTAMP_MAX_Y TSTAMP_MIN_Y+15
280 #define TSTAMP_MIN_X 64
281
282 static void gen_twopix(struct vivi_fh *fh, unsigned char *buf, int colorpos)
283 {
284 unsigned char r_y, g_u, b_v;
285 unsigned char *p;
286 int color;
287
288 r_y = fh->bars[colorpos][0]; /* R or precalculated Y */
289 g_u = fh->bars[colorpos][1]; /* G or precalculated U */
290 b_v = fh->bars[colorpos][2]; /* B or precalculated V */
291
292 for (color = 0; color < 4; color++) {
293 p = buf + color;
294
295 switch (fh->fmt->fourcc) {
296 case V4L2_PIX_FMT_YUYV:
297 switch (color) {
298 case 0:
299 case 2:
300 *p = r_y;
301 break;
302 case 1:
303 *p = g_u;
304 break;
305 case 3:
306 *p = b_v;
307 break;
308 }
309 break;
310 case V4L2_PIX_FMT_UYVY:
311 switch (color) {
312 case 1:
313 case 3:
314 *p = r_y;
315 break;
316 case 0:
317 *p = g_u;
318 break;
319 case 2:
320 *p = b_v;
321 break;
322 }
323 break;
324 case V4L2_PIX_FMT_RGB565:
325 switch (color) {
326 case 0:
327 case 2:
328 *p = (g_u << 5) | b_v;
329 break;
330 case 1:
331 case 3:
332 *p = (r_y << 3) | (g_u >> 3);
333 break;
334 }
335 break;
336 case V4L2_PIX_FMT_RGB565X:
337 switch (color) {
338 case 0:
339 case 2:
340 *p = (r_y << 3) | (g_u >> 3);
341 break;
342 case 1:
343 case 3:
344 *p = (g_u << 5) | b_v;
345 break;
346 }
347 break;
348 case V4L2_PIX_FMT_RGB555:
349 switch (color) {
350 case 0:
351 case 2:
352 *p = (g_u << 5) | b_v;
353 break;
354 case 1:
355 case 3:
356 *p = (r_y << 2) | (g_u >> 3);
357 break;
358 }
359 break;
360 case V4L2_PIX_FMT_RGB555X:
361 switch (color) {
362 case 0:
363 case 2:
364 *p = (r_y << 2) | (g_u >> 3);
365 break;
366 case 1:
367 case 3:
368 *p = (g_u << 5) | b_v;
369 break;
370 }
371 break;
372 }
373 }
374 }
375
376 static void gen_line(struct vivi_fh *fh, char *basep, int inipos, int wmax,
377 int hmax, int line, int count, char *timestr)
378 {
379 int w, i, j;
380 int pos = inipos;
381 char *s;
382 u8 chr;
383
384 /* We will just duplicate the second pixel at the packet */
385 wmax /= 2;
386
387 /* Generate a standard color bar pattern */
388 for (w = 0; w < wmax; w++) {
389 int colorpos = ((w + count) * 8/(wmax + 1)) % 8;
390
391 gen_twopix(fh, basep + pos, colorpos);
392 pos += 4; /* only 16 bpp supported for now */
393 }
394
395 /* Checks if it is possible to show timestamp */
396 if (TSTAMP_MAX_Y >= hmax)
397 goto end;
398 if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
399 goto end;
400
401 /* Print stream time */
402 if (line >= TSTAMP_MIN_Y && line <= TSTAMP_MAX_Y) {
403 j = TSTAMP_MIN_X;
404 for (s = timestr; *s; s++) {
405 chr = rom8x16_bits[(*s-0x30)*16+line-TSTAMP_MIN_Y];
406 for (i = 0; i < 7; i++) {
407 pos = inipos + j * 2;
408 /* Draw white font on black background */
409 if (chr & 1 << (7 - i))
410 gen_twopix(fh, basep + pos, WHITE);
411 else
412 gen_twopix(fh, basep + pos, BLACK);
413 j++;
414 }
415 }
416 }
417
418 end:
419 return;
420 }
421
422 static void vivi_fillbuff(struct vivi_fh *fh, struct vivi_buffer *buf)
423 {
424 struct vivi_dev *dev = fh->dev;
425 int h , pos = 0;
426 int hmax = buf->vb.height;
427 int wmax = buf->vb.width;
428 struct timeval ts;
429 char *tmpbuf;
430 void *vbuf = videobuf_to_vmalloc(&buf->vb);
431
432 if (!vbuf)
433 return;
434
435 tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
436 if (!tmpbuf)
437 return;
438
439 for (h = 0; h < hmax; h++) {
440 gen_line(fh, tmpbuf, 0, wmax, hmax, h, dev->mv_count,
441 dev->timestr);
442 memcpy(vbuf + pos, tmpbuf, wmax * 2);
443 pos += wmax*2;
444 }
445
446 dev->mv_count++;
447
448 kfree(tmpbuf);
449
450 /* Updates stream time */
451
452 dev->ms += jiffies_to_msecs(jiffies-dev->jiffies);
453 dev->jiffies = jiffies;
454 if (dev->ms >= 1000) {
455 dev->ms -= 1000;
456 dev->s++;
457 if (dev->s >= 60) {
458 dev->s -= 60;
459 dev->m++;
460 if (dev->m > 60) {
461 dev->m -= 60;
462 dev->h++;
463 if (dev->h > 24)
464 dev->h -= 24;
465 }
466 }
467 }
468 sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
469 dev->h, dev->m, dev->s, dev->ms);
470
471 dprintk(dev, 2, "vivifill at %s: Buffer 0x%08lx size= %d\n",
472 dev->timestr, (unsigned long)tmpbuf, pos);
473
474 /* Advice that buffer was filled */
475 buf->vb.field_count++;
476 do_gettimeofday(&ts);
477 buf->vb.ts = ts;
478 buf->vb.state = VIDEOBUF_DONE;
479 }
480
481 static void vivi_thread_tick(struct vivi_fh *fh)
482 {
483 struct vivi_buffer *buf;
484 struct vivi_dev *dev = fh->dev;
485 struct vivi_dmaqueue *dma_q = &dev->vidq;
486
487 unsigned long flags = 0;
488
489 dprintk(dev, 1, "Thread tick\n");
490
491 spin_lock_irqsave(&dev->slock, flags);
492 if (list_empty(&dma_q->active)) {
493 dprintk(dev, 1, "No active queue to serve\n");
494 goto unlock;
495 }
496
497 buf = list_entry(dma_q->active.next,
498 struct vivi_buffer, vb.queue);
499
500 /* Nobody is waiting on this buffer, return */
501 if (!waitqueue_active(&buf->vb.done))
502 goto unlock;
503
504 list_del(&buf->vb.queue);
505
506 do_gettimeofday(&buf->vb.ts);
507
508 /* Fill buffer */
509 vivi_fillbuff(fh, buf);
510 dprintk(dev, 1, "filled buffer %p\n", buf);
511
512 wake_up(&buf->vb.done);
513 dprintk(dev, 2, "[%p/%d] wakeup\n", buf, buf->vb. i);
514 unlock:
515 spin_unlock_irqrestore(&dev->slock, flags);
516 return;
517 }
518
519 #define frames_to_ms(frames) \
520 ((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)
521
522 static void vivi_sleep(struct vivi_fh *fh)
523 {
524 struct vivi_dev *dev = fh->dev;
525 struct vivi_dmaqueue *dma_q = &dev->vidq;
526 int timeout;
527 DECLARE_WAITQUEUE(wait, current);
528
529 dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
530 (unsigned long)dma_q);
531
532 add_wait_queue(&dma_q->wq, &wait);
533 if (kthread_should_stop())
534 goto stop_task;
535
536 /* Calculate time to wake up */
537 timeout = msecs_to_jiffies(frames_to_ms(1));
538
539 vivi_thread_tick(fh);
540
541 schedule_timeout_interruptible(timeout);
542
543 stop_task:
544 remove_wait_queue(&dma_q->wq, &wait);
545 try_to_freeze();
546 }
547
548 static int vivi_thread(void *data)
549 {
550 struct vivi_fh *fh = data;
551 struct vivi_dev *dev = fh->dev;
552
553 dprintk(dev, 1, "thread started\n");
554
555 set_freezable();
556
557 for (;;) {
558 vivi_sleep(fh);
559
560 if (kthread_should_stop())
561 break;
562 }
563 dprintk(dev, 1, "thread: exit\n");
564 return 0;
565 }
566
567 static int vivi_start_thread(struct vivi_fh *fh)
568 {
569 struct vivi_dev *dev = fh->dev;
570 struct vivi_dmaqueue *dma_q = &dev->vidq;
571
572 dma_q->frame = 0;
573 dma_q->ini_jiffies = jiffies;
574
575 dprintk(dev, 1, "%s\n", __func__);
576
577 dma_q->kthread = kthread_run(vivi_thread, fh, "vivi");
578
579 if (IS_ERR(dma_q->kthread)) {
580 printk(KERN_ERR "vivi: kernel_thread() failed\n");
581 return PTR_ERR(dma_q->kthread);
582 }
583 /* Wakes thread */
584 wake_up_interruptible(&dma_q->wq);
585
586 dprintk(dev, 1, "returning from %s\n", __func__);
587 return 0;
588 }
589
590 static void vivi_stop_thread(struct vivi_dmaqueue *dma_q)
591 {
592 struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
593
594 dprintk(dev, 1, "%s\n", __func__);
595 /* shutdown control thread */
596 if (dma_q->kthread) {
597 kthread_stop(dma_q->kthread);
598 dma_q->kthread = NULL;
599 }
600 }
601
602 /* ------------------------------------------------------------------
603 Videobuf operations
604 ------------------------------------------------------------------*/
605 static int
606 buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
607 {
608 struct vivi_fh *fh = vq->priv_data;
609 struct vivi_dev *dev = fh->dev;
610
611 *size = fh->width*fh->height*2;
612
613 if (0 == *count)
614 *count = 32;
615
616 while (*size * *count > vid_limit * 1024 * 1024)
617 (*count)--;
618
619 dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
620 *count, *size);
621
622 return 0;
623 }
624
625 static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
626 {
627 struct vivi_fh *fh = vq->priv_data;
628 struct vivi_dev *dev = fh->dev;
629
630 dprintk(dev, 1, "%s, state: %i\n", __func__, buf->vb.state);
631
632 if (in_interrupt())
633 BUG();
634
635 videobuf_vmalloc_free(&buf->vb);
636 dprintk(dev, 1, "free_buffer: freed\n");
637 buf->vb.state = VIDEOBUF_NEEDS_INIT;
638 }
639
640 #define norm_maxw() 1024
641 #define norm_maxh() 768
642 static int
643 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
644 enum v4l2_field field)
645 {
646 struct vivi_fh *fh = vq->priv_data;
647 struct vivi_dev *dev = fh->dev;
648 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
649 int rc;
650
651 dprintk(dev, 1, "%s, field=%d\n", __func__, field);
652
653 BUG_ON(NULL == fh->fmt);
654
655 if (fh->width < 48 || fh->width > norm_maxw() ||
656 fh->height < 32 || fh->height > norm_maxh())
657 return -EINVAL;
658
659 buf->vb.size = fh->width*fh->height*2;
660 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
661 return -EINVAL;
662
663 /* These properties only change when queue is idle, see s_fmt */
664 buf->fmt = fh->fmt;
665 buf->vb.width = fh->width;
666 buf->vb.height = fh->height;
667 buf->vb.field = field;
668
669 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
670 rc = videobuf_iolock(vq, &buf->vb, NULL);
671 if (rc < 0)
672 goto fail;
673 }
674
675 buf->vb.state = VIDEOBUF_PREPARED;
676
677 return 0;
678
679 fail:
680 free_buffer(vq, buf);
681 return rc;
682 }
683
684 static void
685 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
686 {
687 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
688 struct vivi_fh *fh = vq->priv_data;
689 struct vivi_dev *dev = fh->dev;
690 struct vivi_dmaqueue *vidq = &dev->vidq;
691
692 dprintk(dev, 1, "%s\n", __func__);
693
694 buf->vb.state = VIDEOBUF_QUEUED;
695 list_add_tail(&buf->vb.queue, &vidq->active);
696 }
697
698 static void buffer_release(struct videobuf_queue *vq,
699 struct videobuf_buffer *vb)
700 {
701 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
702 struct vivi_fh *fh = vq->priv_data;
703 struct vivi_dev *dev = (struct vivi_dev *)fh->dev;
704
705 dprintk(dev, 1, "%s\n", __func__);
706
707 free_buffer(vq, buf);
708 }
709
710 static struct videobuf_queue_ops vivi_video_qops = {
711 .buf_setup = buffer_setup,
712 .buf_prepare = buffer_prepare,
713 .buf_queue = buffer_queue,
714 .buf_release = buffer_release,
715 };
716
717 /* ------------------------------------------------------------------
718 IOCTL vidioc handling
719 ------------------------------------------------------------------*/
720 static int vidioc_querycap(struct file *file, void *priv,
721 struct v4l2_capability *cap)
722 {
723 strcpy(cap->driver, "vivi");
724 strcpy(cap->card, "vivi");
725 cap->version = VIVI_VERSION;
726 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
727 V4L2_CAP_STREAMING |
728 V4L2_CAP_READWRITE;
729 return 0;
730 }
731
732 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
733 struct v4l2_fmtdesc *f)
734 {
735 struct vivi_fmt *fmt;
736
737 if (f->index >= ARRAY_SIZE(formats))
738 return -EINVAL;
739
740 fmt = &formats[f->index];
741
742 strlcpy(f->description, fmt->name, sizeof(f->description));
743 f->pixelformat = fmt->fourcc;
744 return 0;
745 }
746
747 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
748 struct v4l2_format *f)
749 {
750 struct vivi_fh *fh = priv;
751
752 f->fmt.pix.width = fh->width;
753 f->fmt.pix.height = fh->height;
754 f->fmt.pix.field = fh->vb_vidq.field;
755 f->fmt.pix.pixelformat = fh->fmt->fourcc;
756 f->fmt.pix.bytesperline =
757 (f->fmt.pix.width * fh->fmt->depth) >> 3;
758 f->fmt.pix.sizeimage =
759 f->fmt.pix.height * f->fmt.pix.bytesperline;
760
761 return (0);
762 }
763
764 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
765 struct v4l2_format *f)
766 {
767 struct vivi_fh *fh = priv;
768 struct vivi_dev *dev = fh->dev;
769 struct vivi_fmt *fmt;
770 enum v4l2_field field;
771 unsigned int maxw, maxh;
772
773 fmt = get_format(f);
774 if (!fmt) {
775 dprintk(dev, 1, "Fourcc format (0x%08x) invalid.\n",
776 f->fmt.pix.pixelformat);
777 return -EINVAL;
778 }
779
780 field = f->fmt.pix.field;
781
782 if (field == V4L2_FIELD_ANY) {
783 field = V4L2_FIELD_INTERLACED;
784 } else if (V4L2_FIELD_INTERLACED != field) {
785 dprintk(dev, 1, "Field type invalid.\n");
786 return -EINVAL;
787 }
788
789 maxw = norm_maxw();
790 maxh = norm_maxh();
791
792 f->fmt.pix.field = field;
793 if (f->fmt.pix.height < 32)
794 f->fmt.pix.height = 32;
795 if (f->fmt.pix.height > maxh)
796 f->fmt.pix.height = maxh;
797 if (f->fmt.pix.width < 48)
798 f->fmt.pix.width = 48;
799 if (f->fmt.pix.width > maxw)
800 f->fmt.pix.width = maxw;
801 f->fmt.pix.width &= ~0x03;
802 f->fmt.pix.bytesperline =
803 (f->fmt.pix.width * fmt->depth) >> 3;
804 f->fmt.pix.sizeimage =
805 f->fmt.pix.height * f->fmt.pix.bytesperline;
806
807 return 0;
808 }
809
810 /*FIXME: This seems to be generic enough to be at videodev2 */
811 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
812 struct v4l2_format *f)
813 {
814 struct vivi_fh *fh = priv;
815 struct videobuf_queue *q = &fh->vb_vidq;
816 unsigned char r, g, b;
817 int k, is_yuv;
818
819 int ret = vidioc_try_fmt_vid_cap(file, fh, f);
820 if (ret < 0)
821 return (ret);
822
823 mutex_lock(&q->vb_lock);
824
825 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
826 dprintk(fh->dev, 1, "%s queue busy\n", __func__);
827 ret = -EBUSY;
828 goto out;
829 }
830
831 fh->fmt = get_format(f);
832 fh->width = f->fmt.pix.width;
833 fh->height = f->fmt.pix.height;
834 fh->vb_vidq.field = f->fmt.pix.field;
835 fh->type = f->type;
836
837 /* precalculate color bar values to speed up rendering */
838 for (k = 0; k < 8; k++) {
839 r = bars[k][0];
840 g = bars[k][1];
841 b = bars[k][2];
842 is_yuv = 0;
843
844 switch (fh->fmt->fourcc) {
845 case V4L2_PIX_FMT_YUYV:
846 case V4L2_PIX_FMT_UYVY:
847 is_yuv = 1;
848 break;
849 case V4L2_PIX_FMT_RGB565:
850 case V4L2_PIX_FMT_RGB565X:
851 r >>= 3;
852 g >>= 2;
853 b >>= 3;
854 break;
855 case V4L2_PIX_FMT_RGB555:
856 case V4L2_PIX_FMT_RGB555X:
857 r >>= 3;
858 g >>= 3;
859 b >>= 3;
860 break;
861 }
862
863 if (is_yuv) {
864 fh->bars[k][0] = TO_Y(r, g, b); /* Luma */
865 fh->bars[k][1] = TO_U(r, g, b); /* Cb */
866 fh->bars[k][2] = TO_V(r, g, b); /* Cr */
867 } else {
868 fh->bars[k][0] = r;
869 fh->bars[k][1] = g;
870 fh->bars[k][2] = b;
871 }
872 }
873
874 ret = 0;
875 out:
876 mutex_unlock(&q->vb_lock);
877
878 return (ret);
879 }
880
881 static int vidioc_reqbufs(struct file *file, void *priv,
882 struct v4l2_requestbuffers *p)
883 {
884 struct vivi_fh *fh = priv;
885
886 return (videobuf_reqbufs(&fh->vb_vidq, p));
887 }
888
889 static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
890 {
891 struct vivi_fh *fh = priv;
892
893 return (videobuf_querybuf(&fh->vb_vidq, p));
894 }
895
896 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
897 {
898 struct vivi_fh *fh = priv;
899
900 return (videobuf_qbuf(&fh->vb_vidq, p));
901 }
902
903 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
904 {
905 struct vivi_fh *fh = priv;
906
907 return (videobuf_dqbuf(&fh->vb_vidq, p,
908 file->f_flags & O_NONBLOCK));
909 }
910
911 #ifdef CONFIG_VIDEO_V4L1_COMPAT
912 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
913 {
914 struct vivi_fh *fh = priv;
915
916 return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
917 }
918 #endif
919
920 static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
921 {
922 struct vivi_fh *fh = priv;
923
924 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
925 return -EINVAL;
926 if (i != fh->type)
927 return -EINVAL;
928
929 return videobuf_streamon(&fh->vb_vidq);
930 }
931
932 static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
933 {
934 struct vivi_fh *fh = priv;
935
936 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
937 return -EINVAL;
938 if (i != fh->type)
939 return -EINVAL;
940
941 return videobuf_streamoff(&fh->vb_vidq);
942 }
943
944 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
945 {
946 return 0;
947 }
948
949 /* only one input in this sample driver */
950 static int vidioc_enum_input(struct file *file, void *priv,
951 struct v4l2_input *inp)
952 {
953 if (inp->index != 0)
954 return -EINVAL;
955
956 inp->type = V4L2_INPUT_TYPE_CAMERA;
957 inp->std = V4L2_STD_525_60;
958 strcpy(inp->name, "Camera");
959
960 return (0);
961 }
962
963 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
964 {
965 *i = 0;
966
967 return (0);
968 }
969 static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
970 {
971 if (i > 0)
972 return -EINVAL;
973
974 return (0);
975 }
976
977 /* --- controls ---------------------------------------------- */
978 static int vidioc_queryctrl(struct file *file, void *priv,
979 struct v4l2_queryctrl *qc)
980 {
981 int i;
982
983 for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
984 if (qc->id && qc->id == vivi_qctrl[i].id) {
985 memcpy(qc, &(vivi_qctrl[i]),
986 sizeof(*qc));
987 return (0);
988 }
989
990 return -EINVAL;
991 }
992
993 static int vidioc_g_ctrl(struct file *file, void *priv,
994 struct v4l2_control *ctrl)
995 {
996 int i;
997
998 for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
999 if (ctrl->id == vivi_qctrl[i].id) {
1000 ctrl->value = qctl_regs[i];
1001 return (0);
1002 }
1003
1004 return -EINVAL;
1005 }
1006 static int vidioc_s_ctrl(struct file *file, void *priv,
1007 struct v4l2_control *ctrl)
1008 {
1009 int i;
1010
1011 for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
1012 if (ctrl->id == vivi_qctrl[i].id) {
1013 if (ctrl->value < vivi_qctrl[i].minimum
1014 || ctrl->value > vivi_qctrl[i].maximum) {
1015 return (-ERANGE);
1016 }
1017 qctl_regs[i] = ctrl->value;
1018 return (0);
1019 }
1020 return -EINVAL;
1021 }
1022
1023 /* ------------------------------------------------------------------
1024 File operations for the device
1025 ------------------------------------------------------------------*/
1026
1027 static int vivi_open(struct file *file)
1028 {
1029 int minor = video_devdata(file)->minor;
1030 struct vivi_dev *dev;
1031 struct vivi_fh *fh = NULL;
1032 int i;
1033 int retval = 0;
1034
1035 printk(KERN_DEBUG "vivi: open called (minor=%d)\n", minor);
1036
1037 lock_kernel();
1038 list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
1039 if (dev->vfd->minor == minor)
1040 goto found;
1041 unlock_kernel();
1042 return -ENODEV;
1043
1044 found:
1045 mutex_lock(&dev->mutex);
1046 dev->users++;
1047
1048 if (dev->users > 1) {
1049 dev->users--;
1050 retval = -EBUSY;
1051 goto unlock;
1052 }
1053
1054 dprintk(dev, 1, "open minor=%d type=%s users=%d\n", minor,
1055 v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
1056
1057 /* allocate + initialize per filehandle data */
1058 fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1059 if (NULL == fh) {
1060 dev->users--;
1061 retval = -ENOMEM;
1062 goto unlock;
1063 }
1064 unlock:
1065 mutex_unlock(&dev->mutex);
1066 if (retval) {
1067 unlock_kernel();
1068 return retval;
1069 }
1070
1071 file->private_data = fh;
1072 fh->dev = dev;
1073
1074 fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1075 fh->fmt = &formats[0];
1076 fh->width = 640;
1077 fh->height = 480;
1078
1079 /* Put all controls at a sane state */
1080 for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
1081 qctl_regs[i] = vivi_qctrl[i].default_value;
1082
1083 /* Resets frame counters */
1084 dev->h = 0;
1085 dev->m = 0;
1086 dev->s = 0;
1087 dev->ms = 0;
1088 dev->mv_count = 0;
1089 dev->jiffies = jiffies;
1090 sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
1091 dev->h, dev->m, dev->s, dev->ms);
1092
1093 videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
1094 NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
1095 sizeof(struct vivi_buffer), fh);
1096
1097 vivi_start_thread(fh);
1098 unlock_kernel();
1099
1100 return 0;
1101 }
1102
1103 static ssize_t
1104 vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
1105 {
1106 struct vivi_fh *fh = file->private_data;
1107
1108 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1109 return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
1110 file->f_flags & O_NONBLOCK);
1111 }
1112 return 0;
1113 }
1114
1115 static unsigned int
1116 vivi_poll(struct file *file, struct poll_table_struct *wait)
1117 {
1118 struct vivi_fh *fh = file->private_data;
1119 struct vivi_dev *dev = fh->dev;
1120 struct videobuf_queue *q = &fh->vb_vidq;
1121
1122 dprintk(dev, 1, "%s\n", __func__);
1123
1124 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
1125 return POLLERR;
1126
1127 return videobuf_poll_stream(file, q, wait);
1128 }
1129
1130 static int vivi_close(struct file *file)
1131 {
1132 struct vivi_fh *fh = file->private_data;
1133 struct vivi_dev *dev = fh->dev;
1134 struct vivi_dmaqueue *vidq = &dev->vidq;
1135
1136 int minor = video_devdata(file)->minor;
1137
1138 vivi_stop_thread(vidq);
1139 videobuf_stop(&fh->vb_vidq);
1140 videobuf_mmap_free(&fh->vb_vidq);
1141
1142 kfree(fh);
1143
1144 mutex_lock(&dev->mutex);
1145 dev->users--;
1146 mutex_unlock(&dev->mutex);
1147
1148 dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
1149 minor, dev->users);
1150
1151 return 0;
1152 }
1153
1154 static int vivi_release(void)
1155 {
1156 struct vivi_dev *dev;
1157 struct list_head *list;
1158
1159 while (!list_empty(&vivi_devlist)) {
1160 list = vivi_devlist.next;
1161 list_del(list);
1162 dev = list_entry(list, struct vivi_dev, vivi_devlist);
1163
1164 if (-1 != dev->vfd->minor) {
1165 printk(KERN_INFO "%s: unregistering /dev/video%d\n",
1166 VIVI_MODULE_NAME, dev->vfd->num);
1167 video_unregister_device(dev->vfd);
1168 } else {
1169 printk(KERN_INFO "%s: releasing /dev/video%d\n",
1170 VIVI_MODULE_NAME, dev->vfd->num);
1171 video_device_release(dev->vfd);
1172 }
1173
1174 kfree(dev);
1175 }
1176
1177 return 0;
1178 }
1179
1180 static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1181 {
1182 struct vivi_fh *fh = file->private_data;
1183 struct vivi_dev *dev = fh->dev;
1184 int ret;
1185
1186 dprintk(dev, 1, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
1187
1188 ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1189
1190 dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1191 (unsigned long)vma->vm_start,
1192 (unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
1193 ret);
1194
1195 return ret;
1196 }
1197
1198 static const struct v4l2_file_operations vivi_fops = {
1199 .owner = THIS_MODULE,
1200 .open = vivi_open,
1201 .release = vivi_close,
1202 .read = vivi_read,
1203 .poll = vivi_poll,
1204 .ioctl = video_ioctl2, /* V4L2 ioctl handler */
1205 .mmap = vivi_mmap,
1206 };
1207
1208 static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
1209 .vidioc_querycap = vidioc_querycap,
1210 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1211 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1212 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1213 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1214 .vidioc_reqbufs = vidioc_reqbufs,
1215 .vidioc_querybuf = vidioc_querybuf,
1216 .vidioc_qbuf = vidioc_qbuf,
1217 .vidioc_dqbuf = vidioc_dqbuf,
1218 .vidioc_s_std = vidioc_s_std,
1219 .vidioc_enum_input = vidioc_enum_input,
1220 .vidioc_g_input = vidioc_g_input,
1221 .vidioc_s_input = vidioc_s_input,
1222 .vidioc_queryctrl = vidioc_queryctrl,
1223 .vidioc_g_ctrl = vidioc_g_ctrl,
1224 .vidioc_s_ctrl = vidioc_s_ctrl,
1225 .vidioc_streamon = vidioc_streamon,
1226 .vidioc_streamoff = vidioc_streamoff,
1227 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1228 .vidiocgmbuf = vidiocgmbuf,
1229 #endif
1230 };
1231
1232 static struct video_device vivi_template = {
1233 .name = "vivi",
1234 .fops = &vivi_fops,
1235 .ioctl_ops = &vivi_ioctl_ops,
1236 .minor = -1,
1237 .release = video_device_release,
1238
1239 .tvnorms = V4L2_STD_525_60,
1240 .current_norm = V4L2_STD_NTSC_M,
1241 };
1242 /* -----------------------------------------------------------------
1243 Initialization and module stuff
1244 ------------------------------------------------------------------*/
1245
1246 /* This routine allocates from 1 to n_devs virtual drivers.
1247
1248 The real maximum number of virtual drivers will depend on how many drivers
1249 will succeed. This is limited to the maximum number of devices that
1250 videodev supports. Since there are 64 minors for video grabbers, this is
1251 currently the theoretical maximum limit. However, a further limit does
1252 exist at videodev that forbids any driver to register more than 32 video
1253 grabbers.
1254 */
1255 static int __init vivi_init(void)
1256 {
1257 int ret = -ENOMEM, i;
1258 struct vivi_dev *dev;
1259 struct video_device *vfd;
1260
1261 if (n_devs <= 0)
1262 n_devs = 1;
1263
1264 for (i = 0; i < n_devs; i++) {
1265 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1266 if (!dev)
1267 break;
1268
1269 /* init video dma queues */
1270 INIT_LIST_HEAD(&dev->vidq.active);
1271 init_waitqueue_head(&dev->vidq.wq);
1272
1273 /* initialize locks */
1274 spin_lock_init(&dev->slock);
1275 mutex_init(&dev->mutex);
1276
1277 vfd = video_device_alloc();
1278 if (!vfd) {
1279 kfree(dev);
1280 break;
1281 }
1282
1283 *vfd = vivi_template;
1284
1285 ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
1286 if (ret < 0) {
1287 video_device_release(vfd);
1288 kfree(dev);
1289
1290 /* If some registers succeeded, keep driver */
1291 if (i)
1292 ret = 0;
1293
1294 break;
1295 }
1296
1297 /* Now that everything is fine, let's add it to device list */
1298 list_add_tail(&dev->vivi_devlist, &vivi_devlist);
1299
1300 snprintf(vfd->name, sizeof(vfd->name), "%s (%i)",
1301 vivi_template.name, vfd->minor);
1302
1303 if (video_nr >= 0)
1304 video_nr++;
1305
1306 dev->vfd = vfd;
1307 printk(KERN_INFO "%s: V4L2 device registered as /dev/video%d\n",
1308 VIVI_MODULE_NAME, vfd->num);
1309 }
1310
1311 if (ret < 0) {
1312 vivi_release();
1313 printk(KERN_INFO "Error %d while loading vivi driver\n", ret);
1314 } else {
1315 printk(KERN_INFO "Video Technology Magazine Virtual Video "
1316 "Capture Board ver %u.%u.%u successfully loaded.\n",
1317 (VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF,
1318 VIVI_VERSION & 0xFF);
1319
1320 /* n_devs will reflect the actual number of allocated devices */
1321 n_devs = i;
1322 }
1323
1324 return ret;
1325 }
1326
1327 static void __exit vivi_exit(void)
1328 {
1329 vivi_release();
1330 }
1331
1332 module_init(vivi_init);
1333 module_exit(vivi_exit);
1334
1335 MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board");
1336 MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
1337 MODULE_LICENSE("Dual BSD/GPL");
1338
1339 module_param(video_nr, uint, 0444);
1340 MODULE_PARM_DESC(video_nr, "video iminor start number");
1341
1342 module_param(n_devs, uint, 0444);
1343 MODULE_PARM_DESC(n_devs, "number of video devices to create");
1344
1345 module_param_named(debug, vivi_template.debug, int, 0444);
1346 MODULE_PARM_DESC(debug, "activates debug info");
1347
1348 module_param(vid_limit, int, 0644);
1349 MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");