videobuf-core.c 24.3 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
/*
 * 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>
#include <linux/slab.h>
#include <linux/interrupt.h>

#include <media/videobuf-core.h>

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
86 87
}

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

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

97 98 99 100 101 102 103
void *videobuf_queue_to_vmalloc (struct videobuf_queue *q,
			   struct videobuf_buffer *buf)
{
	return CALL(q, vmalloc, buf);
}
EXPORT_SYMBOL_GPL(videobuf_queue_to_vmalloc);

104 105 106
/* --------------------------------------------------------------------- */


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

	/* All buffer operations are mandatory */
128 129 130 131
	BUG_ON(!q->ops->buf_setup);
	BUG_ON(!q->ops->buf_prepare);
	BUG_ON(!q->ops->buf_queue);
	BUG_ON(!q->ops->buf_release);
132

133 134 135
	/* Lock is mandatory for queue_cancel to work */
	BUG_ON(!irqlock);

136
	/* Having implementations for abstract methods are mandatory */
137
	BUG_ON(!q->int_ops);
138

139
	mutex_init(&q->vb_lock);
140
	init_waitqueue_head(&q->wait);
141 142 143
	INIT_LIST_HEAD(&q->stream);
}

144
/* Locking: Only usage in bttv unsafe find way to remove */
145 146 147 148
int videobuf_queue_is_busy(struct videobuf_queue *q)
{
	int i;

149
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
150 151

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

182
/* Locking: Caller holds q->vb_lock */
183 184
void videobuf_queue_cancel(struct videobuf_queue *q)
{
185
	unsigned long flags = 0;
186 187
	int i;

188 189 190 191
	q->streaming = 0;
	q->reading  = 0;
	wake_up_interruptible_sync(&q->wait);

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

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

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

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

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

	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;
261
	if (vb->map)
262 263 264
		b->flags |= V4L2_BUF_FLAG_MAPPED;

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

291
/* Locking: Caller holds q->vb_lock */
292 293 294 295 296 297 298 299
static int __videobuf_mmap_free(struct videobuf_queue *q)
{
	int i;
	int rc;

	if (!q)
		return 0;

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

302

303
	rc  = CALL(q, mmap_free, q);
304 305 306

	q->is_mmapped = 0;

307
	if (rc < 0)
308 309 310 311 312
		return rc;

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

	return rc;
}

int videobuf_mmap_free(struct videobuf_queue *q)
{
	int ret;
324
	mutex_lock(&q->vb_lock);
325
	ret = __videobuf_mmap_free(q);
326
	mutex_unlock(&q->vb_lock);
327 328 329
	return ret;
}

330
/* Locking: Caller holds q->vb_lock */
331 332 333 334 335 336 337
static int __videobuf_mmap_setup(struct videobuf_queue *q,
			unsigned int bcount, unsigned int bsize,
			enum v4l2_memory memory)
{
	unsigned int i;
	int err;

338
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
339 340 341 342 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

	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;

369
	dprintk(1, "mmap setup: %d buffers, %d bytes each\n",
370 371 372 373 374 375 376 377 378 379
		i, bsize);

	return i;
}

int videobuf_mmap_setup(struct videobuf_queue *q,
			unsigned int bcount, unsigned int bsize,
			enum v4l2_memory memory)
{
	int ret;
380
	mutex_lock(&q->vb_lock);
381
	ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
382
	mutex_unlock(&q->vb_lock);
383 384 385
	return ret;
}

386 387 388
int videobuf_reqbufs(struct videobuf_queue *q,
		 struct v4l2_requestbuffers *req)
{
389
	unsigned int size, count;
390 391 392
	int retval;

	if (req->count < 1) {
393
		dprintk(1, "reqbufs: count invalid (%d)\n", req->count);
394 395
		return -EINVAL;
	}
396

397 398 399
	if (req->memory != V4L2_MEMORY_MMAP     &&
	    req->memory != V4L2_MEMORY_USERPTR  &&
	    req->memory != V4L2_MEMORY_OVERLAY) {
400
		dprintk(1, "reqbufs: memory type invalid\n");
401 402 403
		return -EINVAL;
	}

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

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

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

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

437
	req->count = retval;
438 439

 done:
440
	mutex_unlock(&q->vb_lock);
441 442 443 444 445
	return retval;
}

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

448
	mutex_lock(&q->vb_lock);
449
	if (unlikely(b->type != q->type)) {
450
		dprintk(1, "querybuf: Wrong type.\n");
451
		goto done;
452 453
	}
	if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) {
454
		dprintk(1, "querybuf: index out of range.\n");
455
		goto done;
456 457
	}
	if (unlikely(NULL == q->bufs[b->index])) {
458
		dprintk(1, "querybuf: buffer is null.\n");
459
		goto done;
460
	}
461

462
	videobuf_status(q, b, q->bufs[b->index], q->type);
463 464 465

	ret = 0;
done:
466
	mutex_unlock(&q->vb_lock);
467
	return ret;
468 469 470 471 472 473 474
}

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

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

480 481 482
	if (b->memory == V4L2_MEMORY_MMAP)
		down_read(&current->mm->mmap_sem);

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

	if (b->flags & V4L2_BUF_FLAG_INPUT) {
		if (b->input >= q->inputs) {
515
			dprintk(1, "qbuf: wrong input.\n");
516 517 518 519 520 521 522 523 524 525
			goto done;
		}
		buf->input = b->input;
	} else {
		buf->input = UNSET;
	}

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

549
	dprintk(1, "qbuf: requesting next field\n");
550
	field = videobuf_next_field(q);
551
	retval = q->ops->buf_prepare(q, buf, field);
552
	if (0 != retval) {
553
		dprintk(1, "qbuf: buffer_prepare returned %d\n", retval);
554 555 556
		goto done;
	}

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

 done:
568
	mutex_unlock(&q->vb_lock);
569 570 571 572

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

573 574 575
	return retval;
}

576 577 578

/* Locking: Caller holds q->vb_lock */
static int stream_next_buffer_check_queue(struct videobuf_queue *q, int noblock)
579 580 581
{
	int retval;

582 583 584 585
checks:
	if (!q->streaming) {
		dprintk(1, "next_buffer: Not streaming\n");
		retval = -EINVAL;
586 587
		goto done;
	}
588

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

	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;

632 633
	buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
	retval = videobuf_waiton(buf, nonblocking, 1);
634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
	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);

650
	mutex_lock(&q->vb_lock);
651 652

	retval = stream_next_buffer(q, &buf, nonblocking);
653
	if (retval < 0) {
654
		dprintk(1, "dqbuf: next_buffer error: %i\n", retval);
655 656
		goto done;
	}
657

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

 done:
680
	mutex_unlock(&q->vb_lock);
681 682 683 684 685 686
	return retval;
}

int videobuf_streamon(struct videobuf_queue *q)
{
	struct videobuf_buffer *buf;
687
	unsigned long flags = 0;
688 689
	int retval;

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

704
	wake_up_interruptible_sync(&q->wait);
705
 done:
706
	mutex_unlock(&q->vb_lock);
707 708 709
	return retval;
}

710
/* Locking: Caller holds q->vb_lock */
711
static int __videobuf_streamoff(struct videobuf_queue *q)
712 713
{
	if (!q->streaming)
714 715
		return -EINVAL;

716 717
	videobuf_queue_cancel(q);

718 719 720 721 722 723 724
	return 0;
}

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

725
	mutex_lock(&q->vb_lock);
726
	retval = __videobuf_streamoff(q);
727
	mutex_unlock(&q->vb_lock);
728

729 730 731
	return retval;
}

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

741
	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
742 743 744 745 746 747 748 749 750 751 752

	/* 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);
753
	retval = q->ops->buf_prepare(q, q->read_buf, field);
754 755 756 757
	if (0 != retval)
		goto done;

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

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

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

789
	mutex_lock(&q->vb_lock);
790

791
	q->ops->buf_setup(q, &nbufs, &size);
792 793 794 795

	if (NULL == q->read_buf  &&
	    count >= size        &&
	    !nonblocking) {
796
		retval = videobuf_read_zerocopy(q, data, count, ppos);
797 798 799 800 801 802 803 804 805 806 807
		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);

808
		dprintk(1, "video alloc=0x%p\n", q->read_buf);
809 810 811 812 813
		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);
814
		retval = q->ops->buf_prepare(q, q->read_buf, field);
815 816

		if (0 != retval) {
817
			kfree(q->read_buf);
818 819 820 821
			q->read_buf = NULL;
			goto done;
		}

822
		spin_lock_irqsave(q->irqlock, flags);
823
		q->ops->buf_queue(q, q->read_buf);
824 825
		spin_unlock_irqrestore(q->irqlock, flags);

826 827 828 829 830 831 832 833
		q->read_off = 0;
	}

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

834
	CALL(q, sync, q, q->read_buf);
835

836
	if (VIDEOBUF_ERROR == q->read_buf->state) {
837
		/* catch I/O errors */
838
		q->ops->buf_release(q, q->read_buf);
839 840 841 842 843 844 845
		kfree(q->read_buf);
		q->read_buf = NULL;
		retval = -EIO;
		goto done;
	}

	/* Copy to userspace */
846 847
	retval = CALL(q, video_copy_to_user, q, data, count, nonblocking);
	if (retval < 0)
848 849 850 851 852
		goto done;

	q->read_off += retval;
	if (q->read_off == q->read_buf->size) {
		/* all data copied, cleanup */
853
		q->ops->buf_release(q, q->read_buf);
854 855 856 857 858
		kfree(q->read_buf);
		q->read_buf = NULL;
	}

 done:
859
	mutex_unlock(&q->vb_lock);
860 861 862
	return retval;
}

863
/* Locking: Caller holds q->vb_lock */
864
static int __videobuf_read_start(struct videobuf_queue *q)
865 866
{
	enum v4l2_field field;
867
	unsigned long flags = 0;
868
	unsigned int count = 0, size = 0;
869 870
	int err, i;

871
	q->ops->buf_setup(q, &count, &size);
872 873 874 875 876 877
	if (count < 2)
		count = 2;
	if (count > VIDEO_MAX_FRAME)
		count = VIDEO_MAX_FRAME;
	size = PAGE_ALIGN(size);

878
	err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
879
	if (err < 0)
880 881
		return err;

882 883
	count = err;

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

899
static void __videobuf_read_stop(struct videobuf_queue *q)
900 901 902 903
{
	int i;

	videobuf_queue_cancel(q);
904
	__videobuf_mmap_free(q);
905 906 907 908 909 910 911 912
	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;
913

914 915
}

916 917 918 919
int videobuf_read_start(struct videobuf_queue *q)
{
	int rc;

920
	mutex_lock(&q->vb_lock);
921
	rc = __videobuf_read_start(q);
922
	mutex_unlock(&q->vb_lock);
923 924 925 926

	return rc;
}

927 928
void videobuf_read_stop(struct videobuf_queue *q)
{
929
	mutex_lock(&q->vb_lock);
930
	__videobuf_read_stop(q);
931
	mutex_unlock(&q->vb_lock);
932 933 934 935
}

void videobuf_stop(struct videobuf_queue *q)
{
936
	mutex_lock(&q->vb_lock);
937 938 939 940 941 942 943

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

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

944
	mutex_unlock(&q->vb_lock);
945 946
}

947

948 949 950 951 952
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;
953
	unsigned long flags = 0;
954

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

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

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

 done:
1016
	mutex_unlock(&q->vb_lock);
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
	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;

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

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

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

1066
	mutex_lock(&q->vb_lock);
1067
	retval = CALL(q, mmap_mapper, q, vma);
1068
	q->is_mmapped = 1;
1069
	mutex_unlock(&q->vb_lock);
1070 1071 1072 1073 1074 1075 1076 1077 1078

	return retval;
}

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

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

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

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

EXPORT_SYMBOL_GPL(videobuf_waiton);
EXPORT_SYMBOL_GPL(videobuf_iolock);

EXPORT_SYMBOL_GPL(videobuf_alloc);

1110
EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121
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);

1122
EXPORT_SYMBOL_GPL(videobuf_read_start);
1123
EXPORT_SYMBOL_GPL(videobuf_read_stop);
1124
EXPORT_SYMBOL_GPL(videobuf_stop);
1125 1126 1127 1128 1129 1130 1131
EXPORT_SYMBOL_GPL(videobuf_read_stream);
EXPORT_SYMBOL_GPL(videobuf_read_one);
EXPORT_SYMBOL_GPL(videobuf_poll_stream);

EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
EXPORT_SYMBOL_GPL(videobuf_mmap_free);
EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);