V4L/DVB (7488): videobuf: Simplify videobuf_waiton logic and possibly avoid missed...
[safe/jmp/linux-2.6] / drivers / media / video / videobuf-core.c
1 /*
2  * generic helper functions for handling video4linux capture buffers
3  *
4  * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
5  *
6  * Highly based on video-buf written originally by:
7  * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
8  * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
9  * (c) 2006 Ted Walther and John Sokol
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2
14  */
15
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/moduleparam.h>
19 #include <linux/slab.h>
20 #include <linux/interrupt.h>
21
22 #include <media/videobuf-core.h>
23
24 #define MAGIC_BUFFER 0x20070728
25 #define MAGIC_CHECK(is, should) do {                                       \
26         if (unlikely((is) != (should))) {                                  \
27         printk(KERN_ERR "magic mismatch: %x (expected %x)\n", is, should); \
28         BUG(); } } while (0)
29
30 static int debug;
31 module_param(debug, int, 0644);
32
33 MODULE_DESCRIPTION("helper module to manage video4linux buffers");
34 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
35 MODULE_LICENSE("GPL");
36
37 #define dprintk(level, fmt, arg...) do {                        \
38         if (debug >= level)                                     \
39         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         struct videobuf_buffer *vb;
49
50         BUG_ON(q->msize < sizeof(*vb));
51
52         if (!q->int_ops || !q->int_ops->alloc) {
53                 printk(KERN_ERR "No specific ops defined!\n");
54                 BUG();
55         }
56
57         vb = q->int_ops->alloc(q->msize);
58
59         if (NULL != vb) {
60                 init_waitqueue_head(&vb->done);
61                 vb->magic     = MAGIC_BUFFER;
62         }
63
64         return vb;
65 }
66
67 #define WAITON_CONDITION (vb->state != VIDEOBUF_ACTIVE &&\
68                                 vb->state != VIDEOBUF_QUEUED)
69 int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
70 {
71         MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
72
73         if (non_blocking) {
74                 if (WAITON_CONDITION)
75                         return 0;
76                 else
77                         return -EAGAIN;
78         }
79
80         if (intr)
81                 return wait_event_interruptible(vb->done, WAITON_CONDITION);
82         else
83                 wait_event(vb->done, WAITON_CONDITION);
84
85         return 0;
86 }
87
88 int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb,
89                     struct v4l2_framebuffer *fbuf)
90 {
91         MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
92         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
93
94         /* This is required to avoid OOPS on some cases,
95            since mmap_mapper() method should be called before _iolock.
96            On some cases, the mmap_mapper() is called only after scheduling.
97          */
98         if (vb->memory == V4L2_MEMORY_MMAP) {
99                 wait_event_timeout(vb->done, q->is_mmapped,
100                                    msecs_to_jiffies(100));
101                 if (!q->is_mmapped) {
102                         printk(KERN_ERR
103                                "Error: mmap_mapper() never called!\n");
104                         return -EINVAL;
105                 }
106         }
107
108         return CALL(q, iolock, q, vb, fbuf);
109 }
110
111 /* --------------------------------------------------------------------- */
112
113
114 void videobuf_queue_core_init(struct videobuf_queue *q,
115                          struct videobuf_queue_ops *ops,
116                          struct device *dev,
117                          spinlock_t *irqlock,
118                          enum v4l2_buf_type type,
119                          enum v4l2_field field,
120                          unsigned int msize,
121                          void *priv,
122                          struct videobuf_qtype_ops *int_ops)
123 {
124         memset(q, 0, sizeof(*q));
125         q->irqlock   = irqlock;
126         q->dev       = dev;
127         q->type      = type;
128         q->field     = field;
129         q->msize     = msize;
130         q->ops       = ops;
131         q->priv_data = priv;
132         q->int_ops   = int_ops;
133
134         /* All buffer operations are mandatory */
135         BUG_ON(!q->ops->buf_setup);
136         BUG_ON(!q->ops->buf_prepare);
137         BUG_ON(!q->ops->buf_queue);
138         BUG_ON(!q->ops->buf_release);
139
140         /* Having implementations for abstract methods are mandatory */
141         BUG_ON(!q->int_ops);
142
143         mutex_init(&q->vb_lock);
144         INIT_LIST_HEAD(&q->stream);
145 }
146
147 /* Locking: Only usage in bttv unsafe find way to remove */
148 int videobuf_queue_is_busy(struct videobuf_queue *q)
149 {
150         int i;
151
152         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
153
154         if (q->streaming) {
155                 dprintk(1, "busy: streaming active\n");
156                 return 1;
157         }
158         if (q->reading) {
159                 dprintk(1, "busy: pending read #1\n");
160                 return 1;
161         }
162         if (q->read_buf) {
163                 dprintk(1, "busy: pending read #2\n");
164                 return 1;
165         }
166         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
167                 if (NULL == q->bufs[i])
168                         continue;
169                 if (q->bufs[i]->map) {
170                         dprintk(1, "busy: buffer #%d mapped\n", i);
171                         return 1;
172                 }
173                 if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
174                         dprintk(1, "busy: buffer #%d queued\n", i);
175                         return 1;
176                 }
177                 if (q->bufs[i]->state == VIDEOBUF_ACTIVE) {
178                         dprintk(1, "busy: buffer #%d avtive\n", i);
179                         return 1;
180                 }
181         }
182         return 0;
183 }
184
185 /* Locking: Caller holds q->vb_lock */
186 void videobuf_queue_cancel(struct videobuf_queue *q)
187 {
188         unsigned long flags = 0;
189         int i;
190
191         /* remove queued buffers from list */
192         if (q->irqlock)
193                 spin_lock_irqsave(q->irqlock, flags);
194         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
195                 if (NULL == q->bufs[i])
196                         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         if (q->irqlock)
204                 spin_unlock_irqrestore(q->irqlock, flags);
205
206         /* free all buffers + clear queue */
207         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
208                 if (NULL == q->bufs[i])
209                         continue;
210                 q->ops->buf_release(q, q->bufs[i]);
211         }
212         INIT_LIST_HEAD(&q->stream);
213 }
214
215 /* --------------------------------------------------------------------- */
216
217 /* Locking: Caller holds q->vb_lock */
218 enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
219 {
220         enum v4l2_field field = q->field;
221
222         BUG_ON(V4L2_FIELD_ANY == field);
223
224         if (V4L2_FIELD_ALTERNATE == field) {
225                 if (V4L2_FIELD_TOP == q->last) {
226                         field   = V4L2_FIELD_BOTTOM;
227                         q->last = V4L2_FIELD_BOTTOM;
228                 } else {
229                         field   = V4L2_FIELD_TOP;
230                         q->last = V4L2_FIELD_TOP;
231                 }
232         }
233         return field;
234 }
235
236 /* Locking: Caller holds q->vb_lock */
237 static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
238                             struct videobuf_buffer *vb, enum v4l2_buf_type type)
239 {
240         MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
241         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
242
243         b->index    = vb->i;
244         b->type     = type;
245
246         b->memory   = vb->memory;
247         switch (b->memory) {
248         case V4L2_MEMORY_MMAP:
249                 b->m.offset  = vb->boff;
250                 b->length    = vb->bsize;
251                 break;
252         case V4L2_MEMORY_USERPTR:
253                 b->m.userptr = vb->baddr;
254                 b->length    = vb->bsize;
255                 break;
256         case V4L2_MEMORY_OVERLAY:
257                 b->m.offset  = vb->boff;
258                 break;
259         }
260
261         b->flags    = 0;
262         if (vb->map)
263                 b->flags |= V4L2_BUF_FLAG_MAPPED;
264
265         switch (vb->state) {
266         case VIDEOBUF_PREPARED:
267         case VIDEOBUF_QUEUED:
268         case VIDEOBUF_ACTIVE:
269                 b->flags |= V4L2_BUF_FLAG_QUEUED;
270                 break;
271         case VIDEOBUF_DONE:
272         case VIDEOBUF_ERROR:
273                 b->flags |= V4L2_BUF_FLAG_DONE;
274                 break;
275         case VIDEOBUF_NEEDS_INIT:
276         case VIDEOBUF_IDLE:
277                 /* nothing */
278                 break;
279         }
280
281         if (vb->input != UNSET) {
282                 b->flags |= V4L2_BUF_FLAG_INPUT;
283                 b->input  = vb->input;
284         }
285
286         b->field     = vb->field;
287         b->timestamp = vb->ts;
288         b->bytesused = vb->size;
289         b->sequence  = vb->field_count >> 1;
290 }
291
292 /* Locking: Caller holds q->vb_lock */
293 static int __videobuf_mmap_free(struct videobuf_queue *q)
294 {
295         int i;
296         int rc;
297
298         if (!q)
299                 return 0;
300
301         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
302
303
304         rc  = CALL(q, mmap_free, q);
305
306         q->is_mmapped = 0;
307
308         if (rc < 0)
309                 return rc;
310
311         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
312                 if (NULL == q->bufs[i])
313                         continue;
314                 q->ops->buf_release(q, q->bufs[i]);
315                 kfree(q->bufs[i]);
316                 q->bufs[i] = NULL;
317         }
318
319         return rc;
320 }
321
322 int videobuf_mmap_free(struct videobuf_queue *q)
323 {
324         int ret;
325         mutex_lock(&q->vb_lock);
326         ret = __videobuf_mmap_free(q);
327         mutex_unlock(&q->vb_lock);
328         return ret;
329 }
330
331 /* Locking: Caller holds q->vb_lock */
332 static int __videobuf_mmap_setup(struct videobuf_queue *q,
333                         unsigned int bcount, unsigned int bsize,
334                         enum v4l2_memory memory)
335 {
336         unsigned int i;
337         int err;
338
339         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
340
341         err = __videobuf_mmap_free(q);
342         if (0 != err)
343                 return err;
344
345         /* Allocate and initialize buffers */
346         for (i = 0; i < bcount; i++) {
347                 q->bufs[i] = videobuf_alloc(q);
348
349                 if (q->bufs[i] == NULL)
350                         break;
351
352                 q->bufs[i]->i      = i;
353                 q->bufs[i]->input  = UNSET;
354                 q->bufs[i]->memory = memory;
355                 q->bufs[i]->bsize  = bsize;
356                 switch (memory) {
357                 case V4L2_MEMORY_MMAP:
358                         q->bufs[i]->boff  = bsize * i;
359                         break;
360                 case V4L2_MEMORY_USERPTR:
361                 case V4L2_MEMORY_OVERLAY:
362                         /* nothing */
363                         break;
364                 }
365         }
366
367         if (!i)
368                 return -ENOMEM;
369
370         dprintk(1, "mmap setup: %d buffers, %d bytes each\n",
371                 i, bsize);
372
373         return i;
374 }
375
376 int videobuf_mmap_setup(struct videobuf_queue *q,
377                         unsigned int bcount, unsigned int bsize,
378                         enum v4l2_memory memory)
379 {
380         int ret;
381         mutex_lock(&q->vb_lock);
382         ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
383         mutex_unlock(&q->vb_lock);
384         return ret;
385 }
386
387 int videobuf_reqbufs(struct videobuf_queue *q,
388                  struct v4l2_requestbuffers *req)
389 {
390         unsigned int size, count;
391         int retval;
392
393         if (req->count < 1) {
394                 dprintk(1, "reqbufs: count invalid (%d)\n", req->count);
395                 return -EINVAL;
396         }
397
398         if (req->memory != V4L2_MEMORY_MMAP     &&
399             req->memory != V4L2_MEMORY_USERPTR  &&
400             req->memory != V4L2_MEMORY_OVERLAY) {
401                 dprintk(1, "reqbufs: memory type invalid\n");
402                 return -EINVAL;
403         }
404
405         mutex_lock(&q->vb_lock);
406         if (req->type != q->type) {
407                 dprintk(1, "reqbufs: queue type invalid\n");
408                 retval = -EINVAL;
409                 goto done;
410         }
411
412         if (q->streaming) {
413                 dprintk(1, "reqbufs: streaming already exists\n");
414                 retval = -EBUSY;
415                 goto done;
416         }
417         if (!list_empty(&q->stream)) {
418                 dprintk(1, "reqbufs: stream running\n");
419                 retval = -EBUSY;
420                 goto done;
421         }
422
423         count = req->count;
424         if (count > VIDEO_MAX_FRAME)
425                 count = VIDEO_MAX_FRAME;
426         size = 0;
427         q->ops->buf_setup(q, &count, &size);
428         size = PAGE_ALIGN(size);
429         dprintk(1, "reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
430                 count, size, (count*size)>>PAGE_SHIFT);
431
432         retval = __videobuf_mmap_setup(q, count, size, req->memory);
433         if (retval < 0) {
434                 dprintk(1, "reqbufs: mmap setup returned %d\n", retval);
435                 goto done;
436         }
437
438         req->count = retval;
439
440  done:
441         mutex_unlock(&q->vb_lock);
442         return retval;
443 }
444
445 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
446 {
447         int ret = -EINVAL;
448
449         mutex_lock(&q->vb_lock);
450         if (unlikely(b->type != q->type)) {
451                 dprintk(1, "querybuf: Wrong type.\n");
452                 goto done;
453         }
454         if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) {
455                 dprintk(1, "querybuf: index out of range.\n");
456                 goto done;
457         }
458         if (unlikely(NULL == q->bufs[b->index])) {
459                 dprintk(1, "querybuf: buffer is null.\n");
460                 goto done;
461         }
462
463         videobuf_status(q, b, q->bufs[b->index], q->type);
464
465         ret = 0;
466 done:
467         mutex_unlock(&q->vb_lock);
468         return ret;
469 }
470
471 int videobuf_qbuf(struct videobuf_queue *q,
472               struct v4l2_buffer *b)
473 {
474         struct videobuf_buffer *buf;
475         enum v4l2_field field;
476         unsigned long flags = 0;
477         int retval;
478
479         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
480
481         if (b->memory == V4L2_MEMORY_MMAP)
482                 down_read(&current->mm->mmap_sem);
483
484         mutex_lock(&q->vb_lock);
485         retval = -EBUSY;
486         if (q->reading) {
487                 dprintk(1, "qbuf: Reading running...\n");
488                 goto done;
489         }
490         retval = -EINVAL;
491         if (b->type != q->type) {
492                 dprintk(1, "qbuf: Wrong type.\n");
493                 goto done;
494         }
495         if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
496                 dprintk(1, "qbuf: index out of range.\n");
497                 goto done;
498         }
499         buf = q->bufs[b->index];
500         if (NULL == buf) {
501                 dprintk(1, "qbuf: buffer is null.\n");
502                 goto done;
503         }
504         MAGIC_CHECK(buf->magic, MAGIC_BUFFER);
505         if (buf->memory != b->memory) {
506                 dprintk(1, "qbuf: memory type is wrong.\n");
507                 goto done;
508         }
509         if (buf->state != VIDEOBUF_NEEDS_INIT && buf->state != VIDEOBUF_IDLE) {
510                 dprintk(1, "qbuf: buffer is already queued or active.\n");
511                 goto done;
512         }
513
514         if (b->flags & V4L2_BUF_FLAG_INPUT) {
515                 if (b->input >= q->inputs) {
516                         dprintk(1, "qbuf: wrong input.\n");
517                         goto done;
518                 }
519                 buf->input = b->input;
520         } else {
521                 buf->input = UNSET;
522         }
523
524         switch (b->memory) {
525         case V4L2_MEMORY_MMAP:
526                 if (0 == buf->baddr) {
527                         dprintk(1, "qbuf: mmap requested "
528                                    "but buffer addr is zero!\n");
529                         goto done;
530                 }
531                 break;
532         case V4L2_MEMORY_USERPTR:
533                 if (b->length < buf->bsize) {
534                         dprintk(1, "qbuf: buffer length is not enough\n");
535                         goto done;
536                 }
537                 if (VIDEOBUF_NEEDS_INIT != buf->state &&
538                     buf->baddr != b->m.userptr)
539                         q->ops->buf_release(q, buf);
540                 buf->baddr = b->m.userptr;
541                 break;
542         case V4L2_MEMORY_OVERLAY:
543                 buf->boff = b->m.offset;
544                 break;
545         default:
546                 dprintk(1, "qbuf: wrong memory type\n");
547                 goto done;
548         }
549
550         dprintk(1, "qbuf: requesting next field\n");
551         field = videobuf_next_field(q);
552         retval = q->ops->buf_prepare(q, buf, field);
553         if (0 != retval) {
554                 dprintk(1, "qbuf: buffer_prepare returned %d\n", retval);
555                 goto done;
556         }
557
558         list_add_tail(&buf->stream, &q->stream);
559         if (q->streaming) {
560                 if (q->irqlock)
561                         spin_lock_irqsave(q->irqlock, flags);
562                 q->ops->buf_queue(q, buf);
563                 if (q->irqlock)
564                         spin_unlock_irqrestore(q->irqlock, flags);
565         }
566         dprintk(1, "qbuf: succeded\n");
567         retval = 0;
568
569  done:
570         mutex_unlock(&q->vb_lock);
571
572         if (b->memory == V4L2_MEMORY_MMAP)
573                 up_read(&current->mm->mmap_sem);
574
575         return retval;
576 }
577
578 int videobuf_dqbuf(struct videobuf_queue *q,
579                struct v4l2_buffer *b, int nonblocking)
580 {
581         struct videobuf_buffer *buf;
582         int retval;
583
584         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
585
586         mutex_lock(&q->vb_lock);
587         retval = -EBUSY;
588         if (q->reading) {
589                 dprintk(1, "dqbuf: Reading running...\n");
590                 goto done;
591         }
592         retval = -EINVAL;
593         if (b->type != q->type) {
594                 dprintk(1, "dqbuf: Wrong type.\n");
595                 goto done;
596         }
597         if (list_empty(&q->stream)) {
598                 dprintk(1, "dqbuf: stream running\n");
599                 goto done;
600         }
601         buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
602         mutex_unlock(&q->vb_lock);
603         retval = videobuf_waiton(buf, nonblocking, 1);
604         mutex_lock(&q->vb_lock);
605         if (retval < 0) {
606                 dprintk(1, "dqbuf: waiton returned %d\n", retval);
607                 goto done;
608         }
609         switch (buf->state) {
610         case VIDEOBUF_ERROR:
611                 dprintk(1, "dqbuf: state is error\n");
612                 retval = -EIO;
613                 CALL(q, sync, q, buf);
614                 buf->state = VIDEOBUF_IDLE;
615                 break;
616         case VIDEOBUF_DONE:
617                 dprintk(1, "dqbuf: state is done\n");
618                 CALL(q, sync, q, buf);
619                 buf->state = VIDEOBUF_IDLE;
620                 break;
621         default:
622                 dprintk(1, "dqbuf: state invalid\n");
623                 retval = -EINVAL;
624                 goto done;
625         }
626         list_del(&buf->stream);
627         memset(b, 0, sizeof(*b));
628         videobuf_status(q, b, buf, q->type);
629
630  done:
631         mutex_unlock(&q->vb_lock);
632         return retval;
633 }
634
635 int videobuf_streamon(struct videobuf_queue *q)
636 {
637         struct videobuf_buffer *buf;
638         unsigned long flags = 0;
639         int retval;
640
641         mutex_lock(&q->vb_lock);
642         retval = -EBUSY;
643         if (q->reading)
644                 goto done;
645         retval = 0;
646         if (q->streaming)
647                 goto done;
648         q->streaming = 1;
649         if (q->irqlock)
650                 spin_lock_irqsave(q->irqlock, flags);
651         list_for_each_entry(buf, &q->stream, stream)
652                 if (buf->state == VIDEOBUF_PREPARED)
653                         q->ops->buf_queue(q, buf);
654         if (q->irqlock)
655                 spin_unlock_irqrestore(q->irqlock, flags);
656
657  done:
658         mutex_unlock(&q->vb_lock);
659         return retval;
660 }
661
662 /* Locking: Caller holds q->vb_lock */
663 static int __videobuf_streamoff(struct videobuf_queue *q)
664 {
665         if (!q->streaming)
666                 return -EINVAL;
667
668         videobuf_queue_cancel(q);
669         q->streaming = 0;
670
671         return 0;
672 }
673
674 int videobuf_streamoff(struct videobuf_queue *q)
675 {
676         int retval;
677
678         mutex_lock(&q->vb_lock);
679         retval = __videobuf_streamoff(q);
680         mutex_unlock(&q->vb_lock);
681
682         return retval;
683 }
684
685 /* Locking: Caller holds q->vb_lock */
686 static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
687                                       char __user *data,
688                                       size_t count, loff_t *ppos)
689 {
690         enum v4l2_field field;
691         unsigned long flags = 0;
692         int retval;
693
694         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
695
696         /* setup stuff */
697         q->read_buf = videobuf_alloc(q);
698         if (NULL == q->read_buf)
699                 return -ENOMEM;
700
701         q->read_buf->memory = V4L2_MEMORY_USERPTR;
702         q->read_buf->baddr  = (unsigned long)data;
703         q->read_buf->bsize  = count;
704
705         field = videobuf_next_field(q);
706         retval = q->ops->buf_prepare(q, q->read_buf, field);
707         if (0 != retval)
708                 goto done;
709
710         /* start capture & wait */
711         if (q->irqlock)
712                 spin_lock_irqsave(q->irqlock, flags);
713         q->ops->buf_queue(q, q->read_buf);
714         if (q->irqlock)
715                 spin_unlock_irqrestore(q->irqlock, flags);
716         retval = videobuf_waiton(q->read_buf, 0, 0);
717         if (0 == retval) {
718                 CALL(q, sync, q, q->read_buf);
719                 if (VIDEOBUF_ERROR == q->read_buf->state)
720                         retval = -EIO;
721                 else
722                         retval = q->read_buf->size;
723         }
724
725  done:
726         /* cleanup */
727         q->ops->buf_release(q, q->read_buf);
728         kfree(q->read_buf);
729         q->read_buf = NULL;
730         return retval;
731 }
732
733 ssize_t videobuf_read_one(struct videobuf_queue *q,
734                           char __user *data, size_t count, loff_t *ppos,
735                           int nonblocking)
736 {
737         enum v4l2_field field;
738         unsigned long flags = 0;
739         unsigned size = 0, nbufs = 1;
740         int retval;
741
742         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
743
744         mutex_lock(&q->vb_lock);
745
746         q->ops->buf_setup(q, &nbufs, &size);
747
748         if (NULL == q->read_buf  &&
749             count >= size        &&
750             !nonblocking) {
751                 retval = videobuf_read_zerocopy(q, data, count, ppos);
752                 if (retval >= 0  ||  retval == -EIO)
753                         /* ok, all done */
754                         goto done;
755                 /* fallback to kernel bounce buffer on failures */
756         }
757
758         if (NULL == q->read_buf) {
759                 /* need to capture a new frame */
760                 retval = -ENOMEM;
761                 q->read_buf = videobuf_alloc(q);
762
763                 dprintk(1, "video alloc=0x%p\n", q->read_buf);
764                 if (NULL == q->read_buf)
765                         goto done;
766                 q->read_buf->memory = V4L2_MEMORY_USERPTR;
767                 q->read_buf->bsize = count; /* preferred size */
768                 field = videobuf_next_field(q);
769                 retval = q->ops->buf_prepare(q, q->read_buf, field);
770
771                 if (0 != retval) {
772                         kfree(q->read_buf);
773                         q->read_buf = NULL;
774                         goto done;
775                 }
776                 if (q->irqlock)
777                         spin_lock_irqsave(q->irqlock, flags);
778
779                 q->ops->buf_queue(q, q->read_buf);
780                 if (q->irqlock)
781                         spin_unlock_irqrestore(q->irqlock, flags);
782                 q->read_off = 0;
783         }
784
785         /* wait until capture is done */
786         retval = videobuf_waiton(q->read_buf, nonblocking, 1);
787         if (0 != retval)
788                 goto done;
789
790         CALL(q, sync, q, q->read_buf);
791
792         if (VIDEOBUF_ERROR == q->read_buf->state) {
793                 /* catch I/O errors */
794                 q->ops->buf_release(q, q->read_buf);
795                 kfree(q->read_buf);
796                 q->read_buf = NULL;
797                 retval = -EIO;
798                 goto done;
799         }
800
801         /* Copy to userspace */
802         retval = CALL(q, video_copy_to_user, q, data, count, nonblocking);
803         if (retval < 0)
804                 goto done;
805
806         q->read_off += retval;
807         if (q->read_off == q->read_buf->size) {
808                 /* all data copied, cleanup */
809                 q->ops->buf_release(q, q->read_buf);
810                 kfree(q->read_buf);
811                 q->read_buf = NULL;
812         }
813
814  done:
815         mutex_unlock(&q->vb_lock);
816         return retval;
817 }
818
819 /* Locking: Caller holds q->vb_lock */
820 static int __videobuf_read_start(struct videobuf_queue *q)
821 {
822         enum v4l2_field field;
823         unsigned long flags = 0;
824         unsigned int count = 0, size = 0;
825         int err, i;
826
827         q->ops->buf_setup(q, &count, &size);
828         if (count < 2)
829                 count = 2;
830         if (count > VIDEO_MAX_FRAME)
831                 count = VIDEO_MAX_FRAME;
832         size = PAGE_ALIGN(size);
833
834         err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
835         if (err < 0)
836                 return err;
837
838         count = err;
839
840         for (i = 0; i < count; i++) {
841                 field = videobuf_next_field(q);
842                 err = q->ops->buf_prepare(q, q->bufs[i], field);
843                 if (err)
844                         return err;
845                 list_add_tail(&q->bufs[i]->stream, &q->stream);
846         }
847         if (q->irqlock)
848                 spin_lock_irqsave(q->irqlock, flags);
849         for (i = 0; i < count; i++)
850                 q->ops->buf_queue(q, q->bufs[i]);
851         if (q->irqlock)
852                 spin_unlock_irqrestore(q->irqlock, flags);
853         q->reading = 1;
854         return 0;
855 }
856
857 static void __videobuf_read_stop(struct videobuf_queue *q)
858 {
859         int i;
860
861
862         videobuf_queue_cancel(q);
863         __videobuf_mmap_free(q);
864         INIT_LIST_HEAD(&q->stream);
865         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
866                 if (NULL == q->bufs[i])
867                         continue;
868                 kfree(q->bufs[i]);
869                 q->bufs[i] = NULL;
870         }
871         q->read_buf = NULL;
872         q->reading  = 0;
873
874 }
875
876 int videobuf_read_start(struct videobuf_queue *q)
877 {
878         int rc;
879
880         mutex_lock(&q->vb_lock);
881         rc = __videobuf_read_start(q);
882         mutex_unlock(&q->vb_lock);
883
884         return rc;
885 }
886
887 void videobuf_read_stop(struct videobuf_queue *q)
888 {
889         mutex_lock(&q->vb_lock);
890         __videobuf_read_stop(q);
891         mutex_unlock(&q->vb_lock);
892 }
893
894 void videobuf_stop(struct videobuf_queue *q)
895 {
896         mutex_lock(&q->vb_lock);
897
898         if (q->streaming)
899                 __videobuf_streamoff(q);
900
901         if (q->reading)
902                 __videobuf_read_stop(q);
903
904         mutex_unlock(&q->vb_lock);
905 }
906
907
908 ssize_t videobuf_read_stream(struct videobuf_queue *q,
909                              char __user *data, size_t count, loff_t *ppos,
910                              int vbihack, int nonblocking)
911 {
912         int rc, retval;
913         unsigned long flags = 0;
914
915         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
916
917         dprintk(2, "%s\n", __FUNCTION__);
918         mutex_lock(&q->vb_lock);
919         retval = -EBUSY;
920         if (q->streaming)
921                 goto done;
922         if (!q->reading) {
923                 retval = __videobuf_read_start(q);
924                 if (retval < 0)
925                         goto done;
926         }
927
928         retval = 0;
929         while (count > 0) {
930                 /* get / wait for data */
931                 if (NULL == q->read_buf) {
932                         q->read_buf = list_entry(q->stream.next,
933                                                  struct videobuf_buffer,
934                                                  stream);
935                         list_del(&q->read_buf->stream);
936                         q->read_off = 0;
937                 }
938                 rc = videobuf_waiton(q->read_buf, nonblocking, 1);
939                 if (rc < 0) {
940                         if (0 == retval)
941                                 retval = rc;
942                         break;
943                 }
944
945                 if (q->read_buf->state == VIDEOBUF_DONE) {
946                         rc = CALL(q, copy_stream, q, data + retval, count,
947                                         retval, vbihack, nonblocking);
948                         if (rc < 0) {
949                                 retval = rc;
950                                 break;
951                         }
952                         retval      += rc;
953                         count       -= rc;
954                         q->read_off += rc;
955                 } else {
956                         /* some error */
957                         q->read_off = q->read_buf->size;
958                         if (0 == retval)
959                                 retval = -EIO;
960                 }
961
962                 /* requeue buffer when done with copying */
963                 if (q->read_off == q->read_buf->size) {
964                         list_add_tail(&q->read_buf->stream,
965                                       &q->stream);
966                         if (q->irqlock)
967                                 spin_lock_irqsave(q->irqlock, flags);
968                         q->ops->buf_queue(q, q->read_buf);
969                         if (q->irqlock)
970                                 spin_unlock_irqrestore(q->irqlock, flags);
971                         q->read_buf = NULL;
972                 }
973                 if (retval < 0)
974                         break;
975         }
976
977  done:
978         mutex_unlock(&q->vb_lock);
979         return retval;
980 }
981
982 unsigned int videobuf_poll_stream(struct file *file,
983                                   struct videobuf_queue *q,
984                                   poll_table *wait)
985 {
986         struct videobuf_buffer *buf = NULL;
987         unsigned int rc = 0;
988
989         mutex_lock(&q->vb_lock);
990         if (q->streaming) {
991                 if (!list_empty(&q->stream))
992                         buf = list_entry(q->stream.next,
993                                          struct videobuf_buffer, stream);
994         } else {
995                 if (!q->reading)
996                         __videobuf_read_start(q);
997                 if (!q->reading) {
998                         rc = POLLERR;
999                 } else if (NULL == q->read_buf) {
1000                         q->read_buf = list_entry(q->stream.next,
1001                                                  struct videobuf_buffer,
1002                                                  stream);
1003                         list_del(&q->read_buf->stream);
1004                         q->read_off = 0;
1005                 }
1006                 buf = q->read_buf;
1007         }
1008         if (!buf)
1009                 rc = POLLERR;
1010
1011         if (0 == rc) {
1012                 poll_wait(file, &buf->done, wait);
1013                 if (buf->state == VIDEOBUF_DONE ||
1014                     buf->state == VIDEOBUF_ERROR)
1015                         rc = POLLIN|POLLRDNORM;
1016         }
1017         mutex_unlock(&q->vb_lock);
1018         return rc;
1019 }
1020
1021 int videobuf_mmap_mapper(struct videobuf_queue *q,
1022                          struct vm_area_struct *vma)
1023 {
1024         int retval;
1025
1026         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1027
1028         mutex_lock(&q->vb_lock);
1029         retval = CALL(q, mmap_mapper, q, vma);
1030         q->is_mmapped = 1;
1031         mutex_unlock(&q->vb_lock);
1032
1033         return retval;
1034 }
1035
1036 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1037 int videobuf_cgmbuf(struct videobuf_queue *q,
1038                     struct video_mbuf *mbuf, int count)
1039 {
1040         struct v4l2_requestbuffers req;
1041         int rc, i;
1042
1043         MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
1044
1045         memset(&req, 0, sizeof(req));
1046         req.type   = q->type;
1047         req.count  = count;
1048         req.memory = V4L2_MEMORY_MMAP;
1049         rc = videobuf_reqbufs(q, &req);
1050         if (rc < 0)
1051                 return rc;
1052
1053         mbuf->frames = req.count;
1054         mbuf->size   = 0;
1055         for (i = 0; i < mbuf->frames; i++) {
1056                 mbuf->offsets[i]  = q->bufs[i]->boff;
1057                 mbuf->size       += q->bufs[i]->bsize;
1058         }
1059
1060         return 0;
1061 }
1062 EXPORT_SYMBOL_GPL(videobuf_cgmbuf);
1063 #endif
1064
1065 /* --------------------------------------------------------------------- */
1066
1067 EXPORT_SYMBOL_GPL(videobuf_waiton);
1068 EXPORT_SYMBOL_GPL(videobuf_iolock);
1069
1070 EXPORT_SYMBOL_GPL(videobuf_alloc);
1071
1072 EXPORT_SYMBOL_GPL(videobuf_queue_core_init);
1073 EXPORT_SYMBOL_GPL(videobuf_queue_cancel);
1074 EXPORT_SYMBOL_GPL(videobuf_queue_is_busy);
1075
1076 EXPORT_SYMBOL_GPL(videobuf_next_field);
1077 EXPORT_SYMBOL_GPL(videobuf_reqbufs);
1078 EXPORT_SYMBOL_GPL(videobuf_querybuf);
1079 EXPORT_SYMBOL_GPL(videobuf_qbuf);
1080 EXPORT_SYMBOL_GPL(videobuf_dqbuf);
1081 EXPORT_SYMBOL_GPL(videobuf_streamon);
1082 EXPORT_SYMBOL_GPL(videobuf_streamoff);
1083
1084 EXPORT_SYMBOL_GPL(videobuf_read_start);
1085 EXPORT_SYMBOL_GPL(videobuf_read_stop);
1086 EXPORT_SYMBOL_GPL(videobuf_stop);
1087 EXPORT_SYMBOL_GPL(videobuf_read_stream);
1088 EXPORT_SYMBOL_GPL(videobuf_read_one);
1089 EXPORT_SYMBOL_GPL(videobuf_poll_stream);
1090
1091 EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
1092 EXPORT_SYMBOL_GPL(videobuf_mmap_free);
1093 EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);