From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Daniel Scally <dan.scally@ideasonboard.com>
Cc: linux-usb@vger.kernel.org, gregkh@linuxfoundation.org,
w36195@motorola.com, m.grzeschik@pengutronix.de,
kieran.bingham@ideasonboard.com, torleiv@huddly.com
Subject: Re: [PATCH v2 7/7] usb: gadget: uvc: Allow creating new color matching descriptors
Date: Wed, 28 Dec 2022 04:50:01 +0200 [thread overview]
Message-ID: <Y6uu2WboelP1FTFl@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20221219144316.757680-8-dan.scally@ideasonboard.com>
Hi Dan,
Thank you for the patch.
On Mon, Dec 19, 2022 at 02:43:16PM +0000, Daniel Scally wrote:
> Allow users to create new color matching descriptors in addition to
> the default one. These must be associated with a UVC format in order
> to be transmitted to the host, which is achieved by symlinking from
> the format to the newly created color matching descriptor - extend
> the uncompressed and mjpeg formats to support that linking operation.
>
> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
> ---
> Changes in v2:
>
> - New section of the ABI documentation
> - uvcg_format_allow_link() now checks to see if an existing link is
> already there
> - .allow_link() and .drop_link() track color_matching->refcnt
>
> .../ABI/testing/configfs-usb-gadget-uvc | 17 ++++
> drivers/usb/gadget/function/uvc_configfs.c | 99 ++++++++++++++++++-
> 2 files changed, 114 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/ABI/testing/configfs-usb-gadget-uvc b/Documentation/ABI/testing/configfs-usb-gadget-uvc
> index 53258b7c6f2d..e7753b2cb11b 100644
> --- a/Documentation/ABI/testing/configfs-usb-gadget-uvc
> +++ b/Documentation/ABI/testing/configfs-usb-gadget-uvc
> @@ -177,6 +177,23 @@ Description: Default color matching descriptors
> white
> ======================== ======================================
>
> +What: /config/usb-gadget/gadget/functions/uvc.name/streaming/color_matching/name
> +Date: Dec 2022
> +KernelVersion: 6.3
> +Description: Additional color matching descriptors
> +
> + All attributes read/write:
> +
> + ======================== ======================================
> + bMatrixCoefficients matrix used to compute luma and
> + chroma values from the color primaries
> + bTransferCharacteristics optoelectronic transfer
> + characteristic of the source picture,
> + also called the gamma function
> + bColorPrimaries color primaries and the reference
> + white
> + ======================== ======================================
> +
Should the link also be documented somewhere ?
> What: /config/usb-gadget/gadget/functions/uvc.name/streaming/mjpeg
> Date: Dec 2014
> KernelVersion: 4.0
> diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
> index ef5d75942f24..3be6ca936851 100644
> --- a/drivers/usb/gadget/function/uvc_configfs.c
> +++ b/drivers/usb/gadget/function/uvc_configfs.c
> @@ -771,6 +771,77 @@ uvcg_format_get_default_color_match(struct config_item *streaming)
> return color_match;
> }
>
> +static int uvcg_format_allow_link(struct config_item *src, struct config_item *tgt)
> +{
> + struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
> + struct uvcg_color_matching *color_matching_desc;
> + struct config_item *streaming, *color_matching;
> + struct uvcg_format *fmt;
> + int ret = 0;
> +
> + mutex_lock(su_mutex);
> +
> + streaming = src->ci_parent->ci_parent;
> + color_matching = config_group_find_item(to_config_group(streaming), "color_matching");
> + if (!color_matching || color_matching != tgt->ci_parent) {
> + ret = -EINVAL;
> + goto out_put_cm;
> + }
> +
> + fmt = to_uvcg_format(src);
It's been a long time since I worked with configfs, so I may be wrong,
but shouldn't we check the name of the source here to make sure it's
equal to "color_matching" ? Or do you want to allow the user to name the
source freely ? That would be a bit confusing I think.
> +
> + /*
> + * There's always a color matching descriptor associated with the format
> + * but without a symlink it should only ever be the default one. If it's
> + * not the default, there's already a symlink and we should bail out.
> + */
> + color_matching_desc = uvcg_format_get_default_color_match(streaming);
> + if (fmt->color_matching != color_matching_desc) {
If you check the source link name, I suppose this could be dropped. Then
you coud just write
fmt->color_matching->refcnt--;
and avoid the call to uvcg_format_get_default_color_match().
> + ret = -EBUSY;
> + goto out_put_cm;
> + }
> +
> + color_matching_desc->refcnt--;
> +
> + color_matching_desc = to_uvcg_color_matching(to_config_group(tgt));
> + fmt->color_matching = color_matching_desc;
> + color_matching_desc->refcnt++;
And this could become
fmt->color_matching = to_uvcg_color_matching(to_config_group(tgt));
fmt->color_matching->refcnt++;
> +
> +out_put_cm:
> + config_item_put(color_matching);
> + mutex_unlock(su_mutex);
> +
> + return ret;
> +}
> +
> +static void uvcg_format_drop_link(struct config_item *src, struct config_item *tgt)
> +{
> + struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
> + struct uvcg_color_matching *color_matching_desc;
> + struct config_item *streaming;
> + struct uvcg_format *fmt;
> +
> + mutex_lock(su_mutex);
> +
> + color_matching_desc = to_uvcg_color_matching(to_config_group(tgt));
> + color_matching_desc->refcnt--;
> +
> + streaming = src->ci_parent->ci_parent;
> + color_matching_desc = uvcg_format_get_default_color_match(streaming);
> +
> + fmt = to_uvcg_format(src);
> + fmt->color_matching = color_matching_desc;
> + color_matching_desc->refcnt++;
fmt->color_matching = uvcg_format_get_default_color_match(streaming);
fmt->color_matching->refcnt++;
although if you increase the refcnt in
uvcg_format_get_default_color_match() as I proposed in a previous patch
in this series, this would just be
fmt->color_matching = uvcg_format_get_default_color_match(streaming);
> +
> + mutex_unlock(su_mutex);
> +}
> +
> +static struct configfs_item_operations uvcg_format_item_operations = {
> + .release = uvcg_config_item_release,
> + .allow_link = uvcg_format_allow_link,
> + .drop_link = uvcg_format_drop_link,
> +};
> +
> static ssize_t uvcg_format_bma_controls_show(struct uvcg_format *f, char *page)
> {
> struct f_uvc_opts *opts;
> @@ -1571,7 +1642,7 @@ static struct configfs_attribute *uvcg_uncompressed_attrs[] = {
> };
>
> static const struct config_item_type uvcg_uncompressed_type = {
> - .ct_item_ops = &uvcg_config_item_ops,
> + .ct_item_ops = &uvcg_format_item_operations,
> .ct_group_ops = &uvcg_uncompressed_group_ops,
> .ct_attrs = uvcg_uncompressed_attrs,
> .ct_owner = THIS_MODULE,
> @@ -1767,7 +1838,7 @@ static struct configfs_attribute *uvcg_mjpeg_attrs[] = {
> };
>
> static const struct config_item_type uvcg_mjpeg_type = {
> - .ct_item_ops = &uvcg_config_item_ops,
> + .ct_item_ops = &uvcg_format_item_operations,
> .ct_group_ops = &uvcg_mjpeg_group_ops,
> .ct_attrs = uvcg_mjpeg_attrs,
> .ct_owner = THIS_MODULE,
> @@ -1922,6 +1993,29 @@ static const struct config_item_type uvcg_color_matching_type = {
> * streaming/color_matching
> */
>
> +static struct config_group *uvcg_color_matching_make(struct config_group *group,
> + const char *name)
> +{
> + struct uvcg_color_matching *color_match;
> +
> + color_match = kzalloc(sizeof(*color_match), GFP_KERNEL);
> + if (!color_match)
> + return ERR_PTR(-ENOMEM);
> +
> + color_match->desc.bLength = UVC_DT_COLOR_MATCHING_SIZE;
> + color_match->desc.bDescriptorType = USB_DT_CS_INTERFACE;
> + color_match->desc.bDescriptorSubType = UVC_VS_COLORFORMAT;
> +
> + config_group_init_type_name(&color_match->group, name,
> + &uvcg_color_matching_type);
> +
> + return &color_match->group;
> +}
> +
> +static struct configfs_group_operations uvcg_color_matching_grp_group_ops = {
> + .make_group = uvcg_color_matching_make,
> +};
> +
> static int uvcg_color_matching_create_children(struct config_group *parent)
> {
> struct uvcg_color_matching *color_match;
> @@ -1947,6 +2041,7 @@ static int uvcg_color_matching_create_children(struct config_group *parent)
> static const struct uvcg_config_group_type uvcg_color_matching_grp_type = {
> .type = {
> .ct_item_ops = &uvcg_config_item_ops,
> + .ct_group_ops = &uvcg_color_matching_grp_group_ops,
> .ct_owner = THIS_MODULE,
> },
> .name = "color_matching",
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2022-12-28 2:50 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-19 14:43 [PATCH v2 0/7] UVC Gadget: Extend color matching support Daniel Scally
2022-12-19 14:43 ` [PATCH v2 1/7] usb: gadget: usb: Remove "default" from color matching attributes Daniel Scally
2022-12-19 14:43 ` [PATCH v2 2/7] usb: uvc: Enumerate valid values for color matching Daniel Scally
2022-12-19 14:45 ` Dan Scally
2022-12-28 2:14 ` Laurent Pinchart
2022-12-19 14:43 ` [PATCH v2 3/7] usb: gadget: uvc: Add struct for color matching in configs Daniel Scally
2022-12-28 2:19 ` Laurent Pinchart
2022-12-19 14:43 ` [PATCH v2 4/7] usb: gadget: uvc: Copy color matching descriptor for each frame Daniel Scally
2022-12-28 2:33 ` Laurent Pinchart
2023-01-30 12:01 ` Dan Scally
2023-01-30 12:20 ` Dan Scally
2022-12-19 14:43 ` [PATCH v2 5/7] usb: gadget: uvc: Remove the hardcoded default color matching Daniel Scally
2022-12-19 14:43 ` [PATCH v2 6/7] usb: gadget: uvc: Make color matching attributes read/write Daniel Scally
2022-12-28 2:35 ` Laurent Pinchart
2022-12-19 14:43 ` [PATCH v2 7/7] usb: gadget: uvc: Allow creating new color matching descriptors Daniel Scally
2022-12-28 2:50 ` Laurent Pinchart [this message]
2023-01-01 20:55 ` Dan Scally
2023-01-02 10:50 ` Laurent Pinchart
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=Y6uu2WboelP1FTFl@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=dan.scally@ideasonboard.com \
--cc=gregkh@linuxfoundation.org \
--cc=kieran.bingham@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;
as well as URLs for NNTP newsgroup(s).