[media] bttv: The Hauppauge 61334 needs the msp3410 to do radio demodulation
[deliverable/linux.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 *
e007a325
PO
10 * Conversion to videobuf2 by Pawel Osciak & Marek Szyprowski
11 * Copyright (c) 2010 Samsung Electronics
12 *
1e6dd65e
MCC
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the BSD Licence, GNU General Public License
15 * as published by the Free Software Foundation; either version 2 of the
16 * License, or (at your option) any later version
17 */
18#include <linux/module.h>
1e6dd65e 19#include <linux/errno.h>
1e6dd65e 20#include <linux/kernel.h>
1e6dd65e
MCC
21#include <linux/init.h>
22#include <linux/sched.h>
6b46c397 23#include <linux/slab.h>
730947bc 24#include <linux/font.h>
51b54029 25#include <linux/mutex.h>
1e6dd65e 26#include <linux/videodev2.h>
1e6dd65e 27#include <linux/kthread.h>
7dfb7103 28#include <linux/freezer.h>
e007a325 29#include <media/videobuf2-vmalloc.h>
5ab6c9af
HV
30#include <media/v4l2-device.h>
31#include <media/v4l2-ioctl.h>
7e996afa 32#include <media/v4l2-ctrls.h>
2e4784d0 33#include <media/v4l2-fh.h>
c7a52f8d 34#include <media/v4l2-event.h>
730947bc 35#include <media/v4l2-common.h>
1e6dd65e 36
584ce48d 37#define VIVI_MODULE_NAME "vivi"
745271ae 38
1e6dd65e
MCC
39/* Wake up at about 30 fps */
40#define WAKE_NUMERATOR 30
41#define WAKE_DENOMINATOR 1001
42#define BUFFER_TIMEOUT msecs_to_jiffies(500) /* 0.5 seconds */
43
730947bc
HV
44#define MAX_WIDTH 1920
45#define MAX_HEIGHT 1200
46
1990d50b 47#define VIVI_VERSION "0.8.1"
1e6dd65e 48
5ab6c9af
HV
49MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board");
50MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
51MODULE_LICENSE("Dual BSD/GPL");
1990d50b 52MODULE_VERSION(VIVI_VERSION);
5ab6c9af
HV
53
54static unsigned video_nr = -1;
55module_param(video_nr, uint, 0644);
56MODULE_PARM_DESC(video_nr, "videoX start number, -1 is autodetect");
57
58static unsigned n_devs = 1;
59module_param(n_devs, uint, 0644);
60MODULE_PARM_DESC(n_devs, "number of video devices to create");
61
62static unsigned debug;
63module_param(debug, uint, 0644);
64MODULE_PARM_DESC(debug, "activates debug info");
65
66static unsigned int vid_limit = 16;
67module_param(vid_limit, uint, 0644);
68MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");
69
730947bc
HV
70/* Global font descriptor */
71static const u8 *font8x16;
1e6dd65e 72
5ab6c9af
HV
73#define dprintk(dev, level, fmt, arg...) \
74 v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
1e6dd65e
MCC
75
76/* ------------------------------------------------------------------
77 Basic structures
78 ------------------------------------------------------------------*/
79
80struct vivi_fmt {
81 char *name;
82 u32 fourcc; /* v4l2 format id */
83 int depth;
84};
85
d891f475
MD
86static struct vivi_fmt formats[] = {
87 {
88 .name = "4:2:2, packed, YUYV",
89 .fourcc = V4L2_PIX_FMT_YUYV,
90 .depth = 16,
91 },
fca36bab
MD
92 {
93 .name = "4:2:2, packed, UYVY",
94 .fourcc = V4L2_PIX_FMT_UYVY,
95 .depth = 16,
96 },
3d51dca2
HV
97 {
98 .name = "4:2:2, packed, YVYU",
99 .fourcc = V4L2_PIX_FMT_YVYU,
100 .depth = 16,
101 },
102 {
103 .name = "4:2:2, packed, VYUY",
104 .fourcc = V4L2_PIX_FMT_VYUY,
105 .depth = 16,
106 },
aeadb5d4
MD
107 {
108 .name = "RGB565 (LE)",
109 .fourcc = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
110 .depth = 16,
111 },
112 {
113 .name = "RGB565 (BE)",
114 .fourcc = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
115 .depth = 16,
116 },
def52393
MD
117 {
118 .name = "RGB555 (LE)",
119 .fourcc = V4L2_PIX_FMT_RGB555, /* gggbbbbb arrrrrgg */
120 .depth = 16,
121 },
122 {
123 .name = "RGB555 (BE)",
124 .fourcc = V4L2_PIX_FMT_RGB555X, /* arrrrrgg gggbbbbb */
125 .depth = 16,
126 },
3d51dca2
HV
127 {
128 .name = "RGB24 (LE)",
129 .fourcc = V4L2_PIX_FMT_RGB24, /* rgb */
130 .depth = 24,
131 },
132 {
133 .name = "RGB24 (BE)",
134 .fourcc = V4L2_PIX_FMT_BGR24, /* bgr */
135 .depth = 24,
136 },
137 {
138 .name = "RGB32 (LE)",
139 .fourcc = V4L2_PIX_FMT_RGB32, /* argb */
140 .depth = 32,
141 },
142 {
143 .name = "RGB32 (BE)",
144 .fourcc = V4L2_PIX_FMT_BGR32, /* bgra */
145 .depth = 32,
146 },
1e6dd65e
MCC
147};
148
d891f475
MD
149static struct vivi_fmt *get_format(struct v4l2_format *f)
150{
151 struct vivi_fmt *fmt;
152 unsigned int k;
153
154 for (k = 0; k < ARRAY_SIZE(formats); k++) {
155 fmt = &formats[k];
156 if (fmt->fourcc == f->fmt.pix.pixelformat)
157 break;
158 }
159
160 if (k == ARRAY_SIZE(formats))
161 return NULL;
162
163 return &formats[k];
164}
165
1e6dd65e
MCC
166/* buffer for one video frame */
167struct vivi_buffer {
168 /* common v4l buffer stuff -- must be first */
e007a325
PO
169 struct vb2_buffer vb;
170 struct list_head list;
1e6dd65e 171 struct vivi_fmt *fmt;
1e6dd65e
MCC
172};
173
174struct vivi_dmaqueue {
175 struct list_head active;
1e6dd65e
MCC
176
177 /* thread for generating video stream*/
178 struct task_struct *kthread;
179 wait_queue_head_t wq;
180 /* Counters to control fps rate */
181 int frame;
182 int ini_jiffies;
183};
184
185static LIST_HEAD(vivi_devlist);
186
187struct vivi_dev {
188 struct list_head vivi_devlist;
5ab6c9af 189 struct v4l2_device v4l2_dev;
7e996afa 190 struct v4l2_ctrl_handler ctrl_handler;
1e6dd65e 191
730947bc 192 /* controls */
7e996afa
HV
193 struct v4l2_ctrl *brightness;
194 struct v4l2_ctrl *contrast;
195 struct v4l2_ctrl *saturation;
196 struct v4l2_ctrl *hue;
a1c894fb
HV
197 struct {
198 /* autogain/gain cluster */
199 struct v4l2_ctrl *autogain;
200 struct v4l2_ctrl *gain;
201 };
7e996afa 202 struct v4l2_ctrl *volume;
7088f4df 203 struct v4l2_ctrl *alpha;
7e996afa
HV
204 struct v4l2_ctrl *button;
205 struct v4l2_ctrl *boolean;
206 struct v4l2_ctrl *int32;
207 struct v4l2_ctrl *int64;
208 struct v4l2_ctrl *menu;
209 struct v4l2_ctrl *string;
b6d17a56 210 struct v4l2_ctrl *bitmask;
c520331a 211 struct v4l2_ctrl *int_menu;
730947bc 212
55862ac9 213 spinlock_t slock;
aa9dbac4 214 struct mutex mutex;
1e6dd65e 215
1e6dd65e 216 /* various device info */
f905c442 217 struct video_device *vfd;
1e6dd65e
MCC
218
219 struct vivi_dmaqueue vidq;
220
221 /* Several counters */
730947bc 222 unsigned ms;
dfd8c04e 223 unsigned long jiffies;
7e996afa 224 unsigned button_pressed;
025341d4
MCC
225
226 int mv_count; /* Controls bars movement */
e164b58a
MCC
227
228 /* Input Number */
229 int input;
c41ee24b 230
1e6dd65e
MCC
231 /* video capture */
232 struct vivi_fmt *fmt;
543323bc 233 unsigned int width, height;
e007a325
PO
234 struct vb2_queue vb_vidq;
235 enum v4l2_field field;
236 unsigned int field_count;
1e6dd65e 237
3d51dca2
HV
238 u8 bars[9][3];
239 u8 line[MAX_WIDTH * 8];
240 unsigned int pixelsize;
7088f4df 241 u8 alpha_component;
1e6dd65e
MCC
242};
243
244/* ------------------------------------------------------------------
245 DMA and thread functions
246 ------------------------------------------------------------------*/
247
248/* Bars and Colors should match positions */
249
250enum colors {
251 WHITE,
730947bc 252 AMBER,
1e6dd65e
MCC
253 CYAN,
254 GREEN,
255 MAGENTA,
256 RED,
543323bc
MCC
257 BLUE,
258 BLACK,
730947bc 259 TEXT_BLACK,
1e6dd65e
MCC
260};
261
730947bc 262/* R G B */
e164b58a 263#define COLOR_WHITE {204, 204, 204}
730947bc
HV
264#define COLOR_AMBER {208, 208, 0}
265#define COLOR_CYAN { 0, 206, 206}
e164b58a
MCC
266#define COLOR_GREEN { 0, 239, 0}
267#define COLOR_MAGENTA {239, 0, 239}
268#define COLOR_RED {205, 0, 0}
269#define COLOR_BLUE { 0, 0, 255}
270#define COLOR_BLACK { 0, 0, 0}
271
272struct bar_std {
730947bc 273 u8 bar[9][3];
e164b58a
MCC
274};
275
276/* Maximum number of bars are 10 - otherwise, the input print code
277 should be modified */
278static struct bar_std bars[] = {
279 { /* Standard ITU-R color bar sequence */
730947bc
HV
280 { COLOR_WHITE, COLOR_AMBER, COLOR_CYAN, COLOR_GREEN,
281 COLOR_MAGENTA, COLOR_RED, COLOR_BLUE, COLOR_BLACK, COLOR_BLACK }
e164b58a 282 }, {
730947bc
HV
283 { COLOR_WHITE, COLOR_AMBER, COLOR_BLACK, COLOR_WHITE,
284 COLOR_AMBER, COLOR_BLACK, COLOR_WHITE, COLOR_AMBER, COLOR_BLACK }
e164b58a 285 }, {
730947bc
HV
286 { COLOR_WHITE, COLOR_CYAN, COLOR_BLACK, COLOR_WHITE,
287 COLOR_CYAN, COLOR_BLACK, COLOR_WHITE, COLOR_CYAN, COLOR_BLACK }
e164b58a 288 }, {
730947bc
HV
289 { COLOR_WHITE, COLOR_GREEN, COLOR_BLACK, COLOR_WHITE,
290 COLOR_GREEN, COLOR_BLACK, COLOR_WHITE, COLOR_GREEN, COLOR_BLACK }
e164b58a 291 },
1e6dd65e
MCC
292};
293
e164b58a
MCC
294#define NUM_INPUTS ARRAY_SIZE(bars)
295
543323bc
MCC
296#define TO_Y(r, g, b) \
297 (((16829 * r + 33039 * g + 6416 * b + 32768) >> 16) + 16)
1e6dd65e 298/* RGB to V(Cr) Color transform */
543323bc
MCC
299#define TO_V(r, g, b) \
300 (((28784 * r - 24103 * g - 4681 * b + 32768) >> 16) + 128)
1e6dd65e 301/* RGB to U(Cb) Color transform */
543323bc
MCC
302#define TO_U(r, g, b) \
303 (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
1e6dd65e 304
c285addb 305/* precalculate color bar values to speed up rendering */
730947bc 306static void precalculate_bars(struct vivi_dev *dev)
c285addb 307{
730947bc 308 u8 r, g, b;
c285addb
MCC
309 int k, is_yuv;
310
730947bc
HV
311 for (k = 0; k < 9; k++) {
312 r = bars[dev->input].bar[k][0];
313 g = bars[dev->input].bar[k][1];
314 b = bars[dev->input].bar[k][2];
c285addb
MCC
315 is_yuv = 0;
316
730947bc 317 switch (dev->fmt->fourcc) {
c285addb
MCC
318 case V4L2_PIX_FMT_YUYV:
319 case V4L2_PIX_FMT_UYVY:
3d51dca2
HV
320 case V4L2_PIX_FMT_YVYU:
321 case V4L2_PIX_FMT_VYUY:
c285addb
MCC
322 is_yuv = 1;
323 break;
324 case V4L2_PIX_FMT_RGB565:
325 case V4L2_PIX_FMT_RGB565X:
326 r >>= 3;
327 g >>= 2;
328 b >>= 3;
329 break;
330 case V4L2_PIX_FMT_RGB555:
331 case V4L2_PIX_FMT_RGB555X:
332 r >>= 3;
333 g >>= 3;
334 b >>= 3;
335 break;
3d51dca2
HV
336 case V4L2_PIX_FMT_RGB24:
337 case V4L2_PIX_FMT_BGR24:
338 case V4L2_PIX_FMT_RGB32:
339 case V4L2_PIX_FMT_BGR32:
340 break;
c285addb
MCC
341 }
342
343 if (is_yuv) {
730947bc
HV
344 dev->bars[k][0] = TO_Y(r, g, b); /* Luma */
345 dev->bars[k][1] = TO_U(r, g, b); /* Cb */
346 dev->bars[k][2] = TO_V(r, g, b); /* Cr */
c285addb 347 } else {
730947bc
HV
348 dev->bars[k][0] = r;
349 dev->bars[k][1] = g;
350 dev->bars[k][2] = b;
c285addb
MCC
351 }
352 }
c285addb
MCC
353}
354
e164b58a
MCC
355#define TSTAMP_MIN_Y 24
356#define TSTAMP_MAX_Y (TSTAMP_MIN_Y + 15)
357#define TSTAMP_INPUT_X 10
358#define TSTAMP_MIN_X (54 + TSTAMP_INPUT_X)
1e6dd65e 359
3d51dca2
HV
360/* 'odd' is true for pixels 1, 3, 5, etc. and false for pixels 0, 2, 4, etc. */
361static void gen_twopix(struct vivi_dev *dev, u8 *buf, int colorpos, bool odd)
74d7c5af 362{
730947bc 363 u8 r_y, g_u, b_v;
7088f4df 364 u8 alpha = dev->alpha_component;
74d7c5af 365 int color;
730947bc 366 u8 *p;
74d7c5af 367
730947bc
HV
368 r_y = dev->bars[colorpos][0]; /* R or precalculated Y */
369 g_u = dev->bars[colorpos][1]; /* G or precalculated U */
370 b_v = dev->bars[colorpos][2]; /* B or precalculated V */
74d7c5af 371
3d51dca2 372 for (color = 0; color < dev->pixelsize; color++) {
74d7c5af
MD
373 p = buf + color;
374
730947bc 375 switch (dev->fmt->fourcc) {
d891f475
MD
376 case V4L2_PIX_FMT_YUYV:
377 switch (color) {
378 case 0:
d891f475
MD
379 *p = r_y;
380 break;
381 case 1:
3d51dca2 382 *p = odd ? b_v : g_u;
d891f475
MD
383 break;
384 }
74d7c5af 385 break;
fca36bab
MD
386 case V4L2_PIX_FMT_UYVY:
387 switch (color) {
3d51dca2
HV
388 case 0:
389 *p = odd ? b_v : g_u;
390 break;
fca36bab 391 case 1:
fca36bab
MD
392 *p = r_y;
393 break;
3d51dca2
HV
394 }
395 break;
396 case V4L2_PIX_FMT_YVYU:
397 switch (color) {
398 case 0:
399 *p = r_y;
400 break;
401 case 1:
402 *p = odd ? g_u : b_v;
403 break;
404 }
405 break;
406 case V4L2_PIX_FMT_VYUY:
407 switch (color) {
fca36bab 408 case 0:
3d51dca2 409 *p = odd ? g_u : b_v;
fca36bab 410 break;
3d51dca2
HV
411 case 1:
412 *p = r_y;
fca36bab
MD
413 break;
414 }
415 break;
aeadb5d4
MD
416 case V4L2_PIX_FMT_RGB565:
417 switch (color) {
418 case 0:
aeadb5d4
MD
419 *p = (g_u << 5) | b_v;
420 break;
421 case 1:
aeadb5d4
MD
422 *p = (r_y << 3) | (g_u >> 3);
423 break;
424 }
425 break;
426 case V4L2_PIX_FMT_RGB565X:
427 switch (color) {
428 case 0:
aeadb5d4
MD
429 *p = (r_y << 3) | (g_u >> 3);
430 break;
431 case 1:
aeadb5d4
MD
432 *p = (g_u << 5) | b_v;
433 break;
434 }
435 break;
def52393
MD
436 case V4L2_PIX_FMT_RGB555:
437 switch (color) {
438 case 0:
def52393
MD
439 *p = (g_u << 5) | b_v;
440 break;
441 case 1:
7088f4df 442 *p = (alpha & 0x80) | (r_y << 2) | (g_u >> 3);
def52393
MD
443 break;
444 }
445 break;
446 case V4L2_PIX_FMT_RGB555X:
447 switch (color) {
448 case 0:
7088f4df 449 *p = (alpha & 0x80) | (r_y << 2) | (g_u >> 3);
def52393
MD
450 break;
451 case 1:
def52393
MD
452 *p = (g_u << 5) | b_v;
453 break;
454 }
455 break;
3d51dca2
HV
456 case V4L2_PIX_FMT_RGB24:
457 switch (color) {
458 case 0:
459 *p = r_y;
460 break;
461 case 1:
462 *p = g_u;
463 break;
464 case 2:
465 *p = b_v;
466 break;
467 }
468 break;
469 case V4L2_PIX_FMT_BGR24:
470 switch (color) {
471 case 0:
472 *p = b_v;
473 break;
474 case 1:
475 *p = g_u;
476 break;
477 case 2:
478 *p = r_y;
479 break;
480 }
481 break;
482 case V4L2_PIX_FMT_RGB32:
483 switch (color) {
484 case 0:
7088f4df 485 *p = alpha;
3d51dca2
HV
486 break;
487 case 1:
488 *p = r_y;
489 break;
490 case 2:
491 *p = g_u;
492 break;
493 case 3:
494 *p = b_v;
495 break;
496 }
497 break;
498 case V4L2_PIX_FMT_BGR32:
499 switch (color) {
500 case 0:
501 *p = b_v;
502 break;
503 case 1:
504 *p = g_u;
505 break;
506 case 2:
507 *p = r_y;
508 break;
509 case 3:
7088f4df 510 *p = alpha;
3d51dca2
HV
511 break;
512 }
513 break;
74d7c5af
MD
514 }
515 }
516}
517
730947bc 518static void precalculate_line(struct vivi_dev *dev)
1e6dd65e 519{
730947bc 520 int w;
1e6dd65e 521
3d51dca2
HV
522 for (w = 0; w < dev->width * 2; w++) {
523 int colorpos = w / (dev->width / 8) % 8;
74d7c5af 524
3d51dca2 525 gen_twopix(dev, dev->line + w * dev->pixelsize, colorpos, w & 1);
1e6dd65e 526 }
730947bc 527}
1e6dd65e 528
730947bc
HV
529static void gen_text(struct vivi_dev *dev, char *basep,
530 int y, int x, char *text)
531{
532 int line;
e164b58a 533
730947bc
HV
534 /* Checks if it is possible to show string */
535 if (y + 16 >= dev->height || x + strlen(text) * 8 >= dev->width)
536 return;
1e6dd65e
MCC
537
538 /* Print stream time */
730947bc
HV
539 for (line = y; line < y + 16; line++) {
540 int j = 0;
3d51dca2 541 char *pos = basep + line * dev->width * dev->pixelsize + x * dev->pixelsize;
730947bc
HV
542 char *s;
543
544 for (s = text; *s; s++) {
545 u8 chr = font8x16[*s * 16 + line - y];
546 int i;
547
548 for (i = 0; i < 7; i++, j++) {
74d7c5af 549 /* Draw white font on black background */
730947bc 550 if (chr & (1 << (7 - i)))
3d51dca2 551 gen_twopix(dev, pos + j * dev->pixelsize, WHITE, (x+y) & 1);
74d7c5af 552 else
3d51dca2 553 gen_twopix(dev, pos + j * dev->pixelsize, TEXT_BLACK, (x+y) & 1);
1e6dd65e
MCC
554 }
555 }
556 }
1e6dd65e 557}
78718e5d 558
730947bc 559static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
1e6dd65e 560{
e007a325
PO
561 int wmax = dev->width;
562 int hmax = dev->height;
1e6dd65e 563 struct timeval ts;
e007a325 564 void *vbuf = vb2_plane_vaddr(&buf->vb, 0);
730947bc
HV
565 unsigned ms;
566 char str[100];
567 int h, line = 1;
a1c894fb 568 s32 gain;
b50e7fe9 569
5c554e6b 570 if (!vbuf)
5a037706 571 return;
1e6dd65e 572
730947bc 573 for (h = 0; h < hmax; h++)
3d51dca2
HV
574 memcpy(vbuf + h * wmax * dev->pixelsize,
575 dev->line + (dev->mv_count % wmax) * dev->pixelsize,
576 wmax * dev->pixelsize);
5a037706 577
1e6dd65e
MCC
578 /* Updates stream time */
579
730947bc 580 dev->ms += jiffies_to_msecs(jiffies - dev->jiffies);
543323bc 581 dev->jiffies = jiffies;
730947bc
HV
582 ms = dev->ms;
583 snprintf(str, sizeof(str), " %02d:%02d:%02d:%03d ",
584 (ms / (60 * 60 * 1000)) % 24,
585 (ms / (60 * 1000)) % 60,
586 (ms / 1000) % 60,
587 ms % 1000);
588 gen_text(dev, vbuf, line++ * 16, 16, str);
589 snprintf(str, sizeof(str), " %dx%d, input %d ",
590 dev->width, dev->height, dev->input);
591 gen_text(dev, vbuf, line++ * 16, 16, str);
592
a1c894fb 593 gain = v4l2_ctrl_g_ctrl(dev->gain);
77e7c4e6 594 mutex_lock(dev->ctrl_handler.lock);
730947bc 595 snprintf(str, sizeof(str), " brightness %3d, contrast %3d, saturation %3d, hue %d ",
7e996afa
HV
596 dev->brightness->cur.val,
597 dev->contrast->cur.val,
598 dev->saturation->cur.val,
599 dev->hue->cur.val);
730947bc 600 gen_text(dev, vbuf, line++ * 16, 16, str);
7088f4df
HV
601 snprintf(str, sizeof(str), " autogain %d, gain %3d, volume %3d, alpha 0x%02x ",
602 dev->autogain->cur.val, gain, dev->volume->cur.val,
603 dev->alpha->cur.val);
730947bc 604 gen_text(dev, vbuf, line++ * 16, 16, str);
b6d17a56 605 snprintf(str, sizeof(str), " int32 %d, int64 %lld, bitmask %08x ",
7e996afa 606 dev->int32->cur.val,
b6d17a56
HV
607 dev->int64->cur.val64,
608 dev->bitmask->cur.val);
7e996afa
HV
609 gen_text(dev, vbuf, line++ * 16, 16, str);
610 snprintf(str, sizeof(str), " boolean %d, menu %s, string \"%s\" ",
611 dev->boolean->cur.val,
612 dev->menu->qmenu[dev->menu->cur.val],
613 dev->string->cur.string);
f70cfc7f 614 gen_text(dev, vbuf, line++ * 16, 16, str);
c520331a
SA
615 snprintf(str, sizeof(str), " integer_menu %lld, value %d ",
616 dev->int_menu->qmenu_int[dev->int_menu->cur.val],
617 dev->int_menu->cur.val);
618 gen_text(dev, vbuf, line++ * 16, 16, str);
77e7c4e6 619 mutex_unlock(dev->ctrl_handler.lock);
7e996afa
HV
620 if (dev->button_pressed) {
621 dev->button_pressed--;
622 snprintf(str, sizeof(str), " button pressed!");
623 gen_text(dev, vbuf, line++ * 16, 16, str);
624 }
730947bc
HV
625
626 dev->mv_count += 2;
1e6dd65e 627
e007a325
PO
628 buf->vb.v4l2_buf.field = dev->field;
629 dev->field_count++;
630 buf->vb.v4l2_buf.sequence = dev->field_count >> 1;
1e6dd65e 631 do_gettimeofday(&ts);
e007a325 632 buf->vb.v4l2_buf.timestamp = ts;
1e6dd65e
MCC
633}
634
730947bc 635static void vivi_thread_tick(struct vivi_dev *dev)
1e6dd65e 636{
78718e5d 637 struct vivi_dmaqueue *dma_q = &dev->vidq;
730947bc 638 struct vivi_buffer *buf;
78718e5d 639 unsigned long flags = 0;
1e6dd65e 640
78718e5d 641 dprintk(dev, 1, "Thread tick\n");
1e6dd65e 642
78718e5d
BP
643 spin_lock_irqsave(&dev->slock, flags);
644 if (list_empty(&dma_q->active)) {
645 dprintk(dev, 1, "No active queue to serve\n");
1de5be5e
HV
646 spin_unlock_irqrestore(&dev->slock, flags);
647 return;
78718e5d 648 }
1e6dd65e 649
e007a325
PO
650 buf = list_entry(dma_q->active.next, struct vivi_buffer, list);
651 list_del(&buf->list);
1de5be5e 652 spin_unlock_irqrestore(&dev->slock, flags);
1e6dd65e 653
e007a325 654 do_gettimeofday(&buf->vb.v4l2_buf.timestamp);
78718e5d
BP
655
656 /* Fill buffer */
730947bc 657 vivi_fillbuff(dev, buf);
78718e5d
BP
658 dprintk(dev, 1, "filled buffer %p\n", buf);
659
e007a325
PO
660 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
661 dprintk(dev, 2, "[%p/%d] done\n", buf, buf->vb.v4l2_buf.index);
1e6dd65e
MCC
662}
663
6594ad82
MCC
664#define frames_to_ms(frames) \
665 ((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)
666
730947bc 667static void vivi_sleep(struct vivi_dev *dev)
1e6dd65e 668{
78718e5d
BP
669 struct vivi_dmaqueue *dma_q = &dev->vidq;
670 int timeout;
1e6dd65e
MCC
671 DECLARE_WAITQUEUE(wait, current);
672
7e28adb2 673 dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
6c2f9901 674 (unsigned long)dma_q);
1e6dd65e
MCC
675
676 add_wait_queue(&dma_q->wq, &wait);
6594ad82
MCC
677 if (kthread_should_stop())
678 goto stop_task;
679
6594ad82 680 /* Calculate time to wake up */
78718e5d 681 timeout = msecs_to_jiffies(frames_to_ms(1));
6594ad82 682
730947bc 683 vivi_thread_tick(dev);
6594ad82
MCC
684
685 schedule_timeout_interruptible(timeout);
1e6dd65e 686
6594ad82 687stop_task:
1e6dd65e
MCC
688 remove_wait_queue(&dma_q->wq, &wait);
689 try_to_freeze();
690}
691
972c3517 692static int vivi_thread(void *data)
1e6dd65e 693{
730947bc 694 struct vivi_dev *dev = data;
1e6dd65e 695
6c2f9901 696 dprintk(dev, 1, "thread started\n");
1e6dd65e 697
83144186 698 set_freezable();
0b600512 699
1e6dd65e 700 for (;;) {
730947bc 701 vivi_sleep(dev);
1e6dd65e
MCC
702
703 if (kthread_should_stop())
704 break;
705 }
6c2f9901 706 dprintk(dev, 1, "thread: exit\n");
1e6dd65e
MCC
707 return 0;
708}
709
e007a325 710static int vivi_start_generating(struct vivi_dev *dev)
1e6dd65e 711{
78718e5d 712 struct vivi_dmaqueue *dma_q = &dev->vidq;
6c2f9901 713
7e28adb2 714 dprintk(dev, 1, "%s\n", __func__);
1e6dd65e 715
730947bc
HV
716 /* Resets frame counters */
717 dev->ms = 0;
718 dev->mv_count = 0;
719 dev->jiffies = jiffies;
720
721 dma_q->frame = 0;
722 dma_q->ini_jiffies = jiffies;
723 dma_q->kthread = kthread_run(vivi_thread, dev, dev->v4l2_dev.name);
1e6dd65e 724
054afee4 725 if (IS_ERR(dma_q->kthread)) {
5ab6c9af 726 v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n");
e007a325 727 return PTR_ERR(dma_q->kthread);
1e6dd65e 728 }
0b600512
MCC
729 /* Wakes thread */
730 wake_up_interruptible(&dma_q->wq);
731
7e28adb2 732 dprintk(dev, 1, "returning from %s\n", __func__);
e007a325 733 return 0;
1e6dd65e
MCC
734}
735
e007a325 736static void vivi_stop_generating(struct vivi_dev *dev)
1e6dd65e 737{
730947bc 738 struct vivi_dmaqueue *dma_q = &dev->vidq;
6c2f9901 739
7e28adb2 740 dprintk(dev, 1, "%s\n", __func__);
730947bc 741
1e6dd65e
MCC
742 /* shutdown control thread */
743 if (dma_q->kthread) {
744 kthread_stop(dma_q->kthread);
543323bc 745 dma_q->kthread = NULL;
1e6dd65e 746 }
730947bc 747
e007a325
PO
748 /*
749 * Typical driver might need to wait here until dma engine stops.
750 * In this case we can abort imiedetly, so it's just a noop.
751 */
752
753 /* Release all active buffers */
754 while (!list_empty(&dma_q->active)) {
755 struct vivi_buffer *buf;
756 buf = list_entry(dma_q->active.next, struct vivi_buffer, list);
757 list_del(&buf->list);
758 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
759 dprintk(dev, 2, "[%p/%d] done\n", buf, buf->vb.v4l2_buf.index);
760 }
1e6dd65e 761}
1e6dd65e
MCC
762/* ------------------------------------------------------------------
763 Videobuf operations
764 ------------------------------------------------------------------*/
fc714e70
GL
765static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
766 unsigned int *nbuffers, unsigned int *nplanes,
767 unsigned int sizes[], void *alloc_ctxs[])
1e6dd65e 768{
e007a325
PO
769 struct vivi_dev *dev = vb2_get_drv_priv(vq);
770 unsigned long size;
771
3d51dca2 772 size = dev->width * dev->height * dev->pixelsize;
1e6dd65e 773
e007a325
PO
774 if (0 == *nbuffers)
775 *nbuffers = 32;
1e6dd65e 776
e007a325
PO
777 while (size * *nbuffers > vid_limit * 1024 * 1024)
778 (*nbuffers)--;
6bb2790f 779
e007a325 780 *nplanes = 1;
6bb2790f 781
e007a325
PO
782 sizes[0] = size;
783
784 /*
785 * videobuf2-vmalloc allocator is context-less so no need to set
786 * alloc_ctxs array.
787 */
788
789 dprintk(dev, 1, "%s, count=%d, size=%ld\n", __func__,
790 *nbuffers, size);
6bb2790f 791
1e6dd65e
MCC
792 return 0;
793}
794
e007a325 795static int buffer_init(struct vb2_buffer *vb)
1e6dd65e 796{
e007a325 797 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
6c2f9901 798
e007a325 799 BUG_ON(NULL == dev->fmt);
1e6dd65e 800
e007a325
PO
801 /*
802 * This callback is called once per buffer, after its allocation.
803 *
804 * Vivi does not allow changing format during streaming, but it is
805 * possible to do so when streaming is paused (i.e. in streamoff state).
806 * Buffers however are not freed when going into streamoff and so
807 * buffer size verification has to be done in buffer_prepare, on each
808 * qbuf.
809 * It would be best to move verification code here to buf_init and
810 * s_fmt though.
811 */
812
813 return 0;
1e6dd65e
MCC
814}
815
e007a325 816static int buffer_prepare(struct vb2_buffer *vb)
1e6dd65e 817{
e007a325 818 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
543323bc 819 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
e007a325 820 unsigned long size;
1e6dd65e 821
e007a325 822 dprintk(dev, 1, "%s, field=%d\n", __func__, vb->v4l2_buf.field);
1e6dd65e 823
730947bc 824 BUG_ON(NULL == dev->fmt);
78718e5d 825
e007a325
PO
826 /*
827 * Theses properties only change when queue is idle, see s_fmt.
828 * The below checks should not be performed here, on each
829 * buffer_prepare (i.e. on each qbuf). Most of the code in this function
830 * should thus be moved to buffer_init and s_fmt.
831 */
730947bc
HV
832 if (dev->width < 48 || dev->width > MAX_WIDTH ||
833 dev->height < 32 || dev->height > MAX_HEIGHT)
1e6dd65e 834 return -EINVAL;
78718e5d 835
3d51dca2 836 size = dev->width * dev->height * dev->pixelsize;
e007a325
PO
837 if (vb2_plane_size(vb, 0) < size) {
838 dprintk(dev, 1, "%s data will not fit into plane (%lu < %lu)\n",
839 __func__, vb2_plane_size(vb, 0), size);
1e6dd65e 840 return -EINVAL;
e007a325
PO
841 }
842
843 vb2_set_plane_payload(&buf->vb, 0, size);
1e6dd65e 844
e007a325 845 buf->fmt = dev->fmt;
1e6dd65e 846
730947bc
HV
847 precalculate_bars(dev);
848 precalculate_line(dev);
c285addb 849
e007a325
PO
850 return 0;
851}
1e6dd65e 852
e007a325
PO
853static int buffer_finish(struct vb2_buffer *vb)
854{
855 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
856 dprintk(dev, 1, "%s\n", __func__);
1e6dd65e 857 return 0;
e007a325
PO
858}
859
860static void buffer_cleanup(struct vb2_buffer *vb)
861{
862 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
863 dprintk(dev, 1, "%s\n", __func__);
1e6dd65e 864
1e6dd65e
MCC
865}
866
e007a325 867static void buffer_queue(struct vb2_buffer *vb)
1e6dd65e 868{
e007a325 869 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
730947bc 870 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
78718e5d 871 struct vivi_dmaqueue *vidq = &dev->vidq;
e007a325 872 unsigned long flags = 0;
78718e5d 873
7e28adb2 874 dprintk(dev, 1, "%s\n", __func__);
78718e5d 875
e007a325
PO
876 spin_lock_irqsave(&dev->slock, flags);
877 list_add_tail(&buf->list, &vidq->active);
878 spin_unlock_irqrestore(&dev->slock, flags);
1e6dd65e
MCC
879}
880
bd323e28 881static int start_streaming(struct vb2_queue *vq, unsigned int count)
1e6dd65e 882{
e007a325
PO
883 struct vivi_dev *dev = vb2_get_drv_priv(vq);
884 dprintk(dev, 1, "%s\n", __func__);
885 return vivi_start_generating(dev);
886}
1e6dd65e 887
e007a325
PO
888/* abort streaming and wait for last buffer */
889static int stop_streaming(struct vb2_queue *vq)
890{
891 struct vivi_dev *dev = vb2_get_drv_priv(vq);
7e28adb2 892 dprintk(dev, 1, "%s\n", __func__);
e007a325
PO
893 vivi_stop_generating(dev);
894 return 0;
895}
896
897static void vivi_lock(struct vb2_queue *vq)
898{
899 struct vivi_dev *dev = vb2_get_drv_priv(vq);
900 mutex_lock(&dev->mutex);
901}
1e6dd65e 902
e007a325
PO
903static void vivi_unlock(struct vb2_queue *vq)
904{
905 struct vivi_dev *dev = vb2_get_drv_priv(vq);
906 mutex_unlock(&dev->mutex);
1e6dd65e
MCC
907}
908
e007a325
PO
909
910static struct vb2_ops vivi_video_qops = {
911 .queue_setup = queue_setup,
912 .buf_init = buffer_init,
913 .buf_prepare = buffer_prepare,
914 .buf_finish = buffer_finish,
915 .buf_cleanup = buffer_cleanup,
916 .buf_queue = buffer_queue,
917 .start_streaming = start_streaming,
918 .stop_streaming = stop_streaming,
919 .wait_prepare = vivi_unlock,
920 .wait_finish = vivi_lock,
1e6dd65e
MCC
921};
922
c820cc45
MCC
923/* ------------------------------------------------------------------
924 IOCTL vidioc handling
925 ------------------------------------------------------------------*/
543323bc 926static int vidioc_querycap(struct file *file, void *priv,
c820cc45
MCC
927 struct v4l2_capability *cap)
928{
730947bc 929 struct vivi_dev *dev = video_drvdata(file);
5ab6c9af 930
c820cc45
MCC
931 strcpy(cap->driver, "vivi");
932 strcpy(cap->card, "vivi");
5ab6c9af 933 strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
23268ae5
HV
934 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
935 V4L2_CAP_READWRITE;
936 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
c820cc45
MCC
937 return 0;
938}
939
78b526a4 940static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
c820cc45
MCC
941 struct v4l2_fmtdesc *f)
942{
d891f475
MD
943 struct vivi_fmt *fmt;
944
945 if (f->index >= ARRAY_SIZE(formats))
c820cc45
MCC
946 return -EINVAL;
947
d891f475
MD
948 fmt = &formats[f->index];
949
950 strlcpy(f->description, fmt->name, sizeof(f->description));
951 f->pixelformat = fmt->fourcc;
c820cc45
MCC
952 return 0;
953}
954
78b526a4 955static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
c820cc45
MCC
956 struct v4l2_format *f)
957{
730947bc 958 struct vivi_dev *dev = video_drvdata(file);
c820cc45 959
730947bc
HV
960 f->fmt.pix.width = dev->width;
961 f->fmt.pix.height = dev->height;
e007a325 962 f->fmt.pix.field = dev->field;
730947bc 963 f->fmt.pix.pixelformat = dev->fmt->fourcc;
c820cc45 964 f->fmt.pix.bytesperline =
730947bc 965 (f->fmt.pix.width * dev->fmt->depth) >> 3;
c820cc45
MCC
966 f->fmt.pix.sizeimage =
967 f->fmt.pix.height * f->fmt.pix.bytesperline;
8c79eece
HV
968 if (dev->fmt->fourcc == V4L2_PIX_FMT_YUYV ||
969 dev->fmt->fourcc == V4L2_PIX_FMT_UYVY)
970 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
971 else
972 f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
730947bc 973 return 0;
c820cc45
MCC
974}
975
78b526a4 976static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1e6dd65e
MCC
977 struct v4l2_format *f)
978{
730947bc 979 struct vivi_dev *dev = video_drvdata(file);
1e6dd65e
MCC
980 struct vivi_fmt *fmt;
981 enum v4l2_field field;
1e6dd65e 982
d891f475
MD
983 fmt = get_format(f);
984 if (!fmt) {
985 dprintk(dev, 1, "Fourcc format (0x%08x) invalid.\n",
986 f->fmt.pix.pixelformat);
1e6dd65e
MCC
987 return -EINVAL;
988 }
1e6dd65e
MCC
989
990 field = f->fmt.pix.field;
991
992 if (field == V4L2_FIELD_ANY) {
543323bc 993 field = V4L2_FIELD_INTERLACED;
1e6dd65e 994 } else if (V4L2_FIELD_INTERLACED != field) {
6c2f9901 995 dprintk(dev, 1, "Field type invalid.\n");
1e6dd65e
MCC
996 return -EINVAL;
997 }
998
1e6dd65e 999 f->fmt.pix.field = field;
730947bc
HV
1000 v4l_bound_align_image(&f->fmt.pix.width, 48, MAX_WIDTH, 2,
1001 &f->fmt.pix.height, 32, MAX_HEIGHT, 0, 0);
1e6dd65e
MCC
1002 f->fmt.pix.bytesperline =
1003 (f->fmt.pix.width * fmt->depth) >> 3;
1004 f->fmt.pix.sizeimage =
1005 f->fmt.pix.height * f->fmt.pix.bytesperline;
8c79eece
HV
1006 if (fmt->fourcc == V4L2_PIX_FMT_YUYV ||
1007 fmt->fourcc == V4L2_PIX_FMT_UYVY)
1008 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1009 else
1010 f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
1e6dd65e
MCC
1011 return 0;
1012}
1013
e164b58a
MCC
1014static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1015 struct v4l2_format *f)
1016{
730947bc 1017 struct vivi_dev *dev = video_drvdata(file);
e007a325 1018 struct vb2_queue *q = &dev->vb_vidq;
e164b58a 1019
730947bc 1020 int ret = vidioc_try_fmt_vid_cap(file, priv, f);
e164b58a
MCC
1021 if (ret < 0)
1022 return ret;
1023
e007a325 1024 if (vb2_is_streaming(q)) {
730947bc 1025 dprintk(dev, 1, "%s device busy\n", __func__);
e007a325 1026 return -EBUSY;
e164b58a
MCC
1027 }
1028
730947bc 1029 dev->fmt = get_format(f);
3d51dca2 1030 dev->pixelsize = dev->fmt->depth / 8;
730947bc
HV
1031 dev->width = f->fmt.pix.width;
1032 dev->height = f->fmt.pix.height;
e007a325
PO
1033 dev->field = f->fmt.pix.field;
1034
1035 return 0;
1e6dd65e
MCC
1036}
1037
543323bc
MCC
1038static int vidioc_reqbufs(struct file *file, void *priv,
1039 struct v4l2_requestbuffers *p)
1e6dd65e 1040{
730947bc 1041 struct vivi_dev *dev = video_drvdata(file);
e007a325 1042 return vb2_reqbufs(&dev->vb_vidq, p);
1e6dd65e
MCC
1043}
1044
543323bc 1045static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
1e6dd65e 1046{
730947bc 1047 struct vivi_dev *dev = video_drvdata(file);
e007a325 1048 return vb2_querybuf(&dev->vb_vidq, p);
c820cc45 1049}
1e6dd65e 1050
543323bc 1051static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
c820cc45 1052{
730947bc 1053 struct vivi_dev *dev = video_drvdata(file);
e007a325 1054 return vb2_qbuf(&dev->vb_vidq, p);
c820cc45 1055}
1e6dd65e 1056
543323bc 1057static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
c820cc45 1058{
730947bc 1059 struct vivi_dev *dev = video_drvdata(file);
e007a325 1060 return vb2_dqbuf(&dev->vb_vidq, p, file->f_flags & O_NONBLOCK);
c820cc45 1061}
1e6dd65e 1062
dc46ace1 1063static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
c820cc45 1064{
730947bc 1065 struct vivi_dev *dev = video_drvdata(file);
e007a325 1066 return vb2_streamon(&dev->vb_vidq, i);
c820cc45 1067}
1e6dd65e 1068
dc46ace1 1069static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
c820cc45 1070{
730947bc 1071 struct vivi_dev *dev = video_drvdata(file);
e007a325 1072 return vb2_streamoff(&dev->vb_vidq, i);
c820cc45
MCC
1073}
1074
543323bc 1075static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
c820cc45 1076{
c820cc45
MCC
1077 return 0;
1078}
1e6dd65e 1079
c820cc45 1080/* only one input in this sample driver */
543323bc 1081static int vidioc_enum_input(struct file *file, void *priv,
c820cc45
MCC
1082 struct v4l2_input *inp)
1083{
e164b58a 1084 if (inp->index >= NUM_INPUTS)
c820cc45 1085 return -EINVAL;
1e6dd65e 1086
c820cc45 1087 inp->type = V4L2_INPUT_TYPE_CAMERA;
784c668b 1088 inp->std = V4L2_STD_525_60;
e164b58a 1089 sprintf(inp->name, "Camera %u", inp->index);
730947bc 1090 return 0;
c820cc45 1091}
1e6dd65e 1092
543323bc 1093static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
c820cc45 1094{
730947bc 1095 struct vivi_dev *dev = video_drvdata(file);
e164b58a
MCC
1096
1097 *i = dev->input;
730947bc 1098 return 0;
c820cc45 1099}
730947bc 1100
543323bc 1101static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
c820cc45 1102{
730947bc 1103 struct vivi_dev *dev = video_drvdata(file);
e164b58a
MCC
1104
1105 if (i >= NUM_INPUTS)
c820cc45 1106 return -EINVAL;
1e6dd65e 1107
c7a52f8d
HV
1108 if (i == dev->input)
1109 return 0;
1110
e164b58a 1111 dev->input = i;
730947bc
HV
1112 precalculate_bars(dev);
1113 precalculate_line(dev);
1114 return 0;
c820cc45 1115}
1e6dd65e 1116
730947bc 1117/* --- controls ---------------------------------------------- */
1e6dd65e 1118
a1c894fb
HV
1119static int vivi_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1120{
1121 struct vivi_dev *dev = container_of(ctrl->handler, struct vivi_dev, ctrl_handler);
1122
1123 if (ctrl == dev->autogain)
1124 dev->gain->val = jiffies & 0xff;
1125 return 0;
1126}
1127
7e996afa 1128static int vivi_s_ctrl(struct v4l2_ctrl *ctrl)
c820cc45 1129{
7e996afa 1130 struct vivi_dev *dev = container_of(ctrl->handler, struct vivi_dev, ctrl_handler);
1e6dd65e 1131
7088f4df
HV
1132 switch (ctrl->id) {
1133 case V4L2_CID_ALPHA_COMPONENT:
1134 dev->alpha_component = ctrl->val;
1135 break;
1136 default:
1137 if (ctrl == dev->button)
1138 dev->button_pressed = 30;
1139 break;
1140 }
7e996afa 1141 return 0;
1e6dd65e
MCC
1142}
1143
1144/* ------------------------------------------------------------------
1145 File operations for the device
1146 ------------------------------------------------------------------*/
1147
1e6dd65e
MCC
1148static ssize_t
1149vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
1150{
730947bc 1151 struct vivi_dev *dev = video_drvdata(file);
d9762df4 1152 int err;
1e6dd65e 1153
e007a325 1154 dprintk(dev, 1, "read called\n");
d9762df4
HV
1155 mutex_lock(&dev->mutex);
1156 err = vb2_read(&dev->vb_vidq, data, count, ppos,
e007a325 1157 file->f_flags & O_NONBLOCK);
d9762df4
HV
1158 mutex_unlock(&dev->mutex);
1159 return err;
1e6dd65e
MCC
1160}
1161
1162static unsigned int
1163vivi_poll(struct file *file, struct poll_table_struct *wait)
1164{
730947bc 1165 struct vivi_dev *dev = video_drvdata(file);
e007a325 1166 struct vb2_queue *q = &dev->vb_vidq;
1e6dd65e 1167
7e28adb2 1168 dprintk(dev, 1, "%s\n", __func__);
0bf0f713 1169 return vb2_poll(q, file, wait);
1e6dd65e
MCC
1170}
1171
bec43661 1172static int vivi_close(struct file *file)
1e6dd65e 1173{
50462eb0 1174 struct video_device *vdev = video_devdata(file);
730947bc 1175 struct vivi_dev *dev = video_drvdata(file);
1e6dd65e 1176
e007a325
PO
1177 dprintk(dev, 1, "close called (dev=%s), file %p\n",
1178 video_device_node_name(vdev), file);
1e6dd65e 1179
2e4784d0 1180 if (v4l2_fh_is_singular_file(file))
e007a325 1181 vb2_queue_release(&dev->vb_vidq);
2e4784d0 1182 return v4l2_fh_release(file);
1e6dd65e
MCC
1183}
1184
543323bc 1185static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1e6dd65e 1186{
730947bc 1187 struct vivi_dev *dev = video_drvdata(file);
1e6dd65e
MCC
1188 int ret;
1189
6c2f9901 1190 dprintk(dev, 1, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
1e6dd65e 1191
e007a325 1192 ret = vb2_mmap(&dev->vb_vidq, vma);
6c2f9901 1193 dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1e6dd65e 1194 (unsigned long)vma->vm_start,
730947bc 1195 (unsigned long)vma->vm_end - (unsigned long)vma->vm_start,
1e6dd65e 1196 ret);
1e6dd65e
MCC
1197 return ret;
1198}
1199
7e996afa 1200static const struct v4l2_ctrl_ops vivi_ctrl_ops = {
a1c894fb 1201 .g_volatile_ctrl = vivi_g_volatile_ctrl,
7e996afa
HV
1202 .s_ctrl = vivi_s_ctrl,
1203};
1204
1205#define VIVI_CID_CUSTOM_BASE (V4L2_CID_USER_BASE | 0xf000)
1206
1207static const struct v4l2_ctrl_config vivi_ctrl_button = {
1208 .ops = &vivi_ctrl_ops,
1209 .id = VIVI_CID_CUSTOM_BASE + 0,
1210 .name = "Button",
1211 .type = V4L2_CTRL_TYPE_BUTTON,
1212};
1213
1214static const struct v4l2_ctrl_config vivi_ctrl_boolean = {
1215 .ops = &vivi_ctrl_ops,
1216 .id = VIVI_CID_CUSTOM_BASE + 1,
1217 .name = "Boolean",
1218 .type = V4L2_CTRL_TYPE_BOOLEAN,
1219 .min = 0,
1220 .max = 1,
1221 .step = 1,
1222 .def = 1,
1223};
1224
1225static const struct v4l2_ctrl_config vivi_ctrl_int32 = {
1226 .ops = &vivi_ctrl_ops,
1227 .id = VIVI_CID_CUSTOM_BASE + 2,
1228 .name = "Integer 32 Bits",
1229 .type = V4L2_CTRL_TYPE_INTEGER,
5b283029
HV
1230 .min = 0x80000000,
1231 .max = 0x7fffffff,
7e996afa
HV
1232 .step = 1,
1233};
1234
1235static const struct v4l2_ctrl_config vivi_ctrl_int64 = {
1236 .ops = &vivi_ctrl_ops,
1237 .id = VIVI_CID_CUSTOM_BASE + 3,
1238 .name = "Integer 64 Bits",
1239 .type = V4L2_CTRL_TYPE_INTEGER64,
1240};
1241
1242static const char * const vivi_ctrl_menu_strings[] = {
1243 "Menu Item 0 (Skipped)",
1244 "Menu Item 1",
1245 "Menu Item 2 (Skipped)",
1246 "Menu Item 3",
1247 "Menu Item 4",
1248 "Menu Item 5 (Skipped)",
1249 NULL,
1250};
1251
1252static const struct v4l2_ctrl_config vivi_ctrl_menu = {
1253 .ops = &vivi_ctrl_ops,
1254 .id = VIVI_CID_CUSTOM_BASE + 4,
1255 .name = "Menu",
1256 .type = V4L2_CTRL_TYPE_MENU,
1257 .min = 1,
1258 .max = 4,
1259 .def = 3,
1260 .menu_skip_mask = 0x04,
1261 .qmenu = vivi_ctrl_menu_strings,
1262};
1263
1264static const struct v4l2_ctrl_config vivi_ctrl_string = {
1265 .ops = &vivi_ctrl_ops,
1266 .id = VIVI_CID_CUSTOM_BASE + 5,
1267 .name = "String",
1268 .type = V4L2_CTRL_TYPE_STRING,
1269 .min = 2,
1270 .max = 4,
1271 .step = 1,
1272};
1273
b6d17a56
HV
1274static const struct v4l2_ctrl_config vivi_ctrl_bitmask = {
1275 .ops = &vivi_ctrl_ops,
1276 .id = VIVI_CID_CUSTOM_BASE + 6,
1277 .name = "Bitmask",
1278 .type = V4L2_CTRL_TYPE_BITMASK,
1279 .def = 0x80002000,
1280 .min = 0,
1281 .max = 0x80402010,
1282 .step = 0,
1283};
1284
c520331a
SA
1285static const s64 vivi_ctrl_int_menu_values[] = {
1286 1, 1, 2, 3, 5, 8, 13, 21, 42,
1287};
1288
1289static const struct v4l2_ctrl_config vivi_ctrl_int_menu = {
1290 .ops = &vivi_ctrl_ops,
1291 .id = VIVI_CID_CUSTOM_BASE + 7,
1292 .name = "Integer menu",
1293 .type = V4L2_CTRL_TYPE_INTEGER_MENU,
1294 .min = 1,
1295 .max = 8,
1296 .def = 4,
1297 .menu_skip_mask = 0x02,
1298 .qmenu_int = vivi_ctrl_int_menu_values,
1299};
1300
bec43661 1301static const struct v4l2_file_operations vivi_fops = {
1e6dd65e 1302 .owner = THIS_MODULE,
c7a52f8d 1303 .open = v4l2_fh_open,
f905c442 1304 .release = vivi_close,
1e6dd65e
MCC
1305 .read = vivi_read,
1306 .poll = vivi_poll,
fedc6c81 1307 .unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
5a037706 1308 .mmap = vivi_mmap,
1e6dd65e
MCC
1309};
1310
a399810c 1311static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
c820cc45 1312 .vidioc_querycap = vidioc_querycap,
78b526a4
HV
1313 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1314 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1315 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1316 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
c820cc45
MCC
1317 .vidioc_reqbufs = vidioc_reqbufs,
1318 .vidioc_querybuf = vidioc_querybuf,
1319 .vidioc_qbuf = vidioc_qbuf,
1320 .vidioc_dqbuf = vidioc_dqbuf,
1321 .vidioc_s_std = vidioc_s_std,
1322 .vidioc_enum_input = vidioc_enum_input,
1323 .vidioc_g_input = vidioc_g_input,
1324 .vidioc_s_input = vidioc_s_input,
730947bc
HV
1325 .vidioc_streamon = vidioc_streamon,
1326 .vidioc_streamoff = vidioc_streamoff,
e2ecb257 1327 .vidioc_log_status = v4l2_ctrl_log_status,
6d6604fa 1328 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
c7a52f8d 1329 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
a399810c
HV
1330};
1331
1332static struct video_device vivi_template = {
1333 .name = "vivi",
a399810c
HV
1334 .fops = &vivi_fops,
1335 .ioctl_ops = &vivi_ioctl_ops,
a399810c
HV
1336 .release = video_device_release,
1337
784c668b 1338 .tvnorms = V4L2_STD_525_60,
e75f9cee 1339 .current_norm = V4L2_STD_NTSC_M,
1e6dd65e 1340};
5ab6c9af 1341
c820cc45 1342/* -----------------------------------------------------------------
1e6dd65e
MCC
1343 Initialization and module stuff
1344 ------------------------------------------------------------------*/
1345
5ab6c9af
HV
1346static int vivi_release(void)
1347{
1348 struct vivi_dev *dev;
1349 struct list_head *list;
980d4f17 1350
5ab6c9af
HV
1351 while (!list_empty(&vivi_devlist)) {
1352 list = vivi_devlist.next;
1353 list_del(list);
1354 dev = list_entry(list, struct vivi_dev, vivi_devlist);
1355
38c7c036
LP
1356 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
1357 video_device_node_name(dev->vfd));
5ab6c9af
HV
1358 video_unregister_device(dev->vfd);
1359 v4l2_device_unregister(&dev->v4l2_dev);
7e996afa 1360 v4l2_ctrl_handler_free(&dev->ctrl_handler);
5ab6c9af
HV
1361 kfree(dev);
1362 }
1363
1364 return 0;
1365}
1366
c41ee24b 1367static int __init vivi_create_instance(int inst)
1e6dd65e 1368{
1e6dd65e 1369 struct vivi_dev *dev;
f905c442 1370 struct video_device *vfd;
7e996afa 1371 struct v4l2_ctrl_handler *hdl;
e007a325 1372 struct vb2_queue *q;
730947bc 1373 int ret;
1e6dd65e 1374
5ab6c9af
HV
1375 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1376 if (!dev)
1377 return -ENOMEM;
980d4f17 1378
5ab6c9af 1379 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
c41ee24b 1380 "%s-%03d", VIVI_MODULE_NAME, inst);
5ab6c9af
HV
1381 ret = v4l2_device_register(NULL, &dev->v4l2_dev);
1382 if (ret)
1383 goto free_dev;
1e6dd65e 1384
730947bc
HV
1385 dev->fmt = &formats[0];
1386 dev->width = 640;
1387 dev->height = 480;
3d51dca2 1388 dev->pixelsize = dev->fmt->depth / 8;
7e996afa
HV
1389 hdl = &dev->ctrl_handler;
1390 v4l2_ctrl_handler_init(hdl, 11);
1391 dev->volume = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1392 V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);
1393 dev->brightness = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1394 V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1395 dev->contrast = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1396 V4L2_CID_CONTRAST, 0, 255, 1, 16);
1397 dev->saturation = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1398 V4L2_CID_SATURATION, 0, 255, 1, 127);
1399 dev->hue = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1400 V4L2_CID_HUE, -128, 127, 1, 0);
a1c894fb
HV
1401 dev->autogain = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1402 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1403 dev->gain = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1404 V4L2_CID_GAIN, 0, 255, 1, 100);
7088f4df
HV
1405 dev->alpha = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1406 V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 0);
7e996afa
HV
1407 dev->button = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_button, NULL);
1408 dev->int32 = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int32, NULL);
1409 dev->int64 = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int64, NULL);
1410 dev->boolean = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_boolean, NULL);
1411 dev->menu = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_menu, NULL);
1412 dev->string = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_string, NULL);
b6d17a56 1413 dev->bitmask = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_bitmask, NULL);
c520331a 1414 dev->int_menu = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int_menu, NULL);
7e996afa
HV
1415 if (hdl->error) {
1416 ret = hdl->error;
1417 goto unreg_dev;
1418 }
a1c894fb 1419 v4l2_ctrl_auto_cluster(2, &dev->autogain, 0, true);
7e996afa 1420 dev->v4l2_dev.ctrl_handler = hdl;
730947bc 1421
fedc6c81
HV
1422 /* initialize locks */
1423 spin_lock_init(&dev->slock);
fedc6c81 1424
e007a325
PO
1425 /* initialize queue */
1426 q = &dev->vb_vidq;
1427 memset(q, 0, sizeof(dev->vb_vidq));
1428 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1429 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1430 q->drv_priv = dev;
1431 q->buf_struct_size = sizeof(struct vivi_buffer);
1432 q->ops = &vivi_video_qops;
1433 q->mem_ops = &vb2_vmalloc_memops;
1434
1435 vb2_queue_init(q);
1436
1437 mutex_init(&dev->mutex);
730947bc 1438
5ab6c9af
HV
1439 /* init video dma queues */
1440 INIT_LIST_HEAD(&dev->vidq.active);
1441 init_waitqueue_head(&dev->vidq.wq);
1e6dd65e 1442
5ab6c9af
HV
1443 ret = -ENOMEM;
1444 vfd = video_device_alloc();
1445 if (!vfd)
1446 goto unreg_dev;
55712ff7 1447
5ab6c9af 1448 *vfd = vivi_template;
c285addb 1449 vfd->debug = debug;
730947bc 1450 vfd->v4l2_dev = &dev->v4l2_dev;
b1a873a3 1451 set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
e007a325
PO
1452
1453 /*
1454 * Provide a mutex to v4l2 core. It will be used to protect
1455 * all fops and v4l2 ioctls.
1456 */
fedc6c81 1457 vfd->lock = &dev->mutex;
55712ff7 1458
5ab6c9af
HV
1459 ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
1460 if (ret < 0)
1461 goto rel_vdev;
980d4f17 1462
5ab6c9af 1463 video_set_drvdata(vfd, dev);
980d4f17 1464
5ab6c9af
HV
1465 /* Now that everything is fine, let's add it to device list */
1466 list_add_tail(&dev->vivi_devlist, &vivi_devlist);
980d4f17 1467
7de0b873 1468 if (video_nr != -1)
5ab6c9af 1469 video_nr++;
f905c442 1470
5ab6c9af 1471 dev->vfd = vfd;
38c7c036
LP
1472 v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1473 video_device_node_name(vfd));
5ab6c9af
HV
1474 return 0;
1475
1476rel_vdev:
1477 video_device_release(vfd);
1478unreg_dev:
7e996afa 1479 v4l2_ctrl_handler_free(hdl);
5ab6c9af
HV
1480 v4l2_device_unregister(&dev->v4l2_dev);
1481free_dev:
1482 kfree(dev);
1483 return ret;
1484}
f905c442 1485
5ab6c9af
HV
1486/* This routine allocates from 1 to n_devs virtual drivers.
1487
1488 The real maximum number of virtual drivers will depend on how many drivers
1489 will succeed. This is limited to the maximum number of devices that
1490 videodev supports, which is equal to VIDEO_NUM_DEVICES.
1491 */
1492static int __init vivi_init(void)
1493{
730947bc 1494 const struct font_desc *font = find_font("VGA8x16");
9185cbfc 1495 int ret = 0, i;
5ab6c9af 1496
730947bc
HV
1497 if (font == NULL) {
1498 printk(KERN_ERR "vivi: could not find font\n");
1499 return -ENODEV;
1500 }
1501 font8x16 = font->data;
1502
5ab6c9af
HV
1503 if (n_devs <= 0)
1504 n_devs = 1;
1505
1506 for (i = 0; i < n_devs; i++) {
1507 ret = vivi_create_instance(i);
1508 if (ret) {
1509 /* If some instantiations succeeded, keep driver */
1510 if (i)
1511 ret = 0;
1512 break;
1513 }
55712ff7 1514 }
f905c442 1515
55712ff7 1516 if (ret < 0) {
730947bc 1517 printk(KERN_ERR "vivi: error %d while loading driver\n", ret);
5ab6c9af
HV
1518 return ret;
1519 }
1520
1521 printk(KERN_INFO "Video Technology Magazine Virtual Video "
1990d50b
MCC
1522 "Capture Board ver %s successfully loaded.\n",
1523 VIVI_VERSION);
980d4f17 1524
5ab6c9af
HV
1525 /* n_devs will reflect the actual number of allocated devices */
1526 n_devs = i;
980d4f17 1527
1e6dd65e
MCC
1528 return ret;
1529}
1530
1531static void __exit vivi_exit(void)
1532{
55712ff7 1533 vivi_release();
1e6dd65e
MCC
1534}
1535
1536module_init(vivi_init);
1537module_exit(vivi_exit);
This page took 1.231024 seconds and 5 git commands to generate.