Here is the "big" set of USB and Thunderbolt driver changes for 5.18-rc1. For the most part it's been a quiet development cycle for the USB core, but there are the usual "hot spots" of development activity. Included in here are: - Thunderbolt driver updates: - fixes for devices without displayport adapters - lane bonding support and improvements - other minor changes based on device testing - dwc3 gadget driver changes. It seems this driver will never be finished given that the IP core is showing up in zillions of new devices and each implementation decides to do something different with it... - uvc gadget driver updates as more devices start to use and rely on this hardware as well - usb_maxpacket() api changes to remove an unneeded and unused parameter. - usb-serial driver device id updates and small cleanups - typec cleanups and fixes based on device testing - device tree updates for usb properties - lots of other small fixes and driver updates. All of these have been in linux-next for weeks with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYpnZGw8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymQhwCeLVANsQjBcL4ys4skl+1In17y28gAn3rEZ7rQ Yv4uP9zadUqg3Cx0vjgf =3s5s -----END PGP SIGNATURE----- Merge tag 'usb-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB / Thunderbolt updates from Greg KH: "Here is the "big" set of USB and Thunderbolt driver changes for 5.18-rc1. For the most part it's been a quiet development cycle for the USB core, but there are the usual "hot spots" of development activity. Included in here are: - Thunderbolt driver updates: - fixes for devices without displayport adapters - lane bonding support and improvements - other minor changes based on device testing - dwc3 gadget driver changes. It seems this driver will never be finished given that the IP core is showing up in zillions of new devices and each implementation decides to do something different with it... - uvc gadget driver updates as more devices start to use and rely on this hardware as well - usb_maxpacket() api changes to remove an unneeded and unused parameter. - usb-serial driver device id updates and small cleanups - typec cleanups and fixes based on device testing - device tree updates for usb properties - lots of other small fixes and driver updates. All of these have been in linux-next for weeks with no reported problems" * tag 'usb-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (154 commits) USB: new quirk for Dell Gen 2 devices usb: dwc3: core: Add error log when core soft reset failed usb: dwc3: gadget: Move null pinter check to proper place usb: hub: Simplify error and success path in port_over_current_notify usb: cdns3: allocate TX FIFO size according to composite EP number usb: dwc3: Fix ep0 handling when getting reset while doing control transfer usb: Probe EHCI, OHCI controllers asynchronously usb: isp1760: Fix out-of-bounds array access xhci: Don't defer primary roothub registration if there is only one roothub USB: serial: option: add Quectel BG95 modem USB: serial: pl2303: fix type detection for odd device xhci: Allow host runtime PM as default for Intel Alder Lake N xHCI xhci: Remove quirk for over 10 year old evaluation hardware xhci: prevent U2 link power state if Intel tier policy prevented U1 xhci: use generic command timer for stop endpoint commands. usb: host: xhci-plat: omit shared hcd if either root hub has no ports usb: host: xhci-plat: prepare operation w/o shared hcd usb: host: xhci-plat: create shared hcd after having added main hcd xhci: prepare for operation w/o shared hcd xhci: factor out parts of xhci_gen_setup() ...
181 lines
4.4 KiB
C
181 lines
4.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* uvc_gadget.h -- USB Video Class Gadget driver
|
|
*
|
|
* Copyright (C) 2009-2010
|
|
* Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
|
*/
|
|
|
|
#ifndef _UVC_GADGET_H_
|
|
#define _UVC_GADGET_H_
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/usb/composite.h>
|
|
#include <linux/videodev2.h>
|
|
#include <linux/wait.h>
|
|
|
|
#include <media/v4l2-device.h>
|
|
#include <media/v4l2-dev.h>
|
|
#include <media/v4l2-fh.h>
|
|
|
|
#include "uvc_queue.h"
|
|
|
|
struct usb_ep;
|
|
struct usb_request;
|
|
struct uvc_descriptor_header;
|
|
struct uvc_device;
|
|
|
|
/* ------------------------------------------------------------------------
|
|
* Debugging, printing and logging
|
|
*/
|
|
|
|
#define UVC_TRACE_PROBE (1 << 0)
|
|
#define UVC_TRACE_DESCR (1 << 1)
|
|
#define UVC_TRACE_CONTROL (1 << 2)
|
|
#define UVC_TRACE_FORMAT (1 << 3)
|
|
#define UVC_TRACE_CAPTURE (1 << 4)
|
|
#define UVC_TRACE_CALLS (1 << 5)
|
|
#define UVC_TRACE_IOCTL (1 << 6)
|
|
#define UVC_TRACE_FRAME (1 << 7)
|
|
#define UVC_TRACE_SUSPEND (1 << 8)
|
|
#define UVC_TRACE_STATUS (1 << 9)
|
|
|
|
#define UVC_WARN_MINMAX 0
|
|
#define UVC_WARN_PROBE_DEF 1
|
|
|
|
extern unsigned int uvc_gadget_trace_param;
|
|
|
|
#define uvc_trace(flag, msg...) \
|
|
do { \
|
|
if (uvc_gadget_trace_param & flag) \
|
|
printk(KERN_DEBUG "uvcvideo: " msg); \
|
|
} while (0)
|
|
|
|
#define uvcg_dbg(f, fmt, args...) \
|
|
dev_dbg(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args)
|
|
#define uvcg_info(f, fmt, args...) \
|
|
dev_info(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args)
|
|
#define uvcg_warn(f, fmt, args...) \
|
|
dev_warn(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args)
|
|
#define uvcg_err(f, fmt, args...) \
|
|
dev_err(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args)
|
|
|
|
/* ------------------------------------------------------------------------
|
|
* Driver specific constants
|
|
*/
|
|
|
|
#define UVC_MAX_REQUEST_SIZE 64
|
|
#define UVC_MAX_EVENTS 4
|
|
|
|
#define UVCG_REQUEST_HEADER_LEN 12
|
|
|
|
/* ------------------------------------------------------------------------
|
|
* Structures
|
|
*/
|
|
struct uvc_request {
|
|
struct usb_request *req;
|
|
u8 *req_buffer;
|
|
struct uvc_video *video;
|
|
struct sg_table sgt;
|
|
u8 header[UVCG_REQUEST_HEADER_LEN];
|
|
struct uvc_buffer *last_buf;
|
|
};
|
|
|
|
struct uvc_video {
|
|
struct uvc_device *uvc;
|
|
struct usb_ep *ep;
|
|
|
|
struct work_struct pump;
|
|
|
|
/* Frame parameters */
|
|
u8 bpp;
|
|
u32 fcc;
|
|
unsigned int width;
|
|
unsigned int height;
|
|
unsigned int imagesize;
|
|
struct mutex mutex; /* protects frame parameters */
|
|
|
|
unsigned int uvc_num_requests;
|
|
|
|
/* Requests */
|
|
unsigned int req_size;
|
|
struct uvc_request *ureq;
|
|
struct list_head req_free;
|
|
spinlock_t req_lock;
|
|
|
|
unsigned int req_int_count;
|
|
|
|
void (*encode) (struct usb_request *req, struct uvc_video *video,
|
|
struct uvc_buffer *buf);
|
|
|
|
/* Context data used by the completion handler */
|
|
__u32 payload_size;
|
|
__u32 max_payload_size;
|
|
|
|
struct uvc_video_queue queue;
|
|
unsigned int fid;
|
|
};
|
|
|
|
enum uvc_state {
|
|
UVC_STATE_DISCONNECTED,
|
|
UVC_STATE_CONNECTED,
|
|
UVC_STATE_STREAMING,
|
|
};
|
|
|
|
struct uvc_device {
|
|
struct video_device vdev;
|
|
struct v4l2_device v4l2_dev;
|
|
enum uvc_state state;
|
|
struct usb_function func;
|
|
struct uvc_video video;
|
|
bool func_connected;
|
|
wait_queue_head_t func_connected_queue;
|
|
|
|
/* Descriptors */
|
|
struct {
|
|
const struct uvc_descriptor_header * const *fs_control;
|
|
const struct uvc_descriptor_header * const *ss_control;
|
|
const struct uvc_descriptor_header * const *fs_streaming;
|
|
const struct uvc_descriptor_header * const *hs_streaming;
|
|
const struct uvc_descriptor_header * const *ss_streaming;
|
|
} desc;
|
|
|
|
unsigned int control_intf;
|
|
struct usb_ep *control_ep;
|
|
struct usb_request *control_req;
|
|
void *control_buf;
|
|
|
|
unsigned int streaming_intf;
|
|
|
|
/* Events */
|
|
unsigned int event_length;
|
|
unsigned int event_setup_out : 1;
|
|
};
|
|
|
|
static inline struct uvc_device *to_uvc(struct usb_function *f)
|
|
{
|
|
return container_of(f, struct uvc_device, func);
|
|
}
|
|
|
|
struct uvc_file_handle {
|
|
struct v4l2_fh vfh;
|
|
struct uvc_video *device;
|
|
bool is_uvc_app_handle;
|
|
};
|
|
|
|
#define to_uvc_file_handle(handle) \
|
|
container_of(handle, struct uvc_file_handle, vfh)
|
|
|
|
/* ------------------------------------------------------------------------
|
|
* Functions
|
|
*/
|
|
|
|
extern void uvc_function_setup_continue(struct uvc_device *uvc);
|
|
extern void uvc_endpoint_stream(struct uvc_device *dev);
|
|
|
|
extern void uvc_function_connect(struct uvc_device *uvc);
|
|
extern void uvc_function_disconnect(struct uvc_device *uvc);
|
|
|
|
#endif /* _UVC_GADGET_H_ */
|