default values for its attributes as the currently hard-coded ones so
that the interface to userspace is consistent.
Signed-off-by: Daniel Scally <dan.scally@xxxxxxxxxxxxxxxx>
---
drivers/usb/gadget/function/uvc_configfs.c | 55 ++++++++++++++++------
drivers/usb/gadget/function/uvc_configfs.h | 8 ++++
2 files changed, 49 insertions(+), 14 deletions(-)
diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
index 26d092790f12..9918e7b6a023 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -1788,20 +1788,19 @@ static ssize_t uvcg_color_matching_##cname##_show( \
struct config_item *item, char *page) \
{ \
struct config_group *group = to_config_group(item); \
+ struct uvcg_cmd *cmd = to_uvcg_cmd(group); \
struct f_uvc_opts *opts; \
struct config_item *opts_item; \
struct mutex *su_mutex = &group->cg_subsys->su_mutex; \
- struct uvc_color_matching_descriptor *cd; \
int result; \
\
mutex_lock(su_mutex); /* for navigating configfs hierarchy */ \
\
opts_item = group->cg_item.ci_parent->ci_parent->ci_parent; \
opts = to_f_uvc_opts(opts_item); \
- cd = &opts->uvc_color_matching; \
\
mutex_lock(&opts->lock); \
- result = sprintf(page, "%u\n", le##bits##_to_cpu(cd->aname)); \
+ result = sprintf(page, "%u\n", le##bits##_to_cpu(cmd->desc.aname));\
mutex_unlock(&opts->lock); \
\
mutex_unlock(su_mutex); \
@@ -1823,29 +1822,57 @@ static struct configfs_attribute *uvcg_color_matching_attrs[] = {
NULL,
};
-static const struct uvcg_config_group_type uvcg_color_matching_type = {
- .type = {
- .ct_item_ops = &uvcg_config_item_ops,
- .ct_attrs = uvcg_color_matching_attrs,
- .ct_owner = THIS_MODULE,
- },
- .name = "default",
+static void uvcg_color_matching_release(struct config_item *item)
+{
+ struct uvcg_cmd *cmd;
+
+ cmd = to_uvcg_cmd(to_config_group(item));
+ kfree(cmd);
+}
+
+static struct configfs_item_operations uvcg_color_matching_item_ops = {
+ .release = uvcg_color_matching_release,
+};
+
+static const struct config_item_type uvcg_color_matching_type = {
+ .ct_item_ops = &uvcg_color_matching_item_ops,
+ .ct_attrs = uvcg_color_matching_attrs,
+ .ct_owner = THIS_MODULE,
};
/* -----------------------------------------------------------------------------
* streaming/color_matching
*/
+static int uvcg_color_matching_create_children(struct config_group *parent)
+{
+ struct uvcg_cmd *cmd;
+
+ cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
+ if (!cmd)
+ return -ENOMEM;
+
+ cmd->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE;
+ cmd->desc.bDescriptorType = USB_DT_CS_INTERFACE;
+ cmd->desc.bDescriptorSubType = UVC_VS_COLORFORMAT;
+ cmd->desc.bColorPrimaries = 1;
+ cmd->desc.bTransferCharacteristics = 1;
+ cmd->desc.bMatrixCoefficients = 4;