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
27
28
29
30
31
32
33
34
35
36
37
38
39#include <linux/module.h>
40#include <linux/firmware.h>
41#include <linux/kernel.h>
42#include <linux/mutex.h>
43#include <linux/slab.h>
44#include <linux/videodev2.h>
45#include <linux/mm.h>
46#include <media/videobuf-vmalloc.h>
47#include <media/v4l2-common.h>
48#include <media/v4l2-device.h>
49#include <media/v4l2-ioctl.h>
50#include <linux/vmalloc.h>
51#include <linux/usb.h>
52
53#define S2255_VERSION "1.22.1"
54#define FIRMWARE_FILE_NAME "f2255usb.bin"
55
56
57#define S2255_DEF_JPEG_QUAL 50
58
59#define S2255_VR_IN 0
60
61#define S2255_VR_OUT 1
62
63#define S2255_VR_FW 0x30
64
65#define S2255_CONFIG_EP 2
66
67#define S2255_DSP_BOOTTIME 800
68
69#define S2255_LOAD_TIMEOUT (5000 + S2255_DSP_BOOTTIME)
70#define S2255_DEF_BUFS 16
71#define S2255_SETMODE_TIMEOUT 500
72#define S2255_VIDSTATUS_TIMEOUT 350
73#define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
74#define S2255_MARKER_RESPONSE cpu_to_le32(0x2255ACACL)
75#define S2255_RESPONSE_SETMODE cpu_to_le32(0x01)
76#define S2255_RESPONSE_FW cpu_to_le32(0x10)
77#define S2255_RESPONSE_STATUS cpu_to_le32(0x20)
78#define S2255_USB_XFER_SIZE (16 * 1024)
79#define MAX_CHANNELS 4
80#define SYS_FRAMES 4
81
82#define SYS_FRAMES_MAXSIZE (720*288*2*2 + 4096)
83#define DEF_USB_BLOCK S2255_USB_XFER_SIZE
84#define LINE_SZ_4CIFS_NTSC 640
85#define LINE_SZ_2CIFS_NTSC 640
86#define LINE_SZ_1CIFS_NTSC 320
87#define LINE_SZ_4CIFS_PAL 704
88#define LINE_SZ_2CIFS_PAL 704
89#define LINE_SZ_1CIFS_PAL 352
90#define NUM_LINES_4CIFS_NTSC 240
91#define NUM_LINES_2CIFS_NTSC 240
92#define NUM_LINES_1CIFS_NTSC 240
93#define NUM_LINES_4CIFS_PAL 288
94#define NUM_LINES_2CIFS_PAL 288
95#define NUM_LINES_1CIFS_PAL 288
96#define LINE_SZ_DEF 640
97#define NUM_LINES_DEF 240
98
99
100
101#define FORMAT_NTSC 1
102#define FORMAT_PAL 2
103
104#define SCALE_4CIFS 1
105#define SCALE_2CIFS 2
106#define SCALE_1CIFS 3
107
108#define SCALE_4CIFSI 4
109
110#define COLOR_YUVPL 1
111#define COLOR_YUVPK 2
112#define COLOR_Y8 4
113#define COLOR_JPG 5
114
115#define MASK_COLOR 0x000000ff
116#define MASK_JPG_QUALITY 0x0000ff00
117#define MASK_INPUT_TYPE 0x000f0000
118
119#define FDEC_1 1
120#define FDEC_2 2
121#define FDEC_3 3
122#define FDEC_5 5
123
124
125
126
127#define DEF_SCALE SCALE_4CIFS
128#define DEF_COLOR COLOR_YUVPL
129#define DEF_FDEC FDEC_1
130#define DEF_BRIGHT 0
131#define DEF_CONTRAST 0x5c
132#define DEF_SATURATION 0x80
133#define DEF_HUE 0
134
135
136#define IN_DATA_TOKEN cpu_to_le32(0x2255c0de)
137#define CMD_2255 cpu_to_le32(0xc2255000)
138#define CMD_SET_MODE cpu_to_le32((CMD_2255 | 0x10))
139#define CMD_START cpu_to_le32((CMD_2255 | 0x20))
140#define CMD_STOP cpu_to_le32((CMD_2255 | 0x30))
141#define CMD_STATUS cpu_to_le32((CMD_2255 | 0x40))
142
143struct s2255_mode {
144 u32 format;
145 u32 scale;
146 u32 color;
147 u32 fdec;
148 u32 bright;
149 u32 contrast;
150 u32 saturation;
151 u32 hue;
152 u32 single;
153 u32 usb_block;
154 u32 restart;
155};
156
157
158#define S2255_READ_IDLE 0
159#define S2255_READ_FRAME 1
160
161
162struct s2255_framei {
163 unsigned long size;
164 unsigned long ulState;
165 void *lpvbits;
166 unsigned long cur_size;
167};
168
169
170struct s2255_bufferi {
171 unsigned long dwFrames;
172 struct s2255_framei frame[SYS_FRAMES];
173};
174
175#define DEF_MODEI_NTSC_CONT {FORMAT_NTSC, DEF_SCALE, DEF_COLOR, \
176 DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
177 DEF_HUE, 0, DEF_USB_BLOCK, 0}
178
179struct s2255_dmaqueue {
180 struct list_head active;
181 struct s2255_dev *dev;
182};
183
184
185#define S2255_FW_NOTLOADED 0
186#define S2255_FW_LOADED_DSPWAIT 1
187#define S2255_FW_SUCCESS 2
188#define S2255_FW_FAILED 3
189#define S2255_FW_DISCONNECTING 4
190#define S2255_FW_MARKER cpu_to_le32(0x22552f2f)
191
192#define S2255_READ_IDLE 0
193#define S2255_READ_FRAME 1
194struct s2255_fw {
195 int fw_loaded;
196 int fw_size;
197 struct urb *fw_urb;
198 atomic_t fw_state;
199 void *pfw_data;
200 wait_queue_head_t wait_fw;
201 const struct firmware *fw;
202};
203
204struct s2255_pipeinfo {
205 u32 max_transfer_size;
206 u32 cur_transfer_size;
207 u8 *transfer_buffer;
208 u32 state;
209 void *stream_urb;
210 void *dev;
211 u32 err_count;
212 u32 idx;
213};
214
215struct s2255_fmt;
216struct s2255_dev;
217
218struct s2255_channel {
219 struct video_device vdev;
220 int resources;
221 struct s2255_dmaqueue vidq;
222 struct s2255_bufferi buffer;
223 struct s2255_mode mode;
224
225 struct v4l2_jpegcompression jc;
226
227 struct v4l2_captureparm cap_parm;
228 int cur_frame;
229 int last_frame;
230
231 int b_acquire;
232
233 unsigned long req_image_size;
234
235 unsigned long pkt_size;
236 int bad_payload;
237 unsigned long frame_count;
238
239 int jpg_size;
240
241 int configured;
242 wait_queue_head_t wait_setmode;
243 int setmode_ready;
244
245 int vidstatus;
246 wait_queue_head_t wait_vidstatus;
247 int vidstatus_ready;
248 unsigned int width;
249 unsigned int height;
250 const struct s2255_fmt *fmt;
251 int idx;
252};
253
254
255struct s2255_dev {
256 struct s2255_channel channel[MAX_CHANNELS];
257 struct v4l2_device v4l2_dev;
258 atomic_t num_channels;
259 int frames;
260 struct mutex lock;
261 struct mutex open_lock;
262 struct usb_device *udev;
263 struct usb_interface *interface;
264 u8 read_endpoint;
265 struct timer_list timer;
266 struct s2255_fw *fw_data;
267 struct s2255_pipeinfo pipe;
268 u32 cc;
269 int frame_ready;
270 int chn_ready;
271 spinlock_t slock;
272
273 int dsp_fw_ver;
274 u16 pid;
275};
276
277static inline struct s2255_dev *to_s2255_dev(struct v4l2_device *v4l2_dev)
278{
279 return container_of(v4l2_dev, struct s2255_dev, v4l2_dev);
280}
281
282struct s2255_fmt {
283 char *name;
284 u32 fourcc;
285 int depth;
286};
287
288
289struct s2255_buffer {
290
291 struct videobuf_buffer vb;
292 const struct s2255_fmt *fmt;
293};
294
295struct s2255_fh {
296 struct s2255_dev *dev;
297 struct videobuf_queue vb_vidq;
298 enum v4l2_buf_type type;
299 struct s2255_channel *channel;
300 int resources;
301};
302
303
304#define S2255_CUR_USB_FWVER ((3 << 8) | 12)
305
306#define S2255_CUR_DSP_FWVER 10104
307
308#define S2255_MIN_DSP_STATUS 5
309#define S2255_MIN_DSP_COLORFILTER 8
310#define S2255_NORMS (V4L2_STD_PAL | V4L2_STD_NTSC)
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338#define S2255_V4L2_YC_ON 1
339#define S2255_V4L2_YC_OFF 0
340#define V4L2_CID_PRIVATE_COLORFILTER (V4L2_CID_PRIVATE_BASE + 0)
341
342
343#define PREFIX_SIZE 512
344
345
346static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
347
348static int debug;
349static int *s2255_debug = &debug;
350
351static int s2255_start_readpipe(struct s2255_dev *dev);
352static void s2255_stop_readpipe(struct s2255_dev *dev);
353static int s2255_start_acquire(struct s2255_channel *channel);
354static int s2255_stop_acquire(struct s2255_channel *channel);
355static void s2255_fillbuff(struct s2255_channel *chn, struct s2255_buffer *buf,
356 int jpgsize);
357static int s2255_set_mode(struct s2255_channel *chan, struct s2255_mode *mode);
358static int s2255_board_shutdown(struct s2255_dev *dev);
359static void s2255_fwload_start(struct s2255_dev *dev, int reset);
360static void s2255_destroy(struct s2255_dev *dev);
361static long s2255_vendor_req(struct s2255_dev *dev, unsigned char req,
362 u16 index, u16 value, void *buf,
363 s32 buf_len, int bOut);
364
365
366#define S2255_DRIVER_NAME "s2255"
367#define s2255_dev_err(dev, fmt, arg...) \
368 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
369
370#define dprintk(level, fmt, arg...) \
371 do { \
372 if (*s2255_debug >= (level)) { \
373 printk(KERN_DEBUG S2255_DRIVER_NAME \
374 ": " fmt, ##arg); \
375 } \
376 } while (0)
377
378static struct usb_driver s2255_driver;
379
380
381static unsigned int vid_limit = 16;
382
383
384static int video_nr = -1;
385
386
387static int jpeg_enable = 1;
388
389module_param(debug, int, 0644);
390MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
391module_param(vid_limit, int, 0644);
392MODULE_PARM_DESC(vid_limit, "video memory limit(Mb)");
393module_param(video_nr, int, 0644);
394MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
395module_param(jpeg_enable, int, 0644);
396MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
397
398
399#define USB_SENSORAY_VID 0x1943
400static struct usb_device_id s2255_table[] = {
401 {USB_DEVICE(USB_SENSORAY_VID, 0x2255)},
402 {USB_DEVICE(USB_SENSORAY_VID, 0x2257)},
403 { }
404};
405MODULE_DEVICE_TABLE(usb, s2255_table);
406
407#define BUFFER_TIMEOUT msecs_to_jiffies(400)
408
409
410
411static const struct s2255_fmt formats[] = {
412 {
413 .name = "4:2:2, planar, YUV422P",
414 .fourcc = V4L2_PIX_FMT_YUV422P,
415 .depth = 16
416
417 }, {
418 .name = "4:2:2, packed, YUYV",
419 .fourcc = V4L2_PIX_FMT_YUYV,
420 .depth = 16
421
422 }, {
423 .name = "4:2:2, packed, UYVY",
424 .fourcc = V4L2_PIX_FMT_UYVY,
425 .depth = 16
426 }, {
427 .name = "8bpp GREY",
428 .fourcc = V4L2_PIX_FMT_GREY,
429 .depth = 8
430 }, {
431 .name = "JPG",
432 .fourcc = V4L2_PIX_FMT_JPEG,
433 .depth = 24
434 }, {
435 .name = "MJPG",
436 .fourcc = V4L2_PIX_FMT_MJPEG,
437 .depth = 24
438 }
439};
440
441static int norm_maxw(struct video_device *vdev)
442{
443 return (vdev->current_norm & V4L2_STD_NTSC) ?
444 LINE_SZ_4CIFS_NTSC : LINE_SZ_4CIFS_PAL;
445}
446
447static int norm_maxh(struct video_device *vdev)
448{
449 return (vdev->current_norm & V4L2_STD_NTSC) ?
450 (NUM_LINES_1CIFS_NTSC * 2) : (NUM_LINES_1CIFS_PAL * 2);
451}
452
453static int norm_minw(struct video_device *vdev)
454{
455 return (vdev->current_norm & V4L2_STD_NTSC) ?
456 LINE_SZ_1CIFS_NTSC : LINE_SZ_1CIFS_PAL;
457}
458
459static int norm_minh(struct video_device *vdev)
460{
461 return (vdev->current_norm & V4L2_STD_NTSC) ?
462 (NUM_LINES_1CIFS_NTSC) : (NUM_LINES_1CIFS_PAL);
463}
464
465
466
467
468
469
470static void planar422p_to_yuv_packed(const unsigned char *in,
471 unsigned char *out,
472 int width, int height,
473 int fmt)
474{
475 unsigned char *pY;
476 unsigned char *pCb;
477 unsigned char *pCr;
478 unsigned long size = height * width;
479 unsigned int i;
480 pY = (unsigned char *)in;
481 pCr = (unsigned char *)in + height * width;
482 pCb = (unsigned char *)in + height * width + (height * width / 2);
483 for (i = 0; i < size * 2; i += 4) {
484 out[i] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCr++;
485 out[i + 1] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCr++ : *pY++;
486 out[i + 2] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCb++;
487 out[i + 3] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCb++ : *pY++;
488 }
489 return;
490}
491
492static void s2255_reset_dsppower(struct s2255_dev *dev)
493{
494 s2255_vendor_req(dev, 0x40, 0x0000, 0x0001, NULL, 0, 1);
495 msleep(10);
496 s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
497 msleep(600);
498 s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
499 return;
500}
501
502
503
504static void s2255_timer(unsigned long user_data)
505{
506 struct s2255_fw *data = (struct s2255_fw *)user_data;
507 dprintk(100, "%s\n", __func__);
508 if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
509 printk(KERN_ERR "s2255: can't submit urb\n");
510 atomic_set(&data->fw_state, S2255_FW_FAILED);
511
512 wake_up(&data->wait_fw);
513 return;
514 }
515}
516
517
518
519
520
521
522
523
524static void s2255_fwchunk_complete(struct urb *urb)
525{
526 struct s2255_fw *data = urb->context;
527 struct usb_device *udev = urb->dev;
528 int len;
529 dprintk(100, "%s: udev %p urb %p", __func__, udev, urb);
530 if (urb->status) {
531 dev_err(&udev->dev, "URB failed with status %d\n", urb->status);
532 atomic_set(&data->fw_state, S2255_FW_FAILED);
533
534 wake_up(&data->wait_fw);
535 return;
536 }
537 if (data->fw_urb == NULL) {
538 s2255_dev_err(&udev->dev, "disconnected\n");
539 atomic_set(&data->fw_state, S2255_FW_FAILED);
540
541 wake_up(&data->wait_fw);
542 return;
543 }
544#define CHUNK_SIZE 512
545
546
547
548
549 if (data->fw_loaded < data->fw_size) {
550 len = (data->fw_loaded + CHUNK_SIZE) > data->fw_size ?
551 data->fw_size % CHUNK_SIZE : CHUNK_SIZE;
552
553 if (len < CHUNK_SIZE)
554 memset(data->pfw_data, 0, CHUNK_SIZE);
555
556 dprintk(100, "completed len %d, loaded %d \n", len,
557 data->fw_loaded);
558
559 memcpy(data->pfw_data,
560 (char *) data->fw->data + data->fw_loaded, len);
561
562 usb_fill_bulk_urb(data->fw_urb, udev, usb_sndbulkpipe(udev, 2),
563 data->pfw_data, CHUNK_SIZE,
564 s2255_fwchunk_complete, data);
565 if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
566 dev_err(&udev->dev, "failed submit URB\n");
567 atomic_set(&data->fw_state, S2255_FW_FAILED);
568
569 wake_up(&data->wait_fw);
570 return;
571 }
572 data->fw_loaded += len;
573 } else {
574 atomic_set(&data->fw_state, S2255_FW_LOADED_DSPWAIT);
575 dprintk(100, "%s: firmware upload complete\n", __func__);
576 }
577 return;
578
579}
580
581static int s2255_got_frame(struct s2255_channel *channel, int jpgsize)
582{
583 struct s2255_dmaqueue *dma_q = &channel->vidq;
584 struct s2255_buffer *buf;
585 struct s2255_dev *dev = to_s2255_dev(channel->vdev.v4l2_dev);
586 unsigned long flags = 0;
587 int rc = 0;
588 spin_lock_irqsave(&dev->slock, flags);
589 if (list_empty(&dma_q->active)) {
590 dprintk(1, "No active queue to serve\n");
591 rc = -1;
592 goto unlock;
593 }
594 buf = list_entry(dma_q->active.next,
595 struct s2255_buffer, vb.queue);
596 list_del(&buf->vb.queue);
597 do_gettimeofday(&buf->vb.ts);
598 s2255_fillbuff(channel, buf, jpgsize);
599 wake_up(&buf->vb.done);
600 dprintk(2, "%s: [buf/i] [%p/%d]\n", __func__, buf, buf->vb.i);
601unlock:
602 spin_unlock_irqrestore(&dev->slock, flags);
603 return rc;
604}
605
606static const struct s2255_fmt *format_by_fourcc(int fourcc)
607{
608 unsigned int i;
609 for (i = 0; i < ARRAY_SIZE(formats); i++) {
610 if (-1 == formats[i].fourcc)
611 continue;
612 if (!jpeg_enable && ((formats[i].fourcc == V4L2_PIX_FMT_JPEG) ||
613 (formats[i].fourcc == V4L2_PIX_FMT_MJPEG)))
614 continue;
615 if (formats[i].fourcc == fourcc)
616 return formats + i;
617 }
618 return NULL;
619}
620
621
622
623
624
625
626
627
628
629static void s2255_fillbuff(struct s2255_channel *channel,
630 struct s2255_buffer *buf, int jpgsize)
631{
632 int pos = 0;
633 struct timeval ts;
634 const char *tmpbuf;
635 char *vbuf = videobuf_to_vmalloc(&buf->vb);
636 unsigned long last_frame;
637 struct s2255_framei *frm;
638
639 if (!vbuf)
640 return;
641 last_frame = channel->last_frame;
642 if (last_frame != -1) {
643 frm = &channel->buffer.frame[last_frame];
644 tmpbuf =
645 (const char *)channel->buffer.frame[last_frame].lpvbits;
646 switch (buf->fmt->fourcc) {
647 case V4L2_PIX_FMT_YUYV:
648 case V4L2_PIX_FMT_UYVY:
649 planar422p_to_yuv_packed((const unsigned char *)tmpbuf,
650 vbuf, buf->vb.width,
651 buf->vb.height,
652 buf->fmt->fourcc);
653 break;
654 case V4L2_PIX_FMT_GREY:
655 memcpy(vbuf, tmpbuf, buf->vb.width * buf->vb.height);
656 break;
657 case V4L2_PIX_FMT_JPEG:
658 case V4L2_PIX_FMT_MJPEG:
659 buf->vb.size = jpgsize;
660 memcpy(vbuf, tmpbuf, buf->vb.size);
661 break;
662 case V4L2_PIX_FMT_YUV422P:
663 memcpy(vbuf, tmpbuf,
664 buf->vb.width * buf->vb.height * 2);
665 break;
666 default:
667 printk(KERN_DEBUG "s2255: unknown format?\n");
668 }
669 channel->last_frame = -1;
670 } else {
671 printk(KERN_ERR "s2255: =======no frame\n");
672 return;
673
674 }
675 dprintk(2, "s2255fill at : Buffer 0x%08lx size= %d\n",
676 (unsigned long)vbuf, pos);
677
678
679 buf->vb.field_count = channel->frame_count * 2;
680 do_gettimeofday(&ts);
681 buf->vb.ts = ts;
682 buf->vb.state = VIDEOBUF_DONE;
683}
684
685
686
687
688
689
690static int buffer_setup(struct videobuf_queue *vq, unsigned int *count,
691 unsigned int *size)
692{
693 struct s2255_fh *fh = vq->priv_data;
694 struct s2255_channel *channel = fh->channel;
695 *size = channel->width * channel->height * (channel->fmt->depth >> 3);
696
697 if (0 == *count)
698 *count = S2255_DEF_BUFS;
699
700 if (*size * *count > vid_limit * 1024 * 1024)
701 *count = (vid_limit * 1024 * 1024) / *size;
702
703 return 0;
704}
705
706static void free_buffer(struct videobuf_queue *vq, struct s2255_buffer *buf)
707{
708 dprintk(4, "%s\n", __func__);
709
710 videobuf_vmalloc_free(&buf->vb);
711 buf->vb.state = VIDEOBUF_NEEDS_INIT;
712}
713
714static int buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
715 enum v4l2_field field)
716{
717 struct s2255_fh *fh = vq->priv_data;
718 struct s2255_channel *channel = fh->channel;
719 struct s2255_buffer *buf = container_of(vb, struct s2255_buffer, vb);
720 int rc;
721 int w = channel->width;
722 int h = channel->height;
723 dprintk(4, "%s, field=%d\n", __func__, field);
724 if (channel->fmt == NULL)
725 return -EINVAL;
726
727 if ((w < norm_minw(&channel->vdev)) ||
728 (w > norm_maxw(&channel->vdev)) ||
729 (h < norm_minh(&channel->vdev)) ||
730 (h > norm_maxh(&channel->vdev))) {
731 dprintk(4, "invalid buffer prepare\n");
732 return -EINVAL;
733 }
734 buf->vb.size = w * h * (channel->fmt->depth >> 3);
735 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size) {
736 dprintk(4, "invalid buffer prepare\n");
737 return -EINVAL;
738 }
739
740 buf->fmt = channel->fmt;
741 buf->vb.width = w;
742 buf->vb.height = h;
743 buf->vb.field = field;
744
745 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
746 rc = videobuf_iolock(vq, &buf->vb, NULL);
747 if (rc < 0)
748 goto fail;
749 }
750
751 buf->vb.state = VIDEOBUF_PREPARED;
752 return 0;
753fail:
754 free_buffer(vq, buf);
755 return rc;
756}
757
758static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
759{
760 struct s2255_buffer *buf = container_of(vb, struct s2255_buffer, vb);
761 struct s2255_fh *fh = vq->priv_data;
762 struct s2255_channel *channel = fh->channel;
763 struct s2255_dmaqueue *vidq = &channel->vidq;
764 dprintk(1, "%s\n", __func__);
765 buf->vb.state = VIDEOBUF_QUEUED;
766 list_add_tail(&buf->vb.queue, &vidq->active);
767}
768
769static void buffer_release(struct videobuf_queue *vq,
770 struct videobuf_buffer *vb)
771{
772 struct s2255_buffer *buf = container_of(vb, struct s2255_buffer, vb);
773 struct s2255_fh *fh = vq->priv_data;
774 dprintk(4, "%s %d\n", __func__, fh->channel->idx);
775 free_buffer(vq, buf);
776}
777
778static struct videobuf_queue_ops s2255_video_qops = {
779 .buf_setup = buffer_setup,
780 .buf_prepare = buffer_prepare,
781 .buf_queue = buffer_queue,
782 .buf_release = buffer_release,
783};
784
785
786static int res_get(struct s2255_fh *fh)
787{
788 struct s2255_channel *channel = fh->channel;
789
790 if (channel->resources)
791 return 0;
792
793 channel->resources = 1;
794 fh->resources = 1;
795 dprintk(1, "s2255: res: get\n");
796 return 1;
797}
798
799static int res_locked(struct s2255_fh *fh)
800{
801 return fh->channel->resources;
802}
803
804static int res_check(struct s2255_fh *fh)
805{
806 return fh->resources;
807}
808
809
810static void res_free(struct s2255_fh *fh)
811{
812 struct s2255_channel *channel = fh->channel;
813 channel->resources = 0;
814 fh->resources = 0;
815 dprintk(1, "res: put\n");
816}
817
818static int vidioc_querymenu(struct file *file, void *priv,
819 struct v4l2_querymenu *qmenu)
820{
821 static const char *colorfilter[] = {
822 "Off",
823 "On",
824 NULL
825 };
826 if (qmenu->id == V4L2_CID_PRIVATE_COLORFILTER) {
827 int i;
828 const char **menu_items = colorfilter;
829 for (i = 0; i < qmenu->index && menu_items[i]; i++)
830 ;
831 if (menu_items[i] == NULL || menu_items[i][0] == '\0')
832 return -EINVAL;
833 strlcpy(qmenu->name, menu_items[qmenu->index],
834 sizeof(qmenu->name));
835 return 0;
836 }
837 return v4l2_ctrl_query_menu(qmenu, NULL, NULL);
838}
839
840static int vidioc_querycap(struct file *file, void *priv,
841 struct v4l2_capability *cap)
842{
843 struct s2255_fh *fh = file->private_data;
844 struct s2255_dev *dev = fh->dev;
845 strlcpy(cap->driver, "s2255", sizeof(cap->driver));
846 strlcpy(cap->card, "s2255", sizeof(cap->card));
847 usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
848 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
849 return 0;
850}
851
852static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
853 struct v4l2_fmtdesc *f)
854{
855 int index = 0;
856 if (f)
857 index = f->index;
858
859 if (index >= ARRAY_SIZE(formats))
860 return -EINVAL;
861 if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
862 (formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
863 return -EINVAL;
864 dprintk(4, "name %s\n", formats[index].name);
865 strlcpy(f->description, formats[index].name, sizeof(f->description));
866 f->pixelformat = formats[index].fourcc;
867 return 0;
868}
869
870static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
871 struct v4l2_format *f)
872{
873 struct s2255_fh *fh = priv;
874 struct s2255_channel *channel = fh->channel;
875
876 f->fmt.pix.width = channel->width;
877 f->fmt.pix.height = channel->height;
878 f->fmt.pix.field = fh->vb_vidq.field;
879 f->fmt.pix.pixelformat = channel->fmt->fourcc;
880 f->fmt.pix.bytesperline = f->fmt.pix.width * (channel->fmt->depth >> 3);
881 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
882 return 0;
883}
884
885static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
886 struct v4l2_format *f)
887{
888 const struct s2255_fmt *fmt;
889 enum v4l2_field field;
890 int b_any_field = 0;
891 struct s2255_fh *fh = priv;
892 struct s2255_channel *channel = fh->channel;
893 int is_ntsc;
894 is_ntsc =
895 (channel->vdev.current_norm & V4L2_STD_NTSC) ? 1 : 0;
896
897 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
898
899 if (fmt == NULL)
900 return -EINVAL;
901
902 field = f->fmt.pix.field;
903 if (field == V4L2_FIELD_ANY)
904 b_any_field = 1;
905
906 dprintk(50, "%s NTSC: %d suggested width: %d, height: %d\n",
907 __func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
908 if (is_ntsc) {
909
910 if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
911 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
912 if (b_any_field) {
913 field = V4L2_FIELD_SEQ_TB;
914 } else if (!((field == V4L2_FIELD_INTERLACED) ||
915 (field == V4L2_FIELD_SEQ_TB) ||
916 (field == V4L2_FIELD_INTERLACED_TB))) {
917 dprintk(1, "unsupported field setting\n");
918 return -EINVAL;
919 }
920 } else {
921 f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
922 if (b_any_field) {
923 field = V4L2_FIELD_TOP;
924 } else if (!((field == V4L2_FIELD_TOP) ||
925 (field == V4L2_FIELD_BOTTOM))) {
926 dprintk(1, "unsupported field setting\n");
927 return -EINVAL;
928 }
929
930 }
931 if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
932 f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
933 else if (f->fmt.pix.width >= LINE_SZ_2CIFS_NTSC)
934 f->fmt.pix.width = LINE_SZ_2CIFS_NTSC;
935 else if (f->fmt.pix.width >= LINE_SZ_1CIFS_NTSC)
936 f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
937 else
938 f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
939 } else {
940
941 if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
942 f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
943 if (b_any_field) {
944 field = V4L2_FIELD_SEQ_TB;
945 } else if (!((field == V4L2_FIELD_INTERLACED) ||
946 (field == V4L2_FIELD_SEQ_TB) ||
947 (field == V4L2_FIELD_INTERLACED_TB))) {
948 dprintk(1, "unsupported field setting\n");
949 return -EINVAL;
950 }
951 } else {
952 f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
953 if (b_any_field) {
954 field = V4L2_FIELD_TOP;
955 } else if (!((field == V4L2_FIELD_TOP) ||
956 (field == V4L2_FIELD_BOTTOM))) {
957 dprintk(1, "unsupported field setting\n");
958 return -EINVAL;
959 }
960 }
961 if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL) {
962 f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
963 field = V4L2_FIELD_SEQ_TB;
964 } else if (f->fmt.pix.width >= LINE_SZ_2CIFS_PAL) {
965 f->fmt.pix.width = LINE_SZ_2CIFS_PAL;
966 field = V4L2_FIELD_TOP;
967 } else if (f->fmt.pix.width >= LINE_SZ_1CIFS_PAL) {
968 f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
969 field = V4L2_FIELD_TOP;
970 } else {
971 f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
972 field = V4L2_FIELD_TOP;
973 }
974 }
975 f->fmt.pix.field = field;
976 f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
977 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
978 dprintk(50, "%s: set width %d height %d field %d\n", __func__,
979 f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
980 return 0;
981}
982
983static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
984 struct v4l2_format *f)
985{
986 struct s2255_fh *fh = priv;
987 struct s2255_channel *channel = fh->channel;
988 const struct s2255_fmt *fmt;
989 struct videobuf_queue *q = &fh->vb_vidq;
990 struct s2255_mode mode;
991 int ret;
992 int norm;
993
994 ret = vidioc_try_fmt_vid_cap(file, fh, f);
995
996 if (ret < 0)
997 return ret;
998
999 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1000
1001 if (fmt == NULL)
1002 return -EINVAL;
1003
1004 mutex_lock(&q->vb_lock);
1005
1006 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1007 dprintk(1, "queue busy\n");
1008 ret = -EBUSY;
1009 goto out_s_fmt;
1010 }
1011
1012 if (res_locked(fh)) {
1013 dprintk(1, "%s: channel busy\n", __func__);
1014 ret = -EBUSY;
1015 goto out_s_fmt;
1016 }
1017 mode = channel->mode;
1018 channel->fmt = fmt;
1019 channel->width = f->fmt.pix.width;
1020 channel->height = f->fmt.pix.height;
1021 fh->vb_vidq.field = f->fmt.pix.field;
1022 fh->type = f->type;
1023 norm = norm_minw(&channel->vdev);
1024 if (channel->width > norm_minw(&channel->vdev)) {
1025 if (channel->height > norm_minh(&channel->vdev)) {
1026 if (channel->cap_parm.capturemode &
1027 V4L2_MODE_HIGHQUALITY)
1028 mode.scale = SCALE_4CIFSI;
1029 else
1030 mode.scale = SCALE_4CIFS;
1031 } else
1032 mode.scale = SCALE_2CIFS;
1033
1034 } else {
1035 mode.scale = SCALE_1CIFS;
1036 }
1037
1038 switch (channel->fmt->fourcc) {
1039 case V4L2_PIX_FMT_GREY:
1040 mode.color &= ~MASK_COLOR;
1041 mode.color |= COLOR_Y8;
1042 break;
1043 case V4L2_PIX_FMT_JPEG:
1044 case V4L2_PIX_FMT_MJPEG:
1045 mode.color &= ~MASK_COLOR;
1046 mode.color |= COLOR_JPG;
1047 mode.color |= (channel->jc.quality << 8);
1048 break;
1049 case V4L2_PIX_FMT_YUV422P:
1050 mode.color &= ~MASK_COLOR;
1051 mode.color |= COLOR_YUVPL;
1052 break;
1053 case V4L2_PIX_FMT_YUYV:
1054 case V4L2_PIX_FMT_UYVY:
1055 default:
1056 mode.color &= ~MASK_COLOR;
1057 mode.color |= COLOR_YUVPK;
1058 break;
1059 }
1060 if ((mode.color & MASK_COLOR) != (channel->mode.color & MASK_COLOR))
1061 mode.restart = 1;
1062 else if (mode.scale != channel->mode.scale)
1063 mode.restart = 1;
1064 else if (mode.format != channel->mode.format)
1065 mode.restart = 1;
1066 channel->mode = mode;
1067 (void) s2255_set_mode(channel, &mode);
1068 ret = 0;
1069out_s_fmt:
1070 mutex_unlock(&q->vb_lock);
1071 return ret;
1072}
1073
1074static int vidioc_reqbufs(struct file *file, void *priv,
1075 struct v4l2_requestbuffers *p)
1076{
1077 int rc;
1078 struct s2255_fh *fh = priv;
1079 rc = videobuf_reqbufs(&fh->vb_vidq, p);
1080 return rc;
1081}
1082
1083static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
1084{
1085 int rc;
1086 struct s2255_fh *fh = priv;
1087 rc = videobuf_querybuf(&fh->vb_vidq, p);
1088 return rc;
1089}
1090
1091static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1092{
1093 int rc;
1094 struct s2255_fh *fh = priv;
1095 rc = videobuf_qbuf(&fh->vb_vidq, p);
1096 return rc;
1097}
1098
1099static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1100{
1101 int rc;
1102 struct s2255_fh *fh = priv;
1103 rc = videobuf_dqbuf(&fh->vb_vidq, p, file->f_flags & O_NONBLOCK);
1104 return rc;
1105}
1106
1107
1108static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
1109 int size)
1110{
1111 int pipe;
1112 int done;
1113 long retval = -1;
1114 if (udev) {
1115 pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
1116 retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
1117 }
1118 return retval;
1119}
1120
1121static u32 get_transfer_size(struct s2255_mode *mode)
1122{
1123 int linesPerFrame = LINE_SZ_DEF;
1124 int pixelsPerLine = NUM_LINES_DEF;
1125 u32 outImageSize;
1126 u32 usbInSize;
1127 unsigned int mask_mult;
1128
1129 if (mode == NULL)
1130 return 0;
1131
1132 if (mode->format == FORMAT_NTSC) {
1133 switch (mode->scale) {
1134 case SCALE_4CIFS:
1135 case SCALE_4CIFSI:
1136 linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
1137 pixelsPerLine = LINE_SZ_4CIFS_NTSC;
1138 break;
1139 case SCALE_2CIFS:
1140 linesPerFrame = NUM_LINES_2CIFS_NTSC;
1141 pixelsPerLine = LINE_SZ_2CIFS_NTSC;
1142 break;
1143 case SCALE_1CIFS:
1144 linesPerFrame = NUM_LINES_1CIFS_NTSC;
1145 pixelsPerLine = LINE_SZ_1CIFS_NTSC;
1146 break;
1147 default:
1148 break;
1149 }
1150 } else if (mode->format == FORMAT_PAL) {
1151 switch (mode->scale) {
1152 case SCALE_4CIFS:
1153 case SCALE_4CIFSI:
1154 linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
1155 pixelsPerLine = LINE_SZ_4CIFS_PAL;
1156 break;
1157 case SCALE_2CIFS:
1158 linesPerFrame = NUM_LINES_2CIFS_PAL;
1159 pixelsPerLine = LINE_SZ_2CIFS_PAL;
1160 break;
1161 case SCALE_1CIFS:
1162 linesPerFrame = NUM_LINES_1CIFS_PAL;
1163 pixelsPerLine = LINE_SZ_1CIFS_PAL;
1164 break;
1165 default:
1166 break;
1167 }
1168 }
1169 outImageSize = linesPerFrame * pixelsPerLine;
1170 if ((mode->color & MASK_COLOR) != COLOR_Y8) {
1171
1172 outImageSize *= 2;
1173 }
1174
1175
1176
1177 usbInSize = outImageSize + PREFIX_SIZE;
1178 mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
1179
1180 if (usbInSize & ~mask_mult)
1181 usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
1182 return usbInSize;
1183}
1184
1185static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
1186{
1187 struct device *dev = &sdev->udev->dev;
1188 dev_info(dev, "------------------------------------------------\n");
1189 dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
1190 dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
1191 dev_info(dev, "bright: 0x%x\n", mode->bright);
1192 dev_info(dev, "------------------------------------------------\n");
1193}
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203static int s2255_set_mode(struct s2255_channel *channel,
1204 struct s2255_mode *mode)
1205{
1206 int res;
1207 __le32 *buffer;
1208 unsigned long chn_rev;
1209 struct s2255_dev *dev = to_s2255_dev(channel->vdev.v4l2_dev);
1210 chn_rev = G_chnmap[channel->idx];
1211 dprintk(3, "%s channel: %d\n", __func__, channel->idx);
1212
1213 if ((mode->color & MASK_COLOR) == COLOR_JPG) {
1214 mode->color &= ~MASK_COLOR;
1215 mode->color |= COLOR_JPG;
1216 mode->color &= ~MASK_JPG_QUALITY;
1217 mode->color |= (channel->jc.quality << 8);
1218 }
1219
1220 channel->mode = *mode;
1221 channel->req_image_size = get_transfer_size(mode);
1222 dprintk(1, "%s: reqsize %ld\n", __func__, channel->req_image_size);
1223 buffer = kzalloc(512, GFP_KERNEL);
1224 if (buffer == NULL) {
1225 dev_err(&dev->udev->dev, "out of mem\n");
1226 return -ENOMEM;
1227 }
1228
1229 buffer[0] = IN_DATA_TOKEN;
1230 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1231 buffer[2] = CMD_SET_MODE;
1232 memcpy(&buffer[3], &channel->mode, sizeof(struct s2255_mode));
1233 channel->setmode_ready = 0;
1234 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1235 if (debug)
1236 s2255_print_cfg(dev, mode);
1237 kfree(buffer);
1238
1239 if (mode->restart) {
1240 wait_event_timeout(channel->wait_setmode,
1241 (channel->setmode_ready != 0),
1242 msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
1243 if (channel->setmode_ready != 1) {
1244 printk(KERN_DEBUG "s2255: no set mode response\n");
1245 res = -EFAULT;
1246 }
1247 }
1248
1249 channel->mode.restart = 0;
1250 dprintk(1, "%s chn %d, result: %d\n", __func__, channel->idx, res);
1251 return res;
1252}
1253
1254static int s2255_cmd_status(struct s2255_channel *channel, u32 *pstatus)
1255{
1256 int res;
1257 __le32 *buffer;
1258 u32 chn_rev;
1259 struct s2255_dev *dev = to_s2255_dev(channel->vdev.v4l2_dev);
1260 chn_rev = G_chnmap[channel->idx];
1261 dprintk(4, "%s chan %d\n", __func__, channel->idx);
1262 buffer = kzalloc(512, GFP_KERNEL);
1263 if (buffer == NULL) {
1264 dev_err(&dev->udev->dev, "out of mem\n");
1265 return -ENOMEM;
1266 }
1267
1268 buffer[0] = IN_DATA_TOKEN;
1269 buffer[1] = (__le32) cpu_to_le32(chn_rev);
1270 buffer[2] = CMD_STATUS;
1271 *pstatus = 0;
1272 channel->vidstatus_ready = 0;
1273 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1274 kfree(buffer);
1275 wait_event_timeout(channel->wait_vidstatus,
1276 (channel->vidstatus_ready != 0),
1277 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
1278 if (channel->vidstatus_ready != 1) {
1279 printk(KERN_DEBUG "s2255: no vidstatus response\n");
1280 res = -EFAULT;
1281 }
1282 *pstatus = channel->vidstatus;
1283 dprintk(4, "%s, vid status %d\n", __func__, *pstatus);
1284 return res;
1285}
1286
1287static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
1288{
1289 int res;
1290 struct s2255_fh *fh = priv;
1291 struct s2255_dev *dev = fh->dev;
1292 struct s2255_channel *channel = fh->channel;
1293 int j;
1294 dprintk(4, "%s\n", __func__);
1295 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1296 dev_err(&dev->udev->dev, "invalid fh type0\n");
1297 return -EINVAL;
1298 }
1299 if (i != fh->type) {
1300 dev_err(&dev->udev->dev, "invalid fh type1\n");
1301 return -EINVAL;
1302 }
1303
1304 if (!res_get(fh)) {
1305 s2255_dev_err(&dev->udev->dev, "stream busy\n");
1306 return -EBUSY;
1307 }
1308 channel->last_frame = -1;
1309 channel->bad_payload = 0;
1310 channel->cur_frame = 0;
1311 channel->frame_count = 0;
1312 for (j = 0; j < SYS_FRAMES; j++) {
1313 channel->buffer.frame[j].ulState = S2255_READ_IDLE;
1314 channel->buffer.frame[j].cur_size = 0;
1315 }
1316 res = videobuf_streamon(&fh->vb_vidq);
1317 if (res == 0) {
1318 s2255_start_acquire(channel);
1319 channel->b_acquire = 1;
1320 } else
1321 res_free(fh);
1322
1323 return res;
1324}
1325
1326static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
1327{
1328 struct s2255_fh *fh = priv;
1329 dprintk(4, "%s\n, channel: %d", __func__, fh->channel->idx);
1330 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1331 printk(KERN_ERR "invalid fh type0\n");
1332 return -EINVAL;
1333 }
1334 if (i != fh->type) {
1335 printk(KERN_ERR "invalid type i\n");
1336 return -EINVAL;
1337 }
1338 s2255_stop_acquire(fh->channel);
1339 videobuf_streamoff(&fh->vb_vidq);
1340 res_free(fh);
1341 return 0;
1342}
1343
1344static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
1345{
1346 struct s2255_fh *fh = priv;
1347 struct s2255_mode mode;
1348 struct videobuf_queue *q = &fh->vb_vidq;
1349 int ret = 0;
1350 mutex_lock(&q->vb_lock);
1351 if (videobuf_queue_is_busy(q)) {
1352 dprintk(1, "queue busy\n");
1353 ret = -EBUSY;
1354 goto out_s_std;
1355 }
1356 if (res_locked(fh)) {
1357 dprintk(1, "can't change standard after started\n");
1358 ret = -EBUSY;
1359 goto out_s_std;
1360 }
1361 mode = fh->channel->mode;
1362 if (*i & V4L2_STD_NTSC) {
1363 dprintk(4, "%s NTSC\n", __func__);
1364
1365 if (mode.format != FORMAT_NTSC) {
1366 mode.restart = 1;
1367 mode.format = FORMAT_NTSC;
1368 mode.fdec = FDEC_1;
1369 }
1370 } else if (*i & V4L2_STD_PAL) {
1371 dprintk(4, "%s PAL\n", __func__);
1372 if (mode.format != FORMAT_PAL) {
1373 mode.restart = 1;
1374 mode.format = FORMAT_PAL;
1375 mode.fdec = FDEC_1;
1376 }
1377 } else {
1378 ret = -EINVAL;
1379 }
1380 if (mode.restart)
1381 s2255_set_mode(fh->channel, &mode);
1382out_s_std:
1383 mutex_unlock(&q->vb_lock);
1384 return ret;
1385}
1386
1387
1388
1389
1390
1391
1392
1393
1394static int vidioc_enum_input(struct file *file, void *priv,
1395 struct v4l2_input *inp)
1396{
1397 struct s2255_fh *fh = priv;
1398 struct s2255_dev *dev = fh->dev;
1399 struct s2255_channel *channel = fh->channel;
1400 u32 status = 0;
1401 if (inp->index != 0)
1402 return -EINVAL;
1403 inp->type = V4L2_INPUT_TYPE_CAMERA;
1404 inp->std = S2255_NORMS;
1405 inp->status = 0;
1406 if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1407 int rc;
1408 rc = s2255_cmd_status(fh->channel, &status);
1409 dprintk(4, "s2255_cmd_status rc: %d status %x\n", rc, status);
1410 if (rc == 0)
1411 inp->status = (status & 0x01) ? 0
1412 : V4L2_IN_ST_NO_SIGNAL;
1413 }
1414 switch (dev->pid) {
1415 case 0x2255:
1416 default:
1417 strlcpy(inp->name, "Composite", sizeof(inp->name));
1418 break;
1419 case 0x2257:
1420 strlcpy(inp->name, (channel->idx < 2) ? "Composite" : "S-Video",
1421 sizeof(inp->name));
1422 break;
1423 }
1424 return 0;
1425}
1426
1427static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1428{
1429 *i = 0;
1430 return 0;
1431}
1432static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1433{
1434 if (i > 0)
1435 return -EINVAL;
1436 return 0;
1437}
1438
1439
1440static int vidioc_queryctrl(struct file *file, void *priv,
1441 struct v4l2_queryctrl *qc)
1442{
1443 struct s2255_fh *fh = priv;
1444 struct s2255_channel *channel = fh->channel;
1445 struct s2255_dev *dev = fh->dev;
1446 switch (qc->id) {
1447 case V4L2_CID_BRIGHTNESS:
1448 v4l2_ctrl_query_fill(qc, -127, 127, 1, DEF_BRIGHT);
1449 break;
1450 case V4L2_CID_CONTRAST:
1451 v4l2_ctrl_query_fill(qc, 0, 255, 1, DEF_CONTRAST);
1452 break;
1453 case V4L2_CID_SATURATION:
1454 v4l2_ctrl_query_fill(qc, 0, 255, 1, DEF_SATURATION);
1455 break;
1456 case V4L2_CID_HUE:
1457 v4l2_ctrl_query_fill(qc, 0, 255, 1, DEF_HUE);
1458 break;
1459 case V4L2_CID_PRIVATE_COLORFILTER:
1460 if (dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
1461 return -EINVAL;
1462 if ((dev->pid == 0x2257) && (channel->idx > 1))
1463 return -EINVAL;
1464 strlcpy(qc->name, "Color Filter", sizeof(qc->name));
1465 qc->type = V4L2_CTRL_TYPE_MENU;
1466 qc->minimum = 0;
1467 qc->maximum = 1;
1468 qc->step = 1;
1469 qc->default_value = 1;
1470 qc->flags = 0;
1471 break;
1472 default:
1473 return -EINVAL;
1474 }
1475 dprintk(4, "%s, id %d\n", __func__, qc->id);
1476 return 0;
1477}
1478
1479static int vidioc_g_ctrl(struct file *file, void *priv,
1480 struct v4l2_control *ctrl)
1481{
1482 struct s2255_fh *fh = priv;
1483 struct s2255_dev *dev = fh->dev;
1484 struct s2255_channel *channel = fh->channel;
1485 switch (ctrl->id) {
1486 case V4L2_CID_BRIGHTNESS:
1487 ctrl->value = channel->mode.bright;
1488 break;
1489 case V4L2_CID_CONTRAST:
1490 ctrl->value = channel->mode.contrast;
1491 break;
1492 case V4L2_CID_SATURATION:
1493 ctrl->value = channel->mode.saturation;
1494 break;
1495 case V4L2_CID_HUE:
1496 ctrl->value = channel->mode.hue;
1497 break;
1498 case V4L2_CID_PRIVATE_COLORFILTER:
1499 if (dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
1500 return -EINVAL;
1501 if ((dev->pid == 0x2257) && (channel->idx > 1))
1502 return -EINVAL;
1503 ctrl->value = !((channel->mode.color & MASK_INPUT_TYPE) >> 16);
1504 break;
1505 default:
1506 return -EINVAL;
1507 }
1508 dprintk(4, "%s, id %d val %d\n", __func__, ctrl->id, ctrl->value);
1509 return 0;
1510}
1511
1512static int vidioc_s_ctrl(struct file *file, void *priv,
1513 struct v4l2_control *ctrl)
1514{
1515 struct s2255_fh *fh = priv;
1516 struct s2255_channel *channel = fh->channel;
1517 struct s2255_dev *dev = to_s2255_dev(channel->vdev.v4l2_dev);
1518 struct s2255_mode mode;
1519 mode = channel->mode;
1520 dprintk(4, "%s\n", __func__);
1521
1522 switch (ctrl->id) {
1523 case V4L2_CID_BRIGHTNESS:
1524 mode.bright = ctrl->value;
1525 break;
1526 case V4L2_CID_CONTRAST:
1527 mode.contrast = ctrl->value;
1528 break;
1529 case V4L2_CID_HUE:
1530 mode.hue = ctrl->value;
1531 break;
1532 case V4L2_CID_SATURATION:
1533 mode.saturation = ctrl->value;
1534 break;
1535 case V4L2_CID_PRIVATE_COLORFILTER:
1536 if (dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
1537 return -EINVAL;
1538 if ((dev->pid == 0x2257) && (channel->idx > 1))
1539 return -EINVAL;
1540 mode.color &= ~MASK_INPUT_TYPE;
1541 mode.color |= ((ctrl->value ? 0 : 1) << 16);
1542 break;
1543 default:
1544 return -EINVAL;
1545 }
1546 mode.restart = 0;
1547
1548
1549
1550
1551 s2255_set_mode(fh->channel, &mode);
1552 return 0;
1553}
1554
1555static int vidioc_g_jpegcomp(struct file *file, void *priv,
1556 struct v4l2_jpegcompression *jc)
1557{
1558 struct s2255_fh *fh = priv;
1559 struct s2255_channel *channel = fh->channel;
1560 *jc = channel->jc;
1561 dprintk(2, "%s: quality %d\n", __func__, jc->quality);
1562 return 0;
1563}
1564
1565static int vidioc_s_jpegcomp(struct file *file, void *priv,
1566 struct v4l2_jpegcompression *jc)
1567{
1568 struct s2255_fh *fh = priv;
1569 struct s2255_channel *channel = fh->channel;
1570 if (jc->quality < 0 || jc->quality > 100)
1571 return -EINVAL;
1572 channel->jc.quality = jc->quality;
1573 dprintk(2, "%s: quality %d\n", __func__, jc->quality);
1574 return 0;
1575}
1576
1577static int vidioc_g_parm(struct file *file, void *priv,
1578 struct v4l2_streamparm *sp)
1579{
1580 struct s2255_fh *fh = priv;
1581 __u32 def_num, def_dem;
1582 struct s2255_channel *channel = fh->channel;
1583 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1584 return -EINVAL;
1585 memset(sp, 0, sizeof(struct v4l2_streamparm));
1586 sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1587 sp->parm.capture.capturemode = channel->cap_parm.capturemode;
1588 def_num = (channel->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1589 def_dem = (channel->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1590 sp->parm.capture.timeperframe.denominator = def_dem;
1591 switch (channel->mode.fdec) {
1592 default:
1593 case FDEC_1:
1594 sp->parm.capture.timeperframe.numerator = def_num;
1595 break;
1596 case FDEC_2:
1597 sp->parm.capture.timeperframe.numerator = def_num * 2;
1598 break;
1599 case FDEC_3:
1600 sp->parm.capture.timeperframe.numerator = def_num * 3;
1601 break;
1602 case FDEC_5:
1603 sp->parm.capture.timeperframe.numerator = def_num * 5;
1604 break;
1605 }
1606 dprintk(4, "%s capture mode, %d timeperframe %d/%d\n", __func__,
1607 sp->parm.capture.capturemode,
1608 sp->parm.capture.timeperframe.numerator,
1609 sp->parm.capture.timeperframe.denominator);
1610 return 0;
1611}
1612
1613static int vidioc_s_parm(struct file *file, void *priv,
1614 struct v4l2_streamparm *sp)
1615{
1616 struct s2255_fh *fh = priv;
1617 struct s2255_channel *channel = fh->channel;
1618 struct s2255_mode mode;
1619 int fdec = FDEC_1;
1620 __u32 def_num, def_dem;
1621 if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1622 return -EINVAL;
1623 mode = channel->mode;
1624
1625 if (channel->cap_parm.capturemode
1626 != sp->parm.capture.capturemode && res_locked(fh))
1627 return -EBUSY;
1628 def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
1629 def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
1630 if (def_dem != sp->parm.capture.timeperframe.denominator)
1631 sp->parm.capture.timeperframe.numerator = def_num;
1632 else if (sp->parm.capture.timeperframe.numerator <= def_num)
1633 sp->parm.capture.timeperframe.numerator = def_num;
1634 else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
1635 sp->parm.capture.timeperframe.numerator = def_num * 2;
1636 fdec = FDEC_2;
1637 } else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
1638 sp->parm.capture.timeperframe.numerator = def_num * 3;
1639 fdec = FDEC_3;
1640 } else {
1641 sp->parm.capture.timeperframe.numerator = def_num * 5;
1642 fdec = FDEC_5;
1643 }
1644 mode.fdec = fdec;
1645 sp->parm.capture.timeperframe.denominator = def_dem;
1646 s2255_set_mode(channel, &mode);
1647 dprintk(4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1648 __func__,
1649 sp->parm.capture.capturemode,
1650 sp->parm.capture.timeperframe.numerator,
1651 sp->parm.capture.timeperframe.denominator, fdec);
1652 return 0;
1653}
1654
1655static int vidioc_enum_frameintervals(struct file *file, void *priv,
1656 struct v4l2_frmivalenum *fe)
1657{
1658 int is_ntsc = 0;
1659#define NUM_FRAME_ENUMS 4
1660 int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1661 if (fe->index < 0 || fe->index >= NUM_FRAME_ENUMS)
1662 return -EINVAL;
1663 switch (fe->width) {
1664 case 640:
1665 if (fe->height != 240 && fe->height != 480)
1666 return -EINVAL;
1667 is_ntsc = 1;
1668 break;
1669 case 320:
1670 if (fe->height != 240)
1671 return -EINVAL;
1672 is_ntsc = 1;
1673 break;
1674 case 704:
1675 if (fe->height != 288 && fe->height != 576)
1676 return -EINVAL;
1677 break;
1678 case 352:
1679 if (fe->height != 288)
1680 return -EINVAL;
1681 break;
1682 default:
1683 return -EINVAL;
1684 }
1685 fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1686 fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1687 fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1688 dprintk(4, "%s discrete %d/%d\n", __func__, fe->discrete.numerator,
1689 fe->discrete.denominator);
1690 return 0;
1691}
1692
1693static int s2255_open(struct file *file)
1694{
1695 struct video_device *vdev = video_devdata(file);
1696 struct s2255_channel *channel = video_drvdata(file);
1697 struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
1698 struct s2255_fh *fh;
1699 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1700 int state;
1701 dprintk(1, "s2255: open called (dev=%s)\n",
1702 video_device_node_name(vdev));
1703
1704
1705
1706
1707
1708 mutex_lock(&dev->open_lock);
1709 state = atomic_read(&dev->fw_data->fw_state);
1710 switch (state) {
1711 case S2255_FW_DISCONNECTING:
1712 mutex_unlock(&dev->open_lock);
1713 return -ENODEV;
1714 case S2255_FW_FAILED:
1715 s2255_dev_err(&dev->udev->dev,
1716 "firmware load failed. retrying.\n");
1717 s2255_fwload_start(dev, 1);
1718 wait_event_timeout(dev->fw_data->wait_fw,
1719 ((atomic_read(&dev->fw_data->fw_state)
1720 == S2255_FW_SUCCESS) ||
1721 (atomic_read(&dev->fw_data->fw_state)
1722 == S2255_FW_DISCONNECTING)),
1723 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1724
1725 state = atomic_read(&dev->fw_data->fw_state);
1726 break;
1727 case S2255_FW_NOTLOADED:
1728 case S2255_FW_LOADED_DSPWAIT:
1729
1730
1731 printk(KERN_INFO "%s waiting for firmware load\n", __func__);
1732 wait_event_timeout(dev->fw_data->wait_fw,
1733 ((atomic_read(&dev->fw_data->fw_state)
1734 == S2255_FW_SUCCESS) ||
1735 (atomic_read(&dev->fw_data->fw_state)
1736 == S2255_FW_DISCONNECTING)),
1737 msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1738
1739 state = atomic_read(&dev->fw_data->fw_state);
1740 break;
1741 case S2255_FW_SUCCESS:
1742 default:
1743 break;
1744 }
1745
1746 switch (state) {
1747 case S2255_FW_SUCCESS:
1748 break;
1749 case S2255_FW_FAILED:
1750 printk(KERN_INFO "2255 firmware load failed.\n");
1751 mutex_unlock(&dev->open_lock);
1752 return -ENODEV;
1753 case S2255_FW_DISCONNECTING:
1754 printk(KERN_INFO "%s: disconnecting\n", __func__);
1755 mutex_unlock(&dev->open_lock);
1756 return -ENODEV;
1757 case S2255_FW_LOADED_DSPWAIT:
1758 case S2255_FW_NOTLOADED:
1759 printk(KERN_INFO "%s: firmware not loaded yet"
1760 "please try again later\n",
1761 __func__);
1762
1763
1764
1765
1766
1767 atomic_set(&dev->fw_data->fw_state,
1768 S2255_FW_FAILED);
1769 mutex_unlock(&dev->open_lock);
1770 return -EAGAIN;
1771 default:
1772 printk(KERN_INFO "%s: unknown state\n", __func__);
1773 mutex_unlock(&dev->open_lock);
1774 return -EFAULT;
1775 }
1776 mutex_unlock(&dev->open_lock);
1777
1778 fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1779 if (NULL == fh)
1780 return -ENOMEM;
1781 file->private_data = fh;
1782 fh->dev = dev;
1783 fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1784 fh->channel = channel;
1785 if (!channel->configured) {
1786
1787 channel->fmt = &formats[0];
1788 s2255_set_mode(channel, &channel->mode);
1789 channel->configured = 1;
1790 }
1791 dprintk(1, "%s: dev=%s type=%s\n", __func__,
1792 video_device_node_name(vdev), v4l2_type_names[type]);
1793 dprintk(2, "%s: fh=0x%08lx, dev=0x%08lx, vidq=0x%08lx\n", __func__,
1794 (unsigned long)fh, (unsigned long)dev,
1795 (unsigned long)&channel->vidq);
1796 dprintk(4, "%s: list_empty active=%d\n", __func__,
1797 list_empty(&channel->vidq.active));
1798 videobuf_queue_vmalloc_init(&fh->vb_vidq, &s2255_video_qops,
1799 NULL, &dev->slock,
1800 fh->type,
1801 V4L2_FIELD_INTERLACED,
1802 sizeof(struct s2255_buffer),
1803 fh, vdev->lock);
1804 return 0;
1805}
1806
1807
1808static unsigned int s2255_poll(struct file *file,
1809 struct poll_table_struct *wait)
1810{
1811 struct s2255_fh *fh = file->private_data;
1812 int rc;
1813 dprintk(100, "%s\n", __func__);
1814 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
1815 return POLLERR;
1816 rc = videobuf_poll_stream(file, &fh->vb_vidq, wait);
1817 return rc;
1818}
1819
1820static void s2255_destroy(struct s2255_dev *dev)
1821{
1822
1823 s2255_board_shutdown(dev);
1824
1825 del_timer(&dev->timer);
1826 if (dev->fw_data->fw_urb) {
1827 usb_kill_urb(dev->fw_data->fw_urb);
1828 usb_free_urb(dev->fw_data->fw_urb);
1829 dev->fw_data->fw_urb = NULL;
1830 }
1831 if (dev->fw_data->fw)
1832 release_firmware(dev->fw_data->fw);
1833 kfree(dev->fw_data->pfw_data);
1834 kfree(dev->fw_data);
1835
1836 s2255_reset_dsppower(dev);
1837 mutex_destroy(&dev->open_lock);
1838 mutex_destroy(&dev->lock);
1839 usb_put_dev(dev->udev);
1840 v4l2_device_unregister(&dev->v4l2_dev);
1841 dprintk(1, "%s", __func__);
1842 kfree(dev);
1843}
1844
1845static int s2255_release(struct file *file)
1846{
1847 struct s2255_fh *fh = file->private_data;
1848 struct s2255_dev *dev = fh->dev;
1849 struct video_device *vdev = video_devdata(file);
1850 struct s2255_channel *channel = fh->channel;
1851 if (!dev)
1852 return -ENODEV;
1853
1854 if (res_check(fh)) {
1855 if (channel->b_acquire)
1856 s2255_stop_acquire(fh->channel);
1857 videobuf_streamoff(&fh->vb_vidq);
1858 res_free(fh);
1859 }
1860 videobuf_mmap_free(&fh->vb_vidq);
1861 dprintk(1, "%s (dev=%s)\n", __func__, video_device_node_name(vdev));
1862 kfree(fh);
1863 return 0;
1864}
1865
1866static int s2255_mmap_v4l(struct file *file, struct vm_area_struct *vma)
1867{
1868 struct s2255_fh *fh = file->private_data;
1869 int ret;
1870
1871 if (!fh)
1872 return -ENODEV;
1873 dprintk(4, "%s, vma=0x%08lx\n", __func__, (unsigned long)vma);
1874 ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1875 dprintk(4, "%s vma start=0x%08lx, size=%ld, ret=%d\n", __func__,
1876 (unsigned long)vma->vm_start,
1877 (unsigned long)vma->vm_end - (unsigned long)vma->vm_start, ret);
1878 return ret;
1879}
1880
1881static const struct v4l2_file_operations s2255_fops_v4l = {
1882 .owner = THIS_MODULE,
1883 .open = s2255_open,
1884 .release = s2255_release,
1885 .poll = s2255_poll,
1886 .unlocked_ioctl = video_ioctl2,
1887 .mmap = s2255_mmap_v4l,
1888};
1889
1890static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1891 .vidioc_querymenu = vidioc_querymenu,
1892 .vidioc_querycap = vidioc_querycap,
1893 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1894 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1895 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1896 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1897 .vidioc_reqbufs = vidioc_reqbufs,
1898 .vidioc_querybuf = vidioc_querybuf,
1899 .vidioc_qbuf = vidioc_qbuf,
1900 .vidioc_dqbuf = vidioc_dqbuf,
1901 .vidioc_s_std = vidioc_s_std,
1902 .vidioc_enum_input = vidioc_enum_input,
1903 .vidioc_g_input = vidioc_g_input,
1904 .vidioc_s_input = vidioc_s_input,
1905 .vidioc_queryctrl = vidioc_queryctrl,
1906 .vidioc_g_ctrl = vidioc_g_ctrl,
1907 .vidioc_s_ctrl = vidioc_s_ctrl,
1908 .vidioc_streamon = vidioc_streamon,
1909 .vidioc_streamoff = vidioc_streamoff,
1910 .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1911 .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1912 .vidioc_s_parm = vidioc_s_parm,
1913 .vidioc_g_parm = vidioc_g_parm,
1914 .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1915};
1916
1917static void s2255_video_device_release(struct video_device *vdev)
1918{
1919 struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
1920 dprintk(4, "%s, chnls: %d \n", __func__,
1921 atomic_read(&dev->num_channels));
1922 if (atomic_dec_and_test(&dev->num_channels))
1923 s2255_destroy(dev);
1924 return;
1925}
1926
1927static struct video_device template = {
1928 .name = "s2255v",
1929 .fops = &s2255_fops_v4l,
1930 .ioctl_ops = &s2255_ioctl_ops,
1931 .release = s2255_video_device_release,
1932 .tvnorms = S2255_NORMS,
1933 .current_norm = V4L2_STD_NTSC_M,
1934};
1935
1936static int s2255_probe_v4l(struct s2255_dev *dev)
1937{
1938 int ret;
1939 int i;
1940 int cur_nr = video_nr;
1941 struct s2255_channel *channel;
1942 ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
1943 if (ret)
1944 return ret;
1945
1946
1947 for (i = 0; i < MAX_CHANNELS; i++) {
1948 channel = &dev->channel[i];
1949 INIT_LIST_HEAD(&channel->vidq.active);
1950 channel->vidq.dev = dev;
1951
1952 channel->vdev = template;
1953 channel->vdev.lock = &dev->lock;
1954 channel->vdev.v4l2_dev = &dev->v4l2_dev;
1955 video_set_drvdata(&channel->vdev, channel);
1956 if (video_nr == -1)
1957 ret = video_register_device(&channel->vdev,
1958 VFL_TYPE_GRABBER,
1959 video_nr);
1960 else
1961 ret = video_register_device(&channel->vdev,
1962 VFL_TYPE_GRABBER,
1963 cur_nr + i);
1964
1965 if (ret) {
1966 dev_err(&dev->udev->dev,
1967 "failed to register video device!\n");
1968 break;
1969 }
1970 atomic_inc(&dev->num_channels);
1971 v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1972 video_device_node_name(&channel->vdev));
1973
1974 }
1975 printk(KERN_INFO "Sensoray 2255 V4L driver Revision: %s\n",
1976 S2255_VERSION);
1977
1978 if (atomic_read(&dev->num_channels) == 0) {
1979 v4l2_device_unregister(&dev->v4l2_dev);
1980 return ret;
1981 }
1982 if (atomic_read(&dev->num_channels) != MAX_CHANNELS)
1983 printk(KERN_WARNING "s2255: Not all channels available.\n");
1984 return 0;
1985}
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1999{
2000 char *pdest;
2001 u32 offset = 0;
2002 int bframe = 0;
2003 char *psrc;
2004 unsigned long copy_size;
2005 unsigned long size;
2006 s32 idx = -1;
2007 struct s2255_framei *frm;
2008 unsigned char *pdata;
2009 struct s2255_channel *channel;
2010 dprintk(100, "buffer to user\n");
2011 channel = &dev->channel[dev->cc];
2012 idx = channel->cur_frame;
2013 frm = &channel->buffer.frame[idx];
2014 if (frm->ulState == S2255_READ_IDLE) {
2015 int jj;
2016 unsigned int cc;
2017 __le32 *pdword;
2018 int payload;
2019
2020 pdata = (unsigned char *)pipe_info->transfer_buffer;
2021 pdword = (__le32 *)pdata;
2022 for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
2023 switch (*pdword) {
2024 case S2255_MARKER_FRAME:
2025 dprintk(4, "found frame marker at offset:"
2026 " %d [%x %x]\n", jj, pdata[0],
2027 pdata[1]);
2028 offset = jj + PREFIX_SIZE;
2029 bframe = 1;
2030 cc = pdword[1];
2031 if (cc >= MAX_CHANNELS) {
2032 printk(KERN_ERR
2033 "bad channel\n");
2034 return -EINVAL;
2035 }
2036
2037 dev->cc = G_chnmap[cc];
2038 channel = &dev->channel[dev->cc];
2039 payload = pdword[3];
2040 if (payload > channel->req_image_size) {
2041 channel->bad_payload++;
2042
2043 return -EINVAL;
2044 }
2045 channel->pkt_size = payload;
2046 channel->jpg_size = pdword[4];
2047 break;
2048 case S2255_MARKER_RESPONSE:
2049
2050 pdata += DEF_USB_BLOCK;
2051 jj += DEF_USB_BLOCK;
2052 if (pdword[1] >= MAX_CHANNELS)
2053 break;
2054 cc = G_chnmap[pdword[1]];
2055 if (cc >= MAX_CHANNELS)
2056 break;
2057 channel = &dev->channel[cc];
2058 switch (pdword[2]) {
2059 case S2255_RESPONSE_SETMODE:
2060
2061
2062 channel->setmode_ready = 1;
2063 wake_up(&channel->wait_setmode);
2064 dprintk(5, "setmode ready %d\n", cc);
2065 break;
2066 case S2255_RESPONSE_FW:
2067 dev->chn_ready |= (1 << cc);
2068 if ((dev->chn_ready & 0x0f) != 0x0f)
2069 break;
2070
2071 printk(KERN_INFO "s2255: fw loaded\n");
2072 atomic_set(&dev->fw_data->fw_state,
2073 S2255_FW_SUCCESS);
2074 wake_up(&dev->fw_data->wait_fw);
2075 break;
2076 case S2255_RESPONSE_STATUS:
2077 channel->vidstatus = pdword[3];
2078 channel->vidstatus_ready = 1;
2079 wake_up(&channel->wait_vidstatus);
2080 dprintk(5, "got vidstatus %x chan %d\n",
2081 pdword[3], cc);
2082 break;
2083 default:
2084 printk(KERN_INFO "s2255 unknown resp\n");
2085 }
2086 default:
2087 pdata++;
2088 break;
2089 }
2090 if (bframe)
2091 break;
2092 }
2093 if (!bframe)
2094 return -EINVAL;
2095 }
2096 channel = &dev->channel[dev->cc];
2097 idx = channel->cur_frame;
2098 frm = &channel->buffer.frame[idx];
2099
2100 if (!channel->b_acquire) {
2101
2102 frm->ulState = S2255_READ_IDLE;
2103 return -EINVAL;
2104 }
2105
2106 if (frm->ulState == S2255_READ_IDLE) {
2107 frm->ulState = S2255_READ_FRAME;
2108 frm->cur_size = 0;
2109 }
2110
2111
2112 psrc = (u8 *)pipe_info->transfer_buffer + offset;
2113
2114
2115 if (frm->lpvbits == NULL) {
2116 dprintk(1, "s2255 frame buffer == NULL.%p %p %d %d",
2117 frm, dev, dev->cc, idx);
2118 return -ENOMEM;
2119 }
2120
2121 pdest = frm->lpvbits + frm->cur_size;
2122
2123 copy_size = (pipe_info->cur_transfer_size - offset);
2124
2125 size = channel->pkt_size - PREFIX_SIZE;
2126
2127
2128 if ((copy_size + frm->cur_size) < channel->req_image_size)
2129 memcpy(pdest, psrc, copy_size);
2130
2131 frm->cur_size += copy_size;
2132 dprintk(4, "cur_size size %lu size %lu \n", frm->cur_size, size);
2133
2134 if (frm->cur_size >= size) {
2135 dprintk(2, "****************[%d]Buffer[%d]full*************\n",
2136 dev->cc, idx);
2137 channel->last_frame = channel->cur_frame;
2138 channel->cur_frame++;
2139
2140 if ((channel->cur_frame == SYS_FRAMES) ||
2141 (channel->cur_frame == channel->buffer.dwFrames))
2142 channel->cur_frame = 0;
2143
2144 if (channel->b_acquire)
2145 s2255_got_frame(channel, channel->jpg_size);
2146 channel->frame_count++;
2147 frm->ulState = S2255_READ_IDLE;
2148 frm->cur_size = 0;
2149
2150 }
2151
2152 return 0;
2153}
2154
2155static void s2255_read_video_callback(struct s2255_dev *dev,
2156 struct s2255_pipeinfo *pipe_info)
2157{
2158 int res;
2159 dprintk(50, "callback read video \n");
2160
2161 if (dev->cc >= MAX_CHANNELS) {
2162 dev->cc = 0;
2163 dev_err(&dev->udev->dev, "invalid channel\n");
2164 return;
2165 }
2166
2167 res = save_frame(dev, pipe_info);
2168 if (res != 0)
2169 dprintk(4, "s2255: read callback failed\n");
2170
2171 dprintk(50, "callback read video done\n");
2172 return;
2173}
2174
2175static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
2176 u16 Index, u16 Value, void *TransferBuffer,
2177 s32 TransferBufferLength, int bOut)
2178{
2179 int r;
2180 if (!bOut) {
2181 r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
2182 Request,
2183 USB_TYPE_VENDOR | USB_RECIP_DEVICE |
2184 USB_DIR_IN,
2185 Value, Index, TransferBuffer,
2186 TransferBufferLength, HZ * 5);
2187 } else {
2188 r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
2189 Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2190 Value, Index, TransferBuffer,
2191 TransferBufferLength, HZ * 5);
2192 }
2193 return r;
2194}
2195
2196
2197
2198
2199
2200
2201static int s2255_get_fx2fw(struct s2255_dev *dev)
2202{
2203 int fw;
2204 int ret;
2205 unsigned char transBuffer[64];
2206 ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer, 2,
2207 S2255_VR_IN);
2208 if (ret < 0)
2209 dprintk(2, "get fw error: %x\n", ret);
2210 fw = transBuffer[0] + (transBuffer[1] << 8);
2211 dprintk(2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
2212 return fw;
2213}
2214
2215
2216
2217
2218
2219static int s2255_create_sys_buffers(struct s2255_channel *channel)
2220{
2221 unsigned long i;
2222 unsigned long reqsize;
2223 dprintk(1, "create sys buffers\n");
2224 channel->buffer.dwFrames = SYS_FRAMES;
2225
2226 reqsize = SYS_FRAMES_MAXSIZE;
2227
2228 if (reqsize > SYS_FRAMES_MAXSIZE)
2229 reqsize = SYS_FRAMES_MAXSIZE;
2230
2231 for (i = 0; i < SYS_FRAMES; i++) {
2232
2233 channel->buffer.frame[i].lpvbits = vmalloc(reqsize);
2234 dprintk(1, "valloc %p chan %d, idx %lu, pdata %p\n",
2235 &channel->buffer.frame[i], channel->idx, i,
2236 channel->buffer.frame[i].lpvbits);
2237 channel->buffer.frame[i].size = reqsize;
2238 if (channel->buffer.frame[i].lpvbits == NULL) {
2239 printk(KERN_INFO "out of memory. using less frames\n");
2240 channel->buffer.dwFrames = i;
2241 break;
2242 }
2243 }
2244
2245
2246 for (i = 0; i < SYS_FRAMES; i++) {
2247 channel->buffer.frame[i].ulState = 0;
2248 channel->buffer.frame[i].cur_size = 0;
2249 }
2250
2251 channel->cur_frame = 0;
2252 channel->last_frame = -1;
2253 return 0;
2254}
2255
2256static int s2255_release_sys_buffers(struct s2255_channel *channel)
2257{
2258 unsigned long i;
2259 dprintk(1, "release sys buffers\n");
2260 for (i = 0; i < SYS_FRAMES; i++) {
2261 if (channel->buffer.frame[i].lpvbits) {
2262 dprintk(1, "vfree %p\n",
2263 channel->buffer.frame[i].lpvbits);
2264 vfree(channel->buffer.frame[i].lpvbits);
2265 }
2266 channel->buffer.frame[i].lpvbits = NULL;
2267 }
2268 return 0;
2269}
2270
2271static int s2255_board_init(struct s2255_dev *dev)
2272{
2273 struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
2274 int fw_ver;
2275 int j;
2276 struct s2255_pipeinfo *pipe = &dev->pipe;
2277 dprintk(4, "board init: %p", dev);
2278 memset(pipe, 0, sizeof(*pipe));
2279 pipe->dev = dev;
2280 pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
2281 pipe->max_transfer_size = S2255_USB_XFER_SIZE;
2282
2283 pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
2284 GFP_KERNEL);
2285 if (pipe->transfer_buffer == NULL) {
2286 dprintk(1, "out of memory!\n");
2287 return -ENOMEM;
2288 }
2289
2290 fw_ver = s2255_get_fx2fw(dev);
2291
2292 printk(KERN_INFO "s2255: usb firmware version %d.%d\n",
2293 (fw_ver >> 8) & 0xff,
2294 fw_ver & 0xff);
2295
2296 if (fw_ver < S2255_CUR_USB_FWVER)
2297 printk(KERN_INFO "s2255: newer USB firmware available\n");
2298
2299 for (j = 0; j < MAX_CHANNELS; j++) {
2300 struct s2255_channel *channel = &dev->channel[j];
2301 channel->b_acquire = 0;
2302 channel->mode = mode_def;
2303 if (dev->pid == 0x2257 && j > 1)
2304 channel->mode.color |= (1 << 16);
2305 channel->jc.quality = S2255_DEF_JPEG_QUAL;
2306 channel->width = LINE_SZ_4CIFS_NTSC;
2307 channel->height = NUM_LINES_4CIFS_NTSC * 2;
2308 channel->fmt = &formats[0];
2309 channel->mode.restart = 1;
2310 channel->req_image_size = get_transfer_size(&mode_def);
2311 channel->frame_count = 0;
2312
2313 s2255_create_sys_buffers(channel);
2314 }
2315
2316 s2255_start_readpipe(dev);
2317 dprintk(1, "%s: success\n", __func__);
2318 return 0;
2319}
2320
2321static int s2255_board_shutdown(struct s2255_dev *dev)
2322{
2323 u32 i;
2324 dprintk(1, "%s: dev: %p", __func__, dev);
2325
2326 for (i = 0; i < MAX_CHANNELS; i++) {
2327 if (dev->channel[i].b_acquire)
2328 s2255_stop_acquire(&dev->channel[i]);
2329 }
2330 s2255_stop_readpipe(dev);
2331 for (i = 0; i < MAX_CHANNELS; i++)
2332 s2255_release_sys_buffers(&dev->channel[i]);
2333
2334 kfree(dev->pipe.transfer_buffer);
2335 return 0;
2336}
2337
2338static void read_pipe_completion(struct urb *purb)
2339{
2340 struct s2255_pipeinfo *pipe_info;
2341 struct s2255_dev *dev;
2342 int status;
2343 int pipe;
2344 pipe_info = purb->context;
2345 dprintk(100, "%s: urb:%p, status %d\n", __func__, purb,
2346 purb->status);
2347 if (pipe_info == NULL) {
2348 dev_err(&purb->dev->dev, "no context!\n");
2349 return;
2350 }
2351
2352 dev = pipe_info->dev;
2353 if (dev == NULL) {
2354 dev_err(&purb->dev->dev, "no context!\n");
2355 return;
2356 }
2357 status = purb->status;
2358
2359 if (status == -ESHUTDOWN) {
2360 dprintk(2, "%s: err shutdown\n", __func__);
2361 pipe_info->err_count++;
2362 return;
2363 }
2364
2365 if (pipe_info->state == 0) {
2366 dprintk(2, "%s: exiting USB pipe", __func__);
2367 return;
2368 }
2369
2370 if (status == 0)
2371 s2255_read_video_callback(dev, pipe_info);
2372 else {
2373 pipe_info->err_count++;
2374 dprintk(1, "%s: failed URB %d\n", __func__, status);
2375 }
2376
2377 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2378
2379 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2380 pipe,
2381 pipe_info->transfer_buffer,
2382 pipe_info->cur_transfer_size,
2383 read_pipe_completion, pipe_info);
2384
2385 if (pipe_info->state != 0) {
2386 if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC)) {
2387 dev_err(&dev->udev->dev, "error submitting urb\n");
2388 }
2389 } else {
2390 dprintk(2, "%s :complete state 0\n", __func__);
2391 }
2392 return;
2393}
2394
2395static int s2255_start_readpipe(struct s2255_dev *dev)
2396{
2397 int pipe;
2398 int retval;
2399 struct s2255_pipeinfo *pipe_info = &dev->pipe;
2400 pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2401 dprintk(2, "%s: IN %d\n", __func__, dev->read_endpoint);
2402 pipe_info->state = 1;
2403 pipe_info->err_count = 0;
2404 pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
2405 if (!pipe_info->stream_urb) {
2406 dev_err(&dev->udev->dev,
2407 "ReadStream: Unable to alloc URB\n");
2408 return -ENOMEM;
2409 }
2410
2411 usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2412 pipe,
2413 pipe_info->transfer_buffer,
2414 pipe_info->cur_transfer_size,
2415 read_pipe_completion, pipe_info);
2416 retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
2417 if (retval) {
2418 printk(KERN_ERR "s2255: start read pipe failed\n");
2419 return retval;
2420 }
2421 return 0;
2422}
2423
2424
2425static int s2255_start_acquire(struct s2255_channel *channel)
2426{
2427 unsigned char *buffer;
2428 int res;
2429 unsigned long chn_rev;
2430 int j;
2431 struct s2255_dev *dev = to_s2255_dev(channel->vdev.v4l2_dev);
2432 chn_rev = G_chnmap[channel->idx];
2433 buffer = kzalloc(512, GFP_KERNEL);
2434 if (buffer == NULL) {
2435 dev_err(&dev->udev->dev, "out of mem\n");
2436 return -ENOMEM;
2437 }
2438
2439 channel->last_frame = -1;
2440 channel->bad_payload = 0;
2441 channel->cur_frame = 0;
2442 for (j = 0; j < SYS_FRAMES; j++) {
2443 channel->buffer.frame[j].ulState = 0;
2444 channel->buffer.frame[j].cur_size = 0;
2445 }
2446
2447
2448 *(__le32 *) buffer = IN_DATA_TOKEN;
2449 *((__le32 *) buffer + 1) = (__le32) cpu_to_le32(chn_rev);
2450 *((__le32 *) buffer + 2) = CMD_START;
2451 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2452 if (res != 0)
2453 dev_err(&dev->udev->dev, "CMD_START error\n");
2454
2455 dprintk(2, "start acquire exit[%d] %d \n", channel->idx, res);
2456 kfree(buffer);
2457 return 0;
2458}
2459
2460static int s2255_stop_acquire(struct s2255_channel *channel)
2461{
2462 unsigned char *buffer;
2463 int res;
2464 unsigned long chn_rev;
2465 struct s2255_dev *dev = to_s2255_dev(channel->vdev.v4l2_dev);
2466 chn_rev = G_chnmap[channel->idx];
2467 buffer = kzalloc(512, GFP_KERNEL);
2468 if (buffer == NULL) {
2469 dev_err(&dev->udev->dev, "out of mem\n");
2470 return -ENOMEM;
2471 }
2472
2473 *(__le32 *) buffer = IN_DATA_TOKEN;
2474 *((__le32 *) buffer + 1) = (__le32) cpu_to_le32(chn_rev);
2475 *((__le32 *) buffer + 2) = CMD_STOP;
2476 res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2477 if (res != 0)
2478 dev_err(&dev->udev->dev, "CMD_STOP error\n");
2479 kfree(buffer);
2480 channel->b_acquire = 0;
2481 dprintk(4, "%s: chn %d, res %d\n", __func__, channel->idx, res);
2482 return res;
2483}
2484
2485static void s2255_stop_readpipe(struct s2255_dev *dev)
2486{
2487 struct s2255_pipeinfo *pipe = &dev->pipe;
2488
2489 pipe->state = 0;
2490 if (pipe->stream_urb) {
2491
2492 usb_kill_urb(pipe->stream_urb);
2493 usb_free_urb(pipe->stream_urb);
2494 pipe->stream_urb = NULL;
2495 }
2496 dprintk(4, "%s", __func__);
2497 return;
2498}
2499
2500static void s2255_fwload_start(struct s2255_dev *dev, int reset)
2501{
2502 if (reset)
2503 s2255_reset_dsppower(dev);
2504 dev->fw_data->fw_size = dev->fw_data->fw->size;
2505 atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2506 memcpy(dev->fw_data->pfw_data,
2507 dev->fw_data->fw->data, CHUNK_SIZE);
2508 dev->fw_data->fw_loaded = CHUNK_SIZE;
2509 usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
2510 usb_sndbulkpipe(dev->udev, 2),
2511 dev->fw_data->pfw_data,
2512 CHUNK_SIZE, s2255_fwchunk_complete,
2513 dev->fw_data);
2514 mod_timer(&dev->timer, jiffies + HZ);
2515}
2516
2517
2518static int s2255_probe(struct usb_interface *interface,
2519 const struct usb_device_id *id)
2520{
2521 struct s2255_dev *dev = NULL;
2522 struct usb_host_interface *iface_desc;
2523 struct usb_endpoint_descriptor *endpoint;
2524 int i;
2525 int retval = -ENOMEM;
2526 __le32 *pdata;
2527 int fw_size;
2528 dprintk(2, "%s\n", __func__);
2529
2530 dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
2531 if (dev == NULL) {
2532 s2255_dev_err(&interface->dev, "out of memory\n");
2533 return -ENOMEM;
2534 }
2535 atomic_set(&dev->num_channels, 0);
2536 dev->pid = id->idProduct;
2537 dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
2538 if (!dev->fw_data)
2539 goto errorFWDATA1;
2540 mutex_init(&dev->lock);
2541 mutex_init(&dev->open_lock);
2542
2543 dev->udev = usb_get_dev(interface_to_usbdev(interface));
2544 if (dev->udev == NULL) {
2545 dev_err(&interface->dev, "null usb device\n");
2546 retval = -ENODEV;
2547 goto errorUDEV;
2548 }
2549 dprintk(1, "dev: %p, udev %p interface %p\n", dev,
2550 dev->udev, interface);
2551 dev->interface = interface;
2552
2553 iface_desc = interface->cur_altsetting;
2554 dprintk(1, "num endpoints %d\n", iface_desc->desc.bNumEndpoints);
2555 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2556 endpoint = &iface_desc->endpoint[i].desc;
2557 if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
2558
2559 dev->read_endpoint = endpoint->bEndpointAddress;
2560 }
2561 }
2562
2563 if (!dev->read_endpoint) {
2564 dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2565 goto errorEP;
2566 }
2567 init_timer(&dev->timer);
2568 dev->timer.function = s2255_timer;
2569 dev->timer.data = (unsigned long)dev->fw_data;
2570 init_waitqueue_head(&dev->fw_data->wait_fw);
2571 for (i = 0; i < MAX_CHANNELS; i++) {
2572 struct s2255_channel *channel = &dev->channel[i];
2573 dev->channel[i].idx = i;
2574 init_waitqueue_head(&channel->wait_setmode);
2575 init_waitqueue_head(&channel->wait_vidstatus);
2576 }
2577
2578 dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
2579 if (!dev->fw_data->fw_urb) {
2580 dev_err(&interface->dev, "out of memory!\n");
2581 goto errorFWURB;
2582 }
2583
2584 dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2585 if (!dev->fw_data->pfw_data) {
2586 dev_err(&interface->dev, "out of memory!\n");
2587 goto errorFWDATA2;
2588 }
2589
2590 if (request_firmware(&dev->fw_data->fw,
2591 FIRMWARE_FILE_NAME, &dev->udev->dev)) {
2592 printk(KERN_ERR "sensoray 2255 failed to get firmware\n");
2593 goto errorREQFW;
2594 }
2595
2596 fw_size = dev->fw_data->fw->size;
2597 pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2598
2599 if (*pdata != S2255_FW_MARKER) {
2600 printk(KERN_INFO "Firmware invalid.\n");
2601 retval = -ENODEV;
2602 goto errorFWMARKER;
2603 } else {
2604
2605 __le32 *pRel;
2606 pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2607 printk(KERN_INFO "s2255 dsp fw version %x\n", *pRel);
2608 dev->dsp_fw_ver = *pRel;
2609 if (*pRel < S2255_CUR_DSP_FWVER)
2610 printk(KERN_INFO "s2255: f2255usb.bin out of date.\n");
2611 if (dev->pid == 0x2257 && *pRel < S2255_MIN_DSP_COLORFILTER)
2612 printk(KERN_WARNING "s2255: 2257 requires firmware %d"
2613 " or above.\n", S2255_MIN_DSP_COLORFILTER);
2614 }
2615 usb_reset_device(dev->udev);
2616
2617 retval = s2255_board_init(dev);
2618 if (retval)
2619 goto errorBOARDINIT;
2620 spin_lock_init(&dev->slock);
2621 s2255_fwload_start(dev, 0);
2622
2623 retval = s2255_probe_v4l(dev);
2624 if (retval)
2625 goto errorBOARDINIT;
2626 dev_info(&interface->dev, "Sensoray 2255 detected\n");
2627 return 0;
2628errorBOARDINIT:
2629 s2255_board_shutdown(dev);
2630errorFWMARKER:
2631 release_firmware(dev->fw_data->fw);
2632errorREQFW:
2633 kfree(dev->fw_data->pfw_data);
2634errorFWDATA2:
2635 usb_free_urb(dev->fw_data->fw_urb);
2636errorFWURB:
2637 del_timer(&dev->timer);
2638errorEP:
2639 usb_put_dev(dev->udev);
2640errorUDEV:
2641 kfree(dev->fw_data);
2642 mutex_destroy(&dev->open_lock);
2643 mutex_destroy(&dev->lock);
2644errorFWDATA1:
2645 kfree(dev);
2646 printk(KERN_WARNING "Sensoray 2255 driver load failed: 0x%x\n", retval);
2647 return retval;
2648}
2649
2650
2651static void s2255_disconnect(struct usb_interface *interface)
2652{
2653 struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
2654 int i;
2655 int channels = atomic_read(&dev->num_channels);
2656 mutex_lock(&dev->lock);
2657 v4l2_device_disconnect(&dev->v4l2_dev);
2658 mutex_unlock(&dev->lock);
2659
2660 atomic_inc(&dev->num_channels);
2661
2662 for (i = 0; i < channels; i++)
2663 video_unregister_device(&dev->channel[i].vdev);
2664
2665 atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2666 wake_up(&dev->fw_data->wait_fw);
2667 for (i = 0; i < MAX_CHANNELS; i++) {
2668 dev->channel[i].setmode_ready = 1;
2669 wake_up(&dev->channel[i].wait_setmode);
2670 dev->channel[i].vidstatus_ready = 1;
2671 wake_up(&dev->channel[i].wait_vidstatus);
2672 }
2673 if (atomic_dec_and_test(&dev->num_channels))
2674 s2255_destroy(dev);
2675 dev_info(&interface->dev, "%s\n", __func__);
2676}
2677
2678static struct usb_driver s2255_driver = {
2679 .name = S2255_DRIVER_NAME,
2680 .probe = s2255_probe,
2681 .disconnect = s2255_disconnect,
2682 .id_table = s2255_table,
2683};
2684
2685static int __init usb_s2255_init(void)
2686{
2687 int result;
2688
2689 result = usb_register(&s2255_driver);
2690 if (result)
2691 pr_err(KBUILD_MODNAME
2692 ": usb_register failed. Error number %d\n", result);
2693 dprintk(2, "%s\n", __func__);
2694 return result;
2695}
2696
2697static void __exit usb_s2255_exit(void)
2698{
2699 usb_deregister(&s2255_driver);
2700}
2701
2702module_init(usb_s2255_init);
2703module_exit(usb_s2255_exit);
2704
2705MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2706MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2707MODULE_LICENSE("GPL");
2708MODULE_VERSION(S2255_VERSION);
2709