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

usb: gadget: uvc: Use custom strings if available



If the user has defined a custom string descriptor for the IAD or the
VideoStreaming interfaces then set their index field to point to the
custom descriptor instead of the hardcoded defaults. If no custom
descriptors have been linked to, then use the default ones.

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


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fe625755
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -745,6 +745,10 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
		if (xu->string_descriptor_index)
			xu->desc.iExtension = cdev->usb_strings[xu->string_descriptor_index].id;

	/*
	 * We attach the hard-coded defaults incase the user does not provide
	 * any more appropriate strings through configfs.
	 */
	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));
@@ -752,11 +756,15 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
		ret = PTR_ERR(us);
		goto error;
	}
	uvc_iad.iFunction = us[UVC_STRING_CONTROL_IDX].id;
	uvc_control_intf.iInterface = us[UVC_STRING_CONTROL_IDX].id;
	ret = us[UVC_STRING_STREAMING_IDX].id;
	uvc_streaming_intf_alt0.iInterface = ret;
	uvc_streaming_intf_alt1.iInterface = ret;

	uvc_iad.iFunction = opts->iad_index ? cdev->usb_strings[opts->iad_index].id :
			    us[UVC_STRING_CONTROL_IDX].id;
	uvc_streaming_intf_alt0.iInterface = opts->vs0_index ?
					     cdev->usb_strings[opts->vs0_index].id :
					     us[UVC_STRING_STREAMING_IDX].id;
	uvc_streaming_intf_alt1.iInterface = opts->vs1_index ?
					     cdev->usb_strings[opts->vs1_index].id :
					     us[UVC_STRING_STREAMING_IDX].id;

	/* Allocate interface IDs. */
	if ((ret = usb_interface_id(c, f)) < 0)