Files
kernel_google_redbull/include/uapi/linux/usb/g_uvc.h
Pavankumar Kondeti 4803db7a0a usb: gadget: f_uvc: Fix unbind issues
Currently user space application which has v4l2 file handle has
no way to know that uvc function is unbounded from the composition.
Later when it tries to release the file handle, we end up accessing
stale gadget side data structures.

Address this issue by sending an uevent upon unbind. If the user space
application has subscribed to this uevent, block the unbind until
the last v4l2 file handle is released.

The function drivers which use function activate/deactivate method
to delay enumeration has no way to keep the de-activations count sync
across composition switch. Reset the cdev->deactivations to start
from the fresh when a new composition is selected.

Change-Id: Id389cf8cc59aba6dbeca7c1fb52a990a25c084de
Signed-off-by: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
2022-01-06 02:42:29 -08:00

41 lines
1.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* g_uvc.h -- USB Video Class Gadget driver API
*
* Copyright (C) 2009-2010 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
*/
#ifndef __LINUX_USB_G_UVC_H
#define __LINUX_USB_G_UVC_H
#include <linux/ioctl.h>
#include <linux/types.h>
#include <linux/usb/ch9.h>
#define UVC_EVENT_FIRST (V4L2_EVENT_PRIVATE_START + 0)
#define UVC_EVENT_CONNECT (V4L2_EVENT_PRIVATE_START + 0)
#define UVC_EVENT_DISCONNECT (V4L2_EVENT_PRIVATE_START + 1)
#define UVC_EVENT_STREAMON (V4L2_EVENT_PRIVATE_START + 2)
#define UVC_EVENT_STREAMOFF (V4L2_EVENT_PRIVATE_START + 3)
#define UVC_EVENT_SETUP (V4L2_EVENT_PRIVATE_START + 4)
#define UVC_EVENT_DATA (V4L2_EVENT_PRIVATE_START + 5)
#define UVC_EVENT_UNBIND (V4L2_EVENT_PRIVATE_START + 6)
#define UVC_EVENT_LAST (V4L2_EVENT_PRIVATE_START + 6)
struct uvc_request_data {
__s32 length;
__u8 data[60];
};
struct uvc_event {
union {
enum usb_device_speed speed;
struct usb_ctrlrequest req;
struct uvc_request_data data;
};
};
#define UVCIOC_SEND_RESPONSE _IOW('U', 1, struct uvc_request_data)
#endif /* __LINUX_USB_G_UVC_H */