2 * s2255drv.c - a driver for the Sensoray 2255 USB video capture device
4 * Copyright (C) 2007-2010 by Sensoray Company Inc.
7 * Some video buffer code based on vivi driver:
9 * Sensoray 2255 device supports 4 simultaneous channels.
10 * The channels are not "crossbar" inputs, they are physically
11 * attached to separate video decoders.
13 * Because of USB2.0 bandwidth limitations. There is only a
14 * certain amount of data which may be transferred at one time.
16 * Example maximum bandwidth utilization:
18 * -full size, color mode YUYV or YUV422P: 2 channels at once
20 * -full or half size Grey scale: all 4 channels at once
22 * -half size, color mode YUYV or YUV422P: all 4 channels at once
24 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
26 * (TODO: Incorporate videodev2 frame rate(FR) enumeration,
27 * which is currently experimental.)
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.
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.
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.
44 #include <linux/module.h>
45 #include <linux/firmware.h>
46 #include <linux/kernel.h>
47 #include <linux/mutex.h>
48 #include <linux/slab.h>
49 #include <linux/videodev2.h>
50 #include <linux/version.h>
52 #include <media/videobuf-vmalloc.h>
53 #include <media/v4l2-common.h>
54 #include <media/v4l2-device.h>
55 #include <media/v4l2-ioctl.h>
56 #include <linux/vmalloc.h>
57 #include <linux/usb.h>
59 #define S2255_MAJOR_VERSION 1
60 #define S2255_MINOR_VERSION 21
61 #define S2255_RELEASE 0
62 #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \
63 S2255_MINOR_VERSION, \
65 #define FIRMWARE_FILE_NAME "f2255usb.bin"
67 /* default JPEG quality */
68 #define S2255_DEF_JPEG_QUAL 50
69 /* vendor request in */
71 /* vendor request out */
72 #define S2255_VR_OUT 1
74 #define S2255_VR_FW 0x30
75 /* USB endpoint number for configuring the device */
76 #define S2255_CONFIG_EP 2
77 /* maximum time for DSP to start responding after last FW word loaded(ms) */
78 #define S2255_DSP_BOOTTIME 800
79 /* maximum time to wait for firmware to load (ms) */
80 #define S2255_LOAD_TIMEOUT (5000 + S2255_DSP_BOOTTIME)
81 #define S2255_DEF_BUFS 16
82 #define S2255_SETMODE_TIMEOUT 500
83 #define S2255_VIDSTATUS_TIMEOUT 350
84 #define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
85 #define S2255_MARKER_RESPONSE cpu_to_le32(0x2255ACACL)
86 #define S2255_RESPONSE_SETMODE cpu_to_le32(0x01)
87 #define S2255_RESPONSE_FW cpu_to_le32(0x10)
88 #define S2255_RESPONSE_STATUS cpu_to_le32(0x20)
89 #define S2255_USB_XFER_SIZE (16 * 1024)
90 #define MAX_CHANNELS 4
92 /* maximum size is PAL full size plus room for the marker header(s) */
93 #define SYS_FRAMES_MAXSIZE (720*288*2*2 + 4096)
94 #define DEF_USB_BLOCK S2255_USB_XFER_SIZE
95 #define LINE_SZ_4CIFS_NTSC 640
96 #define LINE_SZ_2CIFS_NTSC 640
97 #define LINE_SZ_1CIFS_NTSC 320
98 #define LINE_SZ_4CIFS_PAL 704
99 #define LINE_SZ_2CIFS_PAL 704
100 #define LINE_SZ_1CIFS_PAL 352
101 #define NUM_LINES_4CIFS_NTSC 240
102 #define NUM_LINES_2CIFS_NTSC 240
103 #define NUM_LINES_1CIFS_NTSC 240
104 #define NUM_LINES_4CIFS_PAL 288
105 #define NUM_LINES_2CIFS_PAL 288
106 #define NUM_LINES_1CIFS_PAL 288
107 #define LINE_SZ_DEF 640
108 #define NUM_LINES_DEF 240
111 /* predefined settings */
112 #define FORMAT_NTSC 1
115 #define SCALE_4CIFS 1 /* 640x480(NTSC) or 704x576(PAL) */
116 #define SCALE_2CIFS 2 /* 640x240(NTSC) or 704x288(PAL) */
117 #define SCALE_1CIFS 3 /* 320x240(NTSC) or 352x288(PAL) */
118 /* SCALE_4CIFSI is the 2 fields interpolated into one */
119 #define SCALE_4CIFSI 4 /* 640x480(NTSC) or 704x576(PAL) high quality */
121 #define COLOR_YUVPL 1 /* YUV planar */
122 #define COLOR_YUVPK 2 /* YUV packed */
123 #define COLOR_Y8 4 /* monochrome */
124 #define COLOR_JPG 5 /* JPEG */
126 #define MASK_COLOR 0x000000ff
127 #define MASK_JPG_QUALITY 0x0000ff00
128 #define MASK_INPUT_TYPE 0x000f0000
129 /* frame decimation. Not implemented by V4L yet(experimental in V4L) */
130 #define FDEC_1 1 /* capture every frame. default */
131 #define FDEC_2 2 /* capture every 2nd frame */
132 #define FDEC_3 3 /* capture every 3rd frame */
133 #define FDEC_5 5 /* capture every 5th frame */
135 /*-------------------------------------------------------
136 * Default mode parameters.
137 *-------------------------------------------------------*/
138 #define DEF_SCALE SCALE_4CIFS
139 #define DEF_COLOR COLOR_YUVPL
140 #define DEF_FDEC FDEC_1
142 #define DEF_CONTRAST 0x5c
143 #define DEF_SATURATION 0x80
146 /* usb config commands */
147 #define IN_DATA_TOKEN cpu_to_le32(0x2255c0de)
148 #define CMD_2255 cpu_to_le32(0xc2255000)
149 #define CMD_SET_MODE cpu_to_le32((CMD_2255 | 0x10))
150 #define CMD_START cpu_to_le32((CMD_2255 | 0x20))
151 #define CMD_STOP cpu_to_le32((CMD_2255 | 0x30))
152 #define CMD_STATUS cpu_to_le32((CMD_2255 | 0x40))
155 u32 format
; /* input video format (NTSC, PAL) */
156 u32 scale
; /* output video scale */
157 u32 color
; /* output video color format */
158 u32 fdec
; /* frame decimation */
159 u32 bright
; /* brightness */
160 u32 contrast
; /* contrast */
161 u32 saturation
; /* saturation */
162 u32 hue
; /* hue (NTSC only)*/
163 u32 single
; /* capture 1 frame at a time (!=0), continuously (==0)*/
164 u32 usb_block
; /* block size. should be 4096 of DEF_USB_BLOCK */
165 u32 restart
; /* if DSP requires restart */
169 #define S2255_READ_IDLE 0
170 #define S2255_READ_FRAME 1
172 /* frame structure */
173 struct s2255_framei
{
175 unsigned long ulState
; /* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
176 void *lpvbits
; /* image data */
177 unsigned long cur_size
; /* current data copied to it */
180 /* image buffer structure */
181 struct s2255_bufferi
{
182 unsigned long dwFrames
; /* number of frames in buffer */
183 struct s2255_framei frame
[SYS_FRAMES
]; /* array of FRAME structures */
186 #define DEF_MODEI_NTSC_CONT {FORMAT_NTSC, DEF_SCALE, DEF_COLOR, \
187 DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
188 DEF_HUE, 0, DEF_USB_BLOCK, 0}
190 struct s2255_dmaqueue
{
191 struct list_head active
;
192 struct s2255_dev
*dev
;
195 /* for firmware loading, fw_state */
196 #define S2255_FW_NOTLOADED 0
197 #define S2255_FW_LOADED_DSPWAIT 1
198 #define S2255_FW_SUCCESS 2
199 #define S2255_FW_FAILED 3
200 #define S2255_FW_DISCONNECTING 4
201 #define S2255_FW_MARKER cpu_to_le32(0x22552f2f)
202 /* 2255 read states */
203 #define S2255_READ_IDLE 0
204 #define S2255_READ_FRAME 1
211 wait_queue_head_t wait_fw
;
212 const struct firmware
*fw
;
215 struct s2255_pipeinfo
{
216 u32 max_transfer_size
;
217 u32 cur_transfer_size
;
221 void *dev
; /* back pointer to s2255_dev struct*/
226 struct s2255_fmt
; /*forward declaration */
229 struct s2255_channel
{
230 struct video_device vdev
;
232 struct s2255_dmaqueue vidq
;
233 struct s2255_bufferi buffer
;
234 struct s2255_mode mode
;
235 /* jpeg compression */
236 struct v4l2_jpegcompression jc
;
237 /* capture parameters (for high quality mode full size) */
238 struct v4l2_captureparm cap_parm
;
243 /* allocated image size */
244 unsigned long req_image_size
;
245 /* received packet size */
246 unsigned long pkt_size
;
248 unsigned long frame_count
;
251 /* if channel configured to default state */
253 wait_queue_head_t wait_setmode
;
255 /* video status items */
257 wait_queue_head_t wait_vidstatus
;
261 const struct s2255_fmt
*fmt
;
262 int idx
; /* channel number on device, 0-3 */
267 struct s2255_channel channel
[MAX_CHANNELS
];
268 struct v4l2_device v4l2_dev
;
269 atomic_t num_channels
;
271 struct mutex lock
; /* channels[].vdev.lock */
272 struct mutex open_lock
;
273 struct usb_device
*udev
;
274 struct usb_interface
*interface
;
276 struct timer_list timer
;
277 struct s2255_fw
*fw_data
;
278 struct s2255_pipeinfo pipe
;
279 u32 cc
; /* current channel */
283 /* dsp firmware version (f2255usb.bin) */
285 u16 pid
; /* product id */
288 static inline struct s2255_dev
*to_s2255_dev(struct v4l2_device
*v4l2_dev
)
290 return container_of(v4l2_dev
, struct s2255_dev
, v4l2_dev
);
299 /* buffer for one video frame */
300 struct s2255_buffer
{
301 /* common v4l buffer stuff -- must be first */
302 struct videobuf_buffer vb
;
303 const struct s2255_fmt
*fmt
;
307 struct s2255_dev
*dev
;
308 struct videobuf_queue vb_vidq
;
309 enum v4l2_buf_type type
;
310 struct s2255_channel
*channel
;
314 /* current cypress EEPROM firmware version */
315 #define S2255_CUR_USB_FWVER ((3 << 8) | 11)
316 /* current DSP FW version */
317 #define S2255_CUR_DSP_FWVER 10102
318 /* Need DSP version 5+ for video status feature */
319 #define S2255_MIN_DSP_STATUS 5
320 #define S2255_MIN_DSP_COLORFILTER 8
321 #define S2255_NORMS (V4L2_STD_PAL | V4L2_STD_NTSC)
323 /* private V4L2 controls */
326 * The following chart displays how COLORFILTER should be set
327 * =========================================================
328 * = fourcc = COLORFILTER =
329 * = ===============================
331 * =========================================================
332 * = V4L2_PIX_FMT_GREY(Y8) = monochrome from = monochrome=
333 * = = s-video or = composite =
334 * = = B/W camera = input =
335 * =========================================================
336 * = other = color, svideo = color, =
338 * =========================================================
341 * channels 0-3 on 2255 are composite
342 * channels 0-1 on 2257 are composite, 2-3 are s-video
343 * If COLORFILTER is 0 with a composite color camera connected,
344 * the output will appear monochrome but hatching
346 * COLORFILTER is different from "color killer" and "color effects"
349 #define S2255_V4L2_YC_ON 1
350 #define S2255_V4L2_YC_OFF 0
351 #define V4L2_CID_PRIVATE_COLORFILTER (V4L2_CID_PRIVATE_BASE + 0)
353 /* frame prefix size (sent once every frame) */
354 #define PREFIX_SIZE 512
356 /* Channels on box are in reverse order */
357 static unsigned long G_chnmap
[MAX_CHANNELS
] = {3, 2, 1, 0};
360 static int *s2255_debug
= &debug
;
362 static int s2255_start_readpipe(struct s2255_dev
*dev
);
363 static void s2255_stop_readpipe(struct s2255_dev
*dev
);
364 static int s2255_start_acquire(struct s2255_channel
*channel
);
365 static int s2255_stop_acquire(struct s2255_channel
*channel
);
366 static void s2255_fillbuff(struct s2255_channel
*chn
, struct s2255_buffer
*buf
,
368 static int s2255_set_mode(struct s2255_channel
*chan
, struct s2255_mode
*mode
);
369 static int s2255_board_shutdown(struct s2255_dev
*dev
);
370 static void s2255_fwload_start(struct s2255_dev
*dev
, int reset
);
371 static void s2255_destroy(struct s2255_dev
*dev
);
372 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char req
,
373 u16 index
, u16 value
, void *buf
,
374 s32 buf_len
, int bOut
);
376 /* dev_err macro with driver name */
377 #define S2255_DRIVER_NAME "s2255"
378 #define s2255_dev_err(dev, fmt, arg...) \
379 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
381 #define dprintk(level, fmt, arg...) \
383 if (*s2255_debug >= (level)) { \
384 printk(KERN_DEBUG S2255_DRIVER_NAME \
389 static struct usb_driver s2255_driver
;
391 /* Declare static vars that will be used as parameters */
392 static unsigned int vid_limit
= 16; /* Video memory limit, in Mb */
394 /* start video number */
395 static int video_nr
= -1; /* /dev/videoN, -1 for autodetect */
397 module_param(debug
, int, 0644);
398 MODULE_PARM_DESC(debug
, "Debug level(0-100) default 0");
399 module_param(vid_limit
, int, 0644);
400 MODULE_PARM_DESC(vid_limit
, "video memory limit(Mb)");
401 module_param(video_nr
, int, 0644);
402 MODULE_PARM_DESC(video_nr
, "start video minor(-1 default autodetect)");
404 /* USB device table */
405 #define USB_SENSORAY_VID 0x1943
406 static struct usb_device_id s2255_table
[] = {
407 {USB_DEVICE(USB_SENSORAY_VID
, 0x2255)},
408 {USB_DEVICE(USB_SENSORAY_VID
, 0x2257)}, /*same family as 2255*/
409 { } /* Terminating entry */
411 MODULE_DEVICE_TABLE(usb
, s2255_table
);
413 #define BUFFER_TIMEOUT msecs_to_jiffies(400)
416 static const struct s2255_fmt formats
[] = {
418 .name
= "4:2:2, planar, YUV422P",
419 .fourcc
= V4L2_PIX_FMT_YUV422P
,
423 .name
= "4:2:2, packed, YUYV",
424 .fourcc
= V4L2_PIX_FMT_YUYV
,
428 .name
= "4:2:2, packed, UYVY",
429 .fourcc
= V4L2_PIX_FMT_UYVY
,
433 .fourcc
= V4L2_PIX_FMT_JPEG
,
437 .fourcc
= V4L2_PIX_FMT_GREY
,
442 static int norm_maxw(struct video_device
*vdev
)
444 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
445 LINE_SZ_4CIFS_NTSC
: LINE_SZ_4CIFS_PAL
;
448 static int norm_maxh(struct video_device
*vdev
)
450 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
451 (NUM_LINES_1CIFS_NTSC
* 2) : (NUM_LINES_1CIFS_PAL
* 2);
454 static int norm_minw(struct video_device
*vdev
)
456 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
457 LINE_SZ_1CIFS_NTSC
: LINE_SZ_1CIFS_PAL
;
460 static int norm_minh(struct video_device
*vdev
)
462 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
463 (NUM_LINES_1CIFS_NTSC
) : (NUM_LINES_1CIFS_PAL
);
468 * TODO: fixme: move YUV reordering to hardware
469 * converts 2255 planar format to yuyv or uyvy
471 static void planar422p_to_yuv_packed(const unsigned char *in
,
473 int width
, int height
,
479 unsigned long size
= height
* width
;
481 pY
= (unsigned char *)in
;
482 pCr
= (unsigned char *)in
+ height
* width
;
483 pCb
= (unsigned char *)in
+ height
* width
+ (height
* width
/ 2);
484 for (i
= 0; i
< size
* 2; i
+= 4) {
485 out
[i
] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCr
++;
486 out
[i
+ 1] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCr
++ : *pY
++;
487 out
[i
+ 2] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCb
++;
488 out
[i
+ 3] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCb
++ : *pY
++;
493 static void s2255_reset_dsppower(struct s2255_dev
*dev
)
495 s2255_vendor_req(dev
, 0x40, 0x0b0b, 0x0b01, NULL
, 0, 1);
497 s2255_vendor_req(dev
, 0x50, 0x0000, 0x0000, NULL
, 0, 1);
499 s2255_vendor_req(dev
, 0x10, 0x0000, 0x0000, NULL
, 0, 1);
503 /* kickstarts the firmware loading. from probe
505 static void s2255_timer(unsigned long user_data
)
507 struct s2255_fw
*data
= (struct s2255_fw
*)user_data
;
508 dprintk(100, "%s\n", __func__
);
509 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
510 printk(KERN_ERR
"s2255: can't submit urb\n");
511 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
512 /* wake up anything waiting for the firmware */
513 wake_up(&data
->wait_fw
);
519 /* this loads the firmware asynchronously.
520 Originally this was done synchroously in probe.
521 But it is better to load it asynchronously here than block
522 inside the probe function. Blocking inside probe affects boot time.
523 FW loading is triggered by the timer in the probe function
525 static void s2255_fwchunk_complete(struct urb
*urb
)
527 struct s2255_fw
*data
= urb
->context
;
528 struct usb_device
*udev
= urb
->dev
;
530 dprintk(100, "%s: udev %p urb %p", __func__
, udev
, urb
);
532 dev_err(&udev
->dev
, "URB failed with status %d\n", urb
->status
);
533 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
534 /* wake up anything waiting for the firmware */
535 wake_up(&data
->wait_fw
);
538 if (data
->fw_urb
== NULL
) {
539 s2255_dev_err(&udev
->dev
, "disconnected\n");
540 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
541 /* wake up anything waiting for the firmware */
542 wake_up(&data
->wait_fw
);
545 #define CHUNK_SIZE 512
546 /* all USB transfers must be done with continuous kernel memory.
547 can't allocate more than 128k in current linux kernel, so
548 upload the firmware in chunks
550 if (data
->fw_loaded
< data
->fw_size
) {
551 len
= (data
->fw_loaded
+ CHUNK_SIZE
) > data
->fw_size
?
552 data
->fw_size
% CHUNK_SIZE
: CHUNK_SIZE
;
554 if (len
< CHUNK_SIZE
)
555 memset(data
->pfw_data
, 0, CHUNK_SIZE
);
557 dprintk(100, "completed len %d, loaded %d \n", len
,
560 memcpy(data
->pfw_data
,
561 (char *) data
->fw
->data
+ data
->fw_loaded
, len
);
563 usb_fill_bulk_urb(data
->fw_urb
, udev
, usb_sndbulkpipe(udev
, 2),
564 data
->pfw_data
, CHUNK_SIZE
,
565 s2255_fwchunk_complete
, data
);
566 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
567 dev_err(&udev
->dev
, "failed submit URB\n");
568 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
569 /* wake up anything waiting for the firmware */
570 wake_up(&data
->wait_fw
);
573 data
->fw_loaded
+= len
;
575 atomic_set(&data
->fw_state
, S2255_FW_LOADED_DSPWAIT
);
576 dprintk(100, "%s: firmware upload complete\n", __func__
);
582 static int s2255_got_frame(struct s2255_channel
*channel
, int jpgsize
)
584 struct s2255_dmaqueue
*dma_q
= &channel
->vidq
;
585 struct s2255_buffer
*buf
;
586 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
587 unsigned long flags
= 0;
589 spin_lock_irqsave(&dev
->slock
, flags
);
590 if (list_empty(&dma_q
->active
)) {
591 dprintk(1, "No active queue to serve\n");
595 buf
= list_entry(dma_q
->active
.next
,
596 struct s2255_buffer
, vb
.queue
);
597 list_del(&buf
->vb
.queue
);
598 do_gettimeofday(&buf
->vb
.ts
);
599 s2255_fillbuff(channel
, buf
, jpgsize
);
600 wake_up(&buf
->vb
.done
);
601 dprintk(2, "%s: [buf/i] [%p/%d]\n", __func__
, buf
, buf
->vb
.i
);
603 spin_unlock_irqrestore(&dev
->slock
, flags
);
607 static const struct s2255_fmt
*format_by_fourcc(int fourcc
)
610 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
611 if (-1 == formats
[i
].fourcc
)
613 if (formats
[i
].fourcc
== fourcc
)
619 /* video buffer vmalloc implementation based partly on VIVI driver which is
620 * Copyright (c) 2006 by
621 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
622 * Ted Walther <ted--a.t--enumera.com>
623 * John Sokol <sokol--a.t--videotechnology.com>
624 * http://v4l.videotechnology.com/
627 static void s2255_fillbuff(struct s2255_channel
*channel
,
628 struct s2255_buffer
*buf
, int jpgsize
)
633 char *vbuf
= videobuf_to_vmalloc(&buf
->vb
);
634 unsigned long last_frame
;
635 struct s2255_framei
*frm
;
639 last_frame
= channel
->last_frame
;
640 if (last_frame
!= -1) {
641 frm
= &channel
->buffer
.frame
[last_frame
];
643 (const char *)channel
->buffer
.frame
[last_frame
].lpvbits
;
644 switch (buf
->fmt
->fourcc
) {
645 case V4L2_PIX_FMT_YUYV
:
646 case V4L2_PIX_FMT_UYVY
:
647 planar422p_to_yuv_packed((const unsigned char *)tmpbuf
,
652 case V4L2_PIX_FMT_GREY
:
653 memcpy(vbuf
, tmpbuf
, buf
->vb
.width
* buf
->vb
.height
);
655 case V4L2_PIX_FMT_JPEG
:
656 buf
->vb
.size
= jpgsize
;
657 memcpy(vbuf
, tmpbuf
, buf
->vb
.size
);
659 case V4L2_PIX_FMT_YUV422P
:
661 buf
->vb
.width
* buf
->vb
.height
* 2);
664 printk(KERN_DEBUG
"s2255: unknown format?\n");
666 channel
->last_frame
= -1;
668 printk(KERN_ERR
"s2255: =======no frame\n");
672 dprintk(2, "s2255fill at : Buffer 0x%08lx size= %d\n",
673 (unsigned long)vbuf
, pos
);
674 /* tell v4l buffer was filled */
676 buf
->vb
.field_count
= channel
->frame_count
* 2;
677 do_gettimeofday(&ts
);
679 buf
->vb
.state
= VIDEOBUF_DONE
;
683 /* ------------------------------------------------------------------
685 ------------------------------------------------------------------*/
687 static int buffer_setup(struct videobuf_queue
*vq
, unsigned int *count
,
690 struct s2255_fh
*fh
= vq
->priv_data
;
691 struct s2255_channel
*channel
= fh
->channel
;
692 *size
= channel
->width
* channel
->height
* (channel
->fmt
->depth
>> 3);
695 *count
= S2255_DEF_BUFS
;
697 if (*size
* *count
> vid_limit
* 1024 * 1024)
698 *count
= (vid_limit
* 1024 * 1024) / *size
;
703 static void free_buffer(struct videobuf_queue
*vq
, struct s2255_buffer
*buf
)
705 dprintk(4, "%s\n", __func__
);
707 videobuf_vmalloc_free(&buf
->vb
);
708 buf
->vb
.state
= VIDEOBUF_NEEDS_INIT
;
711 static int buffer_prepare(struct videobuf_queue
*vq
, struct videobuf_buffer
*vb
,
712 enum v4l2_field field
)
714 struct s2255_fh
*fh
= vq
->priv_data
;
715 struct s2255_channel
*channel
= fh
->channel
;
716 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
718 int w
= channel
->width
;
719 int h
= channel
->height
;
720 dprintk(4, "%s, field=%d\n", __func__
, field
);
721 if (channel
->fmt
== NULL
)
724 if ((w
< norm_minw(&channel
->vdev
)) ||
725 (w
> norm_maxw(&channel
->vdev
)) ||
726 (h
< norm_minh(&channel
->vdev
)) ||
727 (h
> norm_maxh(&channel
->vdev
))) {
728 dprintk(4, "invalid buffer prepare\n");
731 buf
->vb
.size
= w
* h
* (channel
->fmt
->depth
>> 3);
732 if (0 != buf
->vb
.baddr
&& buf
->vb
.bsize
< buf
->vb
.size
) {
733 dprintk(4, "invalid buffer prepare\n");
737 buf
->fmt
= channel
->fmt
;
740 buf
->vb
.field
= field
;
742 if (VIDEOBUF_NEEDS_INIT
== buf
->vb
.state
) {
743 rc
= videobuf_iolock(vq
, &buf
->vb
, NULL
);
748 buf
->vb
.state
= VIDEOBUF_PREPARED
;
751 free_buffer(vq
, buf
);
755 static void buffer_queue(struct videobuf_queue
*vq
, struct videobuf_buffer
*vb
)
757 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
758 struct s2255_fh
*fh
= vq
->priv_data
;
759 struct s2255_channel
*channel
= fh
->channel
;
760 struct s2255_dmaqueue
*vidq
= &channel
->vidq
;
761 dprintk(1, "%s\n", __func__
);
762 buf
->vb
.state
= VIDEOBUF_QUEUED
;
763 list_add_tail(&buf
->vb
.queue
, &vidq
->active
);
766 static void buffer_release(struct videobuf_queue
*vq
,
767 struct videobuf_buffer
*vb
)
769 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
770 struct s2255_fh
*fh
= vq
->priv_data
;
771 dprintk(4, "%s %d\n", __func__
, fh
->channel
->idx
);
772 free_buffer(vq
, buf
);
775 static struct videobuf_queue_ops s2255_video_qops
= {
776 .buf_setup
= buffer_setup
,
777 .buf_prepare
= buffer_prepare
,
778 .buf_queue
= buffer_queue
,
779 .buf_release
= buffer_release
,
783 static int res_get(struct s2255_fh
*fh
)
785 struct s2255_channel
*channel
= fh
->channel
;
787 if (channel
->resources
)
788 return 0; /* no, someone else uses it */
789 /* it's free, grab it */
790 channel
->resources
= 1;
792 dprintk(1, "s2255: res: get\n");
796 static int res_locked(struct s2255_fh
*fh
)
798 return fh
->channel
->resources
;
801 static int res_check(struct s2255_fh
*fh
)
803 return fh
->resources
;
807 static void res_free(struct s2255_fh
*fh
)
809 struct s2255_channel
*channel
= fh
->channel
;
810 channel
->resources
= 0;
812 dprintk(1, "res: put\n");
815 static int vidioc_querymenu(struct file
*file
, void *priv
,
816 struct v4l2_querymenu
*qmenu
)
818 static const char *colorfilter
[] = {
823 if (qmenu
->id
== V4L2_CID_PRIVATE_COLORFILTER
) {
825 const char **menu_items
= colorfilter
;
826 for (i
= 0; i
< qmenu
->index
&& menu_items
[i
]; i
++)
827 ; /* do nothing (from v4l2-common.c) */
828 if (menu_items
[i
] == NULL
|| menu_items
[i
][0] == '\0')
830 strlcpy(qmenu
->name
, menu_items
[qmenu
->index
],
831 sizeof(qmenu
->name
));
834 return v4l2_ctrl_query_menu(qmenu
, NULL
, NULL
);
837 static int vidioc_querycap(struct file
*file
, void *priv
,
838 struct v4l2_capability
*cap
)
840 struct s2255_fh
*fh
= file
->private_data
;
841 struct s2255_dev
*dev
= fh
->dev
;
842 strlcpy(cap
->driver
, "s2255", sizeof(cap
->driver
));
843 strlcpy(cap
->card
, "s2255", sizeof(cap
->card
));
844 usb_make_path(dev
->udev
, cap
->bus_info
, sizeof(cap
->bus_info
));
845 cap
->version
= S2255_VERSION
;
846 cap
->capabilities
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_STREAMING
;
850 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
851 struct v4l2_fmtdesc
*f
)
857 if (index
>= ARRAY_SIZE(formats
))
860 dprintk(4, "name %s\n", formats
[index
].name
);
861 strlcpy(f
->description
, formats
[index
].name
, sizeof(f
->description
));
862 f
->pixelformat
= formats
[index
].fourcc
;
866 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
867 struct v4l2_format
*f
)
869 struct s2255_fh
*fh
= priv
;
870 struct s2255_channel
*channel
= fh
->channel
;
872 f
->fmt
.pix
.width
= channel
->width
;
873 f
->fmt
.pix
.height
= channel
->height
;
874 f
->fmt
.pix
.field
= fh
->vb_vidq
.field
;
875 f
->fmt
.pix
.pixelformat
= channel
->fmt
->fourcc
;
876 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* (channel
->fmt
->depth
>> 3);
877 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
881 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
882 struct v4l2_format
*f
)
884 const struct s2255_fmt
*fmt
;
885 enum v4l2_field field
;
887 struct s2255_fh
*fh
= priv
;
888 struct s2255_channel
*channel
= fh
->channel
;
891 (channel
->vdev
.current_norm
& V4L2_STD_NTSC
) ? 1 : 0;
893 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
898 field
= f
->fmt
.pix
.field
;
899 if (field
== V4L2_FIELD_ANY
)
902 dprintk(50, "%s NTSC: %d suggested width: %d, height: %d\n",
903 __func__
, is_ntsc
, f
->fmt
.pix
.width
, f
->fmt
.pix
.height
);
906 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_NTSC
* 2) {
907 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
* 2;
909 field
= V4L2_FIELD_SEQ_TB
;
910 } else if (!((field
== V4L2_FIELD_INTERLACED
) ||
911 (field
== V4L2_FIELD_SEQ_TB
) ||
912 (field
== V4L2_FIELD_INTERLACED_TB
))) {
913 dprintk(1, "unsupported field setting\n");
917 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
;
919 field
= V4L2_FIELD_TOP
;
920 } else if (!((field
== V4L2_FIELD_TOP
) ||
921 (field
== V4L2_FIELD_BOTTOM
))) {
922 dprintk(1, "unsupported field setting\n");
927 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_NTSC
)
928 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_NTSC
;
929 else if (f
->fmt
.pix
.width
>= LINE_SZ_2CIFS_NTSC
)
930 f
->fmt
.pix
.width
= LINE_SZ_2CIFS_NTSC
;
931 else if (f
->fmt
.pix
.width
>= LINE_SZ_1CIFS_NTSC
)
932 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
934 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
937 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_PAL
* 2) {
938 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
* 2;
940 field
= V4L2_FIELD_SEQ_TB
;
941 } else if (!((field
== V4L2_FIELD_INTERLACED
) ||
942 (field
== V4L2_FIELD_SEQ_TB
) ||
943 (field
== V4L2_FIELD_INTERLACED_TB
))) {
944 dprintk(1, "unsupported field setting\n");
948 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
;
950 field
= V4L2_FIELD_TOP
;
951 } else if (!((field
== V4L2_FIELD_TOP
) ||
952 (field
== V4L2_FIELD_BOTTOM
))) {
953 dprintk(1, "unsupported field setting\n");
957 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_PAL
) {
958 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_PAL
;
959 field
= V4L2_FIELD_SEQ_TB
;
960 } else if (f
->fmt
.pix
.width
>= LINE_SZ_2CIFS_PAL
) {
961 f
->fmt
.pix
.width
= LINE_SZ_2CIFS_PAL
;
962 field
= V4L2_FIELD_TOP
;
963 } else if (f
->fmt
.pix
.width
>= LINE_SZ_1CIFS_PAL
) {
964 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
965 field
= V4L2_FIELD_TOP
;
967 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
968 field
= V4L2_FIELD_TOP
;
971 f
->fmt
.pix
.field
= field
;
972 f
->fmt
.pix
.bytesperline
= (f
->fmt
.pix
.width
* fmt
->depth
) >> 3;
973 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
974 dprintk(50, "%s: set width %d height %d field %d\n", __func__
,
975 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
, f
->fmt
.pix
.field
);
979 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
980 struct v4l2_format
*f
)
982 struct s2255_fh
*fh
= priv
;
983 struct s2255_channel
*channel
= fh
->channel
;
984 const struct s2255_fmt
*fmt
;
985 struct videobuf_queue
*q
= &fh
->vb_vidq
;
986 struct s2255_mode mode
;
990 ret
= vidioc_try_fmt_vid_cap(file
, fh
, f
);
995 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
1000 mutex_lock(&q
->vb_lock
);
1002 if (videobuf_queue_is_busy(&fh
->vb_vidq
)) {
1003 dprintk(1, "queue busy\n");
1008 if (res_locked(fh
)) {
1009 dprintk(1, "%s: channel busy\n", __func__
);
1013 mode
= channel
->mode
;
1015 channel
->width
= f
->fmt
.pix
.width
;
1016 channel
->height
= f
->fmt
.pix
.height
;
1017 fh
->vb_vidq
.field
= f
->fmt
.pix
.field
;
1019 norm
= norm_minw(&channel
->vdev
);
1020 if (channel
->width
> norm_minw(&channel
->vdev
)) {
1021 if (channel
->height
> norm_minh(&channel
->vdev
)) {
1022 if (channel
->cap_parm
.capturemode
&
1023 V4L2_MODE_HIGHQUALITY
)
1024 mode
.scale
= SCALE_4CIFSI
;
1026 mode
.scale
= SCALE_4CIFS
;
1028 mode
.scale
= SCALE_2CIFS
;
1031 mode
.scale
= SCALE_1CIFS
;
1034 switch (channel
->fmt
->fourcc
) {
1035 case V4L2_PIX_FMT_GREY
:
1036 mode
.color
&= ~MASK_COLOR
;
1037 mode
.color
|= COLOR_Y8
;
1039 case V4L2_PIX_FMT_JPEG
:
1040 mode
.color
&= ~MASK_COLOR
;
1041 mode
.color
|= COLOR_JPG
;
1042 mode
.color
|= (channel
->jc
.quality
<< 8);
1044 case V4L2_PIX_FMT_YUV422P
:
1045 mode
.color
&= ~MASK_COLOR
;
1046 mode
.color
|= COLOR_YUVPL
;
1048 case V4L2_PIX_FMT_YUYV
:
1049 case V4L2_PIX_FMT_UYVY
:
1051 mode
.color
&= ~MASK_COLOR
;
1052 mode
.color
|= COLOR_YUVPK
;
1055 if ((mode
.color
& MASK_COLOR
) != (channel
->mode
.color
& MASK_COLOR
))
1057 else if (mode
.scale
!= channel
->mode
.scale
)
1059 else if (mode
.format
!= channel
->mode
.format
)
1061 channel
->mode
= mode
;
1062 (void) s2255_set_mode(channel
, &mode
);
1065 mutex_unlock(&q
->vb_lock
);
1069 static int vidioc_reqbufs(struct file
*file
, void *priv
,
1070 struct v4l2_requestbuffers
*p
)
1073 struct s2255_fh
*fh
= priv
;
1074 rc
= videobuf_reqbufs(&fh
->vb_vidq
, p
);
1078 static int vidioc_querybuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1081 struct s2255_fh
*fh
= priv
;
1082 rc
= videobuf_querybuf(&fh
->vb_vidq
, p
);
1086 static int vidioc_qbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1089 struct s2255_fh
*fh
= priv
;
1090 rc
= videobuf_qbuf(&fh
->vb_vidq
, p
);
1094 static int vidioc_dqbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1097 struct s2255_fh
*fh
= priv
;
1098 rc
= videobuf_dqbuf(&fh
->vb_vidq
, p
, file
->f_flags
& O_NONBLOCK
);
1102 /* write to the configuration pipe, synchronously */
1103 static int s2255_write_config(struct usb_device
*udev
, unsigned char *pbuf
,
1110 pipe
= usb_sndbulkpipe(udev
, S2255_CONFIG_EP
);
1111 retval
= usb_bulk_msg(udev
, pipe
, pbuf
, size
, &done
, 500);
1116 static u32
get_transfer_size(struct s2255_mode
*mode
)
1118 int linesPerFrame
= LINE_SZ_DEF
;
1119 int pixelsPerLine
= NUM_LINES_DEF
;
1122 unsigned int mask_mult
;
1127 if (mode
->format
== FORMAT_NTSC
) {
1128 switch (mode
->scale
) {
1131 linesPerFrame
= NUM_LINES_4CIFS_NTSC
* 2;
1132 pixelsPerLine
= LINE_SZ_4CIFS_NTSC
;
1135 linesPerFrame
= NUM_LINES_2CIFS_NTSC
;
1136 pixelsPerLine
= LINE_SZ_2CIFS_NTSC
;
1139 linesPerFrame
= NUM_LINES_1CIFS_NTSC
;
1140 pixelsPerLine
= LINE_SZ_1CIFS_NTSC
;
1145 } else if (mode
->format
== FORMAT_PAL
) {
1146 switch (mode
->scale
) {
1149 linesPerFrame
= NUM_LINES_4CIFS_PAL
* 2;
1150 pixelsPerLine
= LINE_SZ_4CIFS_PAL
;
1153 linesPerFrame
= NUM_LINES_2CIFS_PAL
;
1154 pixelsPerLine
= LINE_SZ_2CIFS_PAL
;
1157 linesPerFrame
= NUM_LINES_1CIFS_PAL
;
1158 pixelsPerLine
= LINE_SZ_1CIFS_PAL
;
1164 outImageSize
= linesPerFrame
* pixelsPerLine
;
1165 if ((mode
->color
& MASK_COLOR
) != COLOR_Y8
) {
1166 /* 2 bytes/pixel if not monochrome */
1170 /* total bytes to send including prefix and 4K padding;
1171 must be a multiple of USB_READ_SIZE */
1172 usbInSize
= outImageSize
+ PREFIX_SIZE
; /* always send prefix */
1173 mask_mult
= 0xffffffffUL
- DEF_USB_BLOCK
+ 1;
1174 /* if size not a multiple of USB_READ_SIZE */
1175 if (usbInSize
& ~mask_mult
)
1176 usbInSize
= (usbInSize
& mask_mult
) + (DEF_USB_BLOCK
);
1180 static void s2255_print_cfg(struct s2255_dev
*sdev
, struct s2255_mode
*mode
)
1182 struct device
*dev
= &sdev
->udev
->dev
;
1183 dev_info(dev
, "------------------------------------------------\n");
1184 dev_info(dev
, "format: %d\nscale %d\n", mode
->format
, mode
->scale
);
1185 dev_info(dev
, "fdec: %d\ncolor %d\n", mode
->fdec
, mode
->color
);
1186 dev_info(dev
, "bright: 0x%x\n", mode
->bright
);
1187 dev_info(dev
, "------------------------------------------------\n");
1191 * set mode is the function which controls the DSP.
1192 * the restart parameter in struct s2255_mode should be set whenever
1193 * the image size could change via color format, video system or image
1195 * When the restart parameter is set, we sleep for ONE frame to allow the
1196 * DSP time to get the new frame
1198 static int s2255_set_mode(struct s2255_channel
*channel
,
1199 struct s2255_mode
*mode
)
1203 unsigned long chn_rev
;
1204 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
1205 chn_rev
= G_chnmap
[channel
->idx
];
1206 dprintk(3, "%s channel: %d\n", __func__
, channel
->idx
);
1207 /* if JPEG, set the quality */
1208 if ((mode
->color
& MASK_COLOR
) == COLOR_JPG
) {
1209 mode
->color
&= ~MASK_COLOR
;
1210 mode
->color
|= COLOR_JPG
;
1211 mode
->color
&= ~MASK_JPG_QUALITY
;
1212 mode
->color
|= (channel
->jc
.quality
<< 8);
1215 channel
->mode
= *mode
;
1216 channel
->req_image_size
= get_transfer_size(mode
);
1217 dprintk(1, "%s: reqsize %ld\n", __func__
, channel
->req_image_size
);
1218 buffer
= kzalloc(512, GFP_KERNEL
);
1219 if (buffer
== NULL
) {
1220 dev_err(&dev
->udev
->dev
, "out of mem\n");
1224 buffer
[0] = IN_DATA_TOKEN
;
1225 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1226 buffer
[2] = CMD_SET_MODE
;
1227 memcpy(&buffer
[3], &channel
->mode
, sizeof(struct s2255_mode
));
1228 channel
->setmode_ready
= 0;
1229 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1231 s2255_print_cfg(dev
, mode
);
1233 /* wait at least 3 frames before continuing */
1234 if (mode
->restart
) {
1235 wait_event_timeout(channel
->wait_setmode
,
1236 (channel
->setmode_ready
!= 0),
1237 msecs_to_jiffies(S2255_SETMODE_TIMEOUT
));
1238 if (channel
->setmode_ready
!= 1) {
1239 printk(KERN_DEBUG
"s2255: no set mode response\n");
1243 /* clear the restart flag */
1244 channel
->mode
.restart
= 0;
1245 dprintk(1, "%s chn %d, result: %d\n", __func__
, channel
->idx
, res
);
1249 static int s2255_cmd_status(struct s2255_channel
*channel
, u32
*pstatus
)
1254 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
1255 chn_rev
= G_chnmap
[channel
->idx
];
1256 dprintk(4, "%s chan %d\n", __func__
, channel
->idx
);
1257 buffer
= kzalloc(512, GFP_KERNEL
);
1258 if (buffer
== NULL
) {
1259 dev_err(&dev
->udev
->dev
, "out of mem\n");
1262 /* form the get vid status command */
1263 buffer
[0] = IN_DATA_TOKEN
;
1264 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1265 buffer
[2] = CMD_STATUS
;
1267 channel
->vidstatus_ready
= 0;
1268 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1270 wait_event_timeout(channel
->wait_vidstatus
,
1271 (channel
->vidstatus_ready
!= 0),
1272 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT
));
1273 if (channel
->vidstatus_ready
!= 1) {
1274 printk(KERN_DEBUG
"s2255: no vidstatus response\n");
1277 *pstatus
= channel
->vidstatus
;
1278 dprintk(4, "%s, vid status %d\n", __func__
, *pstatus
);
1282 static int vidioc_streamon(struct file
*file
, void *priv
, enum v4l2_buf_type i
)
1285 struct s2255_fh
*fh
= priv
;
1286 struct s2255_dev
*dev
= fh
->dev
;
1287 struct s2255_channel
*channel
= fh
->channel
;
1289 dprintk(4, "%s\n", __func__
);
1290 if (fh
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
1291 dev_err(&dev
->udev
->dev
, "invalid fh type0\n");
1294 if (i
!= fh
->type
) {
1295 dev_err(&dev
->udev
->dev
, "invalid fh type1\n");
1300 s2255_dev_err(&dev
->udev
->dev
, "stream busy\n");
1303 channel
->last_frame
= -1;
1304 channel
->bad_payload
= 0;
1305 channel
->cur_frame
= 0;
1306 channel
->frame_count
= 0;
1307 for (j
= 0; j
< SYS_FRAMES
; j
++) {
1308 channel
->buffer
.frame
[j
].ulState
= S2255_READ_IDLE
;
1309 channel
->buffer
.frame
[j
].cur_size
= 0;
1311 res
= videobuf_streamon(&fh
->vb_vidq
);
1313 s2255_start_acquire(channel
);
1314 channel
->b_acquire
= 1;
1321 static int vidioc_streamoff(struct file
*file
, void *priv
, enum v4l2_buf_type i
)
1323 struct s2255_fh
*fh
= priv
;
1324 dprintk(4, "%s\n, channel: %d", __func__
, fh
->channel
->idx
);
1325 if (fh
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
1326 printk(KERN_ERR
"invalid fh type0\n");
1329 if (i
!= fh
->type
) {
1330 printk(KERN_ERR
"invalid type i\n");
1333 s2255_stop_acquire(fh
->channel
);
1334 videobuf_streamoff(&fh
->vb_vidq
);
1339 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id
*i
)
1341 struct s2255_fh
*fh
= priv
;
1342 struct s2255_mode mode
;
1343 struct videobuf_queue
*q
= &fh
->vb_vidq
;
1345 mutex_lock(&q
->vb_lock
);
1346 if (videobuf_queue_is_busy(q
)) {
1347 dprintk(1, "queue busy\n");
1351 if (res_locked(fh
)) {
1352 dprintk(1, "can't change standard after started\n");
1356 mode
= fh
->channel
->mode
;
1357 if (*i
& V4L2_STD_NTSC
) {
1358 dprintk(4, "%s NTSC\n", __func__
);
1359 /* if changing format, reset frame decimation/intervals */
1360 if (mode
.format
!= FORMAT_NTSC
) {
1362 mode
.format
= FORMAT_NTSC
;
1365 } else if (*i
& V4L2_STD_PAL
) {
1366 dprintk(4, "%s PAL\n", __func__
);
1367 if (mode
.format
!= FORMAT_PAL
) {
1369 mode
.format
= FORMAT_PAL
;
1376 s2255_set_mode(fh
->channel
, &mode
);
1378 mutex_unlock(&q
->vb_lock
);
1382 /* Sensoray 2255 is a multiple channel capture device.
1383 It does not have a "crossbar" of inputs.
1384 We use one V4L device per channel. The user must
1385 be aware that certain combinations are not allowed.
1386 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1387 at once in color(you can do full fps on 4 channels with greyscale.
1389 static int vidioc_enum_input(struct file
*file
, void *priv
,
1390 struct v4l2_input
*inp
)
1392 struct s2255_fh
*fh
= priv
;
1393 struct s2255_dev
*dev
= fh
->dev
;
1394 struct s2255_channel
*channel
= fh
->channel
;
1396 if (inp
->index
!= 0)
1398 inp
->type
= V4L2_INPUT_TYPE_CAMERA
;
1399 inp
->std
= S2255_NORMS
;
1401 if (dev
->dsp_fw_ver
>= S2255_MIN_DSP_STATUS
) {
1403 rc
= s2255_cmd_status(fh
->channel
, &status
);
1404 dprintk(4, "s2255_cmd_status rc: %d status %x\n", rc
, status
);
1406 inp
->status
= (status
& 0x01) ? 0
1407 : V4L2_IN_ST_NO_SIGNAL
;
1412 strlcpy(inp
->name
, "Composite", sizeof(inp
->name
));
1415 strlcpy(inp
->name
, (channel
->idx
< 2) ? "Composite" : "S-Video",
1422 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1427 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
1434 /* --- controls ---------------------------------------------- */
1435 static int vidioc_queryctrl(struct file
*file
, void *priv
,
1436 struct v4l2_queryctrl
*qc
)
1438 struct s2255_fh
*fh
= priv
;
1439 struct s2255_channel
*channel
= fh
->channel
;
1440 struct s2255_dev
*dev
= fh
->dev
;
1442 case V4L2_CID_BRIGHTNESS
:
1443 v4l2_ctrl_query_fill(qc
, -127, 127, 1, DEF_BRIGHT
);
1445 case V4L2_CID_CONTRAST
:
1446 v4l2_ctrl_query_fill(qc
, 0, 255, 1, DEF_CONTRAST
);
1448 case V4L2_CID_SATURATION
:
1449 v4l2_ctrl_query_fill(qc
, 0, 255, 1, DEF_SATURATION
);
1452 v4l2_ctrl_query_fill(qc
, 0, 255, 1, DEF_HUE
);
1454 case V4L2_CID_PRIVATE_COLORFILTER
:
1455 if (dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
1457 if ((dev
->pid
== 0x2257) && (channel
->idx
> 1))
1459 strlcpy(qc
->name
, "Color Filter", sizeof(qc
->name
));
1460 qc
->type
= V4L2_CTRL_TYPE_MENU
;
1464 qc
->default_value
= 1;
1470 dprintk(4, "%s, id %d\n", __func__
, qc
->id
);
1474 static int vidioc_g_ctrl(struct file
*file
, void *priv
,
1475 struct v4l2_control
*ctrl
)
1477 struct s2255_fh
*fh
= priv
;
1478 struct s2255_dev
*dev
= fh
->dev
;
1479 struct s2255_channel
*channel
= fh
->channel
;
1481 case V4L2_CID_BRIGHTNESS
:
1482 ctrl
->value
= channel
->mode
.bright
;
1484 case V4L2_CID_CONTRAST
:
1485 ctrl
->value
= channel
->mode
.contrast
;
1487 case V4L2_CID_SATURATION
:
1488 ctrl
->value
= channel
->mode
.saturation
;
1491 ctrl
->value
= channel
->mode
.hue
;
1493 case V4L2_CID_PRIVATE_COLORFILTER
:
1494 if (dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
1496 if ((dev
->pid
== 0x2257) && (channel
->idx
> 1))
1498 ctrl
->value
= !((channel
->mode
.color
& MASK_INPUT_TYPE
) >> 16);
1503 dprintk(4, "%s, id %d val %d\n", __func__
, ctrl
->id
, ctrl
->value
);
1507 static int vidioc_s_ctrl(struct file
*file
, void *priv
,
1508 struct v4l2_control
*ctrl
)
1510 struct s2255_fh
*fh
= priv
;
1511 struct s2255_channel
*channel
= fh
->channel
;
1512 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
1513 struct s2255_mode mode
;
1514 mode
= channel
->mode
;
1515 dprintk(4, "%s\n", __func__
);
1516 /* update the mode to the corresponding value */
1518 case V4L2_CID_BRIGHTNESS
:
1519 mode
.bright
= ctrl
->value
;
1521 case V4L2_CID_CONTRAST
:
1522 mode
.contrast
= ctrl
->value
;
1525 mode
.hue
= ctrl
->value
;
1527 case V4L2_CID_SATURATION
:
1528 mode
.saturation
= ctrl
->value
;
1530 case V4L2_CID_PRIVATE_COLORFILTER
:
1531 if (dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
1533 if ((dev
->pid
== 0x2257) && (channel
->idx
> 1))
1535 mode
.color
&= ~MASK_INPUT_TYPE
;
1536 mode
.color
|= ((ctrl
->value
? 0 : 1) << 16);
1542 /* set mode here. Note: stream does not need restarted.
1543 some V4L programs restart stream unnecessarily
1546 s2255_set_mode(fh
->channel
, &mode
);
1550 static int vidioc_g_jpegcomp(struct file
*file
, void *priv
,
1551 struct v4l2_jpegcompression
*jc
)
1553 struct s2255_fh
*fh
= priv
;
1554 struct s2255_channel
*channel
= fh
->channel
;
1556 dprintk(2, "%s: quality %d\n", __func__
, jc
->quality
);
1560 static int vidioc_s_jpegcomp(struct file
*file
, void *priv
,
1561 struct v4l2_jpegcompression
*jc
)
1563 struct s2255_fh
*fh
= priv
;
1564 struct s2255_channel
*channel
= fh
->channel
;
1565 if (jc
->quality
< 0 || jc
->quality
> 100)
1567 channel
->jc
.quality
= jc
->quality
;
1568 dprintk(2, "%s: quality %d\n", __func__
, jc
->quality
);
1572 static int vidioc_g_parm(struct file
*file
, void *priv
,
1573 struct v4l2_streamparm
*sp
)
1575 struct s2255_fh
*fh
= priv
;
1576 __u32 def_num
, def_dem
;
1577 struct s2255_channel
*channel
= fh
->channel
;
1578 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1580 memset(sp
, 0, sizeof(struct v4l2_streamparm
));
1581 sp
->parm
.capture
.capability
= V4L2_CAP_TIMEPERFRAME
;
1582 sp
->parm
.capture
.capturemode
= channel
->cap_parm
.capturemode
;
1583 def_num
= (channel
->mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1584 def_dem
= (channel
->mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1585 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1586 switch (channel
->mode
.fdec
) {
1589 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1592 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1595 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1598 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1601 dprintk(4, "%s capture mode, %d timeperframe %d/%d\n", __func__
,
1602 sp
->parm
.capture
.capturemode
,
1603 sp
->parm
.capture
.timeperframe
.numerator
,
1604 sp
->parm
.capture
.timeperframe
.denominator
);
1608 static int vidioc_s_parm(struct file
*file
, void *priv
,
1609 struct v4l2_streamparm
*sp
)
1611 struct s2255_fh
*fh
= priv
;
1612 struct s2255_channel
*channel
= fh
->channel
;
1613 struct s2255_mode mode
;
1615 __u32 def_num
, def_dem
;
1616 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1618 mode
= channel
->mode
;
1619 /* high quality capture mode requires a stream restart */
1620 if (channel
->cap_parm
.capturemode
1621 != sp
->parm
.capture
.capturemode
&& res_locked(fh
))
1623 def_num
= (mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1624 def_dem
= (mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1625 if (def_dem
!= sp
->parm
.capture
.timeperframe
.denominator
)
1626 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1627 else if (sp
->parm
.capture
.timeperframe
.numerator
<= def_num
)
1628 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1629 else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 2)) {
1630 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1632 } else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 3)) {
1633 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1636 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1640 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1641 s2255_set_mode(channel
, &mode
);
1642 dprintk(4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1644 sp
->parm
.capture
.capturemode
,
1645 sp
->parm
.capture
.timeperframe
.numerator
,
1646 sp
->parm
.capture
.timeperframe
.denominator
, fdec
);
1650 static int vidioc_enum_frameintervals(struct file
*file
, void *priv
,
1651 struct v4l2_frmivalenum
*fe
)
1654 #define NUM_FRAME_ENUMS 4
1655 int frm_dec
[NUM_FRAME_ENUMS
] = {1, 2, 3, 5};
1656 if (fe
->index
< 0 || fe
->index
>= NUM_FRAME_ENUMS
)
1658 switch (fe
->width
) {
1660 if (fe
->height
!= 240 && fe
->height
!= 480)
1665 if (fe
->height
!= 240)
1670 if (fe
->height
!= 288 && fe
->height
!= 576)
1674 if (fe
->height
!= 288)
1680 fe
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
1681 fe
->discrete
.denominator
= is_ntsc
? 30000 : 25000;
1682 fe
->discrete
.numerator
= (is_ntsc
? 1001 : 1000) * frm_dec
[fe
->index
];
1683 dprintk(4, "%s discrete %d/%d\n", __func__
, fe
->discrete
.numerator
,
1684 fe
->discrete
.denominator
);
1688 static int s2255_open(struct file
*file
)
1690 struct video_device
*vdev
= video_devdata(file
);
1691 struct s2255_channel
*channel
= video_drvdata(file
);
1692 struct s2255_dev
*dev
= to_s2255_dev(vdev
->v4l2_dev
);
1693 struct s2255_fh
*fh
;
1694 enum v4l2_buf_type type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1696 dprintk(1, "s2255: open called (dev=%s)\n",
1697 video_device_node_name(vdev
));
1699 * open lock necessary to prevent multiple instances
1700 * of v4l-conf (or other programs) from simultaneously
1701 * reloading firmware.
1703 mutex_lock(&dev
->open_lock
);
1704 state
= atomic_read(&dev
->fw_data
->fw_state
);
1706 case S2255_FW_DISCONNECTING
:
1707 mutex_unlock(&dev
->open_lock
);
1709 case S2255_FW_FAILED
:
1710 s2255_dev_err(&dev
->udev
->dev
,
1711 "firmware load failed. retrying.\n");
1712 s2255_fwload_start(dev
, 1);
1713 wait_event_timeout(dev
->fw_data
->wait_fw
,
1714 ((atomic_read(&dev
->fw_data
->fw_state
)
1715 == S2255_FW_SUCCESS
) ||
1716 (atomic_read(&dev
->fw_data
->fw_state
)
1717 == S2255_FW_DISCONNECTING
)),
1718 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1719 /* state may have changed, re-read */
1720 state
= atomic_read(&dev
->fw_data
->fw_state
);
1722 case S2255_FW_NOTLOADED
:
1723 case S2255_FW_LOADED_DSPWAIT
:
1724 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1725 driver loaded and then device immediately opened */
1726 printk(KERN_INFO
"%s waiting for firmware load\n", __func__
);
1727 wait_event_timeout(dev
->fw_data
->wait_fw
,
1728 ((atomic_read(&dev
->fw_data
->fw_state
)
1729 == S2255_FW_SUCCESS
) ||
1730 (atomic_read(&dev
->fw_data
->fw_state
)
1731 == S2255_FW_DISCONNECTING
)),
1732 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1733 /* state may have changed, re-read */
1734 state
= atomic_read(&dev
->fw_data
->fw_state
);
1736 case S2255_FW_SUCCESS
:
1740 /* state may have changed in above switch statement */
1742 case S2255_FW_SUCCESS
:
1744 case S2255_FW_FAILED
:
1745 printk(KERN_INFO
"2255 firmware load failed.\n");
1746 mutex_unlock(&dev
->open_lock
);
1748 case S2255_FW_DISCONNECTING
:
1749 printk(KERN_INFO
"%s: disconnecting\n", __func__
);
1750 mutex_unlock(&dev
->open_lock
);
1752 case S2255_FW_LOADED_DSPWAIT
:
1753 case S2255_FW_NOTLOADED
:
1754 printk(KERN_INFO
"%s: firmware not loaded yet"
1755 "please try again later\n",
1758 * Timeout on firmware load means device unusable.
1759 * Set firmware failure state.
1760 * On next s2255_open the firmware will be reloaded.
1762 atomic_set(&dev
->fw_data
->fw_state
,
1764 mutex_unlock(&dev
->open_lock
);
1767 printk(KERN_INFO
"%s: unknown state\n", __func__
);
1768 mutex_unlock(&dev
->open_lock
);
1771 mutex_unlock(&dev
->open_lock
);
1772 /* allocate + initialize per filehandle data */
1773 fh
= kzalloc(sizeof(*fh
), GFP_KERNEL
);
1776 file
->private_data
= fh
;
1778 fh
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1779 fh
->channel
= channel
;
1780 if (!channel
->configured
) {
1781 /* configure channel to default state */
1782 channel
->fmt
= &formats
[0];
1783 s2255_set_mode(channel
, &channel
->mode
);
1784 channel
->configured
= 1;
1786 dprintk(1, "%s: dev=%s type=%s\n", __func__
,
1787 video_device_node_name(vdev
), v4l2_type_names
[type
]);
1788 dprintk(2, "%s: fh=0x%08lx, dev=0x%08lx, vidq=0x%08lx\n", __func__
,
1789 (unsigned long)fh
, (unsigned long)dev
,
1790 (unsigned long)&channel
->vidq
);
1791 dprintk(4, "%s: list_empty active=%d\n", __func__
,
1792 list_empty(&channel
->vidq
.active
));
1793 videobuf_queue_vmalloc_init(&fh
->vb_vidq
, &s2255_video_qops
,
1796 V4L2_FIELD_INTERLACED
,
1797 sizeof(struct s2255_buffer
),
1803 static unsigned int s2255_poll(struct file
*file
,
1804 struct poll_table_struct
*wait
)
1806 struct s2255_fh
*fh
= file
->private_data
;
1808 dprintk(100, "%s\n", __func__
);
1809 if (V4L2_BUF_TYPE_VIDEO_CAPTURE
!= fh
->type
)
1811 rc
= videobuf_poll_stream(file
, &fh
->vb_vidq
, wait
);
1815 static void s2255_destroy(struct s2255_dev
*dev
)
1817 /* board shutdown stops the read pipe if it is running */
1818 s2255_board_shutdown(dev
);
1819 /* make sure firmware still not trying to load */
1820 del_timer(&dev
->timer
); /* only started in .probe and .open */
1821 if (dev
->fw_data
->fw_urb
) {
1822 usb_kill_urb(dev
->fw_data
->fw_urb
);
1823 usb_free_urb(dev
->fw_data
->fw_urb
);
1824 dev
->fw_data
->fw_urb
= NULL
;
1826 if (dev
->fw_data
->fw
)
1827 release_firmware(dev
->fw_data
->fw
);
1828 kfree(dev
->fw_data
->pfw_data
);
1829 kfree(dev
->fw_data
);
1830 /* reset the DSP so firmware can be reloaded next time */
1831 s2255_reset_dsppower(dev
);
1832 mutex_destroy(&dev
->open_lock
);
1833 mutex_destroy(&dev
->lock
);
1834 usb_put_dev(dev
->udev
);
1835 v4l2_device_unregister(&dev
->v4l2_dev
);
1836 dprintk(1, "%s", __func__
);
1840 static int s2255_release(struct file
*file
)
1842 struct s2255_fh
*fh
= file
->private_data
;
1843 struct s2255_dev
*dev
= fh
->dev
;
1844 struct video_device
*vdev
= video_devdata(file
);
1845 struct s2255_channel
*channel
= fh
->channel
;
1848 /* turn off stream */
1849 if (res_check(fh
)) {
1850 if (channel
->b_acquire
)
1851 s2255_stop_acquire(fh
->channel
);
1852 videobuf_streamoff(&fh
->vb_vidq
);
1855 videobuf_mmap_free(&fh
->vb_vidq
);
1856 dprintk(1, "%s (dev=%s)\n", __func__
, video_device_node_name(vdev
));
1861 static int s2255_mmap_v4l(struct file
*file
, struct vm_area_struct
*vma
)
1863 struct s2255_fh
*fh
= file
->private_data
;
1868 dprintk(4, "%s, vma=0x%08lx\n", __func__
, (unsigned long)vma
);
1869 ret
= videobuf_mmap_mapper(&fh
->vb_vidq
, vma
);
1870 dprintk(4, "%s vma start=0x%08lx, size=%ld, ret=%d\n", __func__
,
1871 (unsigned long)vma
->vm_start
,
1872 (unsigned long)vma
->vm_end
- (unsigned long)vma
->vm_start
, ret
);
1876 static const struct v4l2_file_operations s2255_fops_v4l
= {
1877 .owner
= THIS_MODULE
,
1879 .release
= s2255_release
,
1881 .unlocked_ioctl
= video_ioctl2
, /* V4L2 ioctl handler */
1882 .mmap
= s2255_mmap_v4l
,
1885 static const struct v4l2_ioctl_ops s2255_ioctl_ops
= {
1886 .vidioc_querymenu
= vidioc_querymenu
,
1887 .vidioc_querycap
= vidioc_querycap
,
1888 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1889 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1890 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1891 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1892 .vidioc_reqbufs
= vidioc_reqbufs
,
1893 .vidioc_querybuf
= vidioc_querybuf
,
1894 .vidioc_qbuf
= vidioc_qbuf
,
1895 .vidioc_dqbuf
= vidioc_dqbuf
,
1896 .vidioc_s_std
= vidioc_s_std
,
1897 .vidioc_enum_input
= vidioc_enum_input
,
1898 .vidioc_g_input
= vidioc_g_input
,
1899 .vidioc_s_input
= vidioc_s_input
,
1900 .vidioc_queryctrl
= vidioc_queryctrl
,
1901 .vidioc_g_ctrl
= vidioc_g_ctrl
,
1902 .vidioc_s_ctrl
= vidioc_s_ctrl
,
1903 .vidioc_streamon
= vidioc_streamon
,
1904 .vidioc_streamoff
= vidioc_streamoff
,
1905 .vidioc_s_jpegcomp
= vidioc_s_jpegcomp
,
1906 .vidioc_g_jpegcomp
= vidioc_g_jpegcomp
,
1907 .vidioc_s_parm
= vidioc_s_parm
,
1908 .vidioc_g_parm
= vidioc_g_parm
,
1909 .vidioc_enum_frameintervals
= vidioc_enum_frameintervals
,
1912 static void s2255_video_device_release(struct video_device
*vdev
)
1914 struct s2255_dev
*dev
= to_s2255_dev(vdev
->v4l2_dev
);
1915 dprintk(4, "%s, chnls: %d \n", __func__
,
1916 atomic_read(&dev
->num_channels
));
1917 if (atomic_dec_and_test(&dev
->num_channels
))
1922 static struct video_device
template = {
1924 .fops
= &s2255_fops_v4l
,
1925 .ioctl_ops
= &s2255_ioctl_ops
,
1926 .release
= s2255_video_device_release
,
1927 .tvnorms
= S2255_NORMS
,
1928 .current_norm
= V4L2_STD_NTSC_M
,
1931 static int s2255_probe_v4l(struct s2255_dev
*dev
)
1935 int cur_nr
= video_nr
;
1936 struct s2255_channel
*channel
;
1937 ret
= v4l2_device_register(&dev
->interface
->dev
, &dev
->v4l2_dev
);
1940 /* initialize all video 4 linux */
1941 /* register 4 video devices */
1942 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1943 channel
= &dev
->channel
[i
];
1944 INIT_LIST_HEAD(&channel
->vidq
.active
);
1945 channel
->vidq
.dev
= dev
;
1946 /* register 4 video devices */
1947 channel
->vdev
= template;
1948 channel
->vdev
.lock
= &dev
->lock
;
1949 channel
->vdev
.v4l2_dev
= &dev
->v4l2_dev
;
1950 video_set_drvdata(&channel
->vdev
, channel
);
1952 ret
= video_register_device(&channel
->vdev
,
1956 ret
= video_register_device(&channel
->vdev
,
1961 dev_err(&dev
->udev
->dev
,
1962 "failed to register video device!\n");
1965 atomic_inc(&dev
->num_channels
);
1966 v4l2_info(&dev
->v4l2_dev
, "V4L2 device registered as %s\n",
1967 video_device_node_name(&channel
->vdev
));
1970 printk(KERN_INFO
"Sensoray 2255 V4L driver Revision: %d.%d\n",
1971 S2255_MAJOR_VERSION
,
1972 S2255_MINOR_VERSION
);
1973 /* if no channels registered, return error and probe will fail*/
1974 if (atomic_read(&dev
->num_channels
) == 0) {
1975 v4l2_device_unregister(&dev
->v4l2_dev
);
1978 if (atomic_read(&dev
->num_channels
) != MAX_CHANNELS
)
1979 printk(KERN_WARNING
"s2255: Not all channels available.\n");
1983 /* this function moves the usb stream read pipe data
1984 * into the system buffers.
1985 * returns 0 on success, EAGAIN if more data to process( call this
1988 * Received frame structure:
1989 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1990 * bytes 4-7: channel: 0-3
1991 * bytes 8-11: payload size: size of the frame
1992 * bytes 12-payloadsize+12: frame data
1994 static int save_frame(struct s2255_dev
*dev
, struct s2255_pipeinfo
*pipe_info
)
2000 unsigned long copy_size
;
2003 struct s2255_framei
*frm
;
2004 unsigned char *pdata
;
2005 struct s2255_channel
*channel
;
2006 dprintk(100, "buffer to user\n");
2007 channel
= &dev
->channel
[dev
->cc
];
2008 idx
= channel
->cur_frame
;
2009 frm
= &channel
->buffer
.frame
[idx
];
2010 if (frm
->ulState
== S2255_READ_IDLE
) {
2013 __le32
*pdword
; /*data from dsp is little endian */
2015 /* search for marker codes */
2016 pdata
= (unsigned char *)pipe_info
->transfer_buffer
;
2017 pdword
= (__le32
*)pdata
;
2018 for (jj
= 0; jj
< (pipe_info
->cur_transfer_size
- 12); jj
++) {
2020 case S2255_MARKER_FRAME
:
2021 dprintk(4, "found frame marker at offset:"
2022 " %d [%x %x]\n", jj
, pdata
[0],
2024 offset
= jj
+ PREFIX_SIZE
;
2027 if (cc
>= MAX_CHANNELS
) {
2033 dev
->cc
= G_chnmap
[cc
];
2034 channel
= &dev
->channel
[dev
->cc
];
2035 payload
= pdword
[3];
2036 if (payload
> channel
->req_image_size
) {
2037 channel
->bad_payload
++;
2038 /* discard the bad frame */
2041 channel
->pkt_size
= payload
;
2042 channel
->jpg_size
= pdword
[4];
2044 case S2255_MARKER_RESPONSE
:
2046 pdata
+= DEF_USB_BLOCK
;
2047 jj
+= DEF_USB_BLOCK
;
2048 if (pdword
[1] >= MAX_CHANNELS
)
2050 cc
= G_chnmap
[pdword
[1]];
2051 if (cc
>= MAX_CHANNELS
)
2053 channel
= &dev
->channel
[cc
];
2054 switch (pdword
[2]) {
2055 case S2255_RESPONSE_SETMODE
:
2056 /* check if channel valid */
2057 /* set mode ready */
2058 channel
->setmode_ready
= 1;
2059 wake_up(&channel
->wait_setmode
);
2060 dprintk(5, "setmode ready %d\n", cc
);
2062 case S2255_RESPONSE_FW
:
2063 dev
->chn_ready
|= (1 << cc
);
2064 if ((dev
->chn_ready
& 0x0f) != 0x0f)
2066 /* all channels ready */
2067 printk(KERN_INFO
"s2255: fw loaded\n");
2068 atomic_set(&dev
->fw_data
->fw_state
,
2070 wake_up(&dev
->fw_data
->wait_fw
);
2072 case S2255_RESPONSE_STATUS
:
2073 channel
->vidstatus
= pdword
[3];
2074 channel
->vidstatus_ready
= 1;
2075 wake_up(&channel
->wait_vidstatus
);
2076 dprintk(5, "got vidstatus %x chan %d\n",
2080 printk(KERN_INFO
"s2255 unknown resp\n");
2092 channel
= &dev
->channel
[dev
->cc
];
2093 idx
= channel
->cur_frame
;
2094 frm
= &channel
->buffer
.frame
[idx
];
2095 /* search done. now find out if should be acquiring on this channel */
2096 if (!channel
->b_acquire
) {
2097 /* we found a frame, but this channel is turned off */
2098 frm
->ulState
= S2255_READ_IDLE
;
2102 if (frm
->ulState
== S2255_READ_IDLE
) {
2103 frm
->ulState
= S2255_READ_FRAME
;
2107 /* skip the marker 512 bytes (and offset if out of sync) */
2108 psrc
= (u8
*)pipe_info
->transfer_buffer
+ offset
;
2111 if (frm
->lpvbits
== NULL
) {
2112 dprintk(1, "s2255 frame buffer == NULL.%p %p %d %d",
2113 frm
, dev
, dev
->cc
, idx
);
2117 pdest
= frm
->lpvbits
+ frm
->cur_size
;
2119 copy_size
= (pipe_info
->cur_transfer_size
- offset
);
2121 size
= channel
->pkt_size
- PREFIX_SIZE
;
2123 /* sanity check on pdest */
2124 if ((copy_size
+ frm
->cur_size
) < channel
->req_image_size
)
2125 memcpy(pdest
, psrc
, copy_size
);
2127 frm
->cur_size
+= copy_size
;
2128 dprintk(4, "cur_size size %lu size %lu \n", frm
->cur_size
, size
);
2130 if (frm
->cur_size
>= size
) {
2131 dprintk(2, "****************[%d]Buffer[%d]full*************\n",
2133 channel
->last_frame
= channel
->cur_frame
;
2134 channel
->cur_frame
++;
2135 /* end of system frame ring buffer, start at zero */
2136 if ((channel
->cur_frame
== SYS_FRAMES
) ||
2137 (channel
->cur_frame
== channel
->buffer
.dwFrames
))
2138 channel
->cur_frame
= 0;
2140 if (channel
->b_acquire
)
2141 s2255_got_frame(channel
, channel
->jpg_size
);
2142 channel
->frame_count
++;
2143 frm
->ulState
= S2255_READ_IDLE
;
2147 /* done successfully */
2151 static void s2255_read_video_callback(struct s2255_dev
*dev
,
2152 struct s2255_pipeinfo
*pipe_info
)
2155 dprintk(50, "callback read video \n");
2157 if (dev
->cc
>= MAX_CHANNELS
) {
2159 dev_err(&dev
->udev
->dev
, "invalid channel\n");
2162 /* otherwise copy to the system buffers */
2163 res
= save_frame(dev
, pipe_info
);
2165 dprintk(4, "s2255: read callback failed\n");
2167 dprintk(50, "callback read video done\n");
2171 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char Request
,
2172 u16 Index
, u16 Value
, void *TransferBuffer
,
2173 s32 TransferBufferLength
, int bOut
)
2177 r
= usb_control_msg(dev
->udev
, usb_rcvctrlpipe(dev
->udev
, 0),
2179 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
|
2181 Value
, Index
, TransferBuffer
,
2182 TransferBufferLength
, HZ
* 5);
2184 r
= usb_control_msg(dev
->udev
, usb_sndctrlpipe(dev
->udev
, 0),
2185 Request
, USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2186 Value
, Index
, TransferBuffer
,
2187 TransferBufferLength
, HZ
* 5);
2193 * retrieve FX2 firmware version. future use.
2194 * @param dev pointer to device extension
2195 * @return -1 for fail, else returns firmware version as an int(16 bits)
2197 static int s2255_get_fx2fw(struct s2255_dev
*dev
)
2201 unsigned char transBuffer
[64];
2202 ret
= s2255_vendor_req(dev
, S2255_VR_FW
, 0, 0, transBuffer
, 2,
2205 dprintk(2, "get fw error: %x\n", ret
);
2206 fw
= transBuffer
[0] + (transBuffer
[1] << 8);
2207 dprintk(2, "Get FW %x %x\n", transBuffer
[0], transBuffer
[1]);
2212 * Create the system ring buffer to copy frames into from the
2215 static int s2255_create_sys_buffers(struct s2255_channel
*channel
)
2218 unsigned long reqsize
;
2219 dprintk(1, "create sys buffers\n");
2220 channel
->buffer
.dwFrames
= SYS_FRAMES
;
2221 /* always allocate maximum size(PAL) for system buffers */
2222 reqsize
= SYS_FRAMES_MAXSIZE
;
2224 if (reqsize
> SYS_FRAMES_MAXSIZE
)
2225 reqsize
= SYS_FRAMES_MAXSIZE
;
2227 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2228 /* allocate the frames */
2229 channel
->buffer
.frame
[i
].lpvbits
= vmalloc(reqsize
);
2230 dprintk(1, "valloc %p chan %d, idx %lu, pdata %p\n",
2231 &channel
->buffer
.frame
[i
], channel
->idx
, i
,
2232 channel
->buffer
.frame
[i
].lpvbits
);
2233 channel
->buffer
.frame
[i
].size
= reqsize
;
2234 if (channel
->buffer
.frame
[i
].lpvbits
== NULL
) {
2235 printk(KERN_INFO
"out of memory. using less frames\n");
2236 channel
->buffer
.dwFrames
= i
;
2241 /* make sure internal states are set */
2242 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2243 channel
->buffer
.frame
[i
].ulState
= 0;
2244 channel
->buffer
.frame
[i
].cur_size
= 0;
2247 channel
->cur_frame
= 0;
2248 channel
->last_frame
= -1;
2252 static int s2255_release_sys_buffers(struct s2255_channel
*channel
)
2255 dprintk(1, "release sys buffers\n");
2256 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2257 if (channel
->buffer
.frame
[i
].lpvbits
) {
2258 dprintk(1, "vfree %p\n",
2259 channel
->buffer
.frame
[i
].lpvbits
);
2260 vfree(channel
->buffer
.frame
[i
].lpvbits
);
2262 channel
->buffer
.frame
[i
].lpvbits
= NULL
;
2267 static int s2255_board_init(struct s2255_dev
*dev
)
2269 struct s2255_mode mode_def
= DEF_MODEI_NTSC_CONT
;
2272 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
2273 dprintk(4, "board init: %p", dev
);
2274 memset(pipe
, 0, sizeof(*pipe
));
2276 pipe
->cur_transfer_size
= S2255_USB_XFER_SIZE
;
2277 pipe
->max_transfer_size
= S2255_USB_XFER_SIZE
;
2279 pipe
->transfer_buffer
= kzalloc(pipe
->max_transfer_size
,
2281 if (pipe
->transfer_buffer
== NULL
) {
2282 dprintk(1, "out of memory!\n");
2285 /* query the firmware */
2286 fw_ver
= s2255_get_fx2fw(dev
);
2288 printk(KERN_INFO
"2255 usb firmware version %d.%d\n",
2289 (fw_ver
>> 8) & 0xff,
2292 if (fw_ver
< S2255_CUR_USB_FWVER
)
2293 dev_err(&dev
->udev
->dev
,
2294 "usb firmware not up to date %d.%d\n",
2295 (fw_ver
>> 8) & 0xff,
2298 for (j
= 0; j
< MAX_CHANNELS
; j
++) {
2299 struct s2255_channel
*channel
= &dev
->channel
[j
];
2300 channel
->b_acquire
= 0;
2301 channel
->mode
= mode_def
;
2302 if (dev
->pid
== 0x2257 && j
> 1)
2303 channel
->mode
.color
|= (1 << 16);
2304 channel
->jc
.quality
= S2255_DEF_JPEG_QUAL
;
2305 channel
->width
= LINE_SZ_4CIFS_NTSC
;
2306 channel
->height
= NUM_LINES_4CIFS_NTSC
* 2;
2307 channel
->fmt
= &formats
[0];
2308 channel
->mode
.restart
= 1;
2309 channel
->req_image_size
= get_transfer_size(&mode_def
);
2310 channel
->frame_count
= 0;
2311 /* create the system buffers */
2312 s2255_create_sys_buffers(channel
);
2314 /* start read pipe */
2315 s2255_start_readpipe(dev
);
2316 dprintk(1, "%s: success\n", __func__
);
2320 static int s2255_board_shutdown(struct s2255_dev
*dev
)
2323 dprintk(1, "%s: dev: %p", __func__
, dev
);
2325 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2326 if (dev
->channel
[i
].b_acquire
)
2327 s2255_stop_acquire(&dev
->channel
[i
]);
2329 s2255_stop_readpipe(dev
);
2330 for (i
= 0; i
< MAX_CHANNELS
; i
++)
2331 s2255_release_sys_buffers(&dev
->channel
[i
]);
2332 /* release transfer buffer */
2333 kfree(dev
->pipe
.transfer_buffer
);
2337 static void read_pipe_completion(struct urb
*purb
)
2339 struct s2255_pipeinfo
*pipe_info
;
2340 struct s2255_dev
*dev
;
2343 pipe_info
= purb
->context
;
2344 dprintk(100, "%s: urb:%p, status %d\n", __func__
, purb
,
2346 if (pipe_info
== NULL
) {
2347 dev_err(&purb
->dev
->dev
, "no context!\n");
2351 dev
= pipe_info
->dev
;
2353 dev_err(&purb
->dev
->dev
, "no context!\n");
2356 status
= purb
->status
;
2357 /* if shutting down, do not resubmit, exit immediately */
2358 if (status
== -ESHUTDOWN
) {
2359 dprintk(2, "%s: err shutdown\n", __func__
);
2360 pipe_info
->err_count
++;
2364 if (pipe_info
->state
== 0) {
2365 dprintk(2, "%s: exiting USB pipe", __func__
);
2370 s2255_read_video_callback(dev
, pipe_info
);
2372 pipe_info
->err_count
++;
2373 dprintk(1, "%s: failed URB %d\n", __func__
, status
);
2376 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2378 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2380 pipe_info
->transfer_buffer
,
2381 pipe_info
->cur_transfer_size
,
2382 read_pipe_completion
, pipe_info
);
2384 if (pipe_info
->state
!= 0) {
2385 if (usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
)) {
2386 dev_err(&dev
->udev
->dev
, "error submitting urb\n");
2389 dprintk(2, "%s :complete state 0\n", __func__
);
2394 static int s2255_start_readpipe(struct s2255_dev
*dev
)
2398 struct s2255_pipeinfo
*pipe_info
= &dev
->pipe
;
2399 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2400 dprintk(2, "%s: IN %d\n", __func__
, dev
->read_endpoint
);
2401 pipe_info
->state
= 1;
2402 pipe_info
->err_count
= 0;
2403 pipe_info
->stream_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2404 if (!pipe_info
->stream_urb
) {
2405 dev_err(&dev
->udev
->dev
,
2406 "ReadStream: Unable to alloc URB\n");
2409 /* transfer buffer allocated in board_init */
2410 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2412 pipe_info
->transfer_buffer
,
2413 pipe_info
->cur_transfer_size
,
2414 read_pipe_completion
, pipe_info
);
2415 retval
= usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
);
2417 printk(KERN_ERR
"s2255: start read pipe failed\n");
2423 /* starts acquisition process */
2424 static int s2255_start_acquire(struct s2255_channel
*channel
)
2426 unsigned char *buffer
;
2428 unsigned long chn_rev
;
2430 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
2431 chn_rev
= G_chnmap
[channel
->idx
];
2432 buffer
= kzalloc(512, GFP_KERNEL
);
2433 if (buffer
== NULL
) {
2434 dev_err(&dev
->udev
->dev
, "out of mem\n");
2438 channel
->last_frame
= -1;
2439 channel
->bad_payload
= 0;
2440 channel
->cur_frame
= 0;
2441 for (j
= 0; j
< SYS_FRAMES
; j
++) {
2442 channel
->buffer
.frame
[j
].ulState
= 0;
2443 channel
->buffer
.frame
[j
].cur_size
= 0;
2446 /* send the start command */
2447 *(__le32
*) buffer
= IN_DATA_TOKEN
;
2448 *((__le32
*) buffer
+ 1) = (__le32
) cpu_to_le32(chn_rev
);
2449 *((__le32
*) buffer
+ 2) = CMD_START
;
2450 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2452 dev_err(&dev
->udev
->dev
, "CMD_START error\n");
2454 dprintk(2, "start acquire exit[%d] %d \n", channel
->idx
, res
);
2459 static int s2255_stop_acquire(struct s2255_channel
*channel
)
2461 unsigned char *buffer
;
2463 unsigned long chn_rev
;
2464 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
2465 chn_rev
= G_chnmap
[channel
->idx
];
2466 buffer
= kzalloc(512, GFP_KERNEL
);
2467 if (buffer
== NULL
) {
2468 dev_err(&dev
->udev
->dev
, "out of mem\n");
2471 /* send the stop command */
2472 *(__le32
*) buffer
= IN_DATA_TOKEN
;
2473 *((__le32
*) buffer
+ 1) = (__le32
) cpu_to_le32(chn_rev
);
2474 *((__le32
*) buffer
+ 2) = CMD_STOP
;
2475 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2477 dev_err(&dev
->udev
->dev
, "CMD_STOP error\n");
2479 channel
->b_acquire
= 0;
2480 dprintk(4, "%s: chn %d, res %d\n", __func__
, channel
->idx
, res
);
2484 static void s2255_stop_readpipe(struct s2255_dev
*dev
)
2486 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
2489 if (pipe
->stream_urb
) {
2491 usb_kill_urb(pipe
->stream_urb
);
2492 usb_free_urb(pipe
->stream_urb
);
2493 pipe
->stream_urb
= NULL
;
2495 dprintk(4, "%s", __func__
);
2499 static void s2255_fwload_start(struct s2255_dev
*dev
, int reset
)
2502 s2255_reset_dsppower(dev
);
2503 dev
->fw_data
->fw_size
= dev
->fw_data
->fw
->size
;
2504 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_NOTLOADED
);
2505 memcpy(dev
->fw_data
->pfw_data
,
2506 dev
->fw_data
->fw
->data
, CHUNK_SIZE
);
2507 dev
->fw_data
->fw_loaded
= CHUNK_SIZE
;
2508 usb_fill_bulk_urb(dev
->fw_data
->fw_urb
, dev
->udev
,
2509 usb_sndbulkpipe(dev
->udev
, 2),
2510 dev
->fw_data
->pfw_data
,
2511 CHUNK_SIZE
, s2255_fwchunk_complete
,
2513 mod_timer(&dev
->timer
, jiffies
+ HZ
);
2516 /* standard usb probe function */
2517 static int s2255_probe(struct usb_interface
*interface
,
2518 const struct usb_device_id
*id
)
2520 struct s2255_dev
*dev
= NULL
;
2521 struct usb_host_interface
*iface_desc
;
2522 struct usb_endpoint_descriptor
*endpoint
;
2524 int retval
= -ENOMEM
;
2527 dprintk(2, "%s\n", __func__
);
2528 /* allocate memory for our device state and initialize it to zero */
2529 dev
= kzalloc(sizeof(struct s2255_dev
), GFP_KERNEL
);
2531 s2255_dev_err(&interface
->dev
, "out of memory\n");
2534 atomic_set(&dev
->num_channels
, 0);
2535 dev
->pid
= id
->idProduct
;
2536 dev
->fw_data
= kzalloc(sizeof(struct s2255_fw
), GFP_KERNEL
);
2539 mutex_init(&dev
->lock
);
2540 mutex_init(&dev
->open_lock
);
2541 /* grab usb_device and save it */
2542 dev
->udev
= usb_get_dev(interface_to_usbdev(interface
));
2543 if (dev
->udev
== NULL
) {
2544 dev_err(&interface
->dev
, "null usb device\n");
2548 dprintk(1, "dev: %p, udev %p interface %p\n", dev
,
2549 dev
->udev
, interface
);
2550 dev
->interface
= interface
;
2551 /* set up the endpoint information */
2552 iface_desc
= interface
->cur_altsetting
;
2553 dprintk(1, "num endpoints %d\n", iface_desc
->desc
.bNumEndpoints
);
2554 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
2555 endpoint
= &iface_desc
->endpoint
[i
].desc
;
2556 if (!dev
->read_endpoint
&& usb_endpoint_is_bulk_in(endpoint
)) {
2557 /* we found the bulk in endpoint */
2558 dev
->read_endpoint
= endpoint
->bEndpointAddress
;
2562 if (!dev
->read_endpoint
) {
2563 dev_err(&interface
->dev
, "Could not find bulk-in endpoint\n");
2566 init_timer(&dev
->timer
);
2567 dev
->timer
.function
= s2255_timer
;
2568 dev
->timer
.data
= (unsigned long)dev
->fw_data
;
2569 init_waitqueue_head(&dev
->fw_data
->wait_fw
);
2570 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2571 struct s2255_channel
*channel
= &dev
->channel
[i
];
2572 dev
->channel
[i
].idx
= i
;
2573 init_waitqueue_head(&channel
->wait_setmode
);
2574 init_waitqueue_head(&channel
->wait_vidstatus
);
2577 dev
->fw_data
->fw_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2578 if (!dev
->fw_data
->fw_urb
) {
2579 dev_err(&interface
->dev
, "out of memory!\n");
2583 dev
->fw_data
->pfw_data
= kzalloc(CHUNK_SIZE
, GFP_KERNEL
);
2584 if (!dev
->fw_data
->pfw_data
) {
2585 dev_err(&interface
->dev
, "out of memory!\n");
2588 /* load the first chunk */
2589 if (request_firmware(&dev
->fw_data
->fw
,
2590 FIRMWARE_FILE_NAME
, &dev
->udev
->dev
)) {
2591 printk(KERN_ERR
"sensoray 2255 failed to get firmware\n");
2594 /* check the firmware is valid */
2595 fw_size
= dev
->fw_data
->fw
->size
;
2596 pdata
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 8];
2598 if (*pdata
!= S2255_FW_MARKER
) {
2599 printk(KERN_INFO
"Firmware invalid.\n");
2603 /* make sure firmware is the latest */
2605 pRel
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 4];
2606 printk(KERN_INFO
"s2255 dsp fw version %x\n", *pRel
);
2607 dev
->dsp_fw_ver
= *pRel
;
2608 if (*pRel
< S2255_CUR_DSP_FWVER
)
2609 printk(KERN_INFO
"s2255: f2255usb.bin out of date.\n");
2610 if (dev
->pid
== 0x2257 && *pRel
< S2255_MIN_DSP_COLORFILTER
)
2611 printk(KERN_WARNING
"s2255: 2257 requires firmware %d"
2612 " or above.\n", S2255_MIN_DSP_COLORFILTER
);
2614 usb_reset_device(dev
->udev
);
2615 /* load 2255 board specific */
2616 retval
= s2255_board_init(dev
);
2618 goto errorBOARDINIT
;
2619 spin_lock_init(&dev
->slock
);
2620 s2255_fwload_start(dev
, 0);
2621 /* loads v4l specific */
2622 retval
= s2255_probe_v4l(dev
);
2624 goto errorBOARDINIT
;
2625 dev_info(&interface
->dev
, "Sensoray 2255 detected\n");
2628 s2255_board_shutdown(dev
);
2630 release_firmware(dev
->fw_data
->fw
);
2632 kfree(dev
->fw_data
->pfw_data
);
2634 usb_free_urb(dev
->fw_data
->fw_urb
);
2636 del_timer(&dev
->timer
);
2638 usb_put_dev(dev
->udev
);
2640 kfree(dev
->fw_data
);
2641 mutex_destroy(&dev
->open_lock
);
2642 mutex_destroy(&dev
->lock
);
2645 printk(KERN_WARNING
"Sensoray 2255 driver load failed: 0x%x\n", retval
);
2649 /* disconnect routine. when board is removed physically or with rmmod */
2650 static void s2255_disconnect(struct usb_interface
*interface
)
2652 struct s2255_dev
*dev
= to_s2255_dev(usb_get_intfdata(interface
));
2654 int channels
= atomic_read(&dev
->num_channels
);
2655 mutex_lock(&dev
->lock
);
2656 v4l2_device_disconnect(&dev
->v4l2_dev
);
2657 mutex_unlock(&dev
->lock
);
2658 /*see comments in the uvc_driver.c usb disconnect function */
2659 atomic_inc(&dev
->num_channels
);
2660 /* unregister each video device. */
2661 for (i
= 0; i
< channels
; i
++)
2662 video_unregister_device(&dev
->channel
[i
].vdev
);
2663 /* wake up any of our timers */
2664 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_DISCONNECTING
);
2665 wake_up(&dev
->fw_data
->wait_fw
);
2666 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2667 dev
->channel
[i
].setmode_ready
= 1;
2668 wake_up(&dev
->channel
[i
].wait_setmode
);
2669 dev
->channel
[i
].vidstatus_ready
= 1;
2670 wake_up(&dev
->channel
[i
].wait_vidstatus
);
2672 if (atomic_dec_and_test(&dev
->num_channels
))
2674 dev_info(&interface
->dev
, "%s\n", __func__
);
2677 static struct usb_driver s2255_driver
= {
2678 .name
= S2255_DRIVER_NAME
,
2679 .probe
= s2255_probe
,
2680 .disconnect
= s2255_disconnect
,
2681 .id_table
= s2255_table
,
2684 static int __init
usb_s2255_init(void)
2687 /* register this driver with the USB subsystem */
2688 result
= usb_register(&s2255_driver
);
2690 pr_err(KBUILD_MODNAME
2691 ": usb_register failed. Error number %d\n", result
);
2692 dprintk(2, "%s\n", __func__
);
2696 static void __exit
usb_s2255_exit(void)
2698 usb_deregister(&s2255_driver
);
2701 module_init(usb_s2255_init
);
2702 module_exit(usb_s2255_exit
);
2704 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2705 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2706 MODULE_LICENSE("GPL");