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