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