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