1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * s2255drv.c - a driver for the Sensoray 2255 USB video capture device
4 *
5 * Copyright (C) 2007-2014 by Sensoray Company Inc.
6 * Dean Anderson
7 *
8 * Some video buffer code based on vivi driver:
9 *
10 * Sensoray 2255 device supports 4 simultaneous channels.
11 * The channels are not "crossbar" inputs, they are physically
12 * attached to separate video decoders.
13 *
14 * Because of USB2.0 bandwidth limitations. There is only a
15 * certain amount of data which may be transferred at one time.
16 *
17 * Example maximum bandwidth utilization:
18 *
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
23 * at once.
24 */
25
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>
32#include <linux/mm.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>
42
43#define S2255_VERSION "1.25.1"
44#define FIRMWARE_FILE_NAME "f2255usb.bin"
45
46/* default JPEG quality */
47#define S2255_DEF_JPEG_QUAL 50
48/* vendor request in */
49#define S2255_VR_IN 0
50/* vendor request out */
51#define S2255_VR_OUT 1
52/* firmware query */
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
70#define SYS_FRAMES 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
88
89
90/* predefined settings */
91#define FORMAT_NTSC 1
92#define FORMAT_PAL 2
93
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 */
99
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 */
104
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 */
113
114/*-------------------------------------------------------
115 * Default mode parameters.
116 *-------------------------------------------------------*/
117#define DEF_SCALE SCALE_4CIFS
118#define DEF_COLOR COLOR_YUVPL
119#define DEF_FDEC FDEC_1
120#define DEF_BRIGHT 0
121#define DEF_CONTRAST 0x5c
122#define DEF_SATURATION 0x80
123#define DEF_HUE 0
124
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))
132
133struct s2255_mode {
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 */
145};
146
147
148#define S2255_READ_IDLE 0
149#define S2255_READ_FRAME 1
150
151/* frame structure */
152struct s2255_framei {
153 unsigned long size;
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 */
157};
158
159/* image buffer structure */
160struct s2255_bufferi {
161 unsigned long dwFrames; /* number of frames in buffer */
162 struct s2255_framei frame[SYS_FRAMES]; /* array of FRAME structures */
163};
164
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}
168
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
179struct s2255_fw {
180 int fw_loaded;
181 int fw_size;
182 struct urb *fw_urb;
183 atomic_t fw_state;
184 void *pfw_data;
185 wait_queue_head_t wait_fw;
186 const struct firmware *fw;
187};
188
189struct s2255_pipeinfo {
190 u32 max_transfer_size;
191 u32 cur_transfer_size;
192 u8 *transfer_buffer;
193 u32 state;
194 void *stream_urb;
195 void *dev; /* back pointer to s2255_dev struct*/
196 u32 err_count;
197 u32 idx;
198};
199
200struct s2255_fmt; /*forward declaration */
201struct s2255_dev;
202
203/* 2255 video channel */
204struct s2255_vc {
205 struct s2255_dev *dev;
206 struct video_device vdev;
207 struct v4l2_ctrl_handler hdl;
208 struct v4l2_ctrl *jpegqual_ctrl;
209 int resources;
210 struct list_head buf_list;
211 struct s2255_bufferi buffer;
212 struct s2255_mode mode;
213 v4l2_std_id std;
214 /* jpeg compression */
215 unsigned jpegqual;
216 /* capture parameters (for high quality mode full size) */
217 struct v4l2_captureparm cap_parm;
218 int cur_frame;
219 int last_frame;
220 /* allocated image size */
221 unsigned long req_image_size;
222 /* received packet size */
223 unsigned long pkt_size;
224 int bad_payload;
225 unsigned long frame_count;
226 /* if JPEG image */
227 int jpg_size;
228 /* if channel configured to default state */
229 int configured;
230 wait_queue_head_t wait_setmode;
231 int setmode_ready;
232 /* video status items */
233 int vidstatus;
234 wait_queue_head_t wait_vidstatus;
235 int vidstatus_ready;
236 unsigned int width;
237 unsigned int height;
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 */
243 spinlock_t qlock;
244};
245
246
247struct s2255_dev {
248 struct s2255_vc vc[MAX_CHANNELS];
249 struct v4l2_device v4l2_dev;
250 atomic_t num_channels;
251 int frames;
252 struct mutex lock; /* channels[].vdev.lock */
253 struct mutex cmdlock; /* protects cmdbuf */
254 struct usb_device *udev;
255 struct usb_interface *interface;
256 u8 read_endpoint;
257 struct timer_list timer;
258 struct s2255_fw *fw_data;
259 struct s2255_pipeinfo pipe;
260 u32 cc; /* current channel */
261 int frame_ready;
262 int chn_ready;
263 /* dsp firmware version (f2255usb.bin) */
264 int dsp_fw_ver;
265 u16 pid; /* product id */
266#define S2255_CMDBUF_SIZE 512
267 __le32 *cmdbuf;
268};
269
270static inline struct s2255_dev *to_s2255_dev(struct v4l2_device *v4l2_dev)
271{
272 return container_of(v4l2_dev, struct s2255_dev, v4l2_dev);
273}
274
275struct s2255_fmt {
276 u32 fourcc;
277 int depth;
278};
279
280/* buffer for one video frame */
281struct s2255_buffer {
282 /* common v4l buffer stuff -- must be first */
283 struct vb2_v4l2_buffer vb;
284 struct list_head list;
285};
286
287
288/* current cypress EEPROM firmware version */
289#define S2255_CUR_USB_FWVER ((3 << 8) | 12)
290/* current DSP FW version */
291#define S2255_CUR_DSP_FWVER 10104
292/* Need DSP version 5+ for video status feature */
293#define S2255_MIN_DSP_STATUS 5
294#define S2255_MIN_DSP_COLORFILTER 8
295#define S2255_NORMS (V4L2_STD_ALL)
296
297/* private V4L2 controls */
298
299/*
300 * The following chart displays how COLORFILTER should be set
301 * =========================================================
302 * = fourcc = COLORFILTER =
303 * = ===============================
304 * = = 0 = 1 =
305 * =========================================================
306 * = V4L2_PIX_FMT_GREY(Y8) = monochrome from = monochrome=
307 * = = s-video or = composite =
308 * = = B/W camera = input =
309 * =========================================================
310 * = other = color, svideo = color, =
311 * = = = composite =
312 * =========================================================
313 *
314 * Notes:
315 * channels 0-3 on 2255 are composite
316 * channels 0-1 on 2257 are composite, 2-3 are s-video
317 * If COLORFILTER is 0 with a composite color camera connected,
318 * the output will appear monochrome but hatching
319 * will occur.
320 * COLORFILTER is different from "color killer" and "color effects"
321 * for reasons above.
322 */
323#define S2255_V4L2_YC_ON 1
324#define S2255_V4L2_YC_OFF 0
325#define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
326
327/* frame prefix size (sent once every frame) */
328#define PREFIX_SIZE 512
329
330/* Channels on box are in reverse order */
331static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
332
333static int debug;
334
335static int s2255_start_readpipe(struct s2255_dev *dev);
336static void s2255_stop_readpipe(struct s2255_dev *dev);
337static int s2255_start_acquire(struct s2255_vc *vc);
338static int s2255_stop_acquire(struct s2255_vc *vc);
339static void s2255_fillbuff(struct s2255_vc *vc, struct s2255_buffer *buf,
340 int jpgsize);
341static int s2255_set_mode(struct s2255_vc *vc, struct s2255_mode *mode);
342static int s2255_board_shutdown(struct s2255_dev *dev);
343static void s2255_fwload_start(struct s2255_dev *dev);
344static void s2255_destroy(struct s2255_dev *dev);
345static long s2255_vendor_req(struct s2255_dev *dev, unsigned char req,
346 u16 index, u16 value, void *buf,
347 s32 buf_len, int bOut);
348
349/* dev_err macro with driver name */
350#define S2255_DRIVER_NAME "s2255"
351#define s2255_dev_err(dev, fmt, arg...) \
352 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
353
354#define dprintk(dev, level, fmt, arg...) \
355 v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
356
357static struct usb_driver s2255_driver;
358
359/* start video number */
360static int video_nr = -1; /* /dev/videoN, -1 for autodetect */
361
362/* Enable jpeg capture. */
363static int jpeg_enable = 1;
364
365module_param(debug, int, 0644);
366MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
367module_param(video_nr, int, 0644);
368MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
369module_param(jpeg_enable, int, 0644);
370MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
371
372/* USB device table */
373#define USB_SENSORAY_VID 0x1943
374static const struct usb_device_id s2255_table[] = {
375 {USB_DEVICE(USB_SENSORAY_VID, 0x2255)},
376 {USB_DEVICE(USB_SENSORAY_VID, 0x2257)}, /*same family as 2255*/
377 { } /* Terminating entry */
378};
379MODULE_DEVICE_TABLE(usb, s2255_table);
380
381#define BUFFER_TIMEOUT msecs_to_jiffies(400)
382
383/* image formats. */
384/* JPEG formats must be defined last to support jpeg_enable parameter */
385static const struct s2255_fmt formats[] = {
386 {
387 .fourcc = V4L2_PIX_FMT_YUYV,
388 .depth = 16
389
390 }, {
391 .fourcc = V4L2_PIX_FMT_UYVY,
392 .depth = 16
393 }, {
394 .fourcc = V4L2_PIX_FMT_YUV422P,
395 .depth = 16
396
397 }, {
398 .fourcc = V4L2_PIX_FMT_GREY,
399 .depth = 8
400 }, {
401 .fourcc = V4L2_PIX_FMT_JPEG,
402 .depth = 24
403 }, {
404 .fourcc = V4L2_PIX_FMT_MJPEG,
405 .depth = 24
406 }
407};
408
409static int norm_maxw(struct s2255_vc *vc)
410{
411 return (vc->std & V4L2_STD_525_60) ?
412 LINE_SZ_4CIFS_NTSC : LINE_SZ_4CIFS_PAL;
413}
414
415static int norm_maxh(struct s2255_vc *vc)
416{
417 return (vc->std & V4L2_STD_525_60) ?
418 (NUM_LINES_1CIFS_NTSC * 2) : (NUM_LINES_1CIFS_PAL * 2);
419}
420
421static int norm_minw(struct s2255_vc *vc)
422{
423 return (vc->std & V4L2_STD_525_60) ?
424 LINE_SZ_1CIFS_NTSC : LINE_SZ_1CIFS_PAL;
425}
426
427static int norm_minh(struct s2255_vc *vc)
428{
429 return (vc->std & V4L2_STD_525_60) ?
430 (NUM_LINES_1CIFS_NTSC) : (NUM_LINES_1CIFS_PAL);
431}
432
433
434/*
435 * TODO: fixme: move YUV reordering to hardware
436 * converts 2255 planar format to yuyv or uyvy
437 */
438static void planar422p_to_yuv_packed(const unsigned char *in,
439 unsigned char *out,
440 int width, int height,
441 int fmt)
442{
443 unsigned char *pY;
444 unsigned char *pCb;
445 unsigned char *pCr;
446 unsigned long size = height * width;
447 unsigned int i;
448 pY = (unsigned char *)in;
449 pCr = (unsigned char *)in + height * width;
450 pCb = (unsigned char *)in + height * width + (height * width / 2);
451 for (i = 0; i < size * 2; i += 4) {
452 out[i] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCr++;
453 out[i + 1] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCr++ : *pY++;
454 out[i + 2] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCb++;
455 out[i + 3] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCb++ : *pY++;
456 }
457 return;
458}
459
460static void s2255_reset_dsppower(struct s2255_dev *dev)
461{
462 s2255_vendor_req(dev, req: 0x40, index: 0x0000, value: 0x0001, NULL, buf_len: 0, bOut: 1);
463 msleep(msecs: 50);
464 s2255_vendor_req(dev, req: 0x50, index: 0x0000, value: 0x0000, NULL, buf_len: 0, bOut: 1);
465 msleep(msecs: 600);
466 s2255_vendor_req(dev, req: 0x10, index: 0x0000, value: 0x0000, NULL, buf_len: 0, bOut: 1);
467 return;
468}
469
470/* kickstarts the firmware loading. from probe
471 */
472static void s2255_timer(struct timer_list *t)
473{
474 struct s2255_dev *dev = from_timer(dev, t, timer);
475 struct s2255_fw *data = dev->fw_data;
476 if (usb_submit_urb(urb: data->fw_urb, GFP_ATOMIC) < 0) {
477 pr_err("s2255: can't submit urb\n");
478 atomic_set(v: &data->fw_state, S2255_FW_FAILED);
479 /* wake up anything waiting for the firmware */
480 wake_up(&data->wait_fw);
481 return;
482 }
483}
484
485
486/* this loads the firmware asynchronously.
487 Originally this was done synchronously in probe.
488 But it is better to load it asynchronously here than block
489 inside the probe function. Blocking inside probe affects boot time.
490 FW loading is triggered by the timer in the probe function
491*/
492static void s2255_fwchunk_complete(struct urb *urb)
493{
494 struct s2255_fw *data = urb->context;
495 struct usb_device *udev = urb->dev;
496 int len;
497 if (urb->status) {
498 dev_err(&udev->dev, "URB failed with status %d\n", urb->status);
499 atomic_set(v: &data->fw_state, S2255_FW_FAILED);
500 /* wake up anything waiting for the firmware */
501 wake_up(&data->wait_fw);
502 return;
503 }
504 if (data->fw_urb == NULL) {
505 s2255_dev_err(&udev->dev, "disconnected\n");
506 atomic_set(v: &data->fw_state, S2255_FW_FAILED);
507 /* wake up anything waiting for the firmware */
508 wake_up(&data->wait_fw);
509 return;
510 }
511#define CHUNK_SIZE 512
512 /* all USB transfers must be done with continuous kernel memory.
513 can't allocate more than 128k in current linux kernel, so
514 upload the firmware in chunks
515 */
516 if (data->fw_loaded < data->fw_size) {
517 len = (data->fw_loaded + CHUNK_SIZE) > data->fw_size ?
518 data->fw_size % CHUNK_SIZE : CHUNK_SIZE;
519
520 if (len < CHUNK_SIZE)
521 memset(data->pfw_data, 0, CHUNK_SIZE);
522
523 memcpy(data->pfw_data,
524 (char *) data->fw->data + data->fw_loaded, len);
525
526 usb_fill_bulk_urb(urb: data->fw_urb, dev: udev, usb_sndbulkpipe(udev, 2),
527 transfer_buffer: data->pfw_data, CHUNK_SIZE,
528 complete_fn: s2255_fwchunk_complete, context: data);
529 if (usb_submit_urb(urb: data->fw_urb, GFP_ATOMIC) < 0) {
530 dev_err(&udev->dev, "failed submit URB\n");
531 atomic_set(v: &data->fw_state, S2255_FW_FAILED);
532 /* wake up anything waiting for the firmware */
533 wake_up(&data->wait_fw);
534 return;
535 }
536 data->fw_loaded += len;
537 } else
538 atomic_set(v: &data->fw_state, S2255_FW_LOADED_DSPWAIT);
539 return;
540
541}
542
543static void s2255_got_frame(struct s2255_vc *vc, int jpgsize)
544{
545 struct s2255_buffer *buf;
546 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: vc->vdev.v4l2_dev);
547 unsigned long flags = 0;
548
549 spin_lock_irqsave(&vc->qlock, flags);
550 if (list_empty(head: &vc->buf_list)) {
551 dprintk(dev, 1, "No active queue to serve\n");
552 spin_unlock_irqrestore(lock: &vc->qlock, flags);
553 return;
554 }
555 buf = list_entry(vc->buf_list.next,
556 struct s2255_buffer, list);
557 list_del(entry: &buf->list);
558 buf->vb.vb2_buf.timestamp = ktime_get_ns();
559 buf->vb.field = vc->field;
560 buf->vb.sequence = vc->frame_count;
561 spin_unlock_irqrestore(lock: &vc->qlock, flags);
562
563 s2255_fillbuff(vc, buf, jpgsize);
564 /* tell v4l buffer was filled */
565 vb2_buffer_done(vb: &buf->vb.vb2_buf, state: VB2_BUF_STATE_DONE);
566 dprintk(dev, 2, "%s: [buf] [%p]\n", __func__, buf);
567}
568
569static const struct s2255_fmt *format_by_fourcc(int fourcc)
570{
571 unsigned int i;
572 for (i = 0; i < ARRAY_SIZE(formats); i++) {
573 if (-1 == formats[i].fourcc)
574 continue;
575 if (!jpeg_enable && ((formats[i].fourcc == V4L2_PIX_FMT_JPEG) ||
576 (formats[i].fourcc == V4L2_PIX_FMT_MJPEG)))
577 continue;
578 if (formats[i].fourcc == fourcc)
579 return formats + i;
580 }
581 return NULL;
582}
583
584/* video buffer vmalloc implementation based partly on VIVI driver which is
585 * Copyright (c) 2006 by
586 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
587 * Ted Walther <ted--a.t--enumera.com>
588 * John Sokol <sokol--a.t--videotechnology.com>
589 * http://v4l.videotechnology.com/
590 *
591 */
592static void s2255_fillbuff(struct s2255_vc *vc,
593 struct s2255_buffer *buf, int jpgsize)
594{
595 int pos = 0;
596 const char *tmpbuf;
597 char *vbuf = vb2_plane_vaddr(vb: &buf->vb.vb2_buf, plane_no: 0);
598 unsigned long last_frame;
599 struct s2255_dev *dev = vc->dev;
600
601 if (!vbuf)
602 return;
603 last_frame = vc->last_frame;
604 if (last_frame != -1) {
605 tmpbuf =
606 (const char *)vc->buffer.frame[last_frame].lpvbits;
607 switch (vc->fmt->fourcc) {
608 case V4L2_PIX_FMT_YUYV:
609 case V4L2_PIX_FMT_UYVY:
610 planar422p_to_yuv_packed(in: (const unsigned char *)tmpbuf,
611 out: vbuf, width: vc->width,
612 height: vc->height,
613 fmt: vc->fmt->fourcc);
614 break;
615 case V4L2_PIX_FMT_GREY:
616 memcpy(vbuf, tmpbuf, vc->width * vc->height);
617 break;
618 case V4L2_PIX_FMT_JPEG:
619 case V4L2_PIX_FMT_MJPEG:
620 vb2_set_plane_payload(vb: &buf->vb.vb2_buf, plane_no: 0, size: jpgsize);
621 memcpy(vbuf, tmpbuf, jpgsize);
622 break;
623 case V4L2_PIX_FMT_YUV422P:
624 memcpy(vbuf, tmpbuf,
625 vc->width * vc->height * 2);
626 break;
627 default:
628 pr_info("s2255: unknown format?\n");
629 }
630 vc->last_frame = -1;
631 } else {
632 pr_err("s2255: =======no frame\n");
633 return;
634 }
635 dprintk(dev, 2, "s2255fill at : Buffer %p size= %d\n",
636 vbuf, pos);
637}
638
639
640/* ------------------------------------------------------------------
641 Videobuf operations
642 ------------------------------------------------------------------*/
643
644static int queue_setup(struct vb2_queue *vq,
645 unsigned int *nbuffers, unsigned int *nplanes,
646 unsigned int sizes[], struct device *alloc_devs[])
647{
648 struct s2255_vc *vc = vb2_get_drv_priv(q: vq);
649 if (*nbuffers < S2255_MIN_BUFS)
650 *nbuffers = S2255_MIN_BUFS;
651 *nplanes = 1;
652 sizes[0] = vc->width * vc->height * (vc->fmt->depth >> 3);
653 return 0;
654}
655
656static int buffer_prepare(struct vb2_buffer *vb)
657{
658 struct s2255_vc *vc = vb2_get_drv_priv(q: vb->vb2_queue);
659 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
660 struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
661 int w = vc->width;
662 int h = vc->height;
663 unsigned long size;
664
665 dprintk(vc->dev, 4, "%s\n", __func__);
666 if (vc->fmt == NULL)
667 return -EINVAL;
668
669 if ((w < norm_minw(vc)) ||
670 (w > norm_maxw(vc)) ||
671 (h < norm_minh(vc)) ||
672 (h > norm_maxh(vc))) {
673 dprintk(vc->dev, 4, "invalid buffer prepare\n");
674 return -EINVAL;
675 }
676 size = w * h * (vc->fmt->depth >> 3);
677 if (vb2_plane_size(vb, plane_no: 0) < size) {
678 dprintk(vc->dev, 4, "invalid buffer prepare\n");
679 return -EINVAL;
680 }
681
682 vb2_set_plane_payload(vb: &buf->vb.vb2_buf, plane_no: 0, size);
683 return 0;
684}
685
686static void buffer_queue(struct vb2_buffer *vb)
687{
688 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
689 struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
690 struct s2255_vc *vc = vb2_get_drv_priv(q: vb->vb2_queue);
691 unsigned long flags = 0;
692 dprintk(vc->dev, 1, "%s\n", __func__);
693 spin_lock_irqsave(&vc->qlock, flags);
694 list_add_tail(new: &buf->list, head: &vc->buf_list);
695 spin_unlock_irqrestore(lock: &vc->qlock, flags);
696}
697
698static int start_streaming(struct vb2_queue *vq, unsigned int count);
699static void stop_streaming(struct vb2_queue *vq);
700
701static const struct vb2_ops s2255_video_qops = {
702 .queue_setup = queue_setup,
703 .buf_prepare = buffer_prepare,
704 .buf_queue = buffer_queue,
705 .start_streaming = start_streaming,
706 .stop_streaming = stop_streaming,
707 .wait_prepare = vb2_ops_wait_prepare,
708 .wait_finish = vb2_ops_wait_finish,
709};
710
711static int vidioc_querycap(struct file *file, void *priv,
712 struct v4l2_capability *cap)
713{
714 struct s2255_vc *vc = video_drvdata(file);
715 struct s2255_dev *dev = vc->dev;
716
717 strscpy(cap->driver, "s2255", sizeof(cap->driver));
718 strscpy(cap->card, "s2255", sizeof(cap->card));
719 usb_make_path(dev: dev->udev, buf: cap->bus_info, size: sizeof(cap->bus_info));
720 return 0;
721}
722
723static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
724 struct v4l2_fmtdesc *f)
725{
726 int index = f->index;
727
728 if (index >= ARRAY_SIZE(formats))
729 return -EINVAL;
730 if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
731 (formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
732 return -EINVAL;
733 f->pixelformat = formats[index].fourcc;
734 return 0;
735}
736
737static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
738 struct v4l2_format *f)
739{
740 struct s2255_vc *vc = video_drvdata(file);
741 int is_ntsc = vc->std & V4L2_STD_525_60;
742
743 f->fmt.pix.width = vc->width;
744 f->fmt.pix.height = vc->height;
745 if (f->fmt.pix.height >=
746 (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2)
747 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
748 else
749 f->fmt.pix.field = V4L2_FIELD_TOP;
750 f->fmt.pix.pixelformat = vc->fmt->fourcc;
751 f->fmt.pix.bytesperline = f->fmt.pix.width * (vc->fmt->depth >> 3);
752 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
753 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
754 return 0;
755}
756
757static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
758 struct v4l2_format *f)
759{
760 const struct s2255_fmt *fmt;
761 enum v4l2_field field;
762 struct s2255_vc *vc = video_drvdata(file);
763 int is_ntsc = vc->std & V4L2_STD_525_60;
764
765 fmt = format_by_fourcc(fourcc: f->fmt.pix.pixelformat);
766
767 if (fmt == NULL)
768 return -EINVAL;
769
770 dprintk(vc->dev, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
771 __func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
772 if (is_ntsc) {
773 /* NTSC */
774 if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
775 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
776 field = V4L2_FIELD_INTERLACED;
777 } else {
778 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
779 field = V4L2_FIELD_TOP;
780 }
781 if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
782 f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
783 else
784 f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
785 } else {
786 /* PAL */
787 if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
788 f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
789 field = V4L2_FIELD_INTERLACED;
790 } else {
791 f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
792 field = V4L2_FIELD_TOP;
793 }
794 if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
795 f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
796 else
797 f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
798 }
799 f->fmt.pix.field = field;
800 f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
801 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
802 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
803 dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
804 f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
805 return 0;
806}
807
808static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
809 struct v4l2_format *f)
810{
811 struct s2255_vc *vc = video_drvdata(file);
812 const struct s2255_fmt *fmt;
813 struct vb2_queue *q = &vc->vb_vidq;
814 struct s2255_mode mode;
815 int ret;
816
817 ret = vidioc_try_fmt_vid_cap(file, priv: vc, f);
818
819 if (ret < 0)
820 return ret;
821
822 fmt = format_by_fourcc(fourcc: f->fmt.pix.pixelformat);
823
824 if (fmt == NULL)
825 return -EINVAL;
826
827 if (vb2_is_busy(q)) {
828 dprintk(vc->dev, 1, "queue busy\n");
829 return -EBUSY;
830 }
831
832 mode = vc->mode;
833 vc->fmt = fmt;
834 vc->width = f->fmt.pix.width;
835 vc->height = f->fmt.pix.height;
836 vc->field = f->fmt.pix.field;
837 if (vc->width > norm_minw(vc)) {
838 if (vc->height > norm_minh(vc)) {
839 if (vc->cap_parm.capturemode &
840 V4L2_MODE_HIGHQUALITY)
841 mode.scale = SCALE_4CIFSI;
842 else
843 mode.scale = SCALE_4CIFS;
844 } else
845 mode.scale = SCALE_2CIFS;
846
847 } else {
848 mode.scale = SCALE_1CIFS;
849 }
850 /* color mode */
851 switch (vc->fmt->fourcc) {
852 case V4L2_PIX_FMT_GREY:
853 mode.color &= ~MASK_COLOR;
854 mode.color |= COLOR_Y8;
855 break;
856 case V4L2_PIX_FMT_JPEG:
857 case V4L2_PIX_FMT_MJPEG:
858 mode.color &= ~MASK_COLOR;
859 mode.color |= COLOR_JPG;
860 mode.color |= (vc->jpegqual << 8);
861 break;
862 case V4L2_PIX_FMT_YUV422P:
863 mode.color &= ~MASK_COLOR;
864 mode.color |= COLOR_YUVPL;
865 break;
866 case V4L2_PIX_FMT_YUYV:
867 case V4L2_PIX_FMT_UYVY:
868 default:
869 mode.color &= ~MASK_COLOR;
870 mode.color |= COLOR_YUVPK;
871 break;
872 }
873 if ((mode.color & MASK_COLOR) != (vc->mode.color & MASK_COLOR))
874 mode.restart = 1;
875 else if (mode.scale != vc->mode.scale)
876 mode.restart = 1;
877 else if (mode.format != vc->mode.format)
878 mode.restart = 1;
879 vc->mode = mode;
880 (void) s2255_set_mode(vc, mode: &mode);
881 return 0;
882}
883
884
885/* write to the configuration pipe, synchronously */
886static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
887 int size)
888{
889 int pipe;
890 int done;
891 long retval = -1;
892 if (udev) {
893 pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
894 retval = usb_bulk_msg(usb_dev: udev, pipe, data: pbuf, len: size, actual_length: &done, timeout: 500);
895 }
896 return retval;
897}
898
899static u32 get_transfer_size(struct s2255_mode *mode)
900{
901 int linesPerFrame = LINE_SZ_DEF;
902 int pixelsPerLine = NUM_LINES_DEF;
903 u32 outImageSize;
904 u32 usbInSize;
905 unsigned int mask_mult;
906
907 if (mode == NULL)
908 return 0;
909
910 if (mode->format == FORMAT_NTSC) {
911 switch (mode->scale) {
912 case SCALE_4CIFS:
913 case SCALE_4CIFSI:
914 linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
915 pixelsPerLine = LINE_SZ_4CIFS_NTSC;
916 break;
917 case SCALE_2CIFS:
918 linesPerFrame = NUM_LINES_2CIFS_NTSC;
919 pixelsPerLine = LINE_SZ_2CIFS_NTSC;
920 break;
921 case SCALE_1CIFS:
922 linesPerFrame = NUM_LINES_1CIFS_NTSC;
923 pixelsPerLine = LINE_SZ_1CIFS_NTSC;
924 break;
925 default:
926 break;
927 }
928 } else if (mode->format == FORMAT_PAL) {
929 switch (mode->scale) {
930 case SCALE_4CIFS:
931 case SCALE_4CIFSI:
932 linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
933 pixelsPerLine = LINE_SZ_4CIFS_PAL;
934 break;
935 case SCALE_2CIFS:
936 linesPerFrame = NUM_LINES_2CIFS_PAL;
937 pixelsPerLine = LINE_SZ_2CIFS_PAL;
938 break;
939 case SCALE_1CIFS:
940 linesPerFrame = NUM_LINES_1CIFS_PAL;
941 pixelsPerLine = LINE_SZ_1CIFS_PAL;
942 break;
943 default:
944 break;
945 }
946 }
947 outImageSize = linesPerFrame * pixelsPerLine;
948 if ((mode->color & MASK_COLOR) != COLOR_Y8) {
949 /* 2 bytes/pixel if not monochrome */
950 outImageSize *= 2;
951 }
952
953 /* total bytes to send including prefix and 4K padding;
954 must be a multiple of USB_READ_SIZE */
955 usbInSize = outImageSize + PREFIX_SIZE; /* always send prefix */
956 mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
957 /* if size not a multiple of USB_READ_SIZE */
958 if (usbInSize & ~mask_mult)
959 usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
960 return usbInSize;
961}
962
963static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
964{
965 struct device *dev = &sdev->udev->dev;
966 dev_info(dev, "------------------------------------------------\n");
967 dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
968 dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
969 dev_info(dev, "bright: 0x%x\n", mode->bright);
970 dev_info(dev, "------------------------------------------------\n");
971}
972
973/*
974 * set mode is the function which controls the DSP.
975 * the restart parameter in struct s2255_mode should be set whenever
976 * the image size could change via color format, video system or image
977 * size.
978 * When the restart parameter is set, we sleep for ONE frame to allow the
979 * DSP time to get the new frame
980 */
981static int s2255_set_mode(struct s2255_vc *vc,
982 struct s2255_mode *mode)
983{
984 int res;
985 unsigned long chn_rev;
986 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: vc->vdev.v4l2_dev);
987 int i;
988 __le32 *buffer = dev->cmdbuf;
989
990 mutex_lock(&dev->cmdlock);
991 chn_rev = G_chnmap[vc->idx];
992 dprintk(dev, 3, "%s channel: %d\n", __func__, vc->idx);
993 /* if JPEG, set the quality */
994 if ((mode->color & MASK_COLOR) == COLOR_JPG) {
995 mode->color &= ~MASK_COLOR;
996 mode->color |= COLOR_JPG;
997 mode->color &= ~MASK_JPG_QUALITY;
998 mode->color |= (vc->jpegqual << 8);
999 }
1000 /* save the mode */
1001 vc->mode = *mode;
1002 vc->req_image_size = get_transfer_size(mode);
1003 dprintk(dev, 1, "%s: reqsize %ld\n", __func__, vc->req_image_size);
1004 /* set the mode */
1005 buffer[0] = IN_DATA_TOKEN;
1006 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1007 buffer[2] = CMD_SET_MODE;
1008 for (i = 0; i < sizeof(struct s2255_mode) / sizeof(u32); i++)
1009 buffer[3 + i] = cpu_to_le32(((u32 *)&vc->mode)[i]);
1010 vc->setmode_ready = 0;
1011 res = s2255_write_config(udev: dev->udev, pbuf: (unsigned char *)buffer, size: 512);
1012 if (debug)
1013 s2255_print_cfg(sdev: dev, mode);
1014 /* wait at least 3 frames before continuing */
1015 if (mode->restart) {
1016 wait_event_timeout(vc->wait_setmode,
1017 (vc->setmode_ready != 0),
1018 msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
1019 if (vc->setmode_ready != 1) {
1020 dprintk(dev, 0, "s2255: no set mode response\n");
1021 res = -EFAULT;
1022 }
1023 }
1024 /* clear the restart flag */
1025 vc->mode.restart = 0;
1026 dprintk(dev, 1, "%s chn %d, result: %d\n", __func__, vc->idx, res);
1027 mutex_unlock(lock: &dev->cmdlock);
1028 return res;
1029}
1030
1031static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
1032{
1033 int res;
1034 u32 chn_rev;
1035 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: vc->vdev.v4l2_dev);
1036 __le32 *buffer = dev->cmdbuf;
1037
1038 mutex_lock(&dev->cmdlock);
1039 chn_rev = G_chnmap[vc->idx];
1040 dprintk(dev, 4, "%s chan %d\n", __func__, vc->idx);
1041 /* form the get vid status command */
1042 buffer[0] = IN_DATA_TOKEN;
1043 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1044 buffer[2] = CMD_STATUS;
1045 *pstatus = 0;
1046 vc->vidstatus_ready = 0;
1047 res = s2255_write_config(udev: dev->udev, pbuf: (unsigned char *)buffer, size: 512);
1048 wait_event_timeout(vc->wait_vidstatus,
1049 (vc->vidstatus_ready != 0),
1050 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
1051 if (vc->vidstatus_ready != 1) {
1052 dprintk(dev, 0, "s2255: no vidstatus response\n");
1053 res = -EFAULT;
1054 }
1055 *pstatus = vc->vidstatus;
1056 dprintk(dev, 4, "%s, vid status %d\n", __func__, *pstatus);
1057 mutex_unlock(lock: &dev->cmdlock);
1058 return res;
1059}
1060
1061static int start_streaming(struct vb2_queue *vq, unsigned int count)
1062{
1063 struct s2255_vc *vc = vb2_get_drv_priv(q: vq);
1064 int j;
1065
1066 vc->last_frame = -1;
1067 vc->bad_payload = 0;
1068 vc->cur_frame = 0;
1069 vc->frame_count = 0;
1070 for (j = 0; j < SYS_FRAMES; j++) {
1071 vc->buffer.frame[j].ulState = S2255_READ_IDLE;
1072 vc->buffer.frame[j].cur_size = 0;
1073 }
1074 return s2255_start_acquire(vc);
1075}
1076
1077/* abort streaming and wait for last buffer */
1078static void stop_streaming(struct vb2_queue *vq)
1079{
1080 struct s2255_vc *vc = vb2_get_drv_priv(q: vq);
1081 struct s2255_buffer *buf, *node;
1082 unsigned long flags;
1083 (void) s2255_stop_acquire(vc);
1084 spin_lock_irqsave(&vc->qlock, flags);
1085 list_for_each_entry_safe(buf, node, &vc->buf_list, list) {
1086 list_del(entry: &buf->list);
1087 vb2_buffer_done(vb: &buf->vb.vb2_buf, state: VB2_BUF_STATE_ERROR);
1088 dprintk(vc->dev, 2, "[%p/%d] done\n",
1089 buf, buf->vb.vb2_buf.index);
1090 }
1091 spin_unlock_irqrestore(lock: &vc->qlock, flags);
1092}
1093
1094static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
1095{
1096 struct s2255_vc *vc = video_drvdata(file);
1097 struct s2255_mode mode;
1098 struct vb2_queue *q = &vc->vb_vidq;
1099
1100 /*
1101 * Changing the standard implies a format change, which is not allowed
1102 * while buffers for use with streaming have already been allocated.
1103 */
1104 if (vb2_is_busy(q))
1105 return -EBUSY;
1106
1107 mode = vc->mode;
1108 if (i & V4L2_STD_525_60) {
1109 dprintk(vc->dev, 4, "%s 60 Hz\n", __func__);
1110 /* if changing format, reset frame decimation/intervals */
1111 if (mode.format != FORMAT_NTSC) {
1112 mode.restart = 1;
1113 mode.format = FORMAT_NTSC;
1114 mode.fdec = FDEC_1;
1115 vc->width = LINE_SZ_4CIFS_NTSC;
1116 vc->height = NUM_LINES_4CIFS_NTSC * 2;
1117 }
1118 } else if (i & V4L2_STD_625_50) {
1119 dprintk(vc->dev, 4, "%s 50 Hz\n", __func__);
1120 if (mode.format != FORMAT_PAL) {
1121 mode.restart = 1;
1122 mode.format = FORMAT_PAL;
1123 mode.fdec = FDEC_1;
1124 vc->width = LINE_SZ_4CIFS_PAL;
1125 vc->height = NUM_LINES_4CIFS_PAL * 2;
1126 }
1127 } else
1128 return -EINVAL;
1129 vc->std = i;
1130 if (mode.restart)
1131 s2255_set_mode(vc, mode: &mode);
1132 return 0;
1133}
1134
1135static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
1136{
1137 struct s2255_vc *vc = video_drvdata(file);
1138
1139 *i = vc->std;
1140 return 0;
1141}
1142
1143/* Sensoray 2255 is a multiple channel capture device.
1144 It does not have a "crossbar" of inputs.
1145 We use one V4L device per channel. The user must
1146 be aware that certain combinations are not allowed.
1147 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1148 at once in color(you can do full fps on 4 channels with greyscale.
1149*/
1150static int vidioc_enum_input(struct file *file, void *priv,
1151 struct v4l2_input *inp)
1152{
1153 struct s2255_vc *vc = video_drvdata(file);
1154 struct s2255_dev *dev = vc->dev;
1155 u32 status = 0;
1156
1157 if (inp->index != 0)
1158 return -EINVAL;
1159 inp->type = V4L2_INPUT_TYPE_CAMERA;
1160 inp->std = S2255_NORMS;
1161 inp->status = 0;
1162 if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1163 int rc;
1164 rc = s2255_cmd_status(vc, pstatus: &status);
1165 dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
1166 rc, status);
1167 if (rc == 0)
1168 inp->status = (status & 0x01) ? 0
1169 : V4L2_IN_ST_NO_SIGNAL;
1170 }
1171 switch (dev->pid) {
1172 case 0x2255:
1173 default:
1174 strscpy(inp->name, "Composite", sizeof(inp->name));
1175 break;
1176 case 0x2257:
1177 strscpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
1178 sizeof(inp->name));
1179 break;
1180 }
1181 return 0;
1182}
1183
1184static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1185{
1186 *i = 0;
1187 return 0;
1188}
1189static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1190{
1191 if (i > 0)
1192 return -EINVAL;
1193 return 0;
1194}
1195
1196static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
1197{
1198 struct s2255_vc *vc =
1199 container_of(ctrl->handler, struct s2255_vc, hdl);
1200 struct s2255_mode mode;
1201 mode = vc->mode;
1202 /* update the mode to the corresponding value */
1203 switch (ctrl->id) {
1204 case V4L2_CID_BRIGHTNESS:
1205 mode.bright = ctrl->val;
1206 break;
1207 case V4L2_CID_CONTRAST:
1208 mode.contrast = ctrl->val;
1209 break;
1210 case V4L2_CID_HUE:
1211 mode.hue = ctrl->val;
1212 break;
1213 case V4L2_CID_SATURATION:
1214 mode.saturation = ctrl->val;
1215 break;
1216 case V4L2_CID_S2255_COLORFILTER:
1217 mode.color &= ~MASK_INPUT_TYPE;
1218 mode.color |= !ctrl->val << 16;
1219 break;
1220 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1221 vc->jpegqual = ctrl->val;
1222 return 0;
1223 default:
1224 return -EINVAL;
1225 }
1226 mode.restart = 0;
1227 /* set mode here. Note: stream does not need restarted.
1228 some V4L programs restart stream unnecessarily
1229 after a s_crtl.
1230 */
1231 s2255_set_mode(vc, mode: &mode);
1232 return 0;
1233}
1234
1235static int vidioc_g_jpegcomp(struct file *file, void *priv,
1236 struct v4l2_jpegcompression *jc)
1237{
1238 struct s2255_vc *vc = video_drvdata(file);
1239
1240 memset(jc, 0, sizeof(*jc));
1241 jc->quality = vc->jpegqual;
1242 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1243 return 0;
1244}
1245
1246static int vidioc_s_jpegcomp(struct file *file, void *priv,
1247 const struct v4l2_jpegcompression *jc)
1248{
1249 struct s2255_vc *vc = video_drvdata(file);
1250
1251 if (jc->quality < 0 || jc->quality > 100)
1252 return -EINVAL;
1253 v4l2_ctrl_s_ctrl(ctrl: vc->jpegqual_ctrl, val: jc->quality);
1254 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1255 return 0;
1256}
1257
1258static int vidioc_g_parm(struct file *file, void *priv,
1259 struct v4l2_streamparm *sp)
1260{
1261 __u32 def_num, def_dem;
1262 struct s2255_vc *vc = video_drvdata(file);
1263
1264 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1265 return -EINVAL;
1266 sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1267 sp->parm.capture.capturemode = vc->cap_parm.capturemode;
1268 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1269 def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1270 def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1271 sp->parm.capture.timeperframe.denominator = def_dem;
1272 switch (vc->mode.fdec) {
1273 default:
1274 case FDEC_1:
1275 sp->parm.capture.timeperframe.numerator = def_num;
1276 break;
1277 case FDEC_2:
1278 sp->parm.capture.timeperframe.numerator = def_num * 2;
1279 break;
1280 case FDEC_3:
1281 sp->parm.capture.timeperframe.numerator = def_num * 3;
1282 break;
1283 case FDEC_5:
1284 sp->parm.capture.timeperframe.numerator = def_num * 5;
1285 break;
1286 }
1287 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
1288 __func__,
1289 sp->parm.capture.capturemode,
1290 sp->parm.capture.timeperframe.numerator,
1291 sp->parm.capture.timeperframe.denominator);
1292 return 0;
1293}
1294
1295static int vidioc_s_parm(struct file *file, void *priv,
1296 struct v4l2_streamparm *sp)
1297{
1298 struct s2255_vc *vc = video_drvdata(file);
1299 struct s2255_mode mode;
1300 int fdec = FDEC_1;
1301 __u32 def_num, def_dem;
1302 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1303 return -EINVAL;
1304 mode = vc->mode;
1305 /* high quality capture mode requires a stream restart */
1306 if ((vc->cap_parm.capturemode != sp->parm.capture.capturemode)
1307 && vb2_is_streaming(q: &vc->vb_vidq))
1308 return -EBUSY;
1309 def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
1310 def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
1311 if (def_dem != sp->parm.capture.timeperframe.denominator)
1312 sp->parm.capture.timeperframe.numerator = def_num;
1313 else if (sp->parm.capture.timeperframe.numerator <= def_num)
1314 sp->parm.capture.timeperframe.numerator = def_num;
1315 else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
1316 sp->parm.capture.timeperframe.numerator = def_num * 2;
1317 fdec = FDEC_2;
1318 } else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
1319 sp->parm.capture.timeperframe.numerator = def_num * 3;
1320 fdec = FDEC_3;
1321 } else {
1322 sp->parm.capture.timeperframe.numerator = def_num * 5;
1323 fdec = FDEC_5;
1324 }
1325 mode.fdec = fdec;
1326 sp->parm.capture.timeperframe.denominator = def_dem;
1327 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1328 s2255_set_mode(vc, mode: &mode);
1329 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1330 __func__,
1331 sp->parm.capture.capturemode,
1332 sp->parm.capture.timeperframe.numerator,
1333 sp->parm.capture.timeperframe.denominator, fdec);
1334 return 0;
1335}
1336
1337#define NUM_SIZE_ENUMS 3
1338static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1339 { 640, 480 },
1340 { 640, 240 },
1341 { 320, 240 },
1342};
1343static const struct v4l2_frmsize_discrete pal_sizes[] = {
1344 { 704, 576 },
1345 { 704, 288 },
1346 { 352, 288 },
1347};
1348
1349static int vidioc_enum_framesizes(struct file *file, void *priv,
1350 struct v4l2_frmsizeenum *fe)
1351{
1352 struct s2255_vc *vc = video_drvdata(file);
1353 int is_ntsc = vc->std & V4L2_STD_525_60;
1354 const struct s2255_fmt *fmt;
1355
1356 if (fe->index >= NUM_SIZE_ENUMS)
1357 return -EINVAL;
1358
1359 fmt = format_by_fourcc(fourcc: fe->pixel_format);
1360 if (fmt == NULL)
1361 return -EINVAL;
1362 fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1363 fe->discrete = is_ntsc ? ntsc_sizes[fe->index] : pal_sizes[fe->index];
1364 return 0;
1365}
1366
1367static int vidioc_enum_frameintervals(struct file *file, void *priv,
1368 struct v4l2_frmivalenum *fe)
1369{
1370 struct s2255_vc *vc = video_drvdata(file);
1371 const struct s2255_fmt *fmt;
1372 const struct v4l2_frmsize_discrete *sizes;
1373 int is_ntsc = vc->std & V4L2_STD_525_60;
1374#define NUM_FRAME_ENUMS 4
1375 int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1376 int i;
1377
1378 if (fe->index >= NUM_FRAME_ENUMS)
1379 return -EINVAL;
1380
1381 fmt = format_by_fourcc(fourcc: fe->pixel_format);
1382 if (fmt == NULL)
1383 return -EINVAL;
1384
1385 sizes = is_ntsc ? ntsc_sizes : pal_sizes;
1386 for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
1387 if (fe->width == sizes->width &&
1388 fe->height == sizes->height)
1389 break;
1390 if (i == NUM_SIZE_ENUMS)
1391 return -EINVAL;
1392
1393 fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1394 fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1395 fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1396 dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
1397 fe->discrete.numerator,
1398 fe->discrete.denominator);
1399 return 0;
1400}
1401
1402static int s2255_open(struct file *file)
1403{
1404 struct s2255_vc *vc = video_drvdata(file);
1405 struct s2255_dev *dev = vc->dev;
1406 int state;
1407 int rc = 0;
1408
1409 rc = v4l2_fh_open(filp: file);
1410 if (rc != 0)
1411 return rc;
1412
1413 dprintk(dev, 1, "s2255: %s\n", __func__);
1414 state = atomic_read(v: &dev->fw_data->fw_state);
1415 switch (state) {
1416 case S2255_FW_DISCONNECTING:
1417 return -ENODEV;
1418 case S2255_FW_FAILED:
1419 s2255_dev_err(&dev->udev->dev,
1420 "firmware load failed. retrying.\n");
1421 s2255_fwload_start(dev);
1422 wait_event_timeout(dev->fw_data->wait_fw,
1423 ((atomic_read(&dev->fw_data->fw_state)
1424 == S2255_FW_SUCCESS) ||
1425 (atomic_read(&dev->fw_data->fw_state)
1426 == S2255_FW_DISCONNECTING)),
1427 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1428 /* state may have changed, re-read */
1429 state = atomic_read(v: &dev->fw_data->fw_state);
1430 break;
1431 case S2255_FW_NOTLOADED:
1432 case S2255_FW_LOADED_DSPWAIT:
1433 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1434 driver loaded and then device immediately opened */
1435 pr_info("%s waiting for firmware load\n", __func__);
1436 wait_event_timeout(dev->fw_data->wait_fw,
1437 ((atomic_read(&dev->fw_data->fw_state)
1438 == S2255_FW_SUCCESS) ||
1439 (atomic_read(&dev->fw_data->fw_state)
1440 == S2255_FW_DISCONNECTING)),
1441 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1442 /* state may have changed, re-read */
1443 state = atomic_read(v: &dev->fw_data->fw_state);
1444 break;
1445 case S2255_FW_SUCCESS:
1446 default:
1447 break;
1448 }
1449 /* state may have changed in above switch statement */
1450 switch (state) {
1451 case S2255_FW_SUCCESS:
1452 break;
1453 case S2255_FW_FAILED:
1454 pr_info("2255 firmware load failed.\n");
1455 return -ENODEV;
1456 case S2255_FW_DISCONNECTING:
1457 pr_info("%s: disconnecting\n", __func__);
1458 return -ENODEV;
1459 case S2255_FW_LOADED_DSPWAIT:
1460 case S2255_FW_NOTLOADED:
1461 pr_info("%s: firmware not loaded, please retry\n",
1462 __func__);
1463 /*
1464 * Timeout on firmware load means device unusable.
1465 * Set firmware failure state.
1466 * On next s2255_open the firmware will be reloaded.
1467 */
1468 atomic_set(v: &dev->fw_data->fw_state,
1469 S2255_FW_FAILED);
1470 return -EAGAIN;
1471 default:
1472 pr_info("%s: unknown state\n", __func__);
1473 return -EFAULT;
1474 }
1475 if (!vc->configured) {
1476 /* configure channel to default state */
1477 vc->fmt = &formats[0];
1478 s2255_set_mode(vc, mode: &vc->mode);
1479 vc->configured = 1;
1480 }
1481 return 0;
1482}
1483
1484static void s2255_destroy(struct s2255_dev *dev)
1485{
1486 dprintk(dev, 1, "%s", __func__);
1487 /* board shutdown stops the read pipe if it is running */
1488 s2255_board_shutdown(dev);
1489 /* make sure firmware still not trying to load */
1490 timer_shutdown_sync(timer: &dev->timer); /* only started in .probe and .open */
1491 if (dev->fw_data->fw_urb) {
1492 usb_kill_urb(urb: dev->fw_data->fw_urb);
1493 usb_free_urb(urb: dev->fw_data->fw_urb);
1494 dev->fw_data->fw_urb = NULL;
1495 }
1496 release_firmware(fw: dev->fw_data->fw);
1497 kfree(objp: dev->fw_data->pfw_data);
1498 kfree(objp: dev->fw_data);
1499 /* reset the DSP so firmware can be reloaded next time */
1500 s2255_reset_dsppower(dev);
1501 mutex_destroy(lock: &dev->lock);
1502 usb_put_dev(dev: dev->udev);
1503 v4l2_device_unregister(v4l2_dev: &dev->v4l2_dev);
1504 kfree(objp: dev->cmdbuf);
1505 kfree(objp: dev);
1506}
1507
1508static const struct v4l2_file_operations s2255_fops_v4l = {
1509 .owner = THIS_MODULE,
1510 .open = s2255_open,
1511 .release = vb2_fop_release,
1512 .poll = vb2_fop_poll,
1513 .unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
1514 .mmap = vb2_fop_mmap,
1515 .read = vb2_fop_read,
1516};
1517
1518static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1519 .vidioc_querycap = vidioc_querycap,
1520 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1521 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1522 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1523 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1524 .vidioc_reqbufs = vb2_ioctl_reqbufs,
1525 .vidioc_querybuf = vb2_ioctl_querybuf,
1526 .vidioc_qbuf = vb2_ioctl_qbuf,
1527 .vidioc_dqbuf = vb2_ioctl_dqbuf,
1528 .vidioc_s_std = vidioc_s_std,
1529 .vidioc_g_std = vidioc_g_std,
1530 .vidioc_enum_input = vidioc_enum_input,
1531 .vidioc_g_input = vidioc_g_input,
1532 .vidioc_s_input = vidioc_s_input,
1533 .vidioc_streamon = vb2_ioctl_streamon,
1534 .vidioc_streamoff = vb2_ioctl_streamoff,
1535 .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1536 .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1537 .vidioc_s_parm = vidioc_s_parm,
1538 .vidioc_g_parm = vidioc_g_parm,
1539 .vidioc_enum_framesizes = vidioc_enum_framesizes,
1540 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1541 .vidioc_log_status = v4l2_ctrl_log_status,
1542 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1543 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1544};
1545
1546static void s2255_video_device_release(struct video_device *vdev)
1547{
1548 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: vdev->v4l2_dev);
1549 struct s2255_vc *vc =
1550 container_of(vdev, struct s2255_vc, vdev);
1551
1552 dprintk(dev, 4, "%s, chnls: %d\n", __func__,
1553 atomic_read(&dev->num_channels));
1554
1555 v4l2_ctrl_handler_free(hdl: &vc->hdl);
1556
1557 if (atomic_dec_and_test(v: &dev->num_channels))
1558 s2255_destroy(dev);
1559 return;
1560}
1561
1562static const struct video_device template = {
1563 .name = "s2255v",
1564 .fops = &s2255_fops_v4l,
1565 .ioctl_ops = &s2255_ioctl_ops,
1566 .release = s2255_video_device_release,
1567 .tvnorms = S2255_NORMS,
1568};
1569
1570static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1571 .s_ctrl = s2255_s_ctrl,
1572};
1573
1574static const struct v4l2_ctrl_config color_filter_ctrl = {
1575 .ops = &s2255_ctrl_ops,
1576 .name = "Color Filter",
1577 .id = V4L2_CID_S2255_COLORFILTER,
1578 .type = V4L2_CTRL_TYPE_BOOLEAN,
1579 .max = 1,
1580 .step = 1,
1581 .def = 1,
1582};
1583
1584static int s2255_probe_v4l(struct s2255_dev *dev)
1585{
1586 int ret;
1587 int i;
1588 int cur_nr = video_nr;
1589 struct s2255_vc *vc;
1590 struct vb2_queue *q;
1591
1592 ret = v4l2_device_register(dev: &dev->interface->dev, v4l2_dev: &dev->v4l2_dev);
1593 if (ret)
1594 return ret;
1595 /* initialize all video 4 linux */
1596 /* register 4 video devices */
1597 for (i = 0; i < MAX_CHANNELS; i++) {
1598 vc = &dev->vc[i];
1599 INIT_LIST_HEAD(list: &vc->buf_list);
1600
1601 v4l2_ctrl_handler_init(&vc->hdl, 6);
1602 v4l2_ctrl_new_std(hdl: &vc->hdl, ops: &s2255_ctrl_ops,
1603 V4L2_CID_BRIGHTNESS, min: -127, max: 127, step: 1, DEF_BRIGHT);
1604 v4l2_ctrl_new_std(hdl: &vc->hdl, ops: &s2255_ctrl_ops,
1605 V4L2_CID_CONTRAST, min: 0, max: 255, step: 1, DEF_CONTRAST);
1606 v4l2_ctrl_new_std(hdl: &vc->hdl, ops: &s2255_ctrl_ops,
1607 V4L2_CID_SATURATION, min: 0, max: 255, step: 1, DEF_SATURATION);
1608 v4l2_ctrl_new_std(hdl: &vc->hdl, ops: &s2255_ctrl_ops,
1609 V4L2_CID_HUE, min: 0, max: 255, step: 1, DEF_HUE);
1610 vc->jpegqual_ctrl = v4l2_ctrl_new_std(hdl: &vc->hdl,
1611 ops: &s2255_ctrl_ops,
1612 V4L2_CID_JPEG_COMPRESSION_QUALITY,
1613 min: 0, max: 100, step: 1, S2255_DEF_JPEG_QUAL);
1614 if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER &&
1615 (dev->pid != 0x2257 || vc->idx <= 1))
1616 v4l2_ctrl_new_custom(hdl: &vc->hdl, cfg: &color_filter_ctrl,
1617 NULL);
1618 if (vc->hdl.error) {
1619 ret = vc->hdl.error;
1620 v4l2_ctrl_handler_free(hdl: &vc->hdl);
1621 dev_err(&dev->udev->dev, "couldn't register control\n");
1622 break;
1623 }
1624 q = &vc->vb_vidq;
1625 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1626 q->io_modes = VB2_MMAP | VB2_READ | VB2_USERPTR;
1627 q->drv_priv = vc;
1628 q->lock = &vc->vb_lock;
1629 q->buf_struct_size = sizeof(struct s2255_buffer);
1630 q->mem_ops = &vb2_vmalloc_memops;
1631 q->ops = &s2255_video_qops;
1632 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1633 ret = vb2_queue_init(q);
1634 if (ret != 0) {
1635 dev_err(&dev->udev->dev,
1636 "%s vb2_queue_init 0x%x\n", __func__, ret);
1637 break;
1638 }
1639 /* register video devices */
1640 vc->vdev = template;
1641 vc->vdev.queue = q;
1642 vc->vdev.ctrl_handler = &vc->hdl;
1643 vc->vdev.lock = &dev->lock;
1644 vc->vdev.v4l2_dev = &dev->v4l2_dev;
1645 vc->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE |
1646 V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
1647 video_set_drvdata(vdev: &vc->vdev, data: vc);
1648 if (video_nr == -1)
1649 ret = video_register_device(vdev: &vc->vdev,
1650 type: VFL_TYPE_VIDEO,
1651 nr: video_nr);
1652 else
1653 ret = video_register_device(vdev: &vc->vdev,
1654 type: VFL_TYPE_VIDEO,
1655 nr: cur_nr + i);
1656
1657 if (ret) {
1658 dev_err(&dev->udev->dev,
1659 "failed to register video device!\n");
1660 break;
1661 }
1662 atomic_inc(v: &dev->num_channels);
1663 v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1664 video_device_node_name(&vc->vdev));
1665
1666 }
1667 pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1668 S2255_VERSION);
1669 /* if no channels registered, return error and probe will fail*/
1670 if (atomic_read(v: &dev->num_channels) == 0) {
1671 v4l2_device_unregister(v4l2_dev: &dev->v4l2_dev);
1672 return ret;
1673 }
1674 if (atomic_read(v: &dev->num_channels) != MAX_CHANNELS)
1675 pr_warn("s2255: Not all channels available.\n");
1676 return 0;
1677}
1678
1679/* this function moves the usb stream read pipe data
1680 * into the system buffers.
1681 * returns 0 on success, EAGAIN if more data to process( call this
1682 * function again).
1683 *
1684 * Received frame structure:
1685 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1686 * bytes 4-7: channel: 0-3
1687 * bytes 8-11: payload size: size of the frame
1688 * bytes 12-payloadsize+12: frame data
1689 */
1690static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1691{
1692 char *pdest;
1693 u32 offset = 0;
1694 int bframe = 0;
1695 char *psrc;
1696 unsigned long copy_size;
1697 unsigned long size;
1698 s32 idx = -1;
1699 struct s2255_framei *frm;
1700 unsigned char *pdata;
1701 struct s2255_vc *vc;
1702 dprintk(dev, 100, "buffer to user\n");
1703 vc = &dev->vc[dev->cc];
1704 idx = vc->cur_frame;
1705 frm = &vc->buffer.frame[idx];
1706 if (frm->ulState == S2255_READ_IDLE) {
1707 int jj;
1708 unsigned int cc;
1709 __le32 *pdword; /*data from dsp is little endian */
1710 int payload;
1711 /* search for marker codes */
1712 pdata = (unsigned char *)pipe_info->transfer_buffer;
1713 pdword = (__le32 *)pdata;
1714 for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
1715 switch (*pdword) {
1716 case S2255_MARKER_FRAME:
1717 dprintk(dev, 4, "marker @ offset: %d [%x %x]\n",
1718 jj, pdata[0], pdata[1]);
1719 offset = jj + PREFIX_SIZE;
1720 bframe = 1;
1721 cc = le32_to_cpu(pdword[1]);
1722 if (cc >= MAX_CHANNELS) {
1723 dprintk(dev, 0,
1724 "bad channel\n");
1725 return -EINVAL;
1726 }
1727 /* reverse it */
1728 dev->cc = G_chnmap[cc];
1729 vc = &dev->vc[dev->cc];
1730 payload = le32_to_cpu(pdword[3]);
1731 if (payload > vc->req_image_size) {
1732 vc->bad_payload++;
1733 /* discard the bad frame */
1734 return -EINVAL;
1735 }
1736 vc->pkt_size = payload;
1737 vc->jpg_size = le32_to_cpu(pdword[4]);
1738 break;
1739 case S2255_MARKER_RESPONSE:
1740
1741 pdata += DEF_USB_BLOCK;
1742 jj += DEF_USB_BLOCK;
1743 if (le32_to_cpu(pdword[1]) >= MAX_CHANNELS)
1744 break;
1745 cc = G_chnmap[le32_to_cpu(pdword[1])];
1746 if (cc >= MAX_CHANNELS)
1747 break;
1748 vc = &dev->vc[cc];
1749 switch (pdword[2]) {
1750 case S2255_RESPONSE_SETMODE:
1751 /* check if channel valid */
1752 /* set mode ready */
1753 vc->setmode_ready = 1;
1754 wake_up(&vc->wait_setmode);
1755 dprintk(dev, 5, "setmode rdy %d\n", cc);
1756 break;
1757 case S2255_RESPONSE_FW:
1758 dev->chn_ready |= (1 << cc);
1759 if ((dev->chn_ready & 0x0f) != 0x0f)
1760 break;
1761 /* all channels ready */
1762 pr_info("s2255: fw loaded\n");
1763 atomic_set(v: &dev->fw_data->fw_state,
1764 S2255_FW_SUCCESS);
1765 wake_up(&dev->fw_data->wait_fw);
1766 break;
1767 case S2255_RESPONSE_STATUS:
1768 vc->vidstatus = le32_to_cpu(pdword[3]);
1769 vc->vidstatus_ready = 1;
1770 wake_up(&vc->wait_vidstatus);
1771 dprintk(dev, 5, "vstat %x chan %d\n",
1772 le32_to_cpu(pdword[3]), cc);
1773 break;
1774 default:
1775 pr_info("s2255 unknown resp\n");
1776 }
1777 pdata++;
1778 break;
1779 default:
1780 pdata++;
1781 break;
1782 }
1783 if (bframe)
1784 break;
1785 } /* for */
1786 if (!bframe)
1787 return -EINVAL;
1788 }
1789 vc = &dev->vc[dev->cc];
1790 idx = vc->cur_frame;
1791 frm = &vc->buffer.frame[idx];
1792 /* search done. now find out if should be acquiring on this channel */
1793 if (!vb2_is_streaming(q: &vc->vb_vidq)) {
1794 /* we found a frame, but this channel is turned off */
1795 frm->ulState = S2255_READ_IDLE;
1796 return -EINVAL;
1797 }
1798
1799 if (frm->ulState == S2255_READ_IDLE) {
1800 frm->ulState = S2255_READ_FRAME;
1801 frm->cur_size = 0;
1802 }
1803
1804 /* skip the marker 512 bytes (and offset if out of sync) */
1805 psrc = (u8 *)pipe_info->transfer_buffer + offset;
1806
1807
1808 if (frm->lpvbits == NULL) {
1809 dprintk(dev, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1810 frm, dev, dev->cc, idx);
1811 return -ENOMEM;
1812 }
1813
1814 pdest = frm->lpvbits + frm->cur_size;
1815
1816 copy_size = (pipe_info->cur_transfer_size - offset);
1817
1818 size = vc->pkt_size - PREFIX_SIZE;
1819
1820 /* sanity check on pdest */
1821 if ((copy_size + frm->cur_size) < vc->req_image_size)
1822 memcpy(pdest, psrc, copy_size);
1823
1824 frm->cur_size += copy_size;
1825 dprintk(dev, 4, "cur_size: %lu, size: %lu\n", frm->cur_size, size);
1826
1827 if (frm->cur_size >= size) {
1828 dprintk(dev, 2, "******[%d]Buffer[%d]full*******\n",
1829 dev->cc, idx);
1830 vc->last_frame = vc->cur_frame;
1831 vc->cur_frame++;
1832 /* end of system frame ring buffer, start at zero */
1833 if ((vc->cur_frame == SYS_FRAMES) ||
1834 (vc->cur_frame == vc->buffer.dwFrames))
1835 vc->cur_frame = 0;
1836 /* frame ready */
1837 if (vb2_is_streaming(q: &vc->vb_vidq))
1838 s2255_got_frame(vc, jpgsize: vc->jpg_size);
1839 vc->frame_count++;
1840 frm->ulState = S2255_READ_IDLE;
1841 frm->cur_size = 0;
1842
1843 }
1844 /* done successfully */
1845 return 0;
1846}
1847
1848static void s2255_read_video_callback(struct s2255_dev *dev,
1849 struct s2255_pipeinfo *pipe_info)
1850{
1851 int res;
1852 dprintk(dev, 50, "callback read video\n");
1853
1854 if (dev->cc >= MAX_CHANNELS) {
1855 dev->cc = 0;
1856 dev_err(&dev->udev->dev, "invalid channel\n");
1857 return;
1858 }
1859 /* otherwise copy to the system buffers */
1860 res = save_frame(dev, pipe_info);
1861 if (res != 0)
1862 dprintk(dev, 4, "s2255: read callback failed\n");
1863
1864 dprintk(dev, 50, "callback read video done\n");
1865 return;
1866}
1867
1868static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
1869 u16 Index, u16 Value, void *TransferBuffer,
1870 s32 TransferBufferLength, int bOut)
1871{
1872 int r;
1873 unsigned char *buf;
1874
1875 buf = kmalloc(size: TransferBufferLength, GFP_KERNEL);
1876 if (!buf)
1877 return -ENOMEM;
1878
1879 if (!bOut) {
1880 r = usb_control_msg(dev: dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1881 request: Request,
1882 USB_TYPE_VENDOR | USB_RECIP_DEVICE |
1883 USB_DIR_IN,
1884 value: Value, index: Index, data: buf,
1885 size: TransferBufferLength, USB_CTRL_SET_TIMEOUT);
1886
1887 if (r >= 0)
1888 memcpy(TransferBuffer, buf, TransferBufferLength);
1889 } else {
1890 memcpy(buf, TransferBuffer, TransferBufferLength);
1891 r = usb_control_msg(dev: dev->udev, usb_sndctrlpipe(dev->udev, 0),
1892 request: Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1893 value: Value, index: Index, data: buf,
1894 size: TransferBufferLength, USB_CTRL_SET_TIMEOUT);
1895 }
1896 kfree(objp: buf);
1897 return r;
1898}
1899
1900/*
1901 * retrieve FX2 firmware version. future use.
1902 * @param dev pointer to device extension
1903 * @return -1 for fail, else returns firmware version as an int(16 bits)
1904 */
1905static int s2255_get_fx2fw(struct s2255_dev *dev)
1906{
1907 int fw;
1908 int ret;
1909 u8 transBuffer[2] = {};
1910
1911 ret = s2255_vendor_req(dev, S2255_VR_FW, Index: 0, Value: 0, TransferBuffer: transBuffer,
1912 TransferBufferLength: sizeof(transBuffer), S2255_VR_IN);
1913 if (ret < 0)
1914 dprintk(dev, 2, "get fw error: %x\n", ret);
1915 fw = transBuffer[0] + (transBuffer[1] << 8);
1916 dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
1917 return fw;
1918}
1919
1920/*
1921 * Create the system ring buffer to copy frames into from the
1922 * usb read pipe.
1923 */
1924static int s2255_create_sys_buffers(struct s2255_vc *vc)
1925{
1926 unsigned long i;
1927 unsigned long reqsize;
1928 vc->buffer.dwFrames = SYS_FRAMES;
1929 /* always allocate maximum size(PAL) for system buffers */
1930 reqsize = SYS_FRAMES_MAXSIZE;
1931
1932 if (reqsize > SYS_FRAMES_MAXSIZE)
1933 reqsize = SYS_FRAMES_MAXSIZE;
1934
1935 for (i = 0; i < SYS_FRAMES; i++) {
1936 /* allocate the frames */
1937 vc->buffer.frame[i].lpvbits = vmalloc(size: reqsize);
1938 vc->buffer.frame[i].size = reqsize;
1939 if (vc->buffer.frame[i].lpvbits == NULL) {
1940 pr_info("out of memory. using less frames\n");
1941 vc->buffer.dwFrames = i;
1942 break;
1943 }
1944 }
1945
1946 /* make sure internal states are set */
1947 for (i = 0; i < SYS_FRAMES; i++) {
1948 vc->buffer.frame[i].ulState = 0;
1949 vc->buffer.frame[i].cur_size = 0;
1950 }
1951
1952 vc->cur_frame = 0;
1953 vc->last_frame = -1;
1954 return 0;
1955}
1956
1957static int s2255_release_sys_buffers(struct s2255_vc *vc)
1958{
1959 unsigned long i;
1960 for (i = 0; i < SYS_FRAMES; i++) {
1961 vfree(addr: vc->buffer.frame[i].lpvbits);
1962 vc->buffer.frame[i].lpvbits = NULL;
1963 }
1964 return 0;
1965}
1966
1967static int s2255_board_init(struct s2255_dev *dev)
1968{
1969 struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
1970 int fw_ver;
1971 int j;
1972 struct s2255_pipeinfo *pipe = &dev->pipe;
1973 dprintk(dev, 4, "board init: %p", dev);
1974 memset(pipe, 0, sizeof(*pipe));
1975 pipe->dev = dev;
1976 pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
1977 pipe->max_transfer_size = S2255_USB_XFER_SIZE;
1978
1979 pipe->transfer_buffer = kzalloc(size: pipe->max_transfer_size,
1980 GFP_KERNEL);
1981 if (pipe->transfer_buffer == NULL) {
1982 dprintk(dev, 1, "out of memory!\n");
1983 return -ENOMEM;
1984 }
1985 /* query the firmware */
1986 fw_ver = s2255_get_fx2fw(dev);
1987
1988 pr_info("s2255: usb firmware version %d.%d\n",
1989 (fw_ver >> 8) & 0xff,
1990 fw_ver & 0xff);
1991
1992 if (fw_ver < S2255_CUR_USB_FWVER)
1993 pr_info("s2255: newer USB firmware available\n");
1994
1995 for (j = 0; j < MAX_CHANNELS; j++) {
1996 struct s2255_vc *vc = &dev->vc[j];
1997 vc->mode = mode_def;
1998 if (dev->pid == 0x2257 && j > 1)
1999 vc->mode.color |= (1 << 16);
2000 vc->jpegqual = S2255_DEF_JPEG_QUAL;
2001 vc->width = LINE_SZ_4CIFS_NTSC;
2002 vc->height = NUM_LINES_4CIFS_NTSC * 2;
2003 vc->std = V4L2_STD_NTSC_M;
2004 vc->fmt = &formats[0];
2005 vc->mode.restart = 1;
2006 vc->req_image_size = get_transfer_size(mode: &mode_def);
2007 vc->frame_count = 0;
2008 /* create the system buffers */
2009 s2255_create_sys_buffers(vc);
2010 }
2011 /* start read pipe */
2012 s2255_start_readpipe(dev);
2013 dprintk(dev, 1, "%s: success\n", __func__);
2014 return 0;
2015}
2016
2017static int s2255_board_shutdown(struct s2255_dev *dev)
2018{
2019 u32 i;
2020 dprintk(dev, 1, "%s: dev: %p", __func__, dev);
2021
2022 for (i = 0; i < MAX_CHANNELS; i++) {
2023 if (vb2_is_streaming(q: &dev->vc[i].vb_vidq))
2024 s2255_stop_acquire(vc: &dev->vc[i]);
2025 }
2026 s2255_stop_readpipe(dev);
2027 for (i = 0; i < MAX_CHANNELS; i++)
2028 s2255_release_sys_buffers(vc: &dev->vc[i]);
2029 /* release transfer buffer */
2030 kfree(objp: dev->pipe.transfer_buffer);
2031 return 0;
2032}
2033
2034static void read_pipe_completion(struct urb *purb)
2035{
2036 struct s2255_pipeinfo *pipe_info;
2037 struct s2255_dev *dev;
2038 int status;
2039 int pipe;
2040 pipe_info = purb->context;
2041 if (pipe_info == NULL) {
2042 dev_err(&purb->dev->dev, "no context!\n");
2043 return;
2044 }
2045 dev = pipe_info->dev;
2046 if (dev == NULL) {
2047 dev_err(&purb->dev->dev, "no context!\n");
2048 return;
2049 }
2050 status = purb->status;
2051 /* if shutting down, do not resubmit, exit immediately */
2052 if (status == -ESHUTDOWN) {
2053 dprintk(dev, 2, "%s: err shutdown\n", __func__);
2054 pipe_info->err_count++;
2055 return;
2056 }
2057
2058 if (pipe_info->state == 0) {
2059 dprintk(dev, 2, "%s: exiting USB pipe", __func__);
2060 return;
2061 }
2062
2063 if (status == 0)
2064 s2255_read_video_callback(dev, pipe_info);
2065 else {
2066 pipe_info->err_count++;
2067 dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
2068 }
2069
2070 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2071 /* reuse urb */
2072 usb_fill_bulk_urb(urb: pipe_info->stream_urb, dev: dev->udev,
2073 pipe,
2074 transfer_buffer: pipe_info->transfer_buffer,
2075 buffer_length: pipe_info->cur_transfer_size,
2076 complete_fn: read_pipe_completion, context: pipe_info);
2077
2078 if (pipe_info->state != 0) {
2079 if (usb_submit_urb(urb: pipe_info->stream_urb, GFP_ATOMIC))
2080 dev_err(&dev->udev->dev, "error submitting urb\n");
2081 } else {
2082 dprintk(dev, 2, "%s :complete state 0\n", __func__);
2083 }
2084 return;
2085}
2086
2087static int s2255_start_readpipe(struct s2255_dev *dev)
2088{
2089 int pipe;
2090 int retval;
2091 struct s2255_pipeinfo *pipe_info = &dev->pipe;
2092 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2093 dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
2094 pipe_info->state = 1;
2095 pipe_info->err_count = 0;
2096 pipe_info->stream_urb = usb_alloc_urb(iso_packets: 0, GFP_KERNEL);
2097 if (!pipe_info->stream_urb)
2098 return -ENOMEM;
2099 /* transfer buffer allocated in board_init */
2100 usb_fill_bulk_urb(urb: pipe_info->stream_urb, dev: dev->udev,
2101 pipe,
2102 transfer_buffer: pipe_info->transfer_buffer,
2103 buffer_length: pipe_info->cur_transfer_size,
2104 complete_fn: read_pipe_completion, context: pipe_info);
2105 retval = usb_submit_urb(urb: pipe_info->stream_urb, GFP_KERNEL);
2106 if (retval) {
2107 pr_err("s2255: start read pipe failed\n");
2108 return retval;
2109 }
2110 return 0;
2111}
2112
2113/* starts acquisition process */
2114static int s2255_start_acquire(struct s2255_vc *vc)
2115{
2116 int res;
2117 unsigned long chn_rev;
2118 int j;
2119 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: vc->vdev.v4l2_dev);
2120 __le32 *buffer = dev->cmdbuf;
2121
2122 mutex_lock(&dev->cmdlock);
2123 chn_rev = G_chnmap[vc->idx];
2124 vc->last_frame = -1;
2125 vc->bad_payload = 0;
2126 vc->cur_frame = 0;
2127 for (j = 0; j < SYS_FRAMES; j++) {
2128 vc->buffer.frame[j].ulState = 0;
2129 vc->buffer.frame[j].cur_size = 0;
2130 }
2131
2132 /* send the start command */
2133 buffer[0] = IN_DATA_TOKEN;
2134 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2135 buffer[2] = CMD_START;
2136 res = s2255_write_config(udev: dev->udev, pbuf: (unsigned char *)buffer, size: 512);
2137 if (res != 0)
2138 dev_err(&dev->udev->dev, "CMD_START error\n");
2139
2140 dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
2141 mutex_unlock(lock: &dev->cmdlock);
2142 return res;
2143}
2144
2145static int s2255_stop_acquire(struct s2255_vc *vc)
2146{
2147 int res;
2148 unsigned long chn_rev;
2149 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: vc->vdev.v4l2_dev);
2150 __le32 *buffer = dev->cmdbuf;
2151
2152 mutex_lock(&dev->cmdlock);
2153 chn_rev = G_chnmap[vc->idx];
2154 /* send the stop command */
2155 buffer[0] = IN_DATA_TOKEN;
2156 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2157 buffer[2] = CMD_STOP;
2158
2159 res = s2255_write_config(udev: dev->udev, pbuf: (unsigned char *)buffer, size: 512);
2160 if (res != 0)
2161 dev_err(&dev->udev->dev, "CMD_STOP error\n");
2162
2163 dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
2164 mutex_unlock(lock: &dev->cmdlock);
2165 return res;
2166}
2167
2168static void s2255_stop_readpipe(struct s2255_dev *dev)
2169{
2170 struct s2255_pipeinfo *pipe = &dev->pipe;
2171
2172 pipe->state = 0;
2173 if (pipe->stream_urb) {
2174 /* cancel urb */
2175 usb_kill_urb(urb: pipe->stream_urb);
2176 usb_free_urb(urb: pipe->stream_urb);
2177 pipe->stream_urb = NULL;
2178 }
2179 dprintk(dev, 4, "%s", __func__);
2180 return;
2181}
2182
2183static void s2255_fwload_start(struct s2255_dev *dev)
2184{
2185 s2255_reset_dsppower(dev);
2186 dev->fw_data->fw_size = dev->fw_data->fw->size;
2187 atomic_set(v: &dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2188 memcpy(dev->fw_data->pfw_data,
2189 dev->fw_data->fw->data, CHUNK_SIZE);
2190 dev->fw_data->fw_loaded = CHUNK_SIZE;
2191 usb_fill_bulk_urb(urb: dev->fw_data->fw_urb, dev: dev->udev,
2192 usb_sndbulkpipe(dev->udev, 2),
2193 transfer_buffer: dev->fw_data->pfw_data,
2194 CHUNK_SIZE, complete_fn: s2255_fwchunk_complete,
2195 context: dev->fw_data);
2196 mod_timer(timer: &dev->timer, expires: jiffies + HZ);
2197}
2198
2199/* standard usb probe function */
2200static int s2255_probe(struct usb_interface *interface,
2201 const struct usb_device_id *id)
2202{
2203 struct s2255_dev *dev = NULL;
2204 struct usb_host_interface *iface_desc;
2205 struct usb_endpoint_descriptor *endpoint;
2206 int i;
2207 int retval = -ENOMEM;
2208 __le32 *pdata;
2209 int fw_size;
2210
2211 /* allocate memory for our device state and initialize it to zero */
2212 dev = kzalloc(size: sizeof(struct s2255_dev), GFP_KERNEL);
2213 if (dev == NULL) {
2214 s2255_dev_err(&interface->dev, "out of memory\n");
2215 return -ENOMEM;
2216 }
2217
2218 dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
2219 if (dev->cmdbuf == NULL) {
2220 s2255_dev_err(&interface->dev, "out of memory\n");
2221 goto errorFWDATA1;
2222 }
2223
2224 atomic_set(v: &dev->num_channels, i: 0);
2225 dev->pid = id->idProduct;
2226 dev->fw_data = kzalloc(size: sizeof(struct s2255_fw), GFP_KERNEL);
2227 if (!dev->fw_data)
2228 goto errorFWDATA1;
2229 mutex_init(&dev->lock);
2230 mutex_init(&dev->cmdlock);
2231 /* grab usb_device and save it */
2232 dev->udev = usb_get_dev(interface_to_usbdev(interface));
2233 if (dev->udev == NULL) {
2234 dev_err(&interface->dev, "null usb device\n");
2235 retval = -ENODEV;
2236 goto errorUDEV;
2237 }
2238 dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
2239 dev, dev->udev, interface);
2240 dev->interface = interface;
2241 /* set up the endpoint information */
2242 iface_desc = interface->cur_altsetting;
2243 dev_dbg(&interface->dev, "num EP: %d\n",
2244 iface_desc->desc.bNumEndpoints);
2245 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2246 endpoint = &iface_desc->endpoint[i].desc;
2247 if (!dev->read_endpoint && usb_endpoint_is_bulk_in(epd: endpoint)) {
2248 /* we found the bulk in endpoint */
2249 dev->read_endpoint = endpoint->bEndpointAddress;
2250 }
2251 }
2252
2253 if (!dev->read_endpoint) {
2254 dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2255 goto errorEP;
2256 }
2257 timer_setup(&dev->timer, s2255_timer, 0);
2258 init_waitqueue_head(&dev->fw_data->wait_fw);
2259 for (i = 0; i < MAX_CHANNELS; i++) {
2260 struct s2255_vc *vc = &dev->vc[i];
2261 vc->idx = i;
2262 vc->dev = dev;
2263 init_waitqueue_head(&vc->wait_setmode);
2264 init_waitqueue_head(&vc->wait_vidstatus);
2265 spin_lock_init(&vc->qlock);
2266 mutex_init(&vc->vb_lock);
2267 }
2268
2269 dev->fw_data->fw_urb = usb_alloc_urb(iso_packets: 0, GFP_KERNEL);
2270 if (!dev->fw_data->fw_urb)
2271 goto errorFWURB;
2272
2273 dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2274 if (!dev->fw_data->pfw_data) {
2275 dev_err(&interface->dev, "out of memory!\n");
2276 goto errorFWDATA2;
2277 }
2278 /* load the first chunk */
2279 if (request_firmware(fw: &dev->fw_data->fw,
2280 FIRMWARE_FILE_NAME, device: &dev->udev->dev)) {
2281 dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
2282 goto errorREQFW;
2283 }
2284 /* check the firmware is valid */
2285 fw_size = dev->fw_data->fw->size;
2286 pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2287
2288 if (*pdata != S2255_FW_MARKER) {
2289 dev_err(&interface->dev, "Firmware invalid.\n");
2290 retval = -ENODEV;
2291 goto errorFWMARKER;
2292 } else {
2293 /* make sure firmware is the latest */
2294 __le32 *pRel;
2295 pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2296 pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
2297 dev->dsp_fw_ver = le32_to_cpu(*pRel);
2298 if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
2299 pr_info("s2255: f2255usb.bin out of date.\n");
2300 if (dev->pid == 0x2257 &&
2301 dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
2302 pr_warn("2257 needs firmware %d or above.\n",
2303 S2255_MIN_DSP_COLORFILTER);
2304 }
2305 usb_reset_device(dev: dev->udev);
2306 /* load 2255 board specific */
2307 retval = s2255_board_init(dev);
2308 if (retval)
2309 goto errorBOARDINIT;
2310 s2255_fwload_start(dev);
2311 /* loads v4l specific */
2312 retval = s2255_probe_v4l(dev);
2313 if (retval)
2314 goto errorBOARDINIT;
2315 dev_info(&interface->dev, "Sensoray 2255 detected\n");
2316 return 0;
2317errorBOARDINIT:
2318 s2255_board_shutdown(dev);
2319errorFWMARKER:
2320 release_firmware(fw: dev->fw_data->fw);
2321errorREQFW:
2322 kfree(objp: dev->fw_data->pfw_data);
2323errorFWDATA2:
2324 usb_free_urb(urb: dev->fw_data->fw_urb);
2325errorFWURB:
2326 timer_shutdown_sync(timer: &dev->timer);
2327errorEP:
2328 usb_put_dev(dev: dev->udev);
2329errorUDEV:
2330 kfree(objp: dev->fw_data);
2331 mutex_destroy(lock: &dev->lock);
2332errorFWDATA1:
2333 kfree(objp: dev->cmdbuf);
2334 kfree(objp: dev);
2335 pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
2336 return retval;
2337}
2338
2339/* disconnect routine. when board is removed physically or with rmmod */
2340static void s2255_disconnect(struct usb_interface *interface)
2341{
2342 struct s2255_dev *dev = to_s2255_dev(v4l2_dev: usb_get_intfdata(intf: interface));
2343 int i;
2344 int channels = atomic_read(v: &dev->num_channels);
2345 mutex_lock(&dev->lock);
2346 v4l2_device_disconnect(v4l2_dev: &dev->v4l2_dev);
2347 mutex_unlock(lock: &dev->lock);
2348 /*see comments in the uvc_driver.c usb disconnect function */
2349 atomic_inc(v: &dev->num_channels);
2350 /* unregister each video device. */
2351 for (i = 0; i < channels; i++)
2352 video_unregister_device(vdev: &dev->vc[i].vdev);
2353 /* wake up any of our timers */
2354 atomic_set(v: &dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2355 wake_up(&dev->fw_data->wait_fw);
2356 for (i = 0; i < MAX_CHANNELS; i++) {
2357 dev->vc[i].setmode_ready = 1;
2358 wake_up(&dev->vc[i].wait_setmode);
2359 dev->vc[i].vidstatus_ready = 1;
2360 wake_up(&dev->vc[i].wait_vidstatus);
2361 }
2362 if (atomic_dec_and_test(v: &dev->num_channels))
2363 s2255_destroy(dev);
2364 dev_info(&interface->dev, "%s\n", __func__);
2365}
2366
2367static struct usb_driver s2255_driver = {
2368 .name = S2255_DRIVER_NAME,
2369 .probe = s2255_probe,
2370 .disconnect = s2255_disconnect,
2371 .id_table = s2255_table,
2372};
2373
2374module_usb_driver(s2255_driver);
2375
2376MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2377MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2378MODULE_LICENSE("GPL");
2379MODULE_VERSION(S2255_VERSION);
2380MODULE_FIRMWARE(FIRMWARE_FILE_NAME);
2381

source code of linux/drivers/media/usb/s2255/s2255drv.c