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