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