vivi.c 31.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
 * Virtual Video driver - This code emulates a real video device with v4l2 api
 *
 * Copyright (c) 2006 by:
 *      Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
 *      Ted Walther <ted--a.t--enumera.com>
 *      John Sokol <sokol--a.t--videotechnology.com>
 *      http://v4l.videotechnology.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the BSD Licence, GNU General Public License
 * as published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version
 */
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/pci.h>
#include <linux/random.h>
#include <linux/version.h>
28
#include <linux/mutex.h>
29
#include <linux/videodev2.h>
A
Andrew Morton 已提交
30
#include <linux/dma-mapping.h>
31 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 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
#define VIVI_MINOR_VERSION 4
#define VIVI_RELEASE 0
52 53
#define VIVI_VERSION \
	KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
54

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

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

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

	/* 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
	struct mutex               lock;
166
	spinlock_t                 slock;
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
static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
326
{
327
	int h , pos = 0;
328 329 330
	int hmax  = buf->vb.height;
	int wmax  = buf->vb.width;
	struct timeval ts;
331 332
	char *tmpbuf = kmalloc(wmax * 2, GFP_KERNEL);
	void *vbuf = videobuf_to_vmalloc(&buf->vb);
333

334 335
	if (!tmpbuf)
		return;
336

337
	for (h = 0; h < hmax; h++) {
338
		gen_line(tmpbuf, 0, wmax, hmax, h, dev->mv_count,
339
			 dev->timestr);
340
		/* FIXME: replacing to __copy_to_user */
341
		if (copy_to_user(vbuf + pos, tmpbuf, wmax * 2) != 0)
342
			dprintk(dev, 2, "vivifill copy_to_user failed.\n");
343 344 345
		pos += wmax*2;
	}

346
	dev->mv_count++;
347

348 349
	kfree(tmpbuf);

350 351
	/* Updates stream time */

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

371 372
	dprintk(dev, 2, "vivifill at %s: Buffer 0x%08lx size= %d\n",
			dev->timestr, (unsigned long)tmpbuf, pos);
373 374

	/* Advice that buffer was filled */
375
	buf->vb.state = VIDEOBUF_DONE;
376 377 378 379 380 381 382 383 384 385 386 387 388
	buf->vb.field_count++;
	do_gettimeofday(&ts);
	buf->vb.ts = ts;

	list_del(&buf->vb.queue);
	wake_up(&buf->vb.done);
}

static int restart_video_queue(struct vivi_dmaqueue *dma_q);

static void vivi_thread_tick(struct vivi_dmaqueue  *dma_q)
{
	struct vivi_buffer    *buf;
389
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
390 391 392

	int bc;

393
	spin_lock(&dev->slock);
394 395 396
	/* Announces videobuf that all went ok */
	for (bc = 0;; bc++) {
		if (list_empty(&dma_q->active)) {
397
			dprintk(dev, 1, "No active queue to serve\n");
398 399 400 401 402 403 404 405 406
			break;
		}

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

		/* Nobody is waiting something to be done, just return */
		if (!waitqueue_active(&buf->vb.done)) {
			mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
407
			spin_unlock(&dev->slock);
408 409 410 411
			return;
		}

		do_gettimeofday(&buf->vb.ts);
412
		dprintk(dev, 2, "[%p/%d] wakeup\n", buf, buf->vb. i);
413 414

		/* Fill buffer */
415
		vivi_fillbuff(dev, buf);
416 417 418 419

		if (list_empty(&dma_q->active)) {
			del_timer(&dma_q->timeout);
		} else {
420
			mod_timer(&dma_q->timeout, jiffies + BUFFER_TIMEOUT);
421
		}
422 423
	}
	if (bc != 1)
424
		dprintk(dev, 1, "%s: %d buffers handled (should be 1)\n",
425
			__FUNCTION__, bc);
426
	spin_unlock(&dev->slock);
427 428
}

429 430 431
#define frames_to_ms(frames)					\
	((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)

432
static void vivi_sleep(struct vivi_dmaqueue  *dma_q)
433
{
434
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
435
	int timeout, running_time;
436 437
	DECLARE_WAITQUEUE(wait, current);

438 439
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __FUNCTION__,
		(unsigned long)dma_q);
440 441

	add_wait_queue(&dma_q->wq, &wait);
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
	if (kthread_should_stop())
		goto stop_task;

	running_time = jiffies - dma_q->ini_jiffies;
	dma_q->frame++;

	/* Calculate time to wake up */
	timeout = msecs_to_jiffies(frames_to_ms(dma_q->frame)) - running_time;

	if (timeout > msecs_to_jiffies(frames_to_ms(2)) || timeout <= 0) {
		int old = dma_q->frame;
		int nframes;

		dma_q->frame = (jiffies_to_msecs(running_time) /
			       frames_to_ms(1)) + 1;

		timeout = msecs_to_jiffies(frames_to_ms(dma_q->frame))
			  - running_time;

		if (unlikely (timeout <= 0))
			timeout = 1;

		nframes = (dma_q->frame > old)?
				  dma_q->frame - old : old - dma_q->frame;

		dprintk(dev, 1, "%ld: %s %d frames. "
			"Current frame is %d. Will sleep for %d jiffies\n",
			jiffies,
			(dma_q->frame > old)? "Underrun, losed" : "Overrun of",
			nframes, dma_q->frame, timeout);
	} else
		dprintk(dev, 1, "will sleep for %d jiffies\n", timeout);

	vivi_thread_tick(dma_q);

	schedule_timeout_interruptible(timeout);
478

479
stop_task:
480 481 482 483
	remove_wait_queue(&dma_q->wq, &wait);
	try_to_freeze();
}

484
static int vivi_thread(void *data)
485
{
486
	struct vivi_dmaqueue  *dma_q = data;
487
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
488

489
	dprintk(dev, 1, "thread started\n");
490

491
	mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
492
	set_freezable();
493

494 495 496 497 498 499
	for (;;) {
		vivi_sleep(dma_q);

		if (kthread_should_stop())
			break;
	}
500
	dprintk(dev, 1, "thread: exit\n");
501 502 503
	return 0;
}

504
static int vivi_start_thread(struct vivi_dmaqueue  *dma_q)
505
{
506 507
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);

508 509
	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
510

511
	dprintk(dev, 1, "%s\n", __FUNCTION__);
512 513 514

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

515
	if (IS_ERR(dma_q->kthread)) {
516
		printk(KERN_ERR "vivi: kernel_thread() failed\n");
517
		return PTR_ERR(dma_q->kthread);
518
	}
519 520 521
	/* Wakes thread */
	wake_up_interruptible(&dma_q->wq);

522
	dprintk(dev, 1, "returning from %s\n", __FUNCTION__);
523 524 525
	return 0;
}

526
static void vivi_stop_thread(struct vivi_dmaqueue  *dma_q)
527
{
528 529 530
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);

	dprintk(dev, 1, "%s\n", __FUNCTION__);
531 532 533
	/* shutdown control thread */
	if (dma_q->kthread) {
		kthread_stop(dma_q->kthread);
534
		dma_q->kthread = NULL;
535 536 537 538 539
	}
}

static int restart_video_queue(struct vivi_dmaqueue *dma_q)
{
540
	struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
541 542
	struct vivi_buffer *buf, *prev;

543 544
	dprintk(dev, 1, "%s dma_q=0x%08lx\n", __FUNCTION__,
		(unsigned long)dma_q);
545 546

	if (!list_empty(&dma_q->active)) {
547 548
		buf = list_entry(dma_q->active.next,
				 struct vivi_buffer, vb.queue);
549
		dprintk(dev, 2, "restart_queue [%p/%d]: restart dma\n",
550 551
			buf, buf->vb.i);

552
		dprintk(dev, 1, "Restarting video dma\n");
553 554 555
		vivi_stop_thread(dma_q);

		/* cancel all outstanding capture / vbi requests */
556
		list_for_each_entry_safe(buf, prev, &dma_q->active, vb.queue) {
557
			list_del(&buf->vb.queue);
558
			buf->vb.state = VIDEOBUF_ERROR;
559 560 561 562 563 564 565 566 567 568 569
			wake_up(&buf->vb.done);
		}
		mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);

		return 0;
	}

	prev = NULL;
	for (;;) {
		if (list_empty(&dma_q->queued))
			return 0;
570 571
		buf = list_entry(dma_q->queued.next,
				 struct vivi_buffer, vb.queue);
572 573
		if (NULL == prev) {
			list_del(&buf->vb.queue);
574
			list_add_tail(&buf->vb.queue, &dma_q->active);
575

576
			dprintk(dev, 1, "Restarting video dma\n");
577 578 579
			vivi_stop_thread(dma_q);
			vivi_start_thread(dma_q);

580
			buf->vb.state = VIDEOBUF_ACTIVE;
581
			mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
582 583
			dprintk(dev, 2,
				"[%p/%d] restart_queue - first active\n",
584
				buf, buf->vb.i);
585 586 587 588 589

		} else if (prev->vb.width  == buf->vb.width  &&
			   prev->vb.height == buf->vb.height &&
			   prev->fmt       == buf->fmt) {
			list_del(&buf->vb.queue);
590
			list_add_tail(&buf->vb.queue, &dma_q->active);
591
			buf->vb.state = VIDEOBUF_ACTIVE;
592 593
			dprintk(dev, 2,
				"[%p/%d] restart_queue - move to active\n",
594
				buf, buf->vb.i);
595 596 597 598 599 600 601 602 603
		} else {
			return 0;
		}
		prev = buf;
	}
}

static void vivi_vid_timeout(unsigned long data)
{
604
	struct vivi_dev      *dev  = (struct vivi_dev *)data;
605 606 607
	struct vivi_dmaqueue *vidq = &dev->vidq;
	struct vivi_buffer   *buf;

608 609
	spin_lock(&dev->slock);

610
	while (!list_empty(&vidq->active)) {
611 612
		buf = list_entry(vidq->active.next,
				 struct vivi_buffer, vb.queue);
613
		list_del(&buf->vb.queue);
614
		buf->vb.state = VIDEOBUF_ERROR;
615
		wake_up(&buf->vb.done);
616
		printk(KERN_INFO "vivi/0: [%p/%d] timeout\n", buf, buf->vb.i);
617 618
	}
	restart_video_queue(vidq);
619 620

	spin_unlock(&dev->slock);
621 622 623 624 625 626 627 628
}

/* ------------------------------------------------------------------
	Videobuf operations
   ------------------------------------------------------------------*/
static int
buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
{
629 630
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;
631 632 633 634 635

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

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

637 638
	while (*size * *count > vid_limit * 1024 * 1024)
		(*count)--;
639

640 641
	dprintk(dev, 1, "%s, count=%d, size=%d\n", __FUNCTION__,
		*count, *size);
642

643 644 645
	return 0;
}

646
static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
647
{
648 649 650 651
	struct vivi_fh  *fh = vq->priv_data;
	struct vivi_dev *dev  = fh->dev;

	dprintk(dev, 1, "%s\n", __FUNCTION__);
652 653 654 655

	if (in_interrupt())
		BUG();

656
	videobuf_waiton(&buf->vb, 0, 0);
657
	videobuf_vmalloc_free(&buf->vb);
658
	buf->vb.state = VIDEOBUF_NEEDS_INIT;
659 660 661 662 663 664 665 666 667
}

#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;
668
	struct vivi_dev    *dev = fh->dev;
669
	struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
670 671
	int rc, init_buffer = 0;

672
	dprintk(dev, 1, "%s, field=%d\n", __FUNCTION__, field);
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692

	BUG_ON(NULL == fh->fmt);
	if (fh->width  < 48 || fh->width  > norm_maxw() ||
	    fh->height < 32 || fh->height > norm_maxh())
		return -EINVAL;
	buf->vb.size = fh->width*fh->height*2;
	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

	if (buf->fmt       != fh->fmt    ||
	    buf->vb.width  != fh->width  ||
	    buf->vb.height != fh->height ||
	buf->vb.field  != field) {
		buf->fmt       = fh->fmt;
		buf->vb.width  = fh->width;
		buf->vb.height = fh->height;
		buf->vb.field  = field;
		init_buffer = 1;
	}

693
	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
694 695
		rc = videobuf_iolock(vq, &buf->vb, NULL);
		if (rc < 0)
696 697 698
			goto fail;
	}

699
	buf->vb.state = VIDEOBUF_PREPARED;
700 701 702 703

	return 0;

fail:
704
	free_buffer(vq, buf);
705 706 707 708 709 710
	return rc;
}

static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
711 712 713 714
	struct vivi_buffer    *buf  = container_of(vb, struct vivi_buffer, vb);
	struct vivi_fh        *fh   = vq->priv_data;
	struct vivi_dev       *dev  = fh->dev;
	struct vivi_dmaqueue  *vidq = &dev->vidq;
715 716 717
	struct vivi_buffer    *prev;

	if (!list_empty(&vidq->queued)) {
718
		dprintk(dev, 1, "adding vb queue=0x%08lx\n",
719 720
			(unsigned long)&buf->vb.queue);
		list_add_tail(&buf->vb.queue, &vidq->queued);
721
		buf->vb.state = VIDEOBUF_QUEUED;
722
		dprintk(dev, 2, "[%p/%d] buffer_queue - append to queued\n",
723 724
			buf, buf->vb.i);
	} else if (list_empty(&vidq->active)) {
725
		list_add_tail(&buf->vb.queue, &vidq->active);
726

727
		buf->vb.state = VIDEOBUF_ACTIVE;
728
		mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT);
729
		dprintk(dev, 2, "[%p/%d] buffer_queue - first active\n",
730 731 732 733
			buf, buf->vb.i);

		vivi_start_thread(vidq);
	} else {
734 735
		prev = list_entry(vidq->active.prev,
				  struct vivi_buffer, vb.queue);
736 737 738
		if (prev->vb.width  == buf->vb.width  &&
		    prev->vb.height == buf->vb.height &&
		    prev->fmt       == buf->fmt) {
739
			list_add_tail(&buf->vb.queue, &vidq->active);
740
			buf->vb.state = VIDEOBUF_ACTIVE;
741 742
			dprintk(dev, 2,
				"[%p/%d] buffer_queue - append to active\n",
743 744 745
				buf, buf->vb.i);

		} else {
746
			list_add_tail(&buf->vb.queue, &vidq->queued);
747
			buf->vb.state = VIDEOBUF_QUEUED;
748 749
			dprintk(dev, 2,
				"[%p/%d] buffer_queue - first queued\n",
750 751 752 753 754
				buf, buf->vb.i);
		}
	}
}

755 756
static void buffer_release(struct videobuf_queue *vq,
			   struct videobuf_buffer *vb)
757
{
758
	struct vivi_buffer   *buf  = container_of(vb, struct vivi_buffer, vb);
759
	struct vivi_fh       *fh   = vq->priv_data;
760
	struct vivi_dev      *dev  = (struct vivi_dev *)fh->dev;
761 762
	struct vivi_dmaqueue *vidq = &dev->vidq;

763
	dprintk(dev, 1, "%s\n", __FUNCTION__);
764 765 766

	vivi_stop_thread(vidq);

767
	free_buffer(vq, buf);
768 769 770 771 772 773 774 775 776
}

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

777 778 779
/* ------------------------------------------------------------------
	IOCTL vidioc handling
   ------------------------------------------------------------------*/
780
static int vidioc_querycap(struct file *file, void  *priv,
781 782 783 784 785 786 787 788 789 790 791
					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;
}

792
static int vidioc_enum_fmt_cap(struct file *file, void  *priv,
793 794 795 796 797
					struct v4l2_fmtdesc *f)
{
	if (f->index > 0)
		return -EINVAL;

798
	strlcpy(f->description, format.name, sizeof(f->description));
799 800 801 802
	f->pixelformat = format.fourcc;
	return 0;
}

803
static int vidioc_g_fmt_cap(struct file *file, void *priv,
804 805
					struct v4l2_format *f)
{
806
	struct vivi_fh *fh = priv;
807 808 809 810 811 812 813 814 815 816 817 818 819

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

820
static int vidioc_try_fmt_cap(struct file *file, void *priv,
821 822
			struct v4l2_format *f)
{
823 824
	struct vivi_fh  *fh  = priv;
	struct vivi_dev *dev = fh->dev;
825 826 827 828 829
	struct vivi_fmt *fmt;
	enum v4l2_field field;
	unsigned int maxw, maxh;

	if (format.fourcc != f->fmt.pix.pixelformat) {
830 831 832
		dprintk(dev, 1, "Fourcc format (0x%08x) invalid. "
			"Driver accepts only 0x%08x\n",
			f->fmt.pix.pixelformat, format.fourcc);
833 834
		return -EINVAL;
	}
835
	fmt = &format;
836 837 838 839

	field = f->fmt.pix.field;

	if (field == V4L2_FIELD_ANY) {
840
		field = V4L2_FIELD_INTERLACED;
841
	} else if (V4L2_FIELD_INTERLACED != field) {
842
		dprintk(dev, 1, "Field type invalid.\n");
843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
		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;
}

867
/*FIXME: This seems to be generic enough to be at videodev2 */
868
static int vidioc_s_fmt_cap(struct file *file, void *priv,
869
					struct v4l2_format *f)
870
{
871 872
	struct vivi_fh  *fh = priv;
	int ret = vidioc_try_fmt_cap(file, fh, f);
873 874 875 876 877 878 879 880 881 882
	if (ret < 0)
		return (ret);

	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;

	return (0);
883 884
}

885 886
static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *p)
887
{
888
	struct vivi_fh  *fh = priv;
889

890
	return (videobuf_reqbufs(&fh->vb_vidq, p));
891 892
}

893
static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
894
{
895
	struct vivi_fh  *fh = priv;
896

897 898
	return (videobuf_querybuf(&fh->vb_vidq, p));
}
899

900
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
901
{
902
	struct vivi_fh *fh = priv;
903

904 905
	return (videobuf_qbuf(&fh->vb_vidq, p));
}
906

907
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
908
{
909
	struct vivi_fh  *fh = priv;
910

911 912 913
	return (videobuf_dqbuf(&fh->vb_vidq, p,
				file->f_flags & O_NONBLOCK));
}
914

915
#ifdef CONFIG_VIDEO_V4L1_COMPAT
916
static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
917
{
918
	struct vivi_fh  *fh = priv;
919

920
	return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
921 922
}
#endif
923

924
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
925
{
926
	struct vivi_fh  *fh = priv;
927

928 929 930 931
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
932

933
	return videobuf_streamon(&fh->vb_vidq);
934
}
935

936
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
937
{
938
	struct vivi_fh  *fh = priv;
939

940 941 942 943
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (i != fh->type)
		return -EINVAL;
944

945
	return videobuf_streamoff(&fh->vb_vidq);
946 947
}

948
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
949 950 951
{
	return 0;
}
952

953
/* only one input in this sample driver */
954
static int vidioc_enum_input(struct file *file, void *priv,
955 956 957 958
				struct v4l2_input *inp)
{
	if (inp->index != 0)
		return -EINVAL;
959

960
	inp->type = V4L2_INPUT_TYPE_CAMERA;
961
	inp->std = V4L2_STD_525_60;
962
	strcpy(inp->name, "Camera");
963

964 965
	return (0);
}
966

967
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
968 969
{
	*i = 0;
970

971 972
	return (0);
}
973
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
974 975 976
{
	if (i > 0)
		return -EINVAL;
977

978 979
	return (0);
}
980 981

	/* --- controls ---------------------------------------------- */
982 983
static int vidioc_queryctrl(struct file *file, void *priv,
			    struct v4l2_queryctrl *qc)
984 985
{
	int i;
986

987 988 989 990 991 992
	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);
		}
993

994 995
	return -EINVAL;
}
996

997 998
static int vidioc_g_ctrl(struct file *file, void *priv,
			 struct v4l2_control *ctrl)
999 1000
{
	int i;
1001

1002 1003
	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (ctrl->id == vivi_qctrl[i].id) {
1004
			ctrl->value = qctl_regs[i];
1005 1006
			return (0);
		}
1007

1008
	return -EINVAL;
1009
}
1010
static int vidioc_s_ctrl(struct file *file, void *priv,
1011
				struct v4l2_control *ctrl)
1012
{
1013 1014 1015 1016
	int i;

	for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
		if (ctrl->id == vivi_qctrl[i].id) {
1017 1018
			if (ctrl->value < vivi_qctrl[i].minimum
			    || ctrl->value > vivi_qctrl[i].maximum) {
1019 1020
					return (-ERANGE);
				}
1021
			qctl_regs[i] = ctrl->value;
1022 1023 1024
			return (0);
		}
	return -EINVAL;
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
}

/* ------------------------------------------------------------------
	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);
1036
	struct vivi_dev *dev;
1037 1038 1039
	struct vivi_fh *fh;
	int i;

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

1042
	list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
1043
		if (dev->vfd->minor == minor)
1044 1045
			goto found;
	return -ENODEV;
1046

1047
found:
1048 1049 1050
	/* If more than one user, mutex should be added */
	dev->users++;

1051
	dprintk(dev, 1, "open minor=%d type=%s users=%d\n", minor,
1052
		v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
1053 1054

	/* allocate + initialize per filehandle data */
1055
	fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1056 1057 1058 1059 1060 1061 1062
	if (NULL == fh) {
		dev->users--;
		return -ENOMEM;
	}

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

1064 1065 1066 1067 1068 1069 1070
	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++)
1071
		qctl_regs[i] = vivi_qctrl[i].default_value;
1072 1073

	/* Resets frame counters */
1074 1075 1076
	dev->h = 0;
	dev->m = 0;
	dev->s = 0;
1077
	dev->ms = 0;
1078 1079 1080
	dev->mv_count = 0;
	dev->jiffies = jiffies;
	sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
1081
			dev->h, dev->m, dev->s, dev->ms);
1082

1083
	videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
1084
			NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
1085
			sizeof(struct vivi_buffer), fh);
1086 1087 1088 1089 1090 1091 1092

	return 0;
}

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

1095
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1096
		return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
1097 1098 1099 1100 1101 1102 1103 1104
					file->f_flags & O_NONBLOCK);
	}
	return 0;
}

static unsigned int
vivi_poll(struct file *file, struct poll_table_struct *wait)
{
1105
	struct vivi_fh        *fh = file->private_data;
1106
	struct vivi_dev       *dev = fh->dev;
1107
	struct videobuf_queue *q = &fh->vb_vidq;
1108

1109
	dprintk(dev, 1, "%s\n", __FUNCTION__);
1110 1111 1112 1113

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

1114
	return videobuf_poll_stream(file, q, wait);
1115 1116
}

1117
static int vivi_close(struct inode *inode, struct file *file)
1118
{
1119 1120
	struct vivi_fh         *fh = file->private_data;
	struct vivi_dev *dev       = fh->dev;
1121 1122 1123 1124 1125
	struct vivi_dmaqueue *vidq = &dev->vidq;

	int minor = iminor(inode);

	vivi_stop_thread(vidq);
1126
	videobuf_stop(&fh->vb_vidq);
1127 1128
	videobuf_mmap_free(&fh->vb_vidq);

1129
	kfree(fh);
1130 1131 1132

	dev->users--;

1133 1134
	dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
		minor, dev->users);
1135 1136 1137 1138

	return 0;
}

1139
static int vivi_release(void)
1140
{
1141 1142 1143 1144 1145 1146 1147
	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);
1148

1149 1150 1151 1152 1153 1154 1155
		if (-1 != dev->vfd->minor)
			video_unregister_device(dev->vfd);
		else
			video_device_release(dev->vfd);

		kfree(dev);
	}
1156 1157 1158 1159

	return 0;
}

1160
static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
1161
{
1162 1163
	struct vivi_fh  *fh = file->private_data;
	struct vivi_dev *dev = fh->dev;
1164 1165
	int ret;

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

1168
	ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1169

1170
	dprintk(dev, 1, "vma start=0x%08lx, size=%ld, ret=%d\n",
1171 1172 1173 1174 1175 1176 1177
		(unsigned long)vma->vm_start,
		(unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
		ret);

	return ret;
}

1178
static const struct file_operations vivi_fops = {
1179 1180
	.owner		= THIS_MODULE,
	.open           = vivi_open,
1181
	.release        = vivi_close,
1182 1183
	.read           = vivi_read,
	.poll		= vivi_poll,
1184
	.ioctl          = video_ioctl2, /* V4L2 ioctl handler */
1185
        .compat_ioctl   = v4l_compat_ioctl32,
1186
	.mmap           = vivi_mmap,
1187 1188 1189
	.llseek         = no_llseek,
};

1190
static struct video_device vivi_template = {
1191
	.name		= "vivi",
1192 1193 1194
	.type		= VID_TYPE_CAPTURE,
	.fops           = &vivi_fops,
	.minor		= -1,
1195
	.release	= video_device_release,
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214

	.vidioc_querycap      = vidioc_querycap,
	.vidioc_enum_fmt_cap  = vidioc_enum_fmt_cap,
	.vidioc_g_fmt_cap     = vidioc_g_fmt_cap,
	.vidioc_try_fmt_cap   = vidioc_try_fmt_cap,
	.vidioc_s_fmt_cap     = vidioc_s_fmt_cap,
	.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,
1215
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1216 1217
	.vidiocgmbuf          = vidiocgmbuf,
#endif
1218
	.tvnorms              = V4L2_STD_525_60,
1219
	.current_norm         = V4L2_STD_NTSC_M,
1220
};
1221
/* -----------------------------------------------------------------
1222 1223 1224 1225 1226
	Initialization and module stuff
   ------------------------------------------------------------------*/

static int __init vivi_init(void)
{
1227
	int ret = -ENOMEM, i;
1228
	struct vivi_dev *dev;
1229
	struct video_device *vfd;
1230

1231 1232 1233 1234
	for (i = 0; i < n_devs; i++) {
		dev = kzalloc(sizeof(*dev), GFP_KERNEL);
		if (NULL == dev)
			break;
1235

1236
		list_add_tail(&dev->vivi_devlist, &vivi_devlist);
1237

1238 1239 1240 1241
		/* init video dma queues */
		INIT_LIST_HEAD(&dev->vidq.active);
		INIT_LIST_HEAD(&dev->vidq.queued);
		init_waitqueue_head(&dev->vidq.wq);
1242

1243 1244
		/* initialize locks */
		mutex_init(&dev->lock);
1245
		spin_lock_init(&dev->slock);
1246

1247 1248 1249
		dev->vidq.timeout.function = vivi_vid_timeout;
		dev->vidq.timeout.data     = (unsigned long)dev;
		init_timer(&dev->vidq.timeout);
1250

1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262
		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);
1263

1264 1265
		if (video_nr >= 0)
			video_nr++;
1266

1267 1268
		dev->vfd = vfd;
	}
1269

1270 1271 1272 1273 1274 1275
	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 "
				 "Capture Board successfully loaded.\n");
1276 1277 1278 1279 1280
	return ret;
}

static void __exit vivi_exit(void)
{
1281
	vivi_release();
1282 1283 1284 1285
}

module_init(vivi_init);
module_exit(vivi_exit);
1286 1287 1288 1289 1290 1291

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

1294 1295
module_param(n_devs, int, 0);
MODULE_PARM_DESC(n_devs, "number of video devices to create");
1296

1297
module_param_named(debug, vivi_template.debug, int, 0444);
1298
MODULE_PARM_DESC(debug, "activates debug info");
1299

1300 1301
module_param(vid_limit, int, 0644);
MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");