vivi.c 27.1 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 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
	struct videobuf_queue      vb_vidq;

	enum v4l2_buf_type         type;
};

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

/* Bars and Colors should match positions */

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

static u8 bars[8][3] = {
	/* R   G   B */
214 215 216 217 218 219 220 221
	{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 */
222 223
};

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

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

237 238
static void gen_line(char *basep, int inipos, int wmax,
		int hmax, int line, int count, char *timestr)
239
{
240 241 242 243
	int  w, i, j, y;
	int pos = inipos;
	char *p, *s;
	u8   chr, r, g, b, color;
244 245

	/* We will just duplicate the second pixel at the packet */
246
	wmax /= 2;
247 248

	/* Generate a standard color bar pattern */
249 250 251 252 253
	for (w = 0; w < wmax; w++) {
		int colorpos = ((w + count) * 8/(wmax + 1)) % 8;
		r = bars[colorpos][0];
		g = bars[colorpos][1];
		b = bars[colorpos][2];
254

255 256
		for (color = 0; color < 4; color++) {
			p = basep + pos;
257 258

			switch (color) {
259 260 261 262 263 264 265 266 267 268
			case 0:
			case 2:
				*p = TO_Y(r, g, b);	/* Luma */
				break;
			case 1:
				*p = TO_U(r, g, b);	/* Cb */
				break;
			case 3:
				*p = TO_V(r, g, b);	/* Cr */
				break;
269 270 271 272 273 274
			}
			pos++;
		}
	}

	/* Checks if it is possible to show timestamp */
275
	if (TSTAMP_MAX_Y >= hmax)
276
		goto end;
277
	if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
278 279 280
		goto end;

	/* Print stream time */
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
	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++) {
				if (chr & 1 << (7 - i)) {
					/* Font color*/
					r = 0;
					g = 198;
					b = 0;
				} else {
					/* Background color */
					r = bars[BLACK][0];
					g = bars[BLACK][1];
					b = bars[BLACK][2];
296 297
				}

298 299 300
				pos = inipos + j * 2;
				for (color = 0; color < 4; color++) {
					p = basep + pos;
301

302
					y = TO_Y(r, g, b);
303 304

					switch (color) {
305 306 307 308 309 310 311 312 313 314
					case 0:
					case 2:
						*p = TO_Y(r, g, b); /* Luma */
						break;
					case 1:
						*p = TO_U(r, g, b); /* Cb */
						break;
					case 3:
						*p = TO_V(r, g, b); /* Cr */
						break;
315 316 317 318 319 320 321 322 323
					}
					pos++;
				}
				j++;
			}
		}
	}

end:
324
	return;
325
}
326

327
static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
328
{
329
	int h , pos = 0;
330 331 332
	int hmax  = buf->vb.height;
	int wmax  = buf->vb.width;
	struct timeval ts;
333
	char *tmpbuf;
334
	void *vbuf = videobuf_to_vmalloc(&buf->vb);
335

336
	if (!vbuf)
337
		return;
338

339 340
	tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
	if (!tmpbuf)
341 342
		return;

343
	for (h = 0; h < hmax; h++) {
344
		gen_line(tmpbuf, 0, wmax, hmax, h, dev->mv_count,
345
			 dev->timestr);
346
		memcpy(vbuf + pos, tmpbuf, wmax * 2);
347 348 349
		pos += wmax*2;
	}

350
	dev->mv_count++;
351

352 353
	kfree(tmpbuf);

354 355
	/* Updates stream time */

356
	dev->ms += jiffies_to_msecs(jiffies-dev->jiffies);
357
	dev->jiffies = jiffies;
358 359
	if (dev->ms >= 1000) {
		dev->ms -= 1000;
360
		dev->s++;
361 362
		if (dev->s >= 60) {
			dev->s -= 60;
363
			dev->m++;
364 365
			if (dev->m > 60) {
				dev->m -= 60;
366
				dev->h++;
367 368
				if (dev->h > 24)
					dev->h -= 24;
369 370 371
			}
		}
	}
372
	sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
373
			dev->h, dev->m, dev->s, dev->ms);
374

375 376
	dprintk(dev, 2, "vivifill at %s: Buffer 0x%08lx size= %d\n",
			dev->timestr, (unsigned long)tmpbuf, pos);
377 378 379 380 381

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

385
static void vivi_thread_tick(struct vivi_fh *fh)
386
{
387 388 389
	struct vivi_buffer *buf;
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
390

391
	unsigned long flags = 0;
392

393
	dprintk(dev, 1, "Thread tick\n");
394

395 396 397 398 399
	spin_lock_irqsave(&dev->slock, flags);
	if (list_empty(&dma_q->active)) {
		dprintk(dev, 1, "No active queue to serve\n");
		goto unlock;
	}
400

401 402
	buf = list_entry(dma_q->active.next,
			 struct vivi_buffer, vb.queue);
403

404 405 406
	/* Nobody is waiting on this buffer, return */
	if (!waitqueue_active(&buf->vb.done))
		goto unlock;
407

408
	list_del(&buf->vb.queue);
409

410 411 412 413 414 415 416 417 418 419 420
	do_gettimeofday(&buf->vb.ts);

	/* Fill buffer */
	vivi_fillbuff(dev, buf);
	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;
421 422
}

423 424 425
#define frames_to_ms(frames)					\
	((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

426
static void vivi_sleep(struct vivi_fh *fh)
427
{
428 429 430
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
	int timeout;
431 432
	DECLARE_WAITQUEUE(wait, current);

433
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __func__,
434
		(unsigned long)dma_q);
435 436

	add_wait_queue(&dma_q->wq, &wait);
437 438 439 440
	if (kthread_should_stop())
		goto stop_task;

	/* Calculate time to wake up */
441
	timeout = msecs_to_jiffies(frames_to_ms(1));
442

443
	vivi_thread_tick(fh);
444 445

	schedule_timeout_interruptible(timeout);
446

447
stop_task:
448 449 450 451
	remove_wait_queue(&dma_q->wq, &wait);
	try_to_freeze();
}

452
static int vivi_thread(void *data)
453
{
454 455
	struct vivi_fh  *fh = data;
	struct vivi_dev *dev = fh->dev;
456

457
	dprintk(dev, 1, "thread started\n");
458

459
	set_freezable();
460

461
	for (;;) {
462
		vivi_sleep(fh);
463 464 465 466

		if (kthread_should_stop())
			break;
	}
467
	dprintk(dev, 1, "thread: exit\n");
468 469 470
	return 0;
}

471
static int vivi_start_thread(struct vivi_fh *fh)
472
{
473 474
	struct vivi_dev *dev = fh->dev;
	struct vivi_dmaqueue *dma_q = &dev->vidq;
475

476 477
	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
478

479
	dprintk(dev, 1, "%s\n", __func__);
480

481
	dma_q->kthread = kthread_run(vivi_thread, fh, "vivi");
482

483
	if (IS_ERR(dma_q->kthread)) {
484
		printk(KERN_ERR "vivi: kernel_thread() failed\n");
485
		return PTR_ERR(dma_q->kthread);
486
	}
487 488 489
	/* Wakes thread */
	wake_up_interruptible(&dma_q->wq);

490
	dprintk(dev, 1, "returning from %s\n", __func__);
491 492 493
	return 0;
}

494
static void vivi_stop_thread(struct vivi_dmaqueue  *dma_q)
495
{
496 497
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);

498
	dprintk(dev, 1, "%s\n", __func__);
499 500 501
	/* shutdown control thread */
	if (dma_q->kthread) {
		kthread_stop(dma_q->kthread);
502
		dma_q->kthread = NULL;
503 504 505 506 507 508 509 510 511
	}
}

/* ------------------------------------------------------------------
	Videobuf operations
   ------------------------------------------------------------------*/
static int
buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
{
512 513
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;
514 515 516 517 518

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

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

520 521
	while (*size * *count > vid_limit * 1024 * 1024)
		(*count)--;
522

523
	dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
524
		*count, *size);
525

526 527 528
	return 0;
}

529
static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
530
{
531 532 533
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;

534
	dprintk(dev, 1, "%s, state: %i\n", __func__, buf->vb.state);
535 536 537 538

	if (in_interrupt())
		BUG();

539
	videobuf_vmalloc_free(&buf->vb);
540
	dprintk(dev, 1, "free_buffer: freed\n");
541
	buf->vb.state = VIDEOBUF_NEEDS_INIT;
542 543 544 545 546 547 548 549 550
}

#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;
551
	struct vivi_dev    *dev = fh->dev;
552
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
553
	int rc;
554

555
	dprintk(dev, 1, "%s, field=%d\n", __func__, field);
556 557

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

559 560 561
	if (fh->width  < 48 || fh->width  > norm_maxw() ||
	    fh->height < 32 || fh->height > norm_maxh())
		return -EINVAL;
562

563 564 565 566
	buf->vb.size = fh->width*fh->height*2;
	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

567 568 569 570 571
	/* 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;
572

573
	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
574 575
		rc = videobuf_iolock(vq, &buf->vb, NULL);
		if (rc < 0)
576 577 578
			goto fail;
	}

579
	buf->vb.state = VIDEOBUF_PREPARED;
580 581 582 583

	return 0;

fail:
584
	free_buffer(vq, buf);
585 586 587 588 589 590
	return rc;
}

static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
591 592 593
	struct vivi_buffer    *buf  = container_of(vb, struct vivi_buffer, vb);
	struct vivi_fh        *fh   = vq->priv_data;
	struct vivi_dev       *dev  = fh->dev;
594 595
	struct vivi_dmaqueue *vidq = &dev->vidq;

596
	dprintk(dev, 1, "%s\n", __func__);
597 598 599

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

602 603
static void buffer_release(struct videobuf_queue *vq,
			   struct videobuf_buffer *vb)
604
{
605
	struct vivi_buffer   *buf  = container_of(vb, struct vivi_buffer, vb);
606
	struct vivi_fh       *fh   = vq->priv_data;
607
	struct vivi_dev      *dev  = (struct vivi_dev *)fh->dev;
608

609
	dprintk(dev, 1, "%s\n", __func__);
610

611
	free_buffer(vq, buf);
612 613 614 615 616 617 618 619 620
}

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

621 622 623
/* ------------------------------------------------------------------
	IOCTL vidioc handling
   ------------------------------------------------------------------*/
624
static int vidioc_querycap(struct file *file, void  *priv,
625 626 627 628 629 630 631 632 633 634 635
					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;
}

636
static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
637 638 639 640 641
					struct v4l2_fmtdesc *f)
{
	if (f->index > 0)
		return -EINVAL;

642
	strlcpy(f->description, format.name, sizeof(f->description));
643 644 645 646
	f->pixelformat = format.fourcc;
	return 0;
}

647
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
648 649
					struct v4l2_format *f)
{
650
	struct vivi_fh *fh = priv;
651 652 653 654 655 656 657 658 659 660 661 662 663

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

664
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
665 666
			struct v4l2_format *f)
{
667 668
	struct vivi_fh  *fh  = priv;
	struct vivi_dev *dev = fh->dev;
669 670 671 672 673
	struct vivi_fmt *fmt;
	enum v4l2_field field;
	unsigned int maxw, maxh;

	if (format.fourcc != f->fmt.pix.pixelformat) {
674 675 676
		dprintk(dev, 1, "Fourcc format (0x%08x) invalid. "
			"Driver accepts only 0x%08x\n",
			f->fmt.pix.pixelformat, format.fourcc);
677 678
		return -EINVAL;
	}
679
	fmt = &format;
680 681 682 683

	field = f->fmt.pix.field;

	if (field == V4L2_FIELD_ANY) {
684
		field = V4L2_FIELD_INTERLACED;
685
	} else if (V4L2_FIELD_INTERLACED != field) {
686
		dprintk(dev, 1, "Field type invalid.\n");
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
		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;
}

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

718
	int ret = vidioc_try_fmt_vid_cap(file, fh, f);
719 720 721
	if (ret < 0)
		return (ret);

722 723 724
	mutex_lock(&q->vb_lock);

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

730 731 732 733 734 735
	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;

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

	return (ret);
741 742
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

822 823
	return (0);
}
824

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

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

836 837
	return (0);
}
838 839

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

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

852 853
	return -EINVAL;
}
854

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

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

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

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

/* ------------------------------------------------------------------
	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);
894
	struct vivi_dev *dev;
895
	struct vivi_fh *fh = NULL;
896
	int i;
897
	int retval = 0;
898

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

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

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

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

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

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

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

934 935 936 937 938 939 940
	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++)
941
		qctl_regs[i] = vivi_qctrl[i].default_value;
942 943

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

953
	videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
954
			NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
955
			sizeof(struct vivi_buffer), fh);
956

957 958
	vivi_start_thread(fh);

959 960 961 962 963 964
	return 0;
}

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

967
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
968
		return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
969 970 971 972 973 974 975 976
					file->f_flags & O_NONBLOCK);
	}
	return 0;
}

static unsigned int
vivi_poll(struct file *file, struct poll_table_struct *wait)
{
977
	struct vivi_fh        *fh = file->private_data;
978
	struct vivi_dev       *dev = fh->dev;
979
	struct videobuf_queue *q = &fh->vb_vidq;
980

981
	dprintk(dev, 1, "%s\n", __func__);
982 983 984 985

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

986
	return videobuf_poll_stream(file, q, wait);
987 988
}

989
static int vivi_close(struct inode *inode, struct file *file)
990
{
991 992
	struct vivi_fh         *fh = file->private_data;
	struct vivi_dev *dev       = fh->dev;
993 994 995 996 997
	struct vivi_dmaqueue *vidq = &dev->vidq;

	int minor = iminor(inode);

	vivi_stop_thread(vidq);
998
	videobuf_stop(&fh->vb_vidq);
999 1000
	videobuf_mmap_free(&fh->vb_vidq);

1001
	kfree(fh);
1002

1003
	mutex_lock(&dev->mutex);
1004
	dev->users--;
1005
	mutex_unlock(&dev->mutex);
1006

1007 1008
	dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
		minor, dev->users);
1009 1010 1011 1012

	return 0;
}

1013
static int vivi_release(void)
1014
{
1015 1016 1017 1018 1019 1020 1021
	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);
1022

1023
		if (-1 != dev->vfd->minor) {
1024
			video_unregister_device(dev->vfd);
1025
			printk(KERN_INFO "%s: /dev/video%d unregistered.\n",
1026
				VIVI_MODULE_NAME, dev->vfd->minor);
1027
		} else {
1028
			video_device_release(dev->vfd);
1029
			printk(KERN_INFO "%s: /dev/video%d released.\n",
1030
				VIVI_MODULE_NAME, dev->vfd->minor);
1031
		}
1032 1033 1034

		kfree(dev);
	}
1035 1036 1037 1038

	return 0;
}

1039
static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1040
{
1041 1042
	struct vivi_fh  *fh = file->private_data;
	struct vivi_dev *dev = fh->dev;
1043 1044
	int ret;

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

1047
	ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1048

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

	return ret;
}

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

1069
static struct video_device vivi_template = {
1070
	.name		= "vivi",
1071 1072 1073
	.type		= VID_TYPE_CAPTURE,
	.fops           = &vivi_fops,
	.minor		= -1,
1074
	.release	= video_device_release,
1075 1076

	.vidioc_querycap      = vidioc_querycap,
1077 1078 1079 1080
	.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,
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
	.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,
1094
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1095 1096
	.vidiocgmbuf          = vidiocgmbuf,
#endif
1097
	.tvnorms              = V4L2_STD_525_60,
1098
	.current_norm         = V4L2_STD_NTSC_M,
1099
};
1100
/* -----------------------------------------------------------------
1101 1102 1103 1104 1105
	Initialization and module stuff
   ------------------------------------------------------------------*/

static int __init vivi_init(void)
{
1106
	int ret = -ENOMEM, i;
1107
	struct vivi_dev *dev;
1108
	struct video_device *vfd;
1109

1110 1111 1112 1113
	for (i = 0; i < n_devs; i++) {
		dev = kzalloc(sizeof(*dev), GFP_KERNEL);
		if (NULL == dev)
			break;
1114

1115
		list_add_tail(&dev->vivi_devlist, &vivi_devlist);
1116

1117 1118 1119
		/* init video dma queues */
		INIT_LIST_HEAD(&dev->vidq.active);
		init_waitqueue_head(&dev->vidq.wq);
1120

1121
		/* initialize locks */
1122
		spin_lock_init(&dev->slock);
1123
		mutex_init(&dev->mutex);
1124

1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
		vfd = video_device_alloc();
		if (NULL == vfd)
			break;

		*vfd = vivi_template;

		ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
		if (ret < 0)
			break;

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

1138 1139
		if (video_nr >= 0)
			video_nr++;
1140

1141
		dev->vfd = vfd;
1142
		printk(KERN_INFO "%s: V4L2 device registered as /dev/video%d\n",
1143
			VIVI_MODULE_NAME, vfd->minor);
1144
	}
1145

1146 1147 1148 1149 1150
	if (ret < 0) {
		vivi_release();
		printk(KERN_INFO "Error %d while loading vivi driver\n", ret);
	} else
		printk(KERN_INFO "Video Technology Magazine Virtual Video "
1151 1152 1153
			"Capture Board ver %u.%u.%u successfully loaded.\n",
			(VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF,
			VIVI_VERSION & 0xFF);
1154 1155 1156 1157 1158
	return ret;
}

static void __exit vivi_exit(void)
{
1159
	vivi_release();
1160 1161 1162 1163
}

module_init(vivi_init);
module_exit(vivi_exit);
1164 1165 1166 1167 1168 1169

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

module_param(video_nr, int, 0);
1170
MODULE_PARM_DESC(video_nr, "video iminor start number");
1171

1172 1173
module_param(n_devs, int, 0);
MODULE_PARM_DESC(n_devs, "number of video devices to create");
1174

1175
module_param_named(debug, vivi_template.debug, int, 0444);
1176
MODULE_PARM_DESC(debug, "activates debug info");
1177

1178 1179
module_param(vid_limit, int, 0644);
MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");