• Home
  • Raw
  • Download

Lines Matching refs:q

44 #define CALL(q, f, arg...)						\  argument
45 ((q->int_ops->f) ? q->int_ops->f(arg) : 0)
47 void *videobuf_alloc(struct videobuf_queue *q) in videobuf_alloc() argument
51 BUG_ON(q->msize < sizeof(*vb)); in videobuf_alloc()
53 if (!q->int_ops || !q->int_ops->alloc) { in videobuf_alloc()
58 vb = q->int_ops->alloc(q->msize); in videobuf_alloc()
89 int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb, in videobuf_iolock() argument
93 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_iolock()
95 return CALL(q, iolock, q, vb, fbuf); in videobuf_iolock()
98 void *videobuf_queue_to_vmalloc (struct videobuf_queue *q, in videobuf_queue_to_vmalloc() argument
101 if (q->int_ops->vmalloc) in videobuf_queue_to_vmalloc()
102 return q->int_ops->vmalloc(buf); in videobuf_queue_to_vmalloc()
111 void videobuf_queue_core_init(struct videobuf_queue *q, in videobuf_queue_core_init() argument
121 memset(q, 0, sizeof(*q)); in videobuf_queue_core_init()
122 q->irqlock = irqlock; in videobuf_queue_core_init()
123 q->dev = dev; in videobuf_queue_core_init()
124 q->type = type; in videobuf_queue_core_init()
125 q->field = field; in videobuf_queue_core_init()
126 q->msize = msize; in videobuf_queue_core_init()
127 q->ops = ops; in videobuf_queue_core_init()
128 q->priv_data = priv; in videobuf_queue_core_init()
129 q->int_ops = int_ops; in videobuf_queue_core_init()
132 BUG_ON(!q->ops->buf_setup); in videobuf_queue_core_init()
133 BUG_ON(!q->ops->buf_prepare); in videobuf_queue_core_init()
134 BUG_ON(!q->ops->buf_queue); in videobuf_queue_core_init()
135 BUG_ON(!q->ops->buf_release); in videobuf_queue_core_init()
141 BUG_ON(!q->int_ops); in videobuf_queue_core_init()
143 mutex_init(&q->vb_lock); in videobuf_queue_core_init()
144 init_waitqueue_head(&q->wait); in videobuf_queue_core_init()
145 INIT_LIST_HEAD(&q->stream); in videobuf_queue_core_init()
149 int videobuf_queue_is_busy(struct videobuf_queue *q) in videobuf_queue_is_busy() argument
153 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_queue_is_busy()
155 if (q->streaming) { in videobuf_queue_is_busy()
159 if (q->reading) { in videobuf_queue_is_busy()
163 if (q->read_buf) { in videobuf_queue_is_busy()
168 if (NULL == q->bufs[i]) in videobuf_queue_is_busy()
170 if (q->bufs[i]->map) { in videobuf_queue_is_busy()
174 if (q->bufs[i]->state == VIDEOBUF_QUEUED) { in videobuf_queue_is_busy()
178 if (q->bufs[i]->state == VIDEOBUF_ACTIVE) { in videobuf_queue_is_busy()
187 void videobuf_queue_cancel(struct videobuf_queue *q) in videobuf_queue_cancel() argument
192 q->streaming = 0; in videobuf_queue_cancel()
193 q->reading = 0; in videobuf_queue_cancel()
194 wake_up_interruptible_sync(&q->wait); in videobuf_queue_cancel()
197 spin_lock_irqsave(q->irqlock, flags); in videobuf_queue_cancel()
199 if (NULL == q->bufs[i]) in videobuf_queue_cancel()
201 if (q->bufs[i]->state == VIDEOBUF_QUEUED) { in videobuf_queue_cancel()
202 list_del(&q->bufs[i]->queue); in videobuf_queue_cancel()
203 q->bufs[i]->state = VIDEOBUF_ERROR; in videobuf_queue_cancel()
204 wake_up_all(&q->bufs[i]->done); in videobuf_queue_cancel()
207 spin_unlock_irqrestore(q->irqlock, flags); in videobuf_queue_cancel()
211 if (NULL == q->bufs[i]) in videobuf_queue_cancel()
213 q->ops->buf_release(q, q->bufs[i]); in videobuf_queue_cancel()
215 INIT_LIST_HEAD(&q->stream); in videobuf_queue_cancel()
221 enum v4l2_field videobuf_next_field(struct videobuf_queue *q) in videobuf_next_field() argument
223 enum v4l2_field field = q->field; in videobuf_next_field()
228 if (V4L2_FIELD_TOP == q->last) { in videobuf_next_field()
230 q->last = V4L2_FIELD_BOTTOM; in videobuf_next_field()
233 q->last = V4L2_FIELD_TOP; in videobuf_next_field()
240 static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b, in videobuf_status() argument
244 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_status()
296 static int __videobuf_mmap_free(struct videobuf_queue *q) in __videobuf_mmap_free() argument
301 if (!q) in __videobuf_mmap_free()
304 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in __videobuf_mmap_free()
307 rc = CALL(q, mmap_free, q); in __videobuf_mmap_free()
309 q->is_mmapped = 0; in __videobuf_mmap_free()
315 if (NULL == q->bufs[i]) in __videobuf_mmap_free()
317 q->ops->buf_release(q, q->bufs[i]); in __videobuf_mmap_free()
318 kfree(q->bufs[i]); in __videobuf_mmap_free()
319 q->bufs[i] = NULL; in __videobuf_mmap_free()
325 int videobuf_mmap_free(struct videobuf_queue *q) in videobuf_mmap_free() argument
328 mutex_lock(&q->vb_lock); in videobuf_mmap_free()
329 ret = __videobuf_mmap_free(q); in videobuf_mmap_free()
330 mutex_unlock(&q->vb_lock); in videobuf_mmap_free()
335 int __videobuf_mmap_setup(struct videobuf_queue *q, in __videobuf_mmap_setup() argument
342 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in __videobuf_mmap_setup()
344 err = __videobuf_mmap_free(q); in __videobuf_mmap_setup()
350 q->bufs[i] = videobuf_alloc(q); in __videobuf_mmap_setup()
352 if (q->bufs[i] == NULL) in __videobuf_mmap_setup()
355 q->bufs[i]->i = i; in __videobuf_mmap_setup()
356 q->bufs[i]->input = UNSET; in __videobuf_mmap_setup()
357 q->bufs[i]->memory = memory; in __videobuf_mmap_setup()
358 q->bufs[i]->bsize = bsize; in __videobuf_mmap_setup()
361 q->bufs[i]->boff = bsize * i; in __videobuf_mmap_setup()
379 int videobuf_mmap_setup(struct videobuf_queue *q, in videobuf_mmap_setup() argument
384 mutex_lock(&q->vb_lock); in videobuf_mmap_setup()
385 ret = __videobuf_mmap_setup(q, bcount, bsize, memory); in videobuf_mmap_setup()
386 mutex_unlock(&q->vb_lock); in videobuf_mmap_setup()
390 int videobuf_reqbufs(struct videobuf_queue *q, in videobuf_reqbufs() argument
408 mutex_lock(&q->vb_lock); in videobuf_reqbufs()
409 if (req->type != q->type) { in videobuf_reqbufs()
415 if (q->streaming) { in videobuf_reqbufs()
420 if (!list_empty(&q->stream)) { in videobuf_reqbufs()
430 q->ops->buf_setup(q, &count, &size); in videobuf_reqbufs()
435 retval = __videobuf_mmap_setup(q, count, size, req->memory); in videobuf_reqbufs()
444 mutex_unlock(&q->vb_lock); in videobuf_reqbufs()
448 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b) in videobuf_querybuf() argument
452 mutex_lock(&q->vb_lock); in videobuf_querybuf()
453 if (unlikely(b->type != q->type)) { in videobuf_querybuf()
461 if (unlikely(NULL == q->bufs[b->index])) { in videobuf_querybuf()
466 videobuf_status(q, b, q->bufs[b->index], q->type); in videobuf_querybuf()
470 mutex_unlock(&q->vb_lock); in videobuf_querybuf()
474 int videobuf_qbuf(struct videobuf_queue *q, in videobuf_qbuf() argument
482 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_qbuf()
487 mutex_lock(&q->vb_lock); in videobuf_qbuf()
489 if (q->reading) { in videobuf_qbuf()
494 if (b->type != q->type) { in videobuf_qbuf()
502 buf = q->bufs[b->index]; in videobuf_qbuf()
518 if (b->input >= q->inputs) { in videobuf_qbuf()
542 q->ops->buf_release(q, buf); in videobuf_qbuf()
554 field = videobuf_next_field(q); in videobuf_qbuf()
555 retval = q->ops->buf_prepare(q, buf, field); in videobuf_qbuf()
561 list_add_tail(&buf->stream, &q->stream); in videobuf_qbuf()
562 if (q->streaming) { in videobuf_qbuf()
563 spin_lock_irqsave(q->irqlock, flags); in videobuf_qbuf()
564 q->ops->buf_queue(q, buf); in videobuf_qbuf()
565 spin_unlock_irqrestore(q->irqlock, flags); in videobuf_qbuf()
569 wake_up_interruptible_sync(&q->wait); in videobuf_qbuf()
572 mutex_unlock(&q->vb_lock); in videobuf_qbuf()
582 static int stream_next_buffer_check_queue(struct videobuf_queue *q, int noblock) in stream_next_buffer_check_queue() argument
587 if (!q->streaming) { in stream_next_buffer_check_queue()
593 if (list_empty(&q->stream)) { in stream_next_buffer_check_queue()
602 mutex_unlock(&q->vb_lock); in stream_next_buffer_check_queue()
607 retval = wait_event_interruptible(q->wait, in stream_next_buffer_check_queue()
608 !list_empty(&q->stream) || !q->streaming); in stream_next_buffer_check_queue()
609 mutex_lock(&q->vb_lock); in stream_next_buffer_check_queue()
626 static int stream_next_buffer(struct videobuf_queue *q, in stream_next_buffer() argument
632 retval = stream_next_buffer_check_queue(q, nonblocking); in stream_next_buffer()
636 buf = list_entry(q->stream.next, struct videobuf_buffer, stream); in stream_next_buffer()
646 int videobuf_dqbuf(struct videobuf_queue *q, in videobuf_dqbuf() argument
652 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_dqbuf()
654 mutex_lock(&q->vb_lock); in videobuf_dqbuf()
656 retval = stream_next_buffer(q, &buf, nonblocking); in videobuf_dqbuf()
666 CALL(q, sync, q, buf); in videobuf_dqbuf()
671 CALL(q, sync, q, buf); in videobuf_dqbuf()
681 videobuf_status(q, b, buf, q->type); in videobuf_dqbuf()
684 mutex_unlock(&q->vb_lock); in videobuf_dqbuf()
688 int videobuf_streamon(struct videobuf_queue *q) in videobuf_streamon() argument
694 mutex_lock(&q->vb_lock); in videobuf_streamon()
696 if (q->reading) in videobuf_streamon()
699 if (q->streaming) in videobuf_streamon()
701 q->streaming = 1; in videobuf_streamon()
702 spin_lock_irqsave(q->irqlock, flags); in videobuf_streamon()
703 list_for_each_entry(buf, &q->stream, stream) in videobuf_streamon()
705 q->ops->buf_queue(q, buf); in videobuf_streamon()
706 spin_unlock_irqrestore(q->irqlock, flags); in videobuf_streamon()
708 wake_up_interruptible_sync(&q->wait); in videobuf_streamon()
710 mutex_unlock(&q->vb_lock); in videobuf_streamon()
715 static int __videobuf_streamoff(struct videobuf_queue *q) in __videobuf_streamoff() argument
717 if (!q->streaming) in __videobuf_streamoff()
720 videobuf_queue_cancel(q); in __videobuf_streamoff()
725 int videobuf_streamoff(struct videobuf_queue *q) in videobuf_streamoff() argument
729 mutex_lock(&q->vb_lock); in videobuf_streamoff()
730 retval = __videobuf_streamoff(q); in videobuf_streamoff()
731 mutex_unlock(&q->vb_lock); in videobuf_streamoff()
737 static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q, in videobuf_read_zerocopy() argument
745 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_read_zerocopy()
748 q->read_buf = videobuf_alloc(q); in videobuf_read_zerocopy()
749 if (NULL == q->read_buf) in videobuf_read_zerocopy()
752 q->read_buf->memory = V4L2_MEMORY_USERPTR; in videobuf_read_zerocopy()
753 q->read_buf->baddr = (unsigned long)data; in videobuf_read_zerocopy()
754 q->read_buf->bsize = count; in videobuf_read_zerocopy()
756 field = videobuf_next_field(q); in videobuf_read_zerocopy()
757 retval = q->ops->buf_prepare(q, q->read_buf, field); in videobuf_read_zerocopy()
762 spin_lock_irqsave(q->irqlock, flags); in videobuf_read_zerocopy()
763 q->ops->buf_queue(q, q->read_buf); in videobuf_read_zerocopy()
764 spin_unlock_irqrestore(q->irqlock, flags); in videobuf_read_zerocopy()
765 retval = videobuf_waiton(q->read_buf, 0, 0); in videobuf_read_zerocopy()
767 CALL(q, sync, q, q->read_buf); in videobuf_read_zerocopy()
768 if (VIDEOBUF_ERROR == q->read_buf->state) in videobuf_read_zerocopy()
771 retval = q->read_buf->size; in videobuf_read_zerocopy()
776 q->ops->buf_release(q, q->read_buf); in videobuf_read_zerocopy()
777 kfree(q->read_buf); in videobuf_read_zerocopy()
778 q->read_buf = NULL; in videobuf_read_zerocopy()
782 ssize_t videobuf_read_one(struct videobuf_queue *q, in videobuf_read_one() argument
791 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_read_one()
793 mutex_lock(&q->vb_lock); in videobuf_read_one()
795 q->ops->buf_setup(q, &nbufs, &size); in videobuf_read_one()
797 if (NULL == q->read_buf && in videobuf_read_one()
800 retval = videobuf_read_zerocopy(q, data, count, ppos); in videobuf_read_one()
807 if (NULL == q->read_buf) { in videobuf_read_one()
810 q->read_buf = videobuf_alloc(q); in videobuf_read_one()
812 dprintk(1, "video alloc=0x%p\n", q->read_buf); in videobuf_read_one()
813 if (NULL == q->read_buf) in videobuf_read_one()
815 q->read_buf->memory = V4L2_MEMORY_USERPTR; in videobuf_read_one()
816 q->read_buf->bsize = count; /* preferred size */ in videobuf_read_one()
817 field = videobuf_next_field(q); in videobuf_read_one()
818 retval = q->ops->buf_prepare(q, q->read_buf, field); in videobuf_read_one()
821 kfree(q->read_buf); in videobuf_read_one()
822 q->read_buf = NULL; in videobuf_read_one()
826 spin_lock_irqsave(q->irqlock, flags); in videobuf_read_one()
827 q->ops->buf_queue(q, q->read_buf); in videobuf_read_one()
828 spin_unlock_irqrestore(q->irqlock, flags); in videobuf_read_one()
830 q->read_off = 0; in videobuf_read_one()
834 retval = videobuf_waiton(q->read_buf, nonblocking, 1); in videobuf_read_one()
838 CALL(q, sync, q, q->read_buf); in videobuf_read_one()
840 if (VIDEOBUF_ERROR == q->read_buf->state) { in videobuf_read_one()
842 q->ops->buf_release(q, q->read_buf); in videobuf_read_one()
843 kfree(q->read_buf); in videobuf_read_one()
844 q->read_buf = NULL; in videobuf_read_one()
850 retval = CALL(q, video_copy_to_user, q, data, count, nonblocking); in videobuf_read_one()
854 q->read_off += retval; in videobuf_read_one()
855 if (q->read_off == q->read_buf->size) { in videobuf_read_one()
857 q->ops->buf_release(q, q->read_buf); in videobuf_read_one()
858 kfree(q->read_buf); in videobuf_read_one()
859 q->read_buf = NULL; in videobuf_read_one()
863 mutex_unlock(&q->vb_lock); in videobuf_read_one()
868 static int __videobuf_read_start(struct videobuf_queue *q) in __videobuf_read_start() argument
875 q->ops->buf_setup(q, &count, &size); in __videobuf_read_start()
882 err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR); in __videobuf_read_start()
889 field = videobuf_next_field(q); in __videobuf_read_start()
890 err = q->ops->buf_prepare(q, q->bufs[i], field); in __videobuf_read_start()
893 list_add_tail(&q->bufs[i]->stream, &q->stream); in __videobuf_read_start()
895 spin_lock_irqsave(q->irqlock, flags); in __videobuf_read_start()
897 q->ops->buf_queue(q, q->bufs[i]); in __videobuf_read_start()
898 spin_unlock_irqrestore(q->irqlock, flags); in __videobuf_read_start()
899 q->reading = 1; in __videobuf_read_start()
903 static void __videobuf_read_stop(struct videobuf_queue *q) in __videobuf_read_stop() argument
907 videobuf_queue_cancel(q); in __videobuf_read_stop()
908 __videobuf_mmap_free(q); in __videobuf_read_stop()
909 INIT_LIST_HEAD(&q->stream); in __videobuf_read_stop()
911 if (NULL == q->bufs[i]) in __videobuf_read_stop()
913 kfree(q->bufs[i]); in __videobuf_read_stop()
914 q->bufs[i] = NULL; in __videobuf_read_stop()
916 q->read_buf = NULL; in __videobuf_read_stop()
920 int videobuf_read_start(struct videobuf_queue *q) in videobuf_read_start() argument
924 mutex_lock(&q->vb_lock); in videobuf_read_start()
925 rc = __videobuf_read_start(q); in videobuf_read_start()
926 mutex_unlock(&q->vb_lock); in videobuf_read_start()
931 void videobuf_read_stop(struct videobuf_queue *q) in videobuf_read_stop() argument
933 mutex_lock(&q->vb_lock); in videobuf_read_stop()
934 __videobuf_read_stop(q); in videobuf_read_stop()
935 mutex_unlock(&q->vb_lock); in videobuf_read_stop()
938 void videobuf_stop(struct videobuf_queue *q) in videobuf_stop() argument
940 mutex_lock(&q->vb_lock); in videobuf_stop()
942 if (q->streaming) in videobuf_stop()
943 __videobuf_streamoff(q); in videobuf_stop()
945 if (q->reading) in videobuf_stop()
946 __videobuf_read_stop(q); in videobuf_stop()
948 mutex_unlock(&q->vb_lock); in videobuf_stop()
952 ssize_t videobuf_read_stream(struct videobuf_queue *q, in videobuf_read_stream() argument
959 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_read_stream()
962 mutex_lock(&q->vb_lock); in videobuf_read_stream()
964 if (q->streaming) in videobuf_read_stream()
966 if (!q->reading) { in videobuf_read_stream()
967 retval = __videobuf_read_start(q); in videobuf_read_stream()
975 if (NULL == q->read_buf) { in videobuf_read_stream()
976 q->read_buf = list_entry(q->stream.next, in videobuf_read_stream()
979 list_del(&q->read_buf->stream); in videobuf_read_stream()
980 q->read_off = 0; in videobuf_read_stream()
982 rc = videobuf_waiton(q->read_buf, nonblocking, 1); in videobuf_read_stream()
989 if (q->read_buf->state == VIDEOBUF_DONE) { in videobuf_read_stream()
990 rc = CALL(q, copy_stream, q, data + retval, count, in videobuf_read_stream()
998 q->read_off += rc; in videobuf_read_stream()
1001 q->read_off = q->read_buf->size; in videobuf_read_stream()
1007 if (q->read_off == q->read_buf->size) { in videobuf_read_stream()
1008 list_add_tail(&q->read_buf->stream, in videobuf_read_stream()
1009 &q->stream); in videobuf_read_stream()
1010 spin_lock_irqsave(q->irqlock, flags); in videobuf_read_stream()
1011 q->ops->buf_queue(q, q->read_buf); in videobuf_read_stream()
1012 spin_unlock_irqrestore(q->irqlock, flags); in videobuf_read_stream()
1013 q->read_buf = NULL; in videobuf_read_stream()
1020 mutex_unlock(&q->vb_lock); in videobuf_read_stream()
1025 struct videobuf_queue *q, in videobuf_poll_stream() argument
1031 mutex_lock(&q->vb_lock); in videobuf_poll_stream()
1032 if (q->streaming) { in videobuf_poll_stream()
1033 if (!list_empty(&q->stream)) in videobuf_poll_stream()
1034 buf = list_entry(q->stream.next, in videobuf_poll_stream()
1037 if (!q->reading) in videobuf_poll_stream()
1038 __videobuf_read_start(q); in videobuf_poll_stream()
1039 if (!q->reading) { in videobuf_poll_stream()
1041 } else if (NULL == q->read_buf) { in videobuf_poll_stream()
1042 q->read_buf = list_entry(q->stream.next, in videobuf_poll_stream()
1045 list_del(&q->read_buf->stream); in videobuf_poll_stream()
1046 q->read_off = 0; in videobuf_poll_stream()
1048 buf = q->read_buf; in videobuf_poll_stream()
1059 mutex_unlock(&q->vb_lock); in videobuf_poll_stream()
1063 int videobuf_mmap_mapper(struct videobuf_queue *q, in videobuf_mmap_mapper() argument
1068 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_mmap_mapper()
1070 mutex_lock(&q->vb_lock); in videobuf_mmap_mapper()
1071 retval = CALL(q, mmap_mapper, q, vma); in videobuf_mmap_mapper()
1072 q->is_mmapped = 1; in videobuf_mmap_mapper()
1073 mutex_unlock(&q->vb_lock); in videobuf_mmap_mapper()
1079 int videobuf_cgmbuf(struct videobuf_queue *q, in videobuf_cgmbuf() argument
1085 MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); in videobuf_cgmbuf()
1088 req.type = q->type; in videobuf_cgmbuf()
1091 rc = videobuf_reqbufs(q, &req); in videobuf_cgmbuf()
1098 mbuf->offsets[i] = q->bufs[i]->boff; in videobuf_cgmbuf()
1099 mbuf->size += q->bufs[i]->bsize; in videobuf_cgmbuf()