As we don't need distinction between interface descriptors for different
speeds, we can remove some amount of unnecessary code. Additionally we
simplify configfs interface of UVC function.

Signed-off-by: Robert Baldyga <r.bald...@samsung.com>
---
 drivers/usb/gadget/function/f_uvc.c        | 60 ++++-------------------
 drivers/usb/gadget/function/u_uvc.h        | 14 ++----
 drivers/usb/gadget/function/uvc.h          |  7 +--
 drivers/usb/gadget/function/uvc_configfs.c | 79 +++++-------------------------
 drivers/usb/gadget/legacy/webcam.c         | 43 ++--------------
 5 files changed, 32 insertions(+), 171 deletions(-)

diff --git a/drivers/usb/gadget/function/f_uvc.c 
b/drivers/usb/gadget/function/f_uvc.c
index 29b41b5..0f554c4 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -467,26 +467,9 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum 
usb_device_speed speed)
        unsigned int bytes;
        void *mem;
 
-       switch (speed) {
-       case USB_SPEED_SUPER:
-               uvc_control_desc = uvc->desc.ss_control;
-               uvc_streaming_cls = uvc->desc.ss_streaming;
-               uvc_streaming_std = uvc_ss_streaming;
-               break;
-
-       case USB_SPEED_HIGH:
-               uvc_control_desc = uvc->desc.fs_control;
-               uvc_streaming_cls = uvc->desc.hs_streaming;
-               uvc_streaming_std = uvc_hs_streaming;
-               break;
-
-       case USB_SPEED_FULL:
-       default:
-               uvc_control_desc = uvc->desc.fs_control;
-               uvc_streaming_cls = uvc->desc.fs_streaming;
-               uvc_streaming_std = uvc_fs_streaming;
-               break;
-       }
+       uvc_control_desc = uvc->desc.control;
+       uvc_streaming_cls = uvc->desc.streaming;
+       uvc_streaming_std = uvc_ss_streaming;
 
        if (!uvc_control_desc || !uvc_streaming_cls)
                return ERR_PTR(-ENODEV);
@@ -817,24 +800,14 @@ static struct usb_function_instance *uvc_alloc_inst(void)
        md->bTransferCharacteristics    = 1;
        md->bMatrixCoefficients         = 4;
 
-       /* Prepare fs control class descriptors for configfs-based gadgets */
-       ctl_cls = opts->uvc_fs_control_cls;
-       ctl_cls[0] = NULL;      /* assigned elsewhere by configfs */
-       ctl_cls[1] = (struct uvc_descriptor_header *)cd;
-       ctl_cls[2] = (struct uvc_descriptor_header *)pd;
-       ctl_cls[3] = (struct uvc_descriptor_header *)od;
-       ctl_cls[4] = NULL;      /* NULL-terminate */
-       opts->fs_control =
-               (const struct uvc_descriptor_header * const *)ctl_cls;
-
        /* Prepare hs control class descriptors for configfs-based gadgets */
-       ctl_cls = opts->uvc_ss_control_cls;
+       ctl_cls = opts->uvc_control_cls;
        ctl_cls[0] = NULL;      /* assigned elsewhere by configfs */
        ctl_cls[1] = (struct uvc_descriptor_header *)cd;
        ctl_cls[2] = (struct uvc_descriptor_header *)pd;
        ctl_cls[3] = (struct uvc_descriptor_header *)od;
        ctl_cls[4] = NULL;      /* NULL-terminate */
-       opts->ss_control =
+       opts->control =
                (const struct uvc_descriptor_header * const *)ctl_cls;
 
        opts->streaming_interval = 1;
@@ -884,27 +857,14 @@ static struct usb_function *uvc_alloc(struct 
usb_function_instance *fi)
        opts = fi_to_f_uvc_opts(fi);
 
        mutex_lock(&opts->lock);
-       if (opts->uvc_fs_streaming_cls) {
-               strm_cls = opts->uvc_fs_streaming_cls;
-               opts->fs_streaming =
-                       (const struct uvc_descriptor_header * const *)strm_cls;
-       }
-       if (opts->uvc_hs_streaming_cls) {
-               strm_cls = opts->uvc_hs_streaming_cls;
-               opts->hs_streaming =
-                       (const struct uvc_descriptor_header * const *)strm_cls;
-       }
-       if (opts->uvc_ss_streaming_cls) {
-               strm_cls = opts->uvc_ss_streaming_cls;
-               opts->ss_streaming =
+       if (opts->uvc_streaming_cls) {
+               strm_cls = opts->uvc_streaming_cls;
+               opts->streaming =
                        (const struct uvc_descriptor_header * const *)strm_cls;
        }
 
-       uvc->desc.fs_control = opts->fs_control;
-       uvc->desc.ss_control = opts->ss_control;
-       uvc->desc.fs_streaming = opts->fs_streaming;
-       uvc->desc.hs_streaming = opts->hs_streaming;
-       uvc->desc.ss_streaming = opts->ss_streaming;
+       uvc->desc.control = opts->control;
+       uvc->desc.streaming = opts->streaming;
        ++opts->refcnt;
        mutex_unlock(&opts->lock);
 
diff --git a/drivers/usb/gadget/function/u_uvc.h 
b/drivers/usb/gadget/function/u_uvc.h
index 4676b60..0068203 100644
--- a/drivers/usb/gadget/function/u_uvc.h
+++ b/drivers/usb/gadget/function/u_uvc.h
@@ -34,8 +34,7 @@ struct f_uvc_opts {
         * uvc_ss_control_cls arrays respectively. Legacy gadgets must
         * override them in their gadget bind callback.
         */
-       const struct uvc_descriptor_header * const      *fs_control;
-       const struct uvc_descriptor_header * const      *ss_control;
+       const struct uvc_descriptor_header * const      *control;
 
        /*
         * Streaming descriptors array pointers for full-speed, high-speed and
@@ -43,9 +42,7 @@ struct f_uvc_opts {
         * for configfs-based gadgets. Legacy gadgets must initialize them in
         * their gadget bind callback.
         */
-       const struct uvc_descriptor_header * const      *fs_streaming;
-       const struct uvc_descriptor_header * const      *hs_streaming;
-       const struct uvc_descriptor_header * const      *ss_streaming;
+       const struct uvc_descriptor_header * const      *streaming;
 
        /* Default control descriptors for configfs-based gadgets. */
        struct uvc_camera_terminal_descriptor           uvc_camera_terminal;
@@ -60,8 +57,7 @@ struct f_uvc_opts {
         * descriptors. Used by configfs only, must not be touched by legacy
         * gadgets.
         */
-       struct uvc_descriptor_header                    *uvc_fs_control_cls[5];
-       struct uvc_descriptor_header                    *uvc_ss_control_cls[5];
+       struct uvc_descriptor_header                    *uvc_control_cls[5];
 
        /*
         * Streaming descriptors for full-speed, high-speed and super-speed.
@@ -69,9 +65,7 @@ struct f_uvc_opts {
         * arrays are allocated at runtime as the number of descriptors isn't
         * known in advance.
         */
-       struct uvc_descriptor_header                    **uvc_fs_streaming_cls;
-       struct uvc_descriptor_header                    **uvc_hs_streaming_cls;
-       struct uvc_descriptor_header                    **uvc_ss_streaming_cls;
+       struct uvc_descriptor_header                    **uvc_streaming_cls;
 
        /*
         * Read/write access to configfs attributes is handled by configfs.
diff --git a/drivers/usb/gadget/function/uvc.h 
b/drivers/usb/gadget/function/uvc.h
index 7d3bb62..bccdda2 100644
--- a/drivers/usb/gadget/function/uvc.h
+++ b/drivers/usb/gadget/function/uvc.h
@@ -151,11 +151,8 @@ struct uvc_device
 
        /* Descriptors */
        struct {
-               const struct uvc_descriptor_header * const *fs_control;
-               const struct uvc_descriptor_header * const *ss_control;
-               const struct uvc_descriptor_header * const *fs_streaming;
-               const struct uvc_descriptor_header * const *hs_streaming;
-               const struct uvc_descriptor_header * const *ss_streaming;
+               const struct uvc_descriptor_header * const *control;
+               const struct uvc_descriptor_header * const *streaming;
        } desc;
 
        unsigned int control_intf;
diff --git a/drivers/usb/gadget/function/uvc_configfs.c 
b/drivers/usb/gadget/function/uvc_configfs.c
index 56ab61e..7d8e588 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -509,7 +509,7 @@ static struct config_item_type uvcg_terminal_grp_type = {
 /* control/class/{fs} */
 static struct uvcg_control_class {
        struct config_group     group;
-} uvcg_control_class_fs, uvcg_control_class_ss;
+} uvcg_control_class;
 
 
 static inline struct uvc_descriptor_header
@@ -518,11 +518,8 @@ static inline struct uvc_descriptor_header
        struct uvcg_control_class *cl = container_of(to_config_group(i),
                struct uvcg_control_class, group);
 
-       if (cl == &uvcg_control_class_fs)
-               return o->uvc_fs_control_cls;
-
-       if (cl == &uvcg_control_class_ss)
-               return o->uvc_ss_control_cls;
+       if (cl == &uvcg_control_class)
+               return o->uvc_control_cls;
 
        return NULL;
 }
@@ -619,26 +616,12 @@ static struct config_item_type uvcg_control_class_type = {
        .ct_owner       = THIS_MODULE,
 };
 
-static struct config_group *uvcg_control_class_default_groups[] = {
-       &uvcg_control_class_fs.group,
-       &uvcg_control_class_ss.group,
-       NULL,
-};
-
 /* control/class */
-static struct uvcg_control_class_grp {
-       struct config_group     group;
-} uvcg_control_class_grp;
-
-static struct config_item_type uvcg_control_class_grp_type = {
-       .ct_owner = THIS_MODULE,
-};
-
 static struct config_group *uvcg_control_default_groups[] = {
        &uvcg_control_header_grp.group,
        &uvcg_processing_grp.group,
        &uvcg_terminal_grp.group,
-       &uvcg_control_class_grp.group,
+       &uvcg_control_class.group,
        NULL,
 };
 
@@ -1797,7 +1780,7 @@ static struct config_item_type 
uvcg_color_matching_grp_type = {
 /* streaming/class/{fs|hs|ss} */
 static struct uvcg_streaming_class {
        struct config_group     group;
-} uvcg_streaming_class_fs, uvcg_streaming_class_hs, uvcg_streaming_class_ss;
+} uvcg_streaming_class;
 
 
 static inline struct uvc_descriptor_header
@@ -1806,14 +1789,8 @@ static inline struct uvc_descriptor_header
        struct uvcg_streaming_class *cl = container_of(to_config_group(i),
                struct uvcg_streaming_class, group);
 
-       if (cl == &uvcg_streaming_class_fs)
-               return &o->uvc_fs_streaming_cls;
-
-       if (cl == &uvcg_streaming_class_hs)
-               return &o->uvc_hs_streaming_cls;
-
-       if (cl == &uvcg_streaming_class_ss)
-               return &o->uvc_ss_streaming_cls;
+       if (cl == &uvcg_streaming_class)
+               return &o->uvc_streaming_cls;
 
        return NULL;
 }
@@ -2145,28 +2122,13 @@ static struct config_item_type 
uvcg_streaming_class_type = {
        .ct_owner       = THIS_MODULE,
 };
 
-static struct config_group *uvcg_streaming_class_default_groups[] = {
-       &uvcg_streaming_class_fs.group,
-       &uvcg_streaming_class_hs.group,
-       &uvcg_streaming_class_ss.group,
-       NULL,
-};
-
 /* streaming/class */
-static struct uvcg_streaming_class_grp {
-       struct config_group     group;
-} uvcg_streaming_class_grp;
-
-static struct config_item_type uvcg_streaming_class_grp_type = {
-       .ct_owner = THIS_MODULE,
-};
-
 static struct config_group *uvcg_streaming_default_groups[] = {
        &uvcg_streaming_header_grp.group,
        &uvcg_uncompressed_grp.group,
        &uvcg_mjpeg_grp.group,
        &uvcg_color_matching_grp.group,
-       &uvcg_streaming_class_grp.group,
+       &uvcg_streaming_class.group,
        NULL,
 };
 
@@ -2312,16 +2274,9 @@ int uvcg_attach_configfs(struct f_uvc_opts *opts)
                        uvcg_terminal_default_groups,
                        "terminal",
                        &uvcg_terminal_grp_type);
-       config_group_init_type_name(&uvcg_control_class_fs.group,
-                                   "fs",
-                                   &uvcg_control_class_type);
-       config_group_init_type_name(&uvcg_control_class_ss.group,
-                                   "ss",
+       config_group_init_type_name(&uvcg_control_class.group,
+                                   "desc",
                                    &uvcg_control_class_type);
-       uvcg_init_group(&uvcg_control_class_grp.group,
-                       uvcg_control_class_default_groups,
-                       "class",
-                       &uvcg_control_class_grp_type);
        uvcg_init_group(&uvcg_control_grp.group,
                        uvcg_control_default_groups,
                        "control",
@@ -2342,19 +2297,9 @@ int uvcg_attach_configfs(struct f_uvc_opts *opts)
                        uvcg_color_matching_default_groups,
                        "color_matching",
                        &uvcg_color_matching_grp_type);
-       config_group_init_type_name(&uvcg_streaming_class_fs.group,
-                                   "fs",
-                                   &uvcg_streaming_class_type);
-       config_group_init_type_name(&uvcg_streaming_class_hs.group,
-                                   "hs",
-                                   &uvcg_streaming_class_type);
-       config_group_init_type_name(&uvcg_streaming_class_ss.group,
-                                   "ss",
+       config_group_init_type_name(&uvcg_streaming_class.group,
+                                   "desc",
                                    &uvcg_streaming_class_type);
-       uvcg_init_group(&uvcg_streaming_class_grp.group,
-                       uvcg_streaming_class_default_groups,
-                       "class",
-                       &uvcg_streaming_class_grp_type);
        uvcg_init_group(&uvcg_streaming_grp.group,
                        uvcg_streaming_default_groups,
                        "streaming",
diff --git a/drivers/usb/gadget/legacy/webcam.c 
b/drivers/usb/gadget/legacy/webcam.c
index f9661cd..ffe5ef4 100644
--- a/drivers/usb/gadget/legacy/webcam.c
+++ b/drivers/usb/gadget/legacy/webcam.c
@@ -278,7 +278,7 @@ static const struct uvc_color_matching_descriptor 
uvc_color_matching = {
        .bMatrixCoefficients    = 4,
 };
 
-static const struct uvc_descriptor_header * const uvc_fs_control_cls[] = {
+static const struct uvc_descriptor_header * const uvc_control_cls[] = {
        (const struct uvc_descriptor_header *) &uvc_control_header,
        (const struct uvc_descriptor_header *) &uvc_camera_terminal,
        (const struct uvc_descriptor_header *) &uvc_processing,
@@ -286,39 +286,7 @@ static const struct uvc_descriptor_header * const 
uvc_fs_control_cls[] = {
        NULL,
 };
 
-static const struct uvc_descriptor_header * const uvc_ss_control_cls[] = {
-       (const struct uvc_descriptor_header *) &uvc_control_header,
-       (const struct uvc_descriptor_header *) &uvc_camera_terminal,
-       (const struct uvc_descriptor_header *) &uvc_processing,
-       (const struct uvc_descriptor_header *) &uvc_output_terminal,
-       NULL,
-};
-
-static const struct uvc_descriptor_header * const uvc_fs_streaming_cls[] = {
-       (const struct uvc_descriptor_header *) &uvc_input_header,
-       (const struct uvc_descriptor_header *) &uvc_format_yuv,
-       (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p,
-       (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
-       (const struct uvc_descriptor_header *) &uvc_format_mjpg,
-       (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p,
-       (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p,
-       (const struct uvc_descriptor_header *) &uvc_color_matching,
-       NULL,
-};
-
-static const struct uvc_descriptor_header * const uvc_hs_streaming_cls[] = {
-       (const struct uvc_descriptor_header *) &uvc_input_header,
-       (const struct uvc_descriptor_header *) &uvc_format_yuv,
-       (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p,
-       (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p,
-       (const struct uvc_descriptor_header *) &uvc_format_mjpg,
-       (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p,
-       (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p,
-       (const struct uvc_descriptor_header *) &uvc_color_matching,
-       NULL,
-};
-
-static const struct uvc_descriptor_header * const uvc_ss_streaming_cls[] = {
+static const struct uvc_descriptor_header * const uvc_streaming_cls[] = {
        (const struct uvc_descriptor_header *) &uvc_input_header,
        (const struct uvc_descriptor_header *) &uvc_format_yuv,
        (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p,
@@ -385,11 +353,8 @@ webcam_bind(struct usb_composite_dev *cdev)
        uvc_opts->streaming_maxburst = streaming_maxburst;
        uvc_set_trace_param(trace);
 
-       uvc_opts->fs_control = uvc_fs_control_cls;
-       uvc_opts->ss_control = uvc_ss_control_cls;
-       uvc_opts->fs_streaming = uvc_fs_streaming_cls;
-       uvc_opts->hs_streaming = uvc_hs_streaming_cls;
-       uvc_opts->ss_streaming = uvc_ss_streaming_cls;
+       uvc_opts->control = uvc_control_cls;
+       uvc_opts->streaming = uvc_streaming_cls;
 
        /* Allocate string descriptor numbers ... note that string contents
         * can be overridden by the composite_dev glue.
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to