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