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
	memset(q, 0, sizeof(*q));
122 123 124 125 126 127
	q->irqlock   = irqlock;
	q->dev       = dev;
	q->type      = type;
	q->field     = field;
	q->msize     = msize;
	q->ops       = ops;
128
	q->priv_data = priv;
129
	q->int_ops   = int_ops;
130 131

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

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

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

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

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

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

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

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

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

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

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

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

220
/* Locking: Caller holds q->vb_lock */
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
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;
}

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

	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;
265
	if (vb->map)
266 267 268
		b->flags |= V4L2_BUF_FLAG_MAPPED;

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

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

	if (!q)
		return 0;

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

306

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

	q->is_mmapped = 0;

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

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

	return rc;
}

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

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

342
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
343 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

	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;

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

	return i;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

578 579 580
	return retval;
}

581 582 583

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

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

594
	if (list_empty(&q->stream)) {
595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
		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;
		}
617
	}
618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636

	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;

637 638
	buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
	retval = videobuf_waiton(buf, nonblocking, 1);
639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
	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);

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

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

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

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

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

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

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

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

721 722
	videobuf_queue_cancel(q);

723 724 725 726 727 728 729
	return 0;
}

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

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

734 735 736
	return retval;
}

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

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

	/* 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);
758
	retval = q->ops->buf_prepare(q, q->read_buf, field);
759 760 761 762
	if (0 != retval)
		goto done;

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

 done:
	/* cleanup */
777
	q->ops->buf_release(q, q->read_buf);
778 779 780 781 782 783 784 785 786 787
	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;
788
	unsigned long flags = 0;
789
	unsigned size = 0, nbufs = 1;
790 791
	int retval;

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

794
	mutex_lock(&q->vb_lock);
795

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

	if (NULL == q->read_buf  &&
	    count >= size        &&
	    !nonblocking) {
801
		retval = videobuf_read_zerocopy(q, data, count, ppos);
802 803 804 805 806 807 808 809 810 811 812
		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);

813
		dprintk(1, "video alloc=0x%p\n", q->read_buf);
814 815 816 817 818
		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);
819
		retval = q->ops->buf_prepare(q, q->read_buf, field);
820 821

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

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

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

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

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

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

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

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

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

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

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

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

887 888
	count = err;

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

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

	videobuf_queue_cancel(q);
909
	__videobuf_mmap_free(q);
910 911 912 913 914 915 916 917
	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;
918

919 920
}

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

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

	return rc;
}

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

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

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

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

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

952

953 954 955 956 957
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;
958
	unsigned long flags = 0;
959

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

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

990
		if (q->read_buf->state == VIDEOBUF_DONE) {
991
			rc = CALL(q, copy_stream, q, data + retval, count,
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
					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);
1011
			spin_lock_irqsave(q->irqlock, flags);
1012
			q->ops->buf_queue(q, q->read_buf);
1013
			spin_unlock_irqrestore(q->irqlock, flags);
1014 1015 1016 1017 1018 1019 1020
			q->read_buf = NULL;
		}
		if (retval < 0)
			break;
	}

 done:
1021
	mutex_unlock(&q->vb_lock);
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	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;

1032
	mutex_lock(&q->vb_lock);
1033 1034 1035 1036 1037 1038
	if (q->streaming) {
		if (!list_empty(&q->stream))
			buf = list_entry(q->stream.next,
					 struct videobuf_buffer, stream);
	} else {
		if (!q->reading)
1039
			__videobuf_read_start(q);
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
		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);
1056 1057
		if (buf->state == VIDEOBUF_DONE ||
		    buf->state == VIDEOBUF_ERROR)
1058 1059
			rc = POLLIN|POLLRDNORM;
	}
1060
	mutex_unlock(&q->vb_lock);
1061 1062 1063 1064 1065 1066 1067 1068
	return rc;
}

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

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

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

	return retval;
}

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

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

1088
	memset(&req, 0, sizeof(req));
1089 1090 1091
	req.type   = q->type;
	req.count  = count;
	req.memory = V4L2_MEMORY_MMAP;
1092
	rc = videobuf_reqbufs(q, &req);
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
	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;
}
1105
EXPORT_SYMBOL_GPL(videobuf_cgmbuf);
1106 1107 1108 1109 1110 1111 1112 1113 1114
#endif

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

EXPORT_SYMBOL_GPL(videobuf_waiton);
EXPORT_SYMBOL_GPL(videobuf_iolock);

EXPORT_SYMBOL_GPL(videobuf_alloc);

1115
EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
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);

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

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