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