usb: gadget/uvc: Add support for 'get_unmapped_area' for MMUless architectures
authorBhupesh Sharma <bhupesh.sharma@st.com>
Thu, 28 Mar 2013 09:41:53 +0000 (15:11 +0530)
committerFelipe Balbi <balbi@ti.com>
Tue, 2 Apr 2013 08:42:49 +0000 (11:42 +0300)
This patch adds the support for 'get_unmapped_area' in UVC gadget
which is called when the 'mmap' system call is executed on MMUless
architectures.

Signed-off-by: Bhupesh Sharma <bhupesh.sharma@st.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/usb/gadget/uvc_queue.c
drivers/usb/gadget/uvc_v4l2.c

index 31397954c889565d1404d942baefcb09d33e3acd..7ce27e35550b7e50c887764b53f6907e4fc5864d 100644 (file)
@@ -232,6 +232,24 @@ static int uvc_queue_mmap(struct uvc_video_queue *queue,
        return ret;
 }
 
+#ifndef CONFIG_MMU
+/*
+ * Get unmapped area.
+ *
+ * NO-MMU arch need this function to make mmap() work correctly.
+ */
+static unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue,
+               unsigned long pgoff)
+{
+       unsigned long ret;
+
+       mutex_lock(&queue->mutex);
+       ret = vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0);
+       mutex_unlock(&queue->mutex);
+       return ret;
+}
+#endif
+
 /*
  * Cancel the video buffers queue.
  *
index c058867ea4fb0729e08850bc843562916d951d87..ad48e81155e2c0c838f0092e2da671a7bdaddf5f 100644 (file)
@@ -339,6 +339,18 @@ uvc_v4l2_poll(struct file *file, poll_table *wait)
        return uvc_queue_poll(&uvc->video.queue, file, wait);
 }
 
+#ifndef CONFIG_MMU
+static unsigned long uvc_v4l2_get_unmapped_area(struct file *file,
+               unsigned long addr, unsigned long len, unsigned long pgoff,
+               unsigned long flags)
+{
+       struct video_device *vdev = video_devdata(file);
+       struct uvc_device *uvc = video_get_drvdata(vdev);
+
+       return uvc_queue_get_unmapped_area(&uvc->video.queue, pgoff);
+}
+#endif
+
 static struct v4l2_file_operations uvc_v4l2_fops = {
        .owner          = THIS_MODULE,
        .open           = uvc_v4l2_open,
@@ -346,5 +358,8 @@ static struct v4l2_file_operations uvc_v4l2_fops = {
        .ioctl          = uvc_v4l2_ioctl,
        .mmap           = uvc_v4l2_mmap,
        .poll           = uvc_v4l2_poll,
+#ifndef CONFIG_MMU
+       .get_unmapped_area = uvc_v4l2_get_unmapped_area,
+#endif
 };