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