vivi.c 31.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
 * 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/
 *
 * 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/delay.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/pci.h>
#include <linux/random.h>
#include <linux/version.h>
28
#include <linux/mutex.h>
29
#include <linux/videodev2.h>
A
Andrew Morton 已提交
30
#include <linux/dma-mapping.h>
31 32 33 34
#ifdef CONFIG_VIDEO_V4L1_COMPAT
/* Include V4L1 specific functions. Should be removed soon */
#include <linux/videodev.h>
#endif
35
#include <linux/interrupt.h>
36 37
#include <linux/kthread.h>
#include <linux/highmem.h>
38
#include <linux/freezer.h>
39 40 41 42
#include <media/videobuf-vmalloc.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
#include "font.h"
43

44
#define VIVI_MODULE_NAME "vivi"
45

46 47 48 49 50 51
/* Wake up at about 30 fps */
#define WAKE_NUMERATOR 30
#define WAKE_DENOMINATOR 1001
#define BUFFER_TIMEOUT     msecs_to_jiffies(500)  /* 0.5 seconds */

#define VIVI_MAJOR_VERSION 0
52
#define VIVI_MINOR_VERSION 6
53
#define VIVI_RELEASE 0
54 55
#define VIVI_VERSION \
	KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
56

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board");
MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
MODULE_LICENSE("Dual BSD/GPL");

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");

77 78 79 80 81 82 83 84 85 86 87 88

/* supported controls */
static struct v4l2_queryctrl vivi_qctrl[] = {
	{
		.id            = V4L2_CID_AUDIO_VOLUME,
		.name          = "Volume",
		.minimum       = 0,
		.maximum       = 65535,
		.step          = 65535/100,
		.default_value = 65535,
		.flags         = 0,
		.type          = V4L2_CTRL_TYPE_INTEGER,
89
	}, {
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
		.id            = V4L2_CID_BRIGHTNESS,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Brightness",
		.minimum       = 0,
		.maximum       = 255,
		.step          = 1,
		.default_value = 127,
		.flags         = 0,
	}, {
		.id            = V4L2_CID_CONTRAST,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Contrast",
		.minimum       = 0,
		.maximum       = 255,
		.step          = 0x1,
		.default_value = 0x10,
		.flags         = 0,
	}, {
		.id            = V4L2_CID_SATURATION,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Saturation",
		.minimum       = 0,
		.maximum       = 255,
		.step          = 0x1,
		.default_value = 127,
		.flags         = 0,
	}, {
		.id            = V4L2_CID_HUE,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Hue",
		.minimum       = -128,
		.maximum       = 127,
		.step          = 0x1,
		.default_value = 0,
		.flags         = 0,
	}
};

static int qctl_regs[ARRAY_SIZE(vivi_qctrl)];

130 131
#define dprintk(dev, level, fmt, arg...) \
	v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
132 133 134 135 136 137 138 139 140 141 142

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

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

143 144 145 146 147 148
static struct vivi_fmt formats[] = {
	{
		.name     = "4:2:2, packed, YUYV",
		.fourcc   = V4L2_PIX_FMT_YUYV,
		.depth    = 16,
	},
149 150 151 152 153
	{
		.name     = "4:2:2, packed, UYVY",
		.fourcc   = V4L2_PIX_FMT_UYVY,
		.depth    = 16,
	},
154 155 156 157 158 159 160 161 162 163
	{
		.name     = "RGB565 (LE)",
		.fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
		.depth    = 16,
	},
	{
		.name     = "RGB565 (BE)",
		.fourcc   = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */
		.depth    = 16,
	},
164 165 166 167 168 169 170 171 172 173
	{
		.name     = "RGB555 (LE)",
		.fourcc   = V4L2_PIX_FMT_RGB555, /* gggbbbbb arrrrrgg */
		.depth    = 16,
	},
	{
		.name     = "RGB555 (BE)",
		.fourcc   = V4L2_PIX_FMT_RGB555X, /* arrrrrgg gggbbbbb */
		.depth    = 16,
	},
174 175
};

176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
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];
}

193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
struct sg_to_addr {
	int pos;
	struct scatterlist *sg;
};

/* buffer for one video frame */
struct vivi_buffer {
	/* common v4l buffer stuff -- must be first */
	struct videobuf_buffer vb;

	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;
221
	struct v4l2_device 	   v4l2_dev;
222

223
	spinlock_t                 slock;
224
	struct mutex		   mutex;
225 226 227 228

	int                        users;

	/* various device info */
229
	struct video_device        *vfd;
230 231 232 233

	struct vivi_dmaqueue       vidq;

	/* Several counters */
234 235
	int                        h, m, s, ms;
	unsigned long              jiffies;
236
	char                       timestr[13];
237 238

	int			   mv_count;	/* Controls bars movement */
239 240 241

	/* Input Number */
	int			   input;
242 243 244 245 246 247 248
};

struct vivi_fh {
	struct vivi_dev            *dev;

	/* video capture */
	struct vivi_fmt            *fmt;
249
	unsigned int               width, height;
250 251 252
	struct videobuf_queue      vb_vidq;

	enum v4l2_buf_type         type;
253
	unsigned char              bars[8][3];
254
	int			   input; 	/* Input Number on bars */
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
};

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

/* Bars and Colors should match positions */

enum colors {
	WHITE,
	AMBAR,
	CYAN,
	GREEN,
	MAGENTA,
	RED,
270 271
	BLUE,
	BLACK,
272 273 274
};

	/* R   G   B */
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
#define COLOR_WHITE	{204, 204, 204}
#define COLOR_AMBAR	{208, 208,   0}
#define COLOR_CIAN	{  0, 206, 206}
#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 {
	u8 bar[8][3];
};

/* 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 */
		{
			COLOR_WHITE,
			COLOR_AMBAR,
			COLOR_CIAN,
			COLOR_GREEN,
			COLOR_MAGENTA,
			COLOR_RED,
			COLOR_BLUE,
			COLOR_BLACK,
		}
	}, {
		{
			COLOR_WHITE,
			COLOR_AMBAR,
			COLOR_BLACK,
			COLOR_WHITE,
			COLOR_AMBAR,
			COLOR_BLACK,
			COLOR_WHITE,
			COLOR_AMBAR,
		}
	}, {
		{
			COLOR_WHITE,
			COLOR_CIAN,
			COLOR_BLACK,
			COLOR_WHITE,
			COLOR_CIAN,
			COLOR_BLACK,
			COLOR_WHITE,
			COLOR_CIAN,
		}
	}, {
		{
			COLOR_WHITE,
			COLOR_GREEN,
			COLOR_BLACK,
			COLOR_WHITE,
			COLOR_GREEN,
			COLOR_BLACK,
			COLOR_WHITE,
			COLOR_GREEN,
		}
	},
336 337
};

338 339
#define NUM_INPUTS ARRAY_SIZE(bars)

340 341
#define TO_Y(r, g, b) \
	(((16829 * r + 33039 * g + 6416 * b  + 32768) >> 16) + 16)
342
/* RGB to  V(Cr) Color transform */
343 344
#define TO_V(r, g, b) \
	(((28784 * r - 24103 * g - 4681 * b  + 32768) >> 16) + 128)
345
/* RGB to  U(Cb) Color transform */
346 347
#define TO_U(r, g, b) \
	(((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
348

349 350 351 352
#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)
353

354 355 356 357 358 359 360 361 362 363 364 365 366
static void gen_twopix(struct vivi_fh *fh, unsigned char *buf, int colorpos)
{
	unsigned char r_y, g_u, b_v;
	unsigned char *p;
	int color;

	r_y = fh->bars[colorpos][0]; /* R or precalculated Y */
	g_u = fh->bars[colorpos][1]; /* G or precalculated U */
	b_v = fh->bars[colorpos][2]; /* B or precalculated V */

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

367 368 369 370 371 372 373 374 375 376 377 378 379 380
		switch (fh->fmt->fourcc) {
		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;
			}
381
			break;
382 383 384 385 386 387 388 389 390 391 392 393 394 395
		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;
396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419
		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;
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
		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;
444 445 446 447 448
		}
	}
}

static void gen_line(struct vivi_fh *fh, char *basep, int inipos, int wmax,
449
		int hmax, int line, int count, char *timestr)
450
{
451
	int  w, i, j;
452
	int pos = inipos;
453 454
	char *s;
	u8 chr;
455 456

	/* We will just duplicate the second pixel at the packet */
457
	wmax /= 2;
458 459

	/* Generate a standard color bar pattern */
460 461
	for (w = 0; w < wmax; w++) {
		int colorpos = ((w + count) * 8/(wmax + 1)) % 8;
462 463 464

		gen_twopix(fh, basep + pos, colorpos);
		pos += 4; /* only 16 bpp supported for now */
465 466
	}

467 468 469
	/* Prints input entry number */

	/* Checks if it is possible to input number */
470
	if (TSTAMP_MAX_Y >= hmax)
471
		goto end;
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489

	if (TSTAMP_INPUT_X + strlen(timestr) >= wmax)
		goto end;

	if (line >= TSTAMP_MIN_Y && line <= TSTAMP_MAX_Y) {
		chr = rom8x16_bits[fh->input * 16 + line - TSTAMP_MIN_Y];
		pos = TSTAMP_INPUT_X;
		for (i = 0; i < 7; i++) {
			/* Draw white font on black background */
			if (chr & 1 << (7 - i))
				gen_twopix(fh, basep + pos, WHITE);
			else
				gen_twopix(fh, basep + pos, BLACK);
			pos += 2;
		}
	}

	/* Checks if it is possible to show timestamp */
490
	if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
491 492 493
		goto end;

	/* Print stream time */
494 495 496 497 498 499
	if (line >= TSTAMP_MIN_Y && line <= TSTAMP_MAX_Y) {
		j = TSTAMP_MIN_X;
		for (s = timestr; *s; s++) {
			chr = rom8x16_bits[(*s-0x30)*16+line-TSTAMP_MIN_Y];
			for (i = 0; i < 7; i++) {
				pos = inipos + j * 2;
500 501 502 503 504
				/* Draw white font on black background */
				if (chr & 1 << (7 - i))
					gen_twopix(fh, basep + pos, WHITE);
				else
					gen_twopix(fh, basep + pos, BLACK);
505 506 507 508 509 510
				j++;
			}
		}
	}

end:
511
	return;
512
}
513

514
static void vivi_fillbuff(struct vivi_fh *fh, struct vivi_buffer *buf)
515
{
516
	struct vivi_dev *dev = fh->dev;
517
	int h , pos = 0;
518 519 520
	int hmax  = buf->vb.height;
	int wmax  = buf->vb.width;
	struct timeval ts;
521
	char *tmpbuf;
522
	void *vbuf = videobuf_to_vmalloc(&buf->vb);
523

524
	if (!vbuf)
525
		return;
526

527 528
	tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
	if (!tmpbuf)
529 530
		return;

531
	for (h = 0; h < hmax; h++) {
532
		gen_line(fh, tmpbuf, 0, wmax, hmax, h, dev->mv_count,
533
			 dev->timestr);
534
		memcpy(vbuf + pos, tmpbuf, wmax * 2);
535 536 537
		pos += wmax*2;
	}

538
	dev->mv_count++;
539

540 541
	kfree(tmpbuf);

542 543
	/* Updates stream time */

544
	dev->ms += jiffies_to_msecs(jiffies-dev->jiffies);
545
	dev->jiffies = jiffies;
546 547
	if (dev->ms >= 1000) {
		dev->ms -= 1000;
548
		dev->s++;
549 550
		if (dev->s >= 60) {
			dev->s -= 60;
551
			dev->m++;
552 553
			if (dev->m > 60) {
				dev->m -= 60;
554
				dev->h++;
555 556
				if (dev->h > 24)
					dev->h -= 24;
557 558 559
			}
		}
	}
560
	sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
561
			dev->h, dev->m, dev->s, dev->ms);
562

563 564
	dprintk(dev, 2, "vivifill at %s: Buffer 0x%08lx size= %d\n",
			dev->timestr, (unsigned long)tmpbuf, pos);
565 566 567 568 569

	/* Advice that buffer was filled */
	buf->vb.field_count++;
	do_gettimeofday(&ts);
	buf->vb.ts = ts;
570
	buf->vb.state = VIDEOBUF_DONE;
571 572
}

573
static void vivi_thread_tick(struct vivi_fh *fh)
574
{
575 576 577
	struct vivi_buffer *buf;
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
578

579
	unsigned long flags = 0;
580

581
	dprintk(dev, 1, "Thread tick\n");
582

583 584 585 586 587
	spin_lock_irqsave(&dev->slock, flags);
	if (list_empty(&dma_q->active)) {
		dprintk(dev, 1, "No active queue to serve\n");
		goto unlock;
	}
588

589 590
	buf = list_entry(dma_q->active.next,
			 struct vivi_buffer, vb.queue);
591

592 593 594
	/* Nobody is waiting on this buffer, return */
	if (!waitqueue_active(&buf->vb.done))
		goto unlock;
595

596
	list_del(&buf->vb.queue);
597

598 599 600
	do_gettimeofday(&buf->vb.ts);

	/* Fill buffer */
601
	vivi_fillbuff(fh, buf);
602 603 604 605 606 607 608
	dprintk(dev, 1, "filled buffer %p\n", buf);

	wake_up(&buf->vb.done);
	dprintk(dev, 2, "[%p/%d] wakeup\n", buf, buf->vb. i);
unlock:
	spin_unlock_irqrestore(&dev->slock, flags);
	return;
609 610
}

611 612 613
#define frames_to_ms(frames)					\
	((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

614
static void vivi_sleep(struct vivi_fh *fh)
615
{
616 617 618
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
	int timeout;
619 620
	DECLARE_WAITQUEUE(wait, current);

621
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
622
		(unsigned long)dma_q);
623 624

	add_wait_queue(&dma_q->wq, &wait);
625 626 627 628
	if (kthread_should_stop())
		goto stop_task;

	/* Calculate time to wake up */
629
	timeout = msecs_to_jiffies(frames_to_ms(1));
630

631
	vivi_thread_tick(fh);
632 633

	schedule_timeout_interruptible(timeout);
634

635
stop_task:
636 637 638 639
	remove_wait_queue(&dma_q->wq, &wait);
	try_to_freeze();
}

640
static int vivi_thread(void *data)
641
{
642 643
	struct vivi_fh  *fh = data;
	struct vivi_dev *dev = fh->dev;
644

645
	dprintk(dev, 1, "thread started\n");
646

647
	set_freezable();
648

649
	for (;;) {
650
		vivi_sleep(fh);
651 652 653 654

		if (kthread_should_stop())
			break;
	}
655
	dprintk(dev, 1, "thread: exit\n");
656 657 658
	return 0;
}

659
static int vivi_start_thread(struct vivi_fh *fh)
660
{
661 662
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
663

664 665
	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
666

667
	dprintk(dev, 1, "%s\n", __func__);
668

669
	dma_q->kthread = kthread_run(vivi_thread, fh, "vivi");
670

671
	if (IS_ERR(dma_q->kthread)) {
672
		v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n");
673
		return PTR_ERR(dma_q->kthread);
674
	}
675 676 677
	/* Wakes thread */
	wake_up_interruptible(&dma_q->wq);

678
	dprintk(dev, 1, "returning from %s\n", __func__);
679 680 681
	return 0;
}

682
static void vivi_stop_thread(struct vivi_dmaqueue  *dma_q)
683
{
684 685
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);

686
	dprintk(dev, 1, "%s\n", __func__);
687 688 689
	/* shutdown control thread */
	if (dma_q->kthread) {
		kthread_stop(dma_q->kthread);
690
		dma_q->kthread = NULL;
691 692 693 694 695 696 697 698 699
	}
}

/* ------------------------------------------------------------------
	Videobuf operations
   ------------------------------------------------------------------*/
static int
buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
{
700 701
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;
702 703 704 705 706

	*size = fh->width*fh->height*2;

	if (0 == *count)
		*count = 32;
707

708 709
	while (*size * *count > vid_limit * 1024 * 1024)
		(*count)--;
710

711
	dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
712
		*count, *size);
713

714 715 716
	return 0;
}

717
static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
718
{
719 720 721
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;

722
	dprintk(dev, 1, "%s, state: %i\n", __func__, buf->vb.state);
723 724 725 726

	if (in_interrupt())
		BUG();

727
	videobuf_vmalloc_free(&buf->vb);
728
	dprintk(dev, 1, "free_buffer: freed\n");
729
	buf->vb.state = VIDEOBUF_NEEDS_INIT;
730 731 732 733 734 735 736 737 738
}

#define norm_maxw() 1024
#define norm_maxh() 768
static int
buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
						enum v4l2_field field)
{
	struct vivi_fh     *fh  = vq->priv_data;
739
	struct vivi_dev    *dev = fh->dev;
740
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
741
	int rc;
742

743
	dprintk(dev, 1, "%s, field=%d\n", __func__, field);
744 745

	BUG_ON(NULL == fh->fmt);
746

747 748 749
	if (fh->width  < 48 || fh->width  > norm_maxw() ||
	    fh->height < 32 || fh->height > norm_maxh())
		return -EINVAL;
750

751 752 753 754
	buf->vb.size = fh->width*fh->height*2;
	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

755 756 757 758 759
	/* These properties only change when queue is idle, see s_fmt */
	buf->fmt       = fh->fmt;
	buf->vb.width  = fh->width;
	buf->vb.height = fh->height;
	buf->vb.field  = field;
760

761
	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
762 763
		rc = videobuf_iolock(vq, &buf->vb, NULL);
		if (rc < 0)
764 765 766
			goto fail;
	}

767
	buf->vb.state = VIDEOBUF_PREPARED;
768 769 770 771

	return 0;

fail:
772
	free_buffer(vq, buf);
773 774 775 776 777 778
	return rc;
}

static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
779 780 781
	struct vivi_buffer    *buf  = container_of(vb, struct vivi_buffer, vb);
	struct vivi_fh        *fh   = vq->priv_data;
	struct vivi_dev       *dev  = fh->dev;
782 783
	struct vivi_dmaqueue *vidq = &dev->vidq;

784
	dprintk(dev, 1, "%s\n", __func__);
785 786 787

	buf->vb.state = VIDEOBUF_QUEUED;
	list_add_tail(&buf->vb.queue, &vidq->active);
788 789
}

790 791
static void buffer_release(struct videobuf_queue *vq,
			   struct videobuf_buffer *vb)
792
{
793
	struct vivi_buffer   *buf  = container_of(vb, struct vivi_buffer, vb);
794
	struct vivi_fh       *fh   = vq->priv_data;
795
	struct vivi_dev      *dev  = (struct vivi_dev *)fh->dev;
796

797
	dprintk(dev, 1, "%s\n", __func__);
798

799
	free_buffer(vq, buf);
800 801 802 803 804 805 806 807 808
}

static struct videobuf_queue_ops vivi_video_qops = {
	.buf_setup      = buffer_setup,
	.buf_prepare    = buffer_prepare,
	.buf_queue      = buffer_queue,
	.buf_release    = buffer_release,
};

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

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

828
static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
829 830
					struct v4l2_fmtdesc *f)
{
831 832 833
	struct vivi_fmt *fmt;

	if (f->index >= ARRAY_SIZE(formats))
834 835
		return -EINVAL;

836 837 838 839
	fmt = &formats[f->index];

	strlcpy(f->description, fmt->name, sizeof(f->description));
	f->pixelformat = fmt->fourcc;
840 841 842
	return 0;
}

843
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
844 845
					struct v4l2_format *f)
{
846
	struct vivi_fh *fh = priv;
847 848 849 850 851 852 853 854 855 856 857 858 859

	f->fmt.pix.width        = fh->width;
	f->fmt.pix.height       = fh->height;
	f->fmt.pix.field        = fh->vb_vidq.field;
	f->fmt.pix.pixelformat  = fh->fmt->fourcc;
	f->fmt.pix.bytesperline =
		(f->fmt.pix.width * fh->fmt->depth) >> 3;
	f->fmt.pix.sizeimage =
		f->fmt.pix.height * f->fmt.pix.bytesperline;

	return (0);
}

860
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
861 862
			struct v4l2_format *f)
{
863 864
	struct vivi_fh  *fh  = priv;
	struct vivi_dev *dev = fh->dev;
865 866 867 868
	struct vivi_fmt *fmt;
	enum v4l2_field field;
	unsigned int maxw, maxh;

869 870 871 872
	fmt = get_format(f);
	if (!fmt) {
		dprintk(dev, 1, "Fourcc format (0x%08x) invalid.\n",
			f->fmt.pix.pixelformat);
873 874 875 876 877 878
		return -EINVAL;
	}

	field = f->fmt.pix.field;

	if (field == V4L2_FIELD_ANY) {
879
		field = V4L2_FIELD_INTERLACED;
880
	} else if (V4L2_FIELD_INTERLACED != field) {
881
		dprintk(dev, 1, "Field type invalid.\n");
882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
		return -EINVAL;
	}

	maxw  = norm_maxw();
	maxh  = norm_maxh();

	f->fmt.pix.field = field;
	if (f->fmt.pix.height < 32)
		f->fmt.pix.height = 32;
	if (f->fmt.pix.height > maxh)
		f->fmt.pix.height = maxh;
	if (f->fmt.pix.width < 48)
		f->fmt.pix.width = 48;
	if (f->fmt.pix.width > maxw)
		f->fmt.pix.width = maxw;
	f->fmt.pix.width &= ~0x03;
	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;
}

906 907
/* precalculate color bar values to speed up rendering */
static void precalculate_bars(struct vivi_fh *fh)
908
{
909
	struct vivi_dev *dev = fh->dev;
910
	unsigned char r, g, b;
911
	int k, is_yuv;
912

913
	fh->input = dev->input;
914

915
	for (k = 0; k < 8; k++) {
916 917 918
		r = bars[fh->input].bar[k][0];
		g = bars[fh->input].bar[k][1];
		b = bars[fh->input].bar[k][2];
919
		is_yuv = 0;
920

921 922
		switch (fh->fmt->fourcc) {
		case V4L2_PIX_FMT_YUYV:
923
		case V4L2_PIX_FMT_UYVY:
924 925
			is_yuv = 1;
			break;
926 927 928 929 930 931
		case V4L2_PIX_FMT_RGB565:
		case V4L2_PIX_FMT_RGB565X:
			r >>= 3;
			g >>= 2;
			b >>= 3;
			break;
932 933 934 935 936 937
		case V4L2_PIX_FMT_RGB555:
		case V4L2_PIX_FMT_RGB555X:
			r >>= 3;
			g >>= 3;
			b >>= 3;
			break;
938 939 940 941 942 943 944 945 946 947 948
		}

		if (is_yuv) {
			fh->bars[k][0] = TO_Y(r, g, b);	/* Luma */
			fh->bars[k][1] = TO_U(r, g, b);	/* Cb */
			fh->bars[k][2] = TO_V(r, g, b);	/* Cr */
		} else {
			fh->bars[k][0] = r;
			fh->bars[k][1] = g;
			fh->bars[k][2] = b;
		}
949 950
	}

951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979
}

/*FIXME: This seems to be generic enough to be at videodev2 */
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
					struct v4l2_format *f)
{
	struct vivi_fh *fh = priv;
	struct videobuf_queue *q = &fh->vb_vidq;

	int ret = vidioc_try_fmt_vid_cap(file, fh, f);
	if (ret < 0)
		return ret;

	mutex_lock(&q->vb_lock);

	if (videobuf_queue_is_busy(&fh->vb_vidq)) {
		dprintk(fh->dev, 1, "%s queue busy\n", __func__);
		ret = -EBUSY;
		goto out;
	}

	fh->fmt           = get_format(f);
	fh->width         = f->fmt.pix.width;
	fh->height        = f->fmt.pix.height;
	fh->vb_vidq.field = f->fmt.pix.field;
	fh->type          = f->type;

	precalculate_bars(fh);

980 981 982 983
	ret = 0;
out:
	mutex_unlock(&q->vb_lock);

984
	return ret;
985 986
}

987 988
static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *p)
989
{
990
	struct vivi_fh  *fh = priv;
991

992
	return (videobuf_reqbufs(&fh->vb_vidq, p));
993 994
}

995
static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
996
{
997
	struct vivi_fh  *fh = priv;
998

999 1000
	return (videobuf_querybuf(&fh->vb_vidq, p));
}
1001

1002
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1003
{
1004
	struct vivi_fh *fh = priv;
1005

1006 1007
	return (videobuf_qbuf(&fh->vb_vidq, p));
}
1008

1009
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1010
{
1011
	struct vivi_fh  *fh = priv;
1012

1013 1014 1015
	return (videobuf_dqbuf(&fh->vb_vidq, p,
				file->f_flags & O_NONBLOCK));
}
1016

1017
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1018
static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1019
{
1020
	struct vivi_fh  *fh = priv;
1021

1022
	return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1023 1024
}
#endif
1025

1026
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
1027
{
1028
	struct vivi_fh  *fh = priv;
1029

1030 1031 1032 1033
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
1034

1035
	return videobuf_streamon(&fh->vb_vidq);
1036
}
1037

1038
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
1039
{
1040
	struct vivi_fh  *fh = priv;
1041

1042 1043 1044 1045
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
1046

1047
	return videobuf_streamoff(&fh->vb_vidq);
1048 1049
}

1050
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
1051 1052 1053
{
	return 0;
}
1054

1055
/* only one input in this sample driver */
1056
static int vidioc_enum_input(struct file *file, void *priv,
1057 1058
				struct v4l2_input *inp)
{
1059
	if (inp->index >= NUM_INPUTS)
1060
		return -EINVAL;
1061

1062
	inp->type = V4L2_INPUT_TYPE_CAMERA;
1063
	inp->std = V4L2_STD_525_60;
1064
	sprintf(inp->name, "Camera %u", inp->index);
1065

1066 1067
	return (0);
}
1068

1069
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1070
{
1071 1072 1073 1074
	struct vivi_fh *fh = priv;
	struct vivi_dev *dev = fh->dev;

	*i = dev->input;
1075

1076 1077
	return (0);
}
1078
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1079
{
1080 1081 1082 1083
	struct vivi_fh *fh = priv;
	struct vivi_dev *dev = fh->dev;

	if (i >= NUM_INPUTS)
1084
		return -EINVAL;
1085

1086 1087 1088
	dev->input = i;
	precalculate_bars(fh);

1089 1090
	return (0);
}
1091 1092

	/* --- controls ---------------------------------------------- */
1093 1094
static int vidioc_queryctrl(struct file *file, void *priv,
			    struct v4l2_queryctrl *qc)
1095 1096
{
	int i;
1097

1098 1099 1100 1101 1102 1103
	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (qc->id && qc->id == vivi_qctrl[i].id) {
			memcpy(qc, &(vivi_qctrl[i]),
				sizeof(*qc));
			return (0);
		}
1104

1105 1106
	return -EINVAL;
}
1107

1108 1109
static int vidioc_g_ctrl(struct file *file, void *priv,
			 struct v4l2_control *ctrl)
1110 1111
{
	int i;
1112

1113 1114
	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (ctrl->id == vivi_qctrl[i].id) {
1115
			ctrl->value = qctl_regs[i];
1116 1117
			return (0);
		}
1118

1119
	return -EINVAL;
1120
}
1121
static int vidioc_s_ctrl(struct file *file, void *priv,
1122
				struct v4l2_control *ctrl)
1123
{
1124 1125 1126 1127
	int i;

	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (ctrl->id == vivi_qctrl[i].id) {
1128 1129
			if (ctrl->value < vivi_qctrl[i].minimum
			    || ctrl->value > vivi_qctrl[i].maximum) {
1130 1131
					return (-ERANGE);
				}
1132
			qctl_regs[i] = ctrl->value;
1133 1134 1135
			return (0);
		}
	return -EINVAL;
1136 1137 1138 1139 1140 1141
}

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

1142
static int vivi_open(struct file *file)
1143
{
1144
	struct vivi_dev *dev = video_drvdata(file);
1145
	struct vivi_fh *fh = NULL;
1146
	int i;
1147
	int retval = 0;
1148

1149
	mutex_lock(&dev->mutex);
1150 1151
	dev->users++;

1152 1153
	if (dev->users > 1) {
		dev->users--;
1154 1155
		mutex_unlock(&dev->mutex);
		return -EBUSY;
1156 1157
	}

1158
	dprintk(dev, 1, "open /dev/video%d type=%s users=%d\n", dev->vfd->num,
1159
		v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
1160 1161

	/* allocate + initialize per filehandle data */
1162
	fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1163 1164
	if (NULL == fh) {
		dev->users--;
1165
		retval = -ENOMEM;
1166
	}
1167
	mutex_unlock(&dev->mutex);
1168 1169

	if (retval)
1170
		return retval;
1171 1172 1173

	file->private_data = fh;
	fh->dev      = dev;
1174

1175
	fh->type     = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1176
	fh->fmt      = &formats[0];
1177 1178 1179 1180 1181
	fh->width    = 640;
	fh->height   = 480;

	/* Put all controls at a sane state */
	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
1182
		qctl_regs[i] = vivi_qctrl[i].default_value;
1183 1184

	/* Resets frame counters */
1185 1186 1187
	dev->h = 0;
	dev->m = 0;
	dev->s = 0;
1188
	dev->ms = 0;
1189 1190 1191
	dev->mv_count = 0;
	dev->jiffies = jiffies;
	sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
1192
			dev->h, dev->m, dev->s, dev->ms);
1193

1194
	videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
1195
			NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
1196
			sizeof(struct vivi_buffer), fh);
1197

1198 1199
	vivi_start_thread(fh);

1200 1201 1202 1203 1204 1205
	return 0;
}

static ssize_t
vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
{
1206
	struct vivi_fh *fh = file->private_data;
1207

1208
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1209
		return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
1210 1211 1212 1213 1214 1215 1216 1217
					file->f_flags & O_NONBLOCK);
	}
	return 0;
}

static unsigned int
vivi_poll(struct file *file, struct poll_table_struct *wait)
{
1218
	struct vivi_fh        *fh = file->private_data;
1219
	struct vivi_dev       *dev = fh->dev;
1220
	struct videobuf_queue *q = &fh->vb_vidq;
1221

1222
	dprintk(dev, 1, "%s\n", __func__);
1223 1224 1225 1226

	if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
		return POLLERR;

1227
	return videobuf_poll_stream(file, q, wait);
1228 1229
}

1230
static int vivi_close(struct file *file)
1231
{
1232 1233
	struct vivi_fh         *fh = file->private_data;
	struct vivi_dev *dev       = fh->dev;
1234 1235
	struct vivi_dmaqueue *vidq = &dev->vidq;

1236
	int minor = video_devdata(file)->minor;
1237 1238

	vivi_stop_thread(vidq);
1239
	videobuf_stop(&fh->vb_vidq);
1240 1241
	videobuf_mmap_free(&fh->vb_vidq);

1242
	kfree(fh);
1243

1244
	mutex_lock(&dev->mutex);
1245
	dev->users--;
1246
	mutex_unlock(&dev->mutex);
1247

1248 1249
	dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
		minor, dev->users);
1250 1251 1252 1253

	return 0;
}

1254
static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1255
{
1256 1257
	struct vivi_fh  *fh = file->private_data;
	struct vivi_dev *dev = fh->dev;
1258 1259
	int ret;

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

1262
	ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1263

1264
	dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1265 1266 1267 1268 1269 1270 1271
		(unsigned long)vma->vm_start,
		(unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
		ret);

	return ret;
}

1272
static const struct v4l2_file_operations vivi_fops = {
1273 1274
	.owner		= THIS_MODULE,
	.open           = vivi_open,
1275
	.release        = vivi_close,
1276 1277
	.read           = vivi_read,
	.poll		= vivi_poll,
1278
	.ioctl          = video_ioctl2, /* V4L2 ioctl handler */
1279
	.mmap           = vivi_mmap,
1280 1281
};

1282
static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
1283
	.vidioc_querycap      = vidioc_querycap,
1284 1285 1286 1287
	.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,
1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
	.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,
	.vidioc_queryctrl     = vidioc_queryctrl,
	.vidioc_g_ctrl        = vidioc_g_ctrl,
	.vidioc_s_ctrl        = vidioc_s_ctrl,
	.vidioc_streamon      = vidioc_streamon,
	.vidioc_streamoff     = vidioc_streamoff,
1301
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1302 1303
	.vidiocgmbuf          = vidiocgmbuf,
#endif
1304 1305 1306 1307 1308 1309 1310 1311 1312
};

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

1313
	.tvnorms              = V4L2_STD_525_60,
1314
	.current_norm         = V4L2_STD_NTSC_M,
1315
};
1316

1317
/* -----------------------------------------------------------------
1318 1319 1320
	Initialization and module stuff
   ------------------------------------------------------------------*/

1321 1322 1323 1324
static int vivi_release(void)
{
	struct vivi_dev *dev;
	struct list_head *list;
1325

1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341
	while (!list_empty(&vivi_devlist)) {
		list = vivi_devlist.next;
		list_del(list);
		dev = list_entry(list, struct vivi_dev, vivi_devlist);

		v4l2_info(&dev->v4l2_dev, "unregistering /dev/video%d\n",
			dev->vfd->num);
		video_unregister_device(dev->vfd);
		v4l2_device_unregister(&dev->v4l2_dev);
		kfree(dev);
	}

	return 0;
}

static int __init vivi_create_instance(int i)
1342 1343
{
	struct vivi_dev *dev;
1344
	struct video_device *vfd;
1345
	int ret;
1346

1347 1348 1349
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev)
		return -ENOMEM;
1350

1351 1352 1353 1354 1355
	snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
			"%s-%03d", VIVI_MODULE_NAME, i);
	ret = v4l2_device_register(NULL, &dev->v4l2_dev);
	if (ret)
		goto free_dev;
1356

1357 1358 1359
	/* init video dma queues */
	INIT_LIST_HEAD(&dev->vidq.active);
	init_waitqueue_head(&dev->vidq.wq);
1360

1361 1362 1363
	/* initialize locks */
	spin_lock_init(&dev->slock);
	mutex_init(&dev->mutex);
1364

1365 1366 1367 1368
	ret = -ENOMEM;
	vfd = video_device_alloc();
	if (!vfd)
		goto unreg_dev;
1369

1370
	*vfd = vivi_template;
1371

1372 1373 1374
	ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
	if (ret < 0)
		goto rel_vdev;
1375

1376
	video_set_drvdata(vfd, dev);
1377

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

1381 1382
	snprintf(vfd->name, sizeof(vfd->name), "%s (%i)",
			vivi_template.name, vfd->num);
1383

1384 1385
	if (video_nr >= 0)
		video_nr++;
1386

1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
	dev->vfd = vfd;
	v4l2_info(&dev->v4l2_dev, "V4L2 device registered as /dev/video%d\n",
			vfd->num);
	return 0;

rel_vdev:
	video_device_release(vfd);
unreg_dev:
	v4l2_device_unregister(&dev->v4l2_dev);
free_dev:
	kfree(dev);
	return ret;
}
1400

1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
/* 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)
{
	int ret, i;

	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;
		}
1422
	}
1423

1424 1425
	if (ret < 0) {
		printk(KERN_INFO "Error %d while loading vivi driver\n", ret);
1426 1427 1428 1429
		return ret;
	}

	printk(KERN_INFO "Video Technology Magazine Virtual Video "
1430 1431 1432
			"Capture Board ver %u.%u.%u successfully loaded.\n",
			(VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF,
			VIVI_VERSION & 0xFF);
1433

1434 1435
	/* n_devs will reflect the actual number of allocated devices */
	n_devs = i;
1436

1437 1438 1439 1440 1441
	return ret;
}

static void __exit vivi_exit(void)
{
1442
	vivi_release();
1443 1444 1445 1446
}

module_init(vivi_init);
module_exit(vivi_exit);