cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gspca.h (7700B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef GSPCAV2_H
      3#define GSPCAV2_H
      4
      5#include <linux/module.h>
      6#include <linux/kernel.h>
      7#include <linux/usb.h>
      8#include <linux/videodev2.h>
      9#include <media/v4l2-common.h>
     10#include <media/v4l2-ctrls.h>
     11#include <media/v4l2-device.h>
     12#include <media/videobuf2-v4l2.h>
     13#include <media/videobuf2-vmalloc.h>
     14#include <linux/mutex.h>
     15
     16
     17
     18/* GSPCA debug codes */
     19
     20#define D_PROBE  1
     21#define D_CONF   2
     22#define D_STREAM 3
     23#define D_FRAM   4
     24#define D_PACK   5
     25#define D_USBI   6
     26#define D_USBO   7
     27
     28extern int gspca_debug;
     29
     30
     31#define gspca_dbg(gspca_dev, level, fmt, ...)			\
     32	v4l2_dbg(level, gspca_debug, &(gspca_dev)->v4l2_dev,	\
     33		 fmt, ##__VA_ARGS__)
     34
     35#define gspca_err(gspca_dev, fmt, ...)				\
     36	v4l2_err(&(gspca_dev)->v4l2_dev, fmt, ##__VA_ARGS__)
     37
     38#define GSPCA_MAX_FRAMES 16	/* maximum number of video frame buffers */
     39/* image transfers */
     40#define MAX_NURBS 4		/* max number of URBs */
     41
     42
     43/* used to list framerates supported by a camera mode (resolution) */
     44struct framerates {
     45	const u8 *rates;
     46	int nrates;
     47};
     48
     49/* device information - set at probe time */
     50struct cam {
     51	const struct v4l2_pix_format *cam_mode;	/* size nmodes */
     52	const struct framerates *mode_framerates; /* must have size nmodes,
     53						   * just like cam_mode */
     54	u32 bulk_size;		/* buffer size when image transfer by bulk */
     55	u32 input_flags;	/* value for ENUM_INPUT status flags */
     56	u8 nmodes;		/* size of cam_mode */
     57	u8 no_urb_create;	/* don't create transfer URBs */
     58	u8 bulk_nurbs;		/* number of URBs in bulk mode
     59				 * - cannot be > MAX_NURBS
     60				 * - when 0 and bulk_size != 0 means
     61				 *   1 URB and submit done by subdriver */
     62	u8 bulk;		/* image transfer by 0:isoc / 1:bulk */
     63	u8 npkt;		/* number of packets in an ISOC message
     64				 * 0 is the default value: 32 packets */
     65	u8 needs_full_bandwidth;/* Set this flag to notify the bandwidth calc.
     66				 * code that the cam fills all image buffers to
     67				 * the max, even when using compression. */
     68};
     69
     70struct gspca_dev;
     71struct gspca_frame;
     72
     73/* subdriver operations */
     74typedef int (*cam_op) (struct gspca_dev *);
     75typedef void (*cam_v_op) (struct gspca_dev *);
     76typedef int (*cam_cf_op) (struct gspca_dev *, const struct usb_device_id *);
     77typedef int (*cam_get_jpg_op) (struct gspca_dev *,
     78				struct v4l2_jpegcompression *);
     79typedef int (*cam_set_jpg_op) (struct gspca_dev *,
     80				const struct v4l2_jpegcompression *);
     81typedef int (*cam_get_reg_op) (struct gspca_dev *,
     82				struct v4l2_dbg_register *);
     83typedef int (*cam_set_reg_op) (struct gspca_dev *,
     84				const struct v4l2_dbg_register *);
     85typedef int (*cam_chip_info_op) (struct gspca_dev *,
     86				struct v4l2_dbg_chip_info *);
     87typedef void (*cam_streamparm_op) (struct gspca_dev *,
     88				  struct v4l2_streamparm *);
     89typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
     90				u8 *data,
     91				int len);
     92typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev,
     93				u8 *data,
     94				int len);
     95typedef void (*cam_format_op) (struct gspca_dev *gspca_dev,
     96				struct v4l2_format *fmt);
     97typedef int (*cam_frmsize_op) (struct gspca_dev *gspca_dev,
     98				struct v4l2_frmsizeenum *fsize);
     99
    100/* subdriver description */
    101struct sd_desc {
    102/* information */
    103	const char *name;	/* sub-driver name */
    104/* mandatory operations */
    105	cam_cf_op config;	/* called on probe */
    106	cam_op init;		/* called on probe and resume */
    107	cam_op init_controls;	/* called on probe */
    108	cam_v_op probe_error;	/* called if probe failed, do cleanup here */
    109	cam_op start;		/* called on stream on after URBs creation */
    110	cam_pkt_op pkt_scan;
    111/* optional operations */
    112	cam_op isoc_init;	/* called on stream on before getting the EP */
    113	cam_op isoc_nego;	/* called when URB submit failed with NOSPC */
    114	cam_v_op stopN;		/* called on stream off - main alt */
    115	cam_v_op stop0;		/* called on stream off & disconnect - alt 0 */
    116	cam_v_op dq_callback;	/* called when a frame has been dequeued */
    117	cam_get_jpg_op get_jcomp;
    118	cam_set_jpg_op set_jcomp;
    119	cam_streamparm_op get_streamparm;
    120	cam_streamparm_op set_streamparm;
    121	cam_format_op try_fmt;
    122	cam_frmsize_op enum_framesizes;
    123#ifdef CONFIG_VIDEO_ADV_DEBUG
    124	cam_set_reg_op set_register;
    125	cam_get_reg_op get_register;
    126	cam_chip_info_op get_chip_info;
    127#endif
    128#if IS_ENABLED(CONFIG_INPUT)
    129	cam_int_pkt_op int_pkt_scan;
    130	/* other_input makes the gspca core create gspca_dev->input even when
    131	   int_pkt_scan is NULL, for cams with non interrupt driven buttons */
    132	u8 other_input;
    133#endif
    134};
    135
    136/* packet types when moving from iso buf to frame buf */
    137enum gspca_packet_type {
    138	DISCARD_PACKET,
    139	FIRST_PACKET,
    140	INTER_PACKET,
    141	LAST_PACKET
    142};
    143
    144struct gspca_buffer {
    145	struct vb2_v4l2_buffer vb;
    146	struct list_head list;
    147};
    148
    149static inline struct gspca_buffer *to_gspca_buffer(struct vb2_buffer *vb2)
    150{
    151	return container_of(vb2, struct gspca_buffer, vb.vb2_buf);
    152}
    153
    154struct gspca_dev {
    155	struct video_device vdev;	/* !! must be the first item */
    156	struct module *module;		/* subdriver handling the device */
    157	struct v4l2_device v4l2_dev;
    158	struct usb_device *dev;
    159
    160#if IS_ENABLED(CONFIG_INPUT)
    161	struct input_dev *input_dev;
    162	char phys[64];			/* physical device path */
    163#endif
    164
    165	struct cam cam;				/* device information */
    166	const struct sd_desc *sd_desc;		/* subdriver description */
    167	struct v4l2_ctrl_handler ctrl_handler;
    168
    169	/* autogain and exposure or gain control cluster, these are global as
    170	   the autogain/exposure functions in autogain_functions.c use them */
    171	struct {
    172		struct v4l2_ctrl *autogain;
    173		struct v4l2_ctrl *exposure;
    174		struct v4l2_ctrl *gain;
    175		int exp_too_low_cnt, exp_too_high_cnt;
    176	};
    177
    178#define USB_BUF_SZ 64
    179	__u8 *usb_buf;				/* buffer for USB exchanges */
    180	struct urb *urb[MAX_NURBS];
    181#if IS_ENABLED(CONFIG_INPUT)
    182	struct urb *int_urb;
    183#endif
    184
    185	u8 *image;				/* image being filled */
    186	u32 image_len;				/* current length of image */
    187	__u8 last_packet_type;
    188	__s8 empty_packet;		/* if (-1) don't check empty packets */
    189	bool streaming;
    190
    191	__u8 curr_mode;			/* current camera mode */
    192	struct v4l2_pix_format pixfmt;	/* current mode parameters */
    193	__u32 sequence;			/* frame sequence number */
    194
    195	struct vb2_queue queue;
    196
    197	spinlock_t qlock;
    198	struct list_head buf_list;
    199
    200	wait_queue_head_t wq;		/* wait queue */
    201	struct mutex usb_lock;		/* usb exchange protection */
    202	int usb_err;			/* USB error - protected by usb_lock */
    203	u16 pkt_size;			/* ISOC packet size */
    204#ifdef CONFIG_PM
    205	char frozen;			/* suspend - resume */
    206#endif
    207	bool present;
    208	char memory;			/* memory type (V4L2_MEMORY_xxx) */
    209	__u8 iface;			/* USB interface number */
    210	__u8 alt;			/* USB alternate setting */
    211	int xfer_ep;			/* USB transfer endpoint address */
    212	u8 audio;			/* presence of audio device */
    213
    214	/* (*) These variables are proteced by both usb_lock and queue_lock,
    215	   that is any code setting them is holding *both*, which means that
    216	   any code getting them needs to hold at least one of them */
    217};
    218
    219int gspca_dev_probe(struct usb_interface *intf,
    220		const struct usb_device_id *id,
    221		const struct sd_desc *sd_desc,
    222		int dev_size,
    223		struct module *module);
    224int gspca_dev_probe2(struct usb_interface *intf,
    225		const struct usb_device_id *id,
    226		const struct sd_desc *sd_desc,
    227		int dev_size,
    228		struct module *module);
    229void gspca_disconnect(struct usb_interface *intf);
    230void gspca_frame_add(struct gspca_dev *gspca_dev,
    231			enum gspca_packet_type packet_type,
    232			const u8 *data,
    233			int len);
    234#ifdef CONFIG_PM
    235int gspca_suspend(struct usb_interface *intf, pm_message_t message);
    236int gspca_resume(struct usb_interface *intf);
    237#endif
    238int gspca_expo_autogain(struct gspca_dev *gspca_dev, int avg_lum,
    239	int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee);
    240int gspca_coarse_grained_expo_autogain(struct gspca_dev *gspca_dev,
    241	int avg_lum, int desired_avg_lum, int deadzone);
    242
    243#endif /* GSPCAV2_H */