videobuf-core.c 24.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * generic helper functions for handling video4linux capture buffers
 *
 * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
 *
 * Highly based on video-buf written originally by:
 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
 * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
 * (c) 2006 Ted Walther and John Sokol
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
19
#include <linux/mm.h>
20 21 22 23 24 25
#include <linux/slab.h>
#include <linux/interrupt.h>

#include <media/videobuf-core.h>

#define MAGIC_BUFFER 0x20070728
26 27 28 29
#define MAGIC_CHECK(is, should) do {					   \
	if (unlikely((is) != (should))) {				   \
	printk(KERN_ERR "magic mismatch: %x (expected %x)\n", is, should); \
	BUG(); } } while (0)
30

31
static int debug;
32 33 34 35 36 37
module_param(debug, int, 0644);

MODULE_DESCRIPTION("helper module to manage video4linux buffers");
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
MODULE_LICENSE("GPL");

38 39 40
#define dprintk(level, fmt, arg...) do {			\
	if (debug >= level) 					\
	printk(KERN_DEBUG "vbuf: " fmt , ## arg); } while (0)
41 42 43 44

/* --------------------------------------------------------------------- */

#define CALL(q, f, arg...)						\
45
	((q->int_ops->f) ? q->int_ops->f(arg) : 0)
46

47
void *videobuf_alloc(struct videobuf_queue *q)
48 49 50
{
	struct videobuf_buffer *vb;

51
	BUG_ON(q->msize < sizeof(*vb));
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

	if (!q->int_ops || !q->int_ops->alloc) {
		printk(KERN_ERR "No specific ops defined!\n");
		BUG();
	}

	vb = q->int_ops->alloc(q->msize);

	if (NULL != vb) {
		init_waitqueue_head(&vb->done);
		vb->magic     = MAGIC_BUFFER;
	}

	return vb;
}

68 69
#define WAITON_CONDITION (vb->state != VIDEOBUF_ACTIVE &&\
				vb->state != VIDEOBUF_QUEUED)
70 71
int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
{
72
	MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
73 74 75 76 77 78

	if (non_blocking) {
		if (WAITON_CONDITION)
			return 0;
		else
			return -EAGAIN;
79
	}
80 81 82 83 84 85 86

	if (intr)
		return wait_event_interruptible(vb->done, WAITON_CONDITION);
	else
		wait_event(vb->done, WAITON_CONDITION);

	return 0;
87 88
}

89
int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb,
90 91
		    struct v4l2_framebuffer *fbuf)
{
92 93
	MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
94

95
	return CALL(q, iolock, q, vb, fbuf);
96 97
}

98 99 100
void *videobuf_queue_to_vmalloc (struct videobuf_queue *q,
			   struct videobuf_buffer *buf)
{
101 102 103 104
	if (q->int_ops->vmalloc)
		return q->int_ops->vmalloc(buf);
	else
		return NULL;
105 106 107
}
EXPORT_SYMBOL_GPL(videobuf_queue_to_vmalloc);

108 109 110
/* --------------------------------------------------------------------- */


111
void videobuf_queue_core_init(struct videobuf_queue *q,
112
			 struct videobuf_queue_ops *ops,
113
			 struct device *dev,
114 115 116 117
			 spinlock_t *irqlock,
			 enum v4l2_buf_type type,
			 enum v4l2_field field,
			 unsigned int msize,
118 119
			 void *priv,
			 struct videobuf_qtype_ops *int_ops)
120
{
121
	BUG_ON(!q);
122
	memset(q, 0, sizeof(*q));
123 124 125 126 127 128
	q->irqlock   = irqlock;
	q->dev       = dev;
	q->type      = type;
	q->field     = field;
	q->msize     = msize;
	q->ops       = ops;
129
	q->priv_data = priv;
130
	q->int_ops   = int_ops;
131 132

	/* All buffer operations are mandatory */
133 134 135 136
	BUG_ON(!q->ops->buf_setup);
	BUG_ON(!q->ops->buf_prepare);
	BUG_ON(!q->ops->buf_queue);
	BUG_ON(!q->ops->buf_release);
137

138 139 140
	/* Lock is mandatory for queue_cancel to work */
	BUG_ON(!irqlock);

141
	/* Having implementations for abstract methods are mandatory */
142
	BUG_ON(!q->int_ops);
143

144
	mutex_init(&q->vb_lock);
145
	init_waitqueue_head(&q->wait);
146 147 148
	INIT_LIST_HEAD(&q->stream);
}

149
/* Locking: Only usage in bttv unsafe find way to remove */
150 151 152 153
int videobuf_queue_is_busy(struct videobuf_queue *q)
{
	int i;

154
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
155 156

	if (q->streaming) {
157
		dprintk(1, "busy: streaming active\n");
158 159 160
		return 1;
	}
	if (q->reading) {
161
		dprintk(1, "busy: pending read #1\n");
162 163 164
		return 1;
	}
	if (q->read_buf) {
165
		dprintk(1, "busy: pending read #2\n");
166 167 168 169 170
		return 1;
	}
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
171
		if (q->bufs[i]->map) {
172
			dprintk(1, "busy: buffer #%d mapped\n", i);
173 174
			return 1;
		}
175
		if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
176
			dprintk(1, "busy: buffer #%d queued\n", i);
177 178
			return 1;
		}
179
		if (q->bufs[i]->state == VIDEOBUF_ACTIVE) {
180
			dprintk(1, "busy: buffer #%d avtive\n", i);
181 182 183 184 185 186
			return 1;
		}
	}
	return 0;
}

187
/* Locking: Caller holds q->vb_lock */
188 189
void videobuf_queue_cancel(struct videobuf_queue *q)
{
190
	unsigned long flags = 0;
191 192
	int i;

193 194 195 196
	q->streaming = 0;
	q->reading  = 0;
	wake_up_interruptible_sync(&q->wait);

197
	/* remove queued buffers from list */
198
	spin_lock_irqsave(q->irqlock, flags);
199 200 201
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
202
		if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
203
			list_del(&q->bufs[i]->queue);
204
			q->bufs[i]->state = VIDEOBUF_ERROR;
205
			wake_up_all(&q->bufs[i]->done);
206 207
		}
	}
208
	spin_unlock_irqrestore(q->irqlock, flags);
209 210 211 212 213

	/* free all buffers + clear queue */
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
214
		q->ops->buf_release(q, q->bufs[i]);
215 216 217 218 219 220
	}
	INIT_LIST_HEAD(&q->stream);
}

/* --------------------------------------------------------------------- */

221
/* Locking: Caller holds q->vb_lock */
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
{
	enum v4l2_field field = q->field;

	BUG_ON(V4L2_FIELD_ANY == field);

	if (V4L2_FIELD_ALTERNATE == field) {
		if (V4L2_FIELD_TOP == q->last) {
			field   = V4L2_FIELD_BOTTOM;
			q->last = V4L2_FIELD_BOTTOM;
		} else {
			field   = V4L2_FIELD_TOP;
			q->last = V4L2_FIELD_TOP;
		}
	}
	return field;
}

240
/* Locking: Caller holds q->vb_lock */
241 242 243
static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
			    struct videobuf_buffer *vb, enum v4l2_buf_type type)
{
244 245
	MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265

	b->index    = vb->i;
	b->type     = type;

	b->memory   = vb->memory;
	switch (b->memory) {
	case V4L2_MEMORY_MMAP:
		b->m.offset  = vb->boff;
		b->length    = vb->bsize;
		break;
	case V4L2_MEMORY_USERPTR:
		b->m.userptr = vb->baddr;
		b->length    = vb->bsize;
		break;
	case V4L2_MEMORY_OVERLAY:
		b->m.offset  = vb->boff;
		break;
	}

	b->flags    = 0;
266
	if (vb->map)
267 268 269
		b->flags |= V4L2_BUF_FLAG_MAPPED;

	switch (vb->state) {
270 271 272
	case VIDEOBUF_PREPARED:
	case VIDEOBUF_QUEUED:
	case VIDEOBUF_ACTIVE:
273 274
		b->flags |= V4L2_BUF_FLAG_QUEUED;
		break;
275 276
	case VIDEOBUF_DONE:
	case VIDEOBUF_ERROR:
277 278
		b->flags |= V4L2_BUF_FLAG_DONE;
		break;
279 280
	case VIDEOBUF_NEEDS_INIT:
	case VIDEOBUF_IDLE:
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
		/* nothing */
		break;
	}

	if (vb->input != UNSET) {
		b->flags |= V4L2_BUF_FLAG_INPUT;
		b->input  = vb->input;
	}

	b->field     = vb->field;
	b->timestamp = vb->ts;
	b->bytesused = vb->size;
	b->sequence  = vb->field_count >> 1;
}

296
/* Locking: Caller holds q->vb_lock */
297 298 299 300 301 302 303 304
static int __videobuf_mmap_free(struct videobuf_queue *q)
{
	int i;
	int rc;

	if (!q)
		return 0;

305
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
306

307

308
	rc  = CALL(q, mmap_free, q);
309 310 311

	q->is_mmapped = 0;

312
	if (rc < 0)
313 314 315 316 317
		return rc;

	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
318
		q->ops->buf_release(q, q->bufs[i]);
319 320 321 322 323 324 325 326 327 328
		kfree(q->bufs[i]);
		q->bufs[i] = NULL;
	}

	return rc;
}

int videobuf_mmap_free(struct videobuf_queue *q)
{
	int ret;
329
	mutex_lock(&q->vb_lock);
330
	ret = __videobuf_mmap_free(q);
331
	mutex_unlock(&q->vb_lock);
332 333 334
	return ret;
}

335
/* Locking: Caller holds q->vb_lock */
336
int __videobuf_mmap_setup(struct videobuf_queue *q,
337 338 339 340 341 342
			unsigned int bcount, unsigned int bsize,
			enum v4l2_memory memory)
{
	unsigned int i;
	int err;

343
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373

	err = __videobuf_mmap_free(q);
	if (0 != err)
		return err;

	/* Allocate and initialize buffers */
	for (i = 0; i < bcount; i++) {
		q->bufs[i] = videobuf_alloc(q);

		if (q->bufs[i] == NULL)
			break;

		q->bufs[i]->i      = i;
		q->bufs[i]->input  = UNSET;
		q->bufs[i]->memory = memory;
		q->bufs[i]->bsize  = bsize;
		switch (memory) {
		case V4L2_MEMORY_MMAP:
			q->bufs[i]->boff  = bsize * i;
			break;
		case V4L2_MEMORY_USERPTR:
		case V4L2_MEMORY_OVERLAY:
			/* nothing */
			break;
		}
	}

	if (!i)
		return -ENOMEM;

374
	dprintk(1, "mmap setup: %d buffers, %d bytes each\n",
375 376 377 378 379 380 381 382 383 384
		i, bsize);

	return i;
}

int videobuf_mmap_setup(struct videobuf_queue *q,
			unsigned int bcount, unsigned int bsize,
			enum v4l2_memory memory)
{
	int ret;
385
	mutex_lock(&q->vb_lock);
386
	ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
387
	mutex_unlock(&q->vb_lock);
388 389 390
	return ret;
}

391 392 393
int videobuf_reqbufs(struct videobuf_queue *q,
		 struct v4l2_requestbuffers *req)
{
394
	unsigned int size, count;
395 396 397
	int retval;

	if (req->count < 1) {
398
		dprintk(1, "reqbufs: count invalid (%d)\n", req->count);
399 400
		return -EINVAL;
	}
401

402 403 404
	if (req->memory != V4L2_MEMORY_MMAP     &&
	    req->memory != V4L2_MEMORY_USERPTR  &&
	    req->memory != V4L2_MEMORY_OVERLAY) {
405
		dprintk(1, "reqbufs: memory type invalid\n");
406 407 408
		return -EINVAL;
	}

409
	mutex_lock(&q->vb_lock);
410
	if (req->type != q->type) {
411
		dprintk(1, "reqbufs: queue type invalid\n");
412 413 414 415
		retval = -EINVAL;
		goto done;
	}

416
	if (q->streaming) {
417
		dprintk(1, "reqbufs: streaming already exists\n");
418 419
		retval = -EBUSY;
		goto done;
420 421
	}
	if (!list_empty(&q->stream)) {
422
		dprintk(1, "reqbufs: stream running\n");
423 424
		retval = -EBUSY;
		goto done;
425 426 427 428 429 430
	}

	count = req->count;
	if (count > VIDEO_MAX_FRAME)
		count = VIDEO_MAX_FRAME;
	size = 0;
431
	q->ops->buf_setup(q, &count, &size);
432
	size = PAGE_ALIGN(size);
433
	dprintk(1, "reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
434 435
		count, size, (count*size)>>PAGE_SHIFT);

436
	retval = __videobuf_mmap_setup(q, count, size, req->memory);
437
	if (retval < 0) {
438
		dprintk(1, "reqbufs: mmap setup returned %d\n", retval);
439 440 441
		goto done;
	}

442
	req->count = retval;
443
	retval = 0;
444 445

 done:
446
	mutex_unlock(&q->vb_lock);
447 448 449 450 451
	return retval;
}

int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
{
452 453
	int ret = -EINVAL;

454
	mutex_lock(&q->vb_lock);
455
	if (unlikely(b->type != q->type)) {
456
		dprintk(1, "querybuf: Wrong type.\n");
457
		goto done;
458
	}
459
	if (unlikely(b->index >= VIDEO_MAX_FRAME)) {
460
		dprintk(1, "querybuf: index out of range.\n");
461
		goto done;
462 463
	}
	if (unlikely(NULL == q->bufs[b->index])) {
464
		dprintk(1, "querybuf: buffer is null.\n");
465
		goto done;
466
	}
467

468
	videobuf_status(q, b, q->bufs[b->index], q->type);
469 470 471

	ret = 0;
done:
472
	mutex_unlock(&q->vb_lock);
473
	return ret;
474 475 476 477 478 479 480
}

int videobuf_qbuf(struct videobuf_queue *q,
	      struct v4l2_buffer *b)
{
	struct videobuf_buffer *buf;
	enum v4l2_field field;
481
	unsigned long flags = 0;
482 483
	int retval;

484
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
485

486 487 488
	if (b->memory == V4L2_MEMORY_MMAP)
		down_read(&current->mm->mmap_sem);

489
	mutex_lock(&q->vb_lock);
490 491
	retval = -EBUSY;
	if (q->reading) {
492
		dprintk(1, "qbuf: Reading running...\n");
493 494 495 496
		goto done;
	}
	retval = -EINVAL;
	if (b->type != q->type) {
497
		dprintk(1, "qbuf: Wrong type.\n");
498 499
		goto done;
	}
500
	if (b->index >= VIDEO_MAX_FRAME) {
501
		dprintk(1, "qbuf: index out of range.\n");
502 503 504 505
		goto done;
	}
	buf = q->bufs[b->index];
	if (NULL == buf) {
506
		dprintk(1, "qbuf: buffer is null.\n");
507 508
		goto done;
	}
509
	MAGIC_CHECK(buf->magic, MAGIC_BUFFER);
510
	if (buf->memory != b->memory) {
511
		dprintk(1, "qbuf: memory type is wrong.\n");
512 513
		goto done;
	}
514
	if (buf->state != VIDEOBUF_NEEDS_INIT && buf->state != VIDEOBUF_IDLE) {
515
		dprintk(1, "qbuf: buffer is already queued or active.\n");
516 517 518 519 520
		goto done;
	}

	if (b->flags & V4L2_BUF_FLAG_INPUT) {
		if (b->input >= q->inputs) {
521
			dprintk(1, "qbuf: wrong input.\n");
522 523 524 525 526 527 528 529 530 531
			goto done;
		}
		buf->input = b->input;
	} else {
		buf->input = UNSET;
	}

	switch (b->memory) {
	case V4L2_MEMORY_MMAP:
		if (0 == buf->baddr) {
532 533
			dprintk(1, "qbuf: mmap requested "
				   "but buffer addr is zero!\n");
534 535 536 537 538
			goto done;
		}
		break;
	case V4L2_MEMORY_USERPTR:
		if (b->length < buf->bsize) {
539
			dprintk(1, "qbuf: buffer length is not enough\n");
540 541
			goto done;
		}
542 543 544
		if (VIDEOBUF_NEEDS_INIT != buf->state &&
		    buf->baddr != b->m.userptr)
			q->ops->buf_release(q, buf);
545 546 547 548 549 550
		buf->baddr = b->m.userptr;
		break;
	case V4L2_MEMORY_OVERLAY:
		buf->boff = b->m.offset;
		break;
	default:
551
		dprintk(1, "qbuf: wrong memory type\n");
552 553 554
		goto done;
	}

555
	dprintk(1, "qbuf: requesting next field\n");
556
	field = videobuf_next_field(q);
557
	retval = q->ops->buf_prepare(q, buf, field);
558
	if (0 != retval) {
559
		dprintk(1, "qbuf: buffer_prepare returned %d\n", retval);
560 561 562
		goto done;
	}

563
	list_add_tail(&buf->stream, &q->stream);
564
	if (q->streaming) {
565
		spin_lock_irqsave(q->irqlock, flags);
566
		q->ops->buf_queue(q, buf);
567
		spin_unlock_irqrestore(q->irqlock, flags);
568
	}
569
	dprintk(1, "qbuf: succeded\n");
570
	retval = 0;
571
	wake_up_interruptible_sync(&q->wait);
572 573

 done:
574
	mutex_unlock(&q->vb_lock);
575 576 577 578

	if (b->memory == V4L2_MEMORY_MMAP)
		up_read(&current->mm->mmap_sem);

579 580 581
	return retval;
}

582 583 584

/* Locking: Caller holds q->vb_lock */
static int stream_next_buffer_check_queue(struct videobuf_queue *q, int noblock)
585 586 587
{
	int retval;

588 589 590 591
checks:
	if (!q->streaming) {
		dprintk(1, "next_buffer: Not streaming\n");
		retval = -EINVAL;
592 593
		goto done;
	}
594

595
	if (list_empty(&q->stream)) {
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
		if (noblock) {
			retval = -EAGAIN;
			dprintk(2, "next_buffer: no buffers to dequeue\n");
			goto done;
		} else {
			dprintk(2, "next_buffer: waiting on buffer\n");

			/* Drop lock to avoid deadlock with qbuf */
			mutex_unlock(&q->vb_lock);

			/* Checking list_empty and streaming is safe without
			 * locks because we goto checks to validate while
			 * holding locks before proceeding */
			retval = wait_event_interruptible(q->wait,
				!list_empty(&q->stream) || !q->streaming);
			mutex_lock(&q->vb_lock);

			if (retval)
				goto done;

			goto checks;
		}
618
	}
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637

	retval = 0;

done:
	return retval;
}


/* Locking: Caller holds q->vb_lock */
static int stream_next_buffer(struct videobuf_queue *q,
			struct videobuf_buffer **vb, int nonblocking)
{
	int retval;
	struct videobuf_buffer *buf = NULL;

	retval = stream_next_buffer_check_queue(q, nonblocking);
	if (retval)
		goto done;

638 639
	buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
	retval = videobuf_waiton(buf, nonblocking, 1);
640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
	if (retval < 0)
		goto done;

	*vb = buf;
done:
	return retval;
}

int videobuf_dqbuf(struct videobuf_queue *q,
	       struct v4l2_buffer *b, int nonblocking)
{
	struct videobuf_buffer *buf = NULL;
	int retval;

	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);

656
	mutex_lock(&q->vb_lock);
657 658

	retval = stream_next_buffer(q, &buf, nonblocking);
659
	if (retval < 0) {
660
		dprintk(1, "dqbuf: next_buffer error: %i\n", retval);
661 662
		goto done;
	}
663

664
	switch (buf->state) {
665
	case VIDEOBUF_ERROR:
666
		dprintk(1, "dqbuf: state is error\n");
667
		retval = -EIO;
668
		CALL(q, sync, q, buf);
669
		buf->state = VIDEOBUF_IDLE;
670
		break;
671
	case VIDEOBUF_DONE:
672 673
		dprintk(1, "dqbuf: state is done\n");
		CALL(q, sync, q, buf);
674
		buf->state = VIDEOBUF_IDLE;
675 676
		break;
	default:
677
		dprintk(1, "dqbuf: state invalid\n");
678 679 680 681
		retval = -EINVAL;
		goto done;
	}
	list_del(&buf->stream);
682 683
	memset(b, 0, sizeof(*b));
	videobuf_status(q, b, buf, q->type);
684 685

 done:
686
	mutex_unlock(&q->vb_lock);
687 688 689 690 691 692
	return retval;
}

int videobuf_streamon(struct videobuf_queue *q)
{
	struct videobuf_buffer *buf;
693
	unsigned long flags = 0;
694 695
	int retval;

696
	mutex_lock(&q->vb_lock);
697 698 699 700 701 702 703
	retval = -EBUSY;
	if (q->reading)
		goto done;
	retval = 0;
	if (q->streaming)
		goto done;
	q->streaming = 1;
704
	spin_lock_irqsave(q->irqlock, flags);
705
	list_for_each_entry(buf, &q->stream, stream)
706
		if (buf->state == VIDEOBUF_PREPARED)
707
			q->ops->buf_queue(q, buf);
708
	spin_unlock_irqrestore(q->irqlock, flags);
709

710
	wake_up_interruptible_sync(&q->wait);
711
 done:
712
	mutex_unlock(&q->vb_lock);
713 714 715
	return retval;
}

716
/* Locking: Caller holds q->vb_lock */
717
static int __videobuf_streamoff(struct videobuf_queue *q)
718 719
{
	if (!q->streaming)
720 721
		return -EINVAL;

722 723
	videobuf_queue_cancel(q);

724 725 726 727 728 729 730
	return 0;
}

int videobuf_streamoff(struct videobuf_queue *q)
{
	int retval;

731
	mutex_lock(&q->vb_lock);
732
	retval = __videobuf_streamoff(q);
733
	mutex_unlock(&q->vb_lock);
734

735 736 737
	return retval;
}

738
/* Locking: Caller holds q->vb_lock */
739 740 741 742 743
static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
				      char __user *data,
				      size_t count, loff_t *ppos)
{
	enum v4l2_field field;
744
	unsigned long flags = 0;
745 746
	int retval;

747
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
748 749 750 751 752 753 754 755 756 757 758

	/* setup stuff */
	q->read_buf = videobuf_alloc(q);
	if (NULL == q->read_buf)
		return -ENOMEM;

	q->read_buf->memory = V4L2_MEMORY_USERPTR;
	q->read_buf->baddr  = (unsigned long)data;
	q->read_buf->bsize  = count;

	field = videobuf_next_field(q);
759
	retval = q->ops->buf_prepare(q, q->read_buf, field);
760 761 762 763
	if (0 != retval)
		goto done;

	/* start capture & wait */
764
	spin_lock_irqsave(q->irqlock, flags);
765
	q->ops->buf_queue(q, q->read_buf);
766
	spin_unlock_irqrestore(q->irqlock, flags);
767
	retval = videobuf_waiton(q->read_buf, 0, 0);
768
	if (0 == retval) {
769
		CALL(q, sync, q, q->read_buf);
770
		if (VIDEOBUF_ERROR == q->read_buf->state)
771 772 773 774 775 776 777
			retval = -EIO;
		else
			retval = q->read_buf->size;
	}

 done:
	/* cleanup */
778
	q->ops->buf_release(q, q->read_buf);
779 780 781 782 783 784 785 786 787 788
	kfree(q->read_buf);
	q->read_buf = NULL;
	return retval;
}

ssize_t videobuf_read_one(struct videobuf_queue *q,
			  char __user *data, size_t count, loff_t *ppos,
			  int nonblocking)
{
	enum v4l2_field field;
789
	unsigned long flags = 0;
790
	unsigned size = 0, nbufs = 1;
791 792
	int retval;

793
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
794

795
	mutex_lock(&q->vb_lock);
796

797
	q->ops->buf_setup(q, &nbufs, &size);
798 799 800 801

	if (NULL == q->read_buf  &&
	    count >= size        &&
	    !nonblocking) {
802
		retval = videobuf_read_zerocopy(q, data, count, ppos);
803 804 805 806 807 808 809 810 811 812 813
		if (retval >= 0  ||  retval == -EIO)
			/* ok, all done */
			goto done;
		/* fallback to kernel bounce buffer on failures */
	}

	if (NULL == q->read_buf) {
		/* need to capture a new frame */
		retval = -ENOMEM;
		q->read_buf = videobuf_alloc(q);

814
		dprintk(1, "video alloc=0x%p\n", q->read_buf);
815 816 817 818 819
		if (NULL == q->read_buf)
			goto done;
		q->read_buf->memory = V4L2_MEMORY_USERPTR;
		q->read_buf->bsize = count; /* preferred size */
		field = videobuf_next_field(q);
820
		retval = q->ops->buf_prepare(q, q->read_buf, field);
821 822

		if (0 != retval) {
823
			kfree(q->read_buf);
824 825 826 827
			q->read_buf = NULL;
			goto done;
		}

828
		spin_lock_irqsave(q->irqlock, flags);
829
		q->ops->buf_queue(q, q->read_buf);
830 831
		spin_unlock_irqrestore(q->irqlock, flags);

832 833 834 835 836 837 838 839
		q->read_off = 0;
	}

	/* wait until capture is done */
	retval = videobuf_waiton(q->read_buf, nonblocking, 1);
	if (0 != retval)
		goto done;

840
	CALL(q, sync, q, q->read_buf);
841

842
	if (VIDEOBUF_ERROR == q->read_buf->state) {
843
		/* catch I/O errors */
844
		q->ops->buf_release(q, q->read_buf);
845 846 847 848 849 850 851
		kfree(q->read_buf);
		q->read_buf = NULL;
		retval = -EIO;
		goto done;
	}

	/* Copy to userspace */
852 853
	retval = CALL(q, video_copy_to_user, q, data, count, nonblocking);
	if (retval < 0)
854 855 856 857 858
		goto done;

	q->read_off += retval;
	if (q->read_off == q->read_buf->size) {
		/* all data copied, cleanup */
859
		q->ops->buf_release(q, q->read_buf);
860 861 862 863 864
		kfree(q->read_buf);
		q->read_buf = NULL;
	}

 done:
865
	mutex_unlock(&q->vb_lock);
866 867 868
	return retval;
}

869
/* Locking: Caller holds q->vb_lock */
870
static int __videobuf_read_start(struct videobuf_queue *q)
871 872
{
	enum v4l2_field field;
873
	unsigned long flags = 0;
874
	unsigned int count = 0, size = 0;
875 876
	int err, i;

877
	q->ops->buf_setup(q, &count, &size);
878 879 880 881 882 883
	if (count < 2)
		count = 2;
	if (count > VIDEO_MAX_FRAME)
		count = VIDEO_MAX_FRAME;
	size = PAGE_ALIGN(size);

884
	err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
885
	if (err < 0)
886 887
		return err;

888 889
	count = err;

890 891
	for (i = 0; i < count; i++) {
		field = videobuf_next_field(q);
892
		err = q->ops->buf_prepare(q, q->bufs[i], field);
893 894 895 896
		if (err)
			return err;
		list_add_tail(&q->bufs[i]->stream, &q->stream);
	}
897
	spin_lock_irqsave(q->irqlock, flags);
898
	for (i = 0; i < count; i++)
899
		q->ops->buf_queue(q, q->bufs[i]);
900
	spin_unlock_irqrestore(q->irqlock, flags);
901 902 903 904
	q->reading = 1;
	return 0;
}

905
static void __videobuf_read_stop(struct videobuf_queue *q)
906 907 908 909
{
	int i;

	videobuf_queue_cancel(q);
910
	__videobuf_mmap_free(q);
911 912 913 914 915 916 917 918
	INIT_LIST_HEAD(&q->stream);
	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
		if (NULL == q->bufs[i])
			continue;
		kfree(q->bufs[i]);
		q->bufs[i] = NULL;
	}
	q->read_buf = NULL;
919

920 921
}

922 923 924 925
int videobuf_read_start(struct videobuf_queue *q)
{
	int rc;

926
	mutex_lock(&q->vb_lock);
927
	rc = __videobuf_read_start(q);
928
	mutex_unlock(&q->vb_lock);
929 930 931 932

	return rc;
}

933 934
void videobuf_read_stop(struct videobuf_queue *q)
{
935
	mutex_lock(&q->vb_lock);
936
	__videobuf_read_stop(q);
937
	mutex_unlock(&q->vb_lock);
938 939 940 941
}

void videobuf_stop(struct videobuf_queue *q)
{
942
	mutex_lock(&q->vb_lock);
943 944 945 946 947 948 949

	if (q->streaming)
		__videobuf_streamoff(q);

	if (q->reading)
		__videobuf_read_stop(q);

950
	mutex_unlock(&q->vb_lock);
951 952
}

953

954 955 956 957 958
ssize_t videobuf_read_stream(struct videobuf_queue *q,
			     char __user *data, size_t count, loff_t *ppos,
			     int vbihack, int nonblocking)
{
	int rc, retval;
959
	unsigned long flags = 0;
960

961
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
962

963
	dprintk(2, "%s\n", __func__);
964
	mutex_lock(&q->vb_lock);
965 966 967 968
	retval = -EBUSY;
	if (q->streaming)
		goto done;
	if (!q->reading) {
969
		retval = __videobuf_read_start(q);
970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990
		if (retval < 0)
			goto done;
	}

	retval = 0;
	while (count > 0) {
		/* get / wait for data */
		if (NULL == q->read_buf) {
			q->read_buf = list_entry(q->stream.next,
						 struct videobuf_buffer,
						 stream);
			list_del(&q->read_buf->stream);
			q->read_off = 0;
		}
		rc = videobuf_waiton(q->read_buf, nonblocking, 1);
		if (rc < 0) {
			if (0 == retval)
				retval = rc;
			break;
		}

991
		if (q->read_buf->state == VIDEOBUF_DONE) {
992
			rc = CALL(q, copy_stream, q, data + retval, count,
993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
					retval, vbihack, nonblocking);
			if (rc < 0) {
				retval = rc;
				break;
			}
			retval      += rc;
			count       -= rc;
			q->read_off += rc;
		} else {
			/* some error */
			q->read_off = q->read_buf->size;
			if (0 == retval)
				retval = -EIO;
		}

		/* requeue buffer when done with copying */
		if (q->read_off == q->read_buf->size) {
			list_add_tail(&q->read_buf->stream,
				      &q->stream);
1012
			spin_lock_irqsave(q->irqlock, flags);
1013
			q->ops->buf_queue(q, q->read_buf);
1014
			spin_unlock_irqrestore(q->irqlock, flags);
1015 1016 1017 1018 1019 1020 1021
			q->read_buf = NULL;
		}
		if (retval < 0)
			break;
	}

 done:
1022
	mutex_unlock(&q->vb_lock);
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
	return retval;
}

unsigned int videobuf_poll_stream(struct file *file,
				  struct videobuf_queue *q,
				  poll_table *wait)
{
	struct videobuf_buffer *buf = NULL;
	unsigned int rc = 0;

1033
	mutex_lock(&q->vb_lock);
1034 1035 1036 1037 1038 1039
	if (q->streaming) {
		if (!list_empty(&q->stream))
			buf = list_entry(q->stream.next,
					 struct videobuf_buffer, stream);
	} else {
		if (!q->reading)
1040
			__videobuf_read_start(q);
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
		if (!q->reading) {
			rc = POLLERR;
		} else if (NULL == q->read_buf) {
			q->read_buf = list_entry(q->stream.next,
						 struct videobuf_buffer,
						 stream);
			list_del(&q->read_buf->stream);
			q->read_off = 0;
		}
		buf = q->read_buf;
	}
	if (!buf)
		rc = POLLERR;

	if (0 == rc) {
		poll_wait(file, &buf->done, wait);
1057 1058
		if (buf->state == VIDEOBUF_DONE ||
		    buf->state == VIDEOBUF_ERROR)
1059 1060
			rc = POLLIN|POLLRDNORM;
	}
1061
	mutex_unlock(&q->vb_lock);
1062 1063 1064 1065 1066 1067 1068 1069
	return rc;
}

int videobuf_mmap_mapper(struct videobuf_queue *q,
			 struct vm_area_struct *vma)
{
	int retval;

1070
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1071

1072
	mutex_lock(&q->vb_lock);
1073
	retval = CALL(q, mmap_mapper, q, vma);
1074
	q->is_mmapped = 1;
1075
	mutex_unlock(&q->vb_lock);
1076 1077 1078 1079 1080 1081 1082 1083 1084

	return retval;
}

#ifdef CONFIG_VIDEO_V4L1_COMPAT
int videobuf_cgmbuf(struct videobuf_queue *q,
		    struct video_mbuf *mbuf, int count)
{
	struct v4l2_requestbuffers req;
1085
	int rc, i;
1086

1087
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1088

1089
	memset(&req, 0, sizeof(req));
1090 1091 1092
	req.type   = q->type;
	req.count  = count;
	req.memory = V4L2_MEMORY_MMAP;
1093
	rc = videobuf_reqbufs(q, &req);
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
	if (rc < 0)
		return rc;

	mbuf->frames = req.count;
	mbuf->size   = 0;
	for (i = 0; i < mbuf->frames; i++) {
		mbuf->offsets[i]  = q->bufs[i]->boff;
		mbuf->size       += q->bufs[i]->bsize;
	}

	return 0;
}
1106
EXPORT_SYMBOL_GPL(videobuf_cgmbuf);
1107 1108 1109 1110 1111 1112 1113 1114 1115
#endif

/* --------------------------------------------------------------------- */

EXPORT_SYMBOL_GPL(videobuf_waiton);
EXPORT_SYMBOL_GPL(videobuf_iolock);

EXPORT_SYMBOL_GPL(videobuf_alloc);

1116
EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127
EXPORT_SYMBOL_GPL(videobuf_queue_cancel);
EXPORT_SYMBOL_GPL(videobuf_queue_is_busy);

EXPORT_SYMBOL_GPL(videobuf_next_field);
EXPORT_SYMBOL_GPL(videobuf_reqbufs);
EXPORT_SYMBOL_GPL(videobuf_querybuf);
EXPORT_SYMBOL_GPL(videobuf_qbuf);
EXPORT_SYMBOL_GPL(videobuf_dqbuf);
EXPORT_SYMBOL_GPL(videobuf_streamon);
EXPORT_SYMBOL_GPL(videobuf_streamoff);

1128
EXPORT_SYMBOL_GPL(videobuf_read_start);
1129
EXPORT_SYMBOL_GPL(videobuf_read_stop);
1130
EXPORT_SYMBOL_GPL(videobuf_stop);
1131 1132 1133 1134
EXPORT_SYMBOL_GPL(videobuf_read_stream);
EXPORT_SYMBOL_GPL(videobuf_read_one);
EXPORT_SYMBOL_GPL(videobuf_poll_stream);

1135
EXPORT_SYMBOL_GPL(__videobuf_mmap_setup);
1136 1137 1138
EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
EXPORT_SYMBOL_GPL(videobuf_mmap_free);
EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);