Skip to content

Commit

Permalink
usb: gadget: uvc: Make bSourceID read/write
Browse files Browse the repository at this point in the history
[ Upstream commit b3c839b ]

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>
  • Loading branch information
Daniel Scally authored and gregkh committed Mar 11, 2023
1 parent 00b42e3 commit ec8a0f4
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Documentation/ABI/testing/configfs-usb-gadget-uvc
Expand Up @@ -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
Expand Down
59 changes: 58 additions & 1 deletion drivers/usb/gadget/function/uvc_configfs.c
Expand Up @@ -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,
Expand Down

0 comments on commit ec8a0f4

Please sign in to comment.