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