|
@@ -1567,6 +1567,37 @@ int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(vb2_mmap);
|
|
|
|
|
|
+#ifndef CONFIG_MMU
|
|
|
+unsigned long vb2_get_unmapped_area(struct vb2_queue *q,
|
|
|
+ unsigned long addr,
|
|
|
+ unsigned long len,
|
|
|
+ unsigned long pgoff,
|
|
|
+ unsigned long flags)
|
|
|
+{
|
|
|
+ unsigned long off = pgoff << PAGE_SHIFT;
|
|
|
+ struct vb2_buffer *vb;
|
|
|
+ unsigned int buffer, plane;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (q->memory != V4L2_MEMORY_MMAP) {
|
|
|
+ dprintk(1, "Queue is not currently set up for mmap\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Find the plane corresponding to the offset passed by userspace.
|
|
|
+ */
|
|
|
+ ret = __find_plane_by_offset(q, off, &buffer, &plane);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ vb = q->bufs[buffer];
|
|
|
+
|
|
|
+ return (unsigned long)vb2_plane_vaddr(vb, plane);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(vb2_get_unmapped_area);
|
|
|
+#endif
|
|
|
+
|
|
|
static int __vb2_init_fileio(struct vb2_queue *q, int read);
|
|
|
static int __vb2_cleanup_fileio(struct vb2_queue *q);
|
|
|
|