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