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