Version:  2.0.40 2.2.26 2.4.37 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9

Linux/drivers/media/usb/s2255/s2255drv.c

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us