1/*
2 *  s2255drv.c - a driver for the Sensoray 2255 USB video capture device
3 *
4 *   Copyright (C) 2007-2014 by Sensoray Company Inc.
5 *                              Dean Anderson
6 *
7 * Some video buffer code based on vivi driver:
8 *
9 * Sensoray 2255 device supports 4 simultaneous channels.
10 * The channels are not "crossbar" inputs, they are physically
11 * attached to separate video decoders.
12 *
13 * Because of USB2.0 bandwidth limitations. There is only a
14 * certain amount of data which may be transferred at one time.
15 *
16 * Example maximum bandwidth utilization:
17 *
18 * -full size, color mode YUYV or YUV422P: 2 channels at once
19 * -full or half size Grey scale: all 4 channels at once
20 * -half size, color mode YUYV or YUV422P: all 4 channels at once
21 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
22 *  at once.
23 *
24 * This program is free software; you can redistribute it and/or modify
25 * it under the terms of the GNU General Public License as published by
26 * the Free Software Foundation; either version 2 of the License, or
27 * (at your option) any later version.
28 *
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
32 * GNU General Public License for more details.
33 *
34 * You should have received a copy of the GNU General Public License
35 * along with this program; if not, write to the Free Software
36 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
37 */
38
39#include <linux/module.h>
40#include <linux/firmware.h>
41#include <linux/kernel.h>
42#include <linux/mutex.h>
43#include <linux/slab.h>
44#include <linux/videodev2.h>
45#include <linux/mm.h>
46#include <linux/vmalloc.h>
47#include <linux/usb.h>
48#include <media/videobuf2-vmalloc.h>
49#include <media/v4l2-common.h>
50#include <media/v4l2-device.h>
51#include <media/v4l2-ioctl.h>
52#include <media/v4l2-ctrls.h>
53#include <media/v4l2-event.h>
54
55#define S2255_VERSION		"1.25.1"
56#define FIRMWARE_FILE_NAME "f2255usb.bin"
57
58/* default JPEG quality */
59#define S2255_DEF_JPEG_QUAL     50
60/* vendor request in */
61#define S2255_VR_IN		0
62/* vendor request out */
63#define S2255_VR_OUT		1
64/* firmware query */
65#define S2255_VR_FW		0x30
66/* USB endpoint number for configuring the device */
67#define S2255_CONFIG_EP         2
68/* maximum time for DSP to start responding after last FW word loaded(ms) */
69#define S2255_DSP_BOOTTIME      800
70/* maximum time to wait for firmware to load (ms) */
71#define S2255_LOAD_TIMEOUT      (5000 + S2255_DSP_BOOTTIME)
72#define S2255_MIN_BUFS          2
73#define S2255_SETMODE_TIMEOUT   500
74#define S2255_VIDSTATUS_TIMEOUT 350
75#define S2255_MARKER_FRAME	cpu_to_le32(0x2255DA4AL)
76#define S2255_MARKER_RESPONSE	cpu_to_le32(0x2255ACACL)
77#define S2255_RESPONSE_SETMODE  cpu_to_le32(0x01)
78#define S2255_RESPONSE_FW       cpu_to_le32(0x10)
79#define S2255_RESPONSE_STATUS   cpu_to_le32(0x20)
80#define S2255_USB_XFER_SIZE	(16 * 1024)
81#define MAX_CHANNELS		4
82#define SYS_FRAMES		4
83/* maximum size is PAL full size plus room for the marker header(s) */
84#define SYS_FRAMES_MAXSIZE	(720*288*2*2 + 4096)
85#define DEF_USB_BLOCK		S2255_USB_XFER_SIZE
86#define LINE_SZ_4CIFS_NTSC	640
87#define LINE_SZ_2CIFS_NTSC	640
88#define LINE_SZ_1CIFS_NTSC	320
89#define LINE_SZ_4CIFS_PAL	704
90#define LINE_SZ_2CIFS_PAL	704
91#define LINE_SZ_1CIFS_PAL	352
92#define NUM_LINES_4CIFS_NTSC	240
93#define NUM_LINES_2CIFS_NTSC	240
94#define NUM_LINES_1CIFS_NTSC	240
95#define NUM_LINES_4CIFS_PAL	288
96#define NUM_LINES_2CIFS_PAL	288
97#define NUM_LINES_1CIFS_PAL	288
98#define LINE_SZ_DEF		640
99#define NUM_LINES_DEF		240
100
101
102/* predefined settings */
103#define FORMAT_NTSC	1
104#define FORMAT_PAL	2
105
106#define SCALE_4CIFS	1	/* 640x480(NTSC) or 704x576(PAL) */
107#define SCALE_2CIFS	2	/* 640x240(NTSC) or 704x288(PAL) */
108#define SCALE_1CIFS	3	/* 320x240(NTSC) or 352x288(PAL) */
109/* SCALE_4CIFSI is the 2 fields interpolated into one */
110#define SCALE_4CIFSI	4	/* 640x480(NTSC) or 704x576(PAL) high quality */
111
112#define COLOR_YUVPL	1	/* YUV planar */
113#define COLOR_YUVPK	2	/* YUV packed */
114#define COLOR_Y8	4	/* monochrome */
115#define COLOR_JPG       5       /* JPEG */
116
117#define MASK_COLOR       0x000000ff
118#define MASK_JPG_QUALITY 0x0000ff00
119#define MASK_INPUT_TYPE  0x000f0000
120/* frame decimation. */
121#define FDEC_1		1	/* capture every frame. default */
122#define FDEC_2		2	/* capture every 2nd frame */
123#define FDEC_3		3	/* capture every 3rd frame */
124#define FDEC_5		5	/* capture every 5th frame */
125
126/*-------------------------------------------------------
127 * Default mode parameters.
128 *-------------------------------------------------------*/
129#define DEF_SCALE	SCALE_4CIFS
130#define DEF_COLOR	COLOR_YUVPL
131#define DEF_FDEC	FDEC_1
132#define DEF_BRIGHT	0
133#define DEF_CONTRAST	0x5c
134#define DEF_SATURATION	0x80
135#define DEF_HUE		0
136
137/* usb config commands */
138#define IN_DATA_TOKEN	cpu_to_le32(0x2255c0de)
139#define CMD_2255	0xc2255000
140#define CMD_SET_MODE	cpu_to_le32((CMD_2255 | 0x10))
141#define CMD_START	cpu_to_le32((CMD_2255 | 0x20))
142#define CMD_STOP	cpu_to_le32((CMD_2255 | 0x30))
143#define CMD_STATUS	cpu_to_le32((CMD_2255 | 0x40))
144
145struct s2255_mode {
146	u32 format;	/* input video format (NTSC, PAL) */
147	u32 scale;	/* output video scale */
148	u32 color;	/* output video color format */
149	u32 fdec;	/* frame decimation */
150	u32 bright;	/* brightness */
151	u32 contrast;	/* contrast */
152	u32 saturation;	/* saturation */
153	u32 hue;	/* hue (NTSC only)*/
154	u32 single;	/* capture 1 frame at a time (!=0), continuously (==0)*/
155	u32 usb_block;	/* block size. should be 4096 of DEF_USB_BLOCK */
156	u32 restart;	/* if DSP requires restart */
157};
158
159
160#define S2255_READ_IDLE		0
161#define S2255_READ_FRAME	1
162
163/* frame structure */
164struct s2255_framei {
165	unsigned long size;
166	unsigned long ulState;	/* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
167	void *lpvbits;		/* image data */
168	unsigned long cur_size;	/* current data copied to it */
169};
170
171/* image buffer structure */
172struct s2255_bufferi {
173	unsigned long dwFrames;			/* number of frames in buffer */
174	struct s2255_framei frame[SYS_FRAMES];	/* array of FRAME structures */
175};
176
177#define DEF_MODEI_NTSC_CONT	{FORMAT_NTSC, DEF_SCALE, DEF_COLOR,	\
178			DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
179			DEF_HUE, 0, DEF_USB_BLOCK, 0}
180
181/* for firmware loading, fw_state */
182#define S2255_FW_NOTLOADED	0
183#define S2255_FW_LOADED_DSPWAIT	1
184#define S2255_FW_SUCCESS	2
185#define S2255_FW_FAILED		3
186#define S2255_FW_DISCONNECTING  4
187#define S2255_FW_MARKER		cpu_to_le32(0x22552f2f)
188/* 2255 read states */
189#define S2255_READ_IDLE         0
190#define S2255_READ_FRAME        1
191struct s2255_fw {
192	int		      fw_loaded;
193	int		      fw_size;
194	struct urb	      *fw_urb;
195	atomic_t	      fw_state;
196	void		      *pfw_data;
197	wait_queue_head_t     wait_fw;
198	const struct firmware *fw;
199};
200
201struct s2255_pipeinfo {
202	u32 max_transfer_size;
203	u32 cur_transfer_size;
204	u8 *transfer_buffer;
205	u32 state;
206	void *stream_urb;
207	void *dev;	/* back pointer to s2255_dev struct*/
208	u32 err_count;
209	u32 idx;
210};
211
212struct s2255_fmt; /*forward declaration */
213struct s2255_dev;
214
215/* 2255 video channel */
216struct s2255_vc {
217	struct s2255_dev        *dev;
218	struct video_device	vdev;
219	struct v4l2_ctrl_handler hdl;
220	struct v4l2_ctrl	*jpegqual_ctrl;
221	int			resources;
222	struct list_head        buf_list;
223	struct s2255_bufferi	buffer;
224	struct s2255_mode	mode;
225	v4l2_std_id		std;
226	/* jpeg compression */
227	unsigned		jpegqual;
228	/* capture parameters (for high quality mode full size) */
229	struct v4l2_captureparm cap_parm;
230	int			cur_frame;
231	int			last_frame;
232	/* allocated image size */
233	unsigned long		req_image_size;
234	/* received packet size */
235	unsigned long		pkt_size;
236	int			bad_payload;
237	unsigned long		frame_count;
238	/* if JPEG image */
239	int                     jpg_size;
240	/* if channel configured to default state */
241	int                     configured;
242	wait_queue_head_t       wait_setmode;
243	int                     setmode_ready;
244	/* video status items */
245	int                     vidstatus;
246	wait_queue_head_t       wait_vidstatus;
247	int                     vidstatus_ready;
248	unsigned int		width;
249	unsigned int		height;
250	enum v4l2_field         field;
251	const struct s2255_fmt	*fmt;
252	int idx; /* channel number on device, 0-3 */
253	struct vb2_queue vb_vidq;
254	struct mutex vb_lock; /* streaming lock */
255	spinlock_t qlock;
256};
257
258
259struct s2255_dev {
260	struct s2255_vc         vc[MAX_CHANNELS];
261	struct v4l2_device      v4l2_dev;
262	atomic_t                num_channels;
263	int			frames;
264	struct mutex		lock;	/* channels[].vdev.lock */
265	struct mutex		cmdlock; /* protects cmdbuf */
266	struct usb_device	*udev;
267	struct usb_interface	*interface;
268	u8			read_endpoint;
269	struct timer_list	timer;
270	struct s2255_fw	*fw_data;
271	struct s2255_pipeinfo	pipe;
272	u32			cc;	/* current channel */
273	int			frame_ready;
274	int                     chn_ready;
275	/* dsp firmware version (f2255usb.bin) */
276	int                     dsp_fw_ver;
277	u16                     pid; /* product id */
278#define S2255_CMDBUF_SIZE 512
279	__le32                  *cmdbuf;
280};
281
282static inline struct s2255_dev *to_s2255_dev(struct v4l2_device *v4l2_dev)
283{
284	return container_of(v4l2_dev, struct s2255_dev, v4l2_dev);
285}
286
287struct s2255_fmt {
288	char *name;
289	u32 fourcc;
290	int depth;
291};
292
293/* buffer for one video frame */
294struct s2255_buffer {
295	/* common v4l buffer stuff -- must be first */
296	struct vb2_buffer vb;
297	struct list_head list;
298};
299
300
301/* current cypress EEPROM firmware version */
302#define S2255_CUR_USB_FWVER	((3 << 8) | 12)
303/* current DSP FW version */
304#define S2255_CUR_DSP_FWVER     10104
305/* Need DSP version 5+ for video status feature */
306#define S2255_MIN_DSP_STATUS      5
307#define S2255_MIN_DSP_COLORFILTER 8
308#define S2255_NORMS		(V4L2_STD_ALL)
309
310/* private V4L2 controls */
311
312/*
313 * The following chart displays how COLORFILTER should be set
314 *  =========================================================
315 *  =     fourcc              =     COLORFILTER             =
316 *  =                         ===============================
317 *  =                         =   0             =    1      =
318 *  =========================================================
319 *  =  V4L2_PIX_FMT_GREY(Y8)  = monochrome from = monochrome=
320 *  =                         = s-video or      = composite =
321 *  =                         = B/W camera      = input     =
322 *  =========================================================
323 *  =    other                = color, svideo   = color,    =
324 *  =                         =                 = composite =
325 *  =========================================================
326 *
327 * Notes:
328 *   channels 0-3 on 2255 are composite
329 *   channels 0-1 on 2257 are composite, 2-3 are s-video
330 * If COLORFILTER is 0 with a composite color camera connected,
331 * the output will appear monochrome but hatching
332 * will occur.
333 * COLORFILTER is different from "color killer" and "color effects"
334 * for reasons above.
335 */
336#define S2255_V4L2_YC_ON  1
337#define S2255_V4L2_YC_OFF 0
338#define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
339
340/* frame prefix size (sent once every frame) */
341#define PREFIX_SIZE		512
342
343/* Channels on box are in reverse order */
344static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
345
346static int debug;
347
348static int s2255_start_readpipe(struct s2255_dev *dev);
349static void s2255_stop_readpipe(struct s2255_dev *dev);
350static int s2255_start_acquire(struct s2255_vc *vc);
351static int s2255_stop_acquire(struct s2255_vc *vc);
352static void s2255_fillbuff(struct s2255_vc *vc, struct s2255_buffer *buf,
353			   int jpgsize);
354static int s2255_set_mode(struct s2255_vc *vc, struct s2255_mode *mode);
355static int s2255_board_shutdown(struct s2255_dev *dev);
356static void s2255_fwload_start(struct s2255_dev *dev, int reset);
357static void s2255_destroy(struct s2255_dev *dev);
358static long s2255_vendor_req(struct s2255_dev *dev, unsigned char req,
359			     u16 index, u16 value, void *buf,
360			     s32 buf_len, int bOut);
361
362/* dev_err macro with driver name */
363#define S2255_DRIVER_NAME "s2255"
364#define s2255_dev_err(dev, fmt, arg...)					\
365		dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
366
367#define dprintk(dev, level, fmt, arg...) \
368	v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
369
370static struct usb_driver s2255_driver;
371
372/* start video number */
373static int video_nr = -1;	/* /dev/videoN, -1 for autodetect */
374
375/* Enable jpeg capture. */
376static int jpeg_enable = 1;
377
378module_param(debug, int, 0644);
379MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
380module_param(video_nr, int, 0644);
381MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
382module_param(jpeg_enable, int, 0644);
383MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
384
385/* USB device table */
386#define USB_SENSORAY_VID	0x1943
387static struct usb_device_id s2255_table[] = {
388	{USB_DEVICE(USB_SENSORAY_VID, 0x2255)},
389	{USB_DEVICE(USB_SENSORAY_VID, 0x2257)}, /*same family as 2255*/
390	{ }			/* Terminating entry */
391};
392MODULE_DEVICE_TABLE(usb, s2255_table);
393
394#define BUFFER_TIMEOUT msecs_to_jiffies(400)
395
396/* image formats.  */
397/* JPEG formats must be defined last to support jpeg_enable parameter */
398static const struct s2255_fmt formats[] = {
399	{
400		.name = "4:2:2, packed, YUYV",
401		.fourcc = V4L2_PIX_FMT_YUYV,
402		.depth = 16
403
404	}, {
405		.name = "4:2:2, packed, UYVY",
406		.fourcc = V4L2_PIX_FMT_UYVY,
407		.depth = 16
408	}, {
409		.name = "4:2:2, planar, YUV422P",
410		.fourcc = V4L2_PIX_FMT_YUV422P,
411		.depth = 16
412
413	}, {
414		.name = "8bpp GREY",
415		.fourcc = V4L2_PIX_FMT_GREY,
416		.depth = 8
417	}, {
418		.name = "JPG",
419		.fourcc = V4L2_PIX_FMT_JPEG,
420		.depth = 24
421	}, {
422		.name = "MJPG",
423		.fourcc = V4L2_PIX_FMT_MJPEG,
424		.depth = 24
425	}
426};
427
428static int norm_maxw(struct s2255_vc *vc)
429{
430	return (vc->std & V4L2_STD_525_60) ?
431	    LINE_SZ_4CIFS_NTSC : LINE_SZ_4CIFS_PAL;
432}
433
434static int norm_maxh(struct s2255_vc *vc)
435{
436	return (vc->std & V4L2_STD_525_60) ?
437	    (NUM_LINES_1CIFS_NTSC * 2) : (NUM_LINES_1CIFS_PAL * 2);
438}
439
440static int norm_minw(struct s2255_vc *vc)
441{
442	return (vc->std & V4L2_STD_525_60) ?
443	    LINE_SZ_1CIFS_NTSC : LINE_SZ_1CIFS_PAL;
444}
445
446static int norm_minh(struct s2255_vc *vc)
447{
448	return (vc->std & V4L2_STD_525_60) ?
449	    (NUM_LINES_1CIFS_NTSC) : (NUM_LINES_1CIFS_PAL);
450}
451
452
453/*
454 * TODO: fixme: move YUV reordering to hardware
455 * converts 2255 planar format to yuyv or uyvy
456 */
457static void planar422p_to_yuv_packed(const unsigned char *in,
458				     unsigned char *out,
459				     int width, int height,
460				     int fmt)
461{
462	unsigned char *pY;
463	unsigned char *pCb;
464	unsigned char *pCr;
465	unsigned long size = height * width;
466	unsigned int i;
467	pY = (unsigned char *)in;
468	pCr = (unsigned char *)in + height * width;
469	pCb = (unsigned char *)in + height * width + (height * width / 2);
470	for (i = 0; i < size * 2; i += 4) {
471		out[i] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCr++;
472		out[i + 1] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCr++ : *pY++;
473		out[i + 2] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCb++;
474		out[i + 3] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCb++ : *pY++;
475	}
476	return;
477}
478
479static void s2255_reset_dsppower(struct s2255_dev *dev)
480{
481	s2255_vendor_req(dev, 0x40, 0x0000, 0x0001, NULL, 0, 1);
482	msleep(20);
483	s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
484	msleep(600);
485	s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
486	return;
487}
488
489/* kickstarts the firmware loading. from probe
490 */
491static void s2255_timer(unsigned long user_data)
492{
493	struct s2255_fw *data = (struct s2255_fw *)user_data;
494	if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
495		pr_err("s2255: can't submit urb\n");
496		atomic_set(&data->fw_state, S2255_FW_FAILED);
497		/* wake up anything waiting for the firmware */
498		wake_up(&data->wait_fw);
499		return;
500	}
501}
502
503
504/* this loads the firmware asynchronously.
505   Originally this was done synchronously in probe.
506   But it is better to load it asynchronously here than block
507   inside the probe function. Blocking inside probe affects boot time.
508   FW loading is triggered by the timer in the probe function
509*/
510static void s2255_fwchunk_complete(struct urb *urb)
511{
512	struct s2255_fw *data = urb->context;
513	struct usb_device *udev = urb->dev;
514	int len;
515	if (urb->status) {
516		dev_err(&udev->dev, "URB failed with status %d\n", urb->status);
517		atomic_set(&data->fw_state, S2255_FW_FAILED);
518		/* wake up anything waiting for the firmware */
519		wake_up(&data->wait_fw);
520		return;
521	}
522	if (data->fw_urb == NULL) {
523		s2255_dev_err(&udev->dev, "disconnected\n");
524		atomic_set(&data->fw_state, S2255_FW_FAILED);
525		/* wake up anything waiting for the firmware */
526		wake_up(&data->wait_fw);
527		return;
528	}
529#define CHUNK_SIZE 512
530	/* all USB transfers must be done with continuous kernel memory.
531	   can't allocate more than 128k in current linux kernel, so
532	   upload the firmware in chunks
533	 */
534	if (data->fw_loaded < data->fw_size) {
535		len = (data->fw_loaded + CHUNK_SIZE) > data->fw_size ?
536		    data->fw_size % CHUNK_SIZE : CHUNK_SIZE;
537
538		if (len < CHUNK_SIZE)
539			memset(data->pfw_data, 0, CHUNK_SIZE);
540
541		memcpy(data->pfw_data,
542		       (char *) data->fw->data + data->fw_loaded, len);
543
544		usb_fill_bulk_urb(data->fw_urb, udev, usb_sndbulkpipe(udev, 2),
545				  data->pfw_data, CHUNK_SIZE,
546				  s2255_fwchunk_complete, data);
547		if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
548			dev_err(&udev->dev, "failed submit URB\n");
549			atomic_set(&data->fw_state, S2255_FW_FAILED);
550			/* wake up anything waiting for the firmware */
551			wake_up(&data->wait_fw);
552			return;
553		}
554		data->fw_loaded += len;
555	} else
556		atomic_set(&data->fw_state, S2255_FW_LOADED_DSPWAIT);
557	return;
558
559}
560
561static void s2255_got_frame(struct s2255_vc *vc, int jpgsize)
562{
563	struct s2255_buffer *buf;
564	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
565	unsigned long flags = 0;
566
567	spin_lock_irqsave(&vc->qlock, flags);
568	if (list_empty(&vc->buf_list)) {
569		dprintk(dev, 1, "No active queue to serve\n");
570		spin_unlock_irqrestore(&vc->qlock, flags);
571		return;
572	}
573	buf = list_entry(vc->buf_list.next,
574			 struct s2255_buffer, list);
575	list_del(&buf->list);
576	v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);
577	buf->vb.v4l2_buf.field = vc->field;
578	buf->vb.v4l2_buf.sequence = vc->frame_count;
579	spin_unlock_irqrestore(&vc->qlock, flags);
580
581	s2255_fillbuff(vc, buf, jpgsize);
582	/* tell v4l buffer was filled */
583	vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
584	dprintk(dev, 2, "%s: [buf] [%p]\n", __func__, buf);
585}
586
587static const struct s2255_fmt *format_by_fourcc(int fourcc)
588{
589	unsigned int i;
590	for (i = 0; i < ARRAY_SIZE(formats); i++) {
591		if (-1 == formats[i].fourcc)
592			continue;
593		if (!jpeg_enable && ((formats[i].fourcc == V4L2_PIX_FMT_JPEG) ||
594				     (formats[i].fourcc == V4L2_PIX_FMT_MJPEG)))
595			continue;
596		if (formats[i].fourcc == fourcc)
597			return formats + i;
598	}
599	return NULL;
600}
601
602/* video buffer vmalloc implementation based partly on VIVI driver which is
603 *          Copyright (c) 2006 by
604 *                  Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
605 *                  Ted Walther <ted--a.t--enumera.com>
606 *                  John Sokol <sokol--a.t--videotechnology.com>
607 *                  http://v4l.videotechnology.com/
608 *
609 */
610static void s2255_fillbuff(struct s2255_vc *vc,
611			   struct s2255_buffer *buf, int jpgsize)
612{
613	int pos = 0;
614	const char *tmpbuf;
615	char *vbuf = vb2_plane_vaddr(&buf->vb, 0);
616	unsigned long last_frame;
617	struct s2255_dev *dev = vc->dev;
618
619	if (!vbuf)
620		return;
621	last_frame = vc->last_frame;
622	if (last_frame != -1) {
623		tmpbuf =
624		    (const char *)vc->buffer.frame[last_frame].lpvbits;
625		switch (vc->fmt->fourcc) {
626		case V4L2_PIX_FMT_YUYV:
627		case V4L2_PIX_FMT_UYVY:
628			planar422p_to_yuv_packed((const unsigned char *)tmpbuf,
629						 vbuf, vc->width,
630						 vc->height,
631						 vc->fmt->fourcc);
632			break;
633		case V4L2_PIX_FMT_GREY:
634			memcpy(vbuf, tmpbuf, vc->width * vc->height);
635			break;
636		case V4L2_PIX_FMT_JPEG:
637		case V4L2_PIX_FMT_MJPEG:
638			vb2_set_plane_payload(&buf->vb, 0, jpgsize);
639			memcpy(vbuf, tmpbuf, jpgsize);
640			break;
641		case V4L2_PIX_FMT_YUV422P:
642			memcpy(vbuf, tmpbuf,
643			       vc->width * vc->height * 2);
644			break;
645		default:
646			pr_info("s2255: unknown format?\n");
647		}
648		vc->last_frame = -1;
649	} else {
650		pr_err("s2255: =======no frame\n");
651		return;
652	}
653	dprintk(dev, 2, "s2255fill at : Buffer 0x%08lx size= %d\n",
654		(unsigned long)vbuf, pos);
655}
656
657
658/* ------------------------------------------------------------------
659   Videobuf operations
660   ------------------------------------------------------------------*/
661
662static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
663		       unsigned int *nbuffers, unsigned int *nplanes,
664		       unsigned int sizes[], void *alloc_ctxs[])
665{
666	struct s2255_vc *vc = vb2_get_drv_priv(vq);
667	if (*nbuffers < S2255_MIN_BUFS)
668		*nbuffers = S2255_MIN_BUFS;
669	*nplanes = 1;
670	sizes[0] = vc->width * vc->height * (vc->fmt->depth >> 3);
671	return 0;
672}
673
674static int buffer_prepare(struct vb2_buffer *vb)
675{
676	struct s2255_vc *vc = vb2_get_drv_priv(vb->vb2_queue);
677	struct s2255_buffer *buf = container_of(vb, struct s2255_buffer, vb);
678	int w = vc->width;
679	int h = vc->height;
680	unsigned long size;
681
682	dprintk(vc->dev, 4, "%s\n", __func__);
683	if (vc->fmt == NULL)
684		return -EINVAL;
685
686	if ((w < norm_minw(vc)) ||
687	    (w > norm_maxw(vc)) ||
688	    (h < norm_minh(vc)) ||
689	    (h > norm_maxh(vc))) {
690		dprintk(vc->dev, 4, "invalid buffer prepare\n");
691		return -EINVAL;
692	}
693	size = w * h * (vc->fmt->depth >> 3);
694	if (vb2_plane_size(vb, 0) < size) {
695		dprintk(vc->dev, 4, "invalid buffer prepare\n");
696		return -EINVAL;
697	}
698
699	vb2_set_plane_payload(&buf->vb, 0, size);
700	return 0;
701}
702
703static void buffer_queue(struct vb2_buffer *vb)
704{
705	struct s2255_buffer *buf = container_of(vb, struct s2255_buffer, vb);
706	struct s2255_vc *vc = vb2_get_drv_priv(vb->vb2_queue);
707	unsigned long flags = 0;
708	dprintk(vc->dev, 1, "%s\n", __func__);
709	spin_lock_irqsave(&vc->qlock, flags);
710	list_add_tail(&buf->list, &vc->buf_list);
711	spin_unlock_irqrestore(&vc->qlock, flags);
712}
713
714static int start_streaming(struct vb2_queue *vq, unsigned int count);
715static void stop_streaming(struct vb2_queue *vq);
716
717static struct vb2_ops s2255_video_qops = {
718	.queue_setup = queue_setup,
719	.buf_prepare = buffer_prepare,
720	.buf_queue = buffer_queue,
721	.start_streaming = start_streaming,
722	.stop_streaming = stop_streaming,
723	.wait_prepare = vb2_ops_wait_prepare,
724	.wait_finish = vb2_ops_wait_finish,
725};
726
727static int vidioc_querycap(struct file *file, void *priv,
728			   struct v4l2_capability *cap)
729{
730	struct s2255_vc *vc = video_drvdata(file);
731	struct s2255_dev *dev = vc->dev;
732
733	strlcpy(cap->driver, "s2255", sizeof(cap->driver));
734	strlcpy(cap->card, "s2255", sizeof(cap->card));
735	usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
736	cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
737		V4L2_CAP_READWRITE;
738	cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
739	return 0;
740}
741
742static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
743			       struct v4l2_fmtdesc *f)
744{
745	int index = f->index;
746
747	if (index >= ARRAY_SIZE(formats))
748		return -EINVAL;
749	if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
750			(formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
751		return -EINVAL;
752	strlcpy(f->description, formats[index].name, sizeof(f->description));
753	f->pixelformat = formats[index].fourcc;
754	return 0;
755}
756
757static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
758			    struct v4l2_format *f)
759{
760	struct s2255_vc *vc = video_drvdata(file);
761	int is_ntsc = vc->std & V4L2_STD_525_60;
762
763	f->fmt.pix.width = vc->width;
764	f->fmt.pix.height = vc->height;
765	if (f->fmt.pix.height >=
766	    (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2)
767		f->fmt.pix.field = V4L2_FIELD_INTERLACED;
768	else
769		f->fmt.pix.field = V4L2_FIELD_TOP;
770	f->fmt.pix.pixelformat = vc->fmt->fourcc;
771	f->fmt.pix.bytesperline = f->fmt.pix.width * (vc->fmt->depth >> 3);
772	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
773	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
774	f->fmt.pix.priv = 0;
775	return 0;
776}
777
778static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
779			      struct v4l2_format *f)
780{
781	const struct s2255_fmt *fmt;
782	enum v4l2_field field;
783	struct s2255_vc *vc = video_drvdata(file);
784	int is_ntsc = vc->std & V4L2_STD_525_60;
785
786	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
787
788	if (fmt == NULL)
789		return -EINVAL;
790
791	field = f->fmt.pix.field;
792
793	dprintk(vc->dev, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
794		__func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
795	if (is_ntsc) {
796		/* NTSC */
797		if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
798			f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
799			field = V4L2_FIELD_INTERLACED;
800		} else {
801			f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
802			field = V4L2_FIELD_TOP;
803		}
804		if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
805			f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
806		else if (f->fmt.pix.width >= LINE_SZ_2CIFS_NTSC)
807			f->fmt.pix.width = LINE_SZ_2CIFS_NTSC;
808		else if (f->fmt.pix.width >= LINE_SZ_1CIFS_NTSC)
809			f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
810		else
811			f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
812	} else {
813		/* PAL */
814		if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
815			f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
816			field = V4L2_FIELD_INTERLACED;
817		} else {
818			f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
819			field = V4L2_FIELD_TOP;
820		}
821		if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
822			f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
823		else if (f->fmt.pix.width >= LINE_SZ_2CIFS_PAL)
824			f->fmt.pix.width = LINE_SZ_2CIFS_PAL;
825		else if (f->fmt.pix.width >= LINE_SZ_1CIFS_PAL)
826			f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
827		else
828			f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
829	}
830	f->fmt.pix.field = field;
831	f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
832	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
833	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
834	f->fmt.pix.priv = 0;
835	dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
836		f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
837	return 0;
838}
839
840static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
841			    struct v4l2_format *f)
842{
843	struct s2255_vc *vc = video_drvdata(file);
844	const struct s2255_fmt *fmt;
845	struct vb2_queue *q = &vc->vb_vidq;
846	struct s2255_mode mode;
847	int ret;
848
849	ret = vidioc_try_fmt_vid_cap(file, vc, f);
850
851	if (ret < 0)
852		return ret;
853
854	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
855
856	if (fmt == NULL)
857		return -EINVAL;
858
859	if (vb2_is_busy(q)) {
860		dprintk(vc->dev, 1, "queue busy\n");
861		return -EBUSY;
862	}
863
864	mode = vc->mode;
865	vc->fmt = fmt;
866	vc->width = f->fmt.pix.width;
867	vc->height = f->fmt.pix.height;
868	vc->field = f->fmt.pix.field;
869	if (vc->width > norm_minw(vc)) {
870		if (vc->height > norm_minh(vc)) {
871			if (vc->cap_parm.capturemode &
872			    V4L2_MODE_HIGHQUALITY)
873				mode.scale = SCALE_4CIFSI;
874			else
875				mode.scale = SCALE_4CIFS;
876		} else
877			mode.scale = SCALE_2CIFS;
878
879	} else {
880		mode.scale = SCALE_1CIFS;
881	}
882	/* color mode */
883	switch (vc->fmt->fourcc) {
884	case V4L2_PIX_FMT_GREY:
885		mode.color &= ~MASK_COLOR;
886		mode.color |= COLOR_Y8;
887		break;
888	case V4L2_PIX_FMT_JPEG:
889	case V4L2_PIX_FMT_MJPEG:
890		mode.color &= ~MASK_COLOR;
891		mode.color |= COLOR_JPG;
892		mode.color |= (vc->jpegqual << 8);
893		break;
894	case V4L2_PIX_FMT_YUV422P:
895		mode.color &= ~MASK_COLOR;
896		mode.color |= COLOR_YUVPL;
897		break;
898	case V4L2_PIX_FMT_YUYV:
899	case V4L2_PIX_FMT_UYVY:
900	default:
901		mode.color &= ~MASK_COLOR;
902		mode.color |= COLOR_YUVPK;
903		break;
904	}
905	if ((mode.color & MASK_COLOR) != (vc->mode.color & MASK_COLOR))
906		mode.restart = 1;
907	else if (mode.scale != vc->mode.scale)
908		mode.restart = 1;
909	else if (mode.format != vc->mode.format)
910		mode.restart = 1;
911	vc->mode = mode;
912	(void) s2255_set_mode(vc, &mode);
913	return 0;
914}
915
916
917/* write to the configuration pipe, synchronously */
918static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
919			      int size)
920{
921	int pipe;
922	int done;
923	long retval = -1;
924	if (udev) {
925		pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
926		retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
927	}
928	return retval;
929}
930
931static u32 get_transfer_size(struct s2255_mode *mode)
932{
933	int linesPerFrame = LINE_SZ_DEF;
934	int pixelsPerLine = NUM_LINES_DEF;
935	u32 outImageSize;
936	u32 usbInSize;
937	unsigned int mask_mult;
938
939	if (mode == NULL)
940		return 0;
941
942	if (mode->format == FORMAT_NTSC) {
943		switch (mode->scale) {
944		case SCALE_4CIFS:
945		case SCALE_4CIFSI:
946			linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
947			pixelsPerLine = LINE_SZ_4CIFS_NTSC;
948			break;
949		case SCALE_2CIFS:
950			linesPerFrame = NUM_LINES_2CIFS_NTSC;
951			pixelsPerLine = LINE_SZ_2CIFS_NTSC;
952			break;
953		case SCALE_1CIFS:
954			linesPerFrame = NUM_LINES_1CIFS_NTSC;
955			pixelsPerLine = LINE_SZ_1CIFS_NTSC;
956			break;
957		default:
958			break;
959		}
960	} else if (mode->format == FORMAT_PAL) {
961		switch (mode->scale) {
962		case SCALE_4CIFS:
963		case SCALE_4CIFSI:
964			linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
965			pixelsPerLine = LINE_SZ_4CIFS_PAL;
966			break;
967		case SCALE_2CIFS:
968			linesPerFrame = NUM_LINES_2CIFS_PAL;
969			pixelsPerLine = LINE_SZ_2CIFS_PAL;
970			break;
971		case SCALE_1CIFS:
972			linesPerFrame = NUM_LINES_1CIFS_PAL;
973			pixelsPerLine = LINE_SZ_1CIFS_PAL;
974			break;
975		default:
976			break;
977		}
978	}
979	outImageSize = linesPerFrame * pixelsPerLine;
980	if ((mode->color & MASK_COLOR) != COLOR_Y8) {
981		/* 2 bytes/pixel if not monochrome */
982		outImageSize *= 2;
983	}
984
985	/* total bytes to send including prefix and 4K padding;
986	   must be a multiple of USB_READ_SIZE */
987	usbInSize = outImageSize + PREFIX_SIZE;	/* always send prefix */
988	mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
989	/* if size not a multiple of USB_READ_SIZE */
990	if (usbInSize & ~mask_mult)
991		usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
992	return usbInSize;
993}
994
995static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
996{
997	struct device *dev = &sdev->udev->dev;
998	dev_info(dev, "------------------------------------------------\n");
999	dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
1000	dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
1001	dev_info(dev, "bright: 0x%x\n", mode->bright);
1002	dev_info(dev, "------------------------------------------------\n");
1003}
1004
1005/*
1006 * set mode is the function which controls the DSP.
1007 * the restart parameter in struct s2255_mode should be set whenever
1008 * the image size could change via color format, video system or image
1009 * size.
1010 * When the restart parameter is set, we sleep for ONE frame to allow the
1011 * DSP time to get the new frame
1012 */
1013static int s2255_set_mode(struct s2255_vc *vc,
1014			  struct s2255_mode *mode)
1015{
1016	int res;
1017	unsigned long chn_rev;
1018	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
1019	int i;
1020	__le32 *buffer = dev->cmdbuf;
1021
1022	mutex_lock(&dev->cmdlock);
1023	chn_rev = G_chnmap[vc->idx];
1024	dprintk(dev, 3, "%s channel: %d\n", __func__, vc->idx);
1025	/* if JPEG, set the quality */
1026	if ((mode->color & MASK_COLOR) == COLOR_JPG) {
1027		mode->color &= ~MASK_COLOR;
1028		mode->color |= COLOR_JPG;
1029		mode->color &= ~MASK_JPG_QUALITY;
1030		mode->color |= (vc->jpegqual << 8);
1031	}
1032	/* save the mode */
1033	vc->mode = *mode;
1034	vc->req_image_size = get_transfer_size(mode);
1035	dprintk(dev, 1, "%s: reqsize %ld\n", __func__, vc->req_image_size);
1036	/* set the mode */
1037	buffer[0] = IN_DATA_TOKEN;
1038	buffer[1] = (__le32) cpu_to_le32(chn_rev);
1039	buffer[2] = CMD_SET_MODE;
1040	for (i = 0; i < sizeof(struct s2255_mode) / sizeof(u32); i++)
1041		buffer[3 + i] = cpu_to_le32(((u32 *)&vc->mode)[i]);
1042	vc->setmode_ready = 0;
1043	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1044	if (debug)
1045		s2255_print_cfg(dev, mode);
1046	/* wait at least 3 frames before continuing */
1047	if (mode->restart) {
1048		wait_event_timeout(vc->wait_setmode,
1049				   (vc->setmode_ready != 0),
1050				   msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
1051		if (vc->setmode_ready != 1) {
1052			dprintk(dev, 0, "s2255: no set mode response\n");
1053			res = -EFAULT;
1054		}
1055	}
1056	/* clear the restart flag */
1057	vc->mode.restart = 0;
1058	dprintk(dev, 1, "%s chn %d, result: %d\n", __func__, vc->idx, res);
1059	mutex_unlock(&dev->cmdlock);
1060	return res;
1061}
1062
1063static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
1064{
1065	int res;
1066	u32 chn_rev;
1067	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
1068	__le32 *buffer = dev->cmdbuf;
1069
1070	mutex_lock(&dev->cmdlock);
1071	chn_rev = G_chnmap[vc->idx];
1072	dprintk(dev, 4, "%s chan %d\n", __func__, vc->idx);
1073	/* form the get vid status command */
1074	buffer[0] = IN_DATA_TOKEN;
1075	buffer[1] = (__le32) cpu_to_le32(chn_rev);
1076	buffer[2] = CMD_STATUS;
1077	*pstatus = 0;
1078	vc->vidstatus_ready = 0;
1079	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1080	wait_event_timeout(vc->wait_vidstatus,
1081			   (vc->vidstatus_ready != 0),
1082			   msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
1083	if (vc->vidstatus_ready != 1) {
1084		dprintk(dev, 0, "s2255: no vidstatus response\n");
1085		res = -EFAULT;
1086	}
1087	*pstatus = vc->vidstatus;
1088	dprintk(dev, 4, "%s, vid status %d\n", __func__, *pstatus);
1089	mutex_unlock(&dev->cmdlock);
1090	return res;
1091}
1092
1093static int start_streaming(struct vb2_queue *vq, unsigned int count)
1094{
1095	struct s2255_vc *vc = vb2_get_drv_priv(vq);
1096	int j;
1097
1098	vc->last_frame = -1;
1099	vc->bad_payload = 0;
1100	vc->cur_frame = 0;
1101	vc->frame_count = 0;
1102	for (j = 0; j < SYS_FRAMES; j++) {
1103		vc->buffer.frame[j].ulState = S2255_READ_IDLE;
1104		vc->buffer.frame[j].cur_size = 0;
1105	}
1106	return s2255_start_acquire(vc);
1107}
1108
1109/* abort streaming and wait for last buffer */
1110static void stop_streaming(struct vb2_queue *vq)
1111{
1112	struct s2255_vc *vc = vb2_get_drv_priv(vq);
1113	struct s2255_buffer *buf, *node;
1114	unsigned long flags;
1115	(void) s2255_stop_acquire(vc);
1116	spin_lock_irqsave(&vc->qlock, flags);
1117	list_for_each_entry_safe(buf, node, &vc->buf_list, list) {
1118		list_del(&buf->list);
1119		vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
1120		dprintk(vc->dev, 2, "[%p/%d] done\n",
1121			buf, buf->vb.v4l2_buf.index);
1122	}
1123	spin_unlock_irqrestore(&vc->qlock, flags);
1124}
1125
1126static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
1127{
1128	struct s2255_vc *vc = video_drvdata(file);
1129	struct s2255_mode mode;
1130	struct vb2_queue *q = &vc->vb_vidq;
1131
1132	/*
1133	 * Changing the standard implies a format change, which is not allowed
1134	 * while buffers for use with streaming have already been allocated.
1135	 */
1136	if (vb2_is_busy(q))
1137		return -EBUSY;
1138
1139	mode = vc->mode;
1140	if (i & V4L2_STD_525_60) {
1141		dprintk(vc->dev, 4, "%s 60 Hz\n", __func__);
1142		/* if changing format, reset frame decimation/intervals */
1143		if (mode.format != FORMAT_NTSC) {
1144			mode.restart = 1;
1145			mode.format = FORMAT_NTSC;
1146			mode.fdec = FDEC_1;
1147			vc->width = LINE_SZ_4CIFS_NTSC;
1148			vc->height = NUM_LINES_4CIFS_NTSC * 2;
1149		}
1150	} else if (i & V4L2_STD_625_50) {
1151		dprintk(vc->dev, 4, "%s 50 Hz\n", __func__);
1152		if (mode.format != FORMAT_PAL) {
1153			mode.restart = 1;
1154			mode.format = FORMAT_PAL;
1155			mode.fdec = FDEC_1;
1156			vc->width = LINE_SZ_4CIFS_PAL;
1157			vc->height = NUM_LINES_4CIFS_PAL * 2;
1158		}
1159	} else
1160		return -EINVAL;
1161	vc->std = i;
1162	if (mode.restart)
1163		s2255_set_mode(vc, &mode);
1164	return 0;
1165}
1166
1167static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
1168{
1169	struct s2255_vc *vc = video_drvdata(file);
1170
1171	*i = vc->std;
1172	return 0;
1173}
1174
1175/* Sensoray 2255 is a multiple channel capture device.
1176   It does not have a "crossbar" of inputs.
1177   We use one V4L device per channel. The user must
1178   be aware that certain combinations are not allowed.
1179   For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1180   at once in color(you can do full fps on 4 channels with greyscale.
1181*/
1182static int vidioc_enum_input(struct file *file, void *priv,
1183			     struct v4l2_input *inp)
1184{
1185	struct s2255_vc *vc = video_drvdata(file);
1186	struct s2255_dev *dev = vc->dev;
1187	u32 status = 0;
1188
1189	if (inp->index != 0)
1190		return -EINVAL;
1191	inp->type = V4L2_INPUT_TYPE_CAMERA;
1192	inp->std = S2255_NORMS;
1193	inp->status = 0;
1194	if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1195		int rc;
1196		rc = s2255_cmd_status(vc, &status);
1197		dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
1198			rc, status);
1199		if (rc == 0)
1200			inp->status =  (status & 0x01) ? 0
1201				: V4L2_IN_ST_NO_SIGNAL;
1202	}
1203	switch (dev->pid) {
1204	case 0x2255:
1205	default:
1206		strlcpy(inp->name, "Composite", sizeof(inp->name));
1207		break;
1208	case 0x2257:
1209		strlcpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
1210			sizeof(inp->name));
1211		break;
1212	}
1213	return 0;
1214}
1215
1216static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1217{
1218	*i = 0;
1219	return 0;
1220}
1221static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1222{
1223	if (i > 0)
1224		return -EINVAL;
1225	return 0;
1226}
1227
1228static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
1229{
1230	struct s2255_vc *vc =
1231		container_of(ctrl->handler, struct s2255_vc, hdl);
1232	struct s2255_mode mode;
1233	mode = vc->mode;
1234	/* update the mode to the corresponding value */
1235	switch (ctrl->id) {
1236	case V4L2_CID_BRIGHTNESS:
1237		mode.bright = ctrl->val;
1238		break;
1239	case V4L2_CID_CONTRAST:
1240		mode.contrast = ctrl->val;
1241		break;
1242	case V4L2_CID_HUE:
1243		mode.hue = ctrl->val;
1244		break;
1245	case V4L2_CID_SATURATION:
1246		mode.saturation = ctrl->val;
1247		break;
1248	case V4L2_CID_S2255_COLORFILTER:
1249		mode.color &= ~MASK_INPUT_TYPE;
1250		mode.color |= !ctrl->val << 16;
1251		break;
1252	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1253		vc->jpegqual = ctrl->val;
1254		return 0;
1255	default:
1256		return -EINVAL;
1257	}
1258	mode.restart = 0;
1259	/* set mode here.  Note: stream does not need restarted.
1260	   some V4L programs restart stream unnecessarily
1261	   after a s_crtl.
1262	*/
1263	s2255_set_mode(vc, &mode);
1264	return 0;
1265}
1266
1267static int vidioc_g_jpegcomp(struct file *file, void *priv,
1268			 struct v4l2_jpegcompression *jc)
1269{
1270	struct s2255_vc *vc = video_drvdata(file);
1271
1272	memset(jc, 0, sizeof(*jc));
1273	jc->quality = vc->jpegqual;
1274	dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1275	return 0;
1276}
1277
1278static int vidioc_s_jpegcomp(struct file *file, void *priv,
1279			 const struct v4l2_jpegcompression *jc)
1280{
1281	struct s2255_vc *vc = video_drvdata(file);
1282
1283	if (jc->quality < 0 || jc->quality > 100)
1284		return -EINVAL;
1285	v4l2_ctrl_s_ctrl(vc->jpegqual_ctrl, jc->quality);
1286	dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1287	return 0;
1288}
1289
1290static int vidioc_g_parm(struct file *file, void *priv,
1291			 struct v4l2_streamparm *sp)
1292{
1293	__u32 def_num, def_dem;
1294	struct s2255_vc *vc = video_drvdata(file);
1295
1296	if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1297		return -EINVAL;
1298	sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1299	sp->parm.capture.capturemode = vc->cap_parm.capturemode;
1300	sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1301	def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1302	def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1303	sp->parm.capture.timeperframe.denominator = def_dem;
1304	switch (vc->mode.fdec) {
1305	default:
1306	case FDEC_1:
1307		sp->parm.capture.timeperframe.numerator = def_num;
1308		break;
1309	case FDEC_2:
1310		sp->parm.capture.timeperframe.numerator = def_num * 2;
1311		break;
1312	case FDEC_3:
1313		sp->parm.capture.timeperframe.numerator = def_num * 3;
1314		break;
1315	case FDEC_5:
1316		sp->parm.capture.timeperframe.numerator = def_num * 5;
1317		break;
1318	}
1319	dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
1320		__func__,
1321		sp->parm.capture.capturemode,
1322		sp->parm.capture.timeperframe.numerator,
1323		sp->parm.capture.timeperframe.denominator);
1324	return 0;
1325}
1326
1327static int vidioc_s_parm(struct file *file, void *priv,
1328			 struct v4l2_streamparm *sp)
1329{
1330	struct s2255_vc *vc = video_drvdata(file);
1331	struct s2255_mode mode;
1332	int fdec = FDEC_1;
1333	__u32 def_num, def_dem;
1334	if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1335		return -EINVAL;
1336	mode = vc->mode;
1337	/* high quality capture mode requires a stream restart */
1338	if ((vc->cap_parm.capturemode != sp->parm.capture.capturemode)
1339	    && vb2_is_streaming(&vc->vb_vidq))
1340		return -EBUSY;
1341	def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
1342	def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
1343	if (def_dem != sp->parm.capture.timeperframe.denominator)
1344		sp->parm.capture.timeperframe.numerator = def_num;
1345	else if (sp->parm.capture.timeperframe.numerator <= def_num)
1346		sp->parm.capture.timeperframe.numerator = def_num;
1347	else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
1348		sp->parm.capture.timeperframe.numerator = def_num * 2;
1349		fdec = FDEC_2;
1350	} else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
1351		sp->parm.capture.timeperframe.numerator = def_num * 3;
1352		fdec = FDEC_3;
1353	} else {
1354		sp->parm.capture.timeperframe.numerator = def_num * 5;
1355		fdec = FDEC_5;
1356	}
1357	mode.fdec = fdec;
1358	sp->parm.capture.timeperframe.denominator = def_dem;
1359	sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1360	s2255_set_mode(vc, &mode);
1361	dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1362		__func__,
1363		sp->parm.capture.capturemode,
1364		sp->parm.capture.timeperframe.numerator,
1365		sp->parm.capture.timeperframe.denominator, fdec);
1366	return 0;
1367}
1368
1369#define NUM_SIZE_ENUMS 3
1370static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1371	{ 640, 480 },
1372	{ 640, 240 },
1373	{ 320, 240 },
1374};
1375static const struct v4l2_frmsize_discrete pal_sizes[] = {
1376	{ 704, 576 },
1377	{ 704, 288 },
1378	{ 352, 288 },
1379};
1380
1381static int vidioc_enum_framesizes(struct file *file, void *priv,
1382			    struct v4l2_frmsizeenum *fe)
1383{
1384	struct s2255_vc *vc = video_drvdata(file);
1385	int is_ntsc = vc->std & V4L2_STD_525_60;
1386	const struct s2255_fmt *fmt;
1387
1388	if (fe->index >= NUM_SIZE_ENUMS)
1389		return -EINVAL;
1390
1391	fmt = format_by_fourcc(fe->pixel_format);
1392	if (fmt == NULL)
1393		return -EINVAL;
1394	fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1395	fe->discrete = is_ntsc ?  ntsc_sizes[fe->index] : pal_sizes[fe->index];
1396	return 0;
1397}
1398
1399static int vidioc_enum_frameintervals(struct file *file, void *priv,
1400			    struct v4l2_frmivalenum *fe)
1401{
1402	struct s2255_vc *vc = video_drvdata(file);
1403	const struct s2255_fmt *fmt;
1404	const struct v4l2_frmsize_discrete *sizes;
1405	int is_ntsc = vc->std & V4L2_STD_525_60;
1406#define NUM_FRAME_ENUMS 4
1407	int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1408	int i;
1409
1410	if (fe->index >= NUM_FRAME_ENUMS)
1411		return -EINVAL;
1412
1413	fmt = format_by_fourcc(fe->pixel_format);
1414	if (fmt == NULL)
1415		return -EINVAL;
1416
1417	sizes = is_ntsc ? ntsc_sizes : pal_sizes;
1418	for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
1419		if (fe->width == sizes->width &&
1420		    fe->height == sizes->height)
1421			break;
1422	if (i == NUM_SIZE_ENUMS)
1423		return -EINVAL;
1424
1425	fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1426	fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1427	fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1428	dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
1429		fe->discrete.numerator,
1430		fe->discrete.denominator);
1431	return 0;
1432}
1433
1434static int s2255_open(struct file *file)
1435{
1436	struct s2255_vc *vc = video_drvdata(file);
1437	struct s2255_dev *dev = vc->dev;
1438	int state;
1439	int rc = 0;
1440
1441	rc = v4l2_fh_open(file);
1442	if (rc != 0)
1443		return rc;
1444
1445	dprintk(dev, 1, "s2255: %s\n", __func__);
1446	state = atomic_read(&dev->fw_data->fw_state);
1447	switch (state) {
1448	case S2255_FW_DISCONNECTING:
1449		return -ENODEV;
1450	case S2255_FW_FAILED:
1451		s2255_dev_err(&dev->udev->dev,
1452			"firmware load failed. retrying.\n");
1453		s2255_fwload_start(dev, 1);
1454		wait_event_timeout(dev->fw_data->wait_fw,
1455				   ((atomic_read(&dev->fw_data->fw_state)
1456				     == S2255_FW_SUCCESS) ||
1457				    (atomic_read(&dev->fw_data->fw_state)
1458				     == S2255_FW_DISCONNECTING)),
1459				   msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1460		/* state may have changed, re-read */
1461		state = atomic_read(&dev->fw_data->fw_state);
1462		break;
1463	case S2255_FW_NOTLOADED:
1464	case S2255_FW_LOADED_DSPWAIT:
1465		/* give S2255_LOAD_TIMEOUT time for firmware to load in case
1466		   driver loaded and then device immediately opened */
1467		pr_info("%s waiting for firmware load\n", __func__);
1468		wait_event_timeout(dev->fw_data->wait_fw,
1469				   ((atomic_read(&dev->fw_data->fw_state)
1470				     == S2255_FW_SUCCESS) ||
1471				    (atomic_read(&dev->fw_data->fw_state)
1472				     == S2255_FW_DISCONNECTING)),
1473				   msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1474		/* state may have changed, re-read */
1475		state = atomic_read(&dev->fw_data->fw_state);
1476		break;
1477	case S2255_FW_SUCCESS:
1478	default:
1479		break;
1480	}
1481	/* state may have changed in above switch statement */
1482	switch (state) {
1483	case S2255_FW_SUCCESS:
1484		break;
1485	case S2255_FW_FAILED:
1486		pr_info("2255 firmware load failed.\n");
1487		return -ENODEV;
1488	case S2255_FW_DISCONNECTING:
1489		pr_info("%s: disconnecting\n", __func__);
1490		return -ENODEV;
1491	case S2255_FW_LOADED_DSPWAIT:
1492	case S2255_FW_NOTLOADED:
1493		pr_info("%s: firmware not loaded, please retry\n",
1494			__func__);
1495		/*
1496		 * Timeout on firmware load means device unusable.
1497		 * Set firmware failure state.
1498		 * On next s2255_open the firmware will be reloaded.
1499		 */
1500		atomic_set(&dev->fw_data->fw_state,
1501			   S2255_FW_FAILED);
1502		return -EAGAIN;
1503	default:
1504		pr_info("%s: unknown state\n", __func__);
1505		return -EFAULT;
1506	}
1507	if (!vc->configured) {
1508		/* configure channel to default state */
1509		vc->fmt = &formats[0];
1510		s2255_set_mode(vc, &vc->mode);
1511		vc->configured = 1;
1512	}
1513	return 0;
1514}
1515
1516static void s2255_destroy(struct s2255_dev *dev)
1517{
1518	dprintk(dev, 1, "%s", __func__);
1519	/* board shutdown stops the read pipe if it is running */
1520	s2255_board_shutdown(dev);
1521	/* make sure firmware still not trying to load */
1522	del_timer_sync(&dev->timer);  /* only started in .probe and .open */
1523	if (dev->fw_data->fw_urb) {
1524		usb_kill_urb(dev->fw_data->fw_urb);
1525		usb_free_urb(dev->fw_data->fw_urb);
1526		dev->fw_data->fw_urb = NULL;
1527	}
1528	release_firmware(dev->fw_data->fw);
1529	kfree(dev->fw_data->pfw_data);
1530	kfree(dev->fw_data);
1531	/* reset the DSP so firmware can be reloaded next time */
1532	s2255_reset_dsppower(dev);
1533	mutex_destroy(&dev->lock);
1534	usb_put_dev(dev->udev);
1535	v4l2_device_unregister(&dev->v4l2_dev);
1536	kfree(dev->cmdbuf);
1537	kfree(dev);
1538}
1539
1540static const struct v4l2_file_operations s2255_fops_v4l = {
1541	.owner = THIS_MODULE,
1542	.open = s2255_open,
1543	.release = vb2_fop_release,
1544	.poll = vb2_fop_poll,
1545	.unlocked_ioctl = video_ioctl2,	/* V4L2 ioctl handler */
1546	.mmap = vb2_fop_mmap,
1547	.read = vb2_fop_read,
1548};
1549
1550static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1551	.vidioc_querycap = vidioc_querycap,
1552	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1553	.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1554	.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1555	.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1556	.vidioc_reqbufs = vb2_ioctl_reqbufs,
1557	.vidioc_querybuf = vb2_ioctl_querybuf,
1558	.vidioc_qbuf = vb2_ioctl_qbuf,
1559	.vidioc_dqbuf = vb2_ioctl_dqbuf,
1560	.vidioc_s_std = vidioc_s_std,
1561	.vidioc_g_std = vidioc_g_std,
1562	.vidioc_enum_input = vidioc_enum_input,
1563	.vidioc_g_input = vidioc_g_input,
1564	.vidioc_s_input = vidioc_s_input,
1565	.vidioc_streamon = vb2_ioctl_streamon,
1566	.vidioc_streamoff = vb2_ioctl_streamoff,
1567	.vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1568	.vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1569	.vidioc_s_parm = vidioc_s_parm,
1570	.vidioc_g_parm = vidioc_g_parm,
1571	.vidioc_enum_framesizes = vidioc_enum_framesizes,
1572	.vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1573	.vidioc_log_status  = v4l2_ctrl_log_status,
1574	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1575	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1576};
1577
1578static void s2255_video_device_release(struct video_device *vdev)
1579{
1580	struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
1581	struct s2255_vc *vc =
1582		container_of(vdev, struct s2255_vc, vdev);
1583
1584	dprintk(dev, 4, "%s, chnls: %d\n", __func__,
1585		atomic_read(&dev->num_channels));
1586
1587	v4l2_ctrl_handler_free(&vc->hdl);
1588
1589	if (atomic_dec_and_test(&dev->num_channels))
1590		s2255_destroy(dev);
1591	return;
1592}
1593
1594static struct video_device template = {
1595	.name = "s2255v",
1596	.fops = &s2255_fops_v4l,
1597	.ioctl_ops = &s2255_ioctl_ops,
1598	.release = s2255_video_device_release,
1599	.tvnorms = S2255_NORMS,
1600};
1601
1602static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1603	.s_ctrl = s2255_s_ctrl,
1604};
1605
1606static const struct v4l2_ctrl_config color_filter_ctrl = {
1607	.ops = &s2255_ctrl_ops,
1608	.name = "Color Filter",
1609	.id = V4L2_CID_S2255_COLORFILTER,
1610	.type = V4L2_CTRL_TYPE_BOOLEAN,
1611	.max = 1,
1612	.step = 1,
1613	.def = 1,
1614};
1615
1616static int s2255_probe_v4l(struct s2255_dev *dev)
1617{
1618	int ret;
1619	int i;
1620	int cur_nr = video_nr;
1621	struct s2255_vc *vc;
1622	struct vb2_queue *q;
1623
1624	ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
1625	if (ret)
1626		return ret;
1627	/* initialize all video 4 linux */
1628	/* register 4 video devices */
1629	for (i = 0; i < MAX_CHANNELS; i++) {
1630		vc = &dev->vc[i];
1631		INIT_LIST_HEAD(&vc->buf_list);
1632
1633		v4l2_ctrl_handler_init(&vc->hdl, 6);
1634		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1635				V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
1636		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1637				V4L2_CID_CONTRAST, 0, 255, 1, DEF_CONTRAST);
1638		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1639				V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION);
1640		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1641				V4L2_CID_HUE, 0, 255, 1, DEF_HUE);
1642		vc->jpegqual_ctrl = v4l2_ctrl_new_std(&vc->hdl,
1643				&s2255_ctrl_ops,
1644				V4L2_CID_JPEG_COMPRESSION_QUALITY,
1645				0, 100, 1, S2255_DEF_JPEG_QUAL);
1646		if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER &&
1647		    (dev->pid != 0x2257 || vc->idx <= 1))
1648			v4l2_ctrl_new_custom(&vc->hdl, &color_filter_ctrl,
1649					     NULL);
1650		if (vc->hdl.error) {
1651			ret = vc->hdl.error;
1652			v4l2_ctrl_handler_free(&vc->hdl);
1653			dev_err(&dev->udev->dev, "couldn't register control\n");
1654			break;
1655		}
1656		q = &vc->vb_vidq;
1657		q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1658		q->io_modes = VB2_MMAP | VB2_READ | VB2_USERPTR;
1659		q->drv_priv = vc;
1660		q->lock = &vc->vb_lock;
1661		q->buf_struct_size = sizeof(struct s2255_buffer);
1662		q->mem_ops = &vb2_vmalloc_memops;
1663		q->ops = &s2255_video_qops;
1664		q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1665		ret = vb2_queue_init(q);
1666		if (ret != 0) {
1667			dev_err(&dev->udev->dev,
1668				"%s vb2_queue_init 0x%x\n", __func__, ret);
1669			break;
1670		}
1671		/* register video devices */
1672		vc->vdev = template;
1673		vc->vdev.queue = q;
1674		vc->vdev.ctrl_handler = &vc->hdl;
1675		vc->vdev.lock = &dev->lock;
1676		vc->vdev.v4l2_dev = &dev->v4l2_dev;
1677		video_set_drvdata(&vc->vdev, vc);
1678		if (video_nr == -1)
1679			ret = video_register_device(&vc->vdev,
1680						    VFL_TYPE_GRABBER,
1681						    video_nr);
1682		else
1683			ret = video_register_device(&vc->vdev,
1684						    VFL_TYPE_GRABBER,
1685						    cur_nr + i);
1686
1687		if (ret) {
1688			dev_err(&dev->udev->dev,
1689				"failed to register video device!\n");
1690			break;
1691		}
1692		atomic_inc(&dev->num_channels);
1693		v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1694			  video_device_node_name(&vc->vdev));
1695
1696	}
1697	pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1698		S2255_VERSION);
1699	/* if no channels registered, return error and probe will fail*/
1700	if (atomic_read(&dev->num_channels) == 0) {
1701		v4l2_device_unregister(&dev->v4l2_dev);
1702		return ret;
1703	}
1704	if (atomic_read(&dev->num_channels) != MAX_CHANNELS)
1705		pr_warn("s2255: Not all channels available.\n");
1706	return 0;
1707}
1708
1709/* this function moves the usb stream read pipe data
1710 * into the system buffers.
1711 * returns 0 on success, EAGAIN if more data to process( call this
1712 * function again).
1713 *
1714 * Received frame structure:
1715 * bytes 0-3:  marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1716 * bytes 4-7:  channel: 0-3
1717 * bytes 8-11: payload size:  size of the frame
1718 * bytes 12-payloadsize+12:  frame data
1719 */
1720static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1721{
1722	char *pdest;
1723	u32 offset = 0;
1724	int bframe = 0;
1725	char *psrc;
1726	unsigned long copy_size;
1727	unsigned long size;
1728	s32 idx = -1;
1729	struct s2255_framei *frm;
1730	unsigned char *pdata;
1731	struct s2255_vc *vc;
1732	dprintk(dev, 100, "buffer to user\n");
1733	vc = &dev->vc[dev->cc];
1734	idx = vc->cur_frame;
1735	frm = &vc->buffer.frame[idx];
1736	if (frm->ulState == S2255_READ_IDLE) {
1737		int jj;
1738		unsigned int cc;
1739		__le32 *pdword; /*data from dsp is little endian */
1740		int payload;
1741		/* search for marker codes */
1742		pdata = (unsigned char *)pipe_info->transfer_buffer;
1743		pdword = (__le32 *)pdata;
1744		for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
1745			switch (*pdword) {
1746			case S2255_MARKER_FRAME:
1747				dprintk(dev, 4, "marker @ offset: %d [%x %x]\n",
1748					jj, pdata[0], pdata[1]);
1749				offset = jj + PREFIX_SIZE;
1750				bframe = 1;
1751				cc = le32_to_cpu(pdword[1]);
1752				if (cc >= MAX_CHANNELS) {
1753					dprintk(dev, 0,
1754						"bad channel\n");
1755					return -EINVAL;
1756				}
1757				/* reverse it */
1758				dev->cc = G_chnmap[cc];
1759				vc = &dev->vc[dev->cc];
1760				payload =  le32_to_cpu(pdword[3]);
1761				if (payload > vc->req_image_size) {
1762					vc->bad_payload++;
1763					/* discard the bad frame */
1764					return -EINVAL;
1765				}
1766				vc->pkt_size = payload;
1767				vc->jpg_size = le32_to_cpu(pdword[4]);
1768				break;
1769			case S2255_MARKER_RESPONSE:
1770
1771				pdata += DEF_USB_BLOCK;
1772				jj += DEF_USB_BLOCK;
1773				if (le32_to_cpu(pdword[1]) >= MAX_CHANNELS)
1774					break;
1775				cc = G_chnmap[le32_to_cpu(pdword[1])];
1776				if (cc >= MAX_CHANNELS)
1777					break;
1778				vc = &dev->vc[cc];
1779				switch (pdword[2]) {
1780				case S2255_RESPONSE_SETMODE:
1781					/* check if channel valid */
1782					/* set mode ready */
1783					vc->setmode_ready = 1;
1784					wake_up(&vc->wait_setmode);
1785					dprintk(dev, 5, "setmode rdy %d\n", cc);
1786					break;
1787				case S2255_RESPONSE_FW:
1788					dev->chn_ready |= (1 << cc);
1789					if ((dev->chn_ready & 0x0f) != 0x0f)
1790						break;
1791					/* all channels ready */
1792					pr_info("s2255: fw loaded\n");
1793					atomic_set(&dev->fw_data->fw_state,
1794						   S2255_FW_SUCCESS);
1795					wake_up(&dev->fw_data->wait_fw);
1796					break;
1797				case S2255_RESPONSE_STATUS:
1798					vc->vidstatus = le32_to_cpu(pdword[3]);
1799					vc->vidstatus_ready = 1;
1800					wake_up(&vc->wait_vidstatus);
1801					dprintk(dev, 5, "vstat %x chan %d\n",
1802						le32_to_cpu(pdword[3]), cc);
1803					break;
1804				default:
1805					pr_info("s2255 unknown resp\n");
1806				}
1807			default:
1808				pdata++;
1809				break;
1810			}
1811			if (bframe)
1812				break;
1813		} /* for */
1814		if (!bframe)
1815			return -EINVAL;
1816	}
1817	vc = &dev->vc[dev->cc];
1818	idx = vc->cur_frame;
1819	frm = &vc->buffer.frame[idx];
1820	/* search done.  now find out if should be acquiring on this channel */
1821	if (!vb2_is_streaming(&vc->vb_vidq)) {
1822		/* we found a frame, but this channel is turned off */
1823		frm->ulState = S2255_READ_IDLE;
1824		return -EINVAL;
1825	}
1826
1827	if (frm->ulState == S2255_READ_IDLE) {
1828		frm->ulState = S2255_READ_FRAME;
1829		frm->cur_size = 0;
1830	}
1831
1832	/* skip the marker 512 bytes (and offset if out of sync) */
1833	psrc = (u8 *)pipe_info->transfer_buffer + offset;
1834
1835
1836	if (frm->lpvbits == NULL) {
1837		dprintk(dev, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1838			frm, dev, dev->cc, idx);
1839		return -ENOMEM;
1840	}
1841
1842	pdest = frm->lpvbits + frm->cur_size;
1843
1844	copy_size = (pipe_info->cur_transfer_size - offset);
1845
1846	size = vc->pkt_size - PREFIX_SIZE;
1847
1848	/* sanity check on pdest */
1849	if ((copy_size + frm->cur_size) < vc->req_image_size)
1850		memcpy(pdest, psrc, copy_size);
1851
1852	frm->cur_size += copy_size;
1853	dprintk(dev, 4, "cur_size: %lu, size: %lu\n", frm->cur_size, size);
1854
1855	if (frm->cur_size >= size) {
1856		dprintk(dev, 2, "******[%d]Buffer[%d]full*******\n",
1857			dev->cc, idx);
1858		vc->last_frame = vc->cur_frame;
1859		vc->cur_frame++;
1860		/* end of system frame ring buffer, start at zero */
1861		if ((vc->cur_frame == SYS_FRAMES) ||
1862		    (vc->cur_frame == vc->buffer.dwFrames))
1863			vc->cur_frame = 0;
1864		/* frame ready */
1865		if (vb2_is_streaming(&vc->vb_vidq))
1866			s2255_got_frame(vc, vc->jpg_size);
1867		vc->frame_count++;
1868		frm->ulState = S2255_READ_IDLE;
1869		frm->cur_size = 0;
1870
1871	}
1872	/* done successfully */
1873	return 0;
1874}
1875
1876static void s2255_read_video_callback(struct s2255_dev *dev,
1877				      struct s2255_pipeinfo *pipe_info)
1878{
1879	int res;
1880	dprintk(dev, 50, "callback read video\n");
1881
1882	if (dev->cc >= MAX_CHANNELS) {
1883		dev->cc = 0;
1884		dev_err(&dev->udev->dev, "invalid channel\n");
1885		return;
1886	}
1887	/* otherwise copy to the system buffers */
1888	res = save_frame(dev, pipe_info);
1889	if (res != 0)
1890		dprintk(dev, 4, "s2255: read callback failed\n");
1891
1892	dprintk(dev, 50, "callback read video done\n");
1893	return;
1894}
1895
1896static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
1897			     u16 Index, u16 Value, void *TransferBuffer,
1898			     s32 TransferBufferLength, int bOut)
1899{
1900	int r;
1901	if (!bOut) {
1902		r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1903				    Request,
1904				    USB_TYPE_VENDOR | USB_RECIP_DEVICE |
1905				    USB_DIR_IN,
1906				    Value, Index, TransferBuffer,
1907				    TransferBufferLength, HZ * 5);
1908	} else {
1909		r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1910				    Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1911				    Value, Index, TransferBuffer,
1912				    TransferBufferLength, HZ * 5);
1913	}
1914	return r;
1915}
1916
1917/*
1918 * retrieve FX2 firmware version. future use.
1919 * @param dev pointer to device extension
1920 * @return -1 for fail, else returns firmware version as an int(16 bits)
1921 */
1922static int s2255_get_fx2fw(struct s2255_dev *dev)
1923{
1924	int fw;
1925	int ret;
1926	unsigned char transBuffer[64];
1927	ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer, 2,
1928			       S2255_VR_IN);
1929	if (ret < 0)
1930		dprintk(dev, 2, "get fw error: %x\n", ret);
1931	fw = transBuffer[0] + (transBuffer[1] << 8);
1932	dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
1933	return fw;
1934}
1935
1936/*
1937 * Create the system ring buffer to copy frames into from the
1938 * usb read pipe.
1939 */
1940static int s2255_create_sys_buffers(struct s2255_vc *vc)
1941{
1942	unsigned long i;
1943	unsigned long reqsize;
1944	vc->buffer.dwFrames = SYS_FRAMES;
1945	/* always allocate maximum size(PAL) for system buffers */
1946	reqsize = SYS_FRAMES_MAXSIZE;
1947
1948	if (reqsize > SYS_FRAMES_MAXSIZE)
1949		reqsize = SYS_FRAMES_MAXSIZE;
1950
1951	for (i = 0; i < SYS_FRAMES; i++) {
1952		/* allocate the frames */
1953		vc->buffer.frame[i].lpvbits = vmalloc(reqsize);
1954		vc->buffer.frame[i].size = reqsize;
1955		if (vc->buffer.frame[i].lpvbits == NULL) {
1956			pr_info("out of memory.  using less frames\n");
1957			vc->buffer.dwFrames = i;
1958			break;
1959		}
1960	}
1961
1962	/* make sure internal states are set */
1963	for (i = 0; i < SYS_FRAMES; i++) {
1964		vc->buffer.frame[i].ulState = 0;
1965		vc->buffer.frame[i].cur_size = 0;
1966	}
1967
1968	vc->cur_frame = 0;
1969	vc->last_frame = -1;
1970	return 0;
1971}
1972
1973static int s2255_release_sys_buffers(struct s2255_vc *vc)
1974{
1975	unsigned long i;
1976	for (i = 0; i < SYS_FRAMES; i++) {
1977		vfree(vc->buffer.frame[i].lpvbits);
1978		vc->buffer.frame[i].lpvbits = NULL;
1979	}
1980	return 0;
1981}
1982
1983static int s2255_board_init(struct s2255_dev *dev)
1984{
1985	struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
1986	int fw_ver;
1987	int j;
1988	struct s2255_pipeinfo *pipe = &dev->pipe;
1989	dprintk(dev, 4, "board init: %p", dev);
1990	memset(pipe, 0, sizeof(*pipe));
1991	pipe->dev = dev;
1992	pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
1993	pipe->max_transfer_size = S2255_USB_XFER_SIZE;
1994
1995	pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
1996					GFP_KERNEL);
1997	if (pipe->transfer_buffer == NULL) {
1998		dprintk(dev, 1, "out of memory!\n");
1999		return -ENOMEM;
2000	}
2001	/* query the firmware */
2002	fw_ver = s2255_get_fx2fw(dev);
2003
2004	pr_info("s2255: usb firmware version %d.%d\n",
2005		(fw_ver >> 8) & 0xff,
2006		fw_ver & 0xff);
2007
2008	if (fw_ver < S2255_CUR_USB_FWVER)
2009		pr_info("s2255: newer USB firmware available\n");
2010
2011	for (j = 0; j < MAX_CHANNELS; j++) {
2012		struct s2255_vc *vc = &dev->vc[j];
2013		vc->mode = mode_def;
2014		if (dev->pid == 0x2257 && j > 1)
2015			vc->mode.color |= (1 << 16);
2016		vc->jpegqual = S2255_DEF_JPEG_QUAL;
2017		vc->width = LINE_SZ_4CIFS_NTSC;
2018		vc->height = NUM_LINES_4CIFS_NTSC * 2;
2019		vc->std = V4L2_STD_NTSC_M;
2020		vc->fmt = &formats[0];
2021		vc->mode.restart = 1;
2022		vc->req_image_size = get_transfer_size(&mode_def);
2023		vc->frame_count = 0;
2024		/* create the system buffers */
2025		s2255_create_sys_buffers(vc);
2026	}
2027	/* start read pipe */
2028	s2255_start_readpipe(dev);
2029	dprintk(dev, 1, "%s: success\n", __func__);
2030	return 0;
2031}
2032
2033static int s2255_board_shutdown(struct s2255_dev *dev)
2034{
2035	u32 i;
2036	dprintk(dev, 1, "%s: dev: %p", __func__,  dev);
2037
2038	for (i = 0; i < MAX_CHANNELS; i++) {
2039		if (vb2_is_streaming(&dev->vc[i].vb_vidq))
2040			s2255_stop_acquire(&dev->vc[i]);
2041	}
2042	s2255_stop_readpipe(dev);
2043	for (i = 0; i < MAX_CHANNELS; i++)
2044		s2255_release_sys_buffers(&dev->vc[i]);
2045	/* release transfer buffer */
2046	kfree(dev->pipe.transfer_buffer);
2047	return 0;
2048}
2049
2050static void read_pipe_completion(struct urb *purb)
2051{
2052	struct s2255_pipeinfo *pipe_info;
2053	struct s2255_dev *dev;
2054	int status;
2055	int pipe;
2056	pipe_info = purb->context;
2057	if (pipe_info == NULL) {
2058		dev_err(&purb->dev->dev, "no context!\n");
2059		return;
2060	}
2061	dev = pipe_info->dev;
2062	if (dev == NULL) {
2063		dev_err(&purb->dev->dev, "no context!\n");
2064		return;
2065	}
2066	status = purb->status;
2067	/* if shutting down, do not resubmit, exit immediately */
2068	if (status == -ESHUTDOWN) {
2069		dprintk(dev, 2, "%s: err shutdown\n", __func__);
2070		pipe_info->err_count++;
2071		return;
2072	}
2073
2074	if (pipe_info->state == 0) {
2075		dprintk(dev, 2, "%s: exiting USB pipe", __func__);
2076		return;
2077	}
2078
2079	if (status == 0)
2080		s2255_read_video_callback(dev, pipe_info);
2081	else {
2082		pipe_info->err_count++;
2083		dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
2084	}
2085
2086	pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2087	/* reuse urb */
2088	usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2089			  pipe,
2090			  pipe_info->transfer_buffer,
2091			  pipe_info->cur_transfer_size,
2092			  read_pipe_completion, pipe_info);
2093
2094	if (pipe_info->state != 0) {
2095		if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC))
2096			dev_err(&dev->udev->dev, "error submitting urb\n");
2097	} else {
2098		dprintk(dev, 2, "%s :complete state 0\n", __func__);
2099	}
2100	return;
2101}
2102
2103static int s2255_start_readpipe(struct s2255_dev *dev)
2104{
2105	int pipe;
2106	int retval;
2107	struct s2255_pipeinfo *pipe_info = &dev->pipe;
2108	pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2109	dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
2110	pipe_info->state = 1;
2111	pipe_info->err_count = 0;
2112	pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
2113	if (!pipe_info->stream_urb) {
2114		dev_err(&dev->udev->dev,
2115			"ReadStream: Unable to alloc URB\n");
2116		return -ENOMEM;
2117	}
2118	/* transfer buffer allocated in board_init */
2119	usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2120			  pipe,
2121			  pipe_info->transfer_buffer,
2122			  pipe_info->cur_transfer_size,
2123			  read_pipe_completion, pipe_info);
2124	retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
2125	if (retval) {
2126		pr_err("s2255: start read pipe failed\n");
2127		return retval;
2128	}
2129	return 0;
2130}
2131
2132/* starts acquisition process */
2133static int s2255_start_acquire(struct s2255_vc *vc)
2134{
2135	int res;
2136	unsigned long chn_rev;
2137	int j;
2138	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2139	__le32 *buffer = dev->cmdbuf;
2140
2141	mutex_lock(&dev->cmdlock);
2142	chn_rev = G_chnmap[vc->idx];
2143	vc->last_frame = -1;
2144	vc->bad_payload = 0;
2145	vc->cur_frame = 0;
2146	for (j = 0; j < SYS_FRAMES; j++) {
2147		vc->buffer.frame[j].ulState = 0;
2148		vc->buffer.frame[j].cur_size = 0;
2149	}
2150
2151	/* send the start command */
2152	buffer[0] = IN_DATA_TOKEN;
2153	buffer[1] = (__le32) cpu_to_le32(chn_rev);
2154	buffer[2] = CMD_START;
2155	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2156	if (res != 0)
2157		dev_err(&dev->udev->dev, "CMD_START error\n");
2158
2159	dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
2160	mutex_unlock(&dev->cmdlock);
2161	return res;
2162}
2163
2164static int s2255_stop_acquire(struct s2255_vc *vc)
2165{
2166	int res;
2167	unsigned long chn_rev;
2168	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2169	__le32 *buffer = dev->cmdbuf;
2170
2171	mutex_lock(&dev->cmdlock);
2172	chn_rev = G_chnmap[vc->idx];
2173	/* send the stop command */
2174	buffer[0] = IN_DATA_TOKEN;
2175	buffer[1] = (__le32) cpu_to_le32(chn_rev);
2176	buffer[2] = CMD_STOP;
2177
2178	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2179	if (res != 0)
2180		dev_err(&dev->udev->dev, "CMD_STOP error\n");
2181
2182	dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
2183	mutex_unlock(&dev->cmdlock);
2184	return res;
2185}
2186
2187static void s2255_stop_readpipe(struct s2255_dev *dev)
2188{
2189	struct s2255_pipeinfo *pipe = &dev->pipe;
2190
2191	pipe->state = 0;
2192	if (pipe->stream_urb) {
2193		/* cancel urb */
2194		usb_kill_urb(pipe->stream_urb);
2195		usb_free_urb(pipe->stream_urb);
2196		pipe->stream_urb = NULL;
2197	}
2198	dprintk(dev, 4, "%s", __func__);
2199	return;
2200}
2201
2202static void s2255_fwload_start(struct s2255_dev *dev, int reset)
2203{
2204	if (reset)
2205		s2255_reset_dsppower(dev);
2206	dev->fw_data->fw_size = dev->fw_data->fw->size;
2207	atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2208	memcpy(dev->fw_data->pfw_data,
2209	       dev->fw_data->fw->data, CHUNK_SIZE);
2210	dev->fw_data->fw_loaded = CHUNK_SIZE;
2211	usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
2212			  usb_sndbulkpipe(dev->udev, 2),
2213			  dev->fw_data->pfw_data,
2214			  CHUNK_SIZE, s2255_fwchunk_complete,
2215			  dev->fw_data);
2216	mod_timer(&dev->timer, jiffies + HZ);
2217}
2218
2219/* standard usb probe function */
2220static int s2255_probe(struct usb_interface *interface,
2221		       const struct usb_device_id *id)
2222{
2223	struct s2255_dev *dev = NULL;
2224	struct usb_host_interface *iface_desc;
2225	struct usb_endpoint_descriptor *endpoint;
2226	int i;
2227	int retval = -ENOMEM;
2228	__le32 *pdata;
2229	int fw_size;
2230
2231	/* allocate memory for our device state and initialize it to zero */
2232	dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
2233	if (dev == NULL) {
2234		s2255_dev_err(&interface->dev, "out of memory\n");
2235		return -ENOMEM;
2236	}
2237
2238	dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
2239	if (dev->cmdbuf == NULL) {
2240		s2255_dev_err(&interface->dev, "out of memory\n");
2241		goto errorFWDATA1;
2242	}
2243
2244	atomic_set(&dev->num_channels, 0);
2245	dev->pid = id->idProduct;
2246	dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
2247	if (!dev->fw_data)
2248		goto errorFWDATA1;
2249	mutex_init(&dev->lock);
2250	mutex_init(&dev->cmdlock);
2251	/* grab usb_device and save it */
2252	dev->udev = usb_get_dev(interface_to_usbdev(interface));
2253	if (dev->udev == NULL) {
2254		dev_err(&interface->dev, "null usb device\n");
2255		retval = -ENODEV;
2256		goto errorUDEV;
2257	}
2258	dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
2259		dev, dev->udev, interface);
2260	dev->interface = interface;
2261	/* set up the endpoint information  */
2262	iface_desc = interface->cur_altsetting;
2263	dev_dbg(&interface->dev, "num EP: %d\n",
2264		iface_desc->desc.bNumEndpoints);
2265	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2266		endpoint = &iface_desc->endpoint[i].desc;
2267		if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
2268			/* we found the bulk in endpoint */
2269			dev->read_endpoint = endpoint->bEndpointAddress;
2270		}
2271	}
2272
2273	if (!dev->read_endpoint) {
2274		dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2275		goto errorEP;
2276	}
2277	setup_timer(&dev->timer, s2255_timer, (unsigned long)dev->fw_data);
2278	init_waitqueue_head(&dev->fw_data->wait_fw);
2279	for (i = 0; i < MAX_CHANNELS; i++) {
2280		struct s2255_vc *vc = &dev->vc[i];
2281		vc->idx = i;
2282		vc->dev = dev;
2283		init_waitqueue_head(&vc->wait_setmode);
2284		init_waitqueue_head(&vc->wait_vidstatus);
2285		spin_lock_init(&vc->qlock);
2286		mutex_init(&vc->vb_lock);
2287	}
2288
2289	dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
2290	if (!dev->fw_data->fw_urb) {
2291		dev_err(&interface->dev, "out of memory!\n");
2292		goto errorFWURB;
2293	}
2294
2295	dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2296	if (!dev->fw_data->pfw_data) {
2297		dev_err(&interface->dev, "out of memory!\n");
2298		goto errorFWDATA2;
2299	}
2300	/* load the first chunk */
2301	if (request_firmware(&dev->fw_data->fw,
2302			     FIRMWARE_FILE_NAME, &dev->udev->dev)) {
2303		dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
2304		goto errorREQFW;
2305	}
2306	/* check the firmware is valid */
2307	fw_size = dev->fw_data->fw->size;
2308	pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2309
2310	if (*pdata != S2255_FW_MARKER) {
2311		dev_err(&interface->dev, "Firmware invalid.\n");
2312		retval = -ENODEV;
2313		goto errorFWMARKER;
2314	} else {
2315		/* make sure firmware is the latest */
2316		__le32 *pRel;
2317		pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2318		pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
2319		dev->dsp_fw_ver = le32_to_cpu(*pRel);
2320		if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
2321			pr_info("s2255: f2255usb.bin out of date.\n");
2322		if (dev->pid == 0x2257 &&
2323				dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
2324			pr_warn("2257 needs firmware %d or above.\n",
2325				S2255_MIN_DSP_COLORFILTER);
2326	}
2327	usb_reset_device(dev->udev);
2328	/* load 2255 board specific */
2329	retval = s2255_board_init(dev);
2330	if (retval)
2331		goto errorBOARDINIT;
2332	s2255_fwload_start(dev, 0);
2333	/* loads v4l specific */
2334	retval = s2255_probe_v4l(dev);
2335	if (retval)
2336		goto errorBOARDINIT;
2337	dev_info(&interface->dev, "Sensoray 2255 detected\n");
2338	return 0;
2339errorBOARDINIT:
2340	s2255_board_shutdown(dev);
2341errorFWMARKER:
2342	release_firmware(dev->fw_data->fw);
2343errorREQFW:
2344	kfree(dev->fw_data->pfw_data);
2345errorFWDATA2:
2346	usb_free_urb(dev->fw_data->fw_urb);
2347errorFWURB:
2348	del_timer_sync(&dev->timer);
2349errorEP:
2350	usb_put_dev(dev->udev);
2351errorUDEV:
2352	kfree(dev->fw_data);
2353	mutex_destroy(&dev->lock);
2354errorFWDATA1:
2355	kfree(dev->cmdbuf);
2356	kfree(dev);
2357	pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
2358	return retval;
2359}
2360
2361/* disconnect routine. when board is removed physically or with rmmod */
2362static void s2255_disconnect(struct usb_interface *interface)
2363{
2364	struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
2365	int i;
2366	int channels = atomic_read(&dev->num_channels);
2367	mutex_lock(&dev->lock);
2368	v4l2_device_disconnect(&dev->v4l2_dev);
2369	mutex_unlock(&dev->lock);
2370	/*see comments in the uvc_driver.c usb disconnect function */
2371	atomic_inc(&dev->num_channels);
2372	/* unregister each video device. */
2373	for (i = 0; i < channels; i++)
2374		video_unregister_device(&dev->vc[i].vdev);
2375	/* wake up any of our timers */
2376	atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2377	wake_up(&dev->fw_data->wait_fw);
2378	for (i = 0; i < MAX_CHANNELS; i++) {
2379		dev->vc[i].setmode_ready = 1;
2380		wake_up(&dev->vc[i].wait_setmode);
2381		dev->vc[i].vidstatus_ready = 1;
2382		wake_up(&dev->vc[i].wait_vidstatus);
2383	}
2384	if (atomic_dec_and_test(&dev->num_channels))
2385		s2255_destroy(dev);
2386	dev_info(&interface->dev, "%s\n", __func__);
2387}
2388
2389static struct usb_driver s2255_driver = {
2390	.name = S2255_DRIVER_NAME,
2391	.probe = s2255_probe,
2392	.disconnect = s2255_disconnect,
2393	.id_table = s2255_table,
2394};
2395
2396module_usb_driver(s2255_driver);
2397
2398MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2399MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2400MODULE_LICENSE("GPL");
2401MODULE_VERSION(S2255_VERSION);
2402MODULE_FIRMWARE(FIRMWARE_FILE_NAME);
2403