This source file includes following definitions.
- to_s2255_dev
- norm_maxw
- norm_maxh
- norm_minw
- norm_minh
- planar422p_to_yuv_packed
- s2255_reset_dsppower
- s2255_timer
- s2255_fwchunk_complete
- s2255_got_frame
- format_by_fourcc
- s2255_fillbuff
- queue_setup
- buffer_prepare
- buffer_queue
- vidioc_querycap
- vidioc_enum_fmt_vid_cap
- vidioc_g_fmt_vid_cap
- vidioc_try_fmt_vid_cap
- vidioc_s_fmt_vid_cap
- s2255_write_config
- get_transfer_size
- s2255_print_cfg
- s2255_set_mode
- s2255_cmd_status
- start_streaming
- stop_streaming
- vidioc_s_std
- vidioc_g_std
- vidioc_enum_input
- vidioc_g_input
- vidioc_s_input
- s2255_s_ctrl
- vidioc_g_jpegcomp
- vidioc_s_jpegcomp
- vidioc_g_parm
- vidioc_s_parm
- vidioc_enum_framesizes
- vidioc_enum_frameintervals
- s2255_open
- s2255_destroy
- s2255_video_device_release
- s2255_probe_v4l
- save_frame
- s2255_read_video_callback
- s2255_vendor_req
- s2255_get_fx2fw
- s2255_create_sys_buffers
- s2255_release_sys_buffers
- s2255_board_init
- s2255_board_shutdown
- read_pipe_completion
- s2255_start_readpipe
- s2255_start_acquire
- s2255_stop_acquire
- s2255_stop_readpipe
- s2255_fwload_start
- s2255_probe
- s2255_disconnect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
47 #define S2255_DEF_JPEG_QUAL 50
48
49 #define S2255_VR_IN 0
50
51 #define S2255_VR_OUT 1
52
53 #define S2255_VR_FW 0x30
54
55 #define S2255_CONFIG_EP 2
56
57 #define S2255_DSP_BOOTTIME 800
58
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
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
91 #define FORMAT_NTSC 1
92 #define FORMAT_PAL 2
93
94 #define SCALE_4CIFS 1
95 #define SCALE_2CIFS 2
96 #define SCALE_1CIFS 3
97
98 #define SCALE_4CIFSI 4
99
100 #define COLOR_YUVPL 1
101 #define COLOR_YUVPK 2
102 #define COLOR_Y8 4
103 #define COLOR_JPG 5
104
105 #define MASK_COLOR 0x000000ff
106 #define MASK_JPG_QUALITY 0x0000ff00
107 #define MASK_INPUT_TYPE 0x000f0000
108
109 #define FDEC_1 1
110 #define FDEC_2 2
111 #define FDEC_3 3
112 #define FDEC_5 5
113
114
115
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
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;
135 u32 scale;
136 u32 color;
137 u32 fdec;
138 u32 bright;
139 u32 contrast;
140 u32 saturation;
141 u32 hue;
142 u32 single;
143 u32 usb_block;
144 u32 restart;
145 };
146
147
148 #define S2255_READ_IDLE 0
149 #define S2255_READ_FRAME 1
150
151
152 struct s2255_framei {
153 unsigned long size;
154 unsigned long ulState;
155 void *lpvbits;
156 unsigned long cur_size;
157 };
158
159
160 struct s2255_bufferi {
161 unsigned long dwFrames;
162 struct s2255_framei frame[SYS_FRAMES];
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
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
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;
196 u32 err_count;
197 u32 idx;
198 };
199
200 struct s2255_fmt;
201 struct s2255_dev;
202
203
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
215 unsigned jpegqual;
216
217 struct v4l2_captureparm cap_parm;
218 int cur_frame;
219 int last_frame;
220
221 unsigned long req_image_size;
222
223 unsigned long pkt_size;
224 int bad_payload;
225 unsigned long frame_count;
226
227 int jpg_size;
228
229 int configured;
230 wait_queue_head_t wait_setmode;
231 int setmode_ready;
232
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;
241 struct vb2_queue vb_vidq;
242 struct mutex vb_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;
253 struct mutex cmdlock;
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;
261 int frame_ready;
262 int chn_ready;
263
264 int dsp_fw_ver;
265 u16 pid;
266 #define S2255_CMDBUF_SIZE 512
267 __le32 *cmdbuf;
268 };
269
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
281 struct s2255_buffer {
282
283 struct vb2_v4l2_buffer vb;
284 struct list_head list;
285 };
286
287
288
289 #define S2255_CUR_USB_FWVER ((3 << 8) | 12)
290
291 #define S2255_CUR_DSP_FWVER 10104
292
293 #define S2255_MIN_DSP_STATUS 5
294 #define S2255_MIN_DSP_COLORFILTER 8
295 #define S2255_NORMS (V4L2_STD_ALL)
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
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
328 #define PREFIX_SIZE 512
329
330
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
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
360 static int video_nr = -1;
361
362
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
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)},
377 { }
378 };
379 MODULE_DEVICE_TABLE(usb, s2255_table);
380
381 #define BUFFER_TIMEOUT msecs_to_jiffies(400)
382
383
384
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
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
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
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
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
436
437
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
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
471
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
480 wake_up(&data->wait_fw);
481 return;
482 }
483 }
484
485
486
487
488
489
490
491
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
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
508 wake_up(&data->wait_fw);
509 return;
510 }
511 #define CHUNK_SIZE 512
512
513
514
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
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
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
565 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
566 dprintk(dev, 2, "%s: [buf] [%p]\n", __func__, buf);
567 }
568
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
585
586
587
588
589
590
591
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
642
643
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
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
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
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
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
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
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 field = f->fmt.pix.field;
771
772 dprintk(vc->dev, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
773 __func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
774 if (is_ntsc) {
775
776 if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
777 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
778 field = V4L2_FIELD_INTERLACED;
779 } else {
780 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
781 field = V4L2_FIELD_TOP;
782 }
783 if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
784 f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
785 else
786 f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
787 } else {
788
789 if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
790 f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
791 field = V4L2_FIELD_INTERLACED;
792 } else {
793 f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
794 field = V4L2_FIELD_TOP;
795 }
796 if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
797 f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
798 else
799 f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
800 }
801 f->fmt.pix.field = field;
802 f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
803 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
804 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
805 dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
806 f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
807 return 0;
808 }
809
810 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
811 struct v4l2_format *f)
812 {
813 struct s2255_vc *vc = video_drvdata(file);
814 const struct s2255_fmt *fmt;
815 struct vb2_queue *q = &vc->vb_vidq;
816 struct s2255_mode mode;
817 int ret;
818
819 ret = vidioc_try_fmt_vid_cap(file, vc, f);
820
821 if (ret < 0)
822 return ret;
823
824 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
825
826 if (fmt == NULL)
827 return -EINVAL;
828
829 if (vb2_is_busy(q)) {
830 dprintk(vc->dev, 1, "queue busy\n");
831 return -EBUSY;
832 }
833
834 mode = vc->mode;
835 vc->fmt = fmt;
836 vc->width = f->fmt.pix.width;
837 vc->height = f->fmt.pix.height;
838 vc->field = f->fmt.pix.field;
839 if (vc->width > norm_minw(vc)) {
840 if (vc->height > norm_minh(vc)) {
841 if (vc->cap_parm.capturemode &
842 V4L2_MODE_HIGHQUALITY)
843 mode.scale = SCALE_4CIFSI;
844 else
845 mode.scale = SCALE_4CIFS;
846 } else
847 mode.scale = SCALE_2CIFS;
848
849 } else {
850 mode.scale = SCALE_1CIFS;
851 }
852
853 switch (vc->fmt->fourcc) {
854 case V4L2_PIX_FMT_GREY:
855 mode.color &= ~MASK_COLOR;
856 mode.color |= COLOR_Y8;
857 break;
858 case V4L2_PIX_FMT_JPEG:
859 case V4L2_PIX_FMT_MJPEG:
860 mode.color &= ~MASK_COLOR;
861 mode.color |= COLOR_JPG;
862 mode.color |= (vc->jpegqual << 8);
863 break;
864 case V4L2_PIX_FMT_YUV422P:
865 mode.color &= ~MASK_COLOR;
866 mode.color |= COLOR_YUVPL;
867 break;
868 case V4L2_PIX_FMT_YUYV:
869 case V4L2_PIX_FMT_UYVY:
870 default:
871 mode.color &= ~MASK_COLOR;
872 mode.color |= COLOR_YUVPK;
873 break;
874 }
875 if ((mode.color & MASK_COLOR) != (vc->mode.color & MASK_COLOR))
876 mode.restart = 1;
877 else if (mode.scale != vc->mode.scale)
878 mode.restart = 1;
879 else if (mode.format != vc->mode.format)
880 mode.restart = 1;
881 vc->mode = mode;
882 (void) s2255_set_mode(vc, &mode);
883 return 0;
884 }
885
886
887
888 static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
889 int size)
890 {
891 int pipe;
892 int done;
893 long retval = -1;
894 if (udev) {
895 pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
896 retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
897 }
898 return retval;
899 }
900
901 static u32 get_transfer_size(struct s2255_mode *mode)
902 {
903 int linesPerFrame = LINE_SZ_DEF;
904 int pixelsPerLine = NUM_LINES_DEF;
905 u32 outImageSize;
906 u32 usbInSize;
907 unsigned int mask_mult;
908
909 if (mode == NULL)
910 return 0;
911
912 if (mode->format == FORMAT_NTSC) {
913 switch (mode->scale) {
914 case SCALE_4CIFS:
915 case SCALE_4CIFSI:
916 linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
917 pixelsPerLine = LINE_SZ_4CIFS_NTSC;
918 break;
919 case SCALE_2CIFS:
920 linesPerFrame = NUM_LINES_2CIFS_NTSC;
921 pixelsPerLine = LINE_SZ_2CIFS_NTSC;
922 break;
923 case SCALE_1CIFS:
924 linesPerFrame = NUM_LINES_1CIFS_NTSC;
925 pixelsPerLine = LINE_SZ_1CIFS_NTSC;
926 break;
927 default:
928 break;
929 }
930 } else if (mode->format == FORMAT_PAL) {
931 switch (mode->scale) {
932 case SCALE_4CIFS:
933 case SCALE_4CIFSI:
934 linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
935 pixelsPerLine = LINE_SZ_4CIFS_PAL;
936 break;
937 case SCALE_2CIFS:
938 linesPerFrame = NUM_LINES_2CIFS_PAL;
939 pixelsPerLine = LINE_SZ_2CIFS_PAL;
940 break;
941 case SCALE_1CIFS:
942 linesPerFrame = NUM_LINES_1CIFS_PAL;
943 pixelsPerLine = LINE_SZ_1CIFS_PAL;
944 break;
945 default:
946 break;
947 }
948 }
949 outImageSize = linesPerFrame * pixelsPerLine;
950 if ((mode->color & MASK_COLOR) != COLOR_Y8) {
951
952 outImageSize *= 2;
953 }
954
955
956
957 usbInSize = outImageSize + PREFIX_SIZE;
958 mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
959
960 if (usbInSize & ~mask_mult)
961 usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
962 return usbInSize;
963 }
964
965 static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
966 {
967 struct device *dev = &sdev->udev->dev;
968 dev_info(dev, "------------------------------------------------\n");
969 dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
970 dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
971 dev_info(dev, "bright: 0x%x\n", mode->bright);
972 dev_info(dev, "------------------------------------------------\n");
973 }
974
975
976
977
978
979
980
981
982
983 static int s2255_set_mode(struct s2255_vc *vc,
984 struct s2255_mode *mode)
985 {
986 int res;
987 unsigned long chn_rev;
988 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
989 int i;
990 __le32 *buffer = dev->cmdbuf;
991
992 mutex_lock(&dev->cmdlock);
993 chn_rev = G_chnmap[vc->idx];
994 dprintk(dev, 3, "%s channel: %d\n", __func__, vc->idx);
995
996 if ((mode->color & MASK_COLOR) == COLOR_JPG) {
997 mode->color &= ~MASK_COLOR;
998 mode->color |= COLOR_JPG;
999 mode->color &= ~MASK_JPG_QUALITY;
1000 mode->color |= (vc->jpegqual << 8);
1001 }
1002
1003 vc->mode = *mode;
1004 vc->req_image_size = get_transfer_size(mode);
1005 dprintk(dev, 1, "%s: reqsize %ld\n", __func__, vc->req_image_size);
1006
1007 buffer[0] = IN_DATA_TOKEN;
1008 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1009 buffer[2] = CMD_SET_MODE;
1010 for (i = 0; i < sizeof(struct s2255_mode) / sizeof(u32); i++)
1011 buffer[3 + i] = cpu_to_le32(((u32 *)&vc->mode)[i]);
1012 vc->setmode_ready = 0;
1013 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1014 if (debug)
1015 s2255_print_cfg(dev, mode);
1016
1017 if (mode->restart) {
1018 wait_event_timeout(vc->wait_setmode,
1019 (vc->setmode_ready != 0),
1020 msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
1021 if (vc->setmode_ready != 1) {
1022 dprintk(dev, 0, "s2255: no set mode response\n");
1023 res = -EFAULT;
1024 }
1025 }
1026
1027 vc->mode.restart = 0;
1028 dprintk(dev, 1, "%s chn %d, result: %d\n", __func__, vc->idx, res);
1029 mutex_unlock(&dev->cmdlock);
1030 return res;
1031 }
1032
1033 static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
1034 {
1035 int res;
1036 u32 chn_rev;
1037 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
1038 __le32 *buffer = dev->cmdbuf;
1039
1040 mutex_lock(&dev->cmdlock);
1041 chn_rev = G_chnmap[vc->idx];
1042 dprintk(dev, 4, "%s chan %d\n", __func__, vc->idx);
1043
1044 buffer[0] = IN_DATA_TOKEN;
1045 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1046 buffer[2] = CMD_STATUS;
1047 *pstatus = 0;
1048 vc->vidstatus_ready = 0;
1049 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1050 wait_event_timeout(vc->wait_vidstatus,
1051 (vc->vidstatus_ready != 0),
1052 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
1053 if (vc->vidstatus_ready != 1) {
1054 dprintk(dev, 0, "s2255: no vidstatus response\n");
1055 res = -EFAULT;
1056 }
1057 *pstatus = vc->vidstatus;
1058 dprintk(dev, 4, "%s, vid status %d\n", __func__, *pstatus);
1059 mutex_unlock(&dev->cmdlock);
1060 return res;
1061 }
1062
1063 static int start_streaming(struct vb2_queue *vq, unsigned int count)
1064 {
1065 struct s2255_vc *vc = vb2_get_drv_priv(vq);
1066 int j;
1067
1068 vc->last_frame = -1;
1069 vc->bad_payload = 0;
1070 vc->cur_frame = 0;
1071 vc->frame_count = 0;
1072 for (j = 0; j < SYS_FRAMES; j++) {
1073 vc->buffer.frame[j].ulState = S2255_READ_IDLE;
1074 vc->buffer.frame[j].cur_size = 0;
1075 }
1076 return s2255_start_acquire(vc);
1077 }
1078
1079
1080 static void stop_streaming(struct vb2_queue *vq)
1081 {
1082 struct s2255_vc *vc = vb2_get_drv_priv(vq);
1083 struct s2255_buffer *buf, *node;
1084 unsigned long flags;
1085 (void) s2255_stop_acquire(vc);
1086 spin_lock_irqsave(&vc->qlock, flags);
1087 list_for_each_entry_safe(buf, node, &vc->buf_list, list) {
1088 list_del(&buf->list);
1089 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
1090 dprintk(vc->dev, 2, "[%p/%d] done\n",
1091 buf, buf->vb.vb2_buf.index);
1092 }
1093 spin_unlock_irqrestore(&vc->qlock, flags);
1094 }
1095
1096 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
1097 {
1098 struct s2255_vc *vc = video_drvdata(file);
1099 struct s2255_mode mode;
1100 struct vb2_queue *q = &vc->vb_vidq;
1101
1102
1103
1104
1105
1106 if (vb2_is_busy(q))
1107 return -EBUSY;
1108
1109 mode = vc->mode;
1110 if (i & V4L2_STD_525_60) {
1111 dprintk(vc->dev, 4, "%s 60 Hz\n", __func__);
1112
1113 if (mode.format != FORMAT_NTSC) {
1114 mode.restart = 1;
1115 mode.format = FORMAT_NTSC;
1116 mode.fdec = FDEC_1;
1117 vc->width = LINE_SZ_4CIFS_NTSC;
1118 vc->height = NUM_LINES_4CIFS_NTSC * 2;
1119 }
1120 } else if (i & V4L2_STD_625_50) {
1121 dprintk(vc->dev, 4, "%s 50 Hz\n", __func__);
1122 if (mode.format != FORMAT_PAL) {
1123 mode.restart = 1;
1124 mode.format = FORMAT_PAL;
1125 mode.fdec = FDEC_1;
1126 vc->width = LINE_SZ_4CIFS_PAL;
1127 vc->height = NUM_LINES_4CIFS_PAL * 2;
1128 }
1129 } else
1130 return -EINVAL;
1131 vc->std = i;
1132 if (mode.restart)
1133 s2255_set_mode(vc, &mode);
1134 return 0;
1135 }
1136
1137 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
1138 {
1139 struct s2255_vc *vc = video_drvdata(file);
1140
1141 *i = vc->std;
1142 return 0;
1143 }
1144
1145
1146
1147
1148
1149
1150
1151
1152 static int vidioc_enum_input(struct file *file, void *priv,
1153 struct v4l2_input *inp)
1154 {
1155 struct s2255_vc *vc = video_drvdata(file);
1156 struct s2255_dev *dev = vc->dev;
1157 u32 status = 0;
1158
1159 if (inp->index != 0)
1160 return -EINVAL;
1161 inp->type = V4L2_INPUT_TYPE_CAMERA;
1162 inp->std = S2255_NORMS;
1163 inp->status = 0;
1164 if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1165 int rc;
1166 rc = s2255_cmd_status(vc, &status);
1167 dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
1168 rc, status);
1169 if (rc == 0)
1170 inp->status = (status & 0x01) ? 0
1171 : V4L2_IN_ST_NO_SIGNAL;
1172 }
1173 switch (dev->pid) {
1174 case 0x2255:
1175 default:
1176 strscpy(inp->name, "Composite", sizeof(inp->name));
1177 break;
1178 case 0x2257:
1179 strscpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
1180 sizeof(inp->name));
1181 break;
1182 }
1183 return 0;
1184 }
1185
1186 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1187 {
1188 *i = 0;
1189 return 0;
1190 }
1191 static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1192 {
1193 if (i > 0)
1194 return -EINVAL;
1195 return 0;
1196 }
1197
1198 static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
1199 {
1200 struct s2255_vc *vc =
1201 container_of(ctrl->handler, struct s2255_vc, hdl);
1202 struct s2255_mode mode;
1203 mode = vc->mode;
1204
1205 switch (ctrl->id) {
1206 case V4L2_CID_BRIGHTNESS:
1207 mode.bright = ctrl->val;
1208 break;
1209 case V4L2_CID_CONTRAST:
1210 mode.contrast = ctrl->val;
1211 break;
1212 case V4L2_CID_HUE:
1213 mode.hue = ctrl->val;
1214 break;
1215 case V4L2_CID_SATURATION:
1216 mode.saturation = ctrl->val;
1217 break;
1218 case V4L2_CID_S2255_COLORFILTER:
1219 mode.color &= ~MASK_INPUT_TYPE;
1220 mode.color |= !ctrl->val << 16;
1221 break;
1222 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1223 vc->jpegqual = ctrl->val;
1224 return 0;
1225 default:
1226 return -EINVAL;
1227 }
1228 mode.restart = 0;
1229
1230
1231
1232
1233 s2255_set_mode(vc, &mode);
1234 return 0;
1235 }
1236
1237 static int vidioc_g_jpegcomp(struct file *file, void *priv,
1238 struct v4l2_jpegcompression *jc)
1239 {
1240 struct s2255_vc *vc = video_drvdata(file);
1241
1242 memset(jc, 0, sizeof(*jc));
1243 jc->quality = vc->jpegqual;
1244 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1245 return 0;
1246 }
1247
1248 static int vidioc_s_jpegcomp(struct file *file, void *priv,
1249 const struct v4l2_jpegcompression *jc)
1250 {
1251 struct s2255_vc *vc = video_drvdata(file);
1252
1253 if (jc->quality < 0 || jc->quality > 100)
1254 return -EINVAL;
1255 v4l2_ctrl_s_ctrl(vc->jpegqual_ctrl, jc->quality);
1256 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1257 return 0;
1258 }
1259
1260 static int vidioc_g_parm(struct file *file, void *priv,
1261 struct v4l2_streamparm *sp)
1262 {
1263 __u32 def_num, def_dem;
1264 struct s2255_vc *vc = video_drvdata(file);
1265
1266 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1267 return -EINVAL;
1268 sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1269 sp->parm.capture.capturemode = vc->cap_parm.capturemode;
1270 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1271 def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1272 def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1273 sp->parm.capture.timeperframe.denominator = def_dem;
1274 switch (vc->mode.fdec) {
1275 default:
1276 case FDEC_1:
1277 sp->parm.capture.timeperframe.numerator = def_num;
1278 break;
1279 case FDEC_2:
1280 sp->parm.capture.timeperframe.numerator = def_num * 2;
1281 break;
1282 case FDEC_3:
1283 sp->parm.capture.timeperframe.numerator = def_num * 3;
1284 break;
1285 case FDEC_5:
1286 sp->parm.capture.timeperframe.numerator = def_num * 5;
1287 break;
1288 }
1289 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
1290 __func__,
1291 sp->parm.capture.capturemode,
1292 sp->parm.capture.timeperframe.numerator,
1293 sp->parm.capture.timeperframe.denominator);
1294 return 0;
1295 }
1296
1297 static int vidioc_s_parm(struct file *file, void *priv,
1298 struct v4l2_streamparm *sp)
1299 {
1300 struct s2255_vc *vc = video_drvdata(file);
1301 struct s2255_mode mode;
1302 int fdec = FDEC_1;
1303 __u32 def_num, def_dem;
1304 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1305 return -EINVAL;
1306 mode = vc->mode;
1307
1308 if ((vc->cap_parm.capturemode != sp->parm.capture.capturemode)
1309 && vb2_is_streaming(&vc->vb_vidq))
1310 return -EBUSY;
1311 def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
1312 def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
1313 if (def_dem != sp->parm.capture.timeperframe.denominator)
1314 sp->parm.capture.timeperframe.numerator = def_num;
1315 else if (sp->parm.capture.timeperframe.numerator <= def_num)
1316 sp->parm.capture.timeperframe.numerator = def_num;
1317 else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
1318 sp->parm.capture.timeperframe.numerator = def_num * 2;
1319 fdec = FDEC_2;
1320 } else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
1321 sp->parm.capture.timeperframe.numerator = def_num * 3;
1322 fdec = FDEC_3;
1323 } else {
1324 sp->parm.capture.timeperframe.numerator = def_num * 5;
1325 fdec = FDEC_5;
1326 }
1327 mode.fdec = fdec;
1328 sp->parm.capture.timeperframe.denominator = def_dem;
1329 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1330 s2255_set_mode(vc, &mode);
1331 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1332 __func__,
1333 sp->parm.capture.capturemode,
1334 sp->parm.capture.timeperframe.numerator,
1335 sp->parm.capture.timeperframe.denominator, fdec);
1336 return 0;
1337 }
1338
1339 #define NUM_SIZE_ENUMS 3
1340 static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1341 { 640, 480 },
1342 { 640, 240 },
1343 { 320, 240 },
1344 };
1345 static const struct v4l2_frmsize_discrete pal_sizes[] = {
1346 { 704, 576 },
1347 { 704, 288 },
1348 { 352, 288 },
1349 };
1350
1351 static int vidioc_enum_framesizes(struct file *file, void *priv,
1352 struct v4l2_frmsizeenum *fe)
1353 {
1354 struct s2255_vc *vc = video_drvdata(file);
1355 int is_ntsc = vc->std & V4L2_STD_525_60;
1356 const struct s2255_fmt *fmt;
1357
1358 if (fe->index >= NUM_SIZE_ENUMS)
1359 return -EINVAL;
1360
1361 fmt = format_by_fourcc(fe->pixel_format);
1362 if (fmt == NULL)
1363 return -EINVAL;
1364 fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1365 fe->discrete = is_ntsc ? ntsc_sizes[fe->index] : pal_sizes[fe->index];
1366 return 0;
1367 }
1368
1369 static int vidioc_enum_frameintervals(struct file *file, void *priv,
1370 struct v4l2_frmivalenum *fe)
1371 {
1372 struct s2255_vc *vc = video_drvdata(file);
1373 const struct s2255_fmt *fmt;
1374 const struct v4l2_frmsize_discrete *sizes;
1375 int is_ntsc = vc->std & V4L2_STD_525_60;
1376 #define NUM_FRAME_ENUMS 4
1377 int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1378 int i;
1379
1380 if (fe->index >= NUM_FRAME_ENUMS)
1381 return -EINVAL;
1382
1383 fmt = format_by_fourcc(fe->pixel_format);
1384 if (fmt == NULL)
1385 return -EINVAL;
1386
1387 sizes = is_ntsc ? ntsc_sizes : pal_sizes;
1388 for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
1389 if (fe->width == sizes->width &&
1390 fe->height == sizes->height)
1391 break;
1392 if (i == NUM_SIZE_ENUMS)
1393 return -EINVAL;
1394
1395 fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1396 fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1397 fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1398 dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
1399 fe->discrete.numerator,
1400 fe->discrete.denominator);
1401 return 0;
1402 }
1403
1404 static int s2255_open(struct file *file)
1405 {
1406 struct s2255_vc *vc = video_drvdata(file);
1407 struct s2255_dev *dev = vc->dev;
1408 int state;
1409 int rc = 0;
1410
1411 rc = v4l2_fh_open(file);
1412 if (rc != 0)
1413 return rc;
1414
1415 dprintk(dev, 1, "s2255: %s\n", __func__);
1416 state = atomic_read(&dev->fw_data->fw_state);
1417 switch (state) {
1418 case S2255_FW_DISCONNECTING:
1419 return -ENODEV;
1420 case S2255_FW_FAILED:
1421 s2255_dev_err(&dev->udev->dev,
1422 "firmware load failed. retrying.\n");
1423 s2255_fwload_start(dev);
1424 wait_event_timeout(dev->fw_data->wait_fw,
1425 ((atomic_read(&dev->fw_data->fw_state)
1426 == S2255_FW_SUCCESS) ||
1427 (atomic_read(&dev->fw_data->fw_state)
1428 == S2255_FW_DISCONNECTING)),
1429 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1430
1431 state = atomic_read(&dev->fw_data->fw_state);
1432 break;
1433 case S2255_FW_NOTLOADED:
1434 case S2255_FW_LOADED_DSPWAIT:
1435
1436
1437 pr_info("%s waiting for firmware load\n", __func__);
1438 wait_event_timeout(dev->fw_data->wait_fw,
1439 ((atomic_read(&dev->fw_data->fw_state)
1440 == S2255_FW_SUCCESS) ||
1441 (atomic_read(&dev->fw_data->fw_state)
1442 == S2255_FW_DISCONNECTING)),
1443 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1444
1445 state = atomic_read(&dev->fw_data->fw_state);
1446 break;
1447 case S2255_FW_SUCCESS:
1448 default:
1449 break;
1450 }
1451
1452 switch (state) {
1453 case S2255_FW_SUCCESS:
1454 break;
1455 case S2255_FW_FAILED:
1456 pr_info("2255 firmware load failed.\n");
1457 return -ENODEV;
1458 case S2255_FW_DISCONNECTING:
1459 pr_info("%s: disconnecting\n", __func__);
1460 return -ENODEV;
1461 case S2255_FW_LOADED_DSPWAIT:
1462 case S2255_FW_NOTLOADED:
1463 pr_info("%s: firmware not loaded, please retry\n",
1464 __func__);
1465
1466
1467
1468
1469
1470 atomic_set(&dev->fw_data->fw_state,
1471 S2255_FW_FAILED);
1472 return -EAGAIN;
1473 default:
1474 pr_info("%s: unknown state\n", __func__);
1475 return -EFAULT;
1476 }
1477 if (!vc->configured) {
1478
1479 vc->fmt = &formats[0];
1480 s2255_set_mode(vc, &vc->mode);
1481 vc->configured = 1;
1482 }
1483 return 0;
1484 }
1485
1486 static void s2255_destroy(struct s2255_dev *dev)
1487 {
1488 dprintk(dev, 1, "%s", __func__);
1489
1490 s2255_board_shutdown(dev);
1491
1492 del_timer_sync(&dev->timer);
1493 if (dev->fw_data->fw_urb) {
1494 usb_kill_urb(dev->fw_data->fw_urb);
1495 usb_free_urb(dev->fw_data->fw_urb);
1496 dev->fw_data->fw_urb = NULL;
1497 }
1498 release_firmware(dev->fw_data->fw);
1499 kfree(dev->fw_data->pfw_data);
1500 kfree(dev->fw_data);
1501
1502 s2255_reset_dsppower(dev);
1503 mutex_destroy(&dev->lock);
1504 usb_put_dev(dev->udev);
1505 v4l2_device_unregister(&dev->v4l2_dev);
1506 kfree(dev->cmdbuf);
1507 kfree(dev);
1508 }
1509
1510 static const struct v4l2_file_operations s2255_fops_v4l = {
1511 .owner = THIS_MODULE,
1512 .open = s2255_open,
1513 .release = vb2_fop_release,
1514 .poll = vb2_fop_poll,
1515 .unlocked_ioctl = video_ioctl2,
1516 .mmap = vb2_fop_mmap,
1517 .read = vb2_fop_read,
1518 };
1519
1520 static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1521 .vidioc_querycap = vidioc_querycap,
1522 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1523 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1524 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1525 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1526 .vidioc_reqbufs = vb2_ioctl_reqbufs,
1527 .vidioc_querybuf = vb2_ioctl_querybuf,
1528 .vidioc_qbuf = vb2_ioctl_qbuf,
1529 .vidioc_dqbuf = vb2_ioctl_dqbuf,
1530 .vidioc_s_std = vidioc_s_std,
1531 .vidioc_g_std = vidioc_g_std,
1532 .vidioc_enum_input = vidioc_enum_input,
1533 .vidioc_g_input = vidioc_g_input,
1534 .vidioc_s_input = vidioc_s_input,
1535 .vidioc_streamon = vb2_ioctl_streamon,
1536 .vidioc_streamoff = vb2_ioctl_streamoff,
1537 .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1538 .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1539 .vidioc_s_parm = vidioc_s_parm,
1540 .vidioc_g_parm = vidioc_g_parm,
1541 .vidioc_enum_framesizes = vidioc_enum_framesizes,
1542 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1543 .vidioc_log_status = v4l2_ctrl_log_status,
1544 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1545 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1546 };
1547
1548 static void s2255_video_device_release(struct video_device *vdev)
1549 {
1550 struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
1551 struct s2255_vc *vc =
1552 container_of(vdev, struct s2255_vc, vdev);
1553
1554 dprintk(dev, 4, "%s, chnls: %d\n", __func__,
1555 atomic_read(&dev->num_channels));
1556
1557 v4l2_ctrl_handler_free(&vc->hdl);
1558
1559 if (atomic_dec_and_test(&dev->num_channels))
1560 s2255_destroy(dev);
1561 return;
1562 }
1563
1564 static const struct video_device template = {
1565 .name = "s2255v",
1566 .fops = &s2255_fops_v4l,
1567 .ioctl_ops = &s2255_ioctl_ops,
1568 .release = s2255_video_device_release,
1569 .tvnorms = S2255_NORMS,
1570 };
1571
1572 static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1573 .s_ctrl = s2255_s_ctrl,
1574 };
1575
1576 static const struct v4l2_ctrl_config color_filter_ctrl = {
1577 .ops = &s2255_ctrl_ops,
1578 .name = "Color Filter",
1579 .id = V4L2_CID_S2255_COLORFILTER,
1580 .type = V4L2_CTRL_TYPE_BOOLEAN,
1581 .max = 1,
1582 .step = 1,
1583 .def = 1,
1584 };
1585
1586 static int s2255_probe_v4l(struct s2255_dev *dev)
1587 {
1588 int ret;
1589 int i;
1590 int cur_nr = video_nr;
1591 struct s2255_vc *vc;
1592 struct vb2_queue *q;
1593
1594 ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
1595 if (ret)
1596 return ret;
1597
1598
1599 for (i = 0; i < MAX_CHANNELS; i++) {
1600 vc = &dev->vc[i];
1601 INIT_LIST_HEAD(&vc->buf_list);
1602
1603 v4l2_ctrl_handler_init(&vc->hdl, 6);
1604 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1605 V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
1606 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1607 V4L2_CID_CONTRAST, 0, 255, 1, DEF_CONTRAST);
1608 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1609 V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION);
1610 v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1611 V4L2_CID_HUE, 0, 255, 1, DEF_HUE);
1612 vc->jpegqual_ctrl = v4l2_ctrl_new_std(&vc->hdl,
1613 &s2255_ctrl_ops,
1614 V4L2_CID_JPEG_COMPRESSION_QUALITY,
1615 0, 100, 1, S2255_DEF_JPEG_QUAL);
1616 if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER &&
1617 (dev->pid != 0x2257 || vc->idx <= 1))
1618 v4l2_ctrl_new_custom(&vc->hdl, &color_filter_ctrl,
1619 NULL);
1620 if (vc->hdl.error) {
1621 ret = vc->hdl.error;
1622 v4l2_ctrl_handler_free(&vc->hdl);
1623 dev_err(&dev->udev->dev, "couldn't register control\n");
1624 break;
1625 }
1626 q = &vc->vb_vidq;
1627 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1628 q->io_modes = VB2_MMAP | VB2_READ | VB2_USERPTR;
1629 q->drv_priv = vc;
1630 q->lock = &vc->vb_lock;
1631 q->buf_struct_size = sizeof(struct s2255_buffer);
1632 q->mem_ops = &vb2_vmalloc_memops;
1633 q->ops = &s2255_video_qops;
1634 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1635 ret = vb2_queue_init(q);
1636 if (ret != 0) {
1637 dev_err(&dev->udev->dev,
1638 "%s vb2_queue_init 0x%x\n", __func__, ret);
1639 break;
1640 }
1641
1642 vc->vdev = template;
1643 vc->vdev.queue = q;
1644 vc->vdev.ctrl_handler = &vc->hdl;
1645 vc->vdev.lock = &dev->lock;
1646 vc->vdev.v4l2_dev = &dev->v4l2_dev;
1647 vc->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE |
1648 V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
1649 video_set_drvdata(&vc->vdev, vc);
1650 if (video_nr == -1)
1651 ret = video_register_device(&vc->vdev,
1652 VFL_TYPE_GRABBER,
1653 video_nr);
1654 else
1655 ret = video_register_device(&vc->vdev,
1656 VFL_TYPE_GRABBER,
1657 cur_nr + i);
1658
1659 if (ret) {
1660 dev_err(&dev->udev->dev,
1661 "failed to register video device!\n");
1662 break;
1663 }
1664 atomic_inc(&dev->num_channels);
1665 v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1666 video_device_node_name(&vc->vdev));
1667
1668 }
1669 pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1670 S2255_VERSION);
1671
1672 if (atomic_read(&dev->num_channels) == 0) {
1673 v4l2_device_unregister(&dev->v4l2_dev);
1674 return ret;
1675 }
1676 if (atomic_read(&dev->num_channels) != MAX_CHANNELS)
1677 pr_warn("s2255: Not all channels available.\n");
1678 return 0;
1679 }
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692 static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1693 {
1694 char *pdest;
1695 u32 offset = 0;
1696 int bframe = 0;
1697 char *psrc;
1698 unsigned long copy_size;
1699 unsigned long size;
1700 s32 idx = -1;
1701 struct s2255_framei *frm;
1702 unsigned char *pdata;
1703 struct s2255_vc *vc;
1704 dprintk(dev, 100, "buffer to user\n");
1705 vc = &dev->vc[dev->cc];
1706 idx = vc->cur_frame;
1707 frm = &vc->buffer.frame[idx];
1708 if (frm->ulState == S2255_READ_IDLE) {
1709 int jj;
1710 unsigned int cc;
1711 __le32 *pdword;
1712 int payload;
1713
1714 pdata = (unsigned char *)pipe_info->transfer_buffer;
1715 pdword = (__le32 *)pdata;
1716 for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
1717 switch (*pdword) {
1718 case S2255_MARKER_FRAME:
1719 dprintk(dev, 4, "marker @ offset: %d [%x %x]\n",
1720 jj, pdata[0], pdata[1]);
1721 offset = jj + PREFIX_SIZE;
1722 bframe = 1;
1723 cc = le32_to_cpu(pdword[1]);
1724 if (cc >= MAX_CHANNELS) {
1725 dprintk(dev, 0,
1726 "bad channel\n");
1727 return -EINVAL;
1728 }
1729
1730 dev->cc = G_chnmap[cc];
1731 vc = &dev->vc[dev->cc];
1732 payload = le32_to_cpu(pdword[3]);
1733 if (payload > vc->req_image_size) {
1734 vc->bad_payload++;
1735
1736 return -EINVAL;
1737 }
1738 vc->pkt_size = payload;
1739 vc->jpg_size = le32_to_cpu(pdword[4]);
1740 break;
1741 case S2255_MARKER_RESPONSE:
1742
1743 pdata += DEF_USB_BLOCK;
1744 jj += DEF_USB_BLOCK;
1745 if (le32_to_cpu(pdword[1]) >= MAX_CHANNELS)
1746 break;
1747 cc = G_chnmap[le32_to_cpu(pdword[1])];
1748 if (cc >= MAX_CHANNELS)
1749 break;
1750 vc = &dev->vc[cc];
1751 switch (pdword[2]) {
1752 case S2255_RESPONSE_SETMODE:
1753
1754
1755 vc->setmode_ready = 1;
1756 wake_up(&vc->wait_setmode);
1757 dprintk(dev, 5, "setmode rdy %d\n", cc);
1758 break;
1759 case S2255_RESPONSE_FW:
1760 dev->chn_ready |= (1 << cc);
1761 if ((dev->chn_ready & 0x0f) != 0x0f)
1762 break;
1763
1764 pr_info("s2255: fw loaded\n");
1765 atomic_set(&dev->fw_data->fw_state,
1766 S2255_FW_SUCCESS);
1767 wake_up(&dev->fw_data->wait_fw);
1768 break;
1769 case S2255_RESPONSE_STATUS:
1770 vc->vidstatus = le32_to_cpu(pdword[3]);
1771 vc->vidstatus_ready = 1;
1772 wake_up(&vc->wait_vidstatus);
1773 dprintk(dev, 5, "vstat %x chan %d\n",
1774 le32_to_cpu(pdword[3]), cc);
1775 break;
1776 default:
1777 pr_info("s2255 unknown resp\n");
1778 }
1779 pdata++;
1780 break;
1781 default:
1782 pdata++;
1783 break;
1784 }
1785 if (bframe)
1786 break;
1787 }
1788 if (!bframe)
1789 return -EINVAL;
1790 }
1791 vc = &dev->vc[dev->cc];
1792 idx = vc->cur_frame;
1793 frm = &vc->buffer.frame[idx];
1794
1795 if (!vb2_is_streaming(&vc->vb_vidq)) {
1796
1797 frm->ulState = S2255_READ_IDLE;
1798 return -EINVAL;
1799 }
1800
1801 if (frm->ulState == S2255_READ_IDLE) {
1802 frm->ulState = S2255_READ_FRAME;
1803 frm->cur_size = 0;
1804 }
1805
1806
1807 psrc = (u8 *)pipe_info->transfer_buffer + offset;
1808
1809
1810 if (frm->lpvbits == NULL) {
1811 dprintk(dev, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1812 frm, dev, dev->cc, idx);
1813 return -ENOMEM;
1814 }
1815
1816 pdest = frm->lpvbits + frm->cur_size;
1817
1818 copy_size = (pipe_info->cur_transfer_size - offset);
1819
1820 size = vc->pkt_size - PREFIX_SIZE;
1821
1822
1823 if ((copy_size + frm->cur_size) < vc->req_image_size)
1824 memcpy(pdest, psrc, copy_size);
1825
1826 frm->cur_size += copy_size;
1827 dprintk(dev, 4, "cur_size: %lu, size: %lu\n", frm->cur_size, size);
1828
1829 if (frm->cur_size >= size) {
1830 dprintk(dev, 2, "******[%d]Buffer[%d]full*******\n",
1831 dev->cc, idx);
1832 vc->last_frame = vc->cur_frame;
1833 vc->cur_frame++;
1834
1835 if ((vc->cur_frame == SYS_FRAMES) ||
1836 (vc->cur_frame == vc->buffer.dwFrames))
1837 vc->cur_frame = 0;
1838
1839 if (vb2_is_streaming(&vc->vb_vidq))
1840 s2255_got_frame(vc, vc->jpg_size);
1841 vc->frame_count++;
1842 frm->ulState = S2255_READ_IDLE;
1843 frm->cur_size = 0;
1844
1845 }
1846
1847 return 0;
1848 }
1849
1850 static void s2255_read_video_callback(struct s2255_dev *dev,
1851 struct s2255_pipeinfo *pipe_info)
1852 {
1853 int res;
1854 dprintk(dev, 50, "callback read video\n");
1855
1856 if (dev->cc >= MAX_CHANNELS) {
1857 dev->cc = 0;
1858 dev_err(&dev->udev->dev, "invalid channel\n");
1859 return;
1860 }
1861
1862 res = save_frame(dev, pipe_info);
1863 if (res != 0)
1864 dprintk(dev, 4, "s2255: read callback failed\n");
1865
1866 dprintk(dev, 50, "callback read video done\n");
1867 return;
1868 }
1869
1870 static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
1871 u16 Index, u16 Value, void *TransferBuffer,
1872 s32 TransferBufferLength, int bOut)
1873 {
1874 int r;
1875 unsigned char *buf;
1876
1877 buf = kmalloc(TransferBufferLength, GFP_KERNEL);
1878 if (!buf)
1879 return -ENOMEM;
1880
1881 if (!bOut) {
1882 r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1883 Request,
1884 USB_TYPE_VENDOR | USB_RECIP_DEVICE |
1885 USB_DIR_IN,
1886 Value, Index, buf,
1887 TransferBufferLength, HZ * 5);
1888
1889 if (r >= 0)
1890 memcpy(TransferBuffer, buf, TransferBufferLength);
1891 } else {
1892 memcpy(buf, TransferBuffer, TransferBufferLength);
1893 r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1894 Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1895 Value, Index, buf,
1896 TransferBufferLength, HZ * 5);
1897 }
1898 kfree(buf);
1899 return r;
1900 }
1901
1902
1903
1904
1905
1906
1907 static int s2255_get_fx2fw(struct s2255_dev *dev)
1908 {
1909 int fw;
1910 int ret;
1911 unsigned char transBuffer[64];
1912 ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer, 2,
1913 S2255_VR_IN);
1914 if (ret < 0)
1915 dprintk(dev, 2, "get fw error: %x\n", ret);
1916 fw = transBuffer[0] + (transBuffer[1] << 8);
1917 dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
1918 return fw;
1919 }
1920
1921
1922
1923
1924
1925 static int s2255_create_sys_buffers(struct s2255_vc *vc)
1926 {
1927 unsigned long i;
1928 unsigned long reqsize;
1929 vc->buffer.dwFrames = SYS_FRAMES;
1930
1931 reqsize = SYS_FRAMES_MAXSIZE;
1932
1933 if (reqsize > SYS_FRAMES_MAXSIZE)
1934 reqsize = SYS_FRAMES_MAXSIZE;
1935
1936 for (i = 0; i < SYS_FRAMES; i++) {
1937
1938 vc->buffer.frame[i].lpvbits = vmalloc(reqsize);
1939 vc->buffer.frame[i].size = reqsize;
1940 if (vc->buffer.frame[i].lpvbits == NULL) {
1941 pr_info("out of memory. using less frames\n");
1942 vc->buffer.dwFrames = i;
1943 break;
1944 }
1945 }
1946
1947
1948 for (i = 0; i < SYS_FRAMES; i++) {
1949 vc->buffer.frame[i].ulState = 0;
1950 vc->buffer.frame[i].cur_size = 0;
1951 }
1952
1953 vc->cur_frame = 0;
1954 vc->last_frame = -1;
1955 return 0;
1956 }
1957
1958 static int s2255_release_sys_buffers(struct s2255_vc *vc)
1959 {
1960 unsigned long i;
1961 for (i = 0; i < SYS_FRAMES; i++) {
1962 vfree(vc->buffer.frame[i].lpvbits);
1963 vc->buffer.frame[i].lpvbits = NULL;
1964 }
1965 return 0;
1966 }
1967
1968 static int s2255_board_init(struct s2255_dev *dev)
1969 {
1970 struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
1971 int fw_ver;
1972 int j;
1973 struct s2255_pipeinfo *pipe = &dev->pipe;
1974 dprintk(dev, 4, "board init: %p", dev);
1975 memset(pipe, 0, sizeof(*pipe));
1976 pipe->dev = dev;
1977 pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
1978 pipe->max_transfer_size = S2255_USB_XFER_SIZE;
1979
1980 pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
1981 GFP_KERNEL);
1982 if (pipe->transfer_buffer == NULL) {
1983 dprintk(dev, 1, "out of memory!\n");
1984 return -ENOMEM;
1985 }
1986
1987 fw_ver = s2255_get_fx2fw(dev);
1988
1989 pr_info("s2255: usb firmware version %d.%d\n",
1990 (fw_ver >> 8) & 0xff,
1991 fw_ver & 0xff);
1992
1993 if (fw_ver < S2255_CUR_USB_FWVER)
1994 pr_info("s2255: newer USB firmware available\n");
1995
1996 for (j = 0; j < MAX_CHANNELS; j++) {
1997 struct s2255_vc *vc = &dev->vc[j];
1998 vc->mode = mode_def;
1999 if (dev->pid == 0x2257 && j > 1)
2000 vc->mode.color |= (1 << 16);
2001 vc->jpegqual = S2255_DEF_JPEG_QUAL;
2002 vc->width = LINE_SZ_4CIFS_NTSC;
2003 vc->height = NUM_LINES_4CIFS_NTSC * 2;
2004 vc->std = V4L2_STD_NTSC_M;
2005 vc->fmt = &formats[0];
2006 vc->mode.restart = 1;
2007 vc->req_image_size = get_transfer_size(&mode_def);
2008 vc->frame_count = 0;
2009
2010 s2255_create_sys_buffers(vc);
2011 }
2012
2013 s2255_start_readpipe(dev);
2014 dprintk(dev, 1, "%s: success\n", __func__);
2015 return 0;
2016 }
2017
2018 static int s2255_board_shutdown(struct s2255_dev *dev)
2019 {
2020 u32 i;
2021 dprintk(dev, 1, "%s: dev: %p", __func__, dev);
2022
2023 for (i = 0; i < MAX_CHANNELS; i++) {
2024 if (vb2_is_streaming(&dev->vc[i].vb_vidq))
2025 s2255_stop_acquire(&dev->vc[i]);
2026 }
2027 s2255_stop_readpipe(dev);
2028 for (i = 0; i < MAX_CHANNELS; i++)
2029 s2255_release_sys_buffers(&dev->vc[i]);
2030
2031 kfree(dev->pipe.transfer_buffer);
2032 return 0;
2033 }
2034
2035 static void read_pipe_completion(struct urb *purb)
2036 {
2037 struct s2255_pipeinfo *pipe_info;
2038 struct s2255_dev *dev;
2039 int status;
2040 int pipe;
2041 pipe_info = purb->context;
2042 if (pipe_info == NULL) {
2043 dev_err(&purb->dev->dev, "no context!\n");
2044 return;
2045 }
2046 dev = pipe_info->dev;
2047 if (dev == NULL) {
2048 dev_err(&purb->dev->dev, "no context!\n");
2049 return;
2050 }
2051 status = purb->status;
2052
2053 if (status == -ESHUTDOWN) {
2054 dprintk(dev, 2, "%s: err shutdown\n", __func__);
2055 pipe_info->err_count++;
2056 return;
2057 }
2058
2059 if (pipe_info->state == 0) {
2060 dprintk(dev, 2, "%s: exiting USB pipe", __func__);
2061 return;
2062 }
2063
2064 if (status == 0)
2065 s2255_read_video_callback(dev, pipe_info);
2066 else {
2067 pipe_info->err_count++;
2068 dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
2069 }
2070
2071 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2072
2073 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2074 pipe,
2075 pipe_info->transfer_buffer,
2076 pipe_info->cur_transfer_size,
2077 read_pipe_completion, pipe_info);
2078
2079 if (pipe_info->state != 0) {
2080 if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC))
2081 dev_err(&dev->udev->dev, "error submitting urb\n");
2082 } else {
2083 dprintk(dev, 2, "%s :complete state 0\n", __func__);
2084 }
2085 return;
2086 }
2087
2088 static int s2255_start_readpipe(struct s2255_dev *dev)
2089 {
2090 int pipe;
2091 int retval;
2092 struct s2255_pipeinfo *pipe_info = &dev->pipe;
2093 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2094 dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
2095 pipe_info->state = 1;
2096 pipe_info->err_count = 0;
2097 pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
2098 if (!pipe_info->stream_urb)
2099 return -ENOMEM;
2100
2101 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2102 pipe,
2103 pipe_info->transfer_buffer,
2104 pipe_info->cur_transfer_size,
2105 read_pipe_completion, pipe_info);
2106 retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
2107 if (retval) {
2108 pr_err("s2255: start read pipe failed\n");
2109 return retval;
2110 }
2111 return 0;
2112 }
2113
2114
2115 static int s2255_start_acquire(struct s2255_vc *vc)
2116 {
2117 int res;
2118 unsigned long chn_rev;
2119 int j;
2120 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2121 __le32 *buffer = dev->cmdbuf;
2122
2123 mutex_lock(&dev->cmdlock);
2124 chn_rev = G_chnmap[vc->idx];
2125 vc->last_frame = -1;
2126 vc->bad_payload = 0;
2127 vc->cur_frame = 0;
2128 for (j = 0; j < SYS_FRAMES; j++) {
2129 vc->buffer.frame[j].ulState = 0;
2130 vc->buffer.frame[j].cur_size = 0;
2131 }
2132
2133
2134 buffer[0] = IN_DATA_TOKEN;
2135 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2136 buffer[2] = CMD_START;
2137 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2138 if (res != 0)
2139 dev_err(&dev->udev->dev, "CMD_START error\n");
2140
2141 dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
2142 mutex_unlock(&dev->cmdlock);
2143 return res;
2144 }
2145
2146 static int s2255_stop_acquire(struct s2255_vc *vc)
2147 {
2148 int res;
2149 unsigned long chn_rev;
2150 struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2151 __le32 *buffer = dev->cmdbuf;
2152
2153 mutex_lock(&dev->cmdlock);
2154 chn_rev = G_chnmap[vc->idx];
2155
2156 buffer[0] = IN_DATA_TOKEN;
2157 buffer[1] = (__le32) cpu_to_le32(chn_rev);
2158 buffer[2] = CMD_STOP;
2159
2160 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2161 if (res != 0)
2162 dev_err(&dev->udev->dev, "CMD_STOP error\n");
2163
2164 dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
2165 mutex_unlock(&dev->cmdlock);
2166 return res;
2167 }
2168
2169 static void s2255_stop_readpipe(struct s2255_dev *dev)
2170 {
2171 struct s2255_pipeinfo *pipe = &dev->pipe;
2172
2173 pipe->state = 0;
2174 if (pipe->stream_urb) {
2175
2176 usb_kill_urb(pipe->stream_urb);
2177 usb_free_urb(pipe->stream_urb);
2178 pipe->stream_urb = NULL;
2179 }
2180 dprintk(dev, 4, "%s", __func__);
2181 return;
2182 }
2183
2184 static void s2255_fwload_start(struct s2255_dev *dev)
2185 {
2186 s2255_reset_dsppower(dev);
2187 dev->fw_data->fw_size = dev->fw_data->fw->size;
2188 atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2189 memcpy(dev->fw_data->pfw_data,
2190 dev->fw_data->fw->data, CHUNK_SIZE);
2191 dev->fw_data->fw_loaded = CHUNK_SIZE;
2192 usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
2193 usb_sndbulkpipe(dev->udev, 2),
2194 dev->fw_data->pfw_data,
2195 CHUNK_SIZE, s2255_fwchunk_complete,
2196 dev->fw_data);
2197 mod_timer(&dev->timer, jiffies + HZ);
2198 }
2199
2200
2201 static int s2255_probe(struct usb_interface *interface,
2202 const struct usb_device_id *id)
2203 {
2204 struct s2255_dev *dev = NULL;
2205 struct usb_host_interface *iface_desc;
2206 struct usb_endpoint_descriptor *endpoint;
2207 int i;
2208 int retval = -ENOMEM;
2209 __le32 *pdata;
2210 int fw_size;
2211
2212
2213 dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
2214 if (dev == NULL) {
2215 s2255_dev_err(&interface->dev, "out of memory\n");
2216 return -ENOMEM;
2217 }
2218
2219 dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
2220 if (dev->cmdbuf == NULL) {
2221 s2255_dev_err(&interface->dev, "out of memory\n");
2222 goto errorFWDATA1;
2223 }
2224
2225 atomic_set(&dev->num_channels, 0);
2226 dev->pid = id->idProduct;
2227 dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
2228 if (!dev->fw_data)
2229 goto errorFWDATA1;
2230 mutex_init(&dev->lock);
2231 mutex_init(&dev->cmdlock);
2232
2233 dev->udev = usb_get_dev(interface_to_usbdev(interface));
2234 if (dev->udev == NULL) {
2235 dev_err(&interface->dev, "null usb device\n");
2236 retval = -ENODEV;
2237 goto errorUDEV;
2238 }
2239 dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
2240 dev, dev->udev, interface);
2241 dev->interface = interface;
2242
2243 iface_desc = interface->cur_altsetting;
2244 dev_dbg(&interface->dev, "num EP: %d\n",
2245 iface_desc->desc.bNumEndpoints);
2246 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2247 endpoint = &iface_desc->endpoint[i].desc;
2248 if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
2249
2250 dev->read_endpoint = endpoint->bEndpointAddress;
2251 }
2252 }
2253
2254 if (!dev->read_endpoint) {
2255 dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2256 goto errorEP;
2257 }
2258 timer_setup(&dev->timer, s2255_timer, 0);
2259 init_waitqueue_head(&dev->fw_data->wait_fw);
2260 for (i = 0; i < MAX_CHANNELS; i++) {
2261 struct s2255_vc *vc = &dev->vc[i];
2262 vc->idx = i;
2263 vc->dev = dev;
2264 init_waitqueue_head(&vc->wait_setmode);
2265 init_waitqueue_head(&vc->wait_vidstatus);
2266 spin_lock_init(&vc->qlock);
2267 mutex_init(&vc->vb_lock);
2268 }
2269
2270 dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
2271 if (!dev->fw_data->fw_urb)
2272 goto errorFWURB;
2273
2274 dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2275 if (!dev->fw_data->pfw_data) {
2276 dev_err(&interface->dev, "out of memory!\n");
2277 goto errorFWDATA2;
2278 }
2279
2280 if (request_firmware(&dev->fw_data->fw,
2281 FIRMWARE_FILE_NAME, &dev->udev->dev)) {
2282 dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
2283 goto errorREQFW;
2284 }
2285
2286 fw_size = dev->fw_data->fw->size;
2287 pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2288
2289 if (*pdata != S2255_FW_MARKER) {
2290 dev_err(&interface->dev, "Firmware invalid.\n");
2291 retval = -ENODEV;
2292 goto errorFWMARKER;
2293 } else {
2294
2295 __le32 *pRel;
2296 pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2297 pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
2298 dev->dsp_fw_ver = le32_to_cpu(*pRel);
2299 if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
2300 pr_info("s2255: f2255usb.bin out of date.\n");
2301 if (dev->pid == 0x2257 &&
2302 dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
2303 pr_warn("2257 needs firmware %d or above.\n",
2304 S2255_MIN_DSP_COLORFILTER);
2305 }
2306 usb_reset_device(dev->udev);
2307
2308 retval = s2255_board_init(dev);
2309 if (retval)
2310 goto errorBOARDINIT;
2311 s2255_fwload_start(dev);
2312
2313 retval = s2255_probe_v4l(dev);
2314 if (retval)
2315 goto errorBOARDINIT;
2316 dev_info(&interface->dev, "Sensoray 2255 detected\n");
2317 return 0;
2318 errorBOARDINIT:
2319 s2255_board_shutdown(dev);
2320 errorFWMARKER:
2321 release_firmware(dev->fw_data->fw);
2322 errorREQFW:
2323 kfree(dev->fw_data->pfw_data);
2324 errorFWDATA2:
2325 usb_free_urb(dev->fw_data->fw_urb);
2326 errorFWURB:
2327 del_timer_sync(&dev->timer);
2328 errorEP:
2329 usb_put_dev(dev->udev);
2330 errorUDEV:
2331 kfree(dev->fw_data);
2332 mutex_destroy(&dev->lock);
2333 errorFWDATA1:
2334 kfree(dev->cmdbuf);
2335 kfree(dev);
2336 pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
2337 return retval;
2338 }
2339
2340
2341 static void s2255_disconnect(struct usb_interface *interface)
2342 {
2343 struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
2344 int i;
2345 int channels = atomic_read(&dev->num_channels);
2346 mutex_lock(&dev->lock);
2347 v4l2_device_disconnect(&dev->v4l2_dev);
2348 mutex_unlock(&dev->lock);
2349
2350 atomic_inc(&dev->num_channels);
2351
2352 for (i = 0; i < channels; i++)
2353 video_unregister_device(&dev->vc[i].vdev);
2354
2355 atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2356 wake_up(&dev->fw_data->wait_fw);
2357 for (i = 0; i < MAX_CHANNELS; i++) {
2358 dev->vc[i].setmode_ready = 1;
2359 wake_up(&dev->vc[i].wait_setmode);
2360 dev->vc[i].vidstatus_ready = 1;
2361 wake_up(&dev->vc[i].wait_vidstatus);
2362 }
2363 if (atomic_dec_and_test(&dev->num_channels))
2364 s2255_destroy(dev);
2365 dev_info(&interface->dev, "%s\n", __func__);
2366 }
2367
2368 static struct usb_driver s2255_driver = {
2369 .name = S2255_DRIVER_NAME,
2370 .probe = s2255_probe,
2371 .disconnect = s2255_disconnect,
2372 .id_table = s2255_table,
2373 };
2374
2375 module_usb_driver(s2255_driver);
2376
2377 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2378 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2379 MODULE_LICENSE("GPL");
2380 MODULE_VERSION(S2255_VERSION);
2381 MODULE_FIRMWARE(FIRMWARE_FILE_NAME);