Commit 9963f744 authored by Daniel Scally's avatar Daniel Scally Committed by Greg Kroah-Hartman
Browse files

usb: gadget: uvc: Pick up custom string descriptor IDs



If any custom string descriptors have been linked to from the
extension unit, pick up the string ID that was returned when
the strings were attached to the composite dev and use it to
set the iExtension field of the Extension Unit Descriptor.

Signed-off-by: default avatarDaniel Scally <dan.scally@ideasonboard.com>
Link: https://lore.kernel.org/r/20230206161802.892954-10-dan.scally@ideasonboard.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 08ddd71b
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -644,6 +644,7 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
{
	struct usb_composite_dev *cdev = c->cdev;
	struct uvc_device *uvc = to_uvc(f);
	struct uvcg_extension *xu;
	struct usb_string *us;
	unsigned int max_packet_mult;
	unsigned int max_packet_size;
@@ -736,6 +737,14 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
	uvc_hs_streaming_ep.bEndpointAddress = uvc->video.ep->address;
	uvc_ss_streaming_ep.bEndpointAddress = uvc->video.ep->address;

	/*
	 * XUs can have an arbitrary string descriptor describing them. If they
	 * have one pick up the ID.
	 */
	list_for_each_entry(xu, &opts->extension_units, list)
		if (xu->string_descriptor_index)
			xu->desc.iExtension = cdev->usb_strings[xu->string_descriptor_index].id;

	uvc_en_us_strings[UVC_STRING_CONTROL_IDX].s = opts->function_name;
	us = usb_gstrings_attach(cdev, uvc_function_strings,
				 ARRAY_SIZE(uvc_en_us_strings));