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

zr364xx.c (41953B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Zoran 364xx based USB webcam module version 0.73
      4 *
      5 * Allows you to use your USB webcam with V4L2 applications
      6 * This is still in heavy development !
      7 *
      8 * Copyright (C) 2004  Antoine Jacquet <royale@zerezo.com>
      9 * http://royale.zerezo.com/zr364xx/
     10 *
     11 * Heavily inspired by usb-skeleton.c, vicam.c, cpia.c and spca50x.c drivers
     12 * V4L2 version inspired by meye.c driver
     13 *
     14 * Some video buffer code by Lamarque based on s2255drv.c and vivi.c drivers.
     15 */
     16
     17
     18#include <linux/module.h>
     19#include <linux/init.h>
     20#include <linux/usb.h>
     21#include <linux/vmalloc.h>
     22#include <linux/slab.h>
     23#include <linux/highmem.h>
     24#include <media/v4l2-common.h>
     25#include <media/v4l2-ioctl.h>
     26#include <media/v4l2-device.h>
     27#include <media/v4l2-ctrls.h>
     28#include <media/v4l2-fh.h>
     29#include <media/v4l2-event.h>
     30#include <media/videobuf-vmalloc.h>
     31
     32
     33/* Version Information */
     34#define DRIVER_VERSION "0.7.4"
     35#define DRIVER_AUTHOR "Antoine Jacquet, http://royale.zerezo.com/"
     36#define DRIVER_DESC "Zoran 364xx"
     37
     38
     39/* Camera */
     40#define FRAMES 1
     41#define MAX_FRAME_SIZE 200000
     42#define BUFFER_SIZE 0x1000
     43#define CTRL_TIMEOUT 500
     44
     45#define ZR364XX_DEF_BUFS	4
     46#define ZR364XX_READ_IDLE	0
     47#define ZR364XX_READ_FRAME	1
     48
     49/* Debug macro */
     50#define DBG(fmt, args...) \
     51	do { \
     52		if (debug) { \
     53			printk(KERN_INFO KBUILD_MODNAME " " fmt, ##args); \
     54		} \
     55	} while (0)
     56
     57/*#define FULL_DEBUG 1*/
     58#ifdef FULL_DEBUG
     59#define _DBG DBG
     60#else
     61#define _DBG(fmt, args...)
     62#endif
     63
     64/* Init methods, need to find nicer names for these
     65 * the exact names of the chipsets would be the best if someone finds it */
     66#define METHOD0 0
     67#define METHOD1 1
     68#define METHOD2 2
     69#define METHOD3 3
     70
     71
     72/* Module parameters */
     73static int debug;
     74static int mode;
     75
     76
     77/* Module parameters interface */
     78module_param(debug, int, 0644);
     79MODULE_PARM_DESC(debug, "Debug level");
     80module_param(mode, int, 0644);
     81MODULE_PARM_DESC(mode, "0 = 320x240, 1 = 160x120, 2 = 640x480");
     82
     83
     84/* Devices supported by this driver
     85 * .driver_info contains the init method used by the camera */
     86static const struct usb_device_id device_table[] = {
     87	{USB_DEVICE(0x08ca, 0x0109), .driver_info = METHOD0 },
     88	{USB_DEVICE(0x041e, 0x4024), .driver_info = METHOD0 },
     89	{USB_DEVICE(0x0d64, 0x0108), .driver_info = METHOD0 },
     90	{USB_DEVICE(0x0546, 0x3187), .driver_info = METHOD0 },
     91	{USB_DEVICE(0x0d64, 0x3108), .driver_info = METHOD0 },
     92	{USB_DEVICE(0x0595, 0x4343), .driver_info = METHOD0 },
     93	{USB_DEVICE(0x0bb0, 0x500d), .driver_info = METHOD0 },
     94	{USB_DEVICE(0x0feb, 0x2004), .driver_info = METHOD0 },
     95	{USB_DEVICE(0x055f, 0xb500), .driver_info = METHOD0 },
     96	{USB_DEVICE(0x08ca, 0x2062), .driver_info = METHOD2 },
     97	{USB_DEVICE(0x052b, 0x1a18), .driver_info = METHOD1 },
     98	{USB_DEVICE(0x04c8, 0x0729), .driver_info = METHOD0 },
     99	{USB_DEVICE(0x04f2, 0xa208), .driver_info = METHOD0 },
    100	{USB_DEVICE(0x0784, 0x0040), .driver_info = METHOD1 },
    101	{USB_DEVICE(0x06d6, 0x0034), .driver_info = METHOD0 },
    102	{USB_DEVICE(0x0a17, 0x0062), .driver_info = METHOD2 },
    103	{USB_DEVICE(0x06d6, 0x003b), .driver_info = METHOD0 },
    104	{USB_DEVICE(0x0a17, 0x004e), .driver_info = METHOD2 },
    105	{USB_DEVICE(0x041e, 0x405d), .driver_info = METHOD2 },
    106	{USB_DEVICE(0x08ca, 0x2102), .driver_info = METHOD3 },
    107	{USB_DEVICE(0x06d6, 0x003d), .driver_info = METHOD0 },
    108	{}			/* Terminating entry */
    109};
    110
    111MODULE_DEVICE_TABLE(usb, device_table);
    112
    113/* frame structure */
    114struct zr364xx_framei {
    115	unsigned long ulState;	/* ulState:ZR364XX_READ_IDLE,
    116					   ZR364XX_READ_FRAME */
    117	void *lpvbits;		/* image data */
    118	unsigned long cur_size;	/* current data copied to it */
    119};
    120
    121/* image buffer structure */
    122struct zr364xx_bufferi {
    123	unsigned long dwFrames;			/* number of frames in buffer */
    124	struct zr364xx_framei frame[FRAMES];	/* array of FRAME structures */
    125};
    126
    127struct zr364xx_dmaqueue {
    128	struct list_head	active;
    129	struct zr364xx_camera	*cam;
    130};
    131
    132struct zr364xx_pipeinfo {
    133	u32 transfer_size;
    134	u8 *transfer_buffer;
    135	u32 state;
    136	void *stream_urb;
    137	void *cam;	/* back pointer to zr364xx_camera struct */
    138	u32 err_count;
    139	u32 idx;
    140};
    141
    142struct zr364xx_fmt {
    143	u32 fourcc;
    144	int depth;
    145};
    146
    147/* image formats.  */
    148static const struct zr364xx_fmt formats[] = {
    149	{
    150		.fourcc = V4L2_PIX_FMT_JPEG,
    151		.depth = 24
    152	}
    153};
    154
    155/* Camera stuff */
    156struct zr364xx_camera {
    157	struct usb_device *udev;	/* save off the usb device pointer */
    158	struct usb_interface *interface;/* the interface for this device */
    159	struct v4l2_device v4l2_dev;
    160	struct v4l2_ctrl_handler ctrl_handler;
    161	struct video_device vdev;	/* v4l video device */
    162	struct v4l2_fh *owner;		/* owns the streaming */
    163	int nb;
    164	struct zr364xx_bufferi		buffer;
    165	int skip;
    166	int width;
    167	int height;
    168	int method;
    169	struct mutex lock;
    170
    171	spinlock_t		slock;
    172	struct zr364xx_dmaqueue	vidq;
    173	int			last_frame;
    174	int			cur_frame;
    175	unsigned long		frame_count;
    176	int			b_acquire;
    177	struct zr364xx_pipeinfo	pipe[1];
    178
    179	u8			read_endpoint;
    180
    181	const struct zr364xx_fmt *fmt;
    182	struct videobuf_queue	vb_vidq;
    183	bool was_streaming;
    184};
    185
    186/* buffer for one video frame */
    187struct zr364xx_buffer {
    188	/* common v4l buffer stuff -- must be first */
    189	struct videobuf_buffer vb;
    190	const struct zr364xx_fmt *fmt;
    191};
    192
    193/* function used to send initialisation commands to the camera */
    194static int send_control_msg(struct usb_device *udev, u8 request, u16 value,
    195			    u16 index, unsigned char *cp, u16 size)
    196{
    197	int status;
    198
    199	unsigned char *transfer_buffer = kmemdup(cp, size, GFP_KERNEL);
    200	if (!transfer_buffer)
    201		return -ENOMEM;
    202
    203	status = usb_control_msg(udev,
    204				 usb_sndctrlpipe(udev, 0),
    205				 request,
    206				 USB_DIR_OUT | USB_TYPE_VENDOR |
    207				 USB_RECIP_DEVICE, value, index,
    208				 transfer_buffer, size, CTRL_TIMEOUT);
    209
    210	kfree(transfer_buffer);
    211	return status;
    212}
    213
    214
    215/* Control messages sent to the camera to initialize it
    216 * and launch the capture */
    217typedef struct {
    218	unsigned int value;
    219	unsigned int size;
    220	unsigned char *bytes;
    221} message;
    222
    223/* method 0 */
    224static unsigned char m0d1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    225static unsigned char m0d2[] = { 0, 0, 0, 0, 0, 0 };
    226static unsigned char m0d3[] = { 0, 0 };
    227static message m0[] = {
    228	{0x1f30, 0, NULL},
    229	{0xd000, 0, NULL},
    230	{0x3370, sizeof(m0d1), m0d1},
    231	{0x2000, 0, NULL},
    232	{0x2f0f, 0, NULL},
    233	{0x2610, sizeof(m0d2), m0d2},
    234	{0xe107, 0, NULL},
    235	{0x2502, 0, NULL},
    236	{0x1f70, 0, NULL},
    237	{0xd000, 0, NULL},
    238	{0x9a01, sizeof(m0d3), m0d3},
    239	{-1, -1, NULL}
    240};
    241
    242/* method 1 */
    243static unsigned char m1d1[] = { 0xff, 0xff };
    244static unsigned char m1d2[] = { 0x00, 0x00 };
    245static message m1[] = {
    246	{0x1f30, 0, NULL},
    247	{0xd000, 0, NULL},
    248	{0xf000, 0, NULL},
    249	{0x2000, 0, NULL},
    250	{0x2f0f, 0, NULL},
    251	{0x2650, 0, NULL},
    252	{0xe107, 0, NULL},
    253	{0x2502, sizeof(m1d1), m1d1},
    254	{0x1f70, 0, NULL},
    255	{0xd000, 0, NULL},
    256	{0xd000, 0, NULL},
    257	{0xd000, 0, NULL},
    258	{0x9a01, sizeof(m1d2), m1d2},
    259	{-1, -1, NULL}
    260};
    261
    262/* method 2 */
    263static unsigned char m2d1[] = { 0xff, 0xff };
    264static message m2[] = {
    265	{0x1f30, 0, NULL},
    266	{0xf000, 0, NULL},
    267	{0x2000, 0, NULL},
    268	{0x2f0f, 0, NULL},
    269	{0x2650, 0, NULL},
    270	{0xe107, 0, NULL},
    271	{0x2502, sizeof(m2d1), m2d1},
    272	{0x1f70, 0, NULL},
    273	{-1, -1, NULL}
    274};
    275
    276/* init table */
    277static message *init[4] = { m0, m1, m2, m2 };
    278
    279
    280/* JPEG static data in header (Huffman table, etc) */
    281static unsigned char header1[] = {
    282	0xFF, 0xD8,
    283	/*
    284	0xFF, 0xE0, 0x00, 0x10, 'J', 'F', 'I', 'F',
    285	0x00, 0x01, 0x01, 0x00, 0x33, 0x8A, 0x00, 0x00, 0x33, 0x88,
    286	*/
    287	0xFF, 0xDB, 0x00, 0x84
    288};
    289static unsigned char header2[] = {
    290	0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
    291	0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    292	0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
    293	0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
    294	0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
    295	0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
    296	0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
    297	0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33,
    298	0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
    299	0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
    300	0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
    301	0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
    302	0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
    303	0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
    304	0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
    305	0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
    306	0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
    307	0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
    308	0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
    309	0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F,
    310	0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    311	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
    312	0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5,
    313	0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
    314	0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
    315	0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
    316	0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1,
    317	0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
    318	0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
    319	0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
    320	0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57,
    321	0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
    322	0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,
    323	0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
    324	0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
    325	0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
    326	0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
    327	0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5,
    328	0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
    329	0xF8, 0xF9, 0xFA, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01,
    330	0x40, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01,
    331	0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
    332	0x00, 0x3F, 0x00
    333};
    334static unsigned char header3;
    335
    336/* ------------------------------------------------------------------
    337   Videobuf operations
    338   ------------------------------------------------------------------*/
    339
    340static int buffer_setup(struct videobuf_queue *vq, unsigned int *count,
    341			unsigned int *size)
    342{
    343	struct zr364xx_camera *cam = vq->priv_data;
    344
    345	*size = cam->width * cam->height * (cam->fmt->depth >> 3);
    346
    347	if (*count == 0)
    348		*count = ZR364XX_DEF_BUFS;
    349
    350	if (*size * *count > ZR364XX_DEF_BUFS * 1024 * 1024)
    351		*count = (ZR364XX_DEF_BUFS * 1024 * 1024) / *size;
    352
    353	return 0;
    354}
    355
    356static void free_buffer(struct videobuf_queue *vq, struct zr364xx_buffer *buf)
    357{
    358	_DBG("%s\n", __func__);
    359
    360	videobuf_vmalloc_free(&buf->vb);
    361	buf->vb.state = VIDEOBUF_NEEDS_INIT;
    362}
    363
    364static int buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
    365			  enum v4l2_field field)
    366{
    367	struct zr364xx_camera *cam = vq->priv_data;
    368	struct zr364xx_buffer *buf = container_of(vb, struct zr364xx_buffer,
    369						  vb);
    370	int rc;
    371
    372	DBG("%s, field=%d\n", __func__, field);
    373	if (!cam->fmt)
    374		return -EINVAL;
    375
    376	buf->vb.size = cam->width * cam->height * (cam->fmt->depth >> 3);
    377
    378	if (buf->vb.baddr != 0 && buf->vb.bsize < buf->vb.size) {
    379		DBG("invalid buffer prepare\n");
    380		return -EINVAL;
    381	}
    382
    383	buf->fmt = cam->fmt;
    384	buf->vb.width = cam->width;
    385	buf->vb.height = cam->height;
    386	buf->vb.field = field;
    387
    388	if (buf->vb.state == VIDEOBUF_NEEDS_INIT) {
    389		rc = videobuf_iolock(vq, &buf->vb, NULL);
    390		if (rc < 0)
    391			goto fail;
    392	}
    393
    394	buf->vb.state = VIDEOBUF_PREPARED;
    395	return 0;
    396fail:
    397	free_buffer(vq, buf);
    398	return rc;
    399}
    400
    401static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
    402{
    403	struct zr364xx_buffer *buf = container_of(vb, struct zr364xx_buffer,
    404						  vb);
    405	struct zr364xx_camera *cam = vq->priv_data;
    406
    407	_DBG("%s\n", __func__);
    408
    409	buf->vb.state = VIDEOBUF_QUEUED;
    410	list_add_tail(&buf->vb.queue, &cam->vidq.active);
    411}
    412
    413static void buffer_release(struct videobuf_queue *vq,
    414			   struct videobuf_buffer *vb)
    415{
    416	struct zr364xx_buffer *buf = container_of(vb, struct zr364xx_buffer,
    417						  vb);
    418
    419	_DBG("%s\n", __func__);
    420	free_buffer(vq, buf);
    421}
    422
    423static const struct videobuf_queue_ops zr364xx_video_qops = {
    424	.buf_setup = buffer_setup,
    425	.buf_prepare = buffer_prepare,
    426	.buf_queue = buffer_queue,
    427	.buf_release = buffer_release,
    428};
    429
    430/********************/
    431/* V4L2 integration */
    432/********************/
    433static int zr364xx_vidioc_streamon(struct file *file, void *priv,
    434				   enum v4l2_buf_type type);
    435
    436static ssize_t zr364xx_read(struct file *file, char __user *buf, size_t count,
    437			    loff_t * ppos)
    438{
    439	struct zr364xx_camera *cam = video_drvdata(file);
    440	int err = 0;
    441
    442	_DBG("%s\n", __func__);
    443
    444	if (!buf)
    445		return -EINVAL;
    446
    447	if (!count)
    448		return -EINVAL;
    449
    450	if (mutex_lock_interruptible(&cam->lock))
    451		return -ERESTARTSYS;
    452
    453	err = zr364xx_vidioc_streamon(file, file->private_data,
    454				V4L2_BUF_TYPE_VIDEO_CAPTURE);
    455	if (err == 0) {
    456		DBG("%s: reading %d bytes at pos %d.\n", __func__,
    457				(int) count, (int) *ppos);
    458
    459		/* NoMan Sux ! */
    460		err = videobuf_read_one(&cam->vb_vidq, buf, count, ppos,
    461					file->f_flags & O_NONBLOCK);
    462	}
    463	mutex_unlock(&cam->lock);
    464	return err;
    465}
    466
    467/* video buffer vmalloc implementation based partly on VIVI driver which is
    468 *          Copyright (c) 2006 by
    469 *                  Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
    470 *                  Ted Walther <ted--a.t--enumera.com>
    471 *                  John Sokol <sokol--a.t--videotechnology.com>
    472 *                  http://v4l.videotechnology.com/
    473 *
    474 */
    475static void zr364xx_fillbuff(struct zr364xx_camera *cam,
    476			     struct zr364xx_buffer *buf,
    477			     int jpgsize)
    478{
    479	int pos = 0;
    480	const char *tmpbuf;
    481	char *vbuf = videobuf_to_vmalloc(&buf->vb);
    482	unsigned long last_frame;
    483
    484	if (!vbuf)
    485		return;
    486
    487	last_frame = cam->last_frame;
    488	if (last_frame != -1) {
    489		tmpbuf = (const char *)cam->buffer.frame[last_frame].lpvbits;
    490		switch (buf->fmt->fourcc) {
    491		case V4L2_PIX_FMT_JPEG:
    492			buf->vb.size = jpgsize;
    493			memcpy(vbuf, tmpbuf, buf->vb.size);
    494			break;
    495		default:
    496			printk(KERN_DEBUG KBUILD_MODNAME ": unknown format?\n");
    497		}
    498		cam->last_frame = -1;
    499	} else {
    500		printk(KERN_ERR KBUILD_MODNAME ": =======no frame\n");
    501		return;
    502	}
    503	DBG("%s: Buffer %p size= %d\n", __func__, vbuf, pos);
    504	/* tell v4l buffer was filled */
    505
    506	buf->vb.field_count = cam->frame_count * 2;
    507	buf->vb.ts = ktime_get_ns();
    508	buf->vb.state = VIDEOBUF_DONE;
    509}
    510
    511static int zr364xx_got_frame(struct zr364xx_camera *cam, int jpgsize)
    512{
    513	struct zr364xx_dmaqueue *dma_q = &cam->vidq;
    514	struct zr364xx_buffer *buf;
    515	unsigned long flags = 0;
    516	int rc = 0;
    517
    518	DBG("wakeup: %p\n", &dma_q);
    519	spin_lock_irqsave(&cam->slock, flags);
    520
    521	if (list_empty(&dma_q->active)) {
    522		DBG("No active queue to serve\n");
    523		rc = -1;
    524		goto unlock;
    525	}
    526	buf = list_entry(dma_q->active.next,
    527			 struct zr364xx_buffer, vb.queue);
    528
    529	if (!waitqueue_active(&buf->vb.done)) {
    530		/* no one active */
    531		rc = -1;
    532		goto unlock;
    533	}
    534	list_del(&buf->vb.queue);
    535	buf->vb.ts = ktime_get_ns();
    536	DBG("[%p/%d] wakeup\n", buf, buf->vb.i);
    537	zr364xx_fillbuff(cam, buf, jpgsize);
    538	wake_up(&buf->vb.done);
    539	DBG("wakeup [buf/i] [%p/%d]\n", buf, buf->vb.i);
    540unlock:
    541	spin_unlock_irqrestore(&cam->slock, flags);
    542	return rc;
    543}
    544
    545/* this function moves the usb stream read pipe data
    546 * into the system buffers.
    547 * returns 0 on success, EAGAIN if more data to process (call this
    548 * function again).
    549 */
    550static int zr364xx_read_video_callback(struct zr364xx_camera *cam,
    551					struct zr364xx_pipeinfo *pipe_info,
    552					struct urb *purb)
    553{
    554	unsigned char *pdest;
    555	unsigned char *psrc;
    556	s32 idx = cam->cur_frame;
    557	struct zr364xx_framei *frm = &cam->buffer.frame[idx];
    558	int i = 0;
    559	unsigned char *ptr = NULL;
    560
    561	_DBG("buffer to user\n");
    562
    563	/* swap bytes if camera needs it */
    564	if (cam->method == METHOD0) {
    565		u16 *buf = (u16 *)pipe_info->transfer_buffer;
    566		for (i = 0; i < purb->actual_length/2; i++)
    567			swab16s(buf + i);
    568	}
    569
    570	/* search done.  now find out if should be acquiring */
    571	if (!cam->b_acquire) {
    572		/* we found a frame, but this channel is turned off */
    573		frm->ulState = ZR364XX_READ_IDLE;
    574		return -EINVAL;
    575	}
    576
    577	psrc = (u8 *)pipe_info->transfer_buffer;
    578	ptr = pdest = frm->lpvbits;
    579
    580	if (frm->ulState == ZR364XX_READ_IDLE) {
    581		if (purb->actual_length < 128) {
    582			/* header incomplete */
    583			dev_info(&cam->udev->dev,
    584				 "%s: buffer (%d bytes) too small to hold jpeg header. Discarding.\n",
    585				 __func__, purb->actual_length);
    586			return -EINVAL;
    587		}
    588
    589		frm->ulState = ZR364XX_READ_FRAME;
    590		frm->cur_size = 0;
    591
    592		_DBG("jpeg header, ");
    593		memcpy(ptr, header1, sizeof(header1));
    594		ptr += sizeof(header1);
    595		header3 = 0;
    596		memcpy(ptr, &header3, 1);
    597		ptr++;
    598		memcpy(ptr, psrc, 64);
    599		ptr += 64;
    600		header3 = 1;
    601		memcpy(ptr, &header3, 1);
    602		ptr++;
    603		memcpy(ptr, psrc + 64, 64);
    604		ptr += 64;
    605		memcpy(ptr, header2, sizeof(header2));
    606		ptr += sizeof(header2);
    607		memcpy(ptr, psrc + 128,
    608		       purb->actual_length - 128);
    609		ptr += purb->actual_length - 128;
    610		_DBG("header : %d %d %d %d %d %d %d %d %d\n",
    611		    psrc[0], psrc[1], psrc[2],
    612		    psrc[3], psrc[4], psrc[5],
    613		    psrc[6], psrc[7], psrc[8]);
    614		frm->cur_size = ptr - pdest;
    615	} else {
    616		if (frm->cur_size + purb->actual_length > MAX_FRAME_SIZE) {
    617			dev_info(&cam->udev->dev,
    618				 "%s: buffer (%d bytes) too small to hold frame data. Discarding frame data.\n",
    619				 __func__, MAX_FRAME_SIZE);
    620		} else {
    621			pdest += frm->cur_size;
    622			memcpy(pdest, psrc, purb->actual_length);
    623			frm->cur_size += purb->actual_length;
    624		}
    625	}
    626	/*_DBG("cur_size %lu urb size %d\n", frm->cur_size,
    627		purb->actual_length);*/
    628
    629	if (purb->actual_length < pipe_info->transfer_size) {
    630		_DBG("****************Buffer[%d]full*************\n", idx);
    631		cam->last_frame = cam->cur_frame;
    632		cam->cur_frame++;
    633		/* end of system frame ring buffer, start at zero */
    634		if (cam->cur_frame == cam->buffer.dwFrames)
    635			cam->cur_frame = 0;
    636
    637		/* frame ready */
    638		/* go back to find the JPEG EOI marker */
    639		ptr = pdest = frm->lpvbits;
    640		ptr += frm->cur_size - 2;
    641		while (ptr > pdest) {
    642			if (*ptr == 0xFF && *(ptr + 1) == 0xD9
    643			    && *(ptr + 2) == 0xFF)
    644				break;
    645			ptr--;
    646		}
    647		if (ptr == pdest)
    648			DBG("No EOI marker\n");
    649
    650		/* Sometimes there is junk data in the middle of the picture,
    651		 * we want to skip this bogus frames */
    652		while (ptr > pdest) {
    653			if (*ptr == 0xFF && *(ptr + 1) == 0xFF
    654			    && *(ptr + 2) == 0xFF)
    655				break;
    656			ptr--;
    657		}
    658		if (ptr != pdest) {
    659			DBG("Bogus frame ? %d\n", ++(cam->nb));
    660		} else if (cam->b_acquire) {
    661			/* we skip the 2 first frames which are usually buggy */
    662			if (cam->skip)
    663				cam->skip--;
    664			else {
    665				_DBG("jpeg(%lu): %d %d %d %d %d %d %d %d\n",
    666				    frm->cur_size,
    667				    pdest[0], pdest[1], pdest[2], pdest[3],
    668				    pdest[4], pdest[5], pdest[6], pdest[7]);
    669
    670				zr364xx_got_frame(cam, frm->cur_size);
    671			}
    672		}
    673		cam->frame_count++;
    674		frm->ulState = ZR364XX_READ_IDLE;
    675		frm->cur_size = 0;
    676	}
    677	/* done successfully */
    678	return 0;
    679}
    680
    681static int zr364xx_vidioc_querycap(struct file *file, void *priv,
    682				   struct v4l2_capability *cap)
    683{
    684	struct zr364xx_camera *cam = video_drvdata(file);
    685
    686	strscpy(cap->driver, DRIVER_DESC, sizeof(cap->driver));
    687	if (cam->udev->product)
    688		strscpy(cap->card, cam->udev->product, sizeof(cap->card));
    689	strscpy(cap->bus_info, dev_name(&cam->udev->dev),
    690		sizeof(cap->bus_info));
    691	return 0;
    692}
    693
    694static int zr364xx_vidioc_enum_input(struct file *file, void *priv,
    695				     struct v4l2_input *i)
    696{
    697	if (i->index != 0)
    698		return -EINVAL;
    699	strscpy(i->name, DRIVER_DESC " Camera", sizeof(i->name));
    700	i->type = V4L2_INPUT_TYPE_CAMERA;
    701	return 0;
    702}
    703
    704static int zr364xx_vidioc_g_input(struct file *file, void *priv,
    705				  unsigned int *i)
    706{
    707	*i = 0;
    708	return 0;
    709}
    710
    711static int zr364xx_vidioc_s_input(struct file *file, void *priv,
    712				  unsigned int i)
    713{
    714	if (i != 0)
    715		return -EINVAL;
    716	return 0;
    717}
    718
    719static int zr364xx_s_ctrl(struct v4l2_ctrl *ctrl)
    720{
    721	struct zr364xx_camera *cam =
    722		container_of(ctrl->handler, struct zr364xx_camera, ctrl_handler);
    723	int temp;
    724
    725	switch (ctrl->id) {
    726	case V4L2_CID_BRIGHTNESS:
    727		/* hardware brightness */
    728		send_control_msg(cam->udev, 1, 0x2001, 0, NULL, 0);
    729		temp = (0x60 << 8) + 127 - ctrl->val;
    730		send_control_msg(cam->udev, 1, temp, 0, NULL, 0);
    731		break;
    732	default:
    733		return -EINVAL;
    734	}
    735
    736	return 0;
    737}
    738
    739static int zr364xx_vidioc_enum_fmt_vid_cap(struct file *file,
    740				       void *priv, struct v4l2_fmtdesc *f)
    741{
    742	if (f->index > 0)
    743		return -EINVAL;
    744	f->pixelformat = formats[0].fourcc;
    745	return 0;
    746}
    747
    748static char *decode_fourcc(__u32 pixelformat, char *buf)
    749{
    750	buf[0] = pixelformat & 0xff;
    751	buf[1] = (pixelformat >> 8) & 0xff;
    752	buf[2] = (pixelformat >> 16) & 0xff;
    753	buf[3] = (pixelformat >> 24) & 0xff;
    754	buf[4] = '\0';
    755	return buf;
    756}
    757
    758static int zr364xx_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
    759				      struct v4l2_format *f)
    760{
    761	struct zr364xx_camera *cam = video_drvdata(file);
    762	char pixelformat_name[5];
    763
    764	if (!cam)
    765		return -ENODEV;
    766
    767	if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG) {
    768		DBG("%s: unsupported pixelformat V4L2_PIX_FMT_%s\n", __func__,
    769		    decode_fourcc(f->fmt.pix.pixelformat, pixelformat_name));
    770		return -EINVAL;
    771	}
    772
    773	if (!(f->fmt.pix.width == 160 && f->fmt.pix.height == 120) &&
    774	    !(f->fmt.pix.width == 640 && f->fmt.pix.height == 480)) {
    775		f->fmt.pix.width = 320;
    776		f->fmt.pix.height = 240;
    777	}
    778
    779	f->fmt.pix.field = V4L2_FIELD_NONE;
    780	f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
    781	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
    782	f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
    783	DBG("%s: V4L2_PIX_FMT_%s (%d) ok!\n", __func__,
    784	    decode_fourcc(f->fmt.pix.pixelformat, pixelformat_name),
    785	    f->fmt.pix.field);
    786	return 0;
    787}
    788
    789static int zr364xx_vidioc_g_fmt_vid_cap(struct file *file, void *priv,
    790				    struct v4l2_format *f)
    791{
    792	struct zr364xx_camera *cam;
    793
    794	if (!file)
    795		return -ENODEV;
    796	cam = video_drvdata(file);
    797
    798	f->fmt.pix.pixelformat = formats[0].fourcc;
    799	f->fmt.pix.field = V4L2_FIELD_NONE;
    800	f->fmt.pix.width = cam->width;
    801	f->fmt.pix.height = cam->height;
    802	f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
    803	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
    804	f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
    805	return 0;
    806}
    807
    808static int zr364xx_vidioc_s_fmt_vid_cap(struct file *file, void *priv,
    809				    struct v4l2_format *f)
    810{
    811	struct zr364xx_camera *cam = video_drvdata(file);
    812	struct videobuf_queue *q = &cam->vb_vidq;
    813	char pixelformat_name[5];
    814	int ret = zr364xx_vidioc_try_fmt_vid_cap(file, cam, f);
    815	int i;
    816
    817	if (ret < 0)
    818		return ret;
    819
    820	mutex_lock(&q->vb_lock);
    821
    822	if (videobuf_queue_is_busy(&cam->vb_vidq)) {
    823		DBG("%s queue busy\n", __func__);
    824		ret = -EBUSY;
    825		goto out;
    826	}
    827
    828	if (cam->owner) {
    829		DBG("%s can't change format after started\n", __func__);
    830		ret = -EBUSY;
    831		goto out;
    832	}
    833
    834	cam->width = f->fmt.pix.width;
    835	cam->height = f->fmt.pix.height;
    836	DBG("%s: %dx%d mode selected\n", __func__,
    837		 cam->width, cam->height);
    838	f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
    839	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
    840	f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
    841	cam->vb_vidq.field = f->fmt.pix.field;
    842
    843	if (f->fmt.pix.width == 160 && f->fmt.pix.height == 120)
    844		mode = 1;
    845	else if (f->fmt.pix.width == 640 && f->fmt.pix.height == 480)
    846		mode = 2;
    847	else
    848		mode = 0;
    849
    850	m0d1[0] = mode;
    851	m1[2].value = 0xf000 + mode;
    852	m2[1].value = 0xf000 + mode;
    853
    854	/* special case for METHOD3, the modes are different */
    855	if (cam->method == METHOD3) {
    856		switch (mode) {
    857		case 1:
    858			m2[1].value = 0xf000 + 4;
    859			break;
    860		case 2:
    861			m2[1].value = 0xf000 + 0;
    862			break;
    863		default:
    864			m2[1].value = 0xf000 + 1;
    865			break;
    866		}
    867	}
    868
    869	header2[437] = cam->height / 256;
    870	header2[438] = cam->height % 256;
    871	header2[439] = cam->width / 256;
    872	header2[440] = cam->width % 256;
    873
    874	for (i = 0; init[cam->method][i].size != -1; i++) {
    875		ret =
    876		    send_control_msg(cam->udev, 1, init[cam->method][i].value,
    877				     0, init[cam->method][i].bytes,
    878				     init[cam->method][i].size);
    879		if (ret < 0) {
    880			dev_err(&cam->udev->dev,
    881			   "error during resolution change sequence: %d\n", i);
    882			goto out;
    883		}
    884	}
    885
    886	/* Added some delay here, since opening/closing the camera quickly,
    887	 * like Ekiga does during its startup, can crash the webcam
    888	 */
    889	mdelay(100);
    890	cam->skip = 2;
    891	ret = 0;
    892
    893out:
    894	mutex_unlock(&q->vb_lock);
    895
    896	DBG("%s: V4L2_PIX_FMT_%s (%d) ok!\n", __func__,
    897	    decode_fourcc(f->fmt.pix.pixelformat, pixelformat_name),
    898	    f->fmt.pix.field);
    899	return ret;
    900}
    901
    902static int zr364xx_vidioc_reqbufs(struct file *file, void *priv,
    903			  struct v4l2_requestbuffers *p)
    904{
    905	struct zr364xx_camera *cam = video_drvdata(file);
    906
    907	if (cam->owner && cam->owner != priv)
    908		return -EBUSY;
    909	return videobuf_reqbufs(&cam->vb_vidq, p);
    910}
    911
    912static int zr364xx_vidioc_querybuf(struct file *file,
    913				void *priv,
    914				struct v4l2_buffer *p)
    915{
    916	int rc;
    917	struct zr364xx_camera *cam = video_drvdata(file);
    918	rc = videobuf_querybuf(&cam->vb_vidq, p);
    919	return rc;
    920}
    921
    922static int zr364xx_vidioc_qbuf(struct file *file,
    923				void *priv,
    924				struct v4l2_buffer *p)
    925{
    926	int rc;
    927	struct zr364xx_camera *cam = video_drvdata(file);
    928	_DBG("%s\n", __func__);
    929	if (cam->owner && cam->owner != priv)
    930		return -EBUSY;
    931	rc = videobuf_qbuf(&cam->vb_vidq, p);
    932	return rc;
    933}
    934
    935static int zr364xx_vidioc_dqbuf(struct file *file,
    936				void *priv,
    937				struct v4l2_buffer *p)
    938{
    939	int rc;
    940	struct zr364xx_camera *cam = video_drvdata(file);
    941	_DBG("%s\n", __func__);
    942	if (cam->owner && cam->owner != priv)
    943		return -EBUSY;
    944	rc = videobuf_dqbuf(&cam->vb_vidq, p, file->f_flags & O_NONBLOCK);
    945	return rc;
    946}
    947
    948static void read_pipe_completion(struct urb *purb)
    949{
    950	struct zr364xx_pipeinfo *pipe_info;
    951	struct zr364xx_camera *cam;
    952	int pipe;
    953
    954	pipe_info = purb->context;
    955	_DBG("%s %p, status %d\n", __func__, purb, purb->status);
    956	if (!pipe_info) {
    957		printk(KERN_ERR KBUILD_MODNAME ": no context!\n");
    958		return;
    959	}
    960
    961	cam = pipe_info->cam;
    962	if (!cam) {
    963		printk(KERN_ERR KBUILD_MODNAME ": no context!\n");
    964		return;
    965	}
    966
    967	/* if shutting down, do not resubmit, exit immediately */
    968	if (purb->status == -ESHUTDOWN) {
    969		DBG("%s, err shutdown\n", __func__);
    970		pipe_info->err_count++;
    971		return;
    972	}
    973
    974	if (pipe_info->state == 0) {
    975		DBG("exiting USB pipe\n");
    976		return;
    977	}
    978
    979	if (purb->actual_length > pipe_info->transfer_size) {
    980		dev_err(&cam->udev->dev, "wrong number of bytes\n");
    981		return;
    982	}
    983
    984	if (purb->status == 0)
    985		zr364xx_read_video_callback(cam, pipe_info, purb);
    986	else {
    987		pipe_info->err_count++;
    988		DBG("%s: failed URB %d\n", __func__, purb->status);
    989	}
    990
    991	pipe = usb_rcvbulkpipe(cam->udev, cam->read_endpoint);
    992
    993	/* reuse urb */
    994	usb_fill_bulk_urb(pipe_info->stream_urb, cam->udev,
    995			  pipe,
    996			  pipe_info->transfer_buffer,
    997			  pipe_info->transfer_size,
    998			  read_pipe_completion, pipe_info);
    999
   1000	if (pipe_info->state != 0) {
   1001		purb->status = usb_submit_urb(pipe_info->stream_urb,
   1002					      GFP_ATOMIC);
   1003
   1004		if (purb->status)
   1005			dev_err(&cam->udev->dev,
   1006				"error submitting urb (error=%i)\n",
   1007				purb->status);
   1008	} else
   1009		DBG("read pipe complete state 0\n");
   1010}
   1011
   1012static int zr364xx_start_readpipe(struct zr364xx_camera *cam)
   1013{
   1014	int pipe;
   1015	int retval;
   1016	struct zr364xx_pipeinfo *pipe_info = cam->pipe;
   1017	pipe = usb_rcvbulkpipe(cam->udev, cam->read_endpoint);
   1018	DBG("%s: start pipe IN x%x\n", __func__, cam->read_endpoint);
   1019
   1020	pipe_info->state = 1;
   1021	pipe_info->err_count = 0;
   1022	pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
   1023	if (!pipe_info->stream_urb)
   1024		return -ENOMEM;
   1025	/* transfer buffer allocated in board_init */
   1026	usb_fill_bulk_urb(pipe_info->stream_urb, cam->udev,
   1027			  pipe,
   1028			  pipe_info->transfer_buffer,
   1029			  pipe_info->transfer_size,
   1030			  read_pipe_completion, pipe_info);
   1031
   1032	DBG("submitting URB %p\n", pipe_info->stream_urb);
   1033	retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
   1034	if (retval) {
   1035		usb_free_urb(pipe_info->stream_urb);
   1036		printk(KERN_ERR KBUILD_MODNAME ": start read pipe failed\n");
   1037		return retval;
   1038	}
   1039
   1040	return 0;
   1041}
   1042
   1043static void zr364xx_stop_readpipe(struct zr364xx_camera *cam)
   1044{
   1045	struct zr364xx_pipeinfo *pipe_info;
   1046
   1047	if (!cam) {
   1048		printk(KERN_ERR KBUILD_MODNAME ": invalid device\n");
   1049		return;
   1050	}
   1051	DBG("stop read pipe\n");
   1052	pipe_info = cam->pipe;
   1053	if (pipe_info) {
   1054		if (pipe_info->state != 0)
   1055			pipe_info->state = 0;
   1056
   1057		if (pipe_info->stream_urb) {
   1058			/* cancel urb */
   1059			usb_kill_urb(pipe_info->stream_urb);
   1060			usb_free_urb(pipe_info->stream_urb);
   1061			pipe_info->stream_urb = NULL;
   1062		}
   1063	}
   1064	return;
   1065}
   1066
   1067/* starts acquisition process */
   1068static int zr364xx_start_acquire(struct zr364xx_camera *cam)
   1069{
   1070	int j;
   1071
   1072	DBG("start acquire\n");
   1073
   1074	cam->last_frame = -1;
   1075	cam->cur_frame = 0;
   1076	for (j = 0; j < FRAMES; j++) {
   1077		cam->buffer.frame[j].ulState = ZR364XX_READ_IDLE;
   1078		cam->buffer.frame[j].cur_size = 0;
   1079	}
   1080	cam->b_acquire = 1;
   1081	return 0;
   1082}
   1083
   1084static inline int zr364xx_stop_acquire(struct zr364xx_camera *cam)
   1085{
   1086	cam->b_acquire = 0;
   1087	return 0;
   1088}
   1089
   1090static int zr364xx_prepare(struct zr364xx_camera *cam)
   1091{
   1092	int res;
   1093	int i, j;
   1094
   1095	for (i = 0; init[cam->method][i].size != -1; i++) {
   1096		res = send_control_msg(cam->udev, 1, init[cam->method][i].value,
   1097				     0, init[cam->method][i].bytes,
   1098				     init[cam->method][i].size);
   1099		if (res < 0) {
   1100			dev_err(&cam->udev->dev,
   1101				"error during open sequence: %d\n", i);
   1102			return res;
   1103		}
   1104	}
   1105
   1106	cam->skip = 2;
   1107	cam->last_frame = -1;
   1108	cam->cur_frame = 0;
   1109	cam->frame_count = 0;
   1110	for (j = 0; j < FRAMES; j++) {
   1111		cam->buffer.frame[j].ulState = ZR364XX_READ_IDLE;
   1112		cam->buffer.frame[j].cur_size = 0;
   1113	}
   1114	v4l2_ctrl_handler_setup(&cam->ctrl_handler);
   1115	return 0;
   1116}
   1117
   1118static int zr364xx_vidioc_streamon(struct file *file, void *priv,
   1119				   enum v4l2_buf_type type)
   1120{
   1121	struct zr364xx_camera *cam = video_drvdata(file);
   1122	int res;
   1123
   1124	DBG("%s\n", __func__);
   1125
   1126	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1127		return -EINVAL;
   1128
   1129	if (cam->owner && cam->owner != priv)
   1130		return -EBUSY;
   1131
   1132	res = zr364xx_prepare(cam);
   1133	if (res)
   1134		return res;
   1135	res = videobuf_streamon(&cam->vb_vidq);
   1136	if (res == 0) {
   1137		zr364xx_start_acquire(cam);
   1138		cam->owner = file->private_data;
   1139	}
   1140	return res;
   1141}
   1142
   1143static int zr364xx_vidioc_streamoff(struct file *file, void *priv,
   1144				    enum v4l2_buf_type type)
   1145{
   1146	struct zr364xx_camera *cam = video_drvdata(file);
   1147
   1148	DBG("%s\n", __func__);
   1149	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1150		return -EINVAL;
   1151	if (cam->owner && cam->owner != priv)
   1152		return -EBUSY;
   1153	zr364xx_stop_acquire(cam);
   1154	return videobuf_streamoff(&cam->vb_vidq);
   1155}
   1156
   1157
   1158/* open the camera */
   1159static int zr364xx_open(struct file *file)
   1160{
   1161	struct zr364xx_camera *cam = video_drvdata(file);
   1162	int err;
   1163
   1164	DBG("%s\n", __func__);
   1165
   1166	if (mutex_lock_interruptible(&cam->lock))
   1167		return -ERESTARTSYS;
   1168
   1169	err = v4l2_fh_open(file);
   1170	if (err)
   1171		goto out;
   1172
   1173	/* Added some delay here, since opening/closing the camera quickly,
   1174	 * like Ekiga does during its startup, can crash the webcam
   1175	 */
   1176	mdelay(100);
   1177	err = 0;
   1178
   1179out:
   1180	mutex_unlock(&cam->lock);
   1181	DBG("%s: %d\n", __func__, err);
   1182	return err;
   1183}
   1184
   1185static void zr364xx_board_uninit(struct zr364xx_camera *cam)
   1186{
   1187	unsigned long i;
   1188
   1189	zr364xx_stop_readpipe(cam);
   1190
   1191	/* release sys buffers */
   1192	for (i = 0; i < FRAMES; i++) {
   1193		if (cam->buffer.frame[i].lpvbits) {
   1194			DBG("vfree %p\n", cam->buffer.frame[i].lpvbits);
   1195			vfree(cam->buffer.frame[i].lpvbits);
   1196		}
   1197		cam->buffer.frame[i].lpvbits = NULL;
   1198	}
   1199
   1200	/* release transfer buffer */
   1201	kfree(cam->pipe->transfer_buffer);
   1202}
   1203
   1204static void zr364xx_release(struct v4l2_device *v4l2_dev)
   1205{
   1206	struct zr364xx_camera *cam =
   1207		container_of(v4l2_dev, struct zr364xx_camera, v4l2_dev);
   1208
   1209	videobuf_mmap_free(&cam->vb_vidq);
   1210	v4l2_ctrl_handler_free(&cam->ctrl_handler);
   1211	zr364xx_board_uninit(cam);
   1212	v4l2_device_unregister(&cam->v4l2_dev);
   1213	kfree(cam);
   1214}
   1215
   1216/* release the camera */
   1217static int zr364xx_close(struct file *file)
   1218{
   1219	struct zr364xx_camera *cam;
   1220	struct usb_device *udev;
   1221	int i;
   1222
   1223	DBG("%s\n", __func__);
   1224	cam = video_drvdata(file);
   1225
   1226	mutex_lock(&cam->lock);
   1227	udev = cam->udev;
   1228
   1229	if (file->private_data == cam->owner) {
   1230		/* turn off stream */
   1231		if (cam->b_acquire)
   1232			zr364xx_stop_acquire(cam);
   1233		videobuf_streamoff(&cam->vb_vidq);
   1234
   1235		for (i = 0; i < 2; i++) {
   1236			send_control_msg(udev, 1, init[cam->method][i].value,
   1237					0, init[cam->method][i].bytes,
   1238					init[cam->method][i].size);
   1239		}
   1240		cam->owner = NULL;
   1241	}
   1242
   1243	/* Added some delay here, since opening/closing the camera quickly,
   1244	 * like Ekiga does during its startup, can crash the webcam
   1245	 */
   1246	mdelay(100);
   1247	mutex_unlock(&cam->lock);
   1248	return v4l2_fh_release(file);
   1249}
   1250
   1251
   1252static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
   1253{
   1254	struct zr364xx_camera *cam = video_drvdata(file);
   1255	int ret;
   1256
   1257	if (!cam) {
   1258		DBG("%s: cam == NULL\n", __func__);
   1259		return -ENODEV;
   1260	}
   1261	DBG("mmap called, vma=%p\n", vma);
   1262
   1263	ret = videobuf_mmap_mapper(&cam->vb_vidq, vma);
   1264
   1265	DBG("vma start=0x%08lx, size=%ld, ret=%d\n",
   1266		(unsigned long)vma->vm_start,
   1267		(unsigned long)vma->vm_end - (unsigned long)vma->vm_start, ret);
   1268	return ret;
   1269}
   1270
   1271static __poll_t zr364xx_poll(struct file *file,
   1272			       struct poll_table_struct *wait)
   1273{
   1274	struct zr364xx_camera *cam = video_drvdata(file);
   1275	struct videobuf_queue *q = &cam->vb_vidq;
   1276	__poll_t res = v4l2_ctrl_poll(file, wait);
   1277
   1278	_DBG("%s\n", __func__);
   1279
   1280	return res | videobuf_poll_stream(file, q, wait);
   1281}
   1282
   1283static const struct v4l2_ctrl_ops zr364xx_ctrl_ops = {
   1284	.s_ctrl = zr364xx_s_ctrl,
   1285};
   1286
   1287static const struct v4l2_file_operations zr364xx_fops = {
   1288	.owner = THIS_MODULE,
   1289	.open = zr364xx_open,
   1290	.release = zr364xx_close,
   1291	.read = zr364xx_read,
   1292	.mmap = zr364xx_mmap,
   1293	.unlocked_ioctl = video_ioctl2,
   1294	.poll = zr364xx_poll,
   1295};
   1296
   1297static const struct v4l2_ioctl_ops zr364xx_ioctl_ops = {
   1298	.vidioc_querycap	= zr364xx_vidioc_querycap,
   1299	.vidioc_enum_fmt_vid_cap = zr364xx_vidioc_enum_fmt_vid_cap,
   1300	.vidioc_try_fmt_vid_cap	= zr364xx_vidioc_try_fmt_vid_cap,
   1301	.vidioc_s_fmt_vid_cap	= zr364xx_vidioc_s_fmt_vid_cap,
   1302	.vidioc_g_fmt_vid_cap	= zr364xx_vidioc_g_fmt_vid_cap,
   1303	.vidioc_enum_input	= zr364xx_vidioc_enum_input,
   1304	.vidioc_g_input		= zr364xx_vidioc_g_input,
   1305	.vidioc_s_input		= zr364xx_vidioc_s_input,
   1306	.vidioc_streamon	= zr364xx_vidioc_streamon,
   1307	.vidioc_streamoff	= zr364xx_vidioc_streamoff,
   1308	.vidioc_reqbufs         = zr364xx_vidioc_reqbufs,
   1309	.vidioc_querybuf        = zr364xx_vidioc_querybuf,
   1310	.vidioc_qbuf            = zr364xx_vidioc_qbuf,
   1311	.vidioc_dqbuf           = zr364xx_vidioc_dqbuf,
   1312	.vidioc_log_status      = v4l2_ctrl_log_status,
   1313	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   1314	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   1315};
   1316
   1317static const struct video_device zr364xx_template = {
   1318	.name = DRIVER_DESC,
   1319	.fops = &zr364xx_fops,
   1320	.ioctl_ops = &zr364xx_ioctl_ops,
   1321	.release = video_device_release_empty,
   1322	.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
   1323		       V4L2_CAP_STREAMING,
   1324};
   1325
   1326
   1327
   1328/*******************/
   1329/* USB integration */
   1330/*******************/
   1331static int zr364xx_board_init(struct zr364xx_camera *cam)
   1332{
   1333	struct zr364xx_pipeinfo *pipe = cam->pipe;
   1334	unsigned long i;
   1335	int err;
   1336
   1337	DBG("board init: %p\n", cam);
   1338	memset(pipe, 0, sizeof(*pipe));
   1339	pipe->cam = cam;
   1340	pipe->transfer_size = BUFFER_SIZE;
   1341
   1342	pipe->transfer_buffer = kzalloc(pipe->transfer_size,
   1343					GFP_KERNEL);
   1344	if (!pipe->transfer_buffer) {
   1345		DBG("out of memory!\n");
   1346		return -ENOMEM;
   1347	}
   1348
   1349	cam->b_acquire = 0;
   1350	cam->frame_count = 0;
   1351
   1352	/*** start create system buffers ***/
   1353	for (i = 0; i < FRAMES; i++) {
   1354		/* always allocate maximum size for system buffers */
   1355		cam->buffer.frame[i].lpvbits = vmalloc(MAX_FRAME_SIZE);
   1356
   1357		DBG("valloc %p, idx %lu, pdata %p\n",
   1358			&cam->buffer.frame[i], i,
   1359			cam->buffer.frame[i].lpvbits);
   1360		if (!cam->buffer.frame[i].lpvbits) {
   1361			printk(KERN_INFO KBUILD_MODNAME ": out of memory. Using less frames\n");
   1362			break;
   1363		}
   1364	}
   1365
   1366	if (i == 0) {
   1367		printk(KERN_INFO KBUILD_MODNAME ": out of memory. Aborting\n");
   1368		err = -ENOMEM;
   1369		goto err_free;
   1370	} else
   1371		cam->buffer.dwFrames = i;
   1372
   1373	/* make sure internal states are set */
   1374	for (i = 0; i < FRAMES; i++) {
   1375		cam->buffer.frame[i].ulState = ZR364XX_READ_IDLE;
   1376		cam->buffer.frame[i].cur_size = 0;
   1377	}
   1378
   1379	cam->cur_frame = 0;
   1380	cam->last_frame = -1;
   1381	/*** end create system buffers ***/
   1382
   1383	/* start read pipe */
   1384	err = zr364xx_start_readpipe(cam);
   1385	if (err)
   1386		goto err_free_frames;
   1387
   1388	DBG(": board initialized\n");
   1389	return 0;
   1390
   1391err_free_frames:
   1392	for (i = 0; i < FRAMES; i++)
   1393		vfree(cam->buffer.frame[i].lpvbits);
   1394err_free:
   1395	kfree(cam->pipe->transfer_buffer);
   1396	cam->pipe->transfer_buffer = NULL;
   1397	return err;
   1398}
   1399
   1400static int zr364xx_probe(struct usb_interface *intf,
   1401			 const struct usb_device_id *id)
   1402{
   1403	struct usb_device *udev = interface_to_usbdev(intf);
   1404	struct zr364xx_camera *cam = NULL;
   1405	struct usb_host_interface *iface_desc;
   1406	struct usb_endpoint_descriptor *endpoint;
   1407	struct v4l2_ctrl_handler *hdl;
   1408	int err;
   1409	int i;
   1410
   1411	DBG("probing...\n");
   1412
   1413	dev_info(&intf->dev, DRIVER_DESC " compatible webcam plugged\n");
   1414	dev_info(&intf->dev, "model %04x:%04x detected\n",
   1415		 le16_to_cpu(udev->descriptor.idVendor),
   1416		 le16_to_cpu(udev->descriptor.idProduct));
   1417
   1418	cam = kzalloc(sizeof(*cam), GFP_KERNEL);
   1419	if (!cam)
   1420		return -ENOMEM;
   1421
   1422	err = v4l2_device_register(&intf->dev, &cam->v4l2_dev);
   1423	if (err < 0) {
   1424		dev_err(&udev->dev, "couldn't register v4l2_device\n");
   1425		goto free_cam;
   1426	}
   1427	hdl = &cam->ctrl_handler;
   1428	v4l2_ctrl_handler_init(hdl, 1);
   1429	v4l2_ctrl_new_std(hdl, &zr364xx_ctrl_ops,
   1430			  V4L2_CID_BRIGHTNESS, 0, 127, 1, 64);
   1431	if (hdl->error) {
   1432		err = hdl->error;
   1433		dev_err(&udev->dev, "couldn't register control\n");
   1434		goto free_hdlr_and_unreg_dev;
   1435	}
   1436	/* save the init method used by this camera */
   1437	cam->method = id->driver_info;
   1438	mutex_init(&cam->lock);
   1439	cam->vdev = zr364xx_template;
   1440	cam->vdev.lock = &cam->lock;
   1441	cam->vdev.v4l2_dev = &cam->v4l2_dev;
   1442	cam->vdev.ctrl_handler = &cam->ctrl_handler;
   1443	video_set_drvdata(&cam->vdev, cam);
   1444
   1445	cam->udev = udev;
   1446
   1447	switch (mode) {
   1448	case 1:
   1449		dev_info(&udev->dev, "160x120 mode selected\n");
   1450		cam->width = 160;
   1451		cam->height = 120;
   1452		break;
   1453	case 2:
   1454		dev_info(&udev->dev, "640x480 mode selected\n");
   1455		cam->width = 640;
   1456		cam->height = 480;
   1457		break;
   1458	default:
   1459		dev_info(&udev->dev, "320x240 mode selected\n");
   1460		cam->width = 320;
   1461		cam->height = 240;
   1462		break;
   1463	}
   1464
   1465	m0d1[0] = mode;
   1466	m1[2].value = 0xf000 + mode;
   1467	m2[1].value = 0xf000 + mode;
   1468
   1469	/* special case for METHOD3, the modes are different */
   1470	if (cam->method == METHOD3) {
   1471		switch (mode) {
   1472		case 1:
   1473			m2[1].value = 0xf000 + 4;
   1474			break;
   1475		case 2:
   1476			m2[1].value = 0xf000 + 0;
   1477			break;
   1478		default:
   1479			m2[1].value = 0xf000 + 1;
   1480			break;
   1481		}
   1482	}
   1483
   1484	header2[437] = cam->height / 256;
   1485	header2[438] = cam->height % 256;
   1486	header2[439] = cam->width / 256;
   1487	header2[440] = cam->width % 256;
   1488
   1489	cam->nb = 0;
   1490
   1491	DBG("dev: %p, udev %p interface %p\n", cam, cam->udev, intf);
   1492
   1493	/* set up the endpoint information  */
   1494	iface_desc = intf->cur_altsetting;
   1495	DBG("num endpoints %d\n", iface_desc->desc.bNumEndpoints);
   1496	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
   1497		endpoint = &iface_desc->endpoint[i].desc;
   1498		if (!cam->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
   1499			/* we found the bulk in endpoint */
   1500			cam->read_endpoint = endpoint->bEndpointAddress;
   1501		}
   1502	}
   1503
   1504	if (!cam->read_endpoint) {
   1505		err = -ENOMEM;
   1506		dev_err(&intf->dev, "Could not find bulk-in endpoint\n");
   1507		goto free_hdlr_and_unreg_dev;
   1508	}
   1509
   1510	/* v4l */
   1511	INIT_LIST_HEAD(&cam->vidq.active);
   1512	cam->vidq.cam = cam;
   1513
   1514	usb_set_intfdata(intf, cam);
   1515
   1516	/* load zr364xx board specific */
   1517	err = zr364xx_board_init(cam);
   1518	if (err)
   1519		goto free_hdlr_and_unreg_dev;
   1520	err = v4l2_ctrl_handler_setup(hdl);
   1521	if (err)
   1522		goto board_uninit;
   1523
   1524	spin_lock_init(&cam->slock);
   1525
   1526	cam->fmt = formats;
   1527
   1528	videobuf_queue_vmalloc_init(&cam->vb_vidq, &zr364xx_video_qops,
   1529				    NULL, &cam->slock,
   1530				    V4L2_BUF_TYPE_VIDEO_CAPTURE,
   1531				    V4L2_FIELD_NONE,
   1532				    sizeof(struct zr364xx_buffer), cam, &cam->lock);
   1533
   1534	err = video_register_device(&cam->vdev, VFL_TYPE_VIDEO, -1);
   1535	if (err) {
   1536		dev_err(&udev->dev, "video_register_device failed\n");
   1537		goto board_uninit;
   1538	}
   1539	cam->v4l2_dev.release = zr364xx_release;
   1540
   1541	dev_info(&udev->dev, DRIVER_DESC " controlling device %s\n",
   1542		 video_device_node_name(&cam->vdev));
   1543	return 0;
   1544
   1545board_uninit:
   1546	zr364xx_board_uninit(cam);
   1547free_hdlr_and_unreg_dev:
   1548	v4l2_ctrl_handler_free(hdl);
   1549	v4l2_device_unregister(&cam->v4l2_dev);
   1550free_cam:
   1551	kfree(cam);
   1552	return err;
   1553}
   1554
   1555
   1556static void zr364xx_disconnect(struct usb_interface *intf)
   1557{
   1558	struct zr364xx_camera *cam = usb_get_intfdata(intf);
   1559
   1560	mutex_lock(&cam->lock);
   1561	usb_set_intfdata(intf, NULL);
   1562	dev_info(&intf->dev, DRIVER_DESC " webcam unplugged\n");
   1563	video_unregister_device(&cam->vdev);
   1564	v4l2_device_disconnect(&cam->v4l2_dev);
   1565
   1566	/* stops the read pipe if it is running */
   1567	if (cam->b_acquire)
   1568		zr364xx_stop_acquire(cam);
   1569
   1570	zr364xx_stop_readpipe(cam);
   1571	mutex_unlock(&cam->lock);
   1572	v4l2_device_put(&cam->v4l2_dev);
   1573}
   1574
   1575
   1576#ifdef CONFIG_PM
   1577static int zr364xx_suspend(struct usb_interface *intf, pm_message_t message)
   1578{
   1579	struct zr364xx_camera *cam = usb_get_intfdata(intf);
   1580
   1581	cam->was_streaming = cam->b_acquire;
   1582	if (!cam->was_streaming)
   1583		return 0;
   1584	zr364xx_stop_acquire(cam);
   1585	zr364xx_stop_readpipe(cam);
   1586	return 0;
   1587}
   1588
   1589static int zr364xx_resume(struct usb_interface *intf)
   1590{
   1591	struct zr364xx_camera *cam = usb_get_intfdata(intf);
   1592	int res;
   1593
   1594	if (!cam->was_streaming)
   1595		return 0;
   1596
   1597	res = zr364xx_start_readpipe(cam);
   1598	if (res)
   1599		return res;
   1600
   1601	res = zr364xx_prepare(cam);
   1602	if (res)
   1603		goto err_prepare;
   1604
   1605	zr364xx_start_acquire(cam);
   1606	return 0;
   1607
   1608err_prepare:
   1609	zr364xx_stop_readpipe(cam);
   1610	return res;
   1611}
   1612#endif
   1613
   1614/**********************/
   1615/* Module integration */
   1616/**********************/
   1617
   1618static struct usb_driver zr364xx_driver = {
   1619	.name = "zr364xx",
   1620	.probe = zr364xx_probe,
   1621	.disconnect = zr364xx_disconnect,
   1622#ifdef CONFIG_PM
   1623	.suspend = zr364xx_suspend,
   1624	.resume = zr364xx_resume,
   1625	.reset_resume = zr364xx_resume,
   1626#endif
   1627	.id_table = device_table
   1628};
   1629
   1630module_usb_driver(zr364xx_driver);
   1631
   1632MODULE_AUTHOR(DRIVER_AUTHOR);
   1633MODULE_DESCRIPTION(DRIVER_DESC);
   1634MODULE_LICENSE("GPL");
   1635MODULE_VERSION(DRIVER_VERSION);