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
133 struct 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 */
152 struct 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 */
160 struct 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
179 struct 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
189 struct 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
200 struct s2255_fmt; /*forward declaration */
201 struct s2255_dev;
202
203 /* 2255 video channel */
204 struct 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
247 struct 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
to_s2255_dev(struct v4l2_device * v4l2_dev)270 static 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
275 struct s2255_fmt {
276 u32 fourcc;
277 int depth;
278 };
279
280 /* buffer for one video frame */
281 struct 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 */
331 static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
332
333 static int debug;
334
335 static int s2255_start_readpipe(struct s2255_dev *dev);
336 static void s2255_stop_readpipe(struct s2255_dev *dev);
337 static int s2255_start_acquire(struct s2255_vc *vc);
338 static int s2255_stop_acquire(struct s2255_vc *vc);
339 static void s2255_fillbuff(struct s2255_vc *vc, struct s2255_buffer *buf,
340 int jpgsize);
341 static int s2255_set_mode(struct s2255_vc *vc, struct s2255_mode *mode);
342 static int s2255_board_shutdown(struct s2255_dev *dev);
343 static void s2255_fwload_start(struct s2255_dev *dev);
344 static void s2255_destroy(struct s2255_dev *dev);
345 static 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
357 static struct usb_driver s2255_driver;
358
359 /* start video number */
360 static int video_nr = -1; /* /dev/videoN, -1 for autodetect */
361
362 /* Enable jpeg capture. */
363 static int jpeg_enable = 1;
364
365 module_param(debug, int, 0644);
366 MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
367 module_param(video_nr, int, 0644);
368 MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
369 module_param(jpeg_enable, int, 0644);
370 MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
371
372 /* USB device table */
373 #define USB_SENSORAY_VID 0x1943
374 static 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 };
379 MODULE_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 */
385 static 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
norm_maxw(struct s2255_vc * vc)409 static 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
norm_maxh(struct s2255_vc * vc)415 static 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
norm_minw(struct s2255_vc * vc)421 static 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
norm_minh(struct s2255_vc * vc)427 static 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 */
planar422p_to_yuv_packed(const unsigned char * in,unsigned char * out,int width,int height,int fmt)438 static 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
s2255_reset_dsppower(struct s2255_dev * dev)460 static void s2255_reset_dsppower(struct s2255_dev *dev)
461 {
462 s2255_vendor_req(dev, 0x40, 0x0000, 0x0001, NULL, 0, 1);
463 msleep(50);
464 s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
465 msleep(600);
466 s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
467 return;
468 }
469
470 /* kickstarts the firmware loading. from probe
471 */
s2255_timer(struct timer_list * t)472 static 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(data->fw_urb, GFP_ATOMIC) < 0) {
477 pr_err("s2255: can't submit urb\n");
478 atomic_set(&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 */
s2255_fwchunk_complete(struct urb * urb)492 static 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(&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(&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(data->fw_urb, udev, usb_sndbulkpipe(udev, 2),
527 data->pfw_data, CHUNK_SIZE,
528 s2255_fwchunk_complete, data);
529 if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
530 dev_err(&udev->dev, "failed submit URB\n");
531 atomic_set(&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(&data->fw_state, S2255_FW_LOADED_DSPWAIT);
539 return;
540
541 }
542
s2255_got_frame(struct s2255_vc * vc,int jpgsize)543 static void s2255_got_frame(struct s2255_vc *vc, int jpgsize)
544 {
545 struct s2255_buffer *buf;
546 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
547 unsigned long flags = 0;
548
549 spin_lock_irqsave(&vc->qlock, flags);
550 if (list_empty(&vc->buf_list)) {
551 dprintk(dev, 1, "No active queue to serve\n");
552 spin_unlock_irqrestore(&vc->qlock, flags);
553 return;
554 }
555 buf = list_entry(vc->buf_list.next,
556 struct s2255_buffer, list);
557 list_del(&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(&vc->qlock, flags);
562
563 s2255_fillbuff(vc, buf, jpgsize);
564 /* tell v4l buffer was filled */
565 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
566 dprintk(dev, 2, "%s: [buf] [%p]\n", __func__, buf);
567 }
568
format_by_fourcc(int fourcc)569 static 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 */
s2255_fillbuff(struct s2255_vc * vc,struct s2255_buffer * buf,int jpgsize)592 static 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(&buf->vb.vb2_buf, 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((const unsigned char *)tmpbuf,
611 vbuf, vc->width,
612 vc->height,
613 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(&buf->vb.vb2_buf, 0, 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
queue_setup(struct vb2_queue * vq,unsigned int * nbuffers,unsigned int * nplanes,unsigned int sizes[],struct device * alloc_devs[])644 static 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(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
buffer_prepare(struct vb2_buffer * vb)656 static int buffer_prepare(struct vb2_buffer *vb)
657 {
658 struct s2255_vc *vc = vb2_get_drv_priv(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, 0) < size) {
678 dprintk(vc->dev, 4, "invalid buffer prepare\n");
679 return -EINVAL;
680 }
681
682 vb2_set_plane_payload(&buf->vb.vb2_buf, 0, size);
683 return 0;
684 }
685
buffer_queue(struct vb2_buffer * vb)686 static 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(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(&buf->list, &vc->buf_list);
695 spin_unlock_irqrestore(&vc->qlock, flags);
696 }
697
698 static int start_streaming(struct vb2_queue *vq, unsigned int count);
699 static void stop_streaming(struct vb2_queue *vq);
700
701 static 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
vidioc_querycap(struct file * file,void * priv,struct v4l2_capability * cap)711 static 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->udev, cap->bus_info, sizeof(cap->bus_info));
720 return 0;
721 }
722
vidioc_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)723 static 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
vidioc_g_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)737 static 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
vidioc_try_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)757 static 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(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
vidioc_s_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)808 static 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, vc, f);
818
819 if (ret < 0)
820 return ret;
821
822 fmt = format_by_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);
881 return 0;
882 }
883
884
885 /* write to the configuration pipe, synchronously */
s2255_write_config(struct usb_device * udev,unsigned char * pbuf,int size)886 static 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(udev, pipe, pbuf, size, &done, 500);
895 }
896 return retval;
897 }
898
get_transfer_size(struct s2255_mode * mode)899 static 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
s2255_print_cfg(struct s2255_dev * sdev,struct s2255_mode * mode)963 static 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 */
s2255_set_mode(struct s2255_vc * vc,struct s2255_mode * mode)981 static 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(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(dev->udev, (unsigned char *)buffer, 512);
1012 if (debug)
1013 s2255_print_cfg(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(&dev->cmdlock);
1028 return res;
1029 }
1030
s2255_cmd_status(struct s2255_vc * vc,u32 * pstatus)1031 static 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(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(dev->udev, (unsigned char *)buffer, 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(&dev->cmdlock);
1058 return res;
1059 }
1060
start_streaming(struct vb2_queue * vq,unsigned int count)1061 static int start_streaming(struct vb2_queue *vq, unsigned int count)
1062 {
1063 struct s2255_vc *vc = vb2_get_drv_priv(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 */
stop_streaming(struct vb2_queue * vq)1078 static void stop_streaming(struct vb2_queue *vq)
1079 {
1080 struct s2255_vc *vc = vb2_get_drv_priv(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(&buf->list);
1087 vb2_buffer_done(&buf->vb.vb2_buf, 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(&vc->qlock, flags);
1092 }
1093
vidioc_s_std(struct file * file,void * priv,v4l2_std_id i)1094 static 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);
1132 return 0;
1133 }
1134
vidioc_g_std(struct file * file,void * priv,v4l2_std_id * i)1135 static 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 */
vidioc_enum_input(struct file * file,void * priv,struct v4l2_input * inp)1150 static 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, &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
vidioc_g_input(struct file * file,void * priv,unsigned int * i)1184 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1185 {
1186 *i = 0;
1187 return 0;
1188 }
vidioc_s_input(struct file * file,void * priv,unsigned int i)1189 static 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
s2255_s_ctrl(struct v4l2_ctrl * ctrl)1196 static 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);
1232 return 0;
1233 }
1234
vidioc_g_jpegcomp(struct file * file,void * priv,struct v4l2_jpegcompression * jc)1235 static 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
vidioc_s_jpegcomp(struct file * file,void * priv,const struct v4l2_jpegcompression * jc)1246 static 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(vc->jpegqual_ctrl, jc->quality);
1254 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1255 return 0;
1256 }
1257
vidioc_g_parm(struct file * file,void * priv,struct v4l2_streamparm * sp)1258 static 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
vidioc_s_parm(struct file * file,void * priv,struct v4l2_streamparm * sp)1295 static 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(&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);
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
1338 static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1339 { 640, 480 },
1340 { 640, 240 },
1341 { 320, 240 },
1342 };
1343 static const struct v4l2_frmsize_discrete pal_sizes[] = {
1344 { 704, 576 },
1345 { 704, 288 },
1346 { 352, 288 },
1347 };
1348
vidioc_enum_framesizes(struct file * file,void * priv,struct v4l2_frmsizeenum * fe)1349 static 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(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
vidioc_enum_frameintervals(struct file * file,void * priv,struct v4l2_frmivalenum * fe)1367 static 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(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
s2255_open(struct file * file)1402 static 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(file);
1410 if (rc != 0)
1411 return rc;
1412
1413 dprintk(dev, 1, "s2255: %s\n", __func__);
1414 state = atomic_read(&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(&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(&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(&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, &vc->mode);
1479 vc->configured = 1;
1480 }
1481 return 0;
1482 }
1483
s2255_destroy(struct s2255_dev * dev)1484 static 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(&dev->timer); /* only started in .probe and .open */
1491 if (dev->fw_data->fw_urb) {
1492 usb_kill_urb(dev->fw_data->fw_urb);
1493 usb_free_urb(dev->fw_data->fw_urb);
1494 dev->fw_data->fw_urb = NULL;
1495 }
1496 release_firmware(dev->fw_data->fw);
1497 kfree(dev->fw_data->pfw_data);
1498 kfree(dev->fw_data);
1499 /* reset the DSP so firmware can be reloaded next time */
1500 s2255_reset_dsppower(dev);
1501 mutex_destroy(&dev->lock);
1502 usb_put_dev(dev->udev);
1503 v4l2_device_unregister(&dev->v4l2_dev);
1504 kfree(dev->cmdbuf);
1505 kfree(dev);
1506 }
1507
1508 static 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
1518 static 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
s2255_video_device_release(struct video_device * vdev)1546 static void s2255_video_device_release(struct video_device *vdev)
1547 {
1548 struct s2255_dev *dev = to_s2255_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(&vc->hdl);
1556
1557 if (atomic_dec_and_test(&dev->num_channels))
1558 s2255_destroy(dev);
1559 return;
1560 }
1561
1562 static 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
1570 static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1571 .s_ctrl = s2255_s_ctrl,
1572 };
1573
1574 static 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
s2255_probe_v4l(struct s2255_dev * dev)1584 static 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->interface->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(&vc->buf_list);
1600
1601 v4l2_ctrl_handler_init(&vc->hdl, 6);
1602 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1603 V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
1604 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1605 V4L2_CID_CONTRAST, 0, 255, 1, DEF_CONTRAST);
1606 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1607 V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION);
1608 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1609 V4L2_CID_HUE, 0, 255, 1, DEF_HUE);
1610 vc->jpegqual_ctrl = v4l2_ctrl_new_std(&vc->hdl,
1611 &s2255_ctrl_ops,
1612 V4L2_CID_JPEG_COMPRESSION_QUALITY,
1613 0, 100, 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(&vc->hdl, &color_filter_ctrl,
1617 NULL);
1618 if (vc->hdl.error) {
1619 ret = vc->hdl.error;
1620 v4l2_ctrl_handler_free(&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(&vc->vdev, vc);
1648 if (video_nr == -1)
1649 ret = video_register_device(&vc->vdev,
1650 VFL_TYPE_VIDEO,
1651 video_nr);
1652 else
1653 ret = video_register_device(&vc->vdev,
1654 VFL_TYPE_VIDEO,
1655 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(&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(&dev->num_channels) == 0) {
1671 v4l2_device_unregister(&dev->v4l2_dev);
1672 return ret;
1673 }
1674 if (atomic_read(&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 */
save_frame(struct s2255_dev * dev,struct s2255_pipeinfo * pipe_info)1690 static 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(&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(&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(&vc->vb_vidq))
1838 s2255_got_frame(vc, 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
s2255_read_video_callback(struct s2255_dev * dev,struct s2255_pipeinfo * pipe_info)1848 static 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
s2255_vendor_req(struct s2255_dev * dev,unsigned char Request,u16 Index,u16 Value,void * TransferBuffer,s32 TransferBufferLength,int bOut)1868 static 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(TransferBufferLength, GFP_KERNEL);
1876 if (!buf)
1877 return -ENOMEM;
1878
1879 if (!bOut) {
1880 r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1881 Request,
1882 USB_TYPE_VENDOR | USB_RECIP_DEVICE |
1883 USB_DIR_IN,
1884 Value, Index, buf,
1885 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->udev, usb_sndctrlpipe(dev->udev, 0),
1892 Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1893 Value, Index, buf,
1894 TransferBufferLength, USB_CTRL_SET_TIMEOUT);
1895 }
1896 kfree(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 */
s2255_get_fx2fw(struct s2255_dev * dev)1905 static int s2255_get_fx2fw(struct s2255_dev *dev)
1906 {
1907 int fw;
1908 int ret;
1909 unsigned char transBuffer[64];
1910 ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer, 2,
1911 S2255_VR_IN);
1912 if (ret < 0)
1913 dprintk(dev, 2, "get fw error: %x\n", ret);
1914 fw = transBuffer[0] + (transBuffer[1] << 8);
1915 dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
1916 return fw;
1917 }
1918
1919 /*
1920 * Create the system ring buffer to copy frames into from the
1921 * usb read pipe.
1922 */
s2255_create_sys_buffers(struct s2255_vc * vc)1923 static int s2255_create_sys_buffers(struct s2255_vc *vc)
1924 {
1925 unsigned long i;
1926 unsigned long reqsize;
1927 vc->buffer.dwFrames = SYS_FRAMES;
1928 /* always allocate maximum size(PAL) for system buffers */
1929 reqsize = SYS_FRAMES_MAXSIZE;
1930
1931 if (reqsize > SYS_FRAMES_MAXSIZE)
1932 reqsize = SYS_FRAMES_MAXSIZE;
1933
1934 for (i = 0; i < SYS_FRAMES; i++) {
1935 /* allocate the frames */
1936 vc->buffer.frame[i].lpvbits = vmalloc(reqsize);
1937 vc->buffer.frame[i].size = reqsize;
1938 if (vc->buffer.frame[i].lpvbits == NULL) {
1939 pr_info("out of memory. using less frames\n");
1940 vc->buffer.dwFrames = i;
1941 break;
1942 }
1943 }
1944
1945 /* make sure internal states are set */
1946 for (i = 0; i < SYS_FRAMES; i++) {
1947 vc->buffer.frame[i].ulState = 0;
1948 vc->buffer.frame[i].cur_size = 0;
1949 }
1950
1951 vc->cur_frame = 0;
1952 vc->last_frame = -1;
1953 return 0;
1954 }
1955
s2255_release_sys_buffers(struct s2255_vc * vc)1956 static int s2255_release_sys_buffers(struct s2255_vc *vc)
1957 {
1958 unsigned long i;
1959 for (i = 0; i < SYS_FRAMES; i++) {
1960 vfree(vc->buffer.frame[i].lpvbits);
1961 vc->buffer.frame[i].lpvbits = NULL;
1962 }
1963 return 0;
1964 }
1965
s2255_board_init(struct s2255_dev * dev)1966 static int s2255_board_init(struct s2255_dev *dev)
1967 {
1968 struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
1969 int fw_ver;
1970 int j;
1971 struct s2255_pipeinfo *pipe = &dev->pipe;
1972 dprintk(dev, 4, "board init: %p", dev);
1973 memset(pipe, 0, sizeof(*pipe));
1974 pipe->dev = dev;
1975 pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
1976 pipe->max_transfer_size = S2255_USB_XFER_SIZE;
1977
1978 pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
1979 GFP_KERNEL);
1980 if (pipe->transfer_buffer == NULL) {
1981 dprintk(dev, 1, "out of memory!\n");
1982 return -ENOMEM;
1983 }
1984 /* query the firmware */
1985 fw_ver = s2255_get_fx2fw(dev);
1986
1987 pr_info("s2255: usb firmware version %d.%d\n",
1988 (fw_ver >> 8) & 0xff,
1989 fw_ver & 0xff);
1990
1991 if (fw_ver < S2255_CUR_USB_FWVER)
1992 pr_info("s2255: newer USB firmware available\n");
1993
1994 for (j = 0; j < MAX_CHANNELS; j++) {
1995 struct s2255_vc *vc = &dev->vc[j];
1996 vc->mode = mode_def;
1997 if (dev->pid == 0x2257 && j > 1)
1998 vc->mode.color |= (1 << 16);
1999 vc->jpegqual = S2255_DEF_JPEG_QUAL;
2000 vc->width = LINE_SZ_4CIFS_NTSC;
2001 vc->height = NUM_LINES_4CIFS_NTSC * 2;
2002 vc->std = V4L2_STD_NTSC_M;
2003 vc->fmt = &formats[0];
2004 vc->mode.restart = 1;
2005 vc->req_image_size = get_transfer_size(&mode_def);
2006 vc->frame_count = 0;
2007 /* create the system buffers */
2008 s2255_create_sys_buffers(vc);
2009 }
2010 /* start read pipe */
2011 s2255_start_readpipe(dev);
2012 dprintk(dev, 1, "%s: success\n", __func__);
2013 return 0;
2014 }
2015
s2255_board_shutdown(struct s2255_dev * dev)2016 static int s2255_board_shutdown(struct s2255_dev *dev)
2017 {
2018 u32 i;
2019 dprintk(dev, 1, "%s: dev: %p", __func__, dev);
2020
2021 for (i = 0; i < MAX_CHANNELS; i++) {
2022 if (vb2_is_streaming(&dev->vc[i].vb_vidq))
2023 s2255_stop_acquire(&dev->vc[i]);
2024 }
2025 s2255_stop_readpipe(dev);
2026 for (i = 0; i < MAX_CHANNELS; i++)
2027 s2255_release_sys_buffers(&dev->vc[i]);
2028 /* release transfer buffer */
2029 kfree(dev->pipe.transfer_buffer);
2030 return 0;
2031 }
2032
read_pipe_completion(struct urb * purb)2033 static void read_pipe_completion(struct urb *purb)
2034 {
2035 struct s2255_pipeinfo *pipe_info;
2036 struct s2255_dev *dev;
2037 int status;
2038 int pipe;
2039 pipe_info = purb->context;
2040 if (pipe_info == NULL) {
2041 dev_err(&purb->dev->dev, "no context!\n");
2042 return;
2043 }
2044 dev = pipe_info->dev;
2045 if (dev == NULL) {
2046 dev_err(&purb->dev->dev, "no context!\n");
2047 return;
2048 }
2049 status = purb->status;
2050 /* if shutting down, do not resubmit, exit immediately */
2051 if (status == -ESHUTDOWN) {
2052 dprintk(dev, 2, "%s: err shutdown\n", __func__);
2053 pipe_info->err_count++;
2054 return;
2055 }
2056
2057 if (pipe_info->state == 0) {
2058 dprintk(dev, 2, "%s: exiting USB pipe", __func__);
2059 return;
2060 }
2061
2062 if (status == 0)
2063 s2255_read_video_callback(dev, pipe_info);
2064 else {
2065 pipe_info->err_count++;
2066 dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
2067 }
2068
2069 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2070 /* reuse urb */
2071 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2072 pipe,
2073 pipe_info->transfer_buffer,
2074 pipe_info->cur_transfer_size,
2075 read_pipe_completion, pipe_info);
2076
2077 if (pipe_info->state != 0) {
2078 if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC))
2079 dev_err(&dev->udev->dev, "error submitting urb\n");
2080 } else {
2081 dprintk(dev, 2, "%s :complete state 0\n", __func__);
2082 }
2083 return;
2084 }
2085
s2255_start_readpipe(struct s2255_dev * dev)2086 static int s2255_start_readpipe(struct s2255_dev *dev)
2087 {
2088 int pipe;
2089 int retval;
2090 struct s2255_pipeinfo *pipe_info = &dev->pipe;
2091 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2092 dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
2093 pipe_info->state = 1;
2094 pipe_info->err_count = 0;
2095 pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
2096 if (!pipe_info->stream_urb)
2097 return -ENOMEM;
2098 /* transfer buffer allocated in board_init */
2099 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2100 pipe,
2101 pipe_info->transfer_buffer,
2102 pipe_info->cur_transfer_size,
2103 read_pipe_completion, pipe_info);
2104 retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
2105 if (retval) {
2106 pr_err("s2255: start read pipe failed\n");
2107 return retval;
2108 }
2109 return 0;
2110 }
2111
2112 /* starts acquisition process */
s2255_start_acquire(struct s2255_vc * vc)2113 static int s2255_start_acquire(struct s2255_vc *vc)
2114 {
2115 int res;
2116 unsigned long chn_rev;
2117 int j;
2118 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2119 __le32 *buffer = dev->cmdbuf;
2120
2121 mutex_lock(&dev->cmdlock);
2122 chn_rev = G_chnmap[vc->idx];
2123 vc->last_frame = -1;
2124 vc->bad_payload = 0;
2125 vc->cur_frame = 0;
2126 for (j = 0; j < SYS_FRAMES; j++) {
2127 vc->buffer.frame[j].ulState = 0;
2128 vc->buffer.frame[j].cur_size = 0;
2129 }
2130
2131 /* send the start command */
2132 buffer[0] = IN_DATA_TOKEN;
2133 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2134 buffer[2] = CMD_START;
2135 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2136 if (res != 0)
2137 dev_err(&dev->udev->dev, "CMD_START error\n");
2138
2139 dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
2140 mutex_unlock(&dev->cmdlock);
2141 return res;
2142 }
2143
s2255_stop_acquire(struct s2255_vc * vc)2144 static int s2255_stop_acquire(struct s2255_vc *vc)
2145 {
2146 int res;
2147 unsigned long chn_rev;
2148 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2149 __le32 *buffer = dev->cmdbuf;
2150
2151 mutex_lock(&dev->cmdlock);
2152 chn_rev = G_chnmap[vc->idx];
2153 /* send the stop command */
2154 buffer[0] = IN_DATA_TOKEN;
2155 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2156 buffer[2] = CMD_STOP;
2157
2158 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2159 if (res != 0)
2160 dev_err(&dev->udev->dev, "CMD_STOP error\n");
2161
2162 dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
2163 mutex_unlock(&dev->cmdlock);
2164 return res;
2165 }
2166
s2255_stop_readpipe(struct s2255_dev * dev)2167 static void s2255_stop_readpipe(struct s2255_dev *dev)
2168 {
2169 struct s2255_pipeinfo *pipe = &dev->pipe;
2170
2171 pipe->state = 0;
2172 if (pipe->stream_urb) {
2173 /* cancel urb */
2174 usb_kill_urb(pipe->stream_urb);
2175 usb_free_urb(pipe->stream_urb);
2176 pipe->stream_urb = NULL;
2177 }
2178 dprintk(dev, 4, "%s", __func__);
2179 return;
2180 }
2181
s2255_fwload_start(struct s2255_dev * dev)2182 static void s2255_fwload_start(struct s2255_dev *dev)
2183 {
2184 s2255_reset_dsppower(dev);
2185 dev->fw_data->fw_size = dev->fw_data->fw->size;
2186 atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2187 memcpy(dev->fw_data->pfw_data,
2188 dev->fw_data->fw->data, CHUNK_SIZE);
2189 dev->fw_data->fw_loaded = CHUNK_SIZE;
2190 usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
2191 usb_sndbulkpipe(dev->udev, 2),
2192 dev->fw_data->pfw_data,
2193 CHUNK_SIZE, s2255_fwchunk_complete,
2194 dev->fw_data);
2195 mod_timer(&dev->timer, jiffies + HZ);
2196 }
2197
2198 /* standard usb probe function */
s2255_probe(struct usb_interface * interface,const struct usb_device_id * id)2199 static int s2255_probe(struct usb_interface *interface,
2200 const struct usb_device_id *id)
2201 {
2202 struct s2255_dev *dev = NULL;
2203 struct usb_host_interface *iface_desc;
2204 struct usb_endpoint_descriptor *endpoint;
2205 int i;
2206 int retval = -ENOMEM;
2207 __le32 *pdata;
2208 int fw_size;
2209
2210 /* allocate memory for our device state and initialize it to zero */
2211 dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
2212 if (dev == NULL) {
2213 s2255_dev_err(&interface->dev, "out of memory\n");
2214 return -ENOMEM;
2215 }
2216
2217 dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
2218 if (dev->cmdbuf == NULL) {
2219 s2255_dev_err(&interface->dev, "out of memory\n");
2220 goto errorFWDATA1;
2221 }
2222
2223 atomic_set(&dev->num_channels, 0);
2224 dev->pid = id->idProduct;
2225 dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
2226 if (!dev->fw_data)
2227 goto errorFWDATA1;
2228 mutex_init(&dev->lock);
2229 mutex_init(&dev->cmdlock);
2230 /* grab usb_device and save it */
2231 dev->udev = usb_get_dev(interface_to_usbdev(interface));
2232 if (dev->udev == NULL) {
2233 dev_err(&interface->dev, "null usb device\n");
2234 retval = -ENODEV;
2235 goto errorUDEV;
2236 }
2237 dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
2238 dev, dev->udev, interface);
2239 dev->interface = interface;
2240 /* set up the endpoint information */
2241 iface_desc = interface->cur_altsetting;
2242 dev_dbg(&interface->dev, "num EP: %d\n",
2243 iface_desc->desc.bNumEndpoints);
2244 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2245 endpoint = &iface_desc->endpoint[i].desc;
2246 if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
2247 /* we found the bulk in endpoint */
2248 dev->read_endpoint = endpoint->bEndpointAddress;
2249 }
2250 }
2251
2252 if (!dev->read_endpoint) {
2253 dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2254 goto errorEP;
2255 }
2256 timer_setup(&dev->timer, s2255_timer, 0);
2257 init_waitqueue_head(&dev->fw_data->wait_fw);
2258 for (i = 0; i < MAX_CHANNELS; i++) {
2259 struct s2255_vc *vc = &dev->vc[i];
2260 vc->idx = i;
2261 vc->dev = dev;
2262 init_waitqueue_head(&vc->wait_setmode);
2263 init_waitqueue_head(&vc->wait_vidstatus);
2264 spin_lock_init(&vc->qlock);
2265 mutex_init(&vc->vb_lock);
2266 }
2267
2268 dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
2269 if (!dev->fw_data->fw_urb)
2270 goto errorFWURB;
2271
2272 dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2273 if (!dev->fw_data->pfw_data) {
2274 dev_err(&interface->dev, "out of memory!\n");
2275 goto errorFWDATA2;
2276 }
2277 /* load the first chunk */
2278 if (request_firmware(&dev->fw_data->fw,
2279 FIRMWARE_FILE_NAME, &dev->udev->dev)) {
2280 dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
2281 goto errorREQFW;
2282 }
2283 /* check the firmware is valid */
2284 fw_size = dev->fw_data->fw->size;
2285 pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2286
2287 if (*pdata != S2255_FW_MARKER) {
2288 dev_err(&interface->dev, "Firmware invalid.\n");
2289 retval = -ENODEV;
2290 goto errorFWMARKER;
2291 } else {
2292 /* make sure firmware is the latest */
2293 __le32 *pRel;
2294 pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2295 pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
2296 dev->dsp_fw_ver = le32_to_cpu(*pRel);
2297 if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
2298 pr_info("s2255: f2255usb.bin out of date.\n");
2299 if (dev->pid == 0x2257 &&
2300 dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
2301 pr_warn("2257 needs firmware %d or above.\n",
2302 S2255_MIN_DSP_COLORFILTER);
2303 }
2304 usb_reset_device(dev->udev);
2305 /* load 2255 board specific */
2306 retval = s2255_board_init(dev);
2307 if (retval)
2308 goto errorBOARDINIT;
2309 s2255_fwload_start(dev);
2310 /* loads v4l specific */
2311 retval = s2255_probe_v4l(dev);
2312 if (retval)
2313 goto errorBOARDINIT;
2314 dev_info(&interface->dev, "Sensoray 2255 detected\n");
2315 return 0;
2316 errorBOARDINIT:
2317 s2255_board_shutdown(dev);
2318 errorFWMARKER:
2319 release_firmware(dev->fw_data->fw);
2320 errorREQFW:
2321 kfree(dev->fw_data->pfw_data);
2322 errorFWDATA2:
2323 usb_free_urb(dev->fw_data->fw_urb);
2324 errorFWURB:
2325 timer_shutdown_sync(&dev->timer);
2326 errorEP:
2327 usb_put_dev(dev->udev);
2328 errorUDEV:
2329 kfree(dev->fw_data);
2330 mutex_destroy(&dev->lock);
2331 errorFWDATA1:
2332 kfree(dev->cmdbuf);
2333 kfree(dev);
2334 pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
2335 return retval;
2336 }
2337
2338 /* disconnect routine. when board is removed physically or with rmmod */
s2255_disconnect(struct usb_interface * interface)2339 static void s2255_disconnect(struct usb_interface *interface)
2340 {
2341 struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
2342 int i;
2343 int channels = atomic_read(&dev->num_channels);
2344 mutex_lock(&dev->lock);
2345 v4l2_device_disconnect(&dev->v4l2_dev);
2346 mutex_unlock(&dev->lock);
2347 /*see comments in the uvc_driver.c usb disconnect function */
2348 atomic_inc(&dev->num_channels);
2349 /* unregister each video device. */
2350 for (i = 0; i < channels; i++)
2351 video_unregister_device(&dev->vc[i].vdev);
2352 /* wake up any of our timers */
2353 atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2354 wake_up(&dev->fw_data->wait_fw);
2355 for (i = 0; i < MAX_CHANNELS; i++) {
2356 dev->vc[i].setmode_ready = 1;
2357 wake_up(&dev->vc[i].wait_setmode);
2358 dev->vc[i].vidstatus_ready = 1;
2359 wake_up(&dev->vc[i].wait_vidstatus);
2360 }
2361 if (atomic_dec_and_test(&dev->num_channels))
2362 s2255_destroy(dev);
2363 dev_info(&interface->dev, "%s\n", __func__);
2364 }
2365
2366 static struct usb_driver s2255_driver = {
2367 .name = S2255_DRIVER_NAME,
2368 .probe = s2255_probe,
2369 .disconnect = s2255_disconnect,
2370 .id_table = s2255_table,
2371 };
2372
2373 module_usb_driver(s2255_driver);
2374
2375 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2376 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2377 MODULE_LICENSE("GPL");
2378 MODULE_VERSION(S2255_VERSION);
2379 MODULE_FIRMWARE(FIRMWARE_FILE_NAME);
2380