vivi.c 28.2 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
#include <media/videobuf-vmalloc.h>
37
#include <media/v4l2-common.h>
38
#include <media/v4l2-ioctl.h>
39 40
#include <linux/kthread.h>
#include <linux/highmem.h>
41
#include <linux/freezer.h>
42

43
#define VIVI_MODULE_NAME "vivi"
44

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

#include "font.h"

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

58 59 60
/* Declare static vars that will be used as parameters */
static unsigned int vid_limit = 16;	/* Video memory limit, in Mb */
static int video_nr = -1;		/* /dev/videoN, -1 for autodetect */
61
static int n_devs = 1;			/* Number of virtual devices */
62 63 64 65 66 67 68 69 70 71 72 73

/* 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,
74
	}, {
75 76 77 78 79 80 81 82 83 84 85 86 87 88 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
		.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)];

115
#define dprintk(dev, level, fmt, arg...)				\
116
	do {								\
117
		if (dev->vfd->debug >= (level))				\
118
			printk(KERN_DEBUG "vivi: " fmt , ## arg);	\
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
	} while (0)

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

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

static struct vivi_fmt format = {
	.name     = "4:2:2, packed, YUYV",
	.fourcc   = V4L2_PIX_FMT_YUYV,
	.depth    = 16,
};

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;

166
	spinlock_t                 slock;
167
	struct mutex		   mutex;
168 169 170 171

	int                        users;

	/* various device info */
172
	struct video_device        *vfd;
173 174 175 176

	struct vivi_dmaqueue       vidq;

	/* Several counters */
177 178
	int                        h, m, s, ms;
	unsigned long              jiffies;
179
	char                       timestr[13];
180 181

	int			   mv_count;	/* Controls bars movement */
182 183 184 185 186 187 188
};

struct vivi_fh {
	struct vivi_dev            *dev;

	/* video capture */
	struct vivi_fmt            *fmt;
189
	unsigned int               width, height;
190 191 192
	struct videobuf_queue      vb_vidq;

	enum v4l2_buf_type         type;
193
	unsigned char              bars[8][3];
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
};

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

/* Bars and Colors should match positions */

enum colors {
	WHITE,
	AMBAR,
	CYAN,
	GREEN,
	MAGENTA,
	RED,
209 210
	BLUE,
	BLACK,
211 212 213 214
};

static u8 bars[8][3] = {
	/* R   G   B */
215 216 217 218 219 220 221 222
	{204, 204, 204},  /* white */
	{208, 208,   0},  /* ambar */
	{  0, 206, 206},  /* cyan */
	{  0, 239,   0},  /* green */
	{239,   0, 239},  /* magenta */
	{205,   0,   0},  /* red */
	{  0,   0, 255},  /* blue */
	{  0,   0,   0},  /* black */
223 224
};

225 226
#define TO_Y(r, g, b) \
	(((16829 * r + 33039 * g + 6416 * b  + 32768) >> 16) + 16)
227
/* RGB to  V(Cr) Color transform */
228 229
#define TO_V(r, g, b) \
	(((28784 * r - 24103 * g - 4681 * b  + 32768) >> 16) + 128)
230
/* RGB to  U(Cb) Color transform */
231 232
#define TO_U(r, g, b) \
	(((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
233 234 235 236 237

#define TSTAMP_MIN_Y 24
#define TSTAMP_MAX_Y TSTAMP_MIN_Y+15
#define TSTAMP_MIN_X 64

238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
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;

		switch (color) {
		case 0:
		case 2:
			*p = r_y;
			break;
		case 1:
			*p = g_u;
			break;
		case 3:
			*p = b_v;
			break;
		}
	}
}

static void gen_line(struct vivi_fh *fh, char *basep, int inipos, int wmax,
267
		int hmax, int line, int count, char *timestr)
268
{
269
	int  w, i, j;
270
	int pos = inipos;
271 272
	char *s;
	u8 chr;
273 274

	/* We will just duplicate the second pixel at the packet */
275
	wmax /= 2;
276 277

	/* Generate a standard color bar pattern */
278 279
	for (w = 0; w < wmax; w++) {
		int colorpos = ((w + count) * 8/(wmax + 1)) % 8;
280 281 282

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

	/* Checks if it is possible to show timestamp */
286
	if (TSTAMP_MAX_Y >= hmax)
287
		goto end;
288
	if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
289 290 291
		goto end;

	/* Print stream time */
292 293 294 295 296 297
	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;
298 299 300 301 302
				/* Draw white font on black background */
				if (chr & 1 << (7 - i))
					gen_twopix(fh, basep + pos, WHITE);
				else
					gen_twopix(fh, basep + pos, BLACK);
303 304 305 306 307 308
				j++;
			}
		}
	}

end:
309
	return;
310
}
311

312
static void vivi_fillbuff(struct vivi_fh *fh, struct vivi_buffer *buf)
313
{
314
	struct vivi_dev *dev = fh->dev;
315
	int h , pos = 0;
316 317 318
	int hmax  = buf->vb.height;
	int wmax  = buf->vb.width;
	struct timeval ts;
319
	char *tmpbuf;
320
	void *vbuf = videobuf_to_vmalloc(&buf->vb);
321

322
	if (!vbuf)
323
		return;
324

325 326
	tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
	if (!tmpbuf)
327 328
		return;

329
	for (h = 0; h < hmax; h++) {
330
		gen_line(fh, tmpbuf, 0, wmax, hmax, h, dev->mv_count,
331
			 dev->timestr);
332
		memcpy(vbuf + pos, tmpbuf, wmax * 2);
333 334 335
		pos += wmax*2;
	}

336
	dev->mv_count++;
337

338 339
	kfree(tmpbuf);

340 341
	/* Updates stream time */

342
	dev->ms += jiffies_to_msecs(jiffies-dev->jiffies);
343
	dev->jiffies = jiffies;
344 345
	if (dev->ms >= 1000) {
		dev->ms -= 1000;
346
		dev->s++;
347 348
		if (dev->s >= 60) {
			dev->s -= 60;
349
			dev->m++;
350 351
			if (dev->m > 60) {
				dev->m -= 60;
352
				dev->h++;
353 354
				if (dev->h > 24)
					dev->h -= 24;
355 356 357
			}
		}
	}
358
	sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
359
			dev->h, dev->m, dev->s, dev->ms);
360

361 362
	dprintk(dev, 2, "vivifill at %s: Buffer 0x%08lx size= %d\n",
			dev->timestr, (unsigned long)tmpbuf, pos);
363 364 365 366 367

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

371
static void vivi_thread_tick(struct vivi_fh *fh)
372
{
373 374 375
	struct vivi_buffer *buf;
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
376

377
	unsigned long flags = 0;
378

379
	dprintk(dev, 1, "Thread tick\n");
380

381 382 383 384 385
	spin_lock_irqsave(&dev->slock, flags);
	if (list_empty(&dma_q->active)) {
		dprintk(dev, 1, "No active queue to serve\n");
		goto unlock;
	}
386

387 388
	buf = list_entry(dma_q->active.next,
			 struct vivi_buffer, vb.queue);
389

390 391 392
	/* Nobody is waiting on this buffer, return */
	if (!waitqueue_active(&buf->vb.done))
		goto unlock;
393

394
	list_del(&buf->vb.queue);
395

396 397 398
	do_gettimeofday(&buf->vb.ts);

	/* Fill buffer */
399
	vivi_fillbuff(fh, buf);
400 401 402 403 404 405 406
	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;
407 408
}

409 410 411
#define frames_to_ms(frames)					\
	((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

412
static void vivi_sleep(struct vivi_fh *fh)
413
{
414 415 416
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
	int timeout;
417 418
	DECLARE_WAITQUEUE(wait, current);

419
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
420
		(unsigned long)dma_q);
421 422

	add_wait_queue(&dma_q->wq, &wait);
423 424 425 426
	if (kthread_should_stop())
		goto stop_task;

	/* Calculate time to wake up */
427
	timeout = msecs_to_jiffies(frames_to_ms(1));
428

429
	vivi_thread_tick(fh);
430 431

	schedule_timeout_interruptible(timeout);
432

433
stop_task:
434 435 436 437
	remove_wait_queue(&dma_q->wq, &wait);
	try_to_freeze();
}

438
static int vivi_thread(void *data)
439
{
440 441
	struct vivi_fh  *fh = data;
	struct vivi_dev *dev = fh->dev;
442

443
	dprintk(dev, 1, "thread started\n");
444

445
	set_freezable();
446

447
	for (;;) {
448
		vivi_sleep(fh);
449 450 451 452

		if (kthread_should_stop())
			break;
	}
453
	dprintk(dev, 1, "thread: exit\n");
454 455 456
	return 0;
}

457
static int vivi_start_thread(struct vivi_fh *fh)
458
{
459 460
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
461

462 463
	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
464

465
	dprintk(dev, 1, "%s\n", __func__);
466

467
	dma_q->kthread = kthread_run(vivi_thread, fh, "vivi");
468

469
	if (IS_ERR(dma_q->kthread)) {
470
		printk(KERN_ERR "vivi: kernel_thread() failed\n");
471
		return PTR_ERR(dma_q->kthread);
472
	}
473 474 475
	/* Wakes thread */
	wake_up_interruptible(&dma_q->wq);

476
	dprintk(dev, 1, "returning from %s\n", __func__);
477 478 479
	return 0;
}

480
static void vivi_stop_thread(struct vivi_dmaqueue  *dma_q)
481
{
482 483
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);

484
	dprintk(dev, 1, "%s\n", __func__);
485 486 487
	/* shutdown control thread */
	if (dma_q->kthread) {
		kthread_stop(dma_q->kthread);
488
		dma_q->kthread = NULL;
489 490 491 492 493 494 495 496 497
	}
}

/* ------------------------------------------------------------------
	Videobuf operations
   ------------------------------------------------------------------*/
static int
buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
{
498 499
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;
500 501 502 503 504

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

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

506 507
	while (*size * *count > vid_limit * 1024 * 1024)
		(*count)--;
508

509
	dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
510
		*count, *size);
511

512 513 514
	return 0;
}

515
static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
516
{
517 518 519
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;

520
	dprintk(dev, 1, "%s, state: %i\n", __func__, buf->vb.state);
521 522 523 524

	if (in_interrupt())
		BUG();

525
	videobuf_vmalloc_free(&buf->vb);
526
	dprintk(dev, 1, "free_buffer: freed\n");
527
	buf->vb.state = VIDEOBUF_NEEDS_INIT;
528 529 530 531 532 533 534 535 536
}

#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;
537
	struct vivi_dev    *dev = fh->dev;
538
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
539
	int rc;
540

541
	dprintk(dev, 1, "%s, field=%d\n", __func__, field);
542 543

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

545 546 547
	if (fh->width  < 48 || fh->width  > norm_maxw() ||
	    fh->height < 32 || fh->height > norm_maxh())
		return -EINVAL;
548

549 550 551 552
	buf->vb.size = fh->width*fh->height*2;
	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

553 554 555 556 557
	/* 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;
558

559
	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
560 561
		rc = videobuf_iolock(vq, &buf->vb, NULL);
		if (rc < 0)
562 563 564
			goto fail;
	}

565
	buf->vb.state = VIDEOBUF_PREPARED;
566 567 568 569

	return 0;

fail:
570
	free_buffer(vq, buf);
571 572 573 574 575 576
	return rc;
}

static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
577 578 579
	struct vivi_buffer    *buf  = container_of(vb, struct vivi_buffer, vb);
	struct vivi_fh        *fh   = vq->priv_data;
	struct vivi_dev       *dev  = fh->dev;
580 581
	struct vivi_dmaqueue *vidq = &dev->vidq;

582
	dprintk(dev, 1, "%s\n", __func__);
583 584 585

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

588 589
static void buffer_release(struct videobuf_queue *vq,
			   struct videobuf_buffer *vb)
590
{
591
	struct vivi_buffer   *buf  = container_of(vb, struct vivi_buffer, vb);
592
	struct vivi_fh       *fh   = vq->priv_data;
593
	struct vivi_dev      *dev  = (struct vivi_dev *)fh->dev;
594

595
	dprintk(dev, 1, "%s\n", __func__);
596

597
	free_buffer(vq, buf);
598 599 600 601 602 603 604 605 606
}

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

607 608 609
/* ------------------------------------------------------------------
	IOCTL vidioc handling
   ------------------------------------------------------------------*/
610
static int vidioc_querycap(struct file *file, void  *priv,
611 612 613 614 615 616 617 618 619 620 621
					struct v4l2_capability *cap)
{
	strcpy(cap->driver, "vivi");
	strcpy(cap->card, "vivi");
	cap->version = VIVI_VERSION;
	cap->capabilities =	V4L2_CAP_VIDEO_CAPTURE |
				V4L2_CAP_STREAMING     |
				V4L2_CAP_READWRITE;
	return 0;
}

622
static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
623 624 625 626 627
					struct v4l2_fmtdesc *f)
{
	if (f->index > 0)
		return -EINVAL;

628
	strlcpy(f->description, format.name, sizeof(f->description));
629 630 631 632
	f->pixelformat = format.fourcc;
	return 0;
}

633
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
634 635
					struct v4l2_format *f)
{
636
	struct vivi_fh *fh = priv;
637 638 639 640 641 642 643 644 645 646 647 648 649

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

650
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
651 652
			struct v4l2_format *f)
{
653 654
	struct vivi_fh  *fh  = priv;
	struct vivi_dev *dev = fh->dev;
655 656 657 658 659
	struct vivi_fmt *fmt;
	enum v4l2_field field;
	unsigned int maxw, maxh;

	if (format.fourcc != f->fmt.pix.pixelformat) {
660 661 662
		dprintk(dev, 1, "Fourcc format (0x%08x) invalid. "
			"Driver accepts only 0x%08x\n",
			f->fmt.pix.pixelformat, format.fourcc);
663 664
		return -EINVAL;
	}
665
	fmt = &format;
666 667 668 669

	field = f->fmt.pix.field;

	if (field == V4L2_FIELD_ANY) {
670
		field = V4L2_FIELD_INTERLACED;
671
	} else if (V4L2_FIELD_INTERLACED != field) {
672
		dprintk(dev, 1, "Field type invalid.\n");
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
		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;
}

697
/*FIXME: This seems to be generic enough to be at videodev2 */
698
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
699
					struct v4l2_format *f)
700
{
701
	struct vivi_fh  *fh = priv;
702
	struct videobuf_queue *q = &fh->vb_vidq;
703 704
	unsigned char r, g, b;
	int k;
705

706
	int ret = vidioc_try_fmt_vid_cap(file, fh, f);
707 708 709
	if (ret < 0)
		return (ret);

710 711 712
	mutex_lock(&q->vb_lock);

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

718 719 720 721 722 723
	fh->fmt           = &format;
	fh->width         = f->fmt.pix.width;
	fh->height        = f->fmt.pix.height;
	fh->vb_vidq.field = f->fmt.pix.field;
	fh->type          = f->type;

724 725 726 727 728 729 730 731 732 733 734
	/* precalculate color bar values to speed up rendering */
	for (k = 0; k < 8; k++) {
		r = bars[k][0];
		g = bars[k][1];
		b = bars[k][2];

		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 */
	}

735 736 737 738 739
	ret = 0;
out:
	mutex_unlock(&q->vb_lock);

	return (ret);
740 741
}

742 743
static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *p)
744
{
745
	struct vivi_fh  *fh = priv;
746

747
	return (videobuf_reqbufs(&fh->vb_vidq, p));
748 749
}

750
static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
751
{
752
	struct vivi_fh  *fh = priv;
753

754 755
	return (videobuf_querybuf(&fh->vb_vidq, p));
}
756

757
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
758
{
759
	struct vivi_fh *fh = priv;
760

761 762
	return (videobuf_qbuf(&fh->vb_vidq, p));
}
763

764
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
765
{
766
	struct vivi_fh  *fh = priv;
767

768 769 770
	return (videobuf_dqbuf(&fh->vb_vidq, p,
				file->f_flags & O_NONBLOCK));
}
771

772
#ifdef CONFIG_VIDEO_V4L1_COMPAT
773
static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
774
{
775
	struct vivi_fh  *fh = priv;
776

777
	return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
778 779
}
#endif
780

781
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
782
{
783
	struct vivi_fh  *fh = priv;
784

785 786 787 788
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
789

790
	return videobuf_streamon(&fh->vb_vidq);
791
}
792

793
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
794
{
795
	struct vivi_fh  *fh = priv;
796

797 798 799 800
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
801

802
	return videobuf_streamoff(&fh->vb_vidq);
803 804
}

805
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
806 807 808
{
	return 0;
}
809

810
/* only one input in this sample driver */
811
static int vidioc_enum_input(struct file *file, void *priv,
812 813 814 815
				struct v4l2_input *inp)
{
	if (inp->index != 0)
		return -EINVAL;
816

817
	inp->type = V4L2_INPUT_TYPE_CAMERA;
818
	inp->std = V4L2_STD_525_60;
819
	strcpy(inp->name, "Camera");
820

821 822
	return (0);
}
823

824
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
825 826
{
	*i = 0;
827

828 829
	return (0);
}
830
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
831 832 833
{
	if (i > 0)
		return -EINVAL;
834

835 836
	return (0);
}
837 838

	/* --- controls ---------------------------------------------- */
839 840
static int vidioc_queryctrl(struct file *file, void *priv,
			    struct v4l2_queryctrl *qc)
841 842
{
	int i;
843

844 845 846 847 848 849
	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);
		}
850

851 852
	return -EINVAL;
}
853

854 855
static int vidioc_g_ctrl(struct file *file, void *priv,
			 struct v4l2_control *ctrl)
856 857
{
	int i;
858

859 860
	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (ctrl->id == vivi_qctrl[i].id) {
861
			ctrl->value = qctl_regs[i];
862 863
			return (0);
		}
864

865
	return -EINVAL;
866
}
867
static int vidioc_s_ctrl(struct file *file, void *priv,
868
				struct v4l2_control *ctrl)
869
{
870 871 872 873
	int i;

	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (ctrl->id == vivi_qctrl[i].id) {
874 875
			if (ctrl->value < vivi_qctrl[i].minimum
			    || ctrl->value > vivi_qctrl[i].maximum) {
876 877
					return (-ERANGE);
				}
878
			qctl_regs[i] = ctrl->value;
879 880 881
			return (0);
		}
	return -EINVAL;
882 883 884 885 886 887 888 889 890 891 892
}

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

#define line_buf_size(norm) (norm_maxw(norm)*(format.depth+7)/8)

static int vivi_open(struct inode *inode, struct file *file)
{
	int minor = iminor(inode);
893
	struct vivi_dev *dev;
894
	struct vivi_fh *fh = NULL;
895
	int i;
896
	int retval = 0;
897

898
	printk(KERN_DEBUG "vivi: open called (minor=%d)\n", minor);
899

900
	lock_kernel();
901
	list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
902
		if (dev->vfd->minor == minor)
903
			goto found;
904
	unlock_kernel();
905
	return -ENODEV;
906

907
found:
908
	mutex_lock(&dev->mutex);
909 910
	dev->users++;

911 912 913 914 915 916
	if (dev->users > 1) {
		dev->users--;
		retval = -EBUSY;
		goto unlock;
	}

917
	dprintk(dev, 1, "open minor=%d type=%s users=%d\n", minor,
918
		v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
919 920

	/* allocate + initialize per filehandle data */
921
	fh = kzalloc(sizeof(*fh), GFP_KERNEL);
922 923
	if (NULL == fh) {
		dev->users--;
924 925
		retval = -ENOMEM;
		goto unlock;
926
	}
927 928
unlock:
	mutex_unlock(&dev->mutex);
929 930
	if (retval) {
		unlock_kernel();
931
		return retval;
932
	}
933 934 935

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

937 938 939 940 941 942 943
	fh->type     = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	fh->fmt      = &format;
	fh->width    = 640;
	fh->height   = 480;

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

	/* Resets frame counters */
947 948 949
	dev->h = 0;
	dev->m = 0;
	dev->s = 0;
950
	dev->ms = 0;
951 952 953
	dev->mv_count = 0;
	dev->jiffies = jiffies;
	sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
954
			dev->h, dev->m, dev->s, dev->ms);
955

956
	videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
957
			NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
958
			sizeof(struct vivi_buffer), fh);
959

960
	vivi_start_thread(fh);
961
	unlock_kernel();
962

963 964 965 966 967 968
	return 0;
}

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

971
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
972
		return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
973 974 975 976 977 978 979 980
					file->f_flags & O_NONBLOCK);
	}
	return 0;
}

static unsigned int
vivi_poll(struct file *file, struct poll_table_struct *wait)
{
981
	struct vivi_fh        *fh = file->private_data;
982
	struct vivi_dev       *dev = fh->dev;
983
	struct videobuf_queue *q = &fh->vb_vidq;
984

985
	dprintk(dev, 1, "%s\n", __func__);
986 987 988 989

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

990
	return videobuf_poll_stream(file, q, wait);
991 992
}

993
static int vivi_close(struct inode *inode, struct file *file)
994
{
995 996
	struct vivi_fh         *fh = file->private_data;
	struct vivi_dev *dev       = fh->dev;
997 998 999 1000 1001
	struct vivi_dmaqueue *vidq = &dev->vidq;

	int minor = iminor(inode);

	vivi_stop_thread(vidq);
1002
	videobuf_stop(&fh->vb_vidq);
1003 1004
	videobuf_mmap_free(&fh->vb_vidq);

1005
	kfree(fh);
1006

1007
	mutex_lock(&dev->mutex);
1008
	dev->users--;
1009
	mutex_unlock(&dev->mutex);
1010

1011 1012
	dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
		minor, dev->users);
1013 1014 1015 1016

	return 0;
}

1017
static int vivi_release(void)
1018
{
1019 1020 1021 1022 1023 1024 1025
	struct vivi_dev *dev;
	struct list_head *list;

	while (!list_empty(&vivi_devlist)) {
		list = vivi_devlist.next;
		list_del(list);
		dev = list_entry(list, struct vivi_dev, vivi_devlist);
1026

1027
		if (-1 != dev->vfd->minor) {
1028
			printk(KERN_INFO "%s: unregistering /dev/video%d\n",
1029
				VIVI_MODULE_NAME, dev->vfd->minor);
1030
			video_unregister_device(dev->vfd);
1031
		} else {
1032
			printk(KERN_INFO "%s: releasing /dev/video%d\n",
1033
				VIVI_MODULE_NAME, dev->vfd->minor);
1034
			video_device_release(dev->vfd);
1035
		}
1036 1037 1038

		kfree(dev);
	}
1039 1040 1041 1042

	return 0;
}

1043
static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1044
{
1045 1046
	struct vivi_fh  *fh = file->private_data;
	struct vivi_dev *dev = fh->dev;
1047 1048
	int ret;

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

1051
	ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1052

1053
	dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1054 1055 1056 1057 1058 1059 1060
		(unsigned long)vma->vm_start,
		(unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
		ret);

	return ret;
}

1061
static const struct file_operations vivi_fops = {
1062 1063
	.owner		= THIS_MODULE,
	.open           = vivi_open,
1064
	.release        = vivi_close,
1065 1066
	.read           = vivi_read,
	.poll		= vivi_poll,
1067
	.ioctl          = video_ioctl2, /* V4L2 ioctl handler */
1068
	.compat_ioctl   = v4l_compat_ioctl32,
1069
	.mmap           = vivi_mmap,
1070 1071 1072
	.llseek         = no_llseek,
};

1073
static const struct v4l2_ioctl_ops vivi_ioctl_ops = {
1074
	.vidioc_querycap      = vidioc_querycap,
1075 1076 1077 1078
	.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,
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
	.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,
1092
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1093 1094
	.vidiocgmbuf          = vidiocgmbuf,
#endif
1095 1096 1097 1098 1099 1100 1101 1102 1103
};

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

1104
	.tvnorms              = V4L2_STD_525_60,
1105
	.current_norm         = V4L2_STD_NTSC_M,
1106
};
1107
/* -----------------------------------------------------------------
1108 1109 1110
	Initialization and module stuff
   ------------------------------------------------------------------*/

1111 1112 1113 1114 1115 1116 1117 1118 1119
/* 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. Since there are 64 minors for video grabbers, this is
   currently the theoretical maximum limit. However, a further limit does
   exist at videodev that forbids any driver to register more than 32 video
   grabbers.
 */
1120 1121
static int __init vivi_init(void)
{
1122
	int ret = -ENOMEM, i;
1123
	struct vivi_dev *dev;
1124
	struct video_device *vfd;
1125

1126 1127 1128
	if (n_devs <= 0)
		n_devs = 1;

1129 1130
	for (i = 0; i < n_devs; i++) {
		dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1131
		if (!dev)
1132
			break;
1133

1134 1135 1136
		/* init video dma queues */
		INIT_LIST_HEAD(&dev->vidq.active);
		init_waitqueue_head(&dev->vidq.wq);
1137

1138
		/* initialize locks */
1139
		spin_lock_init(&dev->slock);
1140
		mutex_init(&dev->mutex);
1141

1142
		vfd = video_device_alloc();
1143 1144
		if (!vfd) {
			kfree(dev);
1145
			break;
1146
		}
1147 1148 1149 1150

		*vfd = vivi_template;

		ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
1151 1152 1153 1154 1155 1156 1157 1158
		if (ret < 0) {
			video_device_release(vfd);
			kfree(dev);

			/* If some registers succeeded, keep driver */
			if (i)
				ret = 0;

1159
			break;
1160 1161 1162 1163
		}

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

		snprintf(vfd->name, sizeof(vfd->name), "%s (%i)",
			 vivi_template.name, vfd->minor);
1167

1168 1169
		if (video_nr >= 0)
			video_nr++;
1170

1171
		dev->vfd = vfd;
1172
		printk(KERN_INFO "%s: V4L2 device registered as /dev/video%d\n",
1173
			VIVI_MODULE_NAME, vfd->minor);
1174
	}
1175

1176 1177 1178
	if (ret < 0) {
		vivi_release();
		printk(KERN_INFO "Error %d while loading vivi driver\n", ret);
1179
	} else {
1180
		printk(KERN_INFO "Video Technology Magazine Virtual Video "
1181 1182 1183
			"Capture Board ver %u.%u.%u successfully loaded.\n",
			(VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF,
			VIVI_VERSION & 0xFF);
1184 1185 1186 1187 1188

		/* n_devs will reflect the actual number of allocated devices */
		n_devs = i;
	}

1189 1190 1191 1192 1193
	return ret;
}

static void __exit vivi_exit(void)
{
1194
	vivi_release();
1195 1196 1197 1198
}

module_init(vivi_init);
module_exit(vivi_exit);
1199 1200 1201 1202 1203

MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board");
MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
MODULE_LICENSE("Dual BSD/GPL");

1204
module_param(video_nr, uint, 0444);
1205
MODULE_PARM_DESC(video_nr, "video iminor start number");
1206

1207
module_param(n_devs, uint, 0444);
1208
MODULE_PARM_DESC(n_devs, "number of video devices to create");
1209

1210
module_param_named(debug, vivi_template.debug, int, 0444);
1211
MODULE_PARM_DESC(debug, "activates debug info");
1212

1213 1214
module_param(vid_limit, int, 0644);
MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");