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