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 20
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) | 6)
316 /* current DSP FW version */
317 #define S2255_CUR_DSP_FWVER 8
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, 0x0b0b, NULL
, 0, 1);
497 s2255_vendor_req(dev
, 0x50, 0x0000, 0x0000, NULL
, 0, 1);
501 /* kickstarts the firmware loading. from probe
503 static void s2255_timer(unsigned long user_data
)
505 struct s2255_fw
*data
= (struct s2255_fw
*)user_data
;
506 dprintk(100, "%s\n", __func__
);
507 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
508 printk(KERN_ERR
"s2255: can't submit urb\n");
509 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
510 /* wake up anything waiting for the firmware */
511 wake_up(&data
->wait_fw
);
517 /* this loads the firmware asynchronously.
518 Originally this was done synchroously in probe.
519 But it is better to load it asynchronously here than block
520 inside the probe function. Blocking inside probe affects boot time.
521 FW loading is triggered by the timer in the probe function
523 static void s2255_fwchunk_complete(struct urb
*urb
)
525 struct s2255_fw
*data
= urb
->context
;
526 struct usb_device
*udev
= urb
->dev
;
528 dprintk(100, "%s: udev %p urb %p", __func__
, udev
, urb
);
530 dev_err(&udev
->dev
, "URB failed with status %d\n", urb
->status
);
531 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
532 /* wake up anything waiting for the firmware */
533 wake_up(&data
->wait_fw
);
536 if (data
->fw_urb
== NULL
) {
537 s2255_dev_err(&udev
->dev
, "disconnected\n");
538 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
539 /* wake up anything waiting for the firmware */
540 wake_up(&data
->wait_fw
);
543 #define CHUNK_SIZE 512
544 /* all USB transfers must be done with continuous kernel memory.
545 can't allocate more than 128k in current linux kernel, so
546 upload the firmware in chunks
548 if (data
->fw_loaded
< data
->fw_size
) {
549 len
= (data
->fw_loaded
+ CHUNK_SIZE
) > data
->fw_size
?
550 data
->fw_size
% CHUNK_SIZE
: CHUNK_SIZE
;
552 if (len
< CHUNK_SIZE
)
553 memset(data
->pfw_data
, 0, CHUNK_SIZE
);
555 dprintk(100, "completed len %d, loaded %d \n", len
,
558 memcpy(data
->pfw_data
,
559 (char *) data
->fw
->data
+ data
->fw_loaded
, len
);
561 usb_fill_bulk_urb(data
->fw_urb
, udev
, usb_sndbulkpipe(udev
, 2),
562 data
->pfw_data
, CHUNK_SIZE
,
563 s2255_fwchunk_complete
, data
);
564 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
565 dev_err(&udev
->dev
, "failed submit URB\n");
566 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
567 /* wake up anything waiting for the firmware */
568 wake_up(&data
->wait_fw
);
571 data
->fw_loaded
+= len
;
573 atomic_set(&data
->fw_state
, S2255_FW_LOADED_DSPWAIT
);
574 dprintk(100, "%s: firmware upload complete\n", __func__
);
580 static int s2255_got_frame(struct s2255_channel
*channel
, int jpgsize
)
582 struct s2255_dmaqueue
*dma_q
= &channel
->vidq
;
583 struct s2255_buffer
*buf
;
584 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
585 unsigned long flags
= 0;
587 spin_lock_irqsave(&dev
->slock
, flags
);
588 if (list_empty(&dma_q
->active
)) {
589 dprintk(1, "No active queue to serve\n");
593 buf
= list_entry(dma_q
->active
.next
,
594 struct s2255_buffer
, vb
.queue
);
595 list_del(&buf
->vb
.queue
);
596 do_gettimeofday(&buf
->vb
.ts
);
597 s2255_fillbuff(channel
, buf
, jpgsize
);
598 wake_up(&buf
->vb
.done
);
599 dprintk(2, "%s: [buf/i] [%p/%d]\n", __func__
, buf
, buf
->vb
.i
);
601 spin_unlock_irqrestore(&dev
->slock
, flags
);
605 static const struct s2255_fmt
*format_by_fourcc(int fourcc
)
608 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
609 if (-1 == formats
[i
].fourcc
)
611 if (formats
[i
].fourcc
== fourcc
)
617 /* video buffer vmalloc implementation based partly on VIVI driver which is
618 * Copyright (c) 2006 by
619 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
620 * Ted Walther <ted--a.t--enumera.com>
621 * John Sokol <sokol--a.t--videotechnology.com>
622 * http://v4l.videotechnology.com/
625 static void s2255_fillbuff(struct s2255_channel
*channel
,
626 struct s2255_buffer
*buf
, int jpgsize
)
631 char *vbuf
= videobuf_to_vmalloc(&buf
->vb
);
632 unsigned long last_frame
;
633 struct s2255_framei
*frm
;
637 last_frame
= channel
->last_frame
;
638 if (last_frame
!= -1) {
639 frm
= &channel
->buffer
.frame
[last_frame
];
641 (const char *)channel
->buffer
.frame
[last_frame
].lpvbits
;
642 switch (buf
->fmt
->fourcc
) {
643 case V4L2_PIX_FMT_YUYV
:
644 case V4L2_PIX_FMT_UYVY
:
645 planar422p_to_yuv_packed((const unsigned char *)tmpbuf
,
650 case V4L2_PIX_FMT_GREY
:
651 memcpy(vbuf
, tmpbuf
, buf
->vb
.width
* buf
->vb
.height
);
653 case V4L2_PIX_FMT_JPEG
:
654 buf
->vb
.size
= jpgsize
;
655 memcpy(vbuf
, tmpbuf
, buf
->vb
.size
);
657 case V4L2_PIX_FMT_YUV422P
:
659 buf
->vb
.width
* buf
->vb
.height
* 2);
662 printk(KERN_DEBUG
"s2255: unknown format?\n");
664 channel
->last_frame
= -1;
666 printk(KERN_ERR
"s2255: =======no frame\n");
670 dprintk(2, "s2255fill at : Buffer 0x%08lx size= %d\n",
671 (unsigned long)vbuf
, pos
);
672 /* tell v4l buffer was filled */
674 buf
->vb
.field_count
= channel
->frame_count
* 2;
675 do_gettimeofday(&ts
);
677 buf
->vb
.state
= VIDEOBUF_DONE
;
681 /* ------------------------------------------------------------------
683 ------------------------------------------------------------------*/
685 static int buffer_setup(struct videobuf_queue
*vq
, unsigned int *count
,
688 struct s2255_fh
*fh
= vq
->priv_data
;
689 struct s2255_channel
*channel
= fh
->channel
;
690 *size
= channel
->width
* channel
->height
* (channel
->fmt
->depth
>> 3);
693 *count
= S2255_DEF_BUFS
;
695 if (*size
* *count
> vid_limit
* 1024 * 1024)
696 *count
= (vid_limit
* 1024 * 1024) / *size
;
701 static void free_buffer(struct videobuf_queue
*vq
, struct s2255_buffer
*buf
)
703 dprintk(4, "%s\n", __func__
);
705 videobuf_vmalloc_free(&buf
->vb
);
706 buf
->vb
.state
= VIDEOBUF_NEEDS_INIT
;
709 static int buffer_prepare(struct videobuf_queue
*vq
, struct videobuf_buffer
*vb
,
710 enum v4l2_field field
)
712 struct s2255_fh
*fh
= vq
->priv_data
;
713 struct s2255_channel
*channel
= fh
->channel
;
714 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
716 int w
= channel
->width
;
717 int h
= channel
->height
;
718 dprintk(4, "%s, field=%d\n", __func__
, field
);
719 if (channel
->fmt
== NULL
)
722 if ((w
< norm_minw(&channel
->vdev
)) ||
723 (w
> norm_maxw(&channel
->vdev
)) ||
724 (h
< norm_minh(&channel
->vdev
)) ||
725 (h
> norm_maxh(&channel
->vdev
))) {
726 dprintk(4, "invalid buffer prepare\n");
729 buf
->vb
.size
= w
* h
* (channel
->fmt
->depth
>> 3);
730 if (0 != buf
->vb
.baddr
&& buf
->vb
.bsize
< buf
->vb
.size
) {
731 dprintk(4, "invalid buffer prepare\n");
735 buf
->fmt
= channel
->fmt
;
738 buf
->vb
.field
= field
;
740 if (VIDEOBUF_NEEDS_INIT
== buf
->vb
.state
) {
741 rc
= videobuf_iolock(vq
, &buf
->vb
, NULL
);
746 buf
->vb
.state
= VIDEOBUF_PREPARED
;
749 free_buffer(vq
, buf
);
753 static void buffer_queue(struct videobuf_queue
*vq
, struct videobuf_buffer
*vb
)
755 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
756 struct s2255_fh
*fh
= vq
->priv_data
;
757 struct s2255_channel
*channel
= fh
->channel
;
758 struct s2255_dmaqueue
*vidq
= &channel
->vidq
;
759 dprintk(1, "%s\n", __func__
);
760 buf
->vb
.state
= VIDEOBUF_QUEUED
;
761 list_add_tail(&buf
->vb
.queue
, &vidq
->active
);
764 static void buffer_release(struct videobuf_queue
*vq
,
765 struct videobuf_buffer
*vb
)
767 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
768 struct s2255_fh
*fh
= vq
->priv_data
;
769 dprintk(4, "%s %d\n", __func__
, fh
->channel
->idx
);
770 free_buffer(vq
, buf
);
773 static struct videobuf_queue_ops s2255_video_qops
= {
774 .buf_setup
= buffer_setup
,
775 .buf_prepare
= buffer_prepare
,
776 .buf_queue
= buffer_queue
,
777 .buf_release
= buffer_release
,
781 static int res_get(struct s2255_fh
*fh
)
783 struct s2255_channel
*channel
= fh
->channel
;
785 if (channel
->resources
)
786 return 0; /* no, someone else uses it */
787 /* it's free, grab it */
788 channel
->resources
= 1;
790 dprintk(1, "s2255: res: get\n");
794 static int res_locked(struct s2255_fh
*fh
)
796 return fh
->channel
->resources
;
799 static int res_check(struct s2255_fh
*fh
)
801 return fh
->resources
;
805 static void res_free(struct s2255_fh
*fh
)
807 struct s2255_channel
*channel
= fh
->channel
;
808 channel
->resources
= 0;
810 dprintk(1, "res: put\n");
813 static int vidioc_querymenu(struct file
*file
, void *priv
,
814 struct v4l2_querymenu
*qmenu
)
816 static const char *colorfilter
[] = {
821 if (qmenu
->id
== V4L2_CID_PRIVATE_COLORFILTER
) {
823 const char **menu_items
= colorfilter
;
824 for (i
= 0; i
< qmenu
->index
&& menu_items
[i
]; i
++)
825 ; /* do nothing (from v4l2-common.c) */
826 if (menu_items
[i
] == NULL
|| menu_items
[i
][0] == '\0')
828 strlcpy(qmenu
->name
, menu_items
[qmenu
->index
],
829 sizeof(qmenu
->name
));
832 return v4l2_ctrl_query_menu(qmenu
, NULL
, NULL
);
835 static int vidioc_querycap(struct file
*file
, void *priv
,
836 struct v4l2_capability
*cap
)
838 struct s2255_fh
*fh
= file
->private_data
;
839 struct s2255_dev
*dev
= fh
->dev
;
840 strlcpy(cap
->driver
, "s2255", sizeof(cap
->driver
));
841 strlcpy(cap
->card
, "s2255", sizeof(cap
->card
));
842 usb_make_path(dev
->udev
, cap
->bus_info
, sizeof(cap
->bus_info
));
843 cap
->version
= S2255_VERSION
;
844 cap
->capabilities
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_STREAMING
;
848 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
849 struct v4l2_fmtdesc
*f
)
855 if (index
>= ARRAY_SIZE(formats
))
858 dprintk(4, "name %s\n", formats
[index
].name
);
859 strlcpy(f
->description
, formats
[index
].name
, sizeof(f
->description
));
860 f
->pixelformat
= formats
[index
].fourcc
;
864 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
865 struct v4l2_format
*f
)
867 struct s2255_fh
*fh
= priv
;
868 struct s2255_channel
*channel
= fh
->channel
;
870 f
->fmt
.pix
.width
= channel
->width
;
871 f
->fmt
.pix
.height
= channel
->height
;
872 f
->fmt
.pix
.field
= fh
->vb_vidq
.field
;
873 f
->fmt
.pix
.pixelformat
= channel
->fmt
->fourcc
;
874 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* (channel
->fmt
->depth
>> 3);
875 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
879 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
880 struct v4l2_format
*f
)
882 const struct s2255_fmt
*fmt
;
883 enum v4l2_field field
;
885 struct s2255_fh
*fh
= priv
;
886 struct s2255_channel
*channel
= fh
->channel
;
889 (channel
->vdev
.current_norm
& V4L2_STD_NTSC
) ? 1 : 0;
891 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
896 field
= f
->fmt
.pix
.field
;
897 if (field
== V4L2_FIELD_ANY
)
900 dprintk(50, "%s NTSC: %d suggested width: %d, height: %d\n",
901 __func__
, is_ntsc
, f
->fmt
.pix
.width
, f
->fmt
.pix
.height
);
904 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_NTSC
* 2) {
905 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
* 2;
907 field
= V4L2_FIELD_SEQ_TB
;
908 } else if (!((field
== V4L2_FIELD_INTERLACED
) ||
909 (field
== V4L2_FIELD_SEQ_TB
) ||
910 (field
== V4L2_FIELD_INTERLACED_TB
))) {
911 dprintk(1, "unsupported field setting\n");
915 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
;
917 field
= V4L2_FIELD_TOP
;
918 } else if (!((field
== V4L2_FIELD_TOP
) ||
919 (field
== V4L2_FIELD_BOTTOM
))) {
920 dprintk(1, "unsupported field setting\n");
925 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_NTSC
)
926 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_NTSC
;
927 else if (f
->fmt
.pix
.width
>= LINE_SZ_2CIFS_NTSC
)
928 f
->fmt
.pix
.width
= LINE_SZ_2CIFS_NTSC
;
929 else if (f
->fmt
.pix
.width
>= LINE_SZ_1CIFS_NTSC
)
930 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
932 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
935 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_PAL
* 2) {
936 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
* 2;
938 field
= V4L2_FIELD_SEQ_TB
;
939 } else if (!((field
== V4L2_FIELD_INTERLACED
) ||
940 (field
== V4L2_FIELD_SEQ_TB
) ||
941 (field
== V4L2_FIELD_INTERLACED_TB
))) {
942 dprintk(1, "unsupported field setting\n");
946 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
;
948 field
= V4L2_FIELD_TOP
;
949 } else if (!((field
== V4L2_FIELD_TOP
) ||
950 (field
== V4L2_FIELD_BOTTOM
))) {
951 dprintk(1, "unsupported field setting\n");
955 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_PAL
) {
956 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_PAL
;
957 field
= V4L2_FIELD_SEQ_TB
;
958 } else if (f
->fmt
.pix
.width
>= LINE_SZ_2CIFS_PAL
) {
959 f
->fmt
.pix
.width
= LINE_SZ_2CIFS_PAL
;
960 field
= V4L2_FIELD_TOP
;
961 } else if (f
->fmt
.pix
.width
>= LINE_SZ_1CIFS_PAL
) {
962 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
963 field
= V4L2_FIELD_TOP
;
965 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
966 field
= V4L2_FIELD_TOP
;
969 f
->fmt
.pix
.field
= field
;
970 f
->fmt
.pix
.bytesperline
= (f
->fmt
.pix
.width
* fmt
->depth
) >> 3;
971 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
972 dprintk(50, "%s: set width %d height %d field %d\n", __func__
,
973 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
, f
->fmt
.pix
.field
);
977 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
978 struct v4l2_format
*f
)
980 struct s2255_fh
*fh
= priv
;
981 struct s2255_channel
*channel
= fh
->channel
;
982 const struct s2255_fmt
*fmt
;
983 struct videobuf_queue
*q
= &fh
->vb_vidq
;
984 struct s2255_mode mode
;
988 ret
= vidioc_try_fmt_vid_cap(file
, fh
, f
);
993 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
998 mutex_lock(&q
->vb_lock
);
1000 if (videobuf_queue_is_busy(&fh
->vb_vidq
)) {
1001 dprintk(1, "queue busy\n");
1006 if (res_locked(fh
)) {
1007 dprintk(1, "%s: channel busy\n", __func__
);
1011 mode
= channel
->mode
;
1013 channel
->width
= f
->fmt
.pix
.width
;
1014 channel
->height
= f
->fmt
.pix
.height
;
1015 fh
->vb_vidq
.field
= f
->fmt
.pix
.field
;
1017 norm
= norm_minw(&channel
->vdev
);
1018 if (channel
->width
> norm_minw(&channel
->vdev
)) {
1019 if (channel
->height
> norm_minh(&channel
->vdev
)) {
1020 if (channel
->cap_parm
.capturemode
&
1021 V4L2_MODE_HIGHQUALITY
)
1022 mode
.scale
= SCALE_4CIFSI
;
1024 mode
.scale
= SCALE_4CIFS
;
1026 mode
.scale
= SCALE_2CIFS
;
1029 mode
.scale
= SCALE_1CIFS
;
1032 switch (channel
->fmt
->fourcc
) {
1033 case V4L2_PIX_FMT_GREY
:
1034 mode
.color
&= ~MASK_COLOR
;
1035 mode
.color
|= COLOR_Y8
;
1037 case V4L2_PIX_FMT_JPEG
:
1038 mode
.color
&= ~MASK_COLOR
;
1039 mode
.color
|= COLOR_JPG
;
1040 mode
.color
|= (channel
->jc
.quality
<< 8);
1042 case V4L2_PIX_FMT_YUV422P
:
1043 mode
.color
&= ~MASK_COLOR
;
1044 mode
.color
|= COLOR_YUVPL
;
1046 case V4L2_PIX_FMT_YUYV
:
1047 case V4L2_PIX_FMT_UYVY
:
1049 mode
.color
&= ~MASK_COLOR
;
1050 mode
.color
|= COLOR_YUVPK
;
1053 if ((mode
.color
& MASK_COLOR
) != (channel
->mode
.color
& MASK_COLOR
))
1055 else if (mode
.scale
!= channel
->mode
.scale
)
1057 else if (mode
.format
!= channel
->mode
.format
)
1059 channel
->mode
= mode
;
1060 (void) s2255_set_mode(channel
, &mode
);
1063 mutex_unlock(&q
->vb_lock
);
1067 static int vidioc_reqbufs(struct file
*file
, void *priv
,
1068 struct v4l2_requestbuffers
*p
)
1071 struct s2255_fh
*fh
= priv
;
1072 rc
= videobuf_reqbufs(&fh
->vb_vidq
, p
);
1076 static int vidioc_querybuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1079 struct s2255_fh
*fh
= priv
;
1080 rc
= videobuf_querybuf(&fh
->vb_vidq
, p
);
1084 static int vidioc_qbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1087 struct s2255_fh
*fh
= priv
;
1088 rc
= videobuf_qbuf(&fh
->vb_vidq
, p
);
1092 static int vidioc_dqbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1095 struct s2255_fh
*fh
= priv
;
1096 rc
= videobuf_dqbuf(&fh
->vb_vidq
, p
, file
->f_flags
& O_NONBLOCK
);
1100 /* write to the configuration pipe, synchronously */
1101 static int s2255_write_config(struct usb_device
*udev
, unsigned char *pbuf
,
1108 pipe
= usb_sndbulkpipe(udev
, S2255_CONFIG_EP
);
1109 retval
= usb_bulk_msg(udev
, pipe
, pbuf
, size
, &done
, 500);
1114 static u32
get_transfer_size(struct s2255_mode
*mode
)
1116 int linesPerFrame
= LINE_SZ_DEF
;
1117 int pixelsPerLine
= NUM_LINES_DEF
;
1120 unsigned int mask_mult
;
1125 if (mode
->format
== FORMAT_NTSC
) {
1126 switch (mode
->scale
) {
1129 linesPerFrame
= NUM_LINES_4CIFS_NTSC
* 2;
1130 pixelsPerLine
= LINE_SZ_4CIFS_NTSC
;
1133 linesPerFrame
= NUM_LINES_2CIFS_NTSC
;
1134 pixelsPerLine
= LINE_SZ_2CIFS_NTSC
;
1137 linesPerFrame
= NUM_LINES_1CIFS_NTSC
;
1138 pixelsPerLine
= LINE_SZ_1CIFS_NTSC
;
1143 } else if (mode
->format
== FORMAT_PAL
) {
1144 switch (mode
->scale
) {
1147 linesPerFrame
= NUM_LINES_4CIFS_PAL
* 2;
1148 pixelsPerLine
= LINE_SZ_4CIFS_PAL
;
1151 linesPerFrame
= NUM_LINES_2CIFS_PAL
;
1152 pixelsPerLine
= LINE_SZ_2CIFS_PAL
;
1155 linesPerFrame
= NUM_LINES_1CIFS_PAL
;
1156 pixelsPerLine
= LINE_SZ_1CIFS_PAL
;
1162 outImageSize
= linesPerFrame
* pixelsPerLine
;
1163 if ((mode
->color
& MASK_COLOR
) != COLOR_Y8
) {
1164 /* 2 bytes/pixel if not monochrome */
1168 /* total bytes to send including prefix and 4K padding;
1169 must be a multiple of USB_READ_SIZE */
1170 usbInSize
= outImageSize
+ PREFIX_SIZE
; /* always send prefix */
1171 mask_mult
= 0xffffffffUL
- DEF_USB_BLOCK
+ 1;
1172 /* if size not a multiple of USB_READ_SIZE */
1173 if (usbInSize
& ~mask_mult
)
1174 usbInSize
= (usbInSize
& mask_mult
) + (DEF_USB_BLOCK
);
1178 static void s2255_print_cfg(struct s2255_dev
*sdev
, struct s2255_mode
*mode
)
1180 struct device
*dev
= &sdev
->udev
->dev
;
1181 dev_info(dev
, "------------------------------------------------\n");
1182 dev_info(dev
, "format: %d\nscale %d\n", mode
->format
, mode
->scale
);
1183 dev_info(dev
, "fdec: %d\ncolor %d\n", mode
->fdec
, mode
->color
);
1184 dev_info(dev
, "bright: 0x%x\n", mode
->bright
);
1185 dev_info(dev
, "------------------------------------------------\n");
1189 * set mode is the function which controls the DSP.
1190 * the restart parameter in struct s2255_mode should be set whenever
1191 * the image size could change via color format, video system or image
1193 * When the restart parameter is set, we sleep for ONE frame to allow the
1194 * DSP time to get the new frame
1196 static int s2255_set_mode(struct s2255_channel
*channel
,
1197 struct s2255_mode
*mode
)
1201 unsigned long chn_rev
;
1202 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
1203 chn_rev
= G_chnmap
[channel
->idx
];
1204 dprintk(3, "%s channel: %d\n", __func__
, channel
->idx
);
1205 /* if JPEG, set the quality */
1206 if ((mode
->color
& MASK_COLOR
) == COLOR_JPG
) {
1207 mode
->color
&= ~MASK_COLOR
;
1208 mode
->color
|= COLOR_JPG
;
1209 mode
->color
&= ~MASK_JPG_QUALITY
;
1210 mode
->color
|= (channel
->jc
.quality
<< 8);
1213 channel
->mode
= *mode
;
1214 channel
->req_image_size
= get_transfer_size(mode
);
1215 dprintk(1, "%s: reqsize %ld\n", __func__
, channel
->req_image_size
);
1216 buffer
= kzalloc(512, GFP_KERNEL
);
1217 if (buffer
== NULL
) {
1218 dev_err(&dev
->udev
->dev
, "out of mem\n");
1222 buffer
[0] = IN_DATA_TOKEN
;
1223 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1224 buffer
[2] = CMD_SET_MODE
;
1225 memcpy(&buffer
[3], &channel
->mode
, sizeof(struct s2255_mode
));
1226 channel
->setmode_ready
= 0;
1227 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1229 s2255_print_cfg(dev
, mode
);
1231 /* wait at least 3 frames before continuing */
1232 if (mode
->restart
) {
1233 wait_event_timeout(channel
->wait_setmode
,
1234 (channel
->setmode_ready
!= 0),
1235 msecs_to_jiffies(S2255_SETMODE_TIMEOUT
));
1236 if (channel
->setmode_ready
!= 1) {
1237 printk(KERN_DEBUG
"s2255: no set mode response\n");
1241 /* clear the restart flag */
1242 channel
->mode
.restart
= 0;
1243 dprintk(1, "%s chn %d, result: %d\n", __func__
, channel
->idx
, res
);
1247 static int s2255_cmd_status(struct s2255_channel
*channel
, u32
*pstatus
)
1252 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
1253 chn_rev
= G_chnmap
[channel
->idx
];
1254 dprintk(4, "%s chan %d\n", __func__
, channel
->idx
);
1255 buffer
= kzalloc(512, GFP_KERNEL
);
1256 if (buffer
== NULL
) {
1257 dev_err(&dev
->udev
->dev
, "out of mem\n");
1260 /* form the get vid status command */
1261 buffer
[0] = IN_DATA_TOKEN
;
1262 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1263 buffer
[2] = CMD_STATUS
;
1265 channel
->vidstatus_ready
= 0;
1266 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1268 wait_event_timeout(channel
->wait_vidstatus
,
1269 (channel
->vidstatus_ready
!= 0),
1270 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT
));
1271 if (channel
->vidstatus_ready
!= 1) {
1272 printk(KERN_DEBUG
"s2255: no vidstatus response\n");
1275 *pstatus
= channel
->vidstatus
;
1276 dprintk(4, "%s, vid status %d\n", __func__
, *pstatus
);
1280 static int vidioc_streamon(struct file
*file
, void *priv
, enum v4l2_buf_type i
)
1283 struct s2255_fh
*fh
= priv
;
1284 struct s2255_dev
*dev
= fh
->dev
;
1285 struct s2255_channel
*channel
= fh
->channel
;
1287 dprintk(4, "%s\n", __func__
);
1288 if (fh
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
1289 dev_err(&dev
->udev
->dev
, "invalid fh type0\n");
1292 if (i
!= fh
->type
) {
1293 dev_err(&dev
->udev
->dev
, "invalid fh type1\n");
1298 s2255_dev_err(&dev
->udev
->dev
, "stream busy\n");
1301 channel
->last_frame
= -1;
1302 channel
->bad_payload
= 0;
1303 channel
->cur_frame
= 0;
1304 channel
->frame_count
= 0;
1305 for (j
= 0; j
< SYS_FRAMES
; j
++) {
1306 channel
->buffer
.frame
[j
].ulState
= S2255_READ_IDLE
;
1307 channel
->buffer
.frame
[j
].cur_size
= 0;
1309 res
= videobuf_streamon(&fh
->vb_vidq
);
1311 s2255_start_acquire(channel
);
1312 channel
->b_acquire
= 1;
1319 static int vidioc_streamoff(struct file
*file
, void *priv
, enum v4l2_buf_type i
)
1321 struct s2255_fh
*fh
= priv
;
1322 dprintk(4, "%s\n, channel: %d", __func__
, fh
->channel
->idx
);
1323 if (fh
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
1324 printk(KERN_ERR
"invalid fh type0\n");
1327 if (i
!= fh
->type
) {
1328 printk(KERN_ERR
"invalid type i\n");
1331 s2255_stop_acquire(fh
->channel
);
1332 videobuf_streamoff(&fh
->vb_vidq
);
1337 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id
*i
)
1339 struct s2255_fh
*fh
= priv
;
1340 struct s2255_mode mode
;
1341 struct videobuf_queue
*q
= &fh
->vb_vidq
;
1343 mutex_lock(&q
->vb_lock
);
1344 if (videobuf_queue_is_busy(q
)) {
1345 dprintk(1, "queue busy\n");
1349 if (res_locked(fh
)) {
1350 dprintk(1, "can't change standard after started\n");
1354 mode
= fh
->channel
->mode
;
1355 if (*i
& V4L2_STD_NTSC
) {
1356 dprintk(4, "%s NTSC\n", __func__
);
1357 /* if changing format, reset frame decimation/intervals */
1358 if (mode
.format
!= FORMAT_NTSC
) {
1360 mode
.format
= FORMAT_NTSC
;
1363 } else if (*i
& V4L2_STD_PAL
) {
1364 dprintk(4, "%s PAL\n", __func__
);
1365 if (mode
.format
!= FORMAT_PAL
) {
1367 mode
.format
= FORMAT_PAL
;
1374 s2255_set_mode(fh
->channel
, &mode
);
1376 mutex_unlock(&q
->vb_lock
);
1380 /* Sensoray 2255 is a multiple channel capture device.
1381 It does not have a "crossbar" of inputs.
1382 We use one V4L device per channel. The user must
1383 be aware that certain combinations are not allowed.
1384 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1385 at once in color(you can do full fps on 4 channels with greyscale.
1387 static int vidioc_enum_input(struct file
*file
, void *priv
,
1388 struct v4l2_input
*inp
)
1390 struct s2255_fh
*fh
= priv
;
1391 struct s2255_dev
*dev
= fh
->dev
;
1392 struct s2255_channel
*channel
= fh
->channel
;
1394 if (inp
->index
!= 0)
1396 inp
->type
= V4L2_INPUT_TYPE_CAMERA
;
1397 inp
->std
= S2255_NORMS
;
1399 if (dev
->dsp_fw_ver
>= S2255_MIN_DSP_STATUS
) {
1401 rc
= s2255_cmd_status(fh
->channel
, &status
);
1402 dprintk(4, "s2255_cmd_status rc: %d status %x\n", rc
, status
);
1404 inp
->status
= (status
& 0x01) ? 0
1405 : V4L2_IN_ST_NO_SIGNAL
;
1410 strlcpy(inp
->name
, "Composite", sizeof(inp
->name
));
1413 strlcpy(inp
->name
, (channel
->idx
< 2) ? "Composite" : "S-Video",
1420 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1425 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
1432 /* --- controls ---------------------------------------------- */
1433 static int vidioc_queryctrl(struct file
*file
, void *priv
,
1434 struct v4l2_queryctrl
*qc
)
1436 struct s2255_fh
*fh
= priv
;
1437 struct s2255_channel
*channel
= fh
->channel
;
1438 struct s2255_dev
*dev
= fh
->dev
;
1440 case V4L2_CID_BRIGHTNESS
:
1441 v4l2_ctrl_query_fill(qc
, -127, 127, 1, DEF_BRIGHT
);
1443 case V4L2_CID_CONTRAST
:
1444 v4l2_ctrl_query_fill(qc
, 0, 255, 1, DEF_CONTRAST
);
1446 case V4L2_CID_SATURATION
:
1447 v4l2_ctrl_query_fill(qc
, 0, 255, 1, DEF_SATURATION
);
1450 v4l2_ctrl_query_fill(qc
, 0, 255, 1, DEF_HUE
);
1452 case V4L2_CID_PRIVATE_COLORFILTER
:
1453 if (dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
1455 if ((dev
->pid
== 0x2257) && (channel
->idx
> 1))
1457 strlcpy(qc
->name
, "Color Filter", sizeof(qc
->name
));
1458 qc
->type
= V4L2_CTRL_TYPE_MENU
;
1462 qc
->default_value
= 1;
1468 dprintk(4, "%s, id %d\n", __func__
, qc
->id
);
1472 static int vidioc_g_ctrl(struct file
*file
, void *priv
,
1473 struct v4l2_control
*ctrl
)
1475 struct s2255_fh
*fh
= priv
;
1476 struct s2255_dev
*dev
= fh
->dev
;
1477 struct s2255_channel
*channel
= fh
->channel
;
1479 case V4L2_CID_BRIGHTNESS
:
1480 ctrl
->value
= channel
->mode
.bright
;
1482 case V4L2_CID_CONTRAST
:
1483 ctrl
->value
= channel
->mode
.contrast
;
1485 case V4L2_CID_SATURATION
:
1486 ctrl
->value
= channel
->mode
.saturation
;
1489 ctrl
->value
= channel
->mode
.hue
;
1491 case V4L2_CID_PRIVATE_COLORFILTER
:
1492 if (dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
1494 if ((dev
->pid
== 0x2257) && (channel
->idx
> 1))
1496 ctrl
->value
= !((channel
->mode
.color
& MASK_INPUT_TYPE
) >> 16);
1501 dprintk(4, "%s, id %d val %d\n", __func__
, ctrl
->id
, ctrl
->value
);
1505 static int vidioc_s_ctrl(struct file
*file
, void *priv
,
1506 struct v4l2_control
*ctrl
)
1508 struct s2255_fh
*fh
= priv
;
1509 struct s2255_channel
*channel
= fh
->channel
;
1510 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
1511 struct s2255_mode mode
;
1512 mode
= channel
->mode
;
1513 dprintk(4, "%s\n", __func__
);
1514 /* update the mode to the corresponding value */
1516 case V4L2_CID_BRIGHTNESS
:
1517 mode
.bright
= ctrl
->value
;
1519 case V4L2_CID_CONTRAST
:
1520 mode
.contrast
= ctrl
->value
;
1523 mode
.hue
= ctrl
->value
;
1525 case V4L2_CID_SATURATION
:
1526 mode
.saturation
= ctrl
->value
;
1528 case V4L2_CID_PRIVATE_COLORFILTER
:
1529 if (dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
1531 if ((dev
->pid
== 0x2257) && (channel
->idx
> 1))
1533 mode
.color
&= ~MASK_INPUT_TYPE
;
1534 mode
.color
|= ((ctrl
->value
? 0 : 1) << 16);
1540 /* set mode here. Note: stream does not need restarted.
1541 some V4L programs restart stream unnecessarily
1544 s2255_set_mode(fh
->channel
, &mode
);
1548 static int vidioc_g_jpegcomp(struct file
*file
, void *priv
,
1549 struct v4l2_jpegcompression
*jc
)
1551 struct s2255_fh
*fh
= priv
;
1552 struct s2255_channel
*channel
= fh
->channel
;
1554 dprintk(2, "%s: quality %d\n", __func__
, jc
->quality
);
1558 static int vidioc_s_jpegcomp(struct file
*file
, void *priv
,
1559 struct v4l2_jpegcompression
*jc
)
1561 struct s2255_fh
*fh
= priv
;
1562 struct s2255_channel
*channel
= fh
->channel
;
1563 if (jc
->quality
< 0 || jc
->quality
> 100)
1565 channel
->jc
.quality
= jc
->quality
;
1566 dprintk(2, "%s: quality %d\n", __func__
, jc
->quality
);
1570 static int vidioc_g_parm(struct file
*file
, void *priv
,
1571 struct v4l2_streamparm
*sp
)
1573 struct s2255_fh
*fh
= priv
;
1574 __u32 def_num
, def_dem
;
1575 struct s2255_channel
*channel
= fh
->channel
;
1576 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1578 memset(sp
, 0, sizeof(struct v4l2_streamparm
));
1579 sp
->parm
.capture
.capability
= V4L2_CAP_TIMEPERFRAME
;
1580 sp
->parm
.capture
.capturemode
= channel
->cap_parm
.capturemode
;
1581 def_num
= (channel
->mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1582 def_dem
= (channel
->mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1583 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1584 switch (channel
->mode
.fdec
) {
1587 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1590 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1593 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1596 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1599 dprintk(4, "%s capture mode, %d timeperframe %d/%d\n", __func__
,
1600 sp
->parm
.capture
.capturemode
,
1601 sp
->parm
.capture
.timeperframe
.numerator
,
1602 sp
->parm
.capture
.timeperframe
.denominator
);
1606 static int vidioc_s_parm(struct file
*file
, void *priv
,
1607 struct v4l2_streamparm
*sp
)
1609 struct s2255_fh
*fh
= priv
;
1610 struct s2255_channel
*channel
= fh
->channel
;
1611 struct s2255_mode mode
;
1613 __u32 def_num
, def_dem
;
1614 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1616 mode
= channel
->mode
;
1617 /* high quality capture mode requires a stream restart */
1618 if (channel
->cap_parm
.capturemode
1619 != sp
->parm
.capture
.capturemode
&& res_locked(fh
))
1621 def_num
= (mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1622 def_dem
= (mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1623 if (def_dem
!= sp
->parm
.capture
.timeperframe
.denominator
)
1624 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1625 else if (sp
->parm
.capture
.timeperframe
.numerator
<= def_num
)
1626 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1627 else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 2)) {
1628 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1630 } else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 3)) {
1631 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1634 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1638 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1639 s2255_set_mode(channel
, &mode
);
1640 dprintk(4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1642 sp
->parm
.capture
.capturemode
,
1643 sp
->parm
.capture
.timeperframe
.numerator
,
1644 sp
->parm
.capture
.timeperframe
.denominator
, fdec
);
1648 static int vidioc_enum_frameintervals(struct file
*file
, void *priv
,
1649 struct v4l2_frmivalenum
*fe
)
1652 #define NUM_FRAME_ENUMS 4
1653 int frm_dec
[NUM_FRAME_ENUMS
] = {1, 2, 3, 5};
1654 if (fe
->index
< 0 || fe
->index
>= NUM_FRAME_ENUMS
)
1656 switch (fe
->width
) {
1658 if (fe
->height
!= 240 && fe
->height
!= 480)
1663 if (fe
->height
!= 240)
1668 if (fe
->height
!= 288 && fe
->height
!= 576)
1672 if (fe
->height
!= 288)
1678 fe
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
1679 fe
->discrete
.denominator
= is_ntsc
? 30000 : 25000;
1680 fe
->discrete
.numerator
= (is_ntsc
? 1001 : 1000) * frm_dec
[fe
->index
];
1681 dprintk(4, "%s discrete %d/%d\n", __func__
, fe
->discrete
.numerator
,
1682 fe
->discrete
.denominator
);
1686 static int s2255_open(struct file
*file
)
1688 struct video_device
*vdev
= video_devdata(file
);
1689 struct s2255_channel
*channel
= video_drvdata(file
);
1690 struct s2255_dev
*dev
= to_s2255_dev(vdev
->v4l2_dev
);
1691 struct s2255_fh
*fh
;
1692 enum v4l2_buf_type type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1694 dprintk(1, "s2255: open called (dev=%s)\n",
1695 video_device_node_name(vdev
));
1697 * open lock necessary to prevent multiple instances
1698 * of v4l-conf (or other programs) from simultaneously
1699 * reloading firmware.
1701 mutex_lock(&dev
->open_lock
);
1702 state
= atomic_read(&dev
->fw_data
->fw_state
);
1704 case S2255_FW_DISCONNECTING
:
1705 mutex_unlock(&dev
->open_lock
);
1707 case S2255_FW_FAILED
:
1708 s2255_dev_err(&dev
->udev
->dev
,
1709 "firmware load failed. retrying.\n");
1710 s2255_fwload_start(dev
, 1);
1711 wait_event_timeout(dev
->fw_data
->wait_fw
,
1712 ((atomic_read(&dev
->fw_data
->fw_state
)
1713 == S2255_FW_SUCCESS
) ||
1714 (atomic_read(&dev
->fw_data
->fw_state
)
1715 == S2255_FW_DISCONNECTING
)),
1716 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1717 /* state may have changed, re-read */
1718 state
= atomic_read(&dev
->fw_data
->fw_state
);
1720 case S2255_FW_NOTLOADED
:
1721 case S2255_FW_LOADED_DSPWAIT
:
1722 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1723 driver loaded and then device immediately opened */
1724 printk(KERN_INFO
"%s waiting for firmware load\n", __func__
);
1725 wait_event_timeout(dev
->fw_data
->wait_fw
,
1726 ((atomic_read(&dev
->fw_data
->fw_state
)
1727 == S2255_FW_SUCCESS
) ||
1728 (atomic_read(&dev
->fw_data
->fw_state
)
1729 == S2255_FW_DISCONNECTING
)),
1730 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1731 /* state may have changed, re-read */
1732 state
= atomic_read(&dev
->fw_data
->fw_state
);
1734 case S2255_FW_SUCCESS
:
1738 /* state may have changed in above switch statement */
1740 case S2255_FW_SUCCESS
:
1742 case S2255_FW_FAILED
:
1743 printk(KERN_INFO
"2255 firmware load failed.\n");
1744 mutex_unlock(&dev
->open_lock
);
1746 case S2255_FW_DISCONNECTING
:
1747 printk(KERN_INFO
"%s: disconnecting\n", __func__
);
1748 mutex_unlock(&dev
->open_lock
);
1750 case S2255_FW_LOADED_DSPWAIT
:
1751 case S2255_FW_NOTLOADED
:
1752 printk(KERN_INFO
"%s: firmware not loaded yet"
1753 "please try again later\n",
1756 * Timeout on firmware load means device unusable.
1757 * Set firmware failure state.
1758 * On next s2255_open the firmware will be reloaded.
1760 atomic_set(&dev
->fw_data
->fw_state
,
1762 mutex_unlock(&dev
->open_lock
);
1765 printk(KERN_INFO
"%s: unknown state\n", __func__
);
1766 mutex_unlock(&dev
->open_lock
);
1769 mutex_unlock(&dev
->open_lock
);
1770 /* allocate + initialize per filehandle data */
1771 fh
= kzalloc(sizeof(*fh
), GFP_KERNEL
);
1774 file
->private_data
= fh
;
1776 fh
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1777 fh
->channel
= channel
;
1778 if (!channel
->configured
) {
1779 /* configure channel to default state */
1780 channel
->fmt
= &formats
[0];
1781 s2255_set_mode(channel
, &channel
->mode
);
1782 channel
->configured
= 1;
1784 dprintk(1, "%s: dev=%s type=%s\n", __func__
,
1785 video_device_node_name(vdev
), v4l2_type_names
[type
]);
1786 dprintk(2, "%s: fh=0x%08lx, dev=0x%08lx, vidq=0x%08lx\n", __func__
,
1787 (unsigned long)fh
, (unsigned long)dev
,
1788 (unsigned long)&channel
->vidq
);
1789 dprintk(4, "%s: list_empty active=%d\n", __func__
,
1790 list_empty(&channel
->vidq
.active
));
1791 videobuf_queue_vmalloc_init(&fh
->vb_vidq
, &s2255_video_qops
,
1794 V4L2_FIELD_INTERLACED
,
1795 sizeof(struct s2255_buffer
),
1801 static unsigned int s2255_poll(struct file
*file
,
1802 struct poll_table_struct
*wait
)
1804 struct s2255_fh
*fh
= file
->private_data
;
1806 dprintk(100, "%s\n", __func__
);
1807 if (V4L2_BUF_TYPE_VIDEO_CAPTURE
!= fh
->type
)
1809 rc
= videobuf_poll_stream(file
, &fh
->vb_vidq
, wait
);
1813 static void s2255_destroy(struct s2255_dev
*dev
)
1815 /* board shutdown stops the read pipe if it is running */
1816 s2255_board_shutdown(dev
);
1817 /* make sure firmware still not trying to load */
1818 del_timer(&dev
->timer
); /* only started in .probe and .open */
1819 if (dev
->fw_data
->fw_urb
) {
1820 usb_kill_urb(dev
->fw_data
->fw_urb
);
1821 usb_free_urb(dev
->fw_data
->fw_urb
);
1822 dev
->fw_data
->fw_urb
= NULL
;
1824 if (dev
->fw_data
->fw
)
1825 release_firmware(dev
->fw_data
->fw
);
1826 kfree(dev
->fw_data
->pfw_data
);
1827 kfree(dev
->fw_data
);
1828 /* reset the DSP so firmware can be reloaded next time */
1829 s2255_reset_dsppower(dev
);
1830 mutex_destroy(&dev
->open_lock
);
1831 mutex_destroy(&dev
->lock
);
1832 usb_put_dev(dev
->udev
);
1833 v4l2_device_unregister(&dev
->v4l2_dev
);
1834 dprintk(1, "%s", __func__
);
1838 static int s2255_release(struct file
*file
)
1840 struct s2255_fh
*fh
= file
->private_data
;
1841 struct s2255_dev
*dev
= fh
->dev
;
1842 struct video_device
*vdev
= video_devdata(file
);
1843 struct s2255_channel
*channel
= fh
->channel
;
1846 /* turn off stream */
1847 if (res_check(fh
)) {
1848 if (channel
->b_acquire
)
1849 s2255_stop_acquire(fh
->channel
);
1850 videobuf_streamoff(&fh
->vb_vidq
);
1853 videobuf_mmap_free(&fh
->vb_vidq
);
1854 dprintk(1, "%s (dev=%s)\n", __func__
, video_device_node_name(vdev
));
1859 static int s2255_mmap_v4l(struct file
*file
, struct vm_area_struct
*vma
)
1861 struct s2255_fh
*fh
= file
->private_data
;
1866 dprintk(4, "%s, vma=0x%08lx\n", __func__
, (unsigned long)vma
);
1867 ret
= videobuf_mmap_mapper(&fh
->vb_vidq
, vma
);
1868 dprintk(4, "%s vma start=0x%08lx, size=%ld, ret=%d\n", __func__
,
1869 (unsigned long)vma
->vm_start
,
1870 (unsigned long)vma
->vm_end
- (unsigned long)vma
->vm_start
, ret
);
1874 static const struct v4l2_file_operations s2255_fops_v4l
= {
1875 .owner
= THIS_MODULE
,
1877 .release
= s2255_release
,
1879 .unlocked_ioctl
= video_ioctl2
, /* V4L2 ioctl handler */
1880 .mmap
= s2255_mmap_v4l
,
1883 static const struct v4l2_ioctl_ops s2255_ioctl_ops
= {
1884 .vidioc_querymenu
= vidioc_querymenu
,
1885 .vidioc_querycap
= vidioc_querycap
,
1886 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1887 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1888 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1889 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1890 .vidioc_reqbufs
= vidioc_reqbufs
,
1891 .vidioc_querybuf
= vidioc_querybuf
,
1892 .vidioc_qbuf
= vidioc_qbuf
,
1893 .vidioc_dqbuf
= vidioc_dqbuf
,
1894 .vidioc_s_std
= vidioc_s_std
,
1895 .vidioc_enum_input
= vidioc_enum_input
,
1896 .vidioc_g_input
= vidioc_g_input
,
1897 .vidioc_s_input
= vidioc_s_input
,
1898 .vidioc_queryctrl
= vidioc_queryctrl
,
1899 .vidioc_g_ctrl
= vidioc_g_ctrl
,
1900 .vidioc_s_ctrl
= vidioc_s_ctrl
,
1901 .vidioc_streamon
= vidioc_streamon
,
1902 .vidioc_streamoff
= vidioc_streamoff
,
1903 .vidioc_s_jpegcomp
= vidioc_s_jpegcomp
,
1904 .vidioc_g_jpegcomp
= vidioc_g_jpegcomp
,
1905 .vidioc_s_parm
= vidioc_s_parm
,
1906 .vidioc_g_parm
= vidioc_g_parm
,
1907 .vidioc_enum_frameintervals
= vidioc_enum_frameintervals
,
1910 static void s2255_video_device_release(struct video_device
*vdev
)
1912 struct s2255_dev
*dev
= to_s2255_dev(vdev
->v4l2_dev
);
1913 dprintk(4, "%s, chnls: %d \n", __func__
,
1914 atomic_read(&dev
->num_channels
));
1915 if (atomic_dec_and_test(&dev
->num_channels
))
1920 static struct video_device
template = {
1922 .fops
= &s2255_fops_v4l
,
1923 .ioctl_ops
= &s2255_ioctl_ops
,
1924 .release
= s2255_video_device_release
,
1925 .tvnorms
= S2255_NORMS
,
1926 .current_norm
= V4L2_STD_NTSC_M
,
1929 static int s2255_probe_v4l(struct s2255_dev
*dev
)
1933 int cur_nr
= video_nr
;
1934 struct s2255_channel
*channel
;
1935 ret
= v4l2_device_register(&dev
->interface
->dev
, &dev
->v4l2_dev
);
1938 /* initialize all video 4 linux */
1939 /* register 4 video devices */
1940 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1941 channel
= &dev
->channel
[i
];
1942 INIT_LIST_HEAD(&channel
->vidq
.active
);
1943 channel
->vidq
.dev
= dev
;
1944 /* register 4 video devices */
1945 channel
->vdev
= template;
1946 channel
->vdev
.lock
= &dev
->lock
;
1947 channel
->vdev
.v4l2_dev
= &dev
->v4l2_dev
;
1948 video_set_drvdata(&channel
->vdev
, channel
);
1950 ret
= video_register_device(&channel
->vdev
,
1954 ret
= video_register_device(&channel
->vdev
,
1959 dev_err(&dev
->udev
->dev
,
1960 "failed to register video device!\n");
1963 atomic_inc(&dev
->num_channels
);
1964 v4l2_info(&dev
->v4l2_dev
, "V4L2 device registered as %s\n",
1965 video_device_node_name(&channel
->vdev
));
1968 printk(KERN_INFO
"Sensoray 2255 V4L driver Revision: %d.%d\n",
1969 S2255_MAJOR_VERSION
,
1970 S2255_MINOR_VERSION
);
1971 /* if no channels registered, return error and probe will fail*/
1972 if (atomic_read(&dev
->num_channels
) == 0) {
1973 v4l2_device_unregister(&dev
->v4l2_dev
);
1976 if (atomic_read(&dev
->num_channels
) != MAX_CHANNELS
)
1977 printk(KERN_WARNING
"s2255: Not all channels available.\n");
1981 /* this function moves the usb stream read pipe data
1982 * into the system buffers.
1983 * returns 0 on success, EAGAIN if more data to process( call this
1986 * Received frame structure:
1987 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1988 * bytes 4-7: channel: 0-3
1989 * bytes 8-11: payload size: size of the frame
1990 * bytes 12-payloadsize+12: frame data
1992 static int save_frame(struct s2255_dev
*dev
, struct s2255_pipeinfo
*pipe_info
)
1998 unsigned long copy_size
;
2001 struct s2255_framei
*frm
;
2002 unsigned char *pdata
;
2003 struct s2255_channel
*channel
;
2004 dprintk(100, "buffer to user\n");
2005 channel
= &dev
->channel
[dev
->cc
];
2006 idx
= channel
->cur_frame
;
2007 frm
= &channel
->buffer
.frame
[idx
];
2008 if (frm
->ulState
== S2255_READ_IDLE
) {
2011 __le32
*pdword
; /*data from dsp is little endian */
2013 /* search for marker codes */
2014 pdata
= (unsigned char *)pipe_info
->transfer_buffer
;
2015 pdword
= (__le32
*)pdata
;
2016 for (jj
= 0; jj
< (pipe_info
->cur_transfer_size
- 12); jj
++) {
2018 case S2255_MARKER_FRAME
:
2019 dprintk(4, "found frame marker at offset:"
2020 " %d [%x %x]\n", jj
, pdata
[0],
2022 offset
= jj
+ PREFIX_SIZE
;
2025 if (cc
>= MAX_CHANNELS
) {
2031 dev
->cc
= G_chnmap
[cc
];
2032 channel
= &dev
->channel
[dev
->cc
];
2033 payload
= pdword
[3];
2034 if (payload
> channel
->req_image_size
) {
2035 channel
->bad_payload
++;
2036 /* discard the bad frame */
2039 channel
->pkt_size
= payload
;
2040 channel
->jpg_size
= pdword
[4];
2042 case S2255_MARKER_RESPONSE
:
2044 pdata
+= DEF_USB_BLOCK
;
2045 jj
+= DEF_USB_BLOCK
;
2046 if (pdword
[1] >= MAX_CHANNELS
)
2048 cc
= G_chnmap
[pdword
[1]];
2049 if (cc
>= MAX_CHANNELS
)
2051 channel
= &dev
->channel
[cc
];
2052 switch (pdword
[2]) {
2053 case S2255_RESPONSE_SETMODE
:
2054 /* check if channel valid */
2055 /* set mode ready */
2056 channel
->setmode_ready
= 1;
2057 wake_up(&channel
->wait_setmode
);
2058 dprintk(5, "setmode ready %d\n", cc
);
2060 case S2255_RESPONSE_FW
:
2061 dev
->chn_ready
|= (1 << cc
);
2062 if ((dev
->chn_ready
& 0x0f) != 0x0f)
2064 /* all channels ready */
2065 printk(KERN_INFO
"s2255: fw loaded\n");
2066 atomic_set(&dev
->fw_data
->fw_state
,
2068 wake_up(&dev
->fw_data
->wait_fw
);
2070 case S2255_RESPONSE_STATUS
:
2071 channel
->vidstatus
= pdword
[3];
2072 channel
->vidstatus_ready
= 1;
2073 wake_up(&channel
->wait_vidstatus
);
2074 dprintk(5, "got vidstatus %x chan %d\n",
2078 printk(KERN_INFO
"s2255 unknown resp\n");
2090 channel
= &dev
->channel
[dev
->cc
];
2091 idx
= channel
->cur_frame
;
2092 frm
= &channel
->buffer
.frame
[idx
];
2093 /* search done. now find out if should be acquiring on this channel */
2094 if (!channel
->b_acquire
) {
2095 /* we found a frame, but this channel is turned off */
2096 frm
->ulState
= S2255_READ_IDLE
;
2100 if (frm
->ulState
== S2255_READ_IDLE
) {
2101 frm
->ulState
= S2255_READ_FRAME
;
2105 /* skip the marker 512 bytes (and offset if out of sync) */
2106 psrc
= (u8
*)pipe_info
->transfer_buffer
+ offset
;
2109 if (frm
->lpvbits
== NULL
) {
2110 dprintk(1, "s2255 frame buffer == NULL.%p %p %d %d",
2111 frm
, dev
, dev
->cc
, idx
);
2115 pdest
= frm
->lpvbits
+ frm
->cur_size
;
2117 copy_size
= (pipe_info
->cur_transfer_size
- offset
);
2119 size
= channel
->pkt_size
- PREFIX_SIZE
;
2121 /* sanity check on pdest */
2122 if ((copy_size
+ frm
->cur_size
) < channel
->req_image_size
)
2123 memcpy(pdest
, psrc
, copy_size
);
2125 frm
->cur_size
+= copy_size
;
2126 dprintk(4, "cur_size size %lu size %lu \n", frm
->cur_size
, size
);
2128 if (frm
->cur_size
>= size
) {
2129 dprintk(2, "****************[%d]Buffer[%d]full*************\n",
2131 channel
->last_frame
= channel
->cur_frame
;
2132 channel
->cur_frame
++;
2133 /* end of system frame ring buffer, start at zero */
2134 if ((channel
->cur_frame
== SYS_FRAMES
) ||
2135 (channel
->cur_frame
== channel
->buffer
.dwFrames
))
2136 channel
->cur_frame
= 0;
2138 if (channel
->b_acquire
)
2139 s2255_got_frame(channel
, channel
->jpg_size
);
2140 channel
->frame_count
++;
2141 frm
->ulState
= S2255_READ_IDLE
;
2145 /* done successfully */
2149 static void s2255_read_video_callback(struct s2255_dev
*dev
,
2150 struct s2255_pipeinfo
*pipe_info
)
2153 dprintk(50, "callback read video \n");
2155 if (dev
->cc
>= MAX_CHANNELS
) {
2157 dev_err(&dev
->udev
->dev
, "invalid channel\n");
2160 /* otherwise copy to the system buffers */
2161 res
= save_frame(dev
, pipe_info
);
2163 dprintk(4, "s2255: read callback failed\n");
2165 dprintk(50, "callback read video done\n");
2169 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char Request
,
2170 u16 Index
, u16 Value
, void *TransferBuffer
,
2171 s32 TransferBufferLength
, int bOut
)
2175 r
= usb_control_msg(dev
->udev
, usb_rcvctrlpipe(dev
->udev
, 0),
2177 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
|
2179 Value
, Index
, TransferBuffer
,
2180 TransferBufferLength
, HZ
* 5);
2182 r
= usb_control_msg(dev
->udev
, usb_sndctrlpipe(dev
->udev
, 0),
2183 Request
, USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2184 Value
, Index
, TransferBuffer
,
2185 TransferBufferLength
, HZ
* 5);
2191 * retrieve FX2 firmware version. future use.
2192 * @param dev pointer to device extension
2193 * @return -1 for fail, else returns firmware version as an int(16 bits)
2195 static int s2255_get_fx2fw(struct s2255_dev
*dev
)
2199 unsigned char transBuffer
[64];
2200 ret
= s2255_vendor_req(dev
, S2255_VR_FW
, 0, 0, transBuffer
, 2,
2203 dprintk(2, "get fw error: %x\n", ret
);
2204 fw
= transBuffer
[0] + (transBuffer
[1] << 8);
2205 dprintk(2, "Get FW %x %x\n", transBuffer
[0], transBuffer
[1]);
2210 * Create the system ring buffer to copy frames into from the
2213 static int s2255_create_sys_buffers(struct s2255_channel
*channel
)
2216 unsigned long reqsize
;
2217 dprintk(1, "create sys buffers\n");
2218 channel
->buffer
.dwFrames
= SYS_FRAMES
;
2219 /* always allocate maximum size(PAL) for system buffers */
2220 reqsize
= SYS_FRAMES_MAXSIZE
;
2222 if (reqsize
> SYS_FRAMES_MAXSIZE
)
2223 reqsize
= SYS_FRAMES_MAXSIZE
;
2225 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2226 /* allocate the frames */
2227 channel
->buffer
.frame
[i
].lpvbits
= vmalloc(reqsize
);
2228 dprintk(1, "valloc %p chan %d, idx %lu, pdata %p\n",
2229 &channel
->buffer
.frame
[i
], channel
->idx
, i
,
2230 channel
->buffer
.frame
[i
].lpvbits
);
2231 channel
->buffer
.frame
[i
].size
= reqsize
;
2232 if (channel
->buffer
.frame
[i
].lpvbits
== NULL
) {
2233 printk(KERN_INFO
"out of memory. using less frames\n");
2234 channel
->buffer
.dwFrames
= i
;
2239 /* make sure internal states are set */
2240 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2241 channel
->buffer
.frame
[i
].ulState
= 0;
2242 channel
->buffer
.frame
[i
].cur_size
= 0;
2245 channel
->cur_frame
= 0;
2246 channel
->last_frame
= -1;
2250 static int s2255_release_sys_buffers(struct s2255_channel
*channel
)
2253 dprintk(1, "release sys buffers\n");
2254 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2255 if (channel
->buffer
.frame
[i
].lpvbits
) {
2256 dprintk(1, "vfree %p\n",
2257 channel
->buffer
.frame
[i
].lpvbits
);
2258 vfree(channel
->buffer
.frame
[i
].lpvbits
);
2260 channel
->buffer
.frame
[i
].lpvbits
= NULL
;
2265 static int s2255_board_init(struct s2255_dev
*dev
)
2267 struct s2255_mode mode_def
= DEF_MODEI_NTSC_CONT
;
2270 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
2271 dprintk(4, "board init: %p", dev
);
2272 memset(pipe
, 0, sizeof(*pipe
));
2274 pipe
->cur_transfer_size
= S2255_USB_XFER_SIZE
;
2275 pipe
->max_transfer_size
= S2255_USB_XFER_SIZE
;
2277 pipe
->transfer_buffer
= kzalloc(pipe
->max_transfer_size
,
2279 if (pipe
->transfer_buffer
== NULL
) {
2280 dprintk(1, "out of memory!\n");
2283 /* query the firmware */
2284 fw_ver
= s2255_get_fx2fw(dev
);
2286 printk(KERN_INFO
"2255 usb firmware version %d.%d\n",
2287 (fw_ver
>> 8) & 0xff,
2290 if (fw_ver
< S2255_CUR_USB_FWVER
)
2291 dev_err(&dev
->udev
->dev
,
2292 "usb firmware not up to date %d.%d\n",
2293 (fw_ver
>> 8) & 0xff,
2296 for (j
= 0; j
< MAX_CHANNELS
; j
++) {
2297 struct s2255_channel
*channel
= &dev
->channel
[j
];
2298 channel
->b_acquire
= 0;
2299 channel
->mode
= mode_def
;
2300 if (dev
->pid
== 0x2257 && j
> 1)
2301 channel
->mode
.color
|= (1 << 16);
2302 channel
->jc
.quality
= S2255_DEF_JPEG_QUAL
;
2303 channel
->width
= LINE_SZ_4CIFS_NTSC
;
2304 channel
->height
= NUM_LINES_4CIFS_NTSC
* 2;
2305 channel
->fmt
= &formats
[0];
2306 channel
->mode
.restart
= 1;
2307 channel
->req_image_size
= get_transfer_size(&mode_def
);
2308 channel
->frame_count
= 0;
2309 /* create the system buffers */
2310 s2255_create_sys_buffers(channel
);
2312 /* start read pipe */
2313 s2255_start_readpipe(dev
);
2314 dprintk(1, "%s: success\n", __func__
);
2318 static int s2255_board_shutdown(struct s2255_dev
*dev
)
2321 dprintk(1, "%s: dev: %p", __func__
, dev
);
2323 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2324 if (dev
->channel
[i
].b_acquire
)
2325 s2255_stop_acquire(&dev
->channel
[i
]);
2327 s2255_stop_readpipe(dev
);
2328 for (i
= 0; i
< MAX_CHANNELS
; i
++)
2329 s2255_release_sys_buffers(&dev
->channel
[i
]);
2330 /* release transfer buffer */
2331 kfree(dev
->pipe
.transfer_buffer
);
2335 static void read_pipe_completion(struct urb
*purb
)
2337 struct s2255_pipeinfo
*pipe_info
;
2338 struct s2255_dev
*dev
;
2341 pipe_info
= purb
->context
;
2342 dprintk(100, "%s: urb:%p, status %d\n", __func__
, purb
,
2344 if (pipe_info
== NULL
) {
2345 dev_err(&purb
->dev
->dev
, "no context!\n");
2349 dev
= pipe_info
->dev
;
2351 dev_err(&purb
->dev
->dev
, "no context!\n");
2354 status
= purb
->status
;
2355 /* if shutting down, do not resubmit, exit immediately */
2356 if (status
== -ESHUTDOWN
) {
2357 dprintk(2, "%s: err shutdown\n", __func__
);
2358 pipe_info
->err_count
++;
2362 if (pipe_info
->state
== 0) {
2363 dprintk(2, "%s: exiting USB pipe", __func__
);
2368 s2255_read_video_callback(dev
, pipe_info
);
2370 pipe_info
->err_count
++;
2371 dprintk(1, "%s: failed URB %d\n", __func__
, status
);
2374 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2376 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2378 pipe_info
->transfer_buffer
,
2379 pipe_info
->cur_transfer_size
,
2380 read_pipe_completion
, pipe_info
);
2382 if (pipe_info
->state
!= 0) {
2383 if (usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
)) {
2384 dev_err(&dev
->udev
->dev
, "error submitting urb\n");
2387 dprintk(2, "%s :complete state 0\n", __func__
);
2392 static int s2255_start_readpipe(struct s2255_dev
*dev
)
2396 struct s2255_pipeinfo
*pipe_info
= &dev
->pipe
;
2397 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2398 dprintk(2, "%s: IN %d\n", __func__
, dev
->read_endpoint
);
2399 pipe_info
->state
= 1;
2400 pipe_info
->err_count
= 0;
2401 pipe_info
->stream_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2402 if (!pipe_info
->stream_urb
) {
2403 dev_err(&dev
->udev
->dev
,
2404 "ReadStream: Unable to alloc URB\n");
2407 /* transfer buffer allocated in board_init */
2408 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2410 pipe_info
->transfer_buffer
,
2411 pipe_info
->cur_transfer_size
,
2412 read_pipe_completion
, pipe_info
);
2413 retval
= usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
);
2415 printk(KERN_ERR
"s2255: start read pipe failed\n");
2421 /* starts acquisition process */
2422 static int s2255_start_acquire(struct s2255_channel
*channel
)
2424 unsigned char *buffer
;
2426 unsigned long chn_rev
;
2428 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
2429 chn_rev
= G_chnmap
[channel
->idx
];
2430 buffer
= kzalloc(512, GFP_KERNEL
);
2431 if (buffer
== NULL
) {
2432 dev_err(&dev
->udev
->dev
, "out of mem\n");
2436 channel
->last_frame
= -1;
2437 channel
->bad_payload
= 0;
2438 channel
->cur_frame
= 0;
2439 for (j
= 0; j
< SYS_FRAMES
; j
++) {
2440 channel
->buffer
.frame
[j
].ulState
= 0;
2441 channel
->buffer
.frame
[j
].cur_size
= 0;
2444 /* send the start command */
2445 *(__le32
*) buffer
= IN_DATA_TOKEN
;
2446 *((__le32
*) buffer
+ 1) = (__le32
) cpu_to_le32(chn_rev
);
2447 *((__le32
*) buffer
+ 2) = CMD_START
;
2448 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2450 dev_err(&dev
->udev
->dev
, "CMD_START error\n");
2452 dprintk(2, "start acquire exit[%d] %d \n", channel
->idx
, res
);
2457 static int s2255_stop_acquire(struct s2255_channel
*channel
)
2459 unsigned char *buffer
;
2461 unsigned long chn_rev
;
2462 struct s2255_dev
*dev
= to_s2255_dev(channel
->vdev
.v4l2_dev
);
2463 chn_rev
= G_chnmap
[channel
->idx
];
2464 buffer
= kzalloc(512, GFP_KERNEL
);
2465 if (buffer
== NULL
) {
2466 dev_err(&dev
->udev
->dev
, "out of mem\n");
2469 /* send the stop command */
2470 *(__le32
*) buffer
= IN_DATA_TOKEN
;
2471 *((__le32
*) buffer
+ 1) = (__le32
) cpu_to_le32(chn_rev
);
2472 *((__le32
*) buffer
+ 2) = CMD_STOP
;
2473 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2475 dev_err(&dev
->udev
->dev
, "CMD_STOP error\n");
2477 channel
->b_acquire
= 0;
2478 dprintk(4, "%s: chn %d, res %d\n", __func__
, channel
->idx
, res
);
2482 static void s2255_stop_readpipe(struct s2255_dev
*dev
)
2484 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
2487 if (pipe
->stream_urb
) {
2489 usb_kill_urb(pipe
->stream_urb
);
2490 usb_free_urb(pipe
->stream_urb
);
2491 pipe
->stream_urb
= NULL
;
2493 dprintk(4, "%s", __func__
);
2497 static void s2255_fwload_start(struct s2255_dev
*dev
, int reset
)
2500 s2255_reset_dsppower(dev
);
2501 dev
->fw_data
->fw_size
= dev
->fw_data
->fw
->size
;
2502 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_NOTLOADED
);
2503 memcpy(dev
->fw_data
->pfw_data
,
2504 dev
->fw_data
->fw
->data
, CHUNK_SIZE
);
2505 dev
->fw_data
->fw_loaded
= CHUNK_SIZE
;
2506 usb_fill_bulk_urb(dev
->fw_data
->fw_urb
, dev
->udev
,
2507 usb_sndbulkpipe(dev
->udev
, 2),
2508 dev
->fw_data
->pfw_data
,
2509 CHUNK_SIZE
, s2255_fwchunk_complete
,
2511 mod_timer(&dev
->timer
, jiffies
+ HZ
);
2514 /* standard usb probe function */
2515 static int s2255_probe(struct usb_interface
*interface
,
2516 const struct usb_device_id
*id
)
2518 struct s2255_dev
*dev
= NULL
;
2519 struct usb_host_interface
*iface_desc
;
2520 struct usb_endpoint_descriptor
*endpoint
;
2522 int retval
= -ENOMEM
;
2525 dprintk(2, "%s\n", __func__
);
2526 /* allocate memory for our device state and initialize it to zero */
2527 dev
= kzalloc(sizeof(struct s2255_dev
), GFP_KERNEL
);
2529 s2255_dev_err(&interface
->dev
, "out of memory\n");
2532 atomic_set(&dev
->num_channels
, 0);
2533 dev
->pid
= id
->idProduct
;
2534 dev
->fw_data
= kzalloc(sizeof(struct s2255_fw
), GFP_KERNEL
);
2537 mutex_init(&dev
->lock
);
2538 mutex_init(&dev
->open_lock
);
2539 /* grab usb_device and save it */
2540 dev
->udev
= usb_get_dev(interface_to_usbdev(interface
));
2541 if (dev
->udev
== NULL
) {
2542 dev_err(&interface
->dev
, "null usb device\n");
2546 dprintk(1, "dev: %p, udev %p interface %p\n", dev
,
2547 dev
->udev
, interface
);
2548 dev
->interface
= interface
;
2549 /* set up the endpoint information */
2550 iface_desc
= interface
->cur_altsetting
;
2551 dprintk(1, "num endpoints %d\n", iface_desc
->desc
.bNumEndpoints
);
2552 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
2553 endpoint
= &iface_desc
->endpoint
[i
].desc
;
2554 if (!dev
->read_endpoint
&& usb_endpoint_is_bulk_in(endpoint
)) {
2555 /* we found the bulk in endpoint */
2556 dev
->read_endpoint
= endpoint
->bEndpointAddress
;
2560 if (!dev
->read_endpoint
) {
2561 dev_err(&interface
->dev
, "Could not find bulk-in endpoint\n");
2564 init_timer(&dev
->timer
);
2565 dev
->timer
.function
= s2255_timer
;
2566 dev
->timer
.data
= (unsigned long)dev
->fw_data
;
2567 init_waitqueue_head(&dev
->fw_data
->wait_fw
);
2568 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2569 struct s2255_channel
*channel
= &dev
->channel
[i
];
2570 dev
->channel
[i
].idx
= i
;
2571 init_waitqueue_head(&channel
->wait_setmode
);
2572 init_waitqueue_head(&channel
->wait_vidstatus
);
2575 dev
->fw_data
->fw_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2576 if (!dev
->fw_data
->fw_urb
) {
2577 dev_err(&interface
->dev
, "out of memory!\n");
2581 dev
->fw_data
->pfw_data
= kzalloc(CHUNK_SIZE
, GFP_KERNEL
);
2582 if (!dev
->fw_data
->pfw_data
) {
2583 dev_err(&interface
->dev
, "out of memory!\n");
2586 /* load the first chunk */
2587 if (request_firmware(&dev
->fw_data
->fw
,
2588 FIRMWARE_FILE_NAME
, &dev
->udev
->dev
)) {
2589 printk(KERN_ERR
"sensoray 2255 failed to get firmware\n");
2592 /* check the firmware is valid */
2593 fw_size
= dev
->fw_data
->fw
->size
;
2594 pdata
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 8];
2596 if (*pdata
!= S2255_FW_MARKER
) {
2597 printk(KERN_INFO
"Firmware invalid.\n");
2601 /* make sure firmware is the latest */
2603 pRel
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 4];
2604 printk(KERN_INFO
"s2255 dsp fw version %x\n", *pRel
);
2605 dev
->dsp_fw_ver
= *pRel
;
2606 if (*pRel
< S2255_CUR_DSP_FWVER
)
2607 printk(KERN_INFO
"s2255: f2255usb.bin out of date.\n");
2608 if (dev
->pid
== 0x2257 && *pRel
< S2255_MIN_DSP_COLORFILTER
)
2609 printk(KERN_WARNING
"s2255: 2257 requires firmware %d"
2610 " or above.\n", S2255_MIN_DSP_COLORFILTER
);
2612 usb_reset_device(dev
->udev
);
2613 /* load 2255 board specific */
2614 retval
= s2255_board_init(dev
);
2616 goto errorBOARDINIT
;
2617 spin_lock_init(&dev
->slock
);
2618 s2255_fwload_start(dev
, 0);
2619 /* loads v4l specific */
2620 retval
= s2255_probe_v4l(dev
);
2622 goto errorBOARDINIT
;
2623 dev_info(&interface
->dev
, "Sensoray 2255 detected\n");
2626 s2255_board_shutdown(dev
);
2628 release_firmware(dev
->fw_data
->fw
);
2630 kfree(dev
->fw_data
->pfw_data
);
2632 usb_free_urb(dev
->fw_data
->fw_urb
);
2634 del_timer(&dev
->timer
);
2636 usb_put_dev(dev
->udev
);
2638 kfree(dev
->fw_data
);
2639 mutex_destroy(&dev
->open_lock
);
2640 mutex_destroy(&dev
->lock
);
2643 printk(KERN_WARNING
"Sensoray 2255 driver load failed: 0x%x\n", retval
);
2647 /* disconnect routine. when board is removed physically or with rmmod */
2648 static void s2255_disconnect(struct usb_interface
*interface
)
2650 struct s2255_dev
*dev
= to_s2255_dev(usb_get_intfdata(interface
));
2652 int channels
= atomic_read(&dev
->num_channels
);
2653 mutex_lock(&dev
->lock
);
2654 v4l2_device_disconnect(&dev
->v4l2_dev
);
2655 mutex_unlock(&dev
->lock
);
2656 /*see comments in the uvc_driver.c usb disconnect function */
2657 atomic_inc(&dev
->num_channels
);
2658 /* unregister each video device. */
2659 for (i
= 0; i
< channels
; i
++)
2660 video_unregister_device(&dev
->channel
[i
].vdev
);
2661 /* wake up any of our timers */
2662 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_DISCONNECTING
);
2663 wake_up(&dev
->fw_data
->wait_fw
);
2664 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2665 dev
->channel
[i
].setmode_ready
= 1;
2666 wake_up(&dev
->channel
[i
].wait_setmode
);
2667 dev
->channel
[i
].vidstatus_ready
= 1;
2668 wake_up(&dev
->channel
[i
].wait_vidstatus
);
2670 if (atomic_dec_and_test(&dev
->num_channels
))
2672 dev_info(&interface
->dev
, "%s\n", __func__
);
2675 static struct usb_driver s2255_driver
= {
2676 .name
= S2255_DRIVER_NAME
,
2677 .probe
= s2255_probe
,
2678 .disconnect
= s2255_disconnect
,
2679 .id_table
= s2255_table
,
2682 static int __init
usb_s2255_init(void)
2685 /* register this driver with the USB subsystem */
2686 result
= usb_register(&s2255_driver
);
2688 pr_err(KBUILD_MODNAME
2689 ": usb_register failed. Error number %d\n", result
);
2690 dprintk(2, "%s\n", __func__
);
2694 static void __exit
usb_s2255_exit(void)
2696 usb_deregister(&s2255_driver
);
2699 module_init(usb_s2255_init
);
2700 module_exit(usb_s2255_exit
);
2702 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2703 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2704 MODULE_LICENSE("GPL");