int videobuf_mmap_free(struct videobuf_queue *q) { int ret; mutex_lock(&q->lock); ret = __videobuf_mmap_free(q); mutex_unlock(&q->lock); return ret; }
static void __videobuf_read_stop(struct videobuf_queue *q) { int i; videobuf_queue_cancel(q); __videobuf_mmap_free(q); INIT_LIST_HEAD(&q->stream); for (i = 0; i < VIDEO_MAX_FRAME; i++) { if (NULL == q->bufs[i]) continue; kfree(q->bufs[i]); q->bufs[i] = NULL; } q->read_buf = NULL; }
/* Locking: Caller holds q->lock */ static int __videobuf_mmap_setup(struct videobuf_queue *q, unsigned int bcount, unsigned int bsize, enum v4l2_memory memory) { unsigned int i; int err; MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS); err = __videobuf_mmap_free(q); if (0 != err) return err; /* Allocate and initialize buffers */ for (i = 0; i < bcount; i++) { q->bufs[i] = videobuf_alloc(q); if (q->bufs[i] == NULL) break; q->bufs[i]->i = i; q->bufs[i]->input = UNSET; q->bufs[i]->memory = memory; q->bufs[i]->bsize = bsize; switch (memory) { case V4L2_MEMORY_MMAP: q->bufs[i]->boff = bsize * i; break; case V4L2_MEMORY_USERPTR: case V4L2_MEMORY_OVERLAY: /* nothing */ break; } } if (!i) return -ENOMEM; dprintk(1,"mmap setup: %d buffers, %d bytes each\n", i, bsize); return i; }