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