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
133struct 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
152struct s2255_framei {
153 unsigned long size;
154 unsigned long ulState;
155 void *lpvbits;
156 unsigned long cur_size;
157};
158
159
160struct 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
179struct s2255_fw {
180 int fw_loaded;
181 int fw_size;
182 struct urb *fw_urb;
183 atomic_t fw_state;
184 void *pfw_data;
185 wait_queue_head_t wait_fw;
186 const struct firmware *fw;
187};
188
189struct s2255_pipeinfo {
190 u32 max_transfer_size;
191 u32 cur_transfer_size;
192 u8 *transfer_buffer;
193 u32 state;
194 void *stream_urb;
195 void *dev;
196 u32 err_count;
197 u32 idx;
198};
199
200struct s2255_fmt;
201struct s2255_dev;
202
203
204struct s2255_vc {
205 struct s2255_dev *dev;
206 struct video_device vdev;
207 struct v4l2_ctrl_handler hdl;
208 struct v4l2_ctrl *jpegqual_ctrl;
209 int resources;
210 struct list_head buf_list;
211 struct s2255_bufferi buffer;
212 struct s2255_mode mode;
213 v4l2_std_id std;
214
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
247struct s2255_dev {
248 struct s2255_vc vc[MAX_CHANNELS];
249 struct v4l2_device v4l2_dev;
250 atomic_t num_channels;
251 int frames;
252 struct mutex lock;
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
270static inline struct s2255_dev *to_s2255_dev(struct v4l2_device *v4l2_dev)
271{
272 return container_of(v4l2_dev, struct s2255_dev, v4l2_dev);
273}
274
275struct s2255_fmt {
276 u32 fourcc;
277 int depth;
278};
279
280
281struct 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
331static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
332
333static int debug;
334
335static int s2255_start_readpipe(struct s2255_dev *dev);
336static void s2255_stop_readpipe(struct s2255_dev *dev);
337static int s2255_start_acquire(struct s2255_vc *vc);
338static int s2255_stop_acquire(struct s2255_vc *vc);
339static void s2255_fillbuff(struct s2255_vc *vc, struct s2255_buffer *buf,
340 int jpgsize);
341static int s2255_set_mode(struct s2255_vc *vc, struct s2255_mode *mode);
342static int s2255_board_shutdown(struct s2255_dev *dev);
343static void s2255_fwload_start(struct s2255_dev *dev);
344static void s2255_destroy(struct s2255_dev *dev);
345static long s2255_vendor_req(struct s2255_dev *dev, unsigned char req,
346 u16 index, u16 value, void *buf,
347 s32 buf_len, int bOut);
348
349
350#define S2255_DRIVER_NAME "s2255"
351#define s2255_dev_err(dev, fmt, arg...) \
352 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
353
354#define dprintk(dev, level, fmt, arg...) \
355 v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
356
357static struct usb_driver s2255_driver;
358
359
360static int video_nr = -1;
361
362
363static int jpeg_enable = 1;
364
365module_param(debug, int, 0644);
366MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
367module_param(video_nr, int, 0644);
368MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
369module_param(jpeg_enable, int, 0644);
370MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
371
372
373#define USB_SENSORAY_VID 0x1943
374static const struct usb_device_id s2255_table[] = {
375 {USB_DEVICE(USB_SENSORAY_VID, 0x2255)},
376 {USB_DEVICE(USB_SENSORAY_VID, 0x2257)},
377 { }
378};
379MODULE_DEVICE_TABLE(usb, s2255_table);
380
381#define BUFFER_TIMEOUT msecs_to_jiffies(400)
382
383
384
385static const struct s2255_fmt formats[] = {
386 {
387 .fourcc = V4L2_PIX_FMT_YUYV,
388 .depth = 16
389
390 }, {
391 .fourcc = V4L2_PIX_FMT_UYVY,
392 .depth = 16
393 }, {
394 .fourcc = V4L2_PIX_FMT_YUV422P,
395 .depth = 16
396
397 }, {
398 .fourcc = V4L2_PIX_FMT_GREY,
399 .depth = 8
400 }, {
401 .fourcc = V4L2_PIX_FMT_JPEG,
402 .depth = 24
403 }, {
404 .fourcc = V4L2_PIX_FMT_MJPEG,
405 .depth = 24
406 }
407};
408
409static int norm_maxw(struct s2255_vc *vc)
410{
411 return (vc->std & V4L2_STD_525_60) ?
412 LINE_SZ_4CIFS_NTSC : LINE_SZ_4CIFS_PAL;
413}
414
415static int norm_maxh(struct s2255_vc *vc)
416{
417 return (vc->std & V4L2_STD_525_60) ?
418 (NUM_LINES_1CIFS_NTSC * 2) : (NUM_LINES_1CIFS_PAL * 2);
419}
420
421static int norm_minw(struct s2255_vc *vc)
422{
423 return (vc->std & V4L2_STD_525_60) ?
424 LINE_SZ_1CIFS_NTSC : LINE_SZ_1CIFS_PAL;
425}
426
427static int norm_minh(struct s2255_vc *vc)
428{
429 return (vc->std & V4L2_STD_525_60) ?
430 (NUM_LINES_1CIFS_NTSC) : (NUM_LINES_1CIFS_PAL);
431}
432
433
434
435
436
437
438static void planar422p_to_yuv_packed(const unsigned char *in,
439 unsigned char *out,
440 int width, int height,
441 int fmt)
442{
443 unsigned char *pY;
444 unsigned char *pCb;
445 unsigned char *pCr;
446 unsigned long size = height * width;
447 unsigned int i;
448 pY = (unsigned char *)in;
449 pCr = (unsigned char *)in + height * width;
450 pCb = (unsigned char *)in + height * width + (height * width / 2);
451 for (i = 0; i < size * 2; i += 4) {
452 out[i] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCr++;
453 out[i + 1] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCr++ : *pY++;
454 out[i + 2] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCb++;
455 out[i + 3] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCb++ : *pY++;
456 }
457 return;
458}
459
460static void s2255_reset_dsppower(struct s2255_dev *dev)
461{
462 s2255_vendor_req(dev, 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
472static void s2255_timer(struct timer_list *t)
473{
474 struct s2255_dev *dev = from_timer(dev, t, timer);
475 struct s2255_fw *data = dev->fw_data;
476 if (usb_submit_urb(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
492static void s2255_fwchunk_complete(struct urb *urb)
493{
494 struct s2255_fw *data = urb->context;
495 struct usb_device *udev = urb->dev;
496 int len;
497 if (urb->status) {
498 dev_err(&udev->dev, "URB failed with status %d\n", urb->status);
499 atomic_set(&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
543static void s2255_got_frame(struct s2255_vc *vc, int jpgsize)
544{
545 struct s2255_buffer *buf;
546 struct s2255_dev *dev = to_s2255_dev(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
569static const struct s2255_fmt *format_by_fourcc(int fourcc)
570{
571 unsigned int i;
572 for (i = 0; i < ARRAY_SIZE(formats); i++) {
573 if (-1 == formats[i].fourcc)
574 continue;
575 if (!jpeg_enable && ((formats[i].fourcc == V4L2_PIX_FMT_JPEG) ||
576 (formats[i].fourcc == V4L2_PIX_FMT_MJPEG)))
577 continue;
578 if (formats[i].fourcc == fourcc)
579 return formats + i;
580 }
581 return NULL;
582}
583
584
585
586
587
588
589
590
591
592static void s2255_fillbuff(struct s2255_vc *vc,
593 struct s2255_buffer *buf, int jpgsize)
594{
595 int pos = 0;
596 const char *tmpbuf;
597 char *vbuf = vb2_plane_vaddr(&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
644static int queue_setup(struct vb2_queue *vq,
645 unsigned int *nbuffers, unsigned int *nplanes,
646 unsigned int sizes[], struct device *alloc_devs[])
647{
648 struct s2255_vc *vc = vb2_get_drv_priv(vq);
649 if (*nbuffers < S2255_MIN_BUFS)
650 *nbuffers = S2255_MIN_BUFS;
651 *nplanes = 1;
652 sizes[0] = vc->width * vc->height * (vc->fmt->depth >> 3);
653 return 0;
654}
655
656static int buffer_prepare(struct vb2_buffer *vb)
657{
658 struct s2255_vc *vc = vb2_get_drv_priv(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
686static void buffer_queue(struct vb2_buffer *vb)
687{
688 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
689 struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
690 struct s2255_vc *vc = vb2_get_drv_priv(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
698static int start_streaming(struct vb2_queue *vq, unsigned int count);
699static void stop_streaming(struct vb2_queue *vq);
700
701static const struct vb2_ops s2255_video_qops = {
702 .queue_setup = queue_setup,
703 .buf_prepare = buffer_prepare,
704 .buf_queue = buffer_queue,
705 .start_streaming = start_streaming,
706 .stop_streaming = stop_streaming,
707 .wait_prepare = vb2_ops_wait_prepare,
708 .wait_finish = vb2_ops_wait_finish,
709};
710
711static int vidioc_querycap(struct file *file, void *priv,
712 struct v4l2_capability *cap)
713{
714 struct s2255_vc *vc = video_drvdata(file);
715 struct s2255_dev *dev = vc->dev;
716
717 strscpy(cap->driver, "s2255", sizeof(cap->driver));
718 strscpy(cap->card, "s2255", sizeof(cap->card));
719 usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
720 return 0;
721}
722
723static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
724 struct v4l2_fmtdesc *f)
725{
726 int index = f->index;
727
728 if (index >= ARRAY_SIZE(formats))
729 return -EINVAL;
730 if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
731 (formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
732 return -EINVAL;
733 f->pixelformat = formats[index].fourcc;
734 return 0;
735}
736
737static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
738 struct v4l2_format *f)
739{
740 struct s2255_vc *vc = video_drvdata(file);
741 int is_ntsc = vc->std & V4L2_STD_525_60;
742
743 f->fmt.pix.width = vc->width;
744 f->fmt.pix.height = vc->height;
745 if (f->fmt.pix.height >=
746 (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2)
747 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
748 else
749 f->fmt.pix.field = V4L2_FIELD_TOP;
750 f->fmt.pix.pixelformat = vc->fmt->fourcc;
751 f->fmt.pix.bytesperline = f->fmt.pix.width * (vc->fmt->depth >> 3);
752 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
753 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
754 return 0;
755}
756
757static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
758 struct v4l2_format *f)
759{
760 const struct s2255_fmt *fmt;
761 enum v4l2_field field;
762 struct s2255_vc *vc = video_drvdata(file);
763 int is_ntsc = vc->std & V4L2_STD_525_60;
764
765 fmt = format_by_fourcc(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
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
787 if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
788 f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
789 field = V4L2_FIELD_INTERLACED;
790 } else {
791 f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
792 field = V4L2_FIELD_TOP;
793 }
794 if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
795 f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
796 else
797 f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
798 }
799 f->fmt.pix.field = field;
800 f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
801 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
802 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
803 dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
804 f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
805 return 0;
806}
807
808static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
809 struct v4l2_format *f)
810{
811 struct s2255_vc *vc = video_drvdata(file);
812 const struct s2255_fmt *fmt;
813 struct vb2_queue *q = &vc->vb_vidq;
814 struct s2255_mode mode;
815 int ret;
816
817 ret = vidioc_try_fmt_vid_cap(file, 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
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
886static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
887 int size)
888{
889 int pipe;
890 int done;
891 long retval = -1;
892 if (udev) {
893 pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
894 retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
895 }
896 return retval;
897}
898
899static u32 get_transfer_size(struct s2255_mode *mode)
900{
901 int linesPerFrame = LINE_SZ_DEF;
902 int pixelsPerLine = NUM_LINES_DEF;
903 u32 outImageSize;
904 u32 usbInSize;
905 unsigned int mask_mult;
906
907 if (mode == NULL)
908 return 0;
909
910 if (mode->format == FORMAT_NTSC) {
911 switch (mode->scale) {
912 case SCALE_4CIFS:
913 case SCALE_4CIFSI:
914 linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
915 pixelsPerLine = LINE_SZ_4CIFS_NTSC;
916 break;
917 case SCALE_2CIFS:
918 linesPerFrame = NUM_LINES_2CIFS_NTSC;
919 pixelsPerLine = LINE_SZ_2CIFS_NTSC;
920 break;
921 case SCALE_1CIFS:
922 linesPerFrame = NUM_LINES_1CIFS_NTSC;
923 pixelsPerLine = LINE_SZ_1CIFS_NTSC;
924 break;
925 default:
926 break;
927 }
928 } else if (mode->format == FORMAT_PAL) {
929 switch (mode->scale) {
930 case SCALE_4CIFS:
931 case SCALE_4CIFSI:
932 linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
933 pixelsPerLine = LINE_SZ_4CIFS_PAL;
934 break;
935 case SCALE_2CIFS:
936 linesPerFrame = NUM_LINES_2CIFS_PAL;
937 pixelsPerLine = LINE_SZ_2CIFS_PAL;
938 break;
939 case SCALE_1CIFS:
940 linesPerFrame = NUM_LINES_1CIFS_PAL;
941 pixelsPerLine = LINE_SZ_1CIFS_PAL;
942 break;
943 default:
944 break;
945 }
946 }
947 outImageSize = linesPerFrame * pixelsPerLine;
948 if ((mode->color & MASK_COLOR) != COLOR_Y8) {
949
950 outImageSize *= 2;
951 }
952
953
954
955 usbInSize = outImageSize + PREFIX_SIZE;
956 mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
957
958 if (usbInSize & ~mask_mult)
959 usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
960 return usbInSize;
961}
962
963static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
964{
965 struct device *dev = &sdev->udev->dev;
966 dev_info(dev, "------------------------------------------------\n");
967 dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
968 dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
969 dev_info(dev, "bright: 0x%x\n", mode->bright);
970 dev_info(dev, "------------------------------------------------\n");
971}
972
973
974
975
976
977
978
979
980
981static int s2255_set_mode(struct s2255_vc *vc,
982 struct s2255_mode *mode)
983{
984 int res;
985 unsigned long chn_rev;
986 struct s2255_dev *dev = to_s2255_dev(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
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
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
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
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
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
1031static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
1032{
1033 int res;
1034 u32 chn_rev;
1035 struct s2255_dev *dev = to_s2255_dev(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
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
1061static 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
1078static 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
1094static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
1095{
1096 struct s2255_vc *vc = video_drvdata(file);
1097 struct s2255_mode mode;
1098 struct vb2_queue *q = &vc->vb_vidq;
1099
1100
1101
1102
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
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
1135static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
1136{
1137 struct s2255_vc *vc = video_drvdata(file);
1138
1139 *i = vc->std;
1140 return 0;
1141}
1142
1143
1144
1145
1146
1147
1148
1149
1150static int vidioc_enum_input(struct file *file, void *priv,
1151 struct v4l2_input *inp)
1152{
1153 struct s2255_vc *vc = video_drvdata(file);
1154 struct s2255_dev *dev = vc->dev;
1155 u32 status = 0;
1156
1157 if (inp->index != 0)
1158 return -EINVAL;
1159 inp->type = V4L2_INPUT_TYPE_CAMERA;
1160 inp->std = S2255_NORMS;
1161 inp->status = 0;
1162 if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1163 int rc;
1164 rc = s2255_cmd_status(vc, &status);
1165 dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
1166 rc, status);
1167 if (rc == 0)
1168 inp->status = (status & 0x01) ? 0
1169 : V4L2_IN_ST_NO_SIGNAL;
1170 }
1171 switch (dev->pid) {
1172 case 0x2255:
1173 default:
1174 strscpy(inp->name, "Composite", sizeof(inp->name));
1175 break;
1176 case 0x2257:
1177 strscpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
1178 sizeof(inp->name));
1179 break;
1180 }
1181 return 0;
1182}
1183
1184static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1185{
1186 *i = 0;
1187 return 0;
1188}
1189static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1190{
1191 if (i > 0)
1192 return -EINVAL;
1193 return 0;
1194}
1195
1196static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
1197{
1198 struct s2255_vc *vc =
1199 container_of(ctrl->handler, struct s2255_vc, hdl);
1200 struct s2255_mode mode;
1201 mode = vc->mode;
1202
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
1228
1229
1230
1231 s2255_set_mode(vc, &mode);
1232 return 0;
1233}
1234
1235static int vidioc_g_jpegcomp(struct file *file, void *priv,
1236 struct v4l2_jpegcompression *jc)
1237{
1238 struct s2255_vc *vc = video_drvdata(file);
1239
1240 memset(jc, 0, sizeof(*jc));
1241 jc->quality = vc->jpegqual;
1242 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1243 return 0;
1244}
1245
1246static int vidioc_s_jpegcomp(struct file *file, void *priv,
1247 const struct v4l2_jpegcompression *jc)
1248{
1249 struct s2255_vc *vc = video_drvdata(file);
1250
1251 if (jc->quality < 0 || jc->quality > 100)
1252 return -EINVAL;
1253 v4l2_ctrl_s_ctrl(vc->jpegqual_ctrl, jc->quality);
1254 dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1255 return 0;
1256}
1257
1258static int vidioc_g_parm(struct file *file, void *priv,
1259 struct v4l2_streamparm *sp)
1260{
1261 __u32 def_num, def_dem;
1262 struct s2255_vc *vc = video_drvdata(file);
1263
1264 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1265 return -EINVAL;
1266 sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1267 sp->parm.capture.capturemode = vc->cap_parm.capturemode;
1268 sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1269 def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1270 def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1271 sp->parm.capture.timeperframe.denominator = def_dem;
1272 switch (vc->mode.fdec) {
1273 default:
1274 case FDEC_1:
1275 sp->parm.capture.timeperframe.numerator = def_num;
1276 break;
1277 case FDEC_2:
1278 sp->parm.capture.timeperframe.numerator = def_num * 2;
1279 break;
1280 case FDEC_3:
1281 sp->parm.capture.timeperframe.numerator = def_num * 3;
1282 break;
1283 case FDEC_5:
1284 sp->parm.capture.timeperframe.numerator = def_num * 5;
1285 break;
1286 }
1287 dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
1288 __func__,
1289 sp->parm.capture.capturemode,
1290 sp->parm.capture.timeperframe.numerator,
1291 sp->parm.capture.timeperframe.denominator);
1292 return 0;
1293}
1294
1295static int vidioc_s_parm(struct file *file, void *priv,
1296 struct v4l2_streamparm *sp)
1297{
1298 struct s2255_vc *vc = video_drvdata(file);
1299 struct s2255_mode mode;
1300 int fdec = FDEC_1;
1301 __u32 def_num, def_dem;
1302 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1303 return -EINVAL;
1304 mode = vc->mode;
1305
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
1338static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1339 { 640, 480 },
1340 { 640, 240 },
1341 { 320, 240 },
1342};
1343static const struct v4l2_frmsize_discrete pal_sizes[] = {
1344 { 704, 576 },
1345 { 704, 288 },
1346 { 352, 288 },
1347};
1348
1349static int vidioc_enum_framesizes(struct file *file, void *priv,
1350 struct v4l2_frmsizeenum *fe)
1351{
1352 struct s2255_vc *vc = video_drvdata(file);
1353 int is_ntsc = vc->std & V4L2_STD_525_60;
1354 const struct s2255_fmt *fmt;
1355
1356 if (fe->index >= NUM_SIZE_ENUMS)
1357 return -EINVAL;
1358
1359 fmt = format_by_fourcc(fe->pixel_format);
1360 if (fmt == NULL)
1361 return -EINVAL;
1362 fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1363 fe->discrete = is_ntsc ? ntsc_sizes[fe->index] : pal_sizes[fe->index];
1364 return 0;
1365}
1366
1367static int vidioc_enum_frameintervals(struct file *file, void *priv,
1368 struct v4l2_frmivalenum *fe)
1369{
1370 struct s2255_vc *vc = video_drvdata(file);
1371 const struct s2255_fmt *fmt;
1372 const struct v4l2_frmsize_discrete *sizes;
1373 int is_ntsc = vc->std & V4L2_STD_525_60;
1374#define NUM_FRAME_ENUMS 4
1375 int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1376 int i;
1377
1378 if (fe->index >= NUM_FRAME_ENUMS)
1379 return -EINVAL;
1380
1381 fmt = format_by_fourcc(fe->pixel_format);
1382 if (fmt == NULL)
1383 return -EINVAL;
1384
1385 sizes = is_ntsc ? ntsc_sizes : pal_sizes;
1386 for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
1387 if (fe->width == sizes->width &&
1388 fe->height == sizes->height)
1389 break;
1390 if (i == NUM_SIZE_ENUMS)
1391 return -EINVAL;
1392
1393 fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1394 fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1395 fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1396 dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
1397 fe->discrete.numerator,
1398 fe->discrete.denominator);
1399 return 0;
1400}
1401
1402static int s2255_open(struct file *file)
1403{
1404 struct s2255_vc *vc = video_drvdata(file);
1405 struct s2255_dev *dev = vc->dev;
1406 int state;
1407 int rc = 0;
1408
1409 rc = v4l2_fh_open(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
1429 state = atomic_read(&dev->fw_data->fw_state);
1430 break;
1431 case S2255_FW_NOTLOADED:
1432 case S2255_FW_LOADED_DSPWAIT:
1433
1434
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
1443 state = atomic_read(&dev->fw_data->fw_state);
1444 break;
1445 case S2255_FW_SUCCESS:
1446 default:
1447 break;
1448 }
1449
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
1465
1466
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
1477 vc->fmt = &formats[0];
1478 s2255_set_mode(vc, &vc->mode);
1479 vc->configured = 1;
1480 }
1481 return 0;
1482}
1483
1484static void s2255_destroy(struct s2255_dev *dev)
1485{
1486 dprintk(dev, 1, "%s", __func__);
1487
1488 s2255_board_shutdown(dev);
1489
1490 del_timer_sync(&dev->timer);
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
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
1508static const struct v4l2_file_operations s2255_fops_v4l = {
1509 .owner = THIS_MODULE,
1510 .open = s2255_open,
1511 .release = vb2_fop_release,
1512 .poll = vb2_fop_poll,
1513 .unlocked_ioctl = video_ioctl2,
1514 .mmap = vb2_fop_mmap,
1515 .read = vb2_fop_read,
1516};
1517
1518static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1519 .vidioc_querycap = vidioc_querycap,
1520 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1521 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1522 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1523 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1524 .vidioc_reqbufs = vb2_ioctl_reqbufs,
1525 .vidioc_querybuf = vb2_ioctl_querybuf,
1526 .vidioc_qbuf = vb2_ioctl_qbuf,
1527 .vidioc_dqbuf = vb2_ioctl_dqbuf,
1528 .vidioc_s_std = vidioc_s_std,
1529 .vidioc_g_std = vidioc_g_std,
1530 .vidioc_enum_input = vidioc_enum_input,
1531 .vidioc_g_input = vidioc_g_input,
1532 .vidioc_s_input = vidioc_s_input,
1533 .vidioc_streamon = vb2_ioctl_streamon,
1534 .vidioc_streamoff = vb2_ioctl_streamoff,
1535 .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1536 .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1537 .vidioc_s_parm = vidioc_s_parm,
1538 .vidioc_g_parm = vidioc_g_parm,
1539 .vidioc_enum_framesizes = vidioc_enum_framesizes,
1540 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1541 .vidioc_log_status = v4l2_ctrl_log_status,
1542 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1543 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1544};
1545
1546static void s2255_video_device_release(struct video_device *vdev)
1547{
1548 struct s2255_dev *dev = to_s2255_dev(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
1562static const struct video_device template = {
1563 .name = "s2255v",
1564 .fops = &s2255_fops_v4l,
1565 .ioctl_ops = &s2255_ioctl_ops,
1566 .release = s2255_video_device_release,
1567 .tvnorms = S2255_NORMS,
1568};
1569
1570static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1571 .s_ctrl = s2255_s_ctrl,
1572};
1573
1574static const struct v4l2_ctrl_config color_filter_ctrl = {
1575 .ops = &s2255_ctrl_ops,
1576 .name = "Color Filter",
1577 .id = V4L2_CID_S2255_COLORFILTER,
1578 .type = V4L2_CTRL_TYPE_BOOLEAN,
1579 .max = 1,
1580 .step = 1,
1581 .def = 1,
1582};
1583
1584static int s2255_probe_v4l(struct s2255_dev *dev)
1585{
1586 int ret;
1587 int i;
1588 int cur_nr = video_nr;
1589 struct s2255_vc *vc;
1590 struct vb2_queue *q;
1591
1592 ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
1593 if (ret)
1594 return ret;
1595
1596
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
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
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
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1691{
1692 char *pdest;
1693 u32 offset = 0;
1694 int bframe = 0;
1695 char *psrc;
1696 unsigned long copy_size;
1697 unsigned long size;
1698 s32 idx = -1;
1699 struct s2255_framei *frm;
1700 unsigned char *pdata;
1701 struct s2255_vc *vc;
1702 dprintk(dev, 100, "buffer to user\n");
1703 vc = &dev->vc[dev->cc];
1704 idx = vc->cur_frame;
1705 frm = &vc->buffer.frame[idx];
1706 if (frm->ulState == S2255_READ_IDLE) {
1707 int jj;
1708 unsigned int cc;
1709 __le32 *pdword;
1710 int payload;
1711
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
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
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
1752
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
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 }
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
1793 if (!vb2_is_streaming(&vc->vb_vidq)) {
1794
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
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
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
1833 if ((vc->cur_frame == SYS_FRAMES) ||
1834 (vc->cur_frame == vc->buffer.dwFrames))
1835 vc->cur_frame = 0;
1836
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
1845 return 0;
1846}
1847
1848static void s2255_read_video_callback(struct s2255_dev *dev,
1849 struct s2255_pipeinfo *pipe_info)
1850{
1851 int res;
1852 dprintk(dev, 50, "callback read video\n");
1853
1854 if (dev->cc >= MAX_CHANNELS) {
1855 dev->cc = 0;
1856 dev_err(&dev->udev->dev, "invalid channel\n");
1857 return;
1858 }
1859
1860 res = save_frame(dev, pipe_info);
1861 if (res != 0)
1862 dprintk(dev, 4, "s2255: read callback failed\n");
1863
1864 dprintk(dev, 50, "callback read video done\n");
1865 return;
1866}
1867
1868static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
1869 u16 Index, u16 Value, void *TransferBuffer,
1870 s32 TransferBufferLength, int bOut)
1871{
1872 int r;
1873 unsigned char *buf;
1874
1875 buf = kmalloc(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
1902
1903
1904
1905static 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
1921
1922
1923static 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
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
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
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
1956static 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
1966static 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
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
2008 s2255_create_sys_buffers(vc);
2009 }
2010
2011 s2255_start_readpipe(dev);
2012 dprintk(dev, 1, "%s: success\n", __func__);
2013 return 0;
2014}
2015
2016static 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
2029 kfree(dev->pipe.transfer_buffer);
2030 return 0;
2031}
2032
2033static 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
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
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
2086static 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
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
2113static 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
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
2144static 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
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
2167static 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
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
2182static 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
2199static 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
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
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
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
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
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
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
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
2306 retval = s2255_board_init(dev);
2307 if (retval)
2308 goto errorBOARDINIT;
2309 s2255_fwload_start(dev);
2310
2311 retval = s2255_probe_v4l(dev);
2312 if (retval)
2313 goto errorBOARDINIT;
2314 dev_info(&interface->dev, "Sensoray 2255 detected\n");
2315 return 0;
2316errorBOARDINIT:
2317 s2255_board_shutdown(dev);
2318errorFWMARKER:
2319 release_firmware(dev->fw_data->fw);
2320errorREQFW:
2321 kfree(dev->fw_data->pfw_data);
2322errorFWDATA2:
2323 usb_free_urb(dev->fw_data->fw_urb);
2324errorFWURB:
2325 del_timer_sync(&dev->timer);
2326errorEP:
2327 usb_put_dev(dev->udev);
2328errorUDEV:
2329 kfree(dev->fw_data);
2330 mutex_destroy(&dev->lock);
2331errorFWDATA1:
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
2339static 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
2348 atomic_inc(&dev->num_channels);
2349
2350 for (i = 0; i < channels; i++)
2351 video_unregister_device(&dev->vc[i].vdev);
2352
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
2366static 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
2373module_usb_driver(s2255_driver);
2374
2375MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2376MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2377MODULE_LICENSE("GPL");
2378MODULE_VERSION(S2255_VERSION);
2379MODULE_FIRMWARE(FIRMWARE_FILE_NAME);
2380