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 38 39
#include <media/v4l2-common.h>
#include <linux/kthread.h>
#include <linux/highmem.h>
40
#include <linux/freezer.h>
41

42
#define VIVI_MODULE_NAME "vivi"
43

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

#include "font.h"

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

57 58 59
/* 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 */
60
static int n_devs = 1;			/* Number of virtual devices */
61 62 63 64 65 66 67 68 69 70 71 72

/* 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,
73
	}, {
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
		.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)];

114
#define dprintk(dev, level, fmt, arg...)				\
115
	do {								\
116
		if (dev->vfd->debug >= (level))				\
117
			printk(KERN_DEBUG "vivi: " fmt , ## arg);	\
118 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
	} 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;

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

	int                        users;

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

	struct vivi_dmaqueue       vidq;

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

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

struct vivi_fh {
	struct vivi_dev            *dev;

	/* video capture */
	struct vivi_fmt            *fmt;
188
	unsigned int               width, height;
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
	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,
207 208
	BLUE,
	BLACK,
209 210 211 212
};

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

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

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

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

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

	/* Generate a standard color bar pattern */
248 249 250 251 252
	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];
253

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

			switch (color) {
258 259 260 261 262 263 264 265 266 267
			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;
268 269 270 271 272 273
			}
			pos++;
		}
	}

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

	/* Print stream time */
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
	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];
295 296
				}

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

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

					switch (color) {
304 305 306 307 308 309 310 311 312 313
					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;
314 315 316 317 318 319 320 321 322
					}
					pos++;
				}
				j++;
			}
		}
	}

end:
323
	return;
324
}
325

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

335
	if (!vbuf)
336
		return;
337

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

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

349
	dev->mv_count++;
350

351 352
	kfree(tmpbuf);

353 354
	/* Updates stream time */

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

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

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

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

390
	unsigned long flags = 0;
391

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

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

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

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

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

409 410 411 412 413 414 415 416 417 418 419
	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;
420 421
}

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

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

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

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

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

442
	vivi_thread_tick(fh);
443 444

	schedule_timeout_interruptible(timeout);
445

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

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

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

458
	set_freezable();
459

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

525 526 527
	return 0;
}

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

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

	if (in_interrupt())
		BUG();

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

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

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

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

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

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

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

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

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

	return 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	field = f->fmt.pix.field;

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

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

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

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

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

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

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
	list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
901
		if (dev->vfd->minor == minor)
902 903
			goto found;
	return -ENODEV;
904

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

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

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

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

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

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

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

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

956 957
	vivi_start_thread(fh);

958 959 960 961 962 963
	return 0;
}

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

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

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

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

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

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

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

	int minor = iminor(inode);

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

1000
	kfree(fh);
1001

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

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

	return 0;
}

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

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

		kfree(dev);
	}
1034 1035 1036 1037

	return 0;
}

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

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

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

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

	return ret;
}

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

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

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

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

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

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

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

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

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
		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);
1136

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

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

1145 1146 1147 1148 1149
	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 "
1150 1151 1152
			"Capture Board ver %u.%u.%u successfully loaded.\n",
			(VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF,
			VIVI_VERSION & 0xFF);
1153 1154 1155 1156 1157
	return ret;
}

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

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

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);
1169
MODULE_PARM_DESC(video_nr, "video iminor start number");
1170

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

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

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