1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * s2255drv.c - a driver for the Sensoray 2255 USB video capture device
5 * Copyright (C) 2007-2014 by Sensoray Company Inc.
8 * Some video buffer code based on vivi driver:
10 * Sensoray 2255 device supports 4 simultaneous channels.
11 * The channels are not "crossbar" inputs, they are physically
12 * attached to separate video decoders.
14 * Because of USB2.0 bandwidth limitations. There is only a
15 * certain amount of data which may be transferred at one time.
17 * Example maximum bandwidth utilization:
19 * -full size, color mode YUYV or YUV422P: 2 channels at once
20 * -full or half size Grey scale: all 4 channels at once
21 * -half size, color mode YUYV or YUV422P: all 4 channels at once
22 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
26 #include <linux/module.h>
27 #include <linux/firmware.h>
28 #include <linux/kernel.h>
29 #include <linux/mutex.h>
30 #include <linux/slab.h>
31 #include <linux/videodev2.h>
33 #include <linux/vmalloc.h>
34 #include <linux/usb.h>
35 #include <media/videobuf2-v4l2.h>
36 #include <media/videobuf2-vmalloc.h>
37 #include <media/v4l2-common.h>
38 #include <media/v4l2-device.h>
39 #include <media/v4l2-ioctl.h>
40 #include <media/v4l2-ctrls.h>
41 #include <media/v4l2-event.h>
43 #define S2255_VERSION "1.25.1"
44 #define FIRMWARE_FILE_NAME "/*(DEBLOBBED)*/"
46 /* default JPEG quality */
47 #define S2255_DEF_JPEG_QUAL 50
48 /* vendor request in */
50 /* vendor request out */
51 #define S2255_VR_OUT 1
53 #define S2255_VR_FW 0x30
54 /* USB endpoint number for configuring the device */
55 #define S2255_CONFIG_EP 2
56 /* maximum time for DSP to start responding after last FW word loaded(ms) */
57 #define S2255_DSP_BOOTTIME 800
58 /* maximum time to wait for firmware to load (ms) */
59 #define S2255_LOAD_TIMEOUT (5000 + S2255_DSP_BOOTTIME)
60 #define S2255_MIN_BUFS 2
61 #define S2255_SETMODE_TIMEOUT 500
62 #define S2255_VIDSTATUS_TIMEOUT 350
63 #define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
64 #define S2255_MARKER_RESPONSE cpu_to_le32(0x2255ACACL)
65 #define S2255_RESPONSE_SETMODE cpu_to_le32(0x01)
66 #define S2255_RESPONSE_FW cpu_to_le32(0x10)
67 #define S2255_RESPONSE_STATUS cpu_to_le32(0x20)
68 #define S2255_USB_XFER_SIZE (16 * 1024)
69 #define MAX_CHANNELS 4
71 /* maximum size is PAL full size plus room for the marker header(s) */
72 #define SYS_FRAMES_MAXSIZE (720*288*2*2 + 4096)
73 #define DEF_USB_BLOCK S2255_USB_XFER_SIZE
74 #define LINE_SZ_4CIFS_NTSC 640
75 #define LINE_SZ_2CIFS_NTSC 640
76 #define LINE_SZ_1CIFS_NTSC 320
77 #define LINE_SZ_4CIFS_PAL 704
78 #define LINE_SZ_2CIFS_PAL 704
79 #define LINE_SZ_1CIFS_PAL 352
80 #define NUM_LINES_4CIFS_NTSC 240
81 #define NUM_LINES_2CIFS_NTSC 240
82 #define NUM_LINES_1CIFS_NTSC 240
83 #define NUM_LINES_4CIFS_PAL 288
84 #define NUM_LINES_2CIFS_PAL 288
85 #define NUM_LINES_1CIFS_PAL 288
86 #define LINE_SZ_DEF 640
87 #define NUM_LINES_DEF 240
90 /* predefined settings */
94 #define SCALE_4CIFS 1 /* 640x480(NTSC) or 704x576(PAL) */
95 #define SCALE_2CIFS 2 /* 640x240(NTSC) or 704x288(PAL) */
96 #define SCALE_1CIFS 3 /* 320x240(NTSC) or 352x288(PAL) */
97 /* SCALE_4CIFSI is the 2 fields interpolated into one */
98 #define SCALE_4CIFSI 4 /* 640x480(NTSC) or 704x576(PAL) high quality */
100 #define COLOR_YUVPL 1 /* YUV planar */
101 #define COLOR_YUVPK 2 /* YUV packed */
102 #define COLOR_Y8 4 /* monochrome */
103 #define COLOR_JPG 5 /* JPEG */
105 #define MASK_COLOR 0x000000ff
106 #define MASK_JPG_QUALITY 0x0000ff00
107 #define MASK_INPUT_TYPE 0x000f0000
108 /* frame decimation. */
109 #define FDEC_1 1 /* capture every frame. default */
110 #define FDEC_2 2 /* capture every 2nd frame */
111 #define FDEC_3 3 /* capture every 3rd frame */
112 #define FDEC_5 5 /* capture every 5th frame */
114 /*-------------------------------------------------------
115 * Default mode parameters.
116 *-------------------------------------------------------*/
117 #define DEF_SCALE SCALE_4CIFS
118 #define DEF_COLOR COLOR_YUVPL
119 #define DEF_FDEC FDEC_1
121 #define DEF_CONTRAST 0x5c
122 #define DEF_SATURATION 0x80
125 /* usb config commands */
126 #define IN_DATA_TOKEN cpu_to_le32(0x2255c0de)
127 #define CMD_2255 0xc2255000
128 #define CMD_SET_MODE cpu_to_le32((CMD_2255 | 0x10))
129 #define CMD_START cpu_to_le32((CMD_2255 | 0x20))
130 #define CMD_STOP cpu_to_le32((CMD_2255 | 0x30))
131 #define CMD_STATUS cpu_to_le32((CMD_2255 | 0x40))
134 u32 format; /* input video format (NTSC, PAL) */
135 u32 scale; /* output video scale */
136 u32 color; /* output video color format */
137 u32 fdec; /* frame decimation */
138 u32 bright; /* brightness */
139 u32 contrast; /* contrast */
140 u32 saturation; /* saturation */
141 u32 hue; /* hue (NTSC only)*/
142 u32 single; /* capture 1 frame at a time (!=0), continuously (==0)*/
143 u32 usb_block; /* block size. should be 4096 of DEF_USB_BLOCK */
144 u32 restart; /* if DSP requires restart */
148 #define S2255_READ_IDLE 0
149 #define S2255_READ_FRAME 1
151 /* frame structure */
152 struct s2255_framei {
154 unsigned long ulState; /* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
155 void *lpvbits; /* image data */
156 unsigned long cur_size; /* current data copied to it */
159 /* image buffer structure */
160 struct s2255_bufferi {
161 unsigned long dwFrames; /* number of frames in buffer */
162 struct s2255_framei frame[SYS_FRAMES]; /* array of FRAME structures */
165 #define DEF_MODEI_NTSC_CONT {FORMAT_NTSC, DEF_SCALE, DEF_COLOR, \
166 DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
167 DEF_HUE, 0, DEF_USB_BLOCK, 0}
169 /* for firmware loading, fw_state */
170 #define S2255_FW_NOTLOADED 0
171 #define S2255_FW_LOADED_DSPWAIT 1
172 #define S2255_FW_SUCCESS 2
173 #define S2255_FW_FAILED 3
174 #define S2255_FW_DISCONNECTING 4
175 #define S2255_FW_MARKER cpu_to_le32(0x22552f2f)
176 /* 2255 read states */
177 #define S2255_READ_IDLE 0
178 #define S2255_READ_FRAME 1
185 wait_queue_head_t wait_fw;
186 const struct firmware *fw;
189 struct s2255_pipeinfo {
190 u32 max_transfer_size;
191 u32 cur_transfer_size;
195 void *dev; /* back pointer to s2255_dev struct*/
200 struct s2255_fmt; /*forward declaration */
203 /* 2255 video channel */
205 struct s2255_dev *dev;
206 struct video_device vdev;
207 struct v4l2_ctrl_handler hdl;
208 struct v4l2_ctrl *jpegqual_ctrl;
210 struct list_head buf_list;
211 struct s2255_bufferi buffer;
212 struct s2255_mode mode;
214 /* jpeg compression */
216 /* capture parameters (for high quality mode full size) */
217 struct v4l2_captureparm cap_parm;
220 /* allocated image size */
221 unsigned long req_image_size;
222 /* received packet size */
223 unsigned long pkt_size;
225 unsigned long frame_count;
228 /* if channel configured to default state */
230 wait_queue_head_t wait_setmode;
232 /* video status items */
234 wait_queue_head_t wait_vidstatus;
238 enum v4l2_field field;
239 const struct s2255_fmt *fmt;
240 int idx; /* channel number on device, 0-3 */
241 struct vb2_queue vb_vidq;
242 struct mutex vb_lock; /* streaming lock */
248 struct s2255_vc vc[MAX_CHANNELS];
249 struct v4l2_device v4l2_dev;
250 atomic_t num_channels;
252 struct mutex lock; /* channels[].vdev.lock */
253 struct mutex cmdlock; /* protects cmdbuf */
254 struct usb_device *udev;
255 struct usb_interface *interface;
257 struct timer_list timer;
258 struct s2255_fw *fw_data;
259 struct s2255_pipeinfo pipe;
260 u32 cc; /* current channel */
265 u16 pid; /* product id */
266 #define S2255_CMDBUF_SIZE 512
270 static inline struct s2255_dev *to_s2255_dev(struct v4l2_device *v4l2_dev)
272 return container_of(v4l2_dev, struct s2255_dev, v4l2_dev);
281 /* buffer for one video frame */
282 struct s2255_buffer {
283 /* common v4l buffer stuff -- must be first */
284 struct vb2_v4l2_buffer vb;
285 struct list_head list;
289 /* current cypress EEPROM firmware version */
290 #define S2255_CUR_USB_FWVER ((3 << 8) | 12)
291 /* current DSP FW version */
292 #define S2255_CUR_DSP_FWVER 10104
293 /* Need DSP version 5+ for video status feature */
294 #define S2255_MIN_DSP_STATUS 5
295 #define S2255_MIN_DSP_COLORFILTER 8
296 #define S2255_NORMS (V4L2_STD_ALL)
298 /* private V4L2 controls */
301 * The following chart displays how COLORFILTER should be set
302 * =========================================================
303 * = fourcc = COLORFILTER =
304 * = ===============================
306 * =========================================================
307 * = V4L2_PIX_FMT_GREY(Y8) = monochrome from = monochrome=
308 * = = s-video or = composite =
309 * = = B/W camera = input =
310 * =========================================================
311 * = other = color, svideo = color, =
313 * =========================================================
316 * channels 0-3 on 2255 are composite
317 * channels 0-1 on 2257 are composite, 2-3 are s-video
318 * If COLORFILTER is 0 with a composite color camera connected,
319 * the output will appear monochrome but hatching
321 * COLORFILTER is different from "color killer" and "color effects"
324 #define S2255_V4L2_YC_ON 1
325 #define S2255_V4L2_YC_OFF 0
326 #define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
328 /* frame prefix size (sent once every frame) */
329 #define PREFIX_SIZE 512
331 /* Channels on box are in reverse order */
332 static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
336 static int s2255_start_readpipe(struct s2255_dev *dev);
337 static void s2255_stop_readpipe(struct s2255_dev *dev);
338 static int s2255_start_acquire(struct s2255_vc *vc);
339 static int s2255_stop_acquire(struct s2255_vc *vc);
340 static void s2255_fillbuff(struct s2255_vc *vc, struct s2255_buffer *buf,
342 static int s2255_set_mode(struct s2255_vc *vc, struct s2255_mode *mode);
343 static int s2255_board_shutdown(struct s2255_dev *dev);
344 static void s2255_fwload_start(struct s2255_dev *dev);
345 static void s2255_destroy(struct s2255_dev *dev);
346 static long s2255_vendor_req(struct s2255_dev *dev, unsigned char req,
347 u16 index, u16 value, void *buf,
348 s32 buf_len, int bOut);
350 /* dev_err macro with driver name */
351 #define S2255_DRIVER_NAME "s2255"
352 #define s2255_dev_err(dev, fmt, arg...) \
353 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
355 #define dprintk(dev, level, fmt, arg...) \
356 v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
358 static struct usb_driver s2255_driver;
360 /* start video number */
361 static int video_nr = -1; /* /dev/videoN, -1 for autodetect */
363 /* Enable jpeg capture. */
364 static int jpeg_enable = 1;
366 module_param(debug, int, 0644);
367 MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
368 module_param(video_nr, int, 0644);
369 MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
370 module_param(jpeg_enable, int, 0644);
371 MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
373 /* USB device table */
374 #define USB_SENSORAY_VID 0x1943
375 static const struct usb_device_id s2255_table[] = {
376 {USB_DEVICE(USB_SENSORAY_VID, 0x2255)},
377 {USB_DEVICE(USB_SENSORAY_VID, 0x2257)}, /*same family as 2255*/
378 { } /* Terminating entry */
380 MODULE_DEVICE_TABLE(usb, s2255_table);
382 #define BUFFER_TIMEOUT msecs_to_jiffies(400)
385 /* JPEG formats must be defined last to support jpeg_enable parameter */
386 static const struct s2255_fmt formats[] = {
388 .name = "4:2:2, packed, YUYV",
389 .fourcc = V4L2_PIX_FMT_YUYV,
393 .name = "4:2:2, packed, UYVY",
394 .fourcc = V4L2_PIX_FMT_UYVY,
397 .name = "4:2:2, planar, YUV422P",
398 .fourcc = V4L2_PIX_FMT_YUV422P,
403 .fourcc = V4L2_PIX_FMT_GREY,
407 .fourcc = V4L2_PIX_FMT_JPEG,
411 .fourcc = V4L2_PIX_FMT_MJPEG,
416 static int norm_maxw(struct s2255_vc *vc)
418 return (vc->std & V4L2_STD_525_60) ?
419 LINE_SZ_4CIFS_NTSC : LINE_SZ_4CIFS_PAL;
422 static int norm_maxh(struct s2255_vc *vc)
424 return (vc->std & V4L2_STD_525_60) ?
425 (NUM_LINES_1CIFS_NTSC * 2) : (NUM_LINES_1CIFS_PAL * 2);
428 static int norm_minw(struct s2255_vc *vc)
430 return (vc->std & V4L2_STD_525_60) ?
431 LINE_SZ_1CIFS_NTSC : LINE_SZ_1CIFS_PAL;
434 static int norm_minh(struct s2255_vc *vc)
436 return (vc->std & V4L2_STD_525_60) ?
437 (NUM_LINES_1CIFS_NTSC) : (NUM_LINES_1CIFS_PAL);
442 * TODO: fixme: move YUV reordering to hardware
443 * converts 2255 planar format to yuyv or uyvy
445 static void planar422p_to_yuv_packed(const unsigned char *in,
447 int width, int height,
453 unsigned long size = height * width;
455 pY = (unsigned char *)in;
456 pCr = (unsigned char *)in + height * width;
457 pCb = (unsigned char *)in + height * width + (height * width / 2);
458 for (i = 0; i < size * 2; i += 4) {
459 out[i] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCr++;
460 out[i + 1] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCr++ : *pY++;
461 out[i + 2] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCb++;
462 out[i + 3] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCb++ : *pY++;
467 static void s2255_reset_dsppower(struct s2255_dev *dev)
469 s2255_vendor_req(dev, 0x40, 0x0000, 0x0001, NULL, 0, 1);
471 s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
473 s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
477 /* kickstarts the firmware loading. from probe
479 static void s2255_timer(struct timer_list *t)
481 struct s2255_dev *dev = from_timer(dev, t, timer);
482 struct s2255_fw *data = dev->fw_data;
483 if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
484 pr_err("s2255: can't submit urb\n");
485 atomic_set(&data->fw_state, S2255_FW_FAILED);
486 /* wake up anything waiting for the firmware */
487 wake_up(&data->wait_fw);
493 /* this loads the firmware asynchronously.
494 Originally this was done synchronously in probe.
495 But it is better to load it asynchronously here than block
496 inside the probe function. Blocking inside probe affects boot time.
497 FW loading is triggered by the timer in the probe function
499 static void s2255_fwchunk_complete(struct urb *urb)
501 struct s2255_fw *data = urb->context;
502 struct usb_device *udev = urb->dev;
505 dev_err(&udev->dev, "URB failed with status %d\n", urb->status);
506 atomic_set(&data->fw_state, S2255_FW_FAILED);
507 /* wake up anything waiting for the firmware */
508 wake_up(&data->wait_fw);
511 if (data->fw_urb == NULL) {
512 s2255_dev_err(&udev->dev, "disconnected\n");
513 atomic_set(&data->fw_state, S2255_FW_FAILED);
514 /* wake up anything waiting for the firmware */
515 wake_up(&data->wait_fw);
518 #define CHUNK_SIZE 512
519 /* all USB transfers must be done with continuous kernel memory.
520 can't allocate more than 128k in current linux kernel, so
521 upload the firmware in chunks
523 if (data->fw_loaded < data->fw_size) {
524 len = (data->fw_loaded + CHUNK_SIZE) > data->fw_size ?
525 data->fw_size % CHUNK_SIZE : CHUNK_SIZE;
527 if (len < CHUNK_SIZE)
528 memset(data->pfw_data, 0, CHUNK_SIZE);
530 memcpy(data->pfw_data,
531 (char *) data->fw->data + data->fw_loaded, len);
533 usb_fill_bulk_urb(data->fw_urb, udev, usb_sndbulkpipe(udev, 2),
534 data->pfw_data, CHUNK_SIZE,
535 s2255_fwchunk_complete, data);
536 if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
537 dev_err(&udev->dev, "failed submit URB\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 data->fw_loaded += len;
545 atomic_set(&data->fw_state, S2255_FW_LOADED_DSPWAIT);
550 static void s2255_got_frame(struct s2255_vc *vc, int jpgsize)
552 struct s2255_buffer *buf;
553 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
554 unsigned long flags = 0;
556 spin_lock_irqsave(&vc->qlock, flags);
557 if (list_empty(&vc->buf_list)) {
558 dprintk(dev, 1, "No active queue to serve\n");
559 spin_unlock_irqrestore(&vc->qlock, flags);
562 buf = list_entry(vc->buf_list.next,
563 struct s2255_buffer, list);
564 list_del(&buf->list);
565 buf->vb.vb2_buf.timestamp = ktime_get_ns();
566 buf->vb.field = vc->field;
567 buf->vb.sequence = vc->frame_count;
568 spin_unlock_irqrestore(&vc->qlock, flags);
570 s2255_fillbuff(vc, buf, jpgsize);
571 /* tell v4l buffer was filled */
572 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
573 dprintk(dev, 2, "%s: [buf] [%p]\n", __func__, buf);
576 static const struct s2255_fmt *format_by_fourcc(int fourcc)
579 for (i = 0; i < ARRAY_SIZE(formats); i++) {
580 if (-1 == formats[i].fourcc)
582 if (!jpeg_enable && ((formats[i].fourcc == V4L2_PIX_FMT_JPEG) ||
583 (formats[i].fourcc == V4L2_PIX_FMT_MJPEG)))
585 if (formats[i].fourcc == fourcc)
591 /* video buffer vmalloc implementation based partly on VIVI driver which is
592 * Copyright (c) 2006 by
593 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
594 * Ted Walther <ted--a.t--enumera.com>
595 * John Sokol <sokol--a.t--videotechnology.com>
596 * http://v4l.videotechnology.com/
599 static void s2255_fillbuff(struct s2255_vc *vc,
600 struct s2255_buffer *buf, int jpgsize)
604 char *vbuf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
605 unsigned long last_frame;
606 struct s2255_dev *dev = vc->dev;
610 last_frame = vc->last_frame;
611 if (last_frame != -1) {
613 (const char *)vc->buffer.frame[last_frame].lpvbits;
614 switch (vc->fmt->fourcc) {
615 case V4L2_PIX_FMT_YUYV:
616 case V4L2_PIX_FMT_UYVY:
617 planar422p_to_yuv_packed((const unsigned char *)tmpbuf,
622 case V4L2_PIX_FMT_GREY:
623 memcpy(vbuf, tmpbuf, vc->width * vc->height);
625 case V4L2_PIX_FMT_JPEG:
626 case V4L2_PIX_FMT_MJPEG:
627 vb2_set_plane_payload(&buf->vb.vb2_buf, 0, jpgsize);
628 memcpy(vbuf, tmpbuf, jpgsize);
630 case V4L2_PIX_FMT_YUV422P:
632 vc->width * vc->height * 2);
635 pr_info("s2255: unknown format?\n");
639 pr_err("s2255: =======no frame\n");
642 dprintk(dev, 2, "s2255fill at : Buffer %p size= %d\n",
647 /* ------------------------------------------------------------------
649 ------------------------------------------------------------------*/
651 static int queue_setup(struct vb2_queue *vq,
652 unsigned int *nbuffers, unsigned int *nplanes,
653 unsigned int sizes[], struct device *alloc_devs[])
655 struct s2255_vc *vc = vb2_get_drv_priv(vq);
656 if (*nbuffers < S2255_MIN_BUFS)
657 *nbuffers = S2255_MIN_BUFS;
659 sizes[0] = vc->width * vc->height * (vc->fmt->depth >> 3);
663 static int buffer_prepare(struct vb2_buffer *vb)
665 struct s2255_vc *vc = vb2_get_drv_priv(vb->vb2_queue);
666 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
667 struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
672 dprintk(vc->dev, 4, "%s\n", __func__);
676 if ((w < norm_minw(vc)) ||
677 (w > norm_maxw(vc)) ||
678 (h < norm_minh(vc)) ||
679 (h > norm_maxh(vc))) {
680 dprintk(vc->dev, 4, "invalid buffer prepare\n");
683 size = w * h * (vc->fmt->depth >> 3);
684 if (vb2_plane_size(vb, 0) < size) {
685 dprintk(vc->dev, 4, "invalid buffer prepare\n");
689 vb2_set_plane_payload(&buf->vb.vb2_buf, 0, size);
693 static void buffer_queue(struct vb2_buffer *vb)
695 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
696 struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
697 struct s2255_vc *vc = vb2_get_drv_priv(vb->vb2_queue);
698 unsigned long flags = 0;
699 dprintk(vc->dev, 1, "%s\n", __func__);
700 spin_lock_irqsave(&vc->qlock, flags);
701 list_add_tail(&buf->list, &vc->buf_list);
702 spin_unlock_irqrestore(&vc->qlock, flags);
705 static int start_streaming(struct vb2_queue *vq, unsigned int count);
706 static void stop_streaming(struct vb2_queue *vq);
708 static const struct vb2_ops s2255_video_qops = {
709 .queue_setup = queue_setup,
710 .buf_prepare = buffer_prepare,
711 .buf_queue = buffer_queue,
712 .start_streaming = start_streaming,
713 .stop_streaming = stop_streaming,
714 .wait_prepare = vb2_ops_wait_prepare,
715 .wait_finish = vb2_ops_wait_finish,
718 static int vidioc_querycap(struct file *file, void *priv,
719 struct v4l2_capability *cap)
721 struct s2255_vc *vc = video_drvdata(file);
722 struct s2255_dev *dev = vc->dev;
724 strscpy(cap->driver, "s2255", sizeof(cap->driver));
725 strscpy(cap->card, "s2255", sizeof(cap->card));
726 usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
730 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
731 struct v4l2_fmtdesc *f)
733 int index = f->index;
735 if (index >= ARRAY_SIZE(formats))
737 if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
738 (formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
740 strscpy(f->description, formats[index].name, sizeof(f->description));
741 f->pixelformat = formats[index].fourcc;
745 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
746 struct v4l2_format *f)
748 struct s2255_vc *vc = video_drvdata(file);
749 int is_ntsc = vc->std & V4L2_STD_525_60;
751 f->fmt.pix.width = vc->width;
752 f->fmt.pix.height = vc->height;
753 if (f->fmt.pix.height >=
754 (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2)
755 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
757 f->fmt.pix.field = V4L2_FIELD_TOP;
758 f->fmt.pix.pixelformat = vc->fmt->fourcc;
759 f->fmt.pix.bytesperline = f->fmt.pix.width * (vc->fmt->depth >> 3);
760 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
761 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
766 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
767 struct v4l2_format *f)
769 const struct s2255_fmt *fmt;
770 enum v4l2_field field;
771 struct s2255_vc *vc = video_drvdata(file);
772 int is_ntsc = vc->std & V4L2_STD_525_60;
774 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
779 field = f->fmt.pix.field;
781 dprintk(vc->dev, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
782 __func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
785 if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
786 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
787 field = V4L2_FIELD_INTERLACED;
789 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
790 field = V4L2_FIELD_TOP;
792 if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
793 f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
795 f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
798 if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
799 f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
800 field = V4L2_FIELD_INTERLACED;
802 f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
803 field = V4L2_FIELD_TOP;
805 if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
806 f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
808 f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
810 f->fmt.pix.field = field;
811 f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
812 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
813 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
815 dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
816 f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
820 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
821 struct v4l2_format *f)
823 struct s2255_vc *vc = video_drvdata(file);
824 const struct s2255_fmt *fmt;
825 struct vb2_queue *q = &vc->vb_vidq;
826 struct s2255_mode mode;
829 ret = vidioc_try_fmt_vid_cap(file, vc, f);
834 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
839 if (vb2_is_busy(q)) {
840 dprintk(vc->dev, 1, "queue busy\n");
846 vc->width = f->fmt.pix.width;
847 vc->height = f->fmt.pix.height;
848 vc->field = f->fmt.pix.field;
849 if (vc->width > norm_minw(vc)) {
850 if (vc->height > norm_minh(vc)) {
851 if (vc->cap_parm.capturemode &
852 V4L2_MODE_HIGHQUALITY)
853 mode.scale = SCALE_4CIFSI;
855 mode.scale = SCALE_4CIFS;
857 mode.scale = SCALE_2CIFS;
860 mode.scale = SCALE_1CIFS;
863 switch (vc->fmt->fourcc) {
864 case V4L2_PIX_FMT_GREY:
865 mode.color &= ~MASK_COLOR;
866 mode.color |= COLOR_Y8;
868 case V4L2_PIX_FMT_JPEG:
869 case V4L2_PIX_FMT_MJPEG:
870 mode.color &= ~MASK_COLOR;
871 mode.color |= COLOR_JPG;
872 mode.color |= (vc->jpegqual << 8);
874 case V4L2_PIX_FMT_YUV422P:
875 mode.color &= ~MASK_COLOR;
876 mode.color |= COLOR_YUVPL;
878 case V4L2_PIX_FMT_YUYV:
879 case V4L2_PIX_FMT_UYVY:
881 mode.color &= ~MASK_COLOR;
882 mode.color |= COLOR_YUVPK;
885 if ((mode.color & MASK_COLOR) != (vc->mode.color & MASK_COLOR))
887 else if (mode.scale != vc->mode.scale)
889 else if (mode.format != vc->mode.format)
892 (void) s2255_set_mode(vc, &mode);
897 /* write to the configuration pipe, synchronously */
898 static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
905 pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
906 retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
911 static u32 get_transfer_size(struct s2255_mode *mode)
913 int linesPerFrame = LINE_SZ_DEF;
914 int pixelsPerLine = NUM_LINES_DEF;
917 unsigned int mask_mult;
922 if (mode->format == FORMAT_NTSC) {
923 switch (mode->scale) {
926 linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
927 pixelsPerLine = LINE_SZ_4CIFS_NTSC;
930 linesPerFrame = NUM_LINES_2CIFS_NTSC;
931 pixelsPerLine = LINE_SZ_2CIFS_NTSC;
934 linesPerFrame = NUM_LINES_1CIFS_NTSC;
935 pixelsPerLine = LINE_SZ_1CIFS_NTSC;
940 } else if (mode->format == FORMAT_PAL) {
941 switch (mode->scale) {
944 linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
945 pixelsPerLine = LINE_SZ_4CIFS_PAL;
948 linesPerFrame = NUM_LINES_2CIFS_PAL;
949 pixelsPerLine = LINE_SZ_2CIFS_PAL;
952 linesPerFrame = NUM_LINES_1CIFS_PAL;
953 pixelsPerLine = LINE_SZ_1CIFS_PAL;
959 outImageSize = linesPerFrame * pixelsPerLine;
960 if ((mode->color & MASK_COLOR) != COLOR_Y8) {
961 /* 2 bytes/pixel if not monochrome */
965 /* total bytes to send including prefix and 4K padding;
966 must be a multiple of USB_READ_SIZE */
967 usbInSize = outImageSize + PREFIX_SIZE; /* always send prefix */
968 mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
969 /* if size not a multiple of USB_READ_SIZE */
970 if (usbInSize & ~mask_mult)
971 usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
975 static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
977 struct device *dev = &sdev->udev->dev;
978 dev_info(dev, "------------------------------------------------\n");
979 dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
980 dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
981 dev_info(dev, "bright: 0x%x\n", mode->bright);
982 dev_info(dev, "------------------------------------------------\n");
986 * set mode is the function which controls the DSP.
987 * the restart parameter in struct s2255_mode should be set whenever
988 * the image size could change via color format, video system or image
990 * When the restart parameter is set, we sleep for ONE frame to allow the
991 * DSP time to get the new frame
993 static int s2255_set_mode(struct s2255_vc *vc,
994 struct s2255_mode *mode)
997 unsigned long chn_rev;
998 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
1000 __le32 *buffer = dev->cmdbuf;
1002 mutex_lock(&dev->cmdlock);
1003 chn_rev = G_chnmap[vc->idx];
1004 dprintk(dev, 3, "%s channel: %d\n", __func__, vc->idx);
1005 /* if JPEG, set the quality */
1006 if ((mode->color & MASK_COLOR) == COLOR_JPG) {
1007 mode->color &= ~MASK_COLOR;
1008 mode->color |= COLOR_JPG;
1009 mode->color &= ~MASK_JPG_QUALITY;
1010 mode->color |= (vc->jpegqual << 8);
1014 vc->req_image_size = get_transfer_size(mode);
1015 dprintk(dev, 1, "%s: reqsize %ld\n", __func__, vc->req_image_size);
1017 buffer[0] = IN_DATA_TOKEN;
1018 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1019 buffer[2] = CMD_SET_MODE;
1020 for (i = 0; i < sizeof(struct s2255_mode) / sizeof(u32); i++)
1021 buffer[3 + i] = cpu_to_le32(((u32 *)&vc->mode)[i]);
1022 vc->setmode_ready = 0;
1023 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1025 s2255_print_cfg(dev, mode);
1026 /* wait at least 3 frames before continuing */
1027 if (mode->restart) {
1028 wait_event_timeout(vc->wait_setmode,
1029 (vc->setmode_ready != 0),
1030 msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
1031 if (vc->setmode_ready != 1) {
1032 dprintk(dev, 0, "s2255: no set mode response\n");
1036 /* clear the restart flag */
1037 vc->mode.restart = 0;
1038 dprintk(dev, 1, "%s chn %d, result: %d\n", __func__, vc->idx, res);
1039 mutex_unlock(&dev->cmdlock);
1043 static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
1047 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
1048 __le32 *buffer = dev->cmdbuf;
1050 mutex_lock(&dev->cmdlock);
1051 chn_rev = G_chnmap[vc->idx];
1052 dprintk(dev, 4, "%s chan %d\n", __func__, vc->idx);
1053 /* form the get vid status command */
1054 buffer[0] = IN_DATA_TOKEN;
1055 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1056 buffer[2] = CMD_STATUS;
1058 vc->vidstatus_ready = 0;
1059 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1060 wait_event_timeout(vc->wait_vidstatus,
1061 (vc->vidstatus_ready != 0),
1062 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
1063 if (vc->vidstatus_ready != 1) {
1064 dprintk(dev, 0, "s2255: no vidstatus response\n");
1067 *pstatus = vc->vidstatus;
1068 dprintk(dev, 4, "%s, vid status %d\n", __func__, *pstatus);
1069 mutex_unlock(&dev->cmdlock);
1073 static int start_streaming(struct vb2_queue *vq, unsigned int count)
1075 struct s2255_vc *vc = vb2_get_drv_priv(vq);
1078 vc->last_frame = -1;
1079 vc->bad_payload = 0;
1081 vc->frame_count = 0;
1082 for (j = 0; j < SYS_FRAMES; j++) {
1083 vc->buffer.frame[j].ulState = S2255_READ_IDLE;
1084 vc->buffer.frame[j].cur_size = 0;
1086 return s2255_start_acquire(vc);
1089 /* abort streaming and wait for last buffer */
1090 static void stop_streaming(struct vb2_queue *vq)
1092 struct s2255_vc *vc = vb2_get_drv_priv(vq);
1093 struct s2255_buffer *buf, *node;
1094 unsigned long flags;
1095 (void) s2255_stop_acquire(vc);
1096 spin_lock_irqsave(&vc->qlock, flags);
1097 list_for_each_entry_safe(buf, node, &vc->buf_list, list) {
1098 list_del(&buf->list);
1099 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
1100 dprintk(vc->dev, 2, "[%p/%d] done\n",
1101 buf, buf->vb.vb2_buf.index);
1103 spin_unlock_irqrestore(&vc->qlock, flags);
1106 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
1108 struct s2255_vc *vc = video_drvdata(file);
1109 struct s2255_mode mode;
1110 struct vb2_queue *q = &vc->vb_vidq;
1113 * Changing the standard implies a format change, which is not allowed
1114 * while buffers for use with streaming have already been allocated.
1120 if (i & V4L2_STD_525_60) {
1121 dprintk(vc->dev, 4, "%s 60 Hz\n", __func__);
1122 /* if changing format, reset frame decimation/intervals */
1123 if (mode.format != FORMAT_NTSC) {
1125 mode.format = FORMAT_NTSC;
1127 vc->width = LINE_SZ_4CIFS_NTSC;
1128 vc->height = NUM_LINES_4CIFS_NTSC * 2;
1130 } else if (i & V4L2_STD_625_50) {
1131 dprintk(vc->dev, 4, "%s 50 Hz\n", __func__);
1132 if (mode.format != FORMAT_PAL) {
1134 mode.format = FORMAT_PAL;
1136 vc->width = LINE_SZ_4CIFS_PAL;
1137 vc->height = NUM_LINES_4CIFS_PAL * 2;
1143 s2255_set_mode(vc, &mode);
1147 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
1149 struct s2255_vc *vc = video_drvdata(file);
1155 /* Sensoray 2255 is a multiple channel capture device.
1156 It does not have a "crossbar" of inputs.
1157 We use one V4L device per channel. The user must
1158 be aware that certain combinations are not allowed.
1159 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1160 at once in color(you can do full fps on 4 channels with greyscale.
1162 static int vidioc_enum_input(struct file *file, void *priv,
1163 struct v4l2_input *inp)
1165 struct s2255_vc *vc = video_drvdata(file);
1166 struct s2255_dev *dev = vc->dev;
1169 if (inp->index != 0)
1171 inp->type = V4L2_INPUT_TYPE_CAMERA;
1172 inp->std = S2255_NORMS;
1174 if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1176 rc = s2255_cmd_status(vc, &status);
1177 dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
1180 inp->status = (status & 0x01) ? 0
1181 : V4L2_IN_ST_NO_SIGNAL;
1186 strscpy(inp->name, "Composite", sizeof(inp->name));
1189 strscpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
1196 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1201 static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1208 static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
1210 struct s2255_vc *vc =
1211 container_of(ctrl->handler, struct s2255_vc, hdl);
1212 struct s2255_mode mode;
1214 /* update the mode to the corresponding value */
1216 case V4L2_CID_BRIGHTNESS:
1217 mode.bright = ctrl->val;
1219 case V4L2_CID_CONTRAST:
1220 mode.contrast = ctrl->val;
1223 mode.hue = ctrl->val;
1225 case V4L2_CID_SATURATION:
1226 mode.saturation = ctrl->val;
1228 case V4L2_CID_S2255_COLORFILTER:
1229 mode.color &= ~MASK_INPUT_TYPE;
1230 mode.color |= !ctrl->val << 16;
1232 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1233 vc->jpegqual = ctrl->val;
1239 /* set mode here. Note: stream does not need restarted.
1240 some V4L programs restart stream unnecessarily
1243 s2255_set_mode(vc, &mode);
1247 static int vidioc_g_jpegcomp(struct file *file, void *priv,
1248 struct v4l2_jpegcompression *jc)
1250 struct s2255_vc *vc = video_drvdata(file);
1252 memset(jc, 0, sizeof(*jc));
1253 jc->quality = vc->jpegqual;
1254 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1258 static int vidioc_s_jpegcomp(struct file *file, void *priv,
1259 const struct v4l2_jpegcompression *jc)
1261 struct s2255_vc *vc = video_drvdata(file);
1263 if (jc->quality < 0 || jc->quality > 100)
1265 v4l2_ctrl_s_ctrl(vc->jpegqual_ctrl, jc->quality);
1266 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1270 static int vidioc_g_parm(struct file *file, void *priv,
1271 struct v4l2_streamparm *sp)
1273 __u32 def_num, def_dem;
1274 struct s2255_vc *vc = video_drvdata(file);
1276 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1278 sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1279 sp->parm.capture.capturemode = vc->cap_parm.capturemode;
1280 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1281 def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1282 def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1283 sp->parm.capture.timeperframe.denominator = def_dem;
1284 switch (vc->mode.fdec) {
1287 sp->parm.capture.timeperframe.numerator = def_num;
1290 sp->parm.capture.timeperframe.numerator = def_num * 2;
1293 sp->parm.capture.timeperframe.numerator = def_num * 3;
1296 sp->parm.capture.timeperframe.numerator = def_num * 5;
1299 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
1301 sp->parm.capture.capturemode,
1302 sp->parm.capture.timeperframe.numerator,
1303 sp->parm.capture.timeperframe.denominator);
1307 static int vidioc_s_parm(struct file *file, void *priv,
1308 struct v4l2_streamparm *sp)
1310 struct s2255_vc *vc = video_drvdata(file);
1311 struct s2255_mode mode;
1313 __u32 def_num, def_dem;
1314 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1317 /* high quality capture mode requires a stream restart */
1318 if ((vc->cap_parm.capturemode != sp->parm.capture.capturemode)
1319 && vb2_is_streaming(&vc->vb_vidq))
1321 def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
1322 def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
1323 if (def_dem != sp->parm.capture.timeperframe.denominator)
1324 sp->parm.capture.timeperframe.numerator = def_num;
1325 else if (sp->parm.capture.timeperframe.numerator <= def_num)
1326 sp->parm.capture.timeperframe.numerator = def_num;
1327 else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
1328 sp->parm.capture.timeperframe.numerator = def_num * 2;
1330 } else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
1331 sp->parm.capture.timeperframe.numerator = def_num * 3;
1334 sp->parm.capture.timeperframe.numerator = def_num * 5;
1338 sp->parm.capture.timeperframe.denominator = def_dem;
1339 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1340 s2255_set_mode(vc, &mode);
1341 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1343 sp->parm.capture.capturemode,
1344 sp->parm.capture.timeperframe.numerator,
1345 sp->parm.capture.timeperframe.denominator, fdec);
1349 #define NUM_SIZE_ENUMS 3
1350 static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1355 static const struct v4l2_frmsize_discrete pal_sizes[] = {
1361 static int vidioc_enum_framesizes(struct file *file, void *priv,
1362 struct v4l2_frmsizeenum *fe)
1364 struct s2255_vc *vc = video_drvdata(file);
1365 int is_ntsc = vc->std & V4L2_STD_525_60;
1366 const struct s2255_fmt *fmt;
1368 if (fe->index >= NUM_SIZE_ENUMS)
1371 fmt = format_by_fourcc(fe->pixel_format);
1374 fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1375 fe->discrete = is_ntsc ? ntsc_sizes[fe->index] : pal_sizes[fe->index];
1379 static int vidioc_enum_frameintervals(struct file *file, void *priv,
1380 struct v4l2_frmivalenum *fe)
1382 struct s2255_vc *vc = video_drvdata(file);
1383 const struct s2255_fmt *fmt;
1384 const struct v4l2_frmsize_discrete *sizes;
1385 int is_ntsc = vc->std & V4L2_STD_525_60;
1386 #define NUM_FRAME_ENUMS 4
1387 int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1390 if (fe->index >= NUM_FRAME_ENUMS)
1393 fmt = format_by_fourcc(fe->pixel_format);
1397 sizes = is_ntsc ? ntsc_sizes : pal_sizes;
1398 for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
1399 if (fe->width == sizes->width &&
1400 fe->height == sizes->height)
1402 if (i == NUM_SIZE_ENUMS)
1405 fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1406 fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1407 fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1408 dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
1409 fe->discrete.numerator,
1410 fe->discrete.denominator);
1414 static int s2255_open(struct file *file)
1416 struct s2255_vc *vc = video_drvdata(file);
1417 struct s2255_dev *dev = vc->dev;
1421 rc = v4l2_fh_open(file);
1425 dprintk(dev, 1, "s2255: %s\n", __func__);
1426 state = atomic_read(&dev->fw_data->fw_state);
1428 case S2255_FW_DISCONNECTING:
1430 case S2255_FW_FAILED:
1431 s2255_dev_err(&dev->udev->dev,
1432 "firmware load failed. retrying.\n");
1433 s2255_fwload_start(dev);
1434 wait_event_timeout(dev->fw_data->wait_fw,
1435 ((atomic_read(&dev->fw_data->fw_state)
1436 == S2255_FW_SUCCESS) ||
1437 (atomic_read(&dev->fw_data->fw_state)
1438 == S2255_FW_DISCONNECTING)),
1439 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1440 /* state may have changed, re-read */
1441 state = atomic_read(&dev->fw_data->fw_state);
1443 case S2255_FW_NOTLOADED:
1444 case S2255_FW_LOADED_DSPWAIT:
1445 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1446 driver loaded and then device immediately opened */
1447 pr_info("%s waiting for firmware load\n", __func__);
1448 wait_event_timeout(dev->fw_data->wait_fw,
1449 ((atomic_read(&dev->fw_data->fw_state)
1450 == S2255_FW_SUCCESS) ||
1451 (atomic_read(&dev->fw_data->fw_state)
1452 == S2255_FW_DISCONNECTING)),
1453 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1454 /* state may have changed, re-read */
1455 state = atomic_read(&dev->fw_data->fw_state);
1457 case S2255_FW_SUCCESS:
1461 /* state may have changed in above switch statement */
1463 case S2255_FW_SUCCESS:
1465 case S2255_FW_FAILED:
1466 pr_info("2255 firmware load failed.\n");
1468 case S2255_FW_DISCONNECTING:
1469 pr_info("%s: disconnecting\n", __func__);
1471 case S2255_FW_LOADED_DSPWAIT:
1472 case S2255_FW_NOTLOADED:
1473 pr_info("%s: firmware not loaded, please retry\n",
1476 * Timeout on firmware load means device unusable.
1477 * Set firmware failure state.
1478 * On next s2255_open the firmware will be reloaded.
1480 atomic_set(&dev->fw_data->fw_state,
1484 pr_info("%s: unknown state\n", __func__);
1487 if (!vc->configured) {
1488 /* configure channel to default state */
1489 vc->fmt = &formats[0];
1490 s2255_set_mode(vc, &vc->mode);
1496 static void s2255_destroy(struct s2255_dev *dev)
1498 dprintk(dev, 1, "%s", __func__);
1499 /* board shutdown stops the read pipe if it is running */
1500 s2255_board_shutdown(dev);
1501 /* make sure firmware still not trying to load */
1502 del_timer_sync(&dev->timer); /* only started in .probe and .open */
1503 if (dev->fw_data->fw_urb) {
1504 usb_kill_urb(dev->fw_data->fw_urb);
1505 usb_free_urb(dev->fw_data->fw_urb);
1506 dev->fw_data->fw_urb = NULL;
1508 release_firmware(dev->fw_data->fw);
1509 kfree(dev->fw_data->pfw_data);
1510 kfree(dev->fw_data);
1511 /* reset the DSP so firmware can be reloaded next time */
1512 s2255_reset_dsppower(dev);
1513 mutex_destroy(&dev->lock);
1514 usb_put_dev(dev->udev);
1515 v4l2_device_unregister(&dev->v4l2_dev);
1520 static const struct v4l2_file_operations s2255_fops_v4l = {
1521 .owner = THIS_MODULE,
1523 .release = vb2_fop_release,
1524 .poll = vb2_fop_poll,
1525 .unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
1526 .mmap = vb2_fop_mmap,
1527 .read = vb2_fop_read,
1530 static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1531 .vidioc_querycap = vidioc_querycap,
1532 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1533 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1534 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1535 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1536 .vidioc_reqbufs = vb2_ioctl_reqbufs,
1537 .vidioc_querybuf = vb2_ioctl_querybuf,
1538 .vidioc_qbuf = vb2_ioctl_qbuf,
1539 .vidioc_dqbuf = vb2_ioctl_dqbuf,
1540 .vidioc_s_std = vidioc_s_std,
1541 .vidioc_g_std = vidioc_g_std,
1542 .vidioc_enum_input = vidioc_enum_input,
1543 .vidioc_g_input = vidioc_g_input,
1544 .vidioc_s_input = vidioc_s_input,
1545 .vidioc_streamon = vb2_ioctl_streamon,
1546 .vidioc_streamoff = vb2_ioctl_streamoff,
1547 .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1548 .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1549 .vidioc_s_parm = vidioc_s_parm,
1550 .vidioc_g_parm = vidioc_g_parm,
1551 .vidioc_enum_framesizes = vidioc_enum_framesizes,
1552 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1553 .vidioc_log_status = v4l2_ctrl_log_status,
1554 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1555 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1558 static void s2255_video_device_release(struct video_device *vdev)
1560 struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
1561 struct s2255_vc *vc =
1562 container_of(vdev, struct s2255_vc, vdev);
1564 dprintk(dev, 4, "%s, chnls: %d\n", __func__,
1565 atomic_read(&dev->num_channels));
1567 v4l2_ctrl_handler_free(&vc->hdl);
1569 if (atomic_dec_and_test(&dev->num_channels))
1574 static const struct video_device template = {
1576 .fops = &s2255_fops_v4l,
1577 .ioctl_ops = &s2255_ioctl_ops,
1578 .release = s2255_video_device_release,
1579 .tvnorms = S2255_NORMS,
1582 static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1583 .s_ctrl = s2255_s_ctrl,
1586 static const struct v4l2_ctrl_config color_filter_ctrl = {
1587 .ops = &s2255_ctrl_ops,
1588 .name = "Color Filter",
1589 .id = V4L2_CID_S2255_COLORFILTER,
1590 .type = V4L2_CTRL_TYPE_BOOLEAN,
1596 static int s2255_probe_v4l(struct s2255_dev *dev)
1600 int cur_nr = video_nr;
1601 struct s2255_vc *vc;
1602 struct vb2_queue *q;
1604 ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
1607 /* initialize all video 4 linux */
1608 /* register 4 video devices */
1609 for (i = 0; i < MAX_CHANNELS; i++) {
1611 INIT_LIST_HEAD(&vc->buf_list);
1613 v4l2_ctrl_handler_init(&vc->hdl, 6);
1614 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1615 V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
1616 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1617 V4L2_CID_CONTRAST, 0, 255, 1, DEF_CONTRAST);
1618 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1619 V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION);
1620 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1621 V4L2_CID_HUE, 0, 255, 1, DEF_HUE);
1622 vc->jpegqual_ctrl = v4l2_ctrl_new_std(&vc->hdl,
1624 V4L2_CID_JPEG_COMPRESSION_QUALITY,
1625 0, 100, 1, S2255_DEF_JPEG_QUAL);
1626 if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER &&
1627 (dev->pid != 0x2257 || vc->idx <= 1))
1628 v4l2_ctrl_new_custom(&vc->hdl, &color_filter_ctrl,
1630 if (vc->hdl.error) {
1631 ret = vc->hdl.error;
1632 v4l2_ctrl_handler_free(&vc->hdl);
1633 dev_err(&dev->udev->dev, "couldn't register control\n");
1637 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1638 q->io_modes = VB2_MMAP | VB2_READ | VB2_USERPTR;
1640 q->lock = &vc->vb_lock;
1641 q->buf_struct_size = sizeof(struct s2255_buffer);
1642 q->mem_ops = &vb2_vmalloc_memops;
1643 q->ops = &s2255_video_qops;
1644 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1645 ret = vb2_queue_init(q);
1647 dev_err(&dev->udev->dev,
1648 "%s vb2_queue_init 0x%x\n", __func__, ret);
1651 /* register video devices */
1652 vc->vdev = template;
1654 vc->vdev.ctrl_handler = &vc->hdl;
1655 vc->vdev.lock = &dev->lock;
1656 vc->vdev.v4l2_dev = &dev->v4l2_dev;
1657 vc->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE |
1658 V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
1659 video_set_drvdata(&vc->vdev, vc);
1661 ret = video_register_device(&vc->vdev,
1665 ret = video_register_device(&vc->vdev,
1670 dev_err(&dev->udev->dev,
1671 "failed to register video device!\n");
1674 atomic_inc(&dev->num_channels);
1675 v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1676 video_device_node_name(&vc->vdev));
1679 pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1681 /* if no channels registered, return error and probe will fail*/
1682 if (atomic_read(&dev->num_channels) == 0) {
1683 v4l2_device_unregister(&dev->v4l2_dev);
1686 if (atomic_read(&dev->num_channels) != MAX_CHANNELS)
1687 pr_warn("s2255: Not all channels available.\n");
1691 /* this function moves the usb stream read pipe data
1692 * into the system buffers.
1693 * returns 0 on success, EAGAIN if more data to process( call this
1696 * Received frame structure:
1697 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1698 * bytes 4-7: channel: 0-3
1699 * bytes 8-11: payload size: size of the frame
1700 * bytes 12-payloadsize+12: frame data
1702 static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1708 unsigned long copy_size;
1711 struct s2255_framei *frm;
1712 unsigned char *pdata;
1713 struct s2255_vc *vc;
1714 dprintk(dev, 100, "buffer to user\n");
1715 vc = &dev->vc[dev->cc];
1716 idx = vc->cur_frame;
1717 frm = &vc->buffer.frame[idx];
1718 if (frm->ulState == S2255_READ_IDLE) {
1721 __le32 *pdword; /*data from dsp is little endian */
1723 /* search for marker codes */
1724 pdata = (unsigned char *)pipe_info->transfer_buffer;
1725 pdword = (__le32 *)pdata;
1726 for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
1728 case S2255_MARKER_FRAME:
1729 dprintk(dev, 4, "marker @ offset: %d [%x %x]\n",
1730 jj, pdata[0], pdata[1]);
1731 offset = jj + PREFIX_SIZE;
1733 cc = le32_to_cpu(pdword[1]);
1734 if (cc >= MAX_CHANNELS) {
1740 dev->cc = G_chnmap[cc];
1741 vc = &dev->vc[dev->cc];
1742 payload = le32_to_cpu(pdword[3]);
1743 if (payload > vc->req_image_size) {
1745 /* discard the bad frame */
1748 vc->pkt_size = payload;
1749 vc->jpg_size = le32_to_cpu(pdword[4]);
1751 case S2255_MARKER_RESPONSE:
1753 pdata += DEF_USB_BLOCK;
1754 jj += DEF_USB_BLOCK;
1755 if (le32_to_cpu(pdword[1]) >= MAX_CHANNELS)
1757 cc = G_chnmap[le32_to_cpu(pdword[1])];
1758 if (cc >= MAX_CHANNELS)
1761 switch (pdword[2]) {
1762 case S2255_RESPONSE_SETMODE:
1763 /* check if channel valid */
1764 /* set mode ready */
1765 vc->setmode_ready = 1;
1766 wake_up(&vc->wait_setmode);
1767 dprintk(dev, 5, "setmode rdy %d\n", cc);
1769 case S2255_RESPONSE_FW:
1770 dev->chn_ready |= (1 << cc);
1771 if ((dev->chn_ready & 0x0f) != 0x0f)
1773 /* all channels ready */
1774 pr_info("s2255: fw loaded\n");
1775 atomic_set(&dev->fw_data->fw_state,
1777 wake_up(&dev->fw_data->wait_fw);
1779 case S2255_RESPONSE_STATUS:
1780 vc->vidstatus = le32_to_cpu(pdword[3]);
1781 vc->vidstatus_ready = 1;
1782 wake_up(&vc->wait_vidstatus);
1783 dprintk(dev, 5, "vstat %x chan %d\n",
1784 le32_to_cpu(pdword[3]), cc);
1787 pr_info("s2255 unknown resp\n");
1801 vc = &dev->vc[dev->cc];
1802 idx = vc->cur_frame;
1803 frm = &vc->buffer.frame[idx];
1804 /* search done. now find out if should be acquiring on this channel */
1805 if (!vb2_is_streaming(&vc->vb_vidq)) {
1806 /* we found a frame, but this channel is turned off */
1807 frm->ulState = S2255_READ_IDLE;
1811 if (frm->ulState == S2255_READ_IDLE) {
1812 frm->ulState = S2255_READ_FRAME;
1816 /* skip the marker 512 bytes (and offset if out of sync) */
1817 psrc = (u8 *)pipe_info->transfer_buffer + offset;
1820 if (frm->lpvbits == NULL) {
1821 dprintk(dev, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1822 frm, dev, dev->cc, idx);
1826 pdest = frm->lpvbits + frm->cur_size;
1828 copy_size = (pipe_info->cur_transfer_size - offset);
1830 size = vc->pkt_size - PREFIX_SIZE;
1832 /* sanity check on pdest */
1833 if ((copy_size + frm->cur_size) < vc->req_image_size)
1834 memcpy(pdest, psrc, copy_size);
1836 frm->cur_size += copy_size;
1837 dprintk(dev, 4, "cur_size: %lu, size: %lu\n", frm->cur_size, size);
1839 if (frm->cur_size >= size) {
1840 dprintk(dev, 2, "******[%d]Buffer[%d]full*******\n",
1842 vc->last_frame = vc->cur_frame;
1844 /* end of system frame ring buffer, start at zero */
1845 if ((vc->cur_frame == SYS_FRAMES) ||
1846 (vc->cur_frame == vc->buffer.dwFrames))
1849 if (vb2_is_streaming(&vc->vb_vidq))
1850 s2255_got_frame(vc, vc->jpg_size);
1852 frm->ulState = S2255_READ_IDLE;
1856 /* done successfully */
1860 static void s2255_read_video_callback(struct s2255_dev *dev,
1861 struct s2255_pipeinfo *pipe_info)
1864 dprintk(dev, 50, "callback read video\n");
1866 if (dev->cc >= MAX_CHANNELS) {
1868 dev_err(&dev->udev->dev, "invalid channel\n");
1871 /* otherwise copy to the system buffers */
1872 res = save_frame(dev, pipe_info);
1874 dprintk(dev, 4, "s2255: read callback failed\n");
1876 dprintk(dev, 50, "callback read video done\n");
1880 static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
1881 u16 Index, u16 Value, void *TransferBuffer,
1882 s32 TransferBufferLength, int bOut)
1887 buf = kmalloc(TransferBufferLength, GFP_KERNEL);
1892 r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1894 USB_TYPE_VENDOR | USB_RECIP_DEVICE |
1897 TransferBufferLength, HZ * 5);
1900 memcpy(TransferBuffer, buf, TransferBufferLength);
1902 memcpy(buf, TransferBuffer, TransferBufferLength);
1903 r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1904 Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1906 TransferBufferLength, HZ * 5);
1913 * retrieve FX2 firmware version. future use.
1914 * @param dev pointer to device extension
1915 * @return -1 for fail, else returns firmware version as an int(16 bits)
1917 static int s2255_get_fx2fw(struct s2255_dev *dev)
1921 unsigned char transBuffer[64];
1922 ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer, 2,
1925 dprintk(dev, 2, "get fw error: %x\n", ret);
1926 fw = transBuffer[0] + (transBuffer[1] << 8);
1927 dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
1932 * Create the system ring buffer to copy frames into from the
1935 static int s2255_create_sys_buffers(struct s2255_vc *vc)
1938 unsigned long reqsize;
1939 vc->buffer.dwFrames = SYS_FRAMES;
1940 /* always allocate maximum size(PAL) for system buffers */
1941 reqsize = SYS_FRAMES_MAXSIZE;
1943 if (reqsize > SYS_FRAMES_MAXSIZE)
1944 reqsize = SYS_FRAMES_MAXSIZE;
1946 for (i = 0; i < SYS_FRAMES; i++) {
1947 /* allocate the frames */
1948 vc->buffer.frame[i].lpvbits = vmalloc(reqsize);
1949 vc->buffer.frame[i].size = reqsize;
1950 if (vc->buffer.frame[i].lpvbits == NULL) {
1951 pr_info("out of memory. using less frames\n");
1952 vc->buffer.dwFrames = i;
1957 /* make sure internal states are set */
1958 for (i = 0; i < SYS_FRAMES; i++) {
1959 vc->buffer.frame[i].ulState = 0;
1960 vc->buffer.frame[i].cur_size = 0;
1964 vc->last_frame = -1;
1968 static int s2255_release_sys_buffers(struct s2255_vc *vc)
1971 for (i = 0; i < SYS_FRAMES; i++) {
1972 vfree(vc->buffer.frame[i].lpvbits);
1973 vc->buffer.frame[i].lpvbits = NULL;
1978 static int s2255_board_init(struct s2255_dev *dev)
1980 struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
1983 struct s2255_pipeinfo *pipe = &dev->pipe;
1984 dprintk(dev, 4, "board init: %p", dev);
1985 memset(pipe, 0, sizeof(*pipe));
1987 pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
1988 pipe->max_transfer_size = S2255_USB_XFER_SIZE;
1990 pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
1992 if (pipe->transfer_buffer == NULL) {
1993 dprintk(dev, 1, "out of memory!\n");
1996 /* query the firmware */
1997 fw_ver = s2255_get_fx2fw(dev);
1999 pr_info("s2255: usb firmware version %d.%d\n",
2000 (fw_ver >> 8) & 0xff,
2003 if (fw_ver < S2255_CUR_USB_FWVER)
2004 pr_info("s2255: newer USB firmware available\n");
2006 for (j = 0; j < MAX_CHANNELS; j++) {
2007 struct s2255_vc *vc = &dev->vc[j];
2008 vc->mode = mode_def;
2009 if (dev->pid == 0x2257 && j > 1)
2010 vc->mode.color |= (1 << 16);
2011 vc->jpegqual = S2255_DEF_JPEG_QUAL;
2012 vc->width = LINE_SZ_4CIFS_NTSC;
2013 vc->height = NUM_LINES_4CIFS_NTSC * 2;
2014 vc->std = V4L2_STD_NTSC_M;
2015 vc->fmt = &formats[0];
2016 vc->mode.restart = 1;
2017 vc->req_image_size = get_transfer_size(&mode_def);
2018 vc->frame_count = 0;
2019 /* create the system buffers */
2020 s2255_create_sys_buffers(vc);
2022 /* start read pipe */
2023 s2255_start_readpipe(dev);
2024 dprintk(dev, 1, "%s: success\n", __func__);
2028 static int s2255_board_shutdown(struct s2255_dev *dev)
2031 dprintk(dev, 1, "%s: dev: %p", __func__, dev);
2033 for (i = 0; i < MAX_CHANNELS; i++) {
2034 if (vb2_is_streaming(&dev->vc[i].vb_vidq))
2035 s2255_stop_acquire(&dev->vc[i]);
2037 s2255_stop_readpipe(dev);
2038 for (i = 0; i < MAX_CHANNELS; i++)
2039 s2255_release_sys_buffers(&dev->vc[i]);
2040 /* release transfer buffer */
2041 kfree(dev->pipe.transfer_buffer);
2045 static void read_pipe_completion(struct urb *purb)
2047 struct s2255_pipeinfo *pipe_info;
2048 struct s2255_dev *dev;
2051 pipe_info = purb->context;
2052 if (pipe_info == NULL) {
2053 dev_err(&purb->dev->dev, "no context!\n");
2056 dev = pipe_info->dev;
2058 dev_err(&purb->dev->dev, "no context!\n");
2061 status = purb->status;
2062 /* if shutting down, do not resubmit, exit immediately */
2063 if (status == -ESHUTDOWN) {
2064 dprintk(dev, 2, "%s: err shutdown\n", __func__);
2065 pipe_info->err_count++;
2069 if (pipe_info->state == 0) {
2070 dprintk(dev, 2, "%s: exiting USB pipe", __func__);
2075 s2255_read_video_callback(dev, pipe_info);
2077 pipe_info->err_count++;
2078 dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
2081 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2083 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2085 pipe_info->transfer_buffer,
2086 pipe_info->cur_transfer_size,
2087 read_pipe_completion, pipe_info);
2089 if (pipe_info->state != 0) {
2090 if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC))
2091 dev_err(&dev->udev->dev, "error submitting urb\n");
2093 dprintk(dev, 2, "%s :complete state 0\n", __func__);
2098 static int s2255_start_readpipe(struct s2255_dev *dev)
2102 struct s2255_pipeinfo *pipe_info = &dev->pipe;
2103 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2104 dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
2105 pipe_info->state = 1;
2106 pipe_info->err_count = 0;
2107 pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
2108 if (!pipe_info->stream_urb)
2110 /* transfer buffer allocated in board_init */
2111 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2113 pipe_info->transfer_buffer,
2114 pipe_info->cur_transfer_size,
2115 read_pipe_completion, pipe_info);
2116 retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
2118 pr_err("s2255: start read pipe failed\n");
2124 /* starts acquisition process */
2125 static int s2255_start_acquire(struct s2255_vc *vc)
2128 unsigned long chn_rev;
2130 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2131 __le32 *buffer = dev->cmdbuf;
2133 mutex_lock(&dev->cmdlock);
2134 chn_rev = G_chnmap[vc->idx];
2135 vc->last_frame = -1;
2136 vc->bad_payload = 0;
2138 for (j = 0; j < SYS_FRAMES; j++) {
2139 vc->buffer.frame[j].ulState = 0;
2140 vc->buffer.frame[j].cur_size = 0;
2143 /* send the start command */
2144 buffer[0] = IN_DATA_TOKEN;
2145 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2146 buffer[2] = CMD_START;
2147 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2149 dev_err(&dev->udev->dev, "CMD_START error\n");
2151 dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
2152 mutex_unlock(&dev->cmdlock);
2156 static int s2255_stop_acquire(struct s2255_vc *vc)
2159 unsigned long chn_rev;
2160 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2161 __le32 *buffer = dev->cmdbuf;
2163 mutex_lock(&dev->cmdlock);
2164 chn_rev = G_chnmap[vc->idx];
2165 /* send the stop command */
2166 buffer[0] = IN_DATA_TOKEN;
2167 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2168 buffer[2] = CMD_STOP;
2170 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2172 dev_err(&dev->udev->dev, "CMD_STOP error\n");
2174 dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
2175 mutex_unlock(&dev->cmdlock);
2179 static void s2255_stop_readpipe(struct s2255_dev *dev)
2181 struct s2255_pipeinfo *pipe = &dev->pipe;
2184 if (pipe->stream_urb) {
2186 usb_kill_urb(pipe->stream_urb);
2187 usb_free_urb(pipe->stream_urb);
2188 pipe->stream_urb = NULL;
2190 dprintk(dev, 4, "%s", __func__);
2194 static void s2255_fwload_start(struct s2255_dev *dev)
2196 s2255_reset_dsppower(dev);
2197 dev->fw_data->fw_size = dev->fw_data->fw->size;
2198 atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2199 memcpy(dev->fw_data->pfw_data,
2200 dev->fw_data->fw->data, CHUNK_SIZE);
2201 dev->fw_data->fw_loaded = CHUNK_SIZE;
2202 usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
2203 usb_sndbulkpipe(dev->udev, 2),
2204 dev->fw_data->pfw_data,
2205 CHUNK_SIZE, s2255_fwchunk_complete,
2207 mod_timer(&dev->timer, jiffies + HZ);
2210 /* standard usb probe function */
2211 static int s2255_probe(struct usb_interface *interface,
2212 const struct usb_device_id *id)
2214 struct s2255_dev *dev = NULL;
2215 struct usb_host_interface *iface_desc;
2216 struct usb_endpoint_descriptor *endpoint;
2218 int retval = -ENOMEM;
2222 /* allocate memory for our device state and initialize it to zero */
2223 dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
2225 s2255_dev_err(&interface->dev, "out of memory\n");
2229 dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
2230 if (dev->cmdbuf == NULL) {
2231 s2255_dev_err(&interface->dev, "out of memory\n");
2235 atomic_set(&dev->num_channels, 0);
2236 dev->pid = id->idProduct;
2237 dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
2240 mutex_init(&dev->lock);
2241 mutex_init(&dev->cmdlock);
2242 /* grab usb_device and save it */
2243 dev->udev = usb_get_dev(interface_to_usbdev(interface));
2244 if (dev->udev == NULL) {
2245 dev_err(&interface->dev, "null usb device\n");
2249 dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
2250 dev, dev->udev, interface);
2251 dev->interface = interface;
2252 /* set up the endpoint information */
2253 iface_desc = interface->cur_altsetting;
2254 dev_dbg(&interface->dev, "num EP: %d\n",
2255 iface_desc->desc.bNumEndpoints);
2256 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2257 endpoint = &iface_desc->endpoint[i].desc;
2258 if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
2259 /* we found the bulk in endpoint */
2260 dev->read_endpoint = endpoint->bEndpointAddress;
2264 if (!dev->read_endpoint) {
2265 dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2268 timer_setup(&dev->timer, s2255_timer, 0);
2269 init_waitqueue_head(&dev->fw_data->wait_fw);
2270 for (i = 0; i < MAX_CHANNELS; i++) {
2271 struct s2255_vc *vc = &dev->vc[i];
2274 init_waitqueue_head(&vc->wait_setmode);
2275 init_waitqueue_head(&vc->wait_vidstatus);
2276 spin_lock_init(&vc->qlock);
2277 mutex_init(&vc->vb_lock);
2280 dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
2281 if (!dev->fw_data->fw_urb)
2284 dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2285 if (!dev->fw_data->pfw_data) {
2286 dev_err(&interface->dev, "out of memory!\n");
2289 /* load the first chunk */
2290 if (reject_firmware(&dev->fw_data->fw,
2291 FIRMWARE_FILE_NAME, &dev->udev->dev)) {
2292 dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
2295 /* check the firmware is valid */
2296 fw_size = dev->fw_data->fw->size;
2297 pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2299 if (*pdata != S2255_FW_MARKER) {
2300 dev_err(&interface->dev, "Firmware invalid.\n");
2304 /* make sure firmware is the latest */
2306 pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2307 pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
2308 dev->dsp_fw_ver = le32_to_cpu(*pRel);
2309 if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
2310 pr_info("s2255: /*(DEBLOBBED)*/ out of date.\n");
2311 if (dev->pid == 0x2257 &&
2312 dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
2313 pr_warn("2257 needs firmware %d or above.\n",
2314 S2255_MIN_DSP_COLORFILTER);
2316 usb_reset_device(dev->udev);
2317 /* load 2255 board specific */
2318 retval = s2255_board_init(dev);
2320 goto errorBOARDINIT;
2321 s2255_fwload_start(dev);
2322 /* loads v4l specific */
2323 retval = s2255_probe_v4l(dev);
2325 goto errorBOARDINIT;
2326 dev_info(&interface->dev, "Sensoray 2255 detected\n");
2329 s2255_board_shutdown(dev);
2331 release_firmware(dev->fw_data->fw);
2333 kfree(dev->fw_data->pfw_data);
2335 usb_free_urb(dev->fw_data->fw_urb);
2337 del_timer_sync(&dev->timer);
2339 usb_put_dev(dev->udev);
2341 kfree(dev->fw_data);
2342 mutex_destroy(&dev->lock);
2346 pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
2350 /* disconnect routine. when board is removed physically or with rmmod */
2351 static void s2255_disconnect(struct usb_interface *interface)
2353 struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
2355 int channels = atomic_read(&dev->num_channels);
2356 mutex_lock(&dev->lock);
2357 v4l2_device_disconnect(&dev->v4l2_dev);
2358 mutex_unlock(&dev->lock);
2359 /*see comments in the uvc_driver.c usb disconnect function */
2360 atomic_inc(&dev->num_channels);
2361 /* unregister each video device. */
2362 for (i = 0; i < channels; i++)
2363 video_unregister_device(&dev->vc[i].vdev);
2364 /* wake up any of our timers */
2365 atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2366 wake_up(&dev->fw_data->wait_fw);
2367 for (i = 0; i < MAX_CHANNELS; i++) {
2368 dev->vc[i].setmode_ready = 1;
2369 wake_up(&dev->vc[i].wait_setmode);
2370 dev->vc[i].vidstatus_ready = 1;
2371 wake_up(&dev->vc[i].wait_vidstatus);
2373 if (atomic_dec_and_test(&dev->num_channels))
2375 dev_info(&interface->dev, "%s\n", __func__);
2378 static struct usb_driver s2255_driver = {
2379 .name = S2255_DRIVER_NAME,
2380 .probe = s2255_probe,
2381 .disconnect = s2255_disconnect,
2382 .id_table = s2255_table,
2385 module_usb_driver(s2255_driver);
2387 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2388 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2389 MODULE_LICENSE("GPL");
2390 MODULE_VERSION(S2255_VERSION);