vivi.c 32.0 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
#include <linux/interrupt.h>
32 33
#include <linux/kthread.h>
#include <linux/highmem.h>
34
#include <linux/freezer.h>
35 36 37 38
#include <media/videobuf-vmalloc.h>
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
#include "font.h"
39

40
#define VIVI_MODULE_NAME "vivi"
41

42 43 44 45 46 47
/* 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
48
#define VIVI_MINOR_VERSION 6
49
#define VIVI_RELEASE 0
50 51
#define VIVI_VERSION \
	KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
52

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
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");

73 74 75 76 77 78 79 80 81 82

/* 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,
83
		.flags         = V4L2_CTRL_FLAG_SLIDER,
84
		.type          = V4L2_CTRL_TYPE_INTEGER,
85
	}, {
86 87 88 89 90 91 92
		.id            = V4L2_CID_BRIGHTNESS,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Brightness",
		.minimum       = 0,
		.maximum       = 255,
		.step          = 1,
		.default_value = 127,
93
		.flags         = V4L2_CTRL_FLAG_SLIDER,
94 95 96 97 98 99 100 101
	}, {
		.id            = V4L2_CID_CONTRAST,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Contrast",
		.minimum       = 0,
		.maximum       = 255,
		.step          = 0x1,
		.default_value = 0x10,
102
		.flags         = V4L2_CTRL_FLAG_SLIDER,
103 104 105 106 107 108 109 110
	}, {
		.id            = V4L2_CID_SATURATION,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Saturation",
		.minimum       = 0,
		.maximum       = 255,
		.step          = 0x1,
		.default_value = 127,
111
		.flags         = V4L2_CTRL_FLAG_SLIDER,
112 113 114 115 116 117 118 119
	}, {
		.id            = V4L2_CID_HUE,
		.type          = V4L2_CTRL_TYPE_INTEGER,
		.name          = "Hue",
		.minimum       = -128,
		.maximum       = 127,
		.step          = 0x1,
		.default_value = 0,
120
		.flags         = V4L2_CTRL_FLAG_SLIDER,
121 122 123
	}
};

124 125
#define dprintk(dev, level, fmt, arg...) \
	v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
126 127 128 129 130 131 132 133 134 135 136

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

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

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

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
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];
}

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
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;
215
	struct v4l2_device 	   v4l2_dev;
216

217
	spinlock_t                 slock;
218
	struct mutex		   mutex;
219 220 221 222

	int                        users;

	/* various device info */
223
	struct video_device        *vfd;
224 225 226 227

	struct vivi_dmaqueue       vidq;

	/* Several counters */
228 229
	int                        h, m, s, ms;
	unsigned long              jiffies;
230
	char                       timestr[13];
231 232

	int			   mv_count;	/* Controls bars movement */
233 234 235

	/* Input Number */
	int			   input;
236 237 238

	/* Control 'registers' */
	int 			   qctl_regs[ARRAY_SIZE(vivi_qctrl)];
239 240 241 242 243 244 245
};

struct vivi_fh {
	struct vivi_dev            *dev;

	/* video capture */
	struct vivi_fmt            *fmt;
246
	unsigned int               width, height;
247 248 249
	struct videobuf_queue      vb_vidq;

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

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

/* Bars and Colors should match positions */

enum colors {
	WHITE,
	AMBAR,
	CYAN,
	GREEN,
	MAGENTA,
	RED,
267 268
	BLUE,
	BLACK,
269 270 271
};

	/* R   G   B */
272 273 274 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
#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,
		}
	},
333 334
};

335 336
#define NUM_INPUTS ARRAY_SIZE(bars)

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

346 347 348 349
#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)
350

351 352 353 354 355 356 357 358 359 360 361 362 363
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;

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

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

	/* We will just duplicate the second pixel at the packet */
454
	wmax /= 2;
455 456

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

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

464 465 466
	/* Prints input entry number */

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

	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 */
487
	if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
488 489 490
		goto end;

	/* Print stream time */
491 492 493 494 495 496
	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;
497 498 499 500 501
				/* Draw white font on black background */
				if (chr & 1 << (7 - i))
					gen_twopix(fh, basep + pos, WHITE);
				else
					gen_twopix(fh, basep + pos, BLACK);
502 503 504 505 506 507
				j++;
			}
		}
	}

end:
508
	return;
509
}
510

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

521
	if (!vbuf)
522
		return;
523

524 525
	tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
	if (!tmpbuf)
526 527
		return;

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

535
	dev->mv_count++;
536

537 538
	kfree(tmpbuf);

539 540
	/* Updates stream time */

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

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

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

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

576
	unsigned long flags = 0;
577

578
	dprintk(dev, 1, "Thread tick\n");
579

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

586 587
	buf = list_entry(dma_q->active.next,
			 struct vivi_buffer, vb.queue);
588

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

593
	list_del(&buf->vb.queue);
594

595 596 597
	do_gettimeofday(&buf->vb.ts);

	/* Fill buffer */
598
	vivi_fillbuff(fh, buf);
599 600 601 602 603 604 605
	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;
606 607
}

608 609 610
#define frames_to_ms(frames)					\
	((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

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

618
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
619
		(unsigned long)dma_q);
620 621

	add_wait_queue(&dma_q->wq, &wait);
622 623 624 625
	if (kthread_should_stop())
		goto stop_task;

	/* Calculate time to wake up */
626
	timeout = msecs_to_jiffies(frames_to_ms(1));
627

628
	vivi_thread_tick(fh);
629 630

	schedule_timeout_interruptible(timeout);
631

632
stop_task:
633 634 635 636
	remove_wait_queue(&dma_q->wq, &wait);
	try_to_freeze();
}

637
static int vivi_thread(void *data)
638
{
639 640
	struct vivi_fh  *fh = data;
	struct vivi_dev *dev = fh->dev;
641

642
	dprintk(dev, 1, "thread started\n");
643

644
	set_freezable();
645

646
	for (;;) {
647
		vivi_sleep(fh);
648 649 650 651

		if (kthread_should_stop())
			break;
	}
652
	dprintk(dev, 1, "thread: exit\n");
653 654 655
	return 0;
}

656
static int vivi_start_thread(struct vivi_fh *fh)
657
{
658 659
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
660

661 662
	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
663

664
	dprintk(dev, 1, "%s\n", __func__);
665

666
	dma_q->kthread = kthread_run(vivi_thread, fh, "vivi");
667

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

675
	dprintk(dev, 1, "returning from %s\n", __func__);
676 677 678
	return 0;
}

679
static void vivi_stop_thread(struct vivi_dmaqueue  *dma_q)
680
{
681 682
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);

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

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

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

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

705 706
	while (*size * *count > vid_limit * 1024 * 1024)
		(*count)--;
707

708
	dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
709
		*count, *size);
710

711 712 713
	return 0;
}

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

719
	dprintk(dev, 1, "%s, state: %i\n", __func__, buf->vb.state);
720 721 722 723

	if (in_interrupt())
		BUG();

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

#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;
736
	struct vivi_dev    *dev = fh->dev;
737
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
738
	int rc;
739

740
	dprintk(dev, 1, "%s, field=%d\n", __func__, field);
741 742

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

744 745 746
	if (fh->width  < 48 || fh->width  > norm_maxw() ||
	    fh->height < 32 || fh->height > norm_maxh())
		return -EINVAL;
747

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

752 753 754 755 756
	/* 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;
757

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

764
	buf->vb.state = VIDEOBUF_PREPARED;
765 766 767 768

	return 0;

fail:
769
	free_buffer(vq, buf);
770 771 772 773 774 775
	return rc;
}

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

781
	dprintk(dev, 1, "%s\n", __func__);
782 783 784

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

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

794
	dprintk(dev, 1, "%s\n", __func__);
795

796
	free_buffer(vq, buf);
797 798 799 800 801 802 803 804 805
}

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

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

815 816
	strcpy(cap->driver, "vivi");
	strcpy(cap->card, "vivi");
817
	strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
818 819 820 821 822 823 824
	cap->version = VIVI_VERSION;
	cap->capabilities =	V4L2_CAP_VIDEO_CAPTURE |
				V4L2_CAP_STREAMING     |
				V4L2_CAP_READWRITE;
	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_fh *fh = priv;
844 845 846 847 848 849 850 851 852 853 854 855 856

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

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

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

	field = f->fmt.pix.field;

	if (field == V4L2_FIELD_ANY) {
876
		field = V4L2_FIELD_INTERLACED;
877
	} else if (V4L2_FIELD_INTERLACED != field) {
878
		dprintk(dev, 1, "Field type invalid.\n");
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902
		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;
}

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

910
	fh->input = dev->input;
911

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

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

		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;
		}
946 947
	}

948 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
}

/*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);

977 978 979 980
	ret = 0;
out:
	mutex_unlock(&q->vb_lock);

981
	return ret;
982 983
}

984 985
static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *p)
986
{
987
	struct vivi_fh  *fh = priv;
988

989
	return (videobuf_reqbufs(&fh->vb_vidq, p));
990 991
}

992
static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
993
{
994
	struct vivi_fh  *fh = priv;
995

996 997
	return (videobuf_querybuf(&fh->vb_vidq, p));
}
998

999
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1000
{
1001
	struct vivi_fh *fh = priv;
1002

1003 1004
	return (videobuf_qbuf(&fh->vb_vidq, p));
}
1005

1006
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1007
{
1008
	struct vivi_fh  *fh = priv;
1009

1010 1011 1012
	return (videobuf_dqbuf(&fh->vb_vidq, p,
				file->f_flags & O_NONBLOCK));
}
1013

1014
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1015
static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1016
{
1017
	struct vivi_fh  *fh = priv;
1018

1019
	return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1020 1021
}
#endif
1022

1023
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
1024
{
1025
	struct vivi_fh  *fh = priv;
1026

1027 1028 1029 1030
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
1031

1032
	return videobuf_streamon(&fh->vb_vidq);
1033
}
1034

1035
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
1036
{
1037
	struct vivi_fh  *fh = priv;
1038

1039 1040 1041 1042
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
1043

1044
	return videobuf_streamoff(&fh->vb_vidq);
1045 1046
}

1047
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
1048 1049 1050
{
	return 0;
}
1051

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

1059
	inp->type = V4L2_INPUT_TYPE_CAMERA;
1060
	inp->std = V4L2_STD_525_60;
1061
	sprintf(inp->name, "Camera %u", inp->index);
1062

1063 1064
	return (0);
}
1065

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

	*i = dev->input;
1072

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

	if (i >= NUM_INPUTS)
1081
		return -EINVAL;
1082

1083 1084 1085
	dev->input = i;
	precalculate_bars(fh);

1086 1087
	return (0);
}
1088 1089

	/* --- controls ---------------------------------------------- */
1090 1091
static int vidioc_queryctrl(struct file *file, void *priv,
			    struct v4l2_queryctrl *qc)
1092 1093
{
	int i;
1094

1095 1096 1097 1098 1099 1100
	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);
		}
1101

1102 1103
	return -EINVAL;
}
1104

1105 1106
static int vidioc_g_ctrl(struct file *file, void *priv,
			 struct v4l2_control *ctrl)
1107
{
1108 1109
	struct vivi_fh *fh = priv;
	struct vivi_dev *dev = fh->dev;
1110
	int i;
1111

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

1118
	return -EINVAL;
1119
}
1120
static int vidioc_s_ctrl(struct file *file, void *priv,
1121
				struct v4l2_control *ctrl)
1122
{
1123 1124
	struct vivi_fh *fh = priv;
	struct vivi_dev *dev = fh->dev;
1125 1126 1127 1128
	int i;

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

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

1143
static int vivi_open(struct file *file)
1144
{
1145
	struct vivi_dev *dev = video_drvdata(file);
1146
	struct vivi_fh *fh = NULL;
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
	fh->width    = 640;
	fh->height   = 480;

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

1190
	videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
1191
			NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
1192
			sizeof(struct vivi_buffer), fh);
1193

1194 1195
	vivi_start_thread(fh);

1196 1197 1198 1199 1200 1201
	return 0;
}

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

1204
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1205
		return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
1206 1207 1208 1209 1210 1211 1212 1213
					file->f_flags & O_NONBLOCK);
	}
	return 0;
}

static unsigned int
vivi_poll(struct file *file, struct poll_table_struct *wait)
{
1214
	struct vivi_fh        *fh = file->private_data;
1215
	struct vivi_dev       *dev = fh->dev;
1216
	struct videobuf_queue *q = &fh->vb_vidq;
1217

1218
	dprintk(dev, 1, "%s\n", __func__);
1219 1220 1221 1222

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

1223
	return videobuf_poll_stream(file, q, wait);
1224 1225
}

1226
static int vivi_close(struct file *file)
1227
{
1228 1229
	struct vivi_fh         *fh = file->private_data;
	struct vivi_dev *dev       = fh->dev;
1230 1231
	struct vivi_dmaqueue *vidq = &dev->vidq;

1232
	int minor = video_devdata(file)->minor;
1233 1234

	vivi_stop_thread(vidq);
1235
	videobuf_stop(&fh->vb_vidq);
1236 1237
	videobuf_mmap_free(&fh->vb_vidq);

1238
	kfree(fh);
1239

1240
	mutex_lock(&dev->mutex);
1241
	dev->users--;
1242
	mutex_unlock(&dev->mutex);
1243

1244 1245
	dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
		minor, dev->users);
1246 1247 1248 1249

	return 0;
}

1250
static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1251
{
1252 1253
	struct vivi_fh  *fh = file->private_data;
	struct vivi_dev *dev = fh->dev;
1254 1255
	int ret;

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

1258
	ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1259

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

	return ret;
}

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

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

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

1309
	.tvnorms              = V4L2_STD_525_60,
1310
	.current_norm         = V4L2_STD_NTSC_M,
1311
};
1312

1313
/* -----------------------------------------------------------------
1314 1315 1316
	Initialization and module stuff
   ------------------------------------------------------------------*/

1317 1318 1319 1320
static int vivi_release(void)
{
	struct vivi_dev *dev;
	struct list_head *list;
1321

1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336
	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;
}

1337
static int __init vivi_create_instance(int inst)
1338 1339
{
	struct vivi_dev *dev;
1340
	struct video_device *vfd;
1341
	int ret, i;
1342

1343 1344 1345
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev)
		return -ENOMEM;
1346

1347
	snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
1348
			"%s-%03d", VIVI_MODULE_NAME, inst);
1349 1350 1351
	ret = v4l2_device_register(NULL, &dev->v4l2_dev);
	if (ret)
		goto free_dev;
1352

1353 1354 1355
	/* init video dma queues */
	INIT_LIST_HEAD(&dev->vidq.active);
	init_waitqueue_head(&dev->vidq.wq);
1356

1357 1358 1359
	/* initialize locks */
	spin_lock_init(&dev->slock);
	mutex_init(&dev->mutex);
1360

1361 1362 1363 1364
	ret = -ENOMEM;
	vfd = video_device_alloc();
	if (!vfd)
		goto unreg_dev;
1365

1366
	*vfd = vivi_template;
1367

1368 1369 1370
	ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
	if (ret < 0)
		goto rel_vdev;
1371

1372
	video_set_drvdata(vfd, dev);
1373

1374 1375 1376 1377
	/* Set all controls to their default value. */
	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		dev->qctl_regs[i] = vivi_qctrl[i].default_value;

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
/* 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)
{
1409
	int ret = 0, i;
1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421

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