usb: gadget: uvc: separately compile some components of f_uvc
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Mon, 8 Sep 2014 23:02:09 +0000 (02:02 +0300)
committerFelipe Balbi <balbi@ti.com>
Tue, 9 Sep 2014 14:49:12 +0000 (09:49 -0500)
Compile uvc_queue, uvc_v4l2, uvc_video separately so that later they can
be all combined in a separately compiled f_uvc.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Tested-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
[Make uvc_v4l2_ioctl_ops non-static]
[Rename __UVC__V4L2__H__ and __UVC__VIDEO__H__]
[Update MAINTAINERS]
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
12 files changed:
MAINTAINERS
drivers/usb/gadget/function/f_uvc.c
drivers/usb/gadget/function/f_uvc.h
drivers/usb/gadget/function/uvc.h
drivers/usb/gadget/function/uvc_queue.c
drivers/usb/gadget/function/uvc_queue.h
drivers/usb/gadget/function/uvc_v4l2.c
drivers/usb/gadget/function/uvc_v4l2.h [new file with mode: 0644]
drivers/usb/gadget/function/uvc_video.c
drivers/usb/gadget/function/uvc_video.h [new file with mode: 0644]
drivers/usb/gadget/legacy/Makefile
drivers/usb/gadget/legacy/webcam.c

index 5d66c03..96568a8 100644 (file)
@@ -9669,7 +9669,7 @@ USB WEBCAM GADGET
 M:     Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 L:     linux-usb@vger.kernel.org
 S:     Maintained
-F:     drivers/usb/gadget/function/*uvc*.c
+F:     drivers/usb/gadget/function/*uvc*
 F:     drivers/usb/gadget/legacy/webcam.c
 
 USB WIRELESS RNDIS DRIVER (rndis_wlan)
index ae5bcb4..825080d 100644 (file)
@@ -27,6 +27,8 @@
 #include <media/v4l2-event.h>
 
 #include "uvc.h"
+#include "uvc_v4l2.h"
+#include "uvc_video.h"
 
 unsigned int uvc_gadget_trace_param;
 static unsigned int streaming_interval;
index 74b9602..71b38dd 100644 (file)
 #include <linux/usb/composite.h>
 #include <linux/usb/video.h>
 
+#include "uvc.h"
+
+void uvc_function_setup_continue(struct uvc_device *uvc);
+
+void uvc_function_connect(struct uvc_device *uvc);
+
+void uvc_function_disconnect(struct uvc_device *uvc);
+
 int uvc_bind_config(struct usb_configuration *c,
                    const struct uvc_descriptor_header * const *fs_control,
                    const struct uvc_descriptor_header * const *hs_control,
index 0a283b1..f67695c 100644 (file)
@@ -53,6 +53,7 @@ struct uvc_event
 #ifdef __KERNEL__
 
 #include <linux/usb.h> /* For usb_endpoint_* */
+#include <linux/usb/composite.h>
 #include <linux/usb/gadget.h>
 #include <linux/videodev2.h>
 #include <linux/version.h>
index 1e1bc73..8ea8b3b 100644 (file)
@@ -126,8 +126,7 @@ static struct vb2_ops uvc_queue_qops = {
        .wait_finish = uvc_wait_finish,
 };
 
-static int uvcg_queue_init(struct uvc_video_queue *queue,
-                          enum v4l2_buf_type type)
+int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
 {
        int ret;
 
@@ -154,7 +153,7 @@ static int uvcg_queue_init(struct uvc_video_queue *queue,
 /*
  * Free the video buffers.
  */
-static void uvcg_free_buffers(struct uvc_video_queue *queue)
+void uvcg_free_buffers(struct uvc_video_queue *queue)
 {
        mutex_lock(&queue->mutex);
        vb2_queue_release(&queue->queue);
@@ -164,7 +163,7 @@ static void uvcg_free_buffers(struct uvc_video_queue *queue)
 /*
  * Allocate the video buffers.
  */
-static int uvcg_alloc_buffers(struct uvc_video_queue *queue,
+int uvcg_alloc_buffers(struct uvc_video_queue *queue,
                              struct v4l2_requestbuffers *rb)
 {
        int ret;
@@ -176,8 +175,7 @@ static int uvcg_alloc_buffers(struct uvc_video_queue *queue,
        return ret ? ret : rb->count;
 }
 
-static int uvcg_query_buffer(struct uvc_video_queue *queue,
-                            struct v4l2_buffer *buf)
+int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
 {
        int ret;
 
@@ -188,8 +186,7 @@ static int uvcg_query_buffer(struct uvc_video_queue *queue,
        return ret;
 }
 
-static int uvcg_queue_buffer(struct uvc_video_queue *queue,
-                            struct v4l2_buffer *buf)
+int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
 {
        unsigned long flags;
        int ret;
@@ -213,8 +210,8 @@ done:
  * Dequeue a video buffer. If nonblocking is false, block until a buffer is
  * available.
  */
-static int uvcg_dequeue_buffer(struct uvc_video_queue *queue,
-                              struct v4l2_buffer *buf, int nonblocking)
+int uvcg_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf,
+                       int nonblocking)
 {
        int ret;
 
@@ -231,8 +228,8 @@ static int uvcg_dequeue_buffer(struct uvc_video_queue *queue,
  * This function implements video queue polling and is intended to be used by
  * the device poll handler.
  */
-static unsigned int uvcg_queue_poll(struct uvc_video_queue *queue,
-                                   struct file *file, poll_table *wait)
+unsigned int uvcg_queue_poll(struct uvc_video_queue *queue, struct file *file,
+                            poll_table *wait)
 {
        unsigned int ret;
 
@@ -243,8 +240,7 @@ static unsigned int uvcg_queue_poll(struct uvc_video_queue *queue,
        return ret;
 }
 
-static int uvcg_queue_mmap(struct uvc_video_queue *queue,
-                          struct vm_area_struct *vma)
+int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
 {
        int ret;
 
@@ -261,9 +257,8 @@ static int uvcg_queue_mmap(struct uvc_video_queue *queue,
  *
  * NO-MMU arch need this function to make mmap() work correctly.
  */
-static unsigned long uvcg_queue_get_unmapped_area(
-                               struct uvc_video_queue *queue,
-                               unsigned long pgoff)
+unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue,
+                                          unsigned long pgoff)
 {
        unsigned long ret;
 
@@ -286,7 +281,7 @@ static unsigned long uvcg_queue_get_unmapped_area(
  * This function acquires the irq spinlock and can be called from interrupt
  * context.
  */
-static void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect)
+void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect)
 {
        struct uvc_buffer *buf;
        unsigned long flags;
@@ -327,7 +322,7 @@ static void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect)
  * This function can't be called from interrupt context. Use
  * uvcg_queue_cancel() instead.
  */
-static int uvcg_queue_enable(struct uvc_video_queue *queue, int enable)
+int uvcg_queue_enable(struct uvc_video_queue *queue, int enable)
 {
        unsigned long flags;
        int ret = 0;
@@ -364,8 +359,8 @@ done:
 }
 
 /* called with &queue_irqlock held.. */
-static struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue,
-                                                struct uvc_buffer *buf)
+struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue,
+                                         struct uvc_buffer *buf)
 {
        struct uvc_buffer *nextbuf;
 
@@ -393,7 +388,7 @@ static struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue,
        return nextbuf;
 }
 
-static struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue)
+struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue)
 {
        struct uvc_buffer *buf = NULL;
 
index 8e76ce9..03919c7 100644 (file)
@@ -57,6 +57,39 @@ static inline int uvc_queue_streaming(struct uvc_video_queue *queue)
        return vb2_is_streaming(&queue->queue);
 }
 
+int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type);
+
+void uvcg_free_buffers(struct uvc_video_queue *queue);
+
+int uvcg_alloc_buffers(struct uvc_video_queue *queue,
+                      struct v4l2_requestbuffers *rb);
+
+int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf);
+
+int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf);
+
+int uvcg_dequeue_buffer(struct uvc_video_queue *queue,
+                       struct v4l2_buffer *buf, int nonblocking);
+
+unsigned int uvcg_queue_poll(struct uvc_video_queue *queue,
+                            struct file *file, poll_table *wait);
+
+int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma);
+
+#ifndef CONFIG_MMU
+unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue,
+                                          unsigned long pgoff);
+#endif /* CONFIG_MMU */
+
+void uvcg_queue_cancel(struct uvc_video_queue *queue, int disconnect);
+
+int uvcg_queue_enable(struct uvc_video_queue *queue, int enable);
+
+struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue,
+                                         struct uvc_buffer *buf);
+
+struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue);
+
 #endif /* __KERNEL__ */
 
 #endif /* _UVC_QUEUE_H_ */
index c85730e..b52f268 100644 (file)
 #include <media/v4l2-event.h>
 #include <media/v4l2-ioctl.h>
 
+#include "f_uvc.h"
 #include "uvc.h"
 #include "uvc_queue.h"
+#include "uvc_video.h"
 
 /* --------------------------------------------------------------------------
  * Requests handling
@@ -259,7 +261,7 @@ uvc_v4l2_ioctl_default(struct file *file, void *fh, bool valid_prio,
        }
 }
 
-static const struct v4l2_ioctl_ops uvc_v4l2_ioctl_ops = {
+const struct v4l2_ioctl_ops uvc_v4l2_ioctl_ops = {
        .vidioc_querycap = uvc_v4l2_querycap,
        .vidioc_g_fmt_vid_out = uvc_v4l2_get_format,
        .vidioc_s_fmt_vid_out = uvc_v4l2_set_format,
@@ -350,7 +352,7 @@ static unsigned long uvc_v4l2_get_unmapped_area(struct file *file,
 }
 #endif
 
-static struct v4l2_file_operations uvc_v4l2_fops = {
+struct v4l2_file_operations uvc_v4l2_fops = {
        .owner          = THIS_MODULE,
        .open           = uvc_v4l2_open,
        .release        = uvc_v4l2_release,
diff --git a/drivers/usb/gadget/function/uvc_v4l2.h b/drivers/usb/gadget/function/uvc_v4l2.h
new file mode 100644 (file)
index 0000000..2683b92
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ *     uvc_v4l2.h  --  USB Video Class Gadget driver
+ *
+ * Copyright (C) 2009-2010
+ *             Laurent Pinchart (laurent.pinchart@ideasonboard.com)
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *             Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __UVC_V4L2_H__
+#define __UVC_V4L2_H__
+
+extern const struct v4l2_ioctl_ops uvc_v4l2_ioctl_ops;
+extern struct v4l2_file_operations uvc_v4l2_fops;
+
+#endif /* __UVC_V4L2_H__ */
index be6749e..b0528e8 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/errno.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
+#include <linux/usb/video.h>
 
 #include <media/v4l2-dev.h>
 
@@ -279,8 +280,7 @@ error:
  * This function fills the available USB requests (listed in req_free) with
  * video data from the queued buffers.
  */
-static int
-uvcg_video_pump(struct uvc_video *video)
+int uvcg_video_pump(struct uvc_video *video)
 {
        struct uvc_video_queue *queue = &video->queue;
        struct usb_request *req;
@@ -339,8 +339,7 @@ uvcg_video_pump(struct uvc_video *video)
 /*
  * Enable or disable the video stream.
  */
-static int
-uvcg_video_enable(struct uvc_video *video, int enable)
+int uvcg_video_enable(struct uvc_video *video, int enable)
 {
        unsigned int i;
        int ret;
@@ -378,8 +377,7 @@ uvcg_video_enable(struct uvc_video *video, int enable)
 /*
  * Initialize the UVC video stream.
  */
-static int
-uvcg_video_init(struct uvc_video *video)
+int uvcg_video_init(struct uvc_video *video)
 {
        INIT_LIST_HEAD(&video->req_free);
        spin_lock_init(&video->req_lock);
diff --git a/drivers/usb/gadget/function/uvc_video.h b/drivers/usb/gadget/function/uvc_video.h
new file mode 100644 (file)
index 0000000..ef00f06
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ *     uvc_video.h  --  USB Video Class Gadget driver
+ *
+ * Copyright (C) 2009-2010
+ *             Laurent Pinchart (laurent.pinchart@ideasonboard.com)
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *             Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __UVC_VIDEO_H__
+#define __UVC_VIDEO_H__
+
+int uvcg_video_pump(struct uvc_video *video);
+
+int uvcg_video_enable(struct uvc_video *video, int enable);
+
+int uvcg_video_init(struct uvc_video *video);
+
+#endif /* __UVC_VIDEO_H__ */
index 7f485f2..ed7367e 100644 (file)
@@ -19,7 +19,7 @@ g_multi-y                     := multi.o
 g_hid-y                                := hid.o
 g_dbgp-y                       := dbgp.o
 g_nokia-y                      := nokia.o
-g_webcam-y                     := webcam.o
+g_webcam-y                     := webcam.o ../function/uvc_queue.o ../function/uvc_v4l2.o ../function/uvc_video.o
 g_ncm-y                                := ncm.o
 g_acm_ms-y                     := acm_ms.o
 g_tcm_usb_gadget-y             := tcm_usb_gadget.o
index f826622..5d02849 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/device.h>
+#include <linux/module.h>
 #include <linux/usb/video.h>
 
-#include "f_uvc.h"
-
 /*
  * Kbuild is not very cooperative with respect to linking separately
  * compiled library objects into one module.  So for now we won't use
@@ -23,9 +22,6 @@
  * the runtime footprint, and giving us at least some parts of what
  * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  */
-#include "uvc_queue.c"
-#include "uvc_video.c"
-#include "uvc_v4l2.c"
 #include "f_uvc.c"
 
 USB_GADGET_COMPOSITE_OPTIONS();