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