Linux USB
 help / color / mirror / Atom feed
From: Daniel Scally <dan.scally@ideasonboard.com>
To: linux-usb@vger.kernel.org
Cc: laurent.pinchart@ideasonboard.com, gregkh@linuxfoundation.org,
	w36195@motorola.com, m.grzeschik@pengutronix.de,
	kieran.bingham@ideasonboard.com, torleiv@huddly.com,
	Daniel Scally <dan.scally@ideasonboard.com>
Subject: [PATCH 3/6] usb: gadget: uvc: Copy color matching descriptor for each frame
Date: Tue, 13 Dec 2022 08:37:33 +0000	[thread overview]
Message-ID: <20221213083736.2284536-4-dan.scally@ideasonboard.com> (raw)
In-Reply-To: <20221213083736.2284536-1-dan.scally@ideasonboard.com>

As currently implemented the default color matching descriptor is
appended after _all_ the formats and frames that the gadget is
configured with. According to the UVC specifications however this
is supposed to be on a per-format basis (section 3.9.2.6):

"Only one instance is allowed for a given format and if present,
the Color Matching descriptor shall be placed following the Video
and Still Image Frame descriptors for that format."

Associate the default color matching descriptor with struct
uvcg_format and copy it once-per-format instead of once only.

Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
---
 drivers/usb/gadget/function/uvc_configfs.c | 60 ++++++++++++++++++++--
 drivers/usb/gadget/function/uvc_configfs.h |  1 +
 2 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
index 9918e7b6a023..6f5932c9f09c 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -747,6 +747,28 @@ static const char * const uvcg_format_names[] = {
 	"mjpeg",
 };
 
+static struct uvcg_cmd *uvcg_format_get_default_cmd(struct config_item *streaming)
+{
+	struct config_item *color_matching, *cm_default;
+	struct uvcg_cmd *cmd;
+
+	color_matching = config_group_find_item(to_config_group(streaming),
+						"color_matching");
+	if (!color_matching)
+		return NULL;
+
+	cm_default = config_group_find_item(to_config_group(color_matching),
+					    "default");
+	config_item_put(color_matching);
+	if (!cm_default)
+		return NULL;
+
+	cmd = to_uvcg_cmd(to_config_group(cm_default));
+	config_item_put(cm_default);
+
+	return cmd;
+}
+
 static ssize_t uvcg_format_bma_controls_show(struct uvcg_format *f, char *page)
 {
 	struct f_uvc_opts *opts;
@@ -1560,7 +1582,14 @@ static struct config_group *uvcg_uncompressed_make(struct config_group *group,
 		'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00,
 		 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
 	};
+	struct config_item *streaming;
 	struct uvcg_uncompressed *h;
+	struct uvcg_cmd *cmd;
+
+	streaming = group->cg_item.ci_parent;
+	cmd = uvcg_format_get_default_cmd(streaming);
+	if (!cmd)
+		return ERR_PTR(-EINVAL);
 
 	h = kzalloc(sizeof(*h), GFP_KERNEL);
 	if (!h)
@@ -1579,6 +1608,7 @@ static struct config_group *uvcg_uncompressed_make(struct config_group *group,
 
 	INIT_LIST_HEAD(&h->fmt.frames);
 	h->fmt.type = UVCG_UNCOMPRESSED;
+	h->fmt.color_matching = cmd;
 	config_group_init_type_name(&h->fmt.group, name,
 				    &uvcg_uncompressed_type);
 
@@ -1743,7 +1773,14 @@ static const struct config_item_type uvcg_mjpeg_type = {
 static struct config_group *uvcg_mjpeg_make(struct config_group *group,
 						   const char *name)
 {
+	struct config_item *streaming;
 	struct uvcg_mjpeg *h;
+	struct uvcg_cmd *cmd;
+
+	streaming = group->cg_item.ci_parent;
+	cmd = uvcg_format_get_default_cmd(streaming);
+	if (!cmd)
+		return ERR_PTR(-EINVAL);
 
 	h = kzalloc(sizeof(*h), GFP_KERNEL);
 	if (!h)
@@ -1760,6 +1797,7 @@ static struct config_group *uvcg_mjpeg_make(struct config_group *group,
 
 	INIT_LIST_HEAD(&h->fmt.frames);
 	h->fmt.type = UVCG_MJPEG;
+	h->fmt.color_matching = cmd;
 	config_group_init_type_name(&h->fmt.group, name,
 				    &uvcg_mjpeg_type);
 
@@ -1906,7 +1944,8 @@ static inline struct uvc_descriptor_header
 enum uvcg_strm_type {
 	UVCG_HEADER = 0,
 	UVCG_FORMAT,
-	UVCG_FRAME
+	UVCG_FRAME,
+	UVCG_CMD,
 };
 
 /*
@@ -1956,6 +1995,10 @@ static int __uvcg_iter_strm_cls(struct uvcg_streaming_header *h,
 			if (ret)
 				return ret;
 		}
+
+		ret = fun(f->fmt->color_matching, priv2, priv3, 0, UVCG_CMD);
+		if (ret)
+			return ret;
 	}
 
 	return ret;
@@ -2011,6 +2054,11 @@ static int __uvcg_cnt_strm(void *priv1, void *priv2, void *priv3, int n,
 		*size += frm->frame.b_frame_interval_type * sz;
 	}
 	break;
+	case UVCG_CMD: {
+		struct uvcg_cmd *cmd = priv1;
+		*size += sizeof(cmd->desc);
+	}
+	break;
 	}
 
 	++*count;
@@ -2096,6 +2144,13 @@ static int __uvcg_fill_strm(void *priv1, void *priv2, void *priv3, int n,
 				frm->frame.b_frame_interval_type);
 	}
 	break;
+	case UVCG_CMD: {
+		struct uvcg_cmd *cmd = priv1;
+
+		memcpy(*dest, &cmd->desc, sizeof(cmd->desc));
+		*dest += sizeof(cmd->desc);
+	}
+	break;
 	}
 
 	return 0;
@@ -2135,7 +2190,7 @@ static int uvcg_streaming_class_allow_link(struct config_item *src,
 	if (ret)
 		goto unlock;
 
-	count += 2; /* color_matching, NULL */
+	count += 1; /* NULL */
 	*class_array = kcalloc(count, sizeof(void *), GFP_KERNEL);
 	if (!*class_array) {
 		ret = -ENOMEM;
@@ -2162,7 +2217,6 @@ static int uvcg_streaming_class_allow_link(struct config_item *src,
 		kfree(data_save);
 		goto unlock;
 	}
-	*cl_arr = (struct uvc_descriptor_header *)&opts->uvc_color_matching;
 
 	++target_hdr->linked;
 	ret = 0;
diff --git a/drivers/usb/gadget/function/uvc_configfs.h b/drivers/usb/gadget/function/uvc_configfs.h
index f990739838d5..6582d6c7b6f6 100644
--- a/drivers/usb/gadget/function/uvc_configfs.h
+++ b/drivers/usb/gadget/function/uvc_configfs.h
@@ -57,6 +57,7 @@ struct uvcg_format {
 	struct list_head	frames;
 	unsigned		num_frames;
 	__u8			bmaControls[UVCG_STREAMING_CONTROL_SIZE];
+	struct uvcg_cmd		*color_matching;
 };
 
 struct uvcg_format_ptr {
-- 
2.34.1


  parent reply	other threads:[~2022-12-13  8:37 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-13  8:37 [PATCH 0/6] UVC Gadget: Extend color matching support Daniel Scally
2022-12-13  8:37 ` [PATCH 1/6] usb: gadget: usb: Remove "default" from color matching attributes Daniel Scally
2022-12-18 23:29   ` Laurent Pinchart
2022-12-19  9:53     ` Kieran Bingham
2022-12-13  8:37 ` [PATCH 2/6] usb: gadget: uvc: Add struct for color matching in configs Daniel Scally
2022-12-15 11:45   ` Kieran Bingham
2022-12-16 14:06     ` Dan Scally
2022-12-18 23:28       ` Laurent Pinchart
2022-12-13  8:37 ` Daniel Scally [this message]
2022-12-18 23:28   ` [PATCH 3/6] usb: gadget: uvc: Copy color matching descriptor for each frame Laurent Pinchart
2022-12-19 10:33     ` Dan Scally
2022-12-19 15:52       ` Laurent Pinchart
2022-12-13  8:37 ` [PATCH 4/6] usb: gadget: uvc: Remove the hardcoded default color matching Daniel Scally
2022-12-15 11:48   ` Kieran Bingham
2022-12-16 15:32     ` Dan Scally
2022-12-18 22:52   ` Laurent Pinchart
2022-12-13  8:37 ` [PATCH 5/6] usb: gadget: uvc: Make color matching attributes read/write Daniel Scally
2022-12-15 11:51   ` Kieran Bingham
2022-12-16 15:53     ` Dan Scally
2022-12-18 23:04       ` Laurent Pinchart
2022-12-19  9:21         ` Dan Scally
2022-12-13  8:37 ` [PATCH 6/6] usb: gadget: uvc: Allow creating new color matching descriptors Daniel Scally
2022-12-15 12:00   ` Kieran Bingham
2022-12-15 12:03     ` Dan Scally
2022-12-18 23:17       ` Laurent Pinchart
2022-12-19  9:44         ` Dan Scally
2022-12-19 16:05           ` Laurent Pinchart
2022-12-18 18:12 ` [PATCH 0/6] UVC Gadget: Extend color matching support Laurent Pinchart
2022-12-19  7:30   ` Dan Scally

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221213083736.2284536-4-dan.scally@ideasonboard.com \
    --to=dan.scally@ideasonboard.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=kieran.bingham@ideasonboard.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=m.grzeschik@pengutronix.de \
    --cc=torleiv@huddly.com \
    --cc=w36195@motorola.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox