]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
usb: gadget: uvc: Make bSourceID read/write
authorDaniel Scally <dan.scally@ideasonboard.com>
Mon, 6 Feb 2023 16:17:52 +0000 (16:17 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 11 Mar 2023 12:55:38 +0000 (13:55 +0100)
[ Upstream commit b3c839bd8a07d303bc59a900d55dd35c7826562c ]

At the moment, the UVC function graph is hardcoded IT -> PU -> OT.
To add XU support we need the ability to insert the XU descriptors
into the chain. To facilitate that, make the output terminal's
bSourceID attribute writeable so that we can configure its source.

Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
Link: https://lore.kernel.org/r/20230206161802.892954-2-dan.scally@ideasonboard.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Documentation/ABI/testing/configfs-usb-gadget-uvc
drivers/usb/gadget/function/uvc_configfs.c

index 611b23e6488d964d81dee626b0fc2a6f5b279fb3..feb3f2cc0c167b0db79d60cb4f226e670b6c2f41 100644 (file)
@@ -52,7 +52,7 @@ Date:         Dec 2014
 KernelVersion: 4.0
 Description:   Default output terminal descriptors
 
-               All attributes read only:
+               All attributes read only except bSourceID:
 
                ==============  =============================================
                iTerminal       index of string descriptor
index 4303a3283ba0a3a3b9927391553546fe2fbb3ccf..832565730d224ae7de502a84ffa0fd5eb14b98d4 100644 (file)
@@ -483,11 +483,68 @@ UVC_ATTR_RO(uvcg_default_output_, cname, aname)
 UVCG_DEFAULT_OUTPUT_ATTR(b_terminal_id, bTerminalID, 8);
 UVCG_DEFAULT_OUTPUT_ATTR(w_terminal_type, wTerminalType, 16);
 UVCG_DEFAULT_OUTPUT_ATTR(b_assoc_terminal, bAssocTerminal, 8);
-UVCG_DEFAULT_OUTPUT_ATTR(b_source_id, bSourceID, 8);
 UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, 8);
 
 #undef UVCG_DEFAULT_OUTPUT_ATTR
 
+static ssize_t uvcg_default_output_b_source_id_show(struct config_item *item,
+                                                   char *page)
+{
+       struct config_group *group = to_config_group(item);
+       struct f_uvc_opts *opts;
+       struct config_item *opts_item;
+       struct mutex *su_mutex = &group->cg_subsys->su_mutex;
+       struct uvc_output_terminal_descriptor *cd;
+       int result;
+
+       mutex_lock(su_mutex); /* for navigating configfs hierarchy */
+
+       opts_item = group->cg_item.ci_parent->ci_parent->
+                       ci_parent->ci_parent;
+       opts = to_f_uvc_opts(opts_item);
+       cd = &opts->uvc_output_terminal;
+
+       mutex_lock(&opts->lock);
+       result = sprintf(page, "%u\n", le8_to_cpu(cd->bSourceID));
+       mutex_unlock(&opts->lock);
+
+       mutex_unlock(su_mutex);
+
+       return result;
+}
+
+static ssize_t uvcg_default_output_b_source_id_store(struct config_item *item,
+                                                    const char *page, size_t len)
+{
+       struct config_group *group = to_config_group(item);
+       struct f_uvc_opts *opts;
+       struct config_item *opts_item;
+       struct mutex *su_mutex = &group->cg_subsys->su_mutex;
+       struct uvc_output_terminal_descriptor *cd;
+       int result;
+       u8 num;
+
+       mutex_lock(su_mutex); /* for navigating configfs hierarchy */
+
+       opts_item = group->cg_item.ci_parent->ci_parent->
+                       ci_parent->ci_parent;
+       opts = to_f_uvc_opts(opts_item);
+       cd = &opts->uvc_output_terminal;
+
+       result = kstrtou8(page, 0, &num);
+       if (result)
+               return result;
+
+       mutex_lock(&opts->lock);
+       cd->bSourceID = num;
+       mutex_unlock(&opts->lock);
+
+       mutex_unlock(su_mutex);
+
+       return len;
+}
+UVC_ATTR(uvcg_default_output_, b_source_id, bSourceID);
+
 static struct configfs_attribute *uvcg_default_output_attrs[] = {
        &uvcg_default_output_attr_b_terminal_id,
        &uvcg_default_output_attr_w_terminal_type,