UPSTREAM: usb: gadget: uvc: default the ctrl request interface offsets
For the userspace it is needed to distinguish between requests for the control or streaming interface. The userspace would have to parse the configfs to know which interface index it has to compare the ctrl requests against. Since the interface numbers are not fixed, e.g. for composite gadgets, the interface offset depends on the setup. The kernel has this information when handing over the ctrl request to the userspace. This patch removes the offset from the interface numbers and expose the default interface defines in the uapi g_uvc.h. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Link: https://lore.kernel.org/r/20221011075348.1786897-1-m.grzeschik@pengutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit d182bf156c4cb8b08ce4a75e82b3357b14a4382d) Bug: 259171206 Change-Id: Ie5978ef268731e67ca72940ce6fbc7f980cb4419 Signed-off-by: Avichal Rakesh <arakesh@google.com> (cherry picked from commit 044c3865c6cdd5ae9e10e7c39ceea726e568a884)
This commit is contained in:
parent
b7d8bdc3bf
commit
4485bb8ca7
@ -39,9 +39,6 @@ MODULE_PARM_DESC(trace, "Trace level bitmask");
|
||||
|
||||
/* string IDs are assigned dynamically */
|
||||
|
||||
#define UVC_STRING_CONTROL_IDX 0
|
||||
#define UVC_STRING_STREAMING_IDX 1
|
||||
|
||||
static struct usb_string uvc_en_us_strings[] = {
|
||||
/* [UVC_STRING_CONTROL_IDX].s = DYNAMIC, */
|
||||
[UVC_STRING_STREAMING_IDX].s = "Video Streaming",
|
||||
@ -229,6 +226,8 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
|
||||
struct uvc_device *uvc = to_uvc(f);
|
||||
struct v4l2_event v4l2_event;
|
||||
struct uvc_event *uvc_event = (void *)&v4l2_event.u.data;
|
||||
unsigned int interface = le16_to_cpu(ctrl->wIndex) & 0xff;
|
||||
struct usb_ctrlrequest *mctrl;
|
||||
|
||||
if ((ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) {
|
||||
uvcg_info(f, "invalid request type\n");
|
||||
@ -249,6 +248,16 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
|
||||
memset(&v4l2_event, 0, sizeof(v4l2_event));
|
||||
v4l2_event.type = UVC_EVENT_SETUP;
|
||||
memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req));
|
||||
|
||||
/* check for the interface number, fixup the interface number in
|
||||
* the ctrl request so the userspace doesn't have to bother with
|
||||
* offset and configfs parsing
|
||||
*/
|
||||
mctrl = &uvc_event->req;
|
||||
mctrl->wIndex &= ~cpu_to_le16(0xff);
|
||||
if (interface == uvc->streaming_intf)
|
||||
mctrl->wIndex = cpu_to_le16(UVC_STRING_STREAMING_IDX);
|
||||
|
||||
v4l2_event_queue(&uvc->vdev, &v4l2_event);
|
||||
|
||||
return 0;
|
||||
|
@ -21,6 +21,9 @@
|
||||
#define UVC_EVENT_DATA (V4L2_EVENT_PRIVATE_START + 5)
|
||||
#define UVC_EVENT_LAST (V4L2_EVENT_PRIVATE_START + 5)
|
||||
|
||||
#define UVC_STRING_CONTROL_IDX 0
|
||||
#define UVC_STRING_STREAMING_IDX 1
|
||||
|
||||
struct uvc_request_data {
|
||||
__s32 length;
|
||||
__u8 data[60];
|
||||
|
Loading…
Reference in New Issue
Block a user