vivi.c 33.3 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * Virtual Video driver - This code emulates a real video device with v4l2 api
 *
 * Copyright (c) 2006 by:
 *      Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
 *      Ted Walther <ted--a.t--enumera.com>
 *      John Sokol <sokol--a.t--videotechnology.com>
 *      http://v4l.videotechnology.com/
 *
10 11 12
 *      Conversion to videobuf2 by Pawel Osciak & Marek Szyprowski
 *      Copyright (c) 2010 Samsung Electronics
 *
13 14 15 16 17 18 19 20 21 22
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the BSD Licence, GNU General Public License
 * as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version
 */
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
23
#include <linux/slab.h>
24
#include <linux/font.h>
25
#include <linux/mutex.h>
26 27
#include <linux/videodev2.h>
#include <linux/kthread.h>
28
#include <linux/freezer.h>
29
#include <media/videobuf2-vmalloc.h>
30 31
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
32
#include <media/v4l2-ctrls.h>
33
#include <media/v4l2-fh.h>
34
#include <media/v4l2-event.h>
35
#include <media/v4l2-common.h>
36

37
#define VIVI_MODULE_NAME "vivi"
38

39 40 41 42 43
/* Wake up at about 30 fps */
#define WAKE_NUMERATOR 30
#define WAKE_DENOMINATOR 1001
#define BUFFER_TIMEOUT     msecs_to_jiffies(500)  /* 0.5 seconds */

44 45 46
#define MAX_WIDTH 1920
#define MAX_HEIGHT 1200

47
#define VIVI_VERSION "0.8.1"
48

49 50 51
MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board");
MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
MODULE_LICENSE("Dual BSD/GPL");
52
MODULE_VERSION(VIVI_VERSION);
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

static unsigned video_nr = -1;
module_param(video_nr, uint, 0644);
MODULE_PARM_DESC(video_nr, "videoX start number, -1 is autodetect");

static unsigned n_devs = 1;
module_param(n_devs, uint, 0644);
MODULE_PARM_DESC(n_devs, "number of video devices to create");

static unsigned debug;
module_param(debug, uint, 0644);
MODULE_PARM_DESC(debug, "activates debug info");

static unsigned int vid_limit = 16;
module_param(vid_limit, uint, 0644);
MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");

70 71
/* Global font descriptor */
static const u8 *font8x16;
72

73 74
#define dprintk(dev, level, fmt, arg...) \
	v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
75 76 77 78 79 80 81 82 83 84 85

/* ------------------------------------------------------------------
	Basic structures
   ------------------------------------------------------------------*/

struct vivi_fmt {
	char  *name;
	u32   fourcc;          /* v4l2 format id */
	int   depth;
};

86 87 88 89 90 91
static struct vivi_fmt formats[] = {
	{
		.name     = "4:2:2, packed, YUYV",
		.fourcc   = V4L2_PIX_FMT_YUYV,
		.depth    = 16,
	},
92 93 94 95 96
	{
		.name     = "4:2:2, packed, UYVY",
		.fourcc   = V4L2_PIX_FMT_UYVY,
		.depth    = 16,
	},
97 98 99 100 101 102 103 104 105 106
	{
		.name     = "RGB565 (LE)",
		.fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
		.depth    = 16,
	},
	{
		.name     = "RGB565 (BE)",
		.fourcc   = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
		.depth    = 16,
	},
107 108 109 110 111 112 113 114 115 116
	{
		.name     = "RGB555 (LE)",
		.fourcc   = V4L2_PIX_FMT_RGB555, /* gggbbbbb arrrrrgg */
		.depth    = 16,
	},
	{
		.name     = "RGB555 (BE)",
		.fourcc   = V4L2_PIX_FMT_RGB555X, /* arrrrrgg gggbbbbb */
		.depth    = 16,
	},
117 118
};

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
static struct vivi_fmt *get_format(struct v4l2_format *f)
{
	struct vivi_fmt *fmt;
	unsigned int k;

	for (k = 0; k < ARRAY_SIZE(formats); k++) {
		fmt = &formats[k];
		if (fmt->fourcc == f->fmt.pix.pixelformat)
			break;
	}

	if (k == ARRAY_SIZE(formats))
		return NULL;

	return &formats[k];
}

136 137 138
/* buffer for one video frame */
struct vivi_buffer {
	/* common v4l buffer stuff -- must be first */
139 140
	struct vb2_buffer	vb;
	struct list_head	list;
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
	struct vivi_fmt        *fmt;
};

struct vivi_dmaqueue {
	struct list_head       active;

	/* thread for generating video stream*/
	struct task_struct         *kthread;
	wait_queue_head_t          wq;
	/* Counters to control fps rate */
	int                        frame;
	int                        ini_jiffies;
};

static LIST_HEAD(vivi_devlist);

struct vivi_dev {
	struct list_head           vivi_devlist;
159
	struct v4l2_device 	   v4l2_dev;
160
	struct v4l2_ctrl_handler   ctrl_handler;
161

162
	/* controls */
163 164 165 166
	struct v4l2_ctrl	   *brightness;
	struct v4l2_ctrl	   *contrast;
	struct v4l2_ctrl	   *saturation;
	struct v4l2_ctrl	   *hue;
167 168 169 170 171
	struct {
		/* autogain/gain cluster */
		struct v4l2_ctrl	   *autogain;
		struct v4l2_ctrl	   *gain;
	};
172 173 174 175 176 177 178
	struct v4l2_ctrl	   *volume;
	struct v4l2_ctrl	   *button;
	struct v4l2_ctrl	   *boolean;
	struct v4l2_ctrl	   *int32;
	struct v4l2_ctrl	   *int64;
	struct v4l2_ctrl	   *menu;
	struct v4l2_ctrl	   *string;
179

180
	spinlock_t                 slock;
181
	struct mutex		   mutex;
182 183

	/* various device info */
184
	struct video_device        *vfd;
185 186 187 188

	struct vivi_dmaqueue       vidq;

	/* Several counters */
189
	unsigned 		   ms;
190
	unsigned long              jiffies;
191
	unsigned		   button_pressed;
192 193

	int			   mv_count;	/* Controls bars movement */
194 195 196

	/* Input Number */
	int			   input;
197

198 199
	/* video capture */
	struct vivi_fmt            *fmt;
200
	unsigned int               width, height;
201 202 203
	struct vb2_queue	   vb_vidq;
	enum v4l2_field		   field;
	unsigned int		   field_count;
204

205 206
	u8 			   bars[9][3];
	u8 			   line[MAX_WIDTH * 4];
207 208 209 210 211 212 213 214 215 216
};

/* ------------------------------------------------------------------
	DMA and thread functions
   ------------------------------------------------------------------*/

/* Bars and Colors should match positions */

enum colors {
	WHITE,
217
	AMBER,
218 219 220 221
	CYAN,
	GREEN,
	MAGENTA,
	RED,
222 223
	BLUE,
	BLACK,
224
	TEXT_BLACK,
225 226
};

227
/* R   G   B */
228
#define COLOR_WHITE	{204, 204, 204}
229 230
#define COLOR_AMBER	{208, 208,   0}
#define COLOR_CYAN	{  0, 206, 206}
231 232 233 234 235 236 237
#define	COLOR_GREEN	{  0, 239,   0}
#define COLOR_MAGENTA	{239,   0, 239}
#define COLOR_RED	{205,   0,   0}
#define COLOR_BLUE	{  0,   0, 255}
#define COLOR_BLACK	{  0,   0,   0}

struct bar_std {
238
	u8 bar[9][3];
239 240 241 242 243 244
};

/* Maximum number of bars are 10 - otherwise, the input print code
   should be modified */
static struct bar_std bars[] = {
	{	/* Standard ITU-R color bar sequence */
245 246
		{ COLOR_WHITE, COLOR_AMBER, COLOR_CYAN, COLOR_GREEN,
		  COLOR_MAGENTA, COLOR_RED, COLOR_BLUE, COLOR_BLACK, COLOR_BLACK }
247
	}, {
248 249
		{ COLOR_WHITE, COLOR_AMBER, COLOR_BLACK, COLOR_WHITE,
		  COLOR_AMBER, COLOR_BLACK, COLOR_WHITE, COLOR_AMBER, COLOR_BLACK }
250
	}, {
251 252
		{ COLOR_WHITE, COLOR_CYAN, COLOR_BLACK, COLOR_WHITE,
		  COLOR_CYAN, COLOR_BLACK, COLOR_WHITE, COLOR_CYAN, COLOR_BLACK }
253
	}, {
254 255
		{ COLOR_WHITE, COLOR_GREEN, COLOR_BLACK, COLOR_WHITE,
		  COLOR_GREEN, COLOR_BLACK, COLOR_WHITE, COLOR_GREEN, COLOR_BLACK }
256
	},
257 258
};

259 260
#define NUM_INPUTS ARRAY_SIZE(bars)

261 262
#define TO_Y(r, g, b) \
	(((16829 * r + 33039 * g + 6416 * b  + 32768) >> 16) + 16)
263
/* RGB to  V(Cr) Color transform */
264 265
#define TO_V(r, g, b) \
	(((28784 * r - 24103 * g - 4681 * b  + 32768) >> 16) + 128)
266
/* RGB to  U(Cb) Color transform */
267 268
#define TO_U(r, g, b) \
	(((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
269

270
/* precalculate color bar values to speed up rendering */
271
static void precalculate_bars(struct vivi_dev *dev)
272
{
273
	u8 r, g, b;
274 275
	int k, is_yuv;

276 277 278 279
	for (k = 0; k < 9; k++) {
		r = bars[dev->input].bar[k][0];
		g = bars[dev->input].bar[k][1];
		b = bars[dev->input].bar[k][2];
280 281
		is_yuv = 0;

282
		switch (dev->fmt->fourcc) {
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
		case V4L2_PIX_FMT_YUYV:
		case V4L2_PIX_FMT_UYVY:
			is_yuv = 1;
			break;
		case V4L2_PIX_FMT_RGB565:
		case V4L2_PIX_FMT_RGB565X:
			r >>= 3;
			g >>= 2;
			b >>= 3;
			break;
		case V4L2_PIX_FMT_RGB555:
		case V4L2_PIX_FMT_RGB555X:
			r >>= 3;
			g >>= 3;
			b >>= 3;
			break;
		}

		if (is_yuv) {
302 303 304
			dev->bars[k][0] = TO_Y(r, g, b);	/* Luma */
			dev->bars[k][1] = TO_U(r, g, b);	/* Cb */
			dev->bars[k][2] = TO_V(r, g, b);	/* Cr */
305
		} else {
306 307 308
			dev->bars[k][0] = r;
			dev->bars[k][1] = g;
			dev->bars[k][2] = b;
309 310 311 312
		}
	}
}

313 314 315 316
#define TSTAMP_MIN_Y	24
#define TSTAMP_MAX_Y	(TSTAMP_MIN_Y + 15)
#define TSTAMP_INPUT_X	10
#define TSTAMP_MIN_X	(54 + TSTAMP_INPUT_X)
317

318
static void gen_twopix(struct vivi_dev *dev, u8 *buf, int colorpos)
319
{
320
	u8 r_y, g_u, b_v;
321
	int color;
322
	u8 *p;
323

324 325 326
	r_y = dev->bars[colorpos][0]; /* R or precalculated Y */
	g_u = dev->bars[colorpos][1]; /* G or precalculated U */
	b_v = dev->bars[colorpos][2]; /* B or precalculated V */
327 328 329 330

	for (color = 0; color < 4; color++) {
		p = buf + color;

331
		switch (dev->fmt->fourcc) {
332 333 334 335 336 337 338 339 340 341 342 343 344
		case V4L2_PIX_FMT_YUYV:
			switch (color) {
			case 0:
			case 2:
				*p = r_y;
				break;
			case 1:
				*p = g_u;
				break;
			case 3:
				*p = b_v;
				break;
			}
345
			break;
346 347 348 349 350 351 352 353 354 355 356 357 358 359
		case V4L2_PIX_FMT_UYVY:
			switch (color) {
			case 1:
			case 3:
				*p = r_y;
				break;
			case 0:
				*p = g_u;
				break;
			case 2:
				*p = b_v;
				break;
			}
			break;
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
		case V4L2_PIX_FMT_RGB565:
			switch (color) {
			case 0:
			case 2:
				*p = (g_u << 5) | b_v;
				break;
			case 1:
			case 3:
				*p = (r_y << 3) | (g_u >> 3);
				break;
			}
			break;
		case V4L2_PIX_FMT_RGB565X:
			switch (color) {
			case 0:
			case 2:
				*p = (r_y << 3) | (g_u >> 3);
				break;
			case 1:
			case 3:
				*p = (g_u << 5) | b_v;
				break;
			}
			break;
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
		case V4L2_PIX_FMT_RGB555:
			switch (color) {
			case 0:
			case 2:
				*p = (g_u << 5) | b_v;
				break;
			case 1:
			case 3:
				*p = (r_y << 2) | (g_u >> 3);
				break;
			}
			break;
		case V4L2_PIX_FMT_RGB555X:
			switch (color) {
			case 0:
			case 2:
				*p = (r_y << 2) | (g_u >> 3);
				break;
			case 1:
			case 3:
				*p = (g_u << 5) | b_v;
				break;
			}
			break;
408 409 410 411
		}
	}
}

412
static void precalculate_line(struct vivi_dev *dev)
413
{
414
	int w;
415

416 417
	for (w = 0; w < dev->width * 2; w += 2) {
		int colorpos = (w / (dev->width / 8) % 8);
418

419
		gen_twopix(dev, dev->line + w * 2, colorpos);
420
	}
421
}
422

423 424 425 426
static void gen_text(struct vivi_dev *dev, char *basep,
					int y, int x, char *text)
{
	int line;
427

428 429 430
	/* Checks if it is possible to show string */
	if (y + 16 >= dev->height || x + strlen(text) * 8 >= dev->width)
		return;
431 432

	/* Print stream time */
433 434 435 436 437 438 439 440 441 442
	for (line = y; line < y + 16; line++) {
		int j = 0;
		char *pos = basep + line * dev->width * 2 + x * 2;
		char *s;

		for (s = text; *s; s++) {
			u8 chr = font8x16[*s * 16 + line - y];
			int i;

			for (i = 0; i < 7; i++, j++) {
443
				/* Draw white font on black background */
444 445
				if (chr & (1 << (7 - i)))
					gen_twopix(dev, pos + j * 2, WHITE);
446
				else
447
					gen_twopix(dev, pos + j * 2, TEXT_BLACK);
448 449 450 451
			}
		}
	}
}
452

453
static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
454
{
455 456
	int wmax = dev->width;
	int hmax = dev->height;
457
	struct timeval ts;
458
	void *vbuf = vb2_plane_vaddr(&buf->vb, 0);
459 460 461
	unsigned ms;
	char str[100];
	int h, line = 1;
462
	s32 gain;
463

464
	if (!vbuf)
465
		return;
466

467 468
	for (h = 0; h < hmax; h++)
		memcpy(vbuf + h * wmax * 2, dev->line + (dev->mv_count % wmax) * 2, wmax * 2);
469

470 471
	/* Updates stream time */

472
	dev->ms += jiffies_to_msecs(jiffies - dev->jiffies);
473
	dev->jiffies = jiffies;
474 475 476 477 478 479 480 481 482 483 484
	ms = dev->ms;
	snprintf(str, sizeof(str), " %02d:%02d:%02d:%03d ",
			(ms / (60 * 60 * 1000)) % 24,
			(ms / (60 * 1000)) % 60,
			(ms / 1000) % 60,
			ms % 1000);
	gen_text(dev, vbuf, line++ * 16, 16, str);
	snprintf(str, sizeof(str), " %dx%d, input %d ",
			dev->width, dev->height, dev->input);
	gen_text(dev, vbuf, line++ * 16, 16, str);

485
	gain = v4l2_ctrl_g_ctrl(dev->gain);
486
	mutex_lock(&dev->ctrl_handler.lock);
487
	snprintf(str, sizeof(str), " brightness %3d, contrast %3d, saturation %3d, hue %d ",
488 489 490 491
			dev->brightness->cur.val,
			dev->contrast->cur.val,
			dev->saturation->cur.val,
			dev->hue->cur.val);
492
	gen_text(dev, vbuf, line++ * 16, 16, str);
493 494
	snprintf(str, sizeof(str), " autogain %d, gain %3d, volume %3d ",
			dev->autogain->cur.val, gain, dev->volume->cur.val);
495
	gen_text(dev, vbuf, line++ * 16, 16, str);
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
	snprintf(str, sizeof(str), " int32 %d, int64 %lld ",
			dev->int32->cur.val,
			dev->int64->cur.val64);
	gen_text(dev, vbuf, line++ * 16, 16, str);
	snprintf(str, sizeof(str), " boolean %d, menu %s, string \"%s\" ",
			dev->boolean->cur.val,
			dev->menu->qmenu[dev->menu->cur.val],
			dev->string->cur.string);
	mutex_unlock(&dev->ctrl_handler.lock);
	gen_text(dev, vbuf, line++ * 16, 16, str);
	if (dev->button_pressed) {
		dev->button_pressed--;
		snprintf(str, sizeof(str), " button pressed!");
		gen_text(dev, vbuf, line++ * 16, 16, str);
	}
511 512

	dev->mv_count += 2;
513

514 515 516
	buf->vb.v4l2_buf.field = dev->field;
	dev->field_count++;
	buf->vb.v4l2_buf.sequence = dev->field_count >> 1;
517
	do_gettimeofday(&ts);
518
	buf->vb.v4l2_buf.timestamp = ts;
519 520
}

521
static void vivi_thread_tick(struct vivi_dev *dev)
522
{
523
	struct vivi_dmaqueue *dma_q = &dev->vidq;
524
	struct vivi_buffer *buf;
525
	unsigned long flags = 0;
526

527
	dprintk(dev, 1, "Thread tick\n");
528

529 530 531 532 533
	spin_lock_irqsave(&dev->slock, flags);
	if (list_empty(&dma_q->active)) {
		dprintk(dev, 1, "No active queue to serve\n");
		goto unlock;
	}
534

535 536
	buf = list_entry(dma_q->active.next, struct vivi_buffer, list);
	list_del(&buf->list);
537

538
	do_gettimeofday(&buf->vb.v4l2_buf.timestamp);
539 540

	/* Fill buffer */
541
	vivi_fillbuff(dev, buf);
542 543
	dprintk(dev, 1, "filled buffer %p\n", buf);

544 545
	vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
	dprintk(dev, 2, "[%p/%d] done\n", buf, buf->vb.v4l2_buf.index);
546 547
unlock:
	spin_unlock_irqrestore(&dev->slock, flags);
548 549
}

550 551 552
#define frames_to_ms(frames)					\
	((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

553
static void vivi_sleep(struct vivi_dev *dev)
554
{
555 556
	struct vivi_dmaqueue *dma_q = &dev->vidq;
	int timeout;
557 558
	DECLARE_WAITQUEUE(wait, current);

559
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
560
		(unsigned long)dma_q);
561 562

	add_wait_queue(&dma_q->wq, &wait);
563 564 565 566
	if (kthread_should_stop())
		goto stop_task;

	/* Calculate time to wake up */
567
	timeout = msecs_to_jiffies(frames_to_ms(1));
568

569
	vivi_thread_tick(dev);
570 571

	schedule_timeout_interruptible(timeout);
572

573
stop_task:
574 575 576 577
	remove_wait_queue(&dma_q->wq, &wait);
	try_to_freeze();
}

578
static int vivi_thread(void *data)
579
{
580
	struct vivi_dev *dev = data;
581

582
	dprintk(dev, 1, "thread started\n");
583

584
	set_freezable();
585

586
	for (;;) {
587
		vivi_sleep(dev);
588 589 590 591

		if (kthread_should_stop())
			break;
	}
592
	dprintk(dev, 1, "thread: exit\n");
593 594 595
	return 0;
}

596
static int vivi_start_generating(struct vivi_dev *dev)
597
{
598
	struct vivi_dmaqueue *dma_q = &dev->vidq;
599

600
	dprintk(dev, 1, "%s\n", __func__);
601

602 603 604 605 606 607 608 609
	/* Resets frame counters */
	dev->ms = 0;
	dev->mv_count = 0;
	dev->jiffies = jiffies;

	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
	dma_q->kthread = kthread_run(vivi_thread, dev, dev->v4l2_dev.name);
610

611
	if (IS_ERR(dma_q->kthread)) {
612
		v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n");
613
		return PTR_ERR(dma_q->kthread);
614
	}
615 616 617
	/* Wakes thread */
	wake_up_interruptible(&dma_q->wq);

618
	dprintk(dev, 1, "returning from %s\n", __func__);
619
	return 0;
620 621
}

622
static void vivi_stop_generating(struct vivi_dev *dev)
623
{
624
	struct vivi_dmaqueue *dma_q = &dev->vidq;
625

626
	dprintk(dev, 1, "%s\n", __func__);
627

628 629 630
	/* shutdown control thread */
	if (dma_q->kthread) {
		kthread_stop(dma_q->kthread);
631
		dma_q->kthread = NULL;
632
	}
633

634 635 636 637 638 639 640 641 642 643 644 645 646
	/*
	 * Typical driver might need to wait here until dma engine stops.
	 * In this case we can abort imiedetly, so it's just a noop.
	 */

	/* Release all active buffers */
	while (!list_empty(&dma_q->active)) {
		struct vivi_buffer *buf;
		buf = list_entry(dma_q->active.next, struct vivi_buffer, list);
		list_del(&buf->list);
		vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
		dprintk(dev, 2, "[%p/%d] done\n", buf, buf->vb.v4l2_buf.index);
	}
647 648 649 650
}
/* ------------------------------------------------------------------
	Videobuf operations
   ------------------------------------------------------------------*/
651 652 653
static int queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
				unsigned int *nplanes, unsigned long sizes[],
				void *alloc_ctxs[])
654
{
655 656 657 658
	struct vivi_dev *dev = vb2_get_drv_priv(vq);
	unsigned long size;

	size = dev->width * dev->height * 2;
659

660 661
	if (0 == *nbuffers)
		*nbuffers = 32;
662

663 664
	while (size * *nbuffers > vid_limit * 1024 * 1024)
		(*nbuffers)--;
665

666
	*nplanes = 1;
667

668 669 670 671 672 673 674 675 676
	sizes[0] = size;

	/*
	 * videobuf2-vmalloc allocator is context-less so no need to set
	 * alloc_ctxs array.
	 */

	dprintk(dev, 1, "%s, count=%d, size=%ld\n", __func__,
		*nbuffers, size);
677

678 679 680
	return 0;
}

681
static int buffer_init(struct vb2_buffer *vb)
682
{
683
	struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
684

685
	BUG_ON(NULL == dev->fmt);
686

687 688 689 690 691 692 693 694 695 696 697 698 699
	/*
	 * This callback is called once per buffer, after its allocation.
	 *
	 * Vivi does not allow changing format during streaming, but it is
	 * possible to do so when streaming is paused (i.e. in streamoff state).
	 * Buffers however are not freed when going into streamoff and so
	 * buffer size verification has to be done in buffer_prepare, on each
	 * qbuf.
	 * It would be best to move verification code here to buf_init and
	 * s_fmt though.
	 */

	return 0;
700 701
}

702
static int buffer_prepare(struct vb2_buffer *vb)
703
{
704
	struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
705
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
706
	unsigned long size;
707

708
	dprintk(dev, 1, "%s, field=%d\n", __func__, vb->v4l2_buf.field);
709

710
	BUG_ON(NULL == dev->fmt);
711

712 713 714 715 716 717
	/*
	 * Theses properties only change when queue is idle, see s_fmt.
	 * The below checks should not be performed here, on each
	 * buffer_prepare (i.e. on each qbuf). Most of the code in this function
	 * should thus be moved to buffer_init and s_fmt.
	 */
718 719
	if (dev->width  < 48 || dev->width  > MAX_WIDTH ||
	    dev->height < 32 || dev->height > MAX_HEIGHT)
720
		return -EINVAL;
721

722 723 724 725
	size = dev->width * dev->height * 2;
	if (vb2_plane_size(vb, 0) < size) {
		dprintk(dev, 1, "%s data will not fit into plane (%lu < %lu)\n",
				__func__, vb2_plane_size(vb, 0), size);
726
		return -EINVAL;
727 728 729
	}

	vb2_set_plane_payload(&buf->vb, 0, size);
730

731
	buf->fmt = dev->fmt;
732

733 734
	precalculate_bars(dev);
	precalculate_line(dev);
735

736 737
	return 0;
}
738

739 740 741 742
static int buffer_finish(struct vb2_buffer *vb)
{
	struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
	dprintk(dev, 1, "%s\n", __func__);
743
	return 0;
744 745 746 747 748 749
}

static void buffer_cleanup(struct vb2_buffer *vb)
{
	struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
	dprintk(dev, 1, "%s\n", __func__);
750 751 752

}

753
static void buffer_queue(struct vb2_buffer *vb)
754
{
755
	struct vivi_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
756
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
757
	struct vivi_dmaqueue *vidq = &dev->vidq;
758
	unsigned long flags = 0;
759

760
	dprintk(dev, 1, "%s\n", __func__);
761

762 763 764
	spin_lock_irqsave(&dev->slock, flags);
	list_add_tail(&buf->list, &vidq->active);
	spin_unlock_irqrestore(&dev->slock, flags);
765 766
}

767
static int start_streaming(struct vb2_queue *vq)
768
{
769 770 771 772
	struct vivi_dev *dev = vb2_get_drv_priv(vq);
	dprintk(dev, 1, "%s\n", __func__);
	return vivi_start_generating(dev);
}
773

774 775 776 777
/* abort streaming and wait for last buffer */
static int stop_streaming(struct vb2_queue *vq)
{
	struct vivi_dev *dev = vb2_get_drv_priv(vq);
778
	dprintk(dev, 1, "%s\n", __func__);
779 780 781 782 783 784 785 786 787
	vivi_stop_generating(dev);
	return 0;
}

static void vivi_lock(struct vb2_queue *vq)
{
	struct vivi_dev *dev = vb2_get_drv_priv(vq);
	mutex_lock(&dev->mutex);
}
788

789 790 791 792
static void vivi_unlock(struct vb2_queue *vq)
{
	struct vivi_dev *dev = vb2_get_drv_priv(vq);
	mutex_unlock(&dev->mutex);
793 794
}

795 796 797 798 799 800 801 802 803 804 805 806

static struct vb2_ops vivi_video_qops = {
	.queue_setup		= queue_setup,
	.buf_init		= buffer_init,
	.buf_prepare		= buffer_prepare,
	.buf_finish		= buffer_finish,
	.buf_cleanup		= buffer_cleanup,
	.buf_queue		= buffer_queue,
	.start_streaming	= start_streaming,
	.stop_streaming		= stop_streaming,
	.wait_prepare		= vivi_unlock,
	.wait_finish		= vivi_lock,
807 808
};

809 810 811
/* ------------------------------------------------------------------
	IOCTL vidioc handling
   ------------------------------------------------------------------*/
812
static int vidioc_querycap(struct file *file, void  *priv,
813 814
					struct v4l2_capability *cap)
{
815
	struct vivi_dev *dev = video_drvdata(file);
816

817 818
	strcpy(cap->driver, "vivi");
	strcpy(cap->card, "vivi");
819
	strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
820 821
	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | \
			    V4L2_CAP_READWRITE;
822 823 824
	return 0;
}

825
static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
826 827
					struct v4l2_fmtdesc *f)
{
828 829 830
	struct vivi_fmt *fmt;

	if (f->index >= ARRAY_SIZE(formats))
831 832
		return -EINVAL;

833 834 835 836
	fmt = &formats[f->index];

	strlcpy(f->description, fmt->name, sizeof(f->description));
	f->pixelformat = fmt->fourcc;
837 838 839
	return 0;
}

840
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
841 842
					struct v4l2_format *f)
{
843
	struct vivi_dev *dev = video_drvdata(file);
844

845 846
	f->fmt.pix.width        = dev->width;
	f->fmt.pix.height       = dev->height;
847
	f->fmt.pix.field        = dev->field;
848
	f->fmt.pix.pixelformat  = dev->fmt->fourcc;
849
	f->fmt.pix.bytesperline =
850
		(f->fmt.pix.width * dev->fmt->depth) >> 3;
851 852
	f->fmt.pix.sizeimage =
		f->fmt.pix.height * f->fmt.pix.bytesperline;
853
	return 0;
854 855
}

856
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
857 858
			struct v4l2_format *f)
{
859
	struct vivi_dev *dev = video_drvdata(file);
860 861 862
	struct vivi_fmt *fmt;
	enum v4l2_field field;

863 864 865 866
	fmt = get_format(f);
	if (!fmt) {
		dprintk(dev, 1, "Fourcc format (0x%08x) invalid.\n",
			f->fmt.pix.pixelformat);
867 868 869 870 871 872
		return -EINVAL;
	}

	field = f->fmt.pix.field;

	if (field == V4L2_FIELD_ANY) {
873
		field = V4L2_FIELD_INTERLACED;
874
	} else if (V4L2_FIELD_INTERLACED != field) {
875
		dprintk(dev, 1, "Field type invalid.\n");
876 877 878 879
		return -EINVAL;
	}

	f->fmt.pix.field = field;
880 881
	v4l_bound_align_image(&f->fmt.pix.width, 48, MAX_WIDTH, 2,
			      &f->fmt.pix.height, 32, MAX_HEIGHT, 0, 0);
882 883 884 885 886 887 888
	f->fmt.pix.bytesperline =
		(f->fmt.pix.width * fmt->depth) >> 3;
	f->fmt.pix.sizeimage =
		f->fmt.pix.height * f->fmt.pix.bytesperline;
	return 0;
}

889 890 891
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
					struct v4l2_format *f)
{
892
	struct vivi_dev *dev = video_drvdata(file);
893
	struct vb2_queue *q = &dev->vb_vidq;
894

895
	int ret = vidioc_try_fmt_vid_cap(file, priv, f);
896 897 898
	if (ret < 0)
		return ret;

899
	if (vb2_is_streaming(q)) {
900
		dprintk(dev, 1, "%s device busy\n", __func__);
901
		return -EBUSY;
902 903
	}

904 905 906
	dev->fmt = get_format(f);
	dev->width = f->fmt.pix.width;
	dev->height = f->fmt.pix.height;
907 908 909
	dev->field = f->fmt.pix.field;

	return 0;
910 911
}

912 913
static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *p)
914
{
915
	struct vivi_dev *dev = video_drvdata(file);
916
	return vb2_reqbufs(&dev->vb_vidq, p);
917 918
}

919
static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
920
{
921
	struct vivi_dev *dev = video_drvdata(file);
922
	return vb2_querybuf(&dev->vb_vidq, p);
923
}
924

925
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
926
{
927
	struct vivi_dev *dev = video_drvdata(file);
928
	return vb2_qbuf(&dev->vb_vidq, p);
929
}
930

931
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
932
{
933
	struct vivi_dev *dev = video_drvdata(file);
934
	return vb2_dqbuf(&dev->vb_vidq, p, file->f_flags & O_NONBLOCK);
935
}
936

937
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
938
{
939
	struct vivi_dev *dev = video_drvdata(file);
940
	return vb2_streamon(&dev->vb_vidq, i);
941
}
942

943
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
944
{
945
	struct vivi_dev *dev = video_drvdata(file);
946
	return vb2_streamoff(&dev->vb_vidq, i);
947 948
}

949
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
950 951 952
{
	return 0;
}
953

954
/* only one input in this sample driver */
955
static int vidioc_enum_input(struct file *file, void *priv,
956 957
				struct v4l2_input *inp)
{
958
	if (inp->index >= NUM_INPUTS)
959
		return -EINVAL;
960

961
	inp->type = V4L2_INPUT_TYPE_CAMERA;
962
	inp->std = V4L2_STD_525_60;
963
	sprintf(inp->name, "Camera %u", inp->index);
964
	return 0;
965
}
966

967
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
968
{
969
	struct vivi_dev *dev = video_drvdata(file);
970 971

	*i = dev->input;
972
	return 0;
973
}
974

975
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
976
{
977
	struct vivi_dev *dev = video_drvdata(file);
978 979

	if (i >= NUM_INPUTS)
980
		return -EINVAL;
981

982 983 984
	if (i == dev->input)
		return 0;

985
	dev->input = i;
986 987 988
	precalculate_bars(dev);
	precalculate_line(dev);
	return 0;
989
}
990

991 992 993 994 995 996 997 998 999 1000 1001
static int vidioc_subscribe_event(struct v4l2_fh *fh,
				struct v4l2_event_subscription *sub)
{
	switch (sub->type) {
	case V4L2_EVENT_CTRL:
		return v4l2_ctrl_subscribe_fh(fh, sub, 0);
	default:
		return -EINVAL;
	}
}

1002
/* --- controls ---------------------------------------------- */
1003

1004 1005 1006 1007 1008 1009 1010 1011 1012
static int vivi_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
{
	struct vivi_dev *dev = container_of(ctrl->handler, struct vivi_dev, ctrl_handler);

	if (ctrl == dev->autogain)
		dev->gain->val = jiffies & 0xff;
	return 0;
}

1013
static int vivi_s_ctrl(struct v4l2_ctrl *ctrl)
1014
{
1015
	struct vivi_dev *dev = container_of(ctrl->handler, struct vivi_dev, ctrl_handler);
1016

1017 1018 1019
	if (ctrl == dev->button)
		dev->button_pressed = 30;
	return 0;
1020 1021 1022 1023 1024 1025 1026 1027 1028
}

/* ------------------------------------------------------------------
	File operations for the device
   ------------------------------------------------------------------*/

static ssize_t
vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
{
1029
	struct vivi_dev *dev = video_drvdata(file);
1030

1031 1032 1033
	dprintk(dev, 1, "read called\n");
	return vb2_read(&dev->vb_vidq, data, count, ppos,
		       file->f_flags & O_NONBLOCK);
1034 1035 1036 1037 1038
}

static unsigned int
vivi_poll(struct file *file, struct poll_table_struct *wait)
{
1039
	struct vivi_dev *dev = video_drvdata(file);
1040
	struct v4l2_fh *fh = file->private_data;
1041
	struct vb2_queue *q = &dev->vb_vidq;
1042
	unsigned int res;
1043

1044
	dprintk(dev, 1, "%s\n", __func__);
1045 1046 1047 1048 1049 1050
	res = vb2_poll(q, file, wait);
	if (v4l2_event_pending(fh))
		res |= POLLPRI;
	else
		poll_wait(file, &fh->events->wait, wait);
	return res;
1051 1052
}

1053
static int vivi_close(struct file *file)
1054
{
1055
	struct video_device  *vdev = video_devdata(file);
1056
	struct vivi_dev *dev = video_drvdata(file);
1057

1058 1059
	dprintk(dev, 1, "close called (dev=%s), file %p\n",
		video_device_node_name(vdev), file);
1060

1061
	if (v4l2_fh_is_singular_file(file))
1062
		vb2_queue_release(&dev->vb_vidq);
1063
	return v4l2_fh_release(file);
1064 1065
}

1066
static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1067
{
1068
	struct vivi_dev *dev = video_drvdata(file);
1069 1070
	int ret;

1071
	dprintk(dev, 1, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
1072

1073
	ret = vb2_mmap(&dev->vb_vidq, vma);
1074
	dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1075
		(unsigned long)vma->vm_start,
1076
		(unsigned long)vma->vm_end - (unsigned long)vma->vm_start,
1077 1078 1079 1080
		ret);
	return ret;
}

1081
static const struct v4l2_ctrl_ops vivi_ctrl_ops = {
1082
	.g_volatile_ctrl = vivi_g_volatile_ctrl,
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
	.s_ctrl = vivi_s_ctrl,
};

#define VIVI_CID_CUSTOM_BASE	(V4L2_CID_USER_BASE | 0xf000)

static const struct v4l2_ctrl_config vivi_ctrl_button = {
	.ops = &vivi_ctrl_ops,
	.id = VIVI_CID_CUSTOM_BASE + 0,
	.name = "Button",
	.type = V4L2_CTRL_TYPE_BUTTON,
};

static const struct v4l2_ctrl_config vivi_ctrl_boolean = {
	.ops = &vivi_ctrl_ops,
	.id = VIVI_CID_CUSTOM_BASE + 1,
	.name = "Boolean",
	.type = V4L2_CTRL_TYPE_BOOLEAN,
	.min = 0,
	.max = 1,
	.step = 1,
	.def = 1,
};

static const struct v4l2_ctrl_config vivi_ctrl_int32 = {
	.ops = &vivi_ctrl_ops,
	.id = VIVI_CID_CUSTOM_BASE + 2,
	.name = "Integer 32 Bits",
	.type = V4L2_CTRL_TYPE_INTEGER,
1111 1112
	.min = 0x80000000,
	.max = 0x7fffffff,
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
	.step = 1,
};

static const struct v4l2_ctrl_config vivi_ctrl_int64 = {
	.ops = &vivi_ctrl_ops,
	.id = VIVI_CID_CUSTOM_BASE + 3,
	.name = "Integer 64 Bits",
	.type = V4L2_CTRL_TYPE_INTEGER64,
};

static const char * const vivi_ctrl_menu_strings[] = {
	"Menu Item 0 (Skipped)",
	"Menu Item 1",
	"Menu Item 2 (Skipped)",
	"Menu Item 3",
	"Menu Item 4",
	"Menu Item 5 (Skipped)",
	NULL,
};

static const struct v4l2_ctrl_config vivi_ctrl_menu = {
	.ops = &vivi_ctrl_ops,
	.id = VIVI_CID_CUSTOM_BASE + 4,
	.name = "Menu",
	.type = V4L2_CTRL_TYPE_MENU,
	.min = 1,
	.max = 4,
	.def = 3,
	.menu_skip_mask = 0x04,
	.qmenu = vivi_ctrl_menu_strings,
};

static const struct v4l2_ctrl_config vivi_ctrl_string = {
	.ops = &vivi_ctrl_ops,
	.id = VIVI_CID_CUSTOM_BASE + 5,
	.name = "String",
	.type = V4L2_CTRL_TYPE_STRING,
	.min = 2,
	.max = 4,
	.step = 1,
};

1155
static const struct v4l2_file_operations vivi_fops = {
1156
	.owner		= THIS_MODULE,
1157
	.open           = v4l2_fh_open,
1158
	.release        = vivi_close,
1159 1160
	.read           = vivi_read,
	.poll		= vivi_poll,
H
Hans Verkuil 已提交
1161
	.unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
1162
	.mmap           = vivi_mmap,
1163 1164
};

1165
static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
1166
	.vidioc_querycap      = vidioc_querycap,
1167 1168 1169 1170
	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
1171 1172 1173 1174 1175 1176 1177 1178
	.vidioc_reqbufs       = vidioc_reqbufs,
	.vidioc_querybuf      = vidioc_querybuf,
	.vidioc_qbuf          = vidioc_qbuf,
	.vidioc_dqbuf         = vidioc_dqbuf,
	.vidioc_s_std         = vidioc_s_std,
	.vidioc_enum_input    = vidioc_enum_input,
	.vidioc_g_input       = vidioc_g_input,
	.vidioc_s_input       = vidioc_s_input,
1179 1180
	.vidioc_streamon      = vidioc_streamon,
	.vidioc_streamoff     = vidioc_streamoff,
1181 1182
	.vidioc_subscribe_event = vidioc_subscribe_event,
	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1183 1184 1185 1186 1187 1188 1189 1190
};

static struct video_device vivi_template = {
	.name		= "vivi",
	.fops           = &vivi_fops,
	.ioctl_ops 	= &vivi_ioctl_ops,
	.release	= video_device_release,

1191
	.tvnorms              = V4L2_STD_525_60,
1192
	.current_norm         = V4L2_STD_NTSC_M,
1193
};
1194

1195
/* -----------------------------------------------------------------
1196 1197 1198
	Initialization and module stuff
   ------------------------------------------------------------------*/

1199 1200 1201 1202
static int vivi_release(void)
{
	struct vivi_dev *dev;
	struct list_head *list;
1203

1204 1205 1206 1207 1208
	while (!list_empty(&vivi_devlist)) {
		list = vivi_devlist.next;
		list_del(list);
		dev = list_entry(list, struct vivi_dev, vivi_devlist);

1209 1210
		v4l2_info(&dev->v4l2_dev, "unregistering %s\n",
			video_device_node_name(dev->vfd));
1211 1212
		video_unregister_device(dev->vfd);
		v4l2_device_unregister(&dev->v4l2_dev);
1213
		v4l2_ctrl_handler_free(&dev->ctrl_handler);
1214 1215 1216 1217 1218 1219
		kfree(dev);
	}

	return 0;
}

1220
static int __init vivi_create_instance(int inst)
1221 1222
{
	struct vivi_dev *dev;
1223
	struct video_device *vfd;
1224
	struct v4l2_ctrl_handler *hdl;
1225
	struct vb2_queue *q;
1226
	int ret;
1227

1228 1229 1230
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev)
		return -ENOMEM;
1231

1232
	snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
1233
			"%s-%03d", VIVI_MODULE_NAME, inst);
1234 1235 1236
	ret = v4l2_device_register(NULL, &dev->v4l2_dev);
	if (ret)
		goto free_dev;
1237

1238 1239 1240
	dev->fmt = &formats[0];
	dev->width = 640;
	dev->height = 480;
1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252
	hdl = &dev->ctrl_handler;
	v4l2_ctrl_handler_init(hdl, 11);
	dev->volume = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);
	dev->brightness = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
	dev->contrast = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_CONTRAST, 0, 255, 1, 16);
	dev->saturation = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_SATURATION, 0, 255, 1, 127);
	dev->hue = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_HUE, -128, 127, 1, 0);
1253 1254 1255 1256
	dev->autogain = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
	dev->gain = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,
			V4L2_CID_GAIN, 0, 255, 1, 100);
1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
	dev->button = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_button, NULL);
	dev->int32 = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int32, NULL);
	dev->int64 = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_int64, NULL);
	dev->boolean = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_boolean, NULL);
	dev->menu = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_menu, NULL);
	dev->string = v4l2_ctrl_new_custom(hdl, &vivi_ctrl_string, NULL);
	if (hdl->error) {
		ret = hdl->error;
		goto unreg_dev;
	}
1267
	v4l2_ctrl_auto_cluster(2, &dev->autogain, 0, true);
1268
	dev->v4l2_dev.ctrl_handler = hdl;
1269

H
Hans Verkuil 已提交
1270 1271 1272
	/* initialize locks */
	spin_lock_init(&dev->slock);

1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285
	/* initialize queue */
	q = &dev->vb_vidq;
	memset(q, 0, sizeof(dev->vb_vidq));
	q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;
	q->drv_priv = dev;
	q->buf_struct_size = sizeof(struct vivi_buffer);
	q->ops = &vivi_video_qops;
	q->mem_ops = &vb2_vmalloc_memops;

	vb2_queue_init(q);

	mutex_init(&dev->mutex);
1286

1287 1288 1289
	/* init video dma queues */
	INIT_LIST_HEAD(&dev->vidq.active);
	init_waitqueue_head(&dev->vidq.wq);
1290

1291 1292 1293 1294
	ret = -ENOMEM;
	vfd = video_device_alloc();
	if (!vfd)
		goto unreg_dev;
1295

1296
	*vfd = vivi_template;
1297
	vfd->debug = debug;
1298
	vfd->v4l2_dev = &dev->v4l2_dev;
1299
	set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
1300 1301 1302 1303 1304

	/*
	 * Provide a mutex to v4l2 core. It will be used to protect
	 * all fops and v4l2 ioctls.
	 */
H
Hans Verkuil 已提交
1305
	vfd->lock = &dev->mutex;
1306

1307 1308 1309
	ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
	if (ret < 0)
		goto rel_vdev;
1310

1311
	video_set_drvdata(vfd, dev);
1312

1313 1314
	/* Now that everything is fine, let's add it to device list */
	list_add_tail(&dev->vivi_devlist, &vivi_devlist);
1315

1316
	if (video_nr != -1)
1317
		video_nr++;
1318

1319
	dev->vfd = vfd;
1320 1321
	v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
		  video_device_node_name(vfd));
1322 1323 1324 1325 1326
	return 0;

rel_vdev:
	video_device_release(vfd);
unreg_dev:
1327
	v4l2_ctrl_handler_free(hdl);
1328 1329 1330 1331 1332
	v4l2_device_unregister(&dev->v4l2_dev);
free_dev:
	kfree(dev);
	return ret;
}
1333

1334 1335 1336 1337 1338 1339 1340 1341
/* This routine allocates from 1 to n_devs virtual drivers.

   The real maximum number of virtual drivers will depend on how many drivers
   will succeed. This is limited to the maximum number of devices that
   videodev supports, which is equal to VIDEO_NUM_DEVICES.
 */
static int __init vivi_init(void)
{
1342
	const struct font_desc *font = find_font("VGA8x16");
1343
	int ret = 0, i;
1344

1345 1346 1347 1348 1349 1350
	if (font == NULL) {
		printk(KERN_ERR "vivi: could not find font\n");
		return -ENODEV;
	}
	font8x16 = font->data;

1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361
	if (n_devs <= 0)
		n_devs = 1;

	for (i = 0; i < n_devs; i++) {
		ret = vivi_create_instance(i);
		if (ret) {
			/* If some instantiations succeeded, keep driver */
			if (i)
				ret = 0;
			break;
		}
1362
	}
1363

1364
	if (ret < 0) {
1365
		printk(KERN_ERR "vivi: error %d while loading driver\n", ret);
1366 1367 1368 1369
		return ret;
	}

	printk(KERN_INFO "Video Technology Magazine Virtual Video "
1370 1371
			"Capture Board ver %s successfully loaded.\n",
			VIVI_VERSION);
1372

1373 1374
	/* n_devs will reflect the actual number of allocated devices */
	n_devs = i;
1375

1376 1377 1378 1379 1380
	return ret;
}

static void __exit vivi_exit(void)
{
1381
	vivi_release();
1382 1383 1384 1385
}

module_init(vivi_init);
module_exit(vivi_exit);