usb: gadget: uvc: Make bSourceID read/write
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>
This commit is contained in:
parent
a7efe3fc7c
commit
b3c839bd8a
|
@ -54,7 +54,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
|
||||
|
|
|
@ -484,11 +484,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,
|
||||
|
|
Loading…
Reference in New Issue