Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[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;
70bd97ae 191 struct video_device vdev;
1e6dd65e 192
730947bc 193 /* controls */
7e996afa
HV
194 struct v4l2_ctrl *brightness;
195 struct v4l2_ctrl *contrast;
196 struct v4l2_ctrl *saturation;
197 struct v4l2_ctrl *hue;
a1c894fb
HV
198 struct {
199 /* autogain/gain cluster */
200 struct v4l2_ctrl *autogain;
201 struct v4l2_ctrl *gain;
202 };
7e996afa 203 struct v4l2_ctrl *volume;
7088f4df 204 struct v4l2_ctrl *alpha;
7e996afa
HV
205 struct v4l2_ctrl *button;
206 struct v4l2_ctrl *boolean;
207 struct v4l2_ctrl *int32;
208 struct v4l2_ctrl *int64;
209 struct v4l2_ctrl *menu;
210 struct v4l2_ctrl *string;
b6d17a56 211 struct v4l2_ctrl *bitmask;
c520331a 212 struct v4l2_ctrl *int_menu;
730947bc 213
55862ac9 214 spinlock_t slock;
aa9dbac4 215 struct mutex mutex;
1e6dd65e 216
1e6dd65e
MCC
217 struct vivi_dmaqueue vidq;
218
219 /* Several counters */
730947bc 220 unsigned ms;
dfd8c04e 221 unsigned long jiffies;
7e996afa 222 unsigned button_pressed;
025341d4
MCC
223
224 int mv_count; /* Controls bars movement */
e164b58a
MCC
225
226 /* Input Number */
227 int input;
c41ee24b 228
1e6dd65e
MCC
229 /* video capture */
230 struct vivi_fmt *fmt;
543323bc 231 unsigned int width, height;
e007a325
PO
232 struct vb2_queue vb_vidq;
233 enum v4l2_field field;
234 unsigned int field_count;
1e6dd65e 235
3d51dca2
HV
236 u8 bars[9][3];
237 u8 line[MAX_WIDTH * 8];
238 unsigned int pixelsize;
7088f4df 239 u8 alpha_component;
1e6dd65e
MCC
240};
241
242/* ------------------------------------------------------------------
243 DMA and thread functions
244 ------------------------------------------------------------------*/
245
246/* Bars and Colors should match positions */
247
248enum colors {
249 WHITE,
730947bc 250 AMBER,
1e6dd65e
MCC
251 CYAN,
252 GREEN,
253 MAGENTA,
254 RED,
543323bc
MCC
255 BLUE,
256 BLACK,
730947bc 257 TEXT_BLACK,
1e6dd65e
MCC
258};
259
730947bc 260/* R G B */
e164b58a 261#define COLOR_WHITE {204, 204, 204}
730947bc
HV
262#define COLOR_AMBER {208, 208, 0}
263#define COLOR_CYAN { 0, 206, 206}
e164b58a
MCC
264#define COLOR_GREEN { 0, 239, 0}
265#define COLOR_MAGENTA {239, 0, 239}
266#define COLOR_RED {205, 0, 0}
267#define COLOR_BLUE { 0, 0, 255}
268#define COLOR_BLACK { 0, 0, 0}
269
270struct bar_std {
730947bc 271 u8 bar[9][3];
e164b58a
MCC
272};
273
274/* Maximum number of bars are 10 - otherwise, the input print code
275 should be modified */
276static struct bar_std bars[] = {
277 { /* Standard ITU-R color bar sequence */
730947bc
HV
278 { COLOR_WHITE, COLOR_AMBER, COLOR_CYAN, COLOR_GREEN,
279 COLOR_MAGENTA, COLOR_RED, COLOR_BLUE, COLOR_BLACK, COLOR_BLACK }
e164b58a 280 }, {
730947bc
HV
281 { COLOR_WHITE, COLOR_AMBER, COLOR_BLACK, COLOR_WHITE,
282 COLOR_AMBER, COLOR_BLACK, COLOR_WHITE, COLOR_AMBER, COLOR_BLACK }
e164b58a 283 }, {
730947bc
HV
284 { COLOR_WHITE, COLOR_CYAN, COLOR_BLACK, COLOR_WHITE,
285 COLOR_CYAN, COLOR_BLACK, COLOR_WHITE, COLOR_CYAN, COLOR_BLACK }
e164b58a 286 }, {
730947bc
HV
287 { COLOR_WHITE, COLOR_GREEN, COLOR_BLACK, COLOR_WHITE,
288 COLOR_GREEN, COLOR_BLACK, COLOR_WHITE, COLOR_GREEN, COLOR_BLACK }
e164b58a 289 },
1e6dd65e
MCC
290};
291
e164b58a
MCC
292#define NUM_INPUTS ARRAY_SIZE(bars)
293
543323bc
MCC
294#define TO_Y(r, g, b) \
295 (((16829 * r + 33039 * g + 6416 * b + 32768) >> 16) + 16)
1e6dd65e 296/* RGB to V(Cr) Color transform */
543323bc
MCC
297#define TO_V(r, g, b) \
298 (((28784 * r - 24103 * g - 4681 * b + 32768) >> 16) + 128)
1e6dd65e 299/* RGB to U(Cb) Color transform */
543323bc
MCC
300#define TO_U(r, g, b) \
301 (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
1e6dd65e 302
c285addb 303/* precalculate color bar values to speed up rendering */
730947bc 304static void precalculate_bars(struct vivi_dev *dev)
c285addb 305{
730947bc 306 u8 r, g, b;
c285addb
MCC
307 int k, is_yuv;
308
730947bc
HV
309 for (k = 0; k < 9; k++) {
310 r = bars[dev->input].bar[k][0];
311 g = bars[dev->input].bar[k][1];
312 b = bars[dev->input].bar[k][2];
c285addb
MCC
313 is_yuv = 0;
314
730947bc 315 switch (dev->fmt->fourcc) {
c285addb
MCC
316 case V4L2_PIX_FMT_YUYV:
317 case V4L2_PIX_FMT_UYVY:
3d51dca2
HV
318 case V4L2_PIX_FMT_YVYU:
319 case V4L2_PIX_FMT_VYUY:
c285addb
MCC
320 is_yuv = 1;
321 break;
322 case V4L2_PIX_FMT_RGB565:
323 case V4L2_PIX_FMT_RGB565X:
324 r >>= 3;
325 g >>= 2;
326 b >>= 3;
327 break;
328 case V4L2_PIX_FMT_RGB555:
329 case V4L2_PIX_FMT_RGB555X:
330 r >>= 3;
331 g >>= 3;
332 b >>= 3;
333 break;
3d51dca2
HV
334 case V4L2_PIX_FMT_RGB24:
335 case V4L2_PIX_FMT_BGR24:
336 case V4L2_PIX_FMT_RGB32:
337 case V4L2_PIX_FMT_BGR32:
338 break;
c285addb
MCC
339 }
340
341 if (is_yuv) {
730947bc
HV
342 dev->bars[k][0] = TO_Y(r, g, b); /* Luma */
343 dev->bars[k][1] = TO_U(r, g, b); /* Cb */
344 dev->bars[k][2] = TO_V(r, g, b); /* Cr */
c285addb 345 } else {
730947bc
HV
346 dev->bars[k][0] = r;
347 dev->bars[k][1] = g;
348 dev->bars[k][2] = b;
c285addb
MCC
349 }
350 }
c285addb
MCC
351}
352
e164b58a
MCC
353#define TSTAMP_MIN_Y 24
354#define TSTAMP_MAX_Y (TSTAMP_MIN_Y + 15)
355#define TSTAMP_INPUT_X 10
356#define TSTAMP_MIN_X (54 + TSTAMP_INPUT_X)
1e6dd65e 357
3d51dca2
HV
358/* 'odd' is true for pixels 1, 3, 5, etc. and false for pixels 0, 2, 4, etc. */
359static void gen_twopix(struct vivi_dev *dev, u8 *buf, int colorpos, bool odd)
74d7c5af 360{
730947bc 361 u8 r_y, g_u, b_v;
7088f4df 362 u8 alpha = dev->alpha_component;
74d7c5af 363 int color;
730947bc 364 u8 *p;
74d7c5af 365
730947bc
HV
366 r_y = dev->bars[colorpos][0]; /* R or precalculated Y */
367 g_u = dev->bars[colorpos][1]; /* G or precalculated U */
368 b_v = dev->bars[colorpos][2]; /* B or precalculated V */
74d7c5af 369
3d51dca2 370 for (color = 0; color < dev->pixelsize; color++) {
74d7c5af
MD
371 p = buf + color;
372
730947bc 373 switch (dev->fmt->fourcc) {
d891f475
MD
374 case V4L2_PIX_FMT_YUYV:
375 switch (color) {
376 case 0:
d891f475
MD
377 *p = r_y;
378 break;
379 case 1:
3d51dca2 380 *p = odd ? b_v : g_u;
d891f475
MD
381 break;
382 }
74d7c5af 383 break;
fca36bab
MD
384 case V4L2_PIX_FMT_UYVY:
385 switch (color) {
3d51dca2
HV
386 case 0:
387 *p = odd ? b_v : g_u;
388 break;
fca36bab 389 case 1:
fca36bab
MD
390 *p = r_y;
391 break;
3d51dca2
HV
392 }
393 break;
394 case V4L2_PIX_FMT_YVYU:
395 switch (color) {
396 case 0:
397 *p = r_y;
398 break;
399 case 1:
400 *p = odd ? g_u : b_v;
401 break;
402 }
403 break;
404 case V4L2_PIX_FMT_VYUY:
405 switch (color) {
fca36bab 406 case 0:
3d51dca2 407 *p = odd ? g_u : b_v;
fca36bab 408 break;
3d51dca2
HV
409 case 1:
410 *p = r_y;
fca36bab
MD
411 break;
412 }
413 break;
aeadb5d4
MD
414 case V4L2_PIX_FMT_RGB565:
415 switch (color) {
416 case 0:
aeadb5d4
MD
417 *p = (g_u << 5) | b_v;
418 break;
419 case 1:
aeadb5d4
MD
420 *p = (r_y << 3) | (g_u >> 3);
421 break;
422 }
423 break;
424 case V4L2_PIX_FMT_RGB565X:
425 switch (color) {
426 case 0:
aeadb5d4
MD
427 *p = (r_y << 3) | (g_u >> 3);
428 break;
429 case 1:
aeadb5d4
MD
430 *p = (g_u << 5) | b_v;
431 break;
432 }
433 break;
def52393
MD
434 case V4L2_PIX_FMT_RGB555:
435 switch (color) {
436 case 0:
def52393
MD
437 *p = (g_u << 5) | b_v;
438 break;
439 case 1:
7088f4df 440 *p = (alpha & 0x80) | (r_y << 2) | (g_u >> 3);
def52393
MD
441 break;
442 }
443 break;
444 case V4L2_PIX_FMT_RGB555X:
445 switch (color) {
446 case 0:
7088f4df 447 *p = (alpha & 0x80) | (r_y << 2) | (g_u >> 3);
def52393
MD
448 break;
449 case 1:
def52393
MD
450 *p = (g_u << 5) | b_v;
451 break;
452 }
453 break;
3d51dca2
HV
454 case V4L2_PIX_FMT_RGB24:
455 switch (color) {
456 case 0:
457 *p = r_y;
458 break;
459 case 1:
460 *p = g_u;
461 break;
462 case 2:
463 *p = b_v;
464 break;
465 }
466 break;
467 case V4L2_PIX_FMT_BGR24:
468 switch (color) {
469 case 0:
470 *p = b_v;
471 break;
472 case 1:
473 *p = g_u;
474 break;
475 case 2:
476 *p = r_y;
477 break;
478 }
479 break;
480 case V4L2_PIX_FMT_RGB32:
481 switch (color) {
482 case 0:
7088f4df 483 *p = alpha;
3d51dca2
HV
484 break;
485 case 1:
486 *p = r_y;
487 break;
488 case 2:
489 *p = g_u;
490 break;
491 case 3:
492 *p = b_v;
493 break;
494 }
495 break;
496 case V4L2_PIX_FMT_BGR32:
497 switch (color) {
498 case 0:
499 *p = b_v;
500 break;
501 case 1:
502 *p = g_u;
503 break;
504 case 2:
505 *p = r_y;
506 break;
507 case 3:
7088f4df 508 *p = alpha;
3d51dca2
HV
509 break;
510 }
511 break;
74d7c5af
MD
512 }
513 }
514}
515
730947bc 516static void precalculate_line(struct vivi_dev *dev)
1e6dd65e 517{
730947bc 518 int w;
1e6dd65e 519
3d51dca2
HV
520 for (w = 0; w < dev->width * 2; w++) {
521 int colorpos = w / (dev->width / 8) % 8;
74d7c5af 522
3d51dca2 523 gen_twopix(dev, dev->line + w * dev->pixelsize, colorpos, w & 1);
1e6dd65e 524 }
730947bc 525}
1e6dd65e 526
730947bc
HV
527static void gen_text(struct vivi_dev *dev, char *basep,
528 int y, int x, char *text)
529{
530 int line;
e164b58a 531
730947bc
HV
532 /* Checks if it is possible to show string */
533 if (y + 16 >= dev->height || x + strlen(text) * 8 >= dev->width)
534 return;
1e6dd65e
MCC
535
536 /* Print stream time */
730947bc
HV
537 for (line = y; line < y + 16; line++) {
538 int j = 0;
3d51dca2 539 char *pos = basep + line * dev->width * dev->pixelsize + x * dev->pixelsize;
730947bc
HV
540 char *s;
541
542 for (s = text; *s; s++) {
543 u8 chr = font8x16[*s * 16 + line - y];
544 int i;
545
546 for (i = 0; i < 7; i++, j++) {
74d7c5af 547 /* Draw white font on black background */
730947bc 548 if (chr & (1 << (7 - i)))
3d51dca2 549 gen_twopix(dev, pos + j * dev->pixelsize, WHITE, (x+y) & 1);
74d7c5af 550 else
3d51dca2 551 gen_twopix(dev, pos + j * dev->pixelsize, TEXT_BLACK, (x+y) & 1);
1e6dd65e
MCC
552 }
553 }
554 }
1e6dd65e 555}
78718e5d 556
730947bc 557static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
1e6dd65e 558{
e007a325
PO
559 int wmax = dev->width;
560 int hmax = dev->height;
1e6dd65e 561 struct timeval ts;
e007a325 562 void *vbuf = vb2_plane_vaddr(&buf->vb, 0);
730947bc
HV
563 unsigned ms;
564 char str[100];
565 int h, line = 1;
a1c894fb 566 s32 gain;
b50e7fe9 567
5c554e6b 568 if (!vbuf)
5a037706 569 return;
1e6dd65e 570
730947bc 571 for (h = 0; h < hmax; h++)
3d51dca2
HV
572 memcpy(vbuf + h * wmax * dev->pixelsize,
573 dev->line + (dev->mv_count % wmax) * dev->pixelsize,
574 wmax * dev->pixelsize);
5a037706 575
1e6dd65e
MCC
576 /* Updates stream time */
577
730947bc 578 dev->ms += jiffies_to_msecs(jiffies - dev->jiffies);
543323bc 579 dev->jiffies = jiffies;
730947bc
HV
580 ms = dev->ms;
581 snprintf(str, sizeof(str), " %02d:%02d:%02d:%03d ",
582 (ms / (60 * 60 * 1000)) % 24,
583 (ms / (60 * 1000)) % 60,
584 (ms / 1000) % 60,
585 ms % 1000);
586 gen_text(dev, vbuf, line++ * 16, 16, str);
587 snprintf(str, sizeof(str), " %dx%d, input %d ",
588 dev->width, dev->height, dev->input);
589 gen_text(dev, vbuf, line++ * 16, 16, str);
590
a1c894fb 591 gain = v4l2_ctrl_g_ctrl(dev->gain);
77e7c4e6 592 mutex_lock(dev->ctrl_handler.lock);
730947bc 593 snprintf(str, sizeof(str), " brightness %3d, contrast %3d, saturation %3d, hue %d ",
7e996afa
HV
594 dev->brightness->cur.val,
595 dev->contrast->cur.val,
596 dev->saturation->cur.val,
597 dev->hue->cur.val);
730947bc 598 gen_text(dev, vbuf, line++ * 16, 16, str);
7088f4df
HV
599 snprintf(str, sizeof(str), " autogain %d, gain %3d, volume %3d, alpha 0x%02x ",
600 dev->autogain->cur.val, gain, dev->volume->cur.val,
601 dev->alpha->cur.val);
730947bc 602 gen_text(dev, vbuf, line++ * 16, 16, str);
b6d17a56 603 snprintf(str, sizeof(str), " int32 %d, int64 %lld, bitmask %08x ",
7e996afa 604 dev->int32->cur.val,
b6d17a56
HV
605 dev->int64->cur.val64,
606 dev->bitmask->cur.val);
7e996afa
HV
607 gen_text(dev, vbuf, line++ * 16, 16, str);
608 snprintf(str, sizeof(str), " boolean %d, menu %s, string \"%s\" ",
609 dev->boolean->cur.val,
610 dev->menu->qmenu[dev->menu->cur.val],
611 dev->string->cur.string);
f70cfc7f 612 gen_text(dev, vbuf, line++ * 16, 16, str);
c520331a
SA
613 snprintf(str, sizeof(str), " integer_menu %lld, value %d ",
614 dev->int_menu->qmenu_int[dev->int_menu->cur.val],
615 dev->int_menu->cur.val);
616 gen_text(dev, vbuf, line++ * 16, 16, str);
77e7c4e6 617 mutex_unlock(dev->ctrl_handler.lock);
7e996afa
HV
618 if (dev->button_pressed) {
619 dev->button_pressed--;
620 snprintf(str, sizeof(str), " button pressed!");
621 gen_text(dev, vbuf, line++ * 16, 16, str);
622 }
730947bc
HV
623
624 dev->mv_count += 2;
1e6dd65e 625
e007a325
PO
626 buf->vb.v4l2_buf.field = dev->field;
627 dev->field_count++;
628 buf->vb.v4l2_buf.sequence = dev->field_count >> 1;
1e6dd65e 629 do_gettimeofday(&ts);
e007a325 630 buf->vb.v4l2_buf.timestamp = ts;
1e6dd65e
MCC
631}
632
730947bc 633static void vivi_thread_tick(struct vivi_dev *dev)
1e6dd65e 634{
78718e5d 635 struct vivi_dmaqueue *dma_q = &dev->vidq;
730947bc 636 struct vivi_buffer *buf;
78718e5d 637 unsigned long flags = 0;
1e6dd65e 638
78718e5d 639 dprintk(dev, 1, "Thread tick\n");
1e6dd65e 640
78718e5d
BP
641 spin_lock_irqsave(&dev->slock, flags);
642 if (list_empty(&dma_q->active)) {
643 dprintk(dev, 1, "No active queue to serve\n");
1de5be5e
HV
644 spin_unlock_irqrestore(&dev->slock, flags);
645 return;
78718e5d 646 }
1e6dd65e 647
e007a325
PO
648 buf = list_entry(dma_q->active.next, struct vivi_buffer, list);
649 list_del(&buf->list);
1de5be5e 650 spin_unlock_irqrestore(&dev->slock, flags);
1e6dd65e 651
e007a325 652 do_gettimeofday(&buf->vb.v4l2_buf.timestamp);
78718e5d
BP
653
654 /* Fill buffer */
730947bc 655 vivi_fillbuff(dev, buf);
78718e5d
BP
656 dprintk(dev, 1, "filled buffer %p\n", buf);
657
e007a325
PO
658 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
659 dprintk(dev, 2, "[%p/%d] done\n", buf, buf->vb.v4l2_buf.index);
1e6dd65e
MCC
660}
661
6594ad82
MCC
662#define frames_to_ms(frames) \
663 ((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)
664
730947bc 665static void vivi_sleep(struct vivi_dev *dev)
1e6dd65e 666{
78718e5d
BP
667 struct vivi_dmaqueue *dma_q = &dev->vidq;
668 int timeout;
1e6dd65e
MCC
669 DECLARE_WAITQUEUE(wait, current);
670
7e28adb2 671 dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
6c2f9901 672 (unsigned long)dma_q);
1e6dd65e
MCC
673
674 add_wait_queue(&dma_q->wq, &wait);
6594ad82
MCC
675 if (kthread_should_stop())
676 goto stop_task;
677
6594ad82 678 /* Calculate time to wake up */
78718e5d 679 timeout = msecs_to_jiffies(frames_to_ms(1));
6594ad82 680
730947bc 681 vivi_thread_tick(dev);
6594ad82
MCC
682
683 schedule_timeout_interruptible(timeout);
1e6dd65e 684
6594ad82 685stop_task:
1e6dd65e
MCC
686 remove_wait_queue(&dma_q->wq, &wait);
687 try_to_freeze();
688}
689
972c3517 690static int vivi_thread(void *data)
1e6dd65e 691{
730947bc 692 struct vivi_dev *dev = data;
1e6dd65e 693
6c2f9901 694 dprintk(dev, 1, "thread started\n");
1e6dd65e 695
83144186 696 set_freezable();
0b600512 697
1e6dd65e 698 for (;;) {
730947bc 699 vivi_sleep(dev);
1e6dd65e
MCC
700
701 if (kthread_should_stop())
702 break;
703 }
6c2f9901 704 dprintk(dev, 1, "thread: exit\n");
1e6dd65e
MCC
705 return 0;
706}
707
e007a325 708static int vivi_start_generating(struct vivi_dev *dev)
1e6dd65e 709{
78718e5d 710 struct vivi_dmaqueue *dma_q = &dev->vidq;
6c2f9901 711
7e28adb2 712 dprintk(dev, 1, "%s\n", __func__);
1e6dd65e 713
730947bc
HV
714 /* Resets frame counters */
715 dev->ms = 0;
716 dev->mv_count = 0;
717 dev->jiffies = jiffies;
718
719 dma_q->frame = 0;
720 dma_q->ini_jiffies = jiffies;
721 dma_q->kthread = kthread_run(vivi_thread, dev, dev->v4l2_dev.name);
1e6dd65e 722
054afee4 723 if (IS_ERR(dma_q->kthread)) {
5ab6c9af 724 v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n");
e007a325 725 return PTR_ERR(dma_q->kthread);
1e6dd65e 726 }
0b600512
MCC
727 /* Wakes thread */
728 wake_up_interruptible(&dma_q->wq);
729
7e28adb2 730 dprintk(dev, 1, "returning from %s\n", __func__);
e007a325 731 return 0;
1e6dd65e
MCC
732}
733
e007a325 734static void vivi_stop_generating(struct vivi_dev *dev)
1e6dd65e 735{
730947bc 736 struct vivi_dmaqueue *dma_q = &dev->vidq;
6c2f9901 737
7e28adb2 738 dprintk(dev, 1, "%s\n", __func__);
730947bc 739
1e6dd65e
MCC
740 /* shutdown control thread */
741 if (dma_q->kthread) {
742 kthread_stop(dma_q->kthread);
543323bc 743 dma_q->kthread = NULL;
1e6dd65e 744 }
730947bc 745
e007a325
PO
746 /*
747 * Typical driver might need to wait here until dma engine stops.
748 * In this case we can abort imiedetly, so it's just a noop.
749 */
750
751 /* Release all active buffers */
752 while (!list_empty(&dma_q->active)) {
753 struct vivi_buffer *buf;
754 buf = list_entry(dma_q->active.next, struct vivi_buffer, list);
755 list_del(&buf->list);
756 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
757 dprintk(dev, 2, "[%p/%d] done\n", buf, buf->vb.v4l2_buf.index);
758 }
1e6dd65e 759}
1e6dd65e
MCC
760/* ------------------------------------------------------------------
761 Videobuf operations
762 ------------------------------------------------------------------*/
fc714e70
GL
763static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
764 unsigned int *nbuffers, unsigned int *nplanes,
765 unsigned int sizes[], void *alloc_ctxs[])
1e6dd65e 766{
e007a325
PO
767 struct vivi_dev *dev = vb2_get_drv_priv(vq);
768 unsigned long size;
769
2e90c6c3
HV
770 if (fmt)
771 size = fmt->fmt.pix.sizeimage;
772 else
773 size = dev->width * dev->height * dev->pixelsize;
774
775 if (size == 0)
776 return -EINVAL;
1e6dd65e 777
e007a325
PO
778 if (0 == *nbuffers)
779 *nbuffers = 32;
1e6dd65e 780
e007a325
PO
781 while (size * *nbuffers > vid_limit * 1024 * 1024)
782 (*nbuffers)--;
6bb2790f 783
e007a325 784 *nplanes = 1;
6bb2790f 785
e007a325
PO
786 sizes[0] = size;
787
788 /*
789 * videobuf2-vmalloc allocator is context-less so no need to set
790 * alloc_ctxs array.
791 */
792
793 dprintk(dev, 1, "%s, count=%d, size=%ld\n", __func__,
794 *nbuffers, size);
6bb2790f 795
1e6dd65e
MCC
796 return 0;
797}
798
e007a325 799static int buffer_prepare(struct vb2_buffer *vb)
1e6dd65e 800{
e007a325 801 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
543323bc 802 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
e007a325 803 unsigned long size;
1e6dd65e 804
e007a325 805 dprintk(dev, 1, "%s, field=%d\n", __func__, vb->v4l2_buf.field);
1e6dd65e 806
730947bc 807 BUG_ON(NULL == dev->fmt);
78718e5d 808
e007a325
PO
809 /*
810 * Theses properties only change when queue is idle, see s_fmt.
811 * The below checks should not be performed here, on each
812 * buffer_prepare (i.e. on each qbuf). Most of the code in this function
813 * should thus be moved to buffer_init and s_fmt.
814 */
730947bc
HV
815 if (dev->width < 48 || dev->width > MAX_WIDTH ||
816 dev->height < 32 || dev->height > MAX_HEIGHT)
1e6dd65e 817 return -EINVAL;
78718e5d 818
3d51dca2 819 size = dev->width * dev->height * dev->pixelsize;
e007a325
PO
820 if (vb2_plane_size(vb, 0) < size) {
821 dprintk(dev, 1, "%s data will not fit into plane (%lu < %lu)\n",
822 __func__, vb2_plane_size(vb, 0), size);
1e6dd65e 823 return -EINVAL;
e007a325
PO
824 }
825
826 vb2_set_plane_payload(&buf->vb, 0, size);
1e6dd65e 827
e007a325 828 buf->fmt = dev->fmt;
1e6dd65e 829
730947bc
HV
830 precalculate_bars(dev);
831 precalculate_line(dev);
c285addb 832
e007a325
PO
833 return 0;
834}
1e6dd65e 835
e007a325 836static void buffer_queue(struct vb2_buffer *vb)
1e6dd65e 837{
e007a325 838 struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
730947bc 839 struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
78718e5d 840 struct vivi_dmaqueue *vidq = &dev->vidq;
e007a325 841 unsigned long flags = 0;
78718e5d 842
7e28adb2 843 dprintk(dev, 1, "%s\n", __func__);
78718e5d 844
e007a325
PO
845 spin_lock_irqsave(&dev->slock, flags);
846 list_add_tail(&buf->list, &vidq->active);
847 spin_unlock_irqrestore(&dev->slock, flags);
1e6dd65e
MCC
848}
849
bd323e28 850static int start_streaming(struct vb2_queue *vq, unsigned int count)
1e6dd65e 851{
e007a325
PO
852 struct vivi_dev *dev = vb2_get_drv_priv(vq);
853 dprintk(dev, 1, "%s\n", __func__);
854 return vivi_start_generating(dev);
855}
1e6dd65e 856
e007a325
PO
857/* abort streaming and wait for last buffer */
858static int stop_streaming(struct vb2_queue *vq)
859{
860 struct vivi_dev *dev = vb2_get_drv_priv(vq);
7e28adb2 861 dprintk(dev, 1, "%s\n", __func__);
e007a325
PO
862 vivi_stop_generating(dev);
863 return 0;
864}
865
866static void vivi_lock(struct vb2_queue *vq)
867{
868 struct vivi_dev *dev = vb2_get_drv_priv(vq);
869 mutex_lock(&dev->mutex);
870}
1e6dd65e 871
e007a325
PO
872static void vivi_unlock(struct vb2_queue *vq)
873{
874 struct vivi_dev *dev = vb2_get_drv_priv(vq);
875 mutex_unlock(&dev->mutex);
1e6dd65e
MCC
876}
877
e007a325
PO
878
879static struct vb2_ops vivi_video_qops = {
880 .queue_setup = queue_setup,
e007a325 881 .buf_prepare = buffer_prepare,
e007a325
PO
882 .buf_queue = buffer_queue,
883 .start_streaming = start_streaming,
884 .stop_streaming = stop_streaming,
885 .wait_prepare = vivi_unlock,
886 .wait_finish = vivi_lock,
1e6dd65e
MCC
887};
888
c820cc45
MCC
889/* ------------------------------------------------------------------
890 IOCTL vidioc handling
891 ------------------------------------------------------------------*/
543323bc 892static int vidioc_querycap(struct file *file, void *priv,
c820cc45
MCC
893 struct v4l2_capability *cap)
894{
730947bc 895 struct vivi_dev *dev = video_drvdata(file);
5ab6c9af 896
c820cc45
MCC
897 strcpy(cap->driver, "vivi");
898 strcpy(cap->card, "vivi");
5ab6c9af 899 strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
23268ae5
HV
900 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
901 V4L2_CAP_READWRITE;
902 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
c820cc45
MCC
903 return 0;
904}
905
78b526a4 906static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
c820cc45
MCC
907 struct v4l2_fmtdesc *f)
908{
d891f475
MD
909 struct vivi_fmt *fmt;
910
911 if (f->index >= ARRAY_SIZE(formats))
c820cc45
MCC
912 return -EINVAL;
913
d891f475
MD
914 fmt = &formats[f->index];
915
916 strlcpy(f->description, fmt->name, sizeof(f->description));
917 f->pixelformat = fmt->fourcc;
c820cc45
MCC
918 return 0;
919}
920
78b526a4 921static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
c820cc45
MCC
922 struct v4l2_format *f)
923{
730947bc 924 struct vivi_dev *dev = video_drvdata(file);
c820cc45 925
730947bc
HV
926 f->fmt.pix.width = dev->width;
927 f->fmt.pix.height = dev->height;
e007a325 928 f->fmt.pix.field = dev->field;
730947bc 929 f->fmt.pix.pixelformat = dev->fmt->fourcc;
c820cc45 930 f->fmt.pix.bytesperline =
730947bc 931 (f->fmt.pix.width * dev->fmt->depth) >> 3;
c820cc45
MCC
932 f->fmt.pix.sizeimage =
933 f->fmt.pix.height * f->fmt.pix.bytesperline;
8c79eece
HV
934 if (dev->fmt->fourcc == V4L2_PIX_FMT_YUYV ||
935 dev->fmt->fourcc == V4L2_PIX_FMT_UYVY)
936 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
937 else
938 f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
730947bc 939 return 0;
c820cc45
MCC
940}
941
78b526a4 942static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1e6dd65e
MCC
943 struct v4l2_format *f)
944{
730947bc 945 struct vivi_dev *dev = video_drvdata(file);
1e6dd65e
MCC
946 struct vivi_fmt *fmt;
947 enum v4l2_field field;
1e6dd65e 948
d891f475
MD
949 fmt = get_format(f);
950 if (!fmt) {
951 dprintk(dev, 1, "Fourcc format (0x%08x) invalid.\n",
952 f->fmt.pix.pixelformat);
1e6dd65e
MCC
953 return -EINVAL;
954 }
1e6dd65e
MCC
955
956 field = f->fmt.pix.field;
957
958 if (field == V4L2_FIELD_ANY) {
543323bc 959 field = V4L2_FIELD_INTERLACED;
1e6dd65e 960 } else if (V4L2_FIELD_INTERLACED != field) {
6c2f9901 961 dprintk(dev, 1, "Field type invalid.\n");
1e6dd65e
MCC
962 return -EINVAL;
963 }
964
1e6dd65e 965 f->fmt.pix.field = field;
730947bc
HV
966 v4l_bound_align_image(&f->fmt.pix.width, 48, MAX_WIDTH, 2,
967 &f->fmt.pix.height, 32, MAX_HEIGHT, 0, 0);
1e6dd65e
MCC
968 f->fmt.pix.bytesperline =
969 (f->fmt.pix.width * fmt->depth) >> 3;
970 f->fmt.pix.sizeimage =
971 f->fmt.pix.height * f->fmt.pix.bytesperline;
8c79eece
HV
972 if (fmt->fourcc == V4L2_PIX_FMT_YUYV ||
973 fmt->fourcc == V4L2_PIX_FMT_UYVY)
974 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
975 else
976 f->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
1e6dd65e
MCC
977 return 0;
978}
979
e164b58a
MCC
980static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
981 struct v4l2_format *f)
982{
730947bc 983 struct vivi_dev *dev = video_drvdata(file);
e007a325 984 struct vb2_queue *q = &dev->vb_vidq;
e164b58a 985
730947bc 986 int ret = vidioc_try_fmt_vid_cap(file, priv, f);
e164b58a
MCC
987 if (ret < 0)
988 return ret;
989
f2ba5a0b 990 if (vb2_is_busy(q)) {
730947bc 991 dprintk(dev, 1, "%s device busy\n", __func__);
e007a325 992 return -EBUSY;
e164b58a
MCC
993 }
994
730947bc 995 dev->fmt = get_format(f);
3d51dca2 996 dev->pixelsize = dev->fmt->depth / 8;
730947bc
HV
997 dev->width = f->fmt.pix.width;
998 dev->height = f->fmt.pix.height;
e007a325
PO
999 dev->field = f->fmt.pix.field;
1000
1001 return 0;
1e6dd65e
MCC
1002}
1003
c820cc45 1004/* only one input in this sample driver */
543323bc 1005static int vidioc_enum_input(struct file *file, void *priv,
c820cc45
MCC
1006 struct v4l2_input *inp)
1007{
e164b58a 1008 if (inp->index >= NUM_INPUTS)
c820cc45 1009 return -EINVAL;
1e6dd65e 1010
c820cc45 1011 inp->type = V4L2_INPUT_TYPE_CAMERA;
e164b58a 1012 sprintf(inp->name, "Camera %u", inp->index);
730947bc 1013 return 0;
c820cc45 1014}
1e6dd65e 1015
543323bc 1016static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
c820cc45 1017{
730947bc 1018 struct vivi_dev *dev = video_drvdata(file);
e164b58a
MCC
1019
1020 *i = dev->input;
730947bc 1021 return 0;
c820cc45 1022}
730947bc 1023
543323bc 1024static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
c820cc45 1025{
730947bc 1026 struct vivi_dev *dev = video_drvdata(file);
e164b58a
MCC
1027
1028 if (i >= NUM_INPUTS)
c820cc45 1029 return -EINVAL;
1e6dd65e 1030
c7a52f8d
HV
1031 if (i == dev->input)
1032 return 0;
1033
e164b58a 1034 dev->input = i;
730947bc
HV
1035 precalculate_bars(dev);
1036 precalculate_line(dev);
1037 return 0;
c820cc45 1038}
1e6dd65e 1039
730947bc 1040/* --- controls ---------------------------------------------- */
1e6dd65e 1041
a1c894fb
HV
1042static int vivi_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1043{
1044 struct vivi_dev *dev = container_of(ctrl->handler, struct vivi_dev, ctrl_handler);
1045
1046 if (ctrl == dev->autogain)
1047 dev->gain->val = jiffies & 0xff;
1048 return 0;
1049}
1050
7e996afa 1051static int vivi_s_ctrl(struct v4l2_ctrl *ctrl)
c820cc45 1052{
7e996afa 1053 struct vivi_dev *dev = container_of(ctrl->handler, struct vivi_dev, ctrl_handler);
1e6dd65e 1054
7088f4df
HV
1055 switch (ctrl->id) {
1056 case V4L2_CID_ALPHA_COMPONENT:
1057 dev->alpha_component = ctrl->val;
1058 break;
1059 default:
1060 if (ctrl == dev->button)
1061 dev->button_pressed = 30;
1062 break;
1063 }
7e996afa 1064 return 0;
1e6dd65e
MCC
1065}
1066
1067/* ------------------------------------------------------------------
1068 File operations for the device
1069 ------------------------------------------------------------------*/
1070
7e996afa 1071static const struct v4l2_ctrl_ops vivi_ctrl_ops = {
a1c894fb 1072 .g_volatile_ctrl = vivi_g_volatile_ctrl,
7e996afa
HV
1073 .s_ctrl = vivi_s_ctrl,
1074};
1075
1076#define VIVI_CID_CUSTOM_BASE (V4L2_CID_USER_BASE | 0xf000)
1077
1078static const struct v4l2_ctrl_config vivi_ctrl_button = {
1079 .ops = &vivi_ctrl_ops,
1080 .id = VIVI_CID_CUSTOM_BASE + 0,
1081 .name = "Button",
1082 .type = V4L2_CTRL_TYPE_BUTTON,
1083};
1084
1085static const struct v4l2_ctrl_config vivi_ctrl_boolean = {
1086 .ops = &vivi_ctrl_ops,
1087 .id = VIVI_CID_CUSTOM_BASE + 1,
1088 .name = "Boolean",
1089 .type = V4L2_CTRL_TYPE_BOOLEAN,
1090 .min = 0,
1091 .max = 1,
1092 .step = 1,
1093 .def = 1,
1094};
1095
1096static const struct v4l2_ctrl_config vivi_ctrl_int32 = {
1097 .ops = &vivi_ctrl_ops,
1098 .id = VIVI_CID_CUSTOM_BASE + 2,
1099 .name = "Integer 32 Bits",
1100 .type = V4L2_CTRL_TYPE_INTEGER,
5b283029
HV
1101 .min = 0x80000000,
1102 .max = 0x7fffffff,
7e996afa
HV
1103 .step = 1,
1104};
1105
1106static const struct v4l2_ctrl_config vivi_ctrl_int64 = {
1107 .ops = &vivi_ctrl_ops,
1108 .id = VIVI_CID_CUSTOM_BASE + 3,
1109 .name = "Integer 64 Bits",
1110 .type = V4L2_CTRL_TYPE_INTEGER64,
1111};
1112
1113static const char * const vivi_ctrl_menu_strings[] = {
1114 "Menu Item 0 (Skipped)",
1115 "Menu Item 1",
1116 "Menu Item 2 (Skipped)",
1117 "Menu Item 3",
1118 "Menu Item 4",
1119 "Menu Item 5 (Skipped)",
1120 NULL,
1121};
1122
1123static const struct v4l2_ctrl_config vivi_ctrl_menu = {
1124 .ops = &vivi_ctrl_ops,
1125 .id = VIVI_CID_CUSTOM_BASE + 4,
1126 .name = "Menu",
1127 .type = V4L2_CTRL_TYPE_MENU,
1128 .min = 1,
1129 .max = 4,
1130 .def = 3,
1131 .menu_skip_mask = 0x04,
1132 .qmenu = vivi_ctrl_menu_strings,
1133};
1134
1135static const struct v4l2_ctrl_config vivi_ctrl_string = {
1136 .ops = &vivi_ctrl_ops,
1137 .id = VIVI_CID_CUSTOM_BASE + 5,
1138 .name = "String",
1139 .type = V4L2_CTRL_TYPE_STRING,
1140 .min = 2,
1141 .max = 4,
1142 .step = 1,
1143};
1144
b6d17a56
HV
1145static const struct v4l2_ctrl_config vivi_ctrl_bitmask = {
1146 .ops = &vivi_ctrl_ops,
1147 .id = VIVI_CID_CUSTOM_BASE + 6,
1148 .name = "Bitmask",
1149 .type = V4L2_CTRL_TYPE_BITMASK,
1150 .def = 0x80002000,
1151 .min = 0,
1152 .max = 0x80402010,
1153 .step = 0,
1154};
1155
c520331a
SA
1156static const s64 vivi_ctrl_int_menu_values[] = {
1157 1, 1, 2, 3, 5, 8, 13, 21, 42,
1158};
1159
1160static const struct v4l2_ctrl_config vivi_ctrl_int_menu = {
1161 .ops = &vivi_ctrl_ops,
1162 .id = VIVI_CID_CUSTOM_BASE + 7,
1163 .name = "Integer menu",
1164 .type = V4L2_CTRL_TYPE_INTEGER_MENU,
1165 .min = 1,
1166 .max = 8,
1167 .def = 4,
1168 .menu_skip_mask = 0x02,
1169 .qmenu_int = vivi_ctrl_int_menu_values,
1170};
1171
bec43661 1172static const struct v4l2_file_operations vivi_fops = {
1e6dd65e 1173 .owner = THIS_MODULE,
c7a52f8d 1174 .open = v4l2_fh_open,
f2ba5a0b
HV
1175 .release = vb2_fop_release,
1176 .read = vb2_fop_read,
1177 .poll = vb2_fop_poll,
fedc6c81 1178 .unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
f2ba5a0b 1179 .mmap = vb2_fop_mmap,
1e6dd65e
MCC
1180};
1181
a399810c 1182static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
c820cc45 1183 .vidioc_querycap = vidioc_querycap,
78b526a4
HV
1184 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1185 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1186 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1187 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
f2ba5a0b 1188 .vidioc_reqbufs = vb2_ioctl_reqbufs,
2e90c6c3
HV
1189 .vidioc_create_bufs = vb2_ioctl_create_bufs,
1190 .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
f2ba5a0b
HV
1191 .vidioc_querybuf = vb2_ioctl_querybuf,
1192 .vidioc_qbuf = vb2_ioctl_qbuf,
1193 .vidioc_dqbuf = vb2_ioctl_dqbuf,
c820cc45
MCC
1194 .vidioc_enum_input = vidioc_enum_input,
1195 .vidioc_g_input = vidioc_g_input,
1196 .vidioc_s_input = vidioc_s_input,
f2ba5a0b
HV
1197 .vidioc_streamon = vb2_ioctl_streamon,
1198 .vidioc_streamoff = vb2_ioctl_streamoff,
e2ecb257 1199 .vidioc_log_status = v4l2_ctrl_log_status,
6d6604fa 1200 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
c7a52f8d 1201 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
a399810c
HV
1202};
1203
1204static struct video_device vivi_template = {
1205 .name = "vivi",
a399810c
HV
1206 .fops = &vivi_fops,
1207 .ioctl_ops = &vivi_ioctl_ops,
70bd97ae 1208 .release = video_device_release_empty,
1e6dd65e 1209};
5ab6c9af 1210
c820cc45 1211/* -----------------------------------------------------------------
1e6dd65e
MCC
1212 Initialization and module stuff
1213 ------------------------------------------------------------------*/
1214
5ab6c9af
HV
1215static int vivi_release(void)
1216{
1217 struct vivi_dev *dev;
1218 struct list_head *list;
980d4f17 1219
5ab6c9af
HV
1220 while (!list_empty(&vivi_devlist)) {
1221 list = vivi_devlist.next;
1222 list_del(list);
1223 dev = list_entry(list, struct vivi_dev, vivi_devlist);
1224
38c7c036 1225 v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
70bd97ae
HV
1226 video_device_node_name(&dev->vdev));
1227 video_unregister_device(&dev->vdev);
5ab6c9af 1228 v4l2_device_unregister(&dev->v4l2_dev);
7e996afa 1229 v4l2_ctrl_handler_free(&dev->ctrl_handler);
5ab6c9af
HV
1230 kfree(dev);
1231 }
1232
1233 return 0;
1234}
1235
c41ee24b 1236static int __init vivi_create_instance(int inst)
1e6dd65e 1237{
1e6dd65e 1238 struct vivi_dev *dev;
f905c442 1239 struct video_device *vfd;
7e996afa 1240 struct v4l2_ctrl_handler *hdl;
e007a325 1241 struct vb2_queue *q;
730947bc 1242 int ret;
1e6dd65e 1243
5ab6c9af
HV
1244 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1245 if (!dev)
1246 return -ENOMEM;
980d4f17 1247
5ab6c9af 1248 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
c41ee24b 1249 "%s-%03d", VIVI_MODULE_NAME, inst);
5ab6c9af
HV
1250 ret = v4l2_device_register(NULL, &dev->v4l2_dev);
1251 if (ret)
1252 goto free_dev;
1e6dd65e 1253
730947bc
HV
1254 dev->fmt = &formats[0];
1255 dev->width = 640;
1256 dev->height = 480;
3d51dca2 1257 dev->pixelsize = dev->fmt->depth / 8;
7e996afa
HV
1258 hdl = &dev->ctrl_handler;
1259 v4l2_ctrl_handler_init(hdl, 11);
1260 dev->volume = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1261 V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);
1262 dev->brightness = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1263 V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1264 dev->contrast = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1265 V4L2_CID_CONTRAST, 0, 255, 1, 16);
1266 dev->saturation = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1267 V4L2_CID_SATURATION, 0, 255, 1, 127);
1268 dev->hue = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1269 V4L2_CID_HUE, -128, 127, 1, 0);
a1c894fb
HV
1270 dev->autogain = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1271 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1272 dev->gain = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1273 V4L2_CID_GAIN, 0, 255, 1, 100);
7088f4df
HV
1274 dev->alpha = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
1275 V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 0);
7e996afa
HV
1276 dev->button = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_button, NULL);
1277 dev->int32 = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int32, NULL);
1278 dev->int64 = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int64, NULL);
1279 dev->boolean = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_boolean, NULL);
1280 dev->menu = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_menu, NULL);
1281 dev->string = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_string, NULL);
b6d17a56 1282 dev->bitmask = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_bitmask, NULL);
c520331a 1283 dev->int_menu = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int_menu, NULL);
7e996afa
HV
1284 if (hdl->error) {
1285 ret = hdl->error;
1286 goto unreg_dev;
1287 }
a1c894fb 1288 v4l2_ctrl_auto_cluster(2, &dev->autogain, 0, true);
7e996afa 1289 dev->v4l2_dev.ctrl_handler = hdl;
730947bc 1290
fedc6c81
HV
1291 /* initialize locks */
1292 spin_lock_init(&dev->slock);
fedc6c81 1293
e007a325
PO
1294 /* initialize queue */
1295 q = &dev->vb_vidq;
1296 memset(q, 0, sizeof(dev->vb_vidq));
1297 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1298 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
1299 q->drv_priv = dev;
1300 q->buf_struct_size = sizeof(struct vivi_buffer);
1301 q->ops = &vivi_video_qops;
1302 q->mem_ops = &vb2_vmalloc_memops;
1303
1304 vb2_queue_init(q);
1305
1306 mutex_init(&dev->mutex);
730947bc 1307
5ab6c9af
HV
1308 /* init video dma queues */
1309 INIT_LIST_HEAD(&dev->vidq.active);
1310 init_waitqueue_head(&dev->vidq.wq);
1e6dd65e 1311
70bd97ae 1312 vfd = &dev->vdev;
5ab6c9af 1313 *vfd = vivi_template;
c285addb 1314 vfd->debug = debug;
730947bc 1315 vfd->v4l2_dev = &dev->v4l2_dev;
f2ba5a0b 1316 vfd->queue = q;
b1a873a3 1317 set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
e007a325
PO
1318
1319 /*
1320 * Provide a mutex to v4l2 core. It will be used to protect
1321 * all fops and v4l2 ioctls.
1322 */
fedc6c81 1323 vfd->lock = &dev->mutex;
70bd97ae 1324 video_set_drvdata(vfd, dev);
55712ff7 1325
5ab6c9af
HV
1326 ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
1327 if (ret < 0)
70bd97ae 1328 goto unreg_dev;
980d4f17 1329
5ab6c9af
HV
1330 /* Now that everything is fine, let's add it to device list */
1331 list_add_tail(&dev->vivi_devlist, &vivi_devlist);
980d4f17 1332
7de0b873 1333 if (video_nr != -1)
5ab6c9af 1334 video_nr++;
f905c442 1335
38c7c036
LP
1336 v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1337 video_device_node_name(vfd));
5ab6c9af
HV
1338 return 0;
1339
5ab6c9af 1340unreg_dev:
7e996afa 1341 v4l2_ctrl_handler_free(hdl);
5ab6c9af
HV
1342 v4l2_device_unregister(&dev->v4l2_dev);
1343free_dev:
1344 kfree(dev);
1345 return ret;
1346}
f905c442 1347
5ab6c9af
HV
1348/* This routine allocates from 1 to n_devs virtual drivers.
1349
1350 The real maximum number of virtual drivers will depend on how many drivers
1351 will succeed. This is limited to the maximum number of devices that
1352 videodev supports, which is equal to VIDEO_NUM_DEVICES.
1353 */
1354static int __init vivi_init(void)
1355{
730947bc 1356 const struct font_desc *font = find_font("VGA8x16");
9185cbfc 1357 int ret = 0, i;
5ab6c9af 1358
730947bc
HV
1359 if (font == NULL) {
1360 printk(KERN_ERR "vivi: could not find font\n");
1361 return -ENODEV;
1362 }
1363 font8x16 = font->data;
1364
5ab6c9af
HV
1365 if (n_devs <= 0)
1366 n_devs = 1;
1367
1368 for (i = 0; i < n_devs; i++) {
1369 ret = vivi_create_instance(i);
1370 if (ret) {
1371 /* If some instantiations succeeded, keep driver */
1372 if (i)
1373 ret = 0;
1374 break;
1375 }
55712ff7 1376 }
f905c442 1377
55712ff7 1378 if (ret < 0) {
730947bc 1379 printk(KERN_ERR "vivi: error %d while loading driver\n", ret);
5ab6c9af
HV
1380 return ret;
1381 }
1382
1383 printk(KERN_INFO "Video Technology Magazine Virtual Video "
1990d50b
MCC
1384 "Capture Board ver %s successfully loaded.\n",
1385 VIVI_VERSION);
980d4f17 1386
5ab6c9af
HV
1387 /* n_devs will reflect the actual number of allocated devices */
1388 n_devs = i;
980d4f17 1389
1e6dd65e
MCC
1390 return ret;
1391}
1392
1393static void __exit vivi_exit(void)
1394{
55712ff7 1395 vivi_release();
1e6dd65e
MCC
1396}
1397
1398module_init(vivi_init);
1399module_exit(vivi_exit);
This page took 0.798631 seconds and 5 git commands to generate.