Merge tag 'v3.3.7' into 3.3/master
[zen-stable.git] / drivers / media / video / au0828 / au0828-video.c
blob0b3e481ffe8c5b4bafb18f96fafc4632e5ff839d
1 /*
2 * Auvitek AU0828 USB Bridge (Analog video support)
4 * Copyright (C) 2009 Devin Heitmueller <dheitmueller@linuxtv.org>
5 * Copyright (C) 2005-2008 Auvitek International, Ltd.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * As published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301, USA.
23 /* Developer Notes:
25 * VBI support is not yet working
26 * The hardware scaler supported is unimplemented
27 * AC97 audio support is unimplemented (only i2s audio mode)
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/init.h>
34 #include <linux/device.h>
35 #include <linux/suspend.h>
36 #include <media/v4l2-common.h>
37 #include <media/v4l2-ioctl.h>
38 #include <media/v4l2-chip-ident.h>
39 #include <media/tuner.h>
40 #include "au0828.h"
41 #include "au0828-reg.h"
43 static DEFINE_MUTEX(au0828_sysfs_lock);
45 /* ------------------------------------------------------------------
46 Videobuf operations
47 ------------------------------------------------------------------*/
49 static unsigned int isoc_debug;
50 module_param(isoc_debug, int, 0644);
51 MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
53 #define au0828_isocdbg(fmt, arg...) \
54 do {\
55 if (isoc_debug) { \
56 printk(KERN_INFO "au0828 %s :"fmt, \
57 __func__ , ##arg); \
58 } \
59 } while (0)
61 static inline void print_err_status(struct au0828_dev *dev,
62 int packet, int status)
64 char *errmsg = "Unknown";
66 switch (status) {
67 case -ENOENT:
68 errmsg = "unlinked synchronuously";
69 break;
70 case -ECONNRESET:
71 errmsg = "unlinked asynchronuously";
72 break;
73 case -ENOSR:
74 errmsg = "Buffer error (overrun)";
75 break;
76 case -EPIPE:
77 errmsg = "Stalled (device not responding)";
78 break;
79 case -EOVERFLOW:
80 errmsg = "Babble (bad cable?)";
81 break;
82 case -EPROTO:
83 errmsg = "Bit-stuff error (bad cable?)";
84 break;
85 case -EILSEQ:
86 errmsg = "CRC/Timeout (could be anything)";
87 break;
88 case -ETIME:
89 errmsg = "Device does not respond";
90 break;
92 if (packet < 0) {
93 au0828_isocdbg("URB status %d [%s].\n", status, errmsg);
94 } else {
95 au0828_isocdbg("URB packet %d, status %d [%s].\n",
96 packet, status, errmsg);
100 static int check_dev(struct au0828_dev *dev)
102 if (dev->dev_state & DEV_DISCONNECTED) {
103 printk(KERN_INFO "v4l2 ioctl: device not present\n");
104 return -ENODEV;
107 if (dev->dev_state & DEV_MISCONFIGURED) {
108 printk(KERN_INFO "v4l2 ioctl: device is misconfigured; "
109 "close and open it again\n");
110 return -EIO;
112 return 0;
116 * IRQ callback, called by URB callback
118 static void au0828_irq_callback(struct urb *urb)
120 struct au0828_dmaqueue *dma_q = urb->context;
121 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
122 unsigned long flags = 0;
123 int rc, i;
125 switch (urb->status) {
126 case 0: /* success */
127 case -ETIMEDOUT: /* NAK */
128 break;
129 case -ECONNRESET: /* kill */
130 case -ENOENT:
131 case -ESHUTDOWN:
132 au0828_isocdbg("au0828_irq_callback called: status kill\n");
133 return;
134 default: /* unknown error */
135 au0828_isocdbg("urb completition error %d.\n", urb->status);
136 break;
139 /* Copy data from URB */
140 spin_lock_irqsave(&dev->slock, flags);
141 rc = dev->isoc_ctl.isoc_copy(dev, urb);
142 spin_unlock_irqrestore(&dev->slock, flags);
144 /* Reset urb buffers */
145 for (i = 0; i < urb->number_of_packets; i++) {
146 urb->iso_frame_desc[i].status = 0;
147 urb->iso_frame_desc[i].actual_length = 0;
149 urb->status = 0;
151 urb->status = usb_submit_urb(urb, GFP_ATOMIC);
152 if (urb->status) {
153 au0828_isocdbg("urb resubmit failed (error=%i)\n",
154 urb->status);
159 * Stop and Deallocate URBs
161 void au0828_uninit_isoc(struct au0828_dev *dev)
163 struct urb *urb;
164 int i;
166 au0828_isocdbg("au0828: called au0828_uninit_isoc\n");
168 dev->isoc_ctl.nfields = -1;
169 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
170 urb = dev->isoc_ctl.urb[i];
171 if (urb) {
172 if (!irqs_disabled())
173 usb_kill_urb(urb);
174 else
175 usb_unlink_urb(urb);
177 if (dev->isoc_ctl.transfer_buffer[i]) {
178 usb_free_coherent(dev->usbdev,
179 urb->transfer_buffer_length,
180 dev->isoc_ctl.transfer_buffer[i],
181 urb->transfer_dma);
183 usb_free_urb(urb);
184 dev->isoc_ctl.urb[i] = NULL;
186 dev->isoc_ctl.transfer_buffer[i] = NULL;
189 kfree(dev->isoc_ctl.urb);
190 kfree(dev->isoc_ctl.transfer_buffer);
192 dev->isoc_ctl.urb = NULL;
193 dev->isoc_ctl.transfer_buffer = NULL;
194 dev->isoc_ctl.num_bufs = 0;
198 * Allocate URBs and start IRQ
200 int au0828_init_isoc(struct au0828_dev *dev, int max_packets,
201 int num_bufs, int max_pkt_size,
202 int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb))
204 struct au0828_dmaqueue *dma_q = &dev->vidq;
205 int i;
206 int sb_size, pipe;
207 struct urb *urb;
208 int j, k;
209 int rc;
211 au0828_isocdbg("au0828: called au0828_prepare_isoc\n");
213 /* De-allocates all pending stuff */
214 au0828_uninit_isoc(dev);
216 dev->isoc_ctl.isoc_copy = isoc_copy;
217 dev->isoc_ctl.num_bufs = num_bufs;
219 dev->isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
220 if (!dev->isoc_ctl.urb) {
221 au0828_isocdbg("cannot alloc memory for usb buffers\n");
222 return -ENOMEM;
225 dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
226 GFP_KERNEL);
227 if (!dev->isoc_ctl.transfer_buffer) {
228 au0828_isocdbg("cannot allocate memory for usb transfer\n");
229 kfree(dev->isoc_ctl.urb);
230 return -ENOMEM;
233 dev->isoc_ctl.max_pkt_size = max_pkt_size;
234 dev->isoc_ctl.buf = NULL;
236 sb_size = max_packets * dev->isoc_ctl.max_pkt_size;
238 /* allocate urbs and transfer buffers */
239 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
240 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
241 if (!urb) {
242 au0828_isocdbg("cannot alloc isoc_ctl.urb %i\n", i);
243 au0828_uninit_isoc(dev);
244 return -ENOMEM;
246 dev->isoc_ctl.urb[i] = urb;
248 dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(dev->usbdev,
249 sb_size, GFP_KERNEL, &urb->transfer_dma);
250 if (!dev->isoc_ctl.transfer_buffer[i]) {
251 printk("unable to allocate %i bytes for transfer"
252 " buffer %i%s\n",
253 sb_size, i,
254 in_interrupt() ? " while in int" : "");
255 au0828_uninit_isoc(dev);
256 return -ENOMEM;
258 memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
260 pipe = usb_rcvisocpipe(dev->usbdev,
261 dev->isoc_in_endpointaddr),
263 usb_fill_int_urb(urb, dev->usbdev, pipe,
264 dev->isoc_ctl.transfer_buffer[i], sb_size,
265 au0828_irq_callback, dma_q, 1);
267 urb->number_of_packets = max_packets;
268 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
270 k = 0;
271 for (j = 0; j < max_packets; j++) {
272 urb->iso_frame_desc[j].offset = k;
273 urb->iso_frame_desc[j].length =
274 dev->isoc_ctl.max_pkt_size;
275 k += dev->isoc_ctl.max_pkt_size;
279 init_waitqueue_head(&dma_q->wq);
281 /* submit urbs and enables IRQ */
282 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
283 rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
284 if (rc) {
285 au0828_isocdbg("submit of urb %i failed (error=%i)\n",
286 i, rc);
287 au0828_uninit_isoc(dev);
288 return rc;
292 return 0;
296 * Announces that a buffer were filled and request the next
298 static inline void buffer_filled(struct au0828_dev *dev,
299 struct au0828_dmaqueue *dma_q,
300 struct au0828_buffer *buf)
302 /* Advice that buffer was filled */
303 au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
305 buf->vb.state = VIDEOBUF_DONE;
306 buf->vb.field_count++;
307 do_gettimeofday(&buf->vb.ts);
309 dev->isoc_ctl.buf = NULL;
311 list_del(&buf->vb.queue);
312 wake_up(&buf->vb.done);
315 static inline void vbi_buffer_filled(struct au0828_dev *dev,
316 struct au0828_dmaqueue *dma_q,
317 struct au0828_buffer *buf)
319 /* Advice that buffer was filled */
320 au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
322 buf->vb.state = VIDEOBUF_DONE;
323 buf->vb.field_count++;
324 do_gettimeofday(&buf->vb.ts);
326 dev->isoc_ctl.vbi_buf = NULL;
328 list_del(&buf->vb.queue);
329 wake_up(&buf->vb.done);
333 * Identify the buffer header type and properly handles
335 static void au0828_copy_video(struct au0828_dev *dev,
336 struct au0828_dmaqueue *dma_q,
337 struct au0828_buffer *buf,
338 unsigned char *p,
339 unsigned char *outp, unsigned long len)
341 void *fieldstart, *startwrite, *startread;
342 int linesdone, currlinedone, offset, lencopy, remain;
343 int bytesperline = dev->width << 1; /* Assumes 16-bit depth @@@@ */
345 if (len == 0)
346 return;
348 if (dma_q->pos + len > buf->vb.size)
349 len = buf->vb.size - dma_q->pos;
351 startread = p;
352 remain = len;
354 /* Interlaces frame */
355 if (buf->top_field)
356 fieldstart = outp;
357 else
358 fieldstart = outp + bytesperline;
360 linesdone = dma_q->pos / bytesperline;
361 currlinedone = dma_q->pos % bytesperline;
362 offset = linesdone * bytesperline * 2 + currlinedone;
363 startwrite = fieldstart + offset;
364 lencopy = bytesperline - currlinedone;
365 lencopy = lencopy > remain ? remain : lencopy;
367 if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
368 au0828_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
369 ((char *)startwrite + lencopy) -
370 ((char *)outp + buf->vb.size));
371 remain = (char *)outp + buf->vb.size - (char *)startwrite;
372 lencopy = remain;
374 if (lencopy <= 0)
375 return;
376 memcpy(startwrite, startread, lencopy);
378 remain -= lencopy;
380 while (remain > 0) {
381 startwrite += lencopy + bytesperline;
382 startread += lencopy;
383 if (bytesperline > remain)
384 lencopy = remain;
385 else
386 lencopy = bytesperline;
388 if ((char *)startwrite + lencopy > (char *)outp +
389 buf->vb.size) {
390 au0828_isocdbg("Overflow %zi bytes past buf end (2)\n",
391 ((char *)startwrite + lencopy) -
392 ((char *)outp + buf->vb.size));
393 lencopy = remain = (char *)outp + buf->vb.size -
394 (char *)startwrite;
396 if (lencopy <= 0)
397 break;
399 memcpy(startwrite, startread, lencopy);
401 remain -= lencopy;
404 if (offset > 1440) {
405 /* We have enough data to check for greenscreen */
406 if (outp[0] < 0x60 && outp[1440] < 0x60)
407 dev->greenscreen_detected = 1;
410 dma_q->pos += len;
414 * video-buf generic routine to get the next available buffer
416 static inline void get_next_buf(struct au0828_dmaqueue *dma_q,
417 struct au0828_buffer **buf)
419 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
421 if (list_empty(&dma_q->active)) {
422 au0828_isocdbg("No active queue to serve\n");
423 dev->isoc_ctl.buf = NULL;
424 *buf = NULL;
425 return;
428 /* Get the next buffer */
429 *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
430 dev->isoc_ctl.buf = *buf;
432 return;
435 static void au0828_copy_vbi(struct au0828_dev *dev,
436 struct au0828_dmaqueue *dma_q,
437 struct au0828_buffer *buf,
438 unsigned char *p,
439 unsigned char *outp, unsigned long len)
441 unsigned char *startwrite, *startread;
442 int bytesperline;
443 int i, j = 0;
445 if (dev == NULL) {
446 au0828_isocdbg("dev is null\n");
447 return;
450 if (dma_q == NULL) {
451 au0828_isocdbg("dma_q is null\n");
452 return;
454 if (buf == NULL)
455 return;
456 if (p == NULL) {
457 au0828_isocdbg("p is null\n");
458 return;
460 if (outp == NULL) {
461 au0828_isocdbg("outp is null\n");
462 return;
465 bytesperline = dev->vbi_width;
467 if (dma_q->pos + len > buf->vb.size)
468 len = buf->vb.size - dma_q->pos;
470 startread = p;
471 startwrite = outp + (dma_q->pos / 2);
473 /* Make sure the bottom field populates the second half of the frame */
474 if (buf->top_field == 0)
475 startwrite += bytesperline * dev->vbi_height;
477 for (i = 0; i < len; i += 2)
478 startwrite[j++] = startread[i+1];
480 dma_q->pos += len;
485 * video-buf generic routine to get the next available VBI buffer
487 static inline void vbi_get_next_buf(struct au0828_dmaqueue *dma_q,
488 struct au0828_buffer **buf)
490 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vbiq);
491 char *outp;
493 if (list_empty(&dma_q->active)) {
494 au0828_isocdbg("No active queue to serve\n");
495 dev->isoc_ctl.vbi_buf = NULL;
496 *buf = NULL;
497 return;
500 /* Get the next buffer */
501 *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
502 /* Cleans up buffer - Useful for testing for frame/URB loss */
503 outp = videobuf_to_vmalloc(&(*buf)->vb);
504 memset(outp, 0x00, (*buf)->vb.size);
506 dev->isoc_ctl.vbi_buf = *buf;
508 return;
512 * Controls the isoc copy of each urb packet
514 static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb)
516 struct au0828_buffer *buf;
517 struct au0828_buffer *vbi_buf;
518 struct au0828_dmaqueue *dma_q = urb->context;
519 struct au0828_dmaqueue *vbi_dma_q = &dev->vbiq;
520 unsigned char *outp = NULL;
521 unsigned char *vbioutp = NULL;
522 int i, len = 0, rc = 1;
523 unsigned char *p;
524 unsigned char fbyte;
525 unsigned int vbi_field_size;
526 unsigned int remain, lencopy;
528 if (!dev)
529 return 0;
531 if ((dev->dev_state & DEV_DISCONNECTED) ||
532 (dev->dev_state & DEV_MISCONFIGURED))
533 return 0;
535 if (urb->status < 0) {
536 print_err_status(dev, -1, urb->status);
537 if (urb->status == -ENOENT)
538 return 0;
541 buf = dev->isoc_ctl.buf;
542 if (buf != NULL)
543 outp = videobuf_to_vmalloc(&buf->vb);
545 vbi_buf = dev->isoc_ctl.vbi_buf;
546 if (vbi_buf != NULL)
547 vbioutp = videobuf_to_vmalloc(&vbi_buf->vb);
549 for (i = 0; i < urb->number_of_packets; i++) {
550 int status = urb->iso_frame_desc[i].status;
552 if (status < 0) {
553 print_err_status(dev, i, status);
554 if (urb->iso_frame_desc[i].status != -EPROTO)
555 continue;
558 if (urb->iso_frame_desc[i].actual_length <= 0)
559 continue;
561 if (urb->iso_frame_desc[i].actual_length >
562 dev->max_pkt_size) {
563 au0828_isocdbg("packet bigger than packet size");
564 continue;
567 p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
568 fbyte = p[0];
569 len = urb->iso_frame_desc[i].actual_length - 4;
570 p += 4;
572 if (fbyte & 0x80) {
573 len -= 4;
574 p += 4;
575 au0828_isocdbg("Video frame %s\n",
576 (fbyte & 0x40) ? "odd" : "even");
577 if (fbyte & 0x40) {
578 /* VBI */
579 if (vbi_buf != NULL)
580 vbi_buffer_filled(dev,
581 vbi_dma_q,
582 vbi_buf);
583 vbi_get_next_buf(vbi_dma_q, &vbi_buf);
584 if (vbi_buf == NULL)
585 vbioutp = NULL;
586 else
587 vbioutp = videobuf_to_vmalloc(
588 &vbi_buf->vb);
590 /* Video */
591 if (buf != NULL)
592 buffer_filled(dev, dma_q, buf);
593 get_next_buf(dma_q, &buf);
594 if (buf == NULL)
595 outp = NULL;
596 else
597 outp = videobuf_to_vmalloc(&buf->vb);
599 /* As long as isoc traffic is arriving, keep
600 resetting the timer */
601 if (dev->vid_timeout_running)
602 mod_timer(&dev->vid_timeout,
603 jiffies + (HZ / 10));
604 if (dev->vbi_timeout_running)
605 mod_timer(&dev->vbi_timeout,
606 jiffies + (HZ / 10));
609 if (buf != NULL) {
610 if (fbyte & 0x40)
611 buf->top_field = 1;
612 else
613 buf->top_field = 0;
616 if (vbi_buf != NULL) {
617 if (fbyte & 0x40)
618 vbi_buf->top_field = 1;
619 else
620 vbi_buf->top_field = 0;
623 dev->vbi_read = 0;
624 vbi_dma_q->pos = 0;
625 dma_q->pos = 0;
628 vbi_field_size = dev->vbi_width * dev->vbi_height * 2;
629 if (dev->vbi_read < vbi_field_size) {
630 remain = vbi_field_size - dev->vbi_read;
631 if (len < remain)
632 lencopy = len;
633 else
634 lencopy = remain;
636 if (vbi_buf != NULL)
637 au0828_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
638 vbioutp, len);
640 len -= lencopy;
641 p += lencopy;
642 dev->vbi_read += lencopy;
645 if (dev->vbi_read >= vbi_field_size && buf != NULL)
646 au0828_copy_video(dev, dma_q, buf, p, outp, len);
648 return rc;
651 static int
652 buffer_setup(struct videobuf_queue *vq, unsigned int *count,
653 unsigned int *size)
655 struct au0828_fh *fh = vq->priv_data;
656 *size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
658 if (0 == *count)
659 *count = AU0828_DEF_BUF;
661 if (*count < AU0828_MIN_BUF)
662 *count = AU0828_MIN_BUF;
663 return 0;
666 /* This is called *without* dev->slock held; please keep it that way */
667 static void free_buffer(struct videobuf_queue *vq, struct au0828_buffer *buf)
669 struct au0828_fh *fh = vq->priv_data;
670 struct au0828_dev *dev = fh->dev;
671 unsigned long flags = 0;
672 if (in_interrupt())
673 BUG();
675 /* We used to wait for the buffer to finish here, but this didn't work
676 because, as we were keeping the state as VIDEOBUF_QUEUED,
677 videobuf_queue_cancel marked it as finished for us.
678 (Also, it could wedge forever if the hardware was misconfigured.)
680 This should be safe; by the time we get here, the buffer isn't
681 queued anymore. If we ever start marking the buffers as
682 VIDEOBUF_ACTIVE, it won't be, though.
684 spin_lock_irqsave(&dev->slock, flags);
685 if (dev->isoc_ctl.buf == buf)
686 dev->isoc_ctl.buf = NULL;
687 spin_unlock_irqrestore(&dev->slock, flags);
689 videobuf_vmalloc_free(&buf->vb);
690 buf->vb.state = VIDEOBUF_NEEDS_INIT;
693 static int
694 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
695 enum v4l2_field field)
697 struct au0828_fh *fh = vq->priv_data;
698 struct au0828_buffer *buf = container_of(vb, struct au0828_buffer, vb);
699 struct au0828_dev *dev = fh->dev;
700 int rc = 0, urb_init = 0;
702 buf->vb.size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
704 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
705 return -EINVAL;
707 buf->vb.width = dev->width;
708 buf->vb.height = dev->height;
709 buf->vb.field = field;
711 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
712 rc = videobuf_iolock(vq, &buf->vb, NULL);
713 if (rc < 0) {
714 printk(KERN_INFO "videobuf_iolock failed\n");
715 goto fail;
719 if (!dev->isoc_ctl.num_bufs)
720 urb_init = 1;
722 if (urb_init) {
723 rc = au0828_init_isoc(dev, AU0828_ISO_PACKETS_PER_URB,
724 AU0828_MAX_ISO_BUFS, dev->max_pkt_size,
725 au0828_isoc_copy);
726 if (rc < 0) {
727 printk(KERN_INFO "au0828_init_isoc failed\n");
728 goto fail;
732 buf->vb.state = VIDEOBUF_PREPARED;
733 return 0;
735 fail:
736 free_buffer(vq, buf);
737 return rc;
740 static void
741 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
743 struct au0828_buffer *buf = container_of(vb,
744 struct au0828_buffer,
745 vb);
746 struct au0828_fh *fh = vq->priv_data;
747 struct au0828_dev *dev = fh->dev;
748 struct au0828_dmaqueue *vidq = &dev->vidq;
750 buf->vb.state = VIDEOBUF_QUEUED;
751 list_add_tail(&buf->vb.queue, &vidq->active);
754 static void buffer_release(struct videobuf_queue *vq,
755 struct videobuf_buffer *vb)
757 struct au0828_buffer *buf = container_of(vb,
758 struct au0828_buffer,
759 vb);
761 free_buffer(vq, buf);
764 static struct videobuf_queue_ops au0828_video_qops = {
765 .buf_setup = buffer_setup,
766 .buf_prepare = buffer_prepare,
767 .buf_queue = buffer_queue,
768 .buf_release = buffer_release,
771 /* ------------------------------------------------------------------
772 V4L2 interface
773 ------------------------------------------------------------------*/
775 static int au0828_i2s_init(struct au0828_dev *dev)
777 /* Enable i2s mode */
778 au0828_writereg(dev, AU0828_AUDIOCTRL_50C, 0x01);
779 return 0;
783 * Auvitek au0828 analog stream enable
784 * Please set interface0 to AS5 before enable the stream
786 int au0828_analog_stream_enable(struct au0828_dev *d)
788 dprintk(1, "au0828_analog_stream_enable called\n");
789 au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00);
790 au0828_writereg(d, 0x106, 0x00);
791 /* set x position */
792 au0828_writereg(d, 0x110, 0x00);
793 au0828_writereg(d, 0x111, 0x00);
794 au0828_writereg(d, 0x114, 0xa0);
795 au0828_writereg(d, 0x115, 0x05);
796 /* set y position */
797 au0828_writereg(d, 0x112, 0x00);
798 au0828_writereg(d, 0x113, 0x00);
799 au0828_writereg(d, 0x116, 0xf2);
800 au0828_writereg(d, 0x117, 0x00);
801 au0828_writereg(d, AU0828_SENSORCTRL_100, 0xb3);
803 return 0;
806 int au0828_analog_stream_disable(struct au0828_dev *d)
808 dprintk(1, "au0828_analog_stream_disable called\n");
809 au0828_writereg(d, AU0828_SENSORCTRL_100, 0x0);
810 return 0;
813 void au0828_analog_stream_reset(struct au0828_dev *dev)
815 dprintk(1, "au0828_analog_stream_reset called\n");
816 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0x0);
817 mdelay(30);
818 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0xb3);
822 * Some operations needs to stop current streaming
824 static int au0828_stream_interrupt(struct au0828_dev *dev)
826 int ret = 0;
828 dev->stream_state = STREAM_INTERRUPT;
829 if (dev->dev_state == DEV_DISCONNECTED)
830 return -ENODEV;
831 else if (ret) {
832 dev->dev_state = DEV_MISCONFIGURED;
833 dprintk(1, "%s device is misconfigured!\n", __func__);
834 return ret;
836 return 0;
840 * au0828_release_resources
841 * unregister v4l2 devices
843 void au0828_analog_unregister(struct au0828_dev *dev)
845 dprintk(1, "au0828_release_resources called\n");
846 mutex_lock(&au0828_sysfs_lock);
848 if (dev->vdev)
849 video_unregister_device(dev->vdev);
850 if (dev->vbi_dev)
851 video_unregister_device(dev->vbi_dev);
853 mutex_unlock(&au0828_sysfs_lock);
857 /* Usage lock check functions */
858 static int res_get(struct au0828_fh *fh, unsigned int bit)
860 struct au0828_dev *dev = fh->dev;
862 if (fh->resources & bit)
863 /* have it already allocated */
864 return 1;
866 /* is it free? */
867 mutex_lock(&dev->lock);
868 if (dev->resources & bit) {
869 /* no, someone else uses it */
870 mutex_unlock(&dev->lock);
871 return 0;
873 /* it's free, grab it */
874 fh->resources |= bit;
875 dev->resources |= bit;
876 dprintk(1, "res: get %d\n", bit);
877 mutex_unlock(&dev->lock);
878 return 1;
881 static int res_check(struct au0828_fh *fh, unsigned int bit)
883 return fh->resources & bit;
886 static int res_locked(struct au0828_dev *dev, unsigned int bit)
888 return dev->resources & bit;
891 static void res_free(struct au0828_fh *fh, unsigned int bits)
893 struct au0828_dev *dev = fh->dev;
895 BUG_ON((fh->resources & bits) != bits);
897 mutex_lock(&dev->lock);
898 fh->resources &= ~bits;
899 dev->resources &= ~bits;
900 dprintk(1, "res: put %d\n", bits);
901 mutex_unlock(&dev->lock);
904 static int get_ressource(struct au0828_fh *fh)
906 switch (fh->type) {
907 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
908 return AU0828_RESOURCE_VIDEO;
909 case V4L2_BUF_TYPE_VBI_CAPTURE:
910 return AU0828_RESOURCE_VBI;
911 default:
912 BUG();
913 return 0;
917 /* This function ensures that video frames continue to be delivered even if
918 the ITU-656 input isn't receiving any data (thereby preventing applications
919 such as tvtime from hanging) */
920 void au0828_vid_buffer_timeout(unsigned long data)
922 struct au0828_dev *dev = (struct au0828_dev *) data;
923 struct au0828_dmaqueue *dma_q = &dev->vidq;
924 struct au0828_buffer *buf;
925 unsigned char *vid_data;
926 unsigned long flags = 0;
928 spin_lock_irqsave(&dev->slock, flags);
930 buf = dev->isoc_ctl.buf;
931 if (buf != NULL) {
932 vid_data = videobuf_to_vmalloc(&buf->vb);
933 memset(vid_data, 0x00, buf->vb.size); /* Blank green frame */
934 buffer_filled(dev, dma_q, buf);
936 get_next_buf(dma_q, &buf);
938 if (dev->vid_timeout_running == 1)
939 mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
941 spin_unlock_irqrestore(&dev->slock, flags);
944 void au0828_vbi_buffer_timeout(unsigned long data)
946 struct au0828_dev *dev = (struct au0828_dev *) data;
947 struct au0828_dmaqueue *dma_q = &dev->vbiq;
948 struct au0828_buffer *buf;
949 unsigned char *vbi_data;
950 unsigned long flags = 0;
952 spin_lock_irqsave(&dev->slock, flags);
954 buf = dev->isoc_ctl.vbi_buf;
955 if (buf != NULL) {
956 vbi_data = videobuf_to_vmalloc(&buf->vb);
957 memset(vbi_data, 0x00, buf->vb.size);
958 vbi_buffer_filled(dev, dma_q, buf);
960 vbi_get_next_buf(dma_q, &buf);
962 if (dev->vbi_timeout_running == 1)
963 mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
964 spin_unlock_irqrestore(&dev->slock, flags);
968 static int au0828_v4l2_open(struct file *filp)
970 int ret = 0;
971 struct video_device *vdev = video_devdata(filp);
972 struct au0828_dev *dev = video_drvdata(filp);
973 struct au0828_fh *fh;
974 int type;
976 switch (vdev->vfl_type) {
977 case VFL_TYPE_GRABBER:
978 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
979 break;
980 case VFL_TYPE_VBI:
981 type = V4L2_BUF_TYPE_VBI_CAPTURE;
982 break;
983 default:
984 return -EINVAL;
987 fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
988 if (NULL == fh) {
989 dprintk(1, "Failed allocate au0828_fh struct!\n");
990 return -ENOMEM;
993 fh->type = type;
994 fh->dev = dev;
995 filp->private_data = fh;
997 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
998 /* set au0828 interface0 to AS5 here again */
999 ret = usb_set_interface(dev->usbdev, 0, 5);
1000 if (ret < 0) {
1001 printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
1002 return -EBUSY;
1004 dev->width = NTSC_STD_W;
1005 dev->height = NTSC_STD_H;
1006 dev->frame_size = dev->width * dev->height * 2;
1007 dev->field_size = dev->width * dev->height;
1008 dev->bytesperline = dev->width * 2;
1010 au0828_analog_stream_enable(dev);
1011 au0828_analog_stream_reset(dev);
1013 /* If we were doing ac97 instead of i2s, it would go here...*/
1014 au0828_i2s_init(dev);
1016 dev->stream_state = STREAM_OFF;
1017 dev->dev_state |= DEV_INITIALIZED;
1020 dev->users++;
1022 videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
1023 NULL, &dev->slock,
1024 V4L2_BUF_TYPE_VIDEO_CAPTURE,
1025 V4L2_FIELD_INTERLACED,
1026 sizeof(struct au0828_buffer), fh, NULL);
1028 /* VBI Setup */
1029 dev->vbi_width = 720;
1030 dev->vbi_height = 1;
1031 videobuf_queue_vmalloc_init(&fh->vb_vbiq, &au0828_vbi_qops,
1032 NULL, &dev->slock,
1033 V4L2_BUF_TYPE_VBI_CAPTURE,
1034 V4L2_FIELD_SEQ_TB,
1035 sizeof(struct au0828_buffer), fh, NULL);
1037 return ret;
1040 static int au0828_v4l2_close(struct file *filp)
1042 int ret;
1043 struct au0828_fh *fh = filp->private_data;
1044 struct au0828_dev *dev = fh->dev;
1046 if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1047 /* Cancel timeout thread in case they didn't call streamoff */
1048 dev->vid_timeout_running = 0;
1049 del_timer_sync(&dev->vid_timeout);
1051 videobuf_stop(&fh->vb_vidq);
1052 res_free(fh, AU0828_RESOURCE_VIDEO);
1055 if (res_check(fh, AU0828_RESOURCE_VBI)) {
1056 /* Cancel timeout thread in case they didn't call streamoff */
1057 dev->vbi_timeout_running = 0;
1058 del_timer_sync(&dev->vbi_timeout);
1060 videobuf_stop(&fh->vb_vbiq);
1061 res_free(fh, AU0828_RESOURCE_VBI);
1064 if (dev->users == 1) {
1065 if (dev->dev_state & DEV_DISCONNECTED) {
1066 au0828_analog_unregister(dev);
1067 kfree(dev);
1068 return 0;
1071 au0828_analog_stream_disable(dev);
1073 au0828_uninit_isoc(dev);
1075 /* Save some power by putting tuner to sleep */
1076 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
1078 /* When close the device, set the usb intf0 into alt0 to free
1079 USB bandwidth */
1080 ret = usb_set_interface(dev->usbdev, 0, 0);
1081 if (ret < 0)
1082 printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
1085 videobuf_mmap_free(&fh->vb_vidq);
1086 videobuf_mmap_free(&fh->vb_vbiq);
1087 kfree(fh);
1088 dev->users--;
1089 wake_up_interruptible_nr(&dev->open, 1);
1090 return 0;
1093 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
1094 size_t count, loff_t *pos)
1096 struct au0828_fh *fh = filp->private_data;
1097 struct au0828_dev *dev = fh->dev;
1098 int rc;
1100 rc = check_dev(dev);
1101 if (rc < 0)
1102 return rc;
1104 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1105 if (res_locked(dev, AU0828_RESOURCE_VIDEO))
1106 return -EBUSY;
1108 return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1109 filp->f_flags & O_NONBLOCK);
1112 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1113 if (!res_get(fh, AU0828_RESOURCE_VBI))
1114 return -EBUSY;
1116 if (dev->vbi_timeout_running == 0) {
1117 /* Handle case where caller tries to read without
1118 calling streamon first */
1119 dev->vbi_timeout_running = 1;
1120 mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1123 return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
1124 filp->f_flags & O_NONBLOCK);
1127 return 0;
1130 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
1132 struct au0828_fh *fh = filp->private_data;
1133 struct au0828_dev *dev = fh->dev;
1134 int rc;
1136 rc = check_dev(dev);
1137 if (rc < 0)
1138 return rc;
1140 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1141 if (!res_get(fh, AU0828_RESOURCE_VIDEO))
1142 return POLLERR;
1143 return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1144 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1145 if (!res_get(fh, AU0828_RESOURCE_VBI))
1146 return POLLERR;
1147 return videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
1148 } else {
1149 return POLLERR;
1153 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
1155 struct au0828_fh *fh = filp->private_data;
1156 struct au0828_dev *dev = fh->dev;
1157 int rc;
1159 rc = check_dev(dev);
1160 if (rc < 0)
1161 return rc;
1163 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1164 rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1165 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1166 rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
1168 return rc;
1171 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
1172 struct v4l2_format *format)
1174 int ret;
1175 int width = format->fmt.pix.width;
1176 int height = format->fmt.pix.height;
1178 if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1179 return -EINVAL;
1181 /* If they are demanding a format other than the one we support,
1182 bail out (tvtime asks for UYVY and then retries with YUYV) */
1183 if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
1184 return -EINVAL;
1186 /* format->fmt.pix.width only support 720 and height 480 */
1187 if (width != 720)
1188 width = 720;
1189 if (height != 480)
1190 height = 480;
1192 format->fmt.pix.width = width;
1193 format->fmt.pix.height = height;
1194 format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1195 format->fmt.pix.bytesperline = width * 2;
1196 format->fmt.pix.sizeimage = width * height * 2;
1197 format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1198 format->fmt.pix.field = V4L2_FIELD_INTERLACED;
1200 if (cmd == VIDIOC_TRY_FMT)
1201 return 0;
1203 /* maybe set new image format, driver current only support 720*480 */
1204 dev->width = width;
1205 dev->height = height;
1206 dev->frame_size = width * height * 2;
1207 dev->field_size = width * height;
1208 dev->bytesperline = width * 2;
1210 if (dev->stream_state == STREAM_ON) {
1211 dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
1212 ret = au0828_stream_interrupt(dev);
1213 if (ret != 0) {
1214 dprintk(1, "error interrupting video stream!\n");
1215 return ret;
1219 /* set au0828 interface0 to AS5 here again */
1220 ret = usb_set_interface(dev->usbdev, 0, 5);
1221 if (ret < 0) {
1222 printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
1223 return -EBUSY;
1226 au0828_analog_stream_enable(dev);
1228 return 0;
1232 static int vidioc_queryctrl(struct file *file, void *priv,
1233 struct v4l2_queryctrl *qc)
1235 struct au0828_fh *fh = priv;
1236 struct au0828_dev *dev = fh->dev;
1237 v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
1238 if (qc->type)
1239 return 0;
1240 else
1241 return -EINVAL;
1244 static int vidioc_querycap(struct file *file, void *priv,
1245 struct v4l2_capability *cap)
1247 struct au0828_fh *fh = priv;
1248 struct au0828_dev *dev = fh->dev;
1250 strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1251 strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1252 strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
1254 /*set the device capabilities */
1255 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1256 V4L2_CAP_VBI_CAPTURE |
1257 V4L2_CAP_AUDIO |
1258 V4L2_CAP_READWRITE |
1259 V4L2_CAP_STREAMING |
1260 V4L2_CAP_TUNER;
1261 return 0;
1264 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1265 struct v4l2_fmtdesc *f)
1267 if (f->index)
1268 return -EINVAL;
1270 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1271 strcpy(f->description, "Packed YUV2");
1273 f->flags = 0;
1274 f->pixelformat = V4L2_PIX_FMT_UYVY;
1276 return 0;
1279 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1280 struct v4l2_format *f)
1282 struct au0828_fh *fh = priv;
1283 struct au0828_dev *dev = fh->dev;
1285 f->fmt.pix.width = dev->width;
1286 f->fmt.pix.height = dev->height;
1287 f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1288 f->fmt.pix.bytesperline = dev->bytesperline;
1289 f->fmt.pix.sizeimage = dev->frame_size;
1290 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1291 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1292 return 0;
1295 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1296 struct v4l2_format *f)
1298 struct au0828_fh *fh = priv;
1299 struct au0828_dev *dev = fh->dev;
1301 return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1304 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1305 struct v4l2_format *f)
1307 struct au0828_fh *fh = priv;
1308 struct au0828_dev *dev = fh->dev;
1309 int rc;
1311 rc = check_dev(dev);
1312 if (rc < 0)
1313 return rc;
1315 mutex_lock(&dev->lock);
1317 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1318 printk(KERN_INFO "%s queue busy\n", __func__);
1319 rc = -EBUSY;
1320 goto out;
1323 rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1324 out:
1325 mutex_unlock(&dev->lock);
1326 return rc;
1329 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1331 struct au0828_fh *fh = priv;
1332 struct au0828_dev *dev = fh->dev;
1334 /* FIXME: when we support something other than NTSC, we are going to
1335 have to make the au0828 bridge adjust the size of its capture
1336 buffer, which is currently hardcoded at 720x480 */
1338 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
1339 return 0;
1342 static int vidioc_enum_input(struct file *file, void *priv,
1343 struct v4l2_input *input)
1345 struct au0828_fh *fh = priv;
1346 struct au0828_dev *dev = fh->dev;
1347 unsigned int tmp;
1349 static const char *inames[] = {
1350 [AU0828_VMUX_UNDEFINED] = "Undefined",
1351 [AU0828_VMUX_COMPOSITE] = "Composite",
1352 [AU0828_VMUX_SVIDEO] = "S-Video",
1353 [AU0828_VMUX_CABLE] = "Cable TV",
1354 [AU0828_VMUX_TELEVISION] = "Television",
1355 [AU0828_VMUX_DVB] = "DVB",
1356 [AU0828_VMUX_DEBUG] = "tv debug"
1359 tmp = input->index;
1361 if (tmp >= AU0828_MAX_INPUT)
1362 return -EINVAL;
1363 if (AUVI_INPUT(tmp).type == 0)
1364 return -EINVAL;
1366 input->index = tmp;
1367 strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1368 if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1369 (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1370 input->type |= V4L2_INPUT_TYPE_TUNER;
1371 else
1372 input->type |= V4L2_INPUT_TYPE_CAMERA;
1374 input->std = dev->vdev->tvnorms;
1376 return 0;
1379 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1381 struct au0828_fh *fh = priv;
1382 struct au0828_dev *dev = fh->dev;
1383 *i = dev->ctrl_input;
1384 return 0;
1387 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1389 struct au0828_fh *fh = priv;
1390 struct au0828_dev *dev = fh->dev;
1391 int i;
1393 dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1394 index);
1395 if (index >= AU0828_MAX_INPUT)
1396 return -EINVAL;
1397 if (AUVI_INPUT(index).type == 0)
1398 return -EINVAL;
1399 dev->ctrl_input = index;
1401 switch (AUVI_INPUT(index).type) {
1402 case AU0828_VMUX_SVIDEO:
1403 dev->input_type = AU0828_VMUX_SVIDEO;
1404 break;
1405 case AU0828_VMUX_COMPOSITE:
1406 dev->input_type = AU0828_VMUX_COMPOSITE;
1407 break;
1408 case AU0828_VMUX_TELEVISION:
1409 dev->input_type = AU0828_VMUX_TELEVISION;
1410 break;
1411 default:
1412 dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1413 AUVI_INPUT(index).type);
1414 break;
1417 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1418 AUVI_INPUT(index).vmux, 0, 0);
1420 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1421 int enable = 0;
1422 if (AUVI_INPUT(i).audio_setup == NULL)
1423 continue;
1425 if (i == index)
1426 enable = 1;
1427 else
1428 enable = 0;
1429 if (enable) {
1430 (AUVI_INPUT(i).audio_setup)(dev, enable);
1431 } else {
1432 /* Make sure we leave it turned on if some
1433 other input is routed to this callback */
1434 if ((AUVI_INPUT(i).audio_setup) !=
1435 ((AUVI_INPUT(index).audio_setup))) {
1436 (AUVI_INPUT(i).audio_setup)(dev, enable);
1441 v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1442 AUVI_INPUT(index).amux, 0, 0);
1443 return 0;
1446 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1448 struct au0828_fh *fh = priv;
1449 struct au0828_dev *dev = fh->dev;
1450 unsigned int index = a->index;
1452 if (a->index > 1)
1453 return -EINVAL;
1455 index = dev->ctrl_ainput;
1456 if (index == 0)
1457 strcpy(a->name, "Television");
1458 else
1459 strcpy(a->name, "Line in");
1461 a->capability = V4L2_AUDCAP_STEREO;
1462 a->index = index;
1463 return 0;
1466 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1468 struct au0828_fh *fh = priv;
1469 struct au0828_dev *dev = fh->dev;
1470 if (a->index != dev->ctrl_ainput)
1471 return -EINVAL;
1472 return 0;
1475 static int vidioc_g_ctrl(struct file *file, void *priv,
1476 struct v4l2_control *ctrl)
1478 struct au0828_fh *fh = priv;
1479 struct au0828_dev *dev = fh->dev;
1481 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1482 return 0;
1486 static int vidioc_s_ctrl(struct file *file, void *priv,
1487 struct v4l2_control *ctrl)
1489 struct au0828_fh *fh = priv;
1490 struct au0828_dev *dev = fh->dev;
1491 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1492 return 0;
1495 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1497 struct au0828_fh *fh = priv;
1498 struct au0828_dev *dev = fh->dev;
1500 if (t->index != 0)
1501 return -EINVAL;
1503 strcpy(t->name, "Auvitek tuner");
1504 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1505 return 0;
1508 static int vidioc_s_tuner(struct file *file, void *priv,
1509 struct v4l2_tuner *t)
1511 struct au0828_fh *fh = priv;
1512 struct au0828_dev *dev = fh->dev;
1514 if (t->index != 0)
1515 return -EINVAL;
1517 t->type = V4L2_TUNER_ANALOG_TV;
1518 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1519 dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1520 t->afc);
1521 return 0;
1525 static int vidioc_g_frequency(struct file *file, void *priv,
1526 struct v4l2_frequency *freq)
1528 struct au0828_fh *fh = priv;
1529 struct au0828_dev *dev = fh->dev;
1531 freq->type = V4L2_TUNER_ANALOG_TV;
1532 freq->frequency = dev->ctrl_freq;
1533 return 0;
1536 static int vidioc_s_frequency(struct file *file, void *priv,
1537 struct v4l2_frequency *freq)
1539 struct au0828_fh *fh = priv;
1540 struct au0828_dev *dev = fh->dev;
1542 if (freq->tuner != 0)
1543 return -EINVAL;
1544 if (freq->type != V4L2_TUNER_ANALOG_TV)
1545 return -EINVAL;
1547 dev->ctrl_freq = freq->frequency;
1549 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1551 au0828_analog_stream_reset(dev);
1553 return 0;
1557 /* RAW VBI ioctls */
1559 static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1560 struct v4l2_format *format)
1562 struct au0828_fh *fh = priv;
1563 struct au0828_dev *dev = fh->dev;
1565 format->fmt.vbi.samples_per_line = dev->vbi_width;
1566 format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1567 format->fmt.vbi.offset = 0;
1568 format->fmt.vbi.flags = 0;
1569 format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1571 format->fmt.vbi.count[0] = dev->vbi_height;
1572 format->fmt.vbi.count[1] = dev->vbi_height;
1573 format->fmt.vbi.start[0] = 21;
1574 format->fmt.vbi.start[1] = 284;
1576 return 0;
1579 static int vidioc_g_chip_ident(struct file *file, void *priv,
1580 struct v4l2_dbg_chip_ident *chip)
1582 struct au0828_fh *fh = priv;
1583 struct au0828_dev *dev = fh->dev;
1584 chip->ident = V4L2_IDENT_NONE;
1585 chip->revision = 0;
1587 if (v4l2_chip_match_host(&chip->match)) {
1588 chip->ident = V4L2_IDENT_AU0828;
1589 return 0;
1592 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1593 if (chip->ident == V4L2_IDENT_NONE)
1594 return -EINVAL;
1596 return 0;
1599 static int vidioc_cropcap(struct file *file, void *priv,
1600 struct v4l2_cropcap *cc)
1602 struct au0828_fh *fh = priv;
1603 struct au0828_dev *dev = fh->dev;
1605 if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1606 return -EINVAL;
1608 cc->bounds.left = 0;
1609 cc->bounds.top = 0;
1610 cc->bounds.width = dev->width;
1611 cc->bounds.height = dev->height;
1613 cc->defrect = cc->bounds;
1615 cc->pixelaspect.numerator = 54;
1616 cc->pixelaspect.denominator = 59;
1618 return 0;
1621 static int vidioc_streamon(struct file *file, void *priv,
1622 enum v4l2_buf_type type)
1624 struct au0828_fh *fh = priv;
1625 struct au0828_dev *dev = fh->dev;
1626 int rc = -EINVAL;
1628 rc = check_dev(dev);
1629 if (rc < 0)
1630 return rc;
1632 if (unlikely(type != fh->type))
1633 return -EINVAL;
1635 dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1636 fh, type, fh->resources, dev->resources);
1638 if (unlikely(!res_get(fh, get_ressource(fh))))
1639 return -EBUSY;
1641 if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1642 au0828_analog_stream_enable(dev);
1643 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1646 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1647 rc = videobuf_streamon(&fh->vb_vidq);
1648 dev->vid_timeout_running = 1;
1649 mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
1650 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1651 rc = videobuf_streamon(&fh->vb_vbiq);
1652 dev->vbi_timeout_running = 1;
1653 mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1656 return rc;
1659 static int vidioc_streamoff(struct file *file, void *priv,
1660 enum v4l2_buf_type type)
1662 struct au0828_fh *fh = priv;
1663 struct au0828_dev *dev = fh->dev;
1664 int rc;
1665 int i;
1667 rc = check_dev(dev);
1668 if (rc < 0)
1669 return rc;
1671 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1672 fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1673 return -EINVAL;
1674 if (type != fh->type)
1675 return -EINVAL;
1677 dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1678 fh, type, fh->resources, dev->resources);
1680 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1681 dev->vid_timeout_running = 0;
1682 del_timer_sync(&dev->vid_timeout);
1684 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1685 rc = au0828_stream_interrupt(dev);
1686 if (rc != 0)
1687 return rc;
1689 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1690 if (AUVI_INPUT(i).audio_setup == NULL)
1691 continue;
1692 (AUVI_INPUT(i).audio_setup)(dev, 0);
1695 videobuf_streamoff(&fh->vb_vidq);
1696 res_free(fh, AU0828_RESOURCE_VIDEO);
1697 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1698 dev->vbi_timeout_running = 0;
1699 del_timer_sync(&dev->vbi_timeout);
1701 videobuf_streamoff(&fh->vb_vbiq);
1702 res_free(fh, AU0828_RESOURCE_VBI);
1705 return 0;
1708 #ifdef CONFIG_VIDEO_ADV_DEBUG
1709 static int vidioc_g_register(struct file *file, void *priv,
1710 struct v4l2_dbg_register *reg)
1712 struct au0828_fh *fh = priv;
1713 struct au0828_dev *dev = fh->dev;
1715 switch (reg->match.type) {
1716 case V4L2_CHIP_MATCH_I2C_DRIVER:
1717 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1718 return 0;
1719 default:
1720 return -EINVAL;
1724 static int vidioc_s_register(struct file *file, void *priv,
1725 struct v4l2_dbg_register *reg)
1727 struct au0828_fh *fh = priv;
1728 struct au0828_dev *dev = fh->dev;
1730 switch (reg->match.type) {
1731 case V4L2_CHIP_MATCH_I2C_DRIVER:
1732 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1733 return 0;
1734 default:
1735 return -EINVAL;
1737 return 0;
1739 #endif
1741 static int vidioc_reqbufs(struct file *file, void *priv,
1742 struct v4l2_requestbuffers *rb)
1744 struct au0828_fh *fh = priv;
1745 struct au0828_dev *dev = fh->dev;
1746 int rc;
1748 rc = check_dev(dev);
1749 if (rc < 0)
1750 return rc;
1752 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1753 rc = videobuf_reqbufs(&fh->vb_vidq, rb);
1754 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1755 rc = videobuf_reqbufs(&fh->vb_vbiq, rb);
1757 return rc;
1760 static int vidioc_querybuf(struct file *file, void *priv,
1761 struct v4l2_buffer *b)
1763 struct au0828_fh *fh = priv;
1764 struct au0828_dev *dev = fh->dev;
1765 int rc;
1767 rc = check_dev(dev);
1768 if (rc < 0)
1769 return rc;
1771 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1772 rc = videobuf_querybuf(&fh->vb_vidq, b);
1773 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1774 rc = videobuf_querybuf(&fh->vb_vbiq, b);
1776 return rc;
1779 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1781 struct au0828_fh *fh = priv;
1782 struct au0828_dev *dev = fh->dev;
1783 int rc;
1785 rc = check_dev(dev);
1786 if (rc < 0)
1787 return rc;
1789 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1790 rc = videobuf_qbuf(&fh->vb_vidq, b);
1791 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1792 rc = videobuf_qbuf(&fh->vb_vbiq, b);
1794 return rc;
1797 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1799 struct au0828_fh *fh = priv;
1800 struct au0828_dev *dev = fh->dev;
1801 int rc;
1803 rc = check_dev(dev);
1804 if (rc < 0)
1805 return rc;
1807 /* Workaround for a bug in the au0828 hardware design that sometimes
1808 results in the colorspace being inverted */
1809 if (dev->greenscreen_detected == 1) {
1810 dprintk(1, "Detected green frame. Resetting stream...\n");
1811 au0828_analog_stream_reset(dev);
1812 dev->greenscreen_detected = 0;
1815 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1816 rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1817 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1818 rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK);
1820 return rc;
1823 static struct v4l2_file_operations au0828_v4l_fops = {
1824 .owner = THIS_MODULE,
1825 .open = au0828_v4l2_open,
1826 .release = au0828_v4l2_close,
1827 .read = au0828_v4l2_read,
1828 .poll = au0828_v4l2_poll,
1829 .mmap = au0828_v4l2_mmap,
1830 .ioctl = video_ioctl2,
1833 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1834 .vidioc_querycap = vidioc_querycap,
1835 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1836 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1837 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1838 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1839 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1840 .vidioc_s_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1841 .vidioc_g_audio = vidioc_g_audio,
1842 .vidioc_s_audio = vidioc_s_audio,
1843 .vidioc_cropcap = vidioc_cropcap,
1844 .vidioc_reqbufs = vidioc_reqbufs,
1845 .vidioc_querybuf = vidioc_querybuf,
1846 .vidioc_qbuf = vidioc_qbuf,
1847 .vidioc_dqbuf = vidioc_dqbuf,
1848 .vidioc_s_std = vidioc_s_std,
1849 .vidioc_enum_input = vidioc_enum_input,
1850 .vidioc_g_input = vidioc_g_input,
1851 .vidioc_s_input = vidioc_s_input,
1852 .vidioc_queryctrl = vidioc_queryctrl,
1853 .vidioc_g_ctrl = vidioc_g_ctrl,
1854 .vidioc_s_ctrl = vidioc_s_ctrl,
1855 .vidioc_streamon = vidioc_streamon,
1856 .vidioc_streamoff = vidioc_streamoff,
1857 .vidioc_g_tuner = vidioc_g_tuner,
1858 .vidioc_s_tuner = vidioc_s_tuner,
1859 .vidioc_g_frequency = vidioc_g_frequency,
1860 .vidioc_s_frequency = vidioc_s_frequency,
1861 #ifdef CONFIG_VIDEO_ADV_DEBUG
1862 .vidioc_g_register = vidioc_g_register,
1863 .vidioc_s_register = vidioc_s_register,
1864 #endif
1865 .vidioc_g_chip_ident = vidioc_g_chip_ident,
1868 static const struct video_device au0828_video_template = {
1869 .fops = &au0828_v4l_fops,
1870 .release = video_device_release,
1871 .ioctl_ops = &video_ioctl_ops,
1872 .tvnorms = V4L2_STD_NTSC_M,
1873 .current_norm = V4L2_STD_NTSC_M,
1876 /**************************************************************************/
1878 int au0828_analog_register(struct au0828_dev *dev,
1879 struct usb_interface *interface)
1881 int retval = -ENOMEM;
1882 struct usb_host_interface *iface_desc;
1883 struct usb_endpoint_descriptor *endpoint;
1884 int i;
1886 dprintk(1, "au0828_analog_register called!\n");
1888 /* set au0828 usb interface0 to as5 */
1889 retval = usb_set_interface(dev->usbdev,
1890 interface->cur_altsetting->desc.bInterfaceNumber, 5);
1891 if (retval != 0) {
1892 printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1893 return retval;
1896 /* Figure out which endpoint has the isoc interface */
1897 iface_desc = interface->cur_altsetting;
1898 for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1899 endpoint = &iface_desc->endpoint[i].desc;
1900 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1901 == USB_DIR_IN) &&
1902 ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1903 == USB_ENDPOINT_XFER_ISOC)) {
1905 /* we find our isoc in endpoint */
1906 u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1907 dev->max_pkt_size = (tmp & 0x07ff) *
1908 (((tmp & 0x1800) >> 11) + 1);
1909 dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1912 if (!(dev->isoc_in_endpointaddr)) {
1913 printk(KERN_INFO "Could not locate isoc endpoint\n");
1914 kfree(dev);
1915 return -ENODEV;
1918 init_waitqueue_head(&dev->open);
1919 spin_lock_init(&dev->slock);
1920 mutex_init(&dev->lock);
1922 /* init video dma queues */
1923 INIT_LIST_HEAD(&dev->vidq.active);
1924 INIT_LIST_HEAD(&dev->vidq.queued);
1925 INIT_LIST_HEAD(&dev->vbiq.active);
1926 INIT_LIST_HEAD(&dev->vbiq.queued);
1928 dev->vid_timeout.function = au0828_vid_buffer_timeout;
1929 dev->vid_timeout.data = (unsigned long) dev;
1930 init_timer(&dev->vid_timeout);
1932 dev->vbi_timeout.function = au0828_vbi_buffer_timeout;
1933 dev->vbi_timeout.data = (unsigned long) dev;
1934 init_timer(&dev->vbi_timeout);
1936 dev->width = NTSC_STD_W;
1937 dev->height = NTSC_STD_H;
1938 dev->field_size = dev->width * dev->height;
1939 dev->frame_size = dev->field_size << 1;
1940 dev->bytesperline = dev->width << 1;
1941 dev->ctrl_ainput = 0;
1943 /* allocate and fill v4l2 video struct */
1944 dev->vdev = video_device_alloc();
1945 if (NULL == dev->vdev) {
1946 dprintk(1, "Can't allocate video_device.\n");
1947 return -ENOMEM;
1950 /* allocate the VBI struct */
1951 dev->vbi_dev = video_device_alloc();
1952 if (NULL == dev->vbi_dev) {
1953 dprintk(1, "Can't allocate vbi_device.\n");
1954 kfree(dev->vdev);
1955 return -ENOMEM;
1958 /* Fill the video capture device struct */
1959 *dev->vdev = au0828_video_template;
1960 dev->vdev->parent = &dev->usbdev->dev;
1961 strcpy(dev->vdev->name, "au0828a video");
1963 /* Setup the VBI device */
1964 *dev->vbi_dev = au0828_video_template;
1965 dev->vbi_dev->parent = &dev->usbdev->dev;
1966 strcpy(dev->vbi_dev->name, "au0828a vbi");
1968 /* Register the v4l2 device */
1969 video_set_drvdata(dev->vdev, dev);
1970 retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
1971 if (retval != 0) {
1972 dprintk(1, "unable to register video device (error = %d).\n",
1973 retval);
1974 video_device_release(dev->vdev);
1975 return -ENODEV;
1978 /* Register the vbi device */
1979 video_set_drvdata(dev->vbi_dev, dev);
1980 retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
1981 if (retval != 0) {
1982 dprintk(1, "unable to register vbi device (error = %d).\n",
1983 retval);
1984 video_device_release(dev->vbi_dev);
1985 video_device_release(dev->vdev);
1986 return -ENODEV;
1989 dprintk(1, "%s completed!\n", __func__);
1991 return 0;