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
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 <linux/version.h>
37 #include <media/v4l2-common.h>
38 #include <media/v4l2-ioctl.h>
39 #include <media/v4l2-chip-ident.h>
40 #include <media/tuner.h>
42 #include "au0828-reg.h"
44 static DEFINE_MUTEX(au0828_sysfs_lock);
46 #define AU0828_VERSION_CODE KERNEL_VERSION(0, 0, 1)
48 /* ------------------------------------------------------------------
50 ------------------------------------------------------------------*/
52 static unsigned int isoc_debug;
53 module_param(isoc_debug, int, 0644);
54 MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
56 #define au0828_isocdbg(fmt, arg...) \
59 printk(KERN_INFO "au0828 %s :"fmt, \
64 static inline void print_err_status(struct au0828_dev *dev,
65 int packet, int status)
67 char *errmsg = "Unknown";
71 errmsg = "unlinked synchronuously";
74 errmsg = "unlinked asynchronuously";
77 errmsg = "Buffer error (overrun)";
80 errmsg = "Stalled (device not responding)";
83 errmsg = "Babble (bad cable?)";
86 errmsg = "Bit-stuff error (bad cable?)";
89 errmsg = "CRC/Timeout (could be anything)";
92 errmsg = "Device does not respond";
96 au0828_isocdbg("URB status %d [%s].\n", status, errmsg);
98 au0828_isocdbg("URB packet %d, status %d [%s].\n",
99 packet, status, errmsg);
103 static int check_dev(struct au0828_dev *dev)
105 if (dev->dev_state & DEV_DISCONNECTED) {
106 printk(KERN_INFO "v4l2 ioctl: device not present\n");
110 if (dev->dev_state & DEV_MISCONFIGURED) {
111 printk(KERN_INFO "v4l2 ioctl: device is misconfigured; "
112 "close and open it again\n");
119 * IRQ callback, called by URB callback
121 static void au0828_irq_callback(struct urb *urb)
123 struct au0828_dmaqueue *dma_q = urb->context;
124 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
127 switch (urb->status) {
128 case 0: /* success */
129 case -ETIMEDOUT: /* NAK */
131 case -ECONNRESET: /* kill */
134 au0828_isocdbg("au0828_irq_callback called: status kill\n");
136 default: /* unknown error */
137 au0828_isocdbg("urb completition error %d.\n", urb->status);
141 /* Copy data from URB */
142 spin_lock(&dev->slock);
143 rc = dev->isoc_ctl.isoc_copy(dev, urb);
144 spin_unlock(&dev->slock);
146 /* Reset urb buffers */
147 for (i = 0; i < urb->number_of_packets; i++) {
148 urb->iso_frame_desc[i].status = 0;
149 urb->iso_frame_desc[i].actual_length = 0;
153 urb->status = usb_submit_urb(urb, GFP_ATOMIC);
155 au0828_isocdbg("urb resubmit failed (error=%i)\n",
161 * Stop and Deallocate URBs
163 void au0828_uninit_isoc(struct au0828_dev *dev)
168 au0828_isocdbg("au0828: called au0828_uninit_isoc\n");
170 dev->isoc_ctl.nfields = -1;
171 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
172 urb = dev->isoc_ctl.urb[i];
174 if (!irqs_disabled())
179 if (dev->isoc_ctl.transfer_buffer[i]) {
180 usb_free_coherent(dev->usbdev,
181 urb->transfer_buffer_length,
182 dev->isoc_ctl.transfer_buffer[i],
186 dev->isoc_ctl.urb[i] = NULL;
188 dev->isoc_ctl.transfer_buffer[i] = NULL;
191 kfree(dev->isoc_ctl.urb);
192 kfree(dev->isoc_ctl.transfer_buffer);
194 dev->isoc_ctl.urb = NULL;
195 dev->isoc_ctl.transfer_buffer = NULL;
196 dev->isoc_ctl.num_bufs = 0;
200 * Allocate URBs and start IRQ
202 int au0828_init_isoc(struct au0828_dev *dev, int max_packets,
203 int num_bufs, int max_pkt_size,
204 int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb))
206 struct au0828_dmaqueue *dma_q = &dev->vidq;
213 au0828_isocdbg("au0828: called au0828_prepare_isoc\n");
215 /* De-allocates all pending stuff */
216 au0828_uninit_isoc(dev);
218 dev->isoc_ctl.isoc_copy = isoc_copy;
219 dev->isoc_ctl.num_bufs = num_bufs;
221 dev->isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
222 if (!dev->isoc_ctl.urb) {
223 au0828_isocdbg("cannot alloc memory for usb buffers\n");
227 dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
229 if (!dev->isoc_ctl.transfer_buffer) {
230 au0828_isocdbg("cannot allocate memory for usb transfer\n");
231 kfree(dev->isoc_ctl.urb);
235 dev->isoc_ctl.max_pkt_size = max_pkt_size;
236 dev->isoc_ctl.buf = NULL;
238 sb_size = max_packets * dev->isoc_ctl.max_pkt_size;
240 /* allocate urbs and transfer buffers */
241 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
242 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
244 au0828_isocdbg("cannot alloc isoc_ctl.urb %i\n", i);
245 au0828_uninit_isoc(dev);
248 dev->isoc_ctl.urb[i] = urb;
250 dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(dev->usbdev,
251 sb_size, GFP_KERNEL, &urb->transfer_dma);
252 if (!dev->isoc_ctl.transfer_buffer[i]) {
253 printk("unable to allocate %i bytes for transfer"
256 in_interrupt() ? " while in int" : "");
257 au0828_uninit_isoc(dev);
260 memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
262 pipe = usb_rcvisocpipe(dev->usbdev,
263 dev->isoc_in_endpointaddr),
265 usb_fill_int_urb(urb, dev->usbdev, pipe,
266 dev->isoc_ctl.transfer_buffer[i], sb_size,
267 au0828_irq_callback, dma_q, 1);
269 urb->number_of_packets = max_packets;
270 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
273 for (j = 0; j < max_packets; j++) {
274 urb->iso_frame_desc[j].offset = k;
275 urb->iso_frame_desc[j].length =
276 dev->isoc_ctl.max_pkt_size;
277 k += dev->isoc_ctl.max_pkt_size;
281 init_waitqueue_head(&dma_q->wq);
283 /* submit urbs and enables IRQ */
284 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
285 rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
287 au0828_isocdbg("submit of urb %i failed (error=%i)\n",
289 au0828_uninit_isoc(dev);
298 * Announces that a buffer were filled and request the next
300 static inline void buffer_filled(struct au0828_dev *dev,
301 struct au0828_dmaqueue *dma_q,
302 struct au0828_buffer *buf)
304 /* Advice that buffer was filled */
305 au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
307 buf->vb.state = VIDEOBUF_DONE;
308 buf->vb.field_count++;
309 do_gettimeofday(&buf->vb.ts);
311 dev->isoc_ctl.buf = NULL;
313 list_del(&buf->vb.queue);
314 wake_up(&buf->vb.done);
317 static inline void vbi_buffer_filled(struct au0828_dev *dev,
318 struct au0828_dmaqueue *dma_q,
319 struct au0828_buffer *buf)
321 /* Advice that buffer was filled */
322 au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
324 buf->vb.state = VIDEOBUF_DONE;
325 buf->vb.field_count++;
326 do_gettimeofday(&buf->vb.ts);
328 dev->isoc_ctl.vbi_buf = NULL;
330 list_del(&buf->vb.queue);
331 wake_up(&buf->vb.done);
335 * Identify the buffer header type and properly handles
337 static void au0828_copy_video(struct au0828_dev *dev,
338 struct au0828_dmaqueue *dma_q,
339 struct au0828_buffer *buf,
341 unsigned char *outp, unsigned long len)
343 void *fieldstart, *startwrite, *startread;
344 int linesdone, currlinedone, offset, lencopy, remain;
345 int bytesperline = dev->width << 1; /* Assumes 16-bit depth @@@@ */
350 if (dma_q->pos + len > buf->vb.size)
351 len = buf->vb.size - dma_q->pos;
356 /* Interlaces frame */
360 fieldstart = outp + bytesperline;
362 linesdone = dma_q->pos / bytesperline;
363 currlinedone = dma_q->pos % bytesperline;
364 offset = linesdone * bytesperline * 2 + currlinedone;
365 startwrite = fieldstart + offset;
366 lencopy = bytesperline - currlinedone;
367 lencopy = lencopy > remain ? remain : lencopy;
369 if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
370 au0828_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
371 ((char *)startwrite + lencopy) -
372 ((char *)outp + buf->vb.size));
373 remain = (char *)outp + buf->vb.size - (char *)startwrite;
378 memcpy(startwrite, startread, lencopy);
383 startwrite += lencopy + bytesperline;
384 startread += lencopy;
385 if (bytesperline > remain)
388 lencopy = bytesperline;
390 if ((char *)startwrite + lencopy > (char *)outp +
392 au0828_isocdbg("Overflow %zi bytes past buf end (2)\n",
393 ((char *)startwrite + lencopy) -
394 ((char *)outp + buf->vb.size));
395 lencopy = remain = (char *)outp + buf->vb.size -
401 memcpy(startwrite, startread, lencopy);
407 /* We have enough data to check for greenscreen */
408 if (outp[0] < 0x60 && outp[1440] < 0x60)
409 dev->greenscreen_detected = 1;
416 * video-buf generic routine to get the next available buffer
418 static inline void get_next_buf(struct au0828_dmaqueue *dma_q,
419 struct au0828_buffer **buf)
421 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
423 if (list_empty(&dma_q->active)) {
424 au0828_isocdbg("No active queue to serve\n");
425 dev->isoc_ctl.buf = NULL;
430 /* Get the next buffer */
431 *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
432 dev->isoc_ctl.buf = *buf;
437 static void au0828_copy_vbi(struct au0828_dev *dev,
438 struct au0828_dmaqueue *dma_q,
439 struct au0828_buffer *buf,
441 unsigned char *outp, unsigned long len)
443 unsigned char *startwrite, *startread;
444 int bytesperline = dev->vbi_width;
448 au0828_isocdbg("dev is null\n");
453 au0828_isocdbg("dma_q is null\n");
459 au0828_isocdbg("p is null\n");
463 au0828_isocdbg("outp is null\n");
467 if (dma_q->pos + len > buf->vb.size)
468 len = buf->vb.size - dma_q->pos;
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];
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);
493 if (list_empty(&dma_q->active)) {
494 au0828_isocdbg("No active queue to serve\n");
495 dev->isoc_ctl.vbi_buf = NULL;
500 /* Get the next buffer */
501 *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
502 /* Cleans up buffer - Usefull 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;
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;
525 unsigned int vbi_field_size;
526 unsigned int remain, lencopy;
531 if ((dev->dev_state & DEV_DISCONNECTED) ||
532 (dev->dev_state & DEV_MISCONFIGURED))
535 if (urb->status < 0) {
536 print_err_status(dev, -1, urb->status);
537 if (urb->status == -ENOENT)
541 buf = dev->isoc_ctl.buf;
543 outp = videobuf_to_vmalloc(&buf->vb);
545 vbi_buf = dev->isoc_ctl.vbi_buf;
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;
553 print_err_status(dev, i, status);
554 if (urb->iso_frame_desc[i].status != -EPROTO)
558 if (urb->iso_frame_desc[i].actual_length <= 0)
561 if (urb->iso_frame_desc[i].actual_length >
563 au0828_isocdbg("packet bigger than packet size");
567 p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
569 len = urb->iso_frame_desc[i].actual_length - 4;
575 au0828_isocdbg("Video frame %s\n",
576 (fbyte & 0x40) ? "odd" : "even");
577 if (!(fbyte & 0x40)) {
580 vbi_buffer_filled(dev,
583 vbi_get_next_buf(vbi_dma_q, &vbi_buf);
587 vbioutp = videobuf_to_vmalloc(
592 buffer_filled(dev, dma_q, buf);
593 get_next_buf(dma_q, &buf);
597 outp = videobuf_to_vmalloc(&buf->vb);
607 if (vbi_buf != NULL) {
609 vbi_buf->top_field = 1;
611 vbi_buf->top_field = 0;
619 vbi_field_size = dev->vbi_width * dev->vbi_height * 2;
620 if (dev->vbi_read < vbi_field_size) {
621 remain = vbi_field_size - dev->vbi_read;
628 au0828_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
633 dev->vbi_read += lencopy;
636 if (dev->vbi_read >= vbi_field_size && buf != NULL)
637 au0828_copy_video(dev, dma_q, buf, p, outp, len);
643 buffer_setup(struct videobuf_queue *vq, unsigned int *count,
646 struct au0828_fh *fh = vq->priv_data;
647 *size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
650 *count = AU0828_DEF_BUF;
652 if (*count < AU0828_MIN_BUF)
653 *count = AU0828_MIN_BUF;
657 /* This is called *without* dev->slock held; please keep it that way */
658 static void free_buffer(struct videobuf_queue *vq, struct au0828_buffer *buf)
660 struct au0828_fh *fh = vq->priv_data;
661 struct au0828_dev *dev = fh->dev;
662 unsigned long flags = 0;
666 /* We used to wait for the buffer to finish here, but this didn't work
667 because, as we were keeping the state as VIDEOBUF_QUEUED,
668 videobuf_queue_cancel marked it as finished for us.
669 (Also, it could wedge forever if the hardware was misconfigured.)
671 This should be safe; by the time we get here, the buffer isn't
672 queued anymore. If we ever start marking the buffers as
673 VIDEOBUF_ACTIVE, it won't be, though.
675 spin_lock_irqsave(&dev->slock, flags);
676 if (dev->isoc_ctl.buf == buf)
677 dev->isoc_ctl.buf = NULL;
678 spin_unlock_irqrestore(&dev->slock, flags);
680 videobuf_vmalloc_free(&buf->vb);
681 buf->vb.state = VIDEOBUF_NEEDS_INIT;
685 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
686 enum v4l2_field field)
688 struct au0828_fh *fh = vq->priv_data;
689 struct au0828_buffer *buf = container_of(vb, struct au0828_buffer, vb);
690 struct au0828_dev *dev = fh->dev;
691 int rc = 0, urb_init = 0;
693 buf->vb.size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
695 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
698 buf->vb.width = dev->width;
699 buf->vb.height = dev->height;
700 buf->vb.field = field;
702 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
703 rc = videobuf_iolock(vq, &buf->vb, NULL);
705 printk(KERN_INFO "videobuf_iolock failed\n");
710 if (!dev->isoc_ctl.num_bufs)
714 rc = au0828_init_isoc(dev, AU0828_ISO_PACKETS_PER_URB,
715 AU0828_MAX_ISO_BUFS, dev->max_pkt_size,
718 printk(KERN_INFO "au0828_init_isoc failed\n");
723 buf->vb.state = VIDEOBUF_PREPARED;
727 free_buffer(vq, buf);
732 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
734 struct au0828_buffer *buf = container_of(vb,
735 struct au0828_buffer,
737 struct au0828_fh *fh = vq->priv_data;
738 struct au0828_dev *dev = fh->dev;
739 struct au0828_dmaqueue *vidq = &dev->vidq;
741 buf->vb.state = VIDEOBUF_QUEUED;
742 list_add_tail(&buf->vb.queue, &vidq->active);
745 static void buffer_release(struct videobuf_queue *vq,
746 struct videobuf_buffer *vb)
748 struct au0828_buffer *buf = container_of(vb,
749 struct au0828_buffer,
752 free_buffer(vq, buf);
755 static struct videobuf_queue_ops au0828_video_qops = {
756 .buf_setup = buffer_setup,
757 .buf_prepare = buffer_prepare,
758 .buf_queue = buffer_queue,
759 .buf_release = buffer_release,
762 /* ------------------------------------------------------------------
764 ------------------------------------------------------------------*/
766 static int au0828_i2s_init(struct au0828_dev *dev)
768 /* Enable i2s mode */
769 au0828_writereg(dev, AU0828_AUDIOCTRL_50C, 0x01);
774 * Auvitek au0828 analog stream enable
775 * Please set interface0 to AS5 before enable the stream
777 int au0828_analog_stream_enable(struct au0828_dev *d)
779 dprintk(1, "au0828_analog_stream_enable called\n");
780 au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00);
781 au0828_writereg(d, 0x106, 0x00);
783 au0828_writereg(d, 0x110, 0x00);
784 au0828_writereg(d, 0x111, 0x00);
785 au0828_writereg(d, 0x114, 0xa0);
786 au0828_writereg(d, 0x115, 0x05);
788 au0828_writereg(d, 0x112, 0x00);
789 au0828_writereg(d, 0x113, 0x00);
790 au0828_writereg(d, 0x116, 0xf2);
791 au0828_writereg(d, 0x117, 0x00);
792 au0828_writereg(d, AU0828_SENSORCTRL_100, 0xb3);
797 int au0828_analog_stream_disable(struct au0828_dev *d)
799 dprintk(1, "au0828_analog_stream_disable called\n");
800 au0828_writereg(d, AU0828_SENSORCTRL_100, 0x0);
804 void au0828_analog_stream_reset(struct au0828_dev *dev)
806 dprintk(1, "au0828_analog_stream_reset called\n");
807 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0x0);
809 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0xb3);
813 * Some operations needs to stop current streaming
815 static int au0828_stream_interrupt(struct au0828_dev *dev)
819 dev->stream_state = STREAM_INTERRUPT;
820 if (dev->dev_state == DEV_DISCONNECTED)
823 dev->dev_state = DEV_MISCONFIGURED;
824 dprintk(1, "%s device is misconfigured!\n", __func__);
831 * au0828_release_resources
832 * unregister v4l2 devices
834 void au0828_analog_unregister(struct au0828_dev *dev)
836 dprintk(1, "au0828_release_resources called\n");
837 mutex_lock(&au0828_sysfs_lock);
840 video_unregister_device(dev->vdev);
842 video_unregister_device(dev->vbi_dev);
844 mutex_unlock(&au0828_sysfs_lock);
848 /* Usage lock check functions */
849 static int res_get(struct au0828_fh *fh, unsigned int bit)
851 struct au0828_dev *dev = fh->dev;
853 if (fh->resources & bit)
854 /* have it already allocated */
858 mutex_lock(&dev->lock);
859 if (dev->resources & bit) {
860 /* no, someone else uses it */
861 mutex_unlock(&dev->lock);
864 /* it's free, grab it */
865 fh->resources |= bit;
866 dev->resources |= bit;
867 dprintk(1, "res: get %d\n", bit);
868 mutex_unlock(&dev->lock);
872 static int res_check(struct au0828_fh *fh, unsigned int bit)
874 return fh->resources & bit;
877 static int res_locked(struct au0828_dev *dev, unsigned int bit)
879 return dev->resources & bit;
882 static void res_free(struct au0828_fh *fh, unsigned int bits)
884 struct au0828_dev *dev = fh->dev;
886 BUG_ON((fh->resources & bits) != bits);
888 mutex_lock(&dev->lock);
889 fh->resources &= ~bits;
890 dev->resources &= ~bits;
891 dprintk(1, "res: put %d\n", bits);
892 mutex_unlock(&dev->lock);
895 static int get_ressource(struct au0828_fh *fh)
898 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
899 return AU0828_RESOURCE_VIDEO;
900 case V4L2_BUF_TYPE_VBI_CAPTURE:
901 return AU0828_RESOURCE_VBI;
908 static int au0828_v4l2_open(struct file *filp)
911 struct video_device *vdev = video_devdata(filp);
912 struct au0828_dev *dev = video_drvdata(filp);
913 struct au0828_fh *fh;
916 switch (vdev->vfl_type) {
917 case VFL_TYPE_GRABBER:
918 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
921 type = V4L2_BUF_TYPE_VBI_CAPTURE;
927 fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
929 dprintk(1, "Failed allocate au0828_fh struct!\n");
935 filp->private_data = fh;
937 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
938 /* set au0828 interface0 to AS5 here again */
939 ret = usb_set_interface(dev->usbdev, 0, 5);
941 printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
944 dev->width = NTSC_STD_W;
945 dev->height = NTSC_STD_H;
946 dev->frame_size = dev->width * dev->height * 2;
947 dev->field_size = dev->width * dev->height;
948 dev->bytesperline = dev->width * 2;
950 au0828_analog_stream_enable(dev);
951 au0828_analog_stream_reset(dev);
953 /* If we were doing ac97 instead of i2s, it would go here...*/
954 au0828_i2s_init(dev);
956 dev->stream_state = STREAM_OFF;
957 dev->dev_state |= DEV_INITIALIZED;
962 videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
964 V4L2_BUF_TYPE_VIDEO_CAPTURE,
965 V4L2_FIELD_INTERLACED,
966 sizeof(struct au0828_buffer), fh);
969 dev->vbi_width = 720;
971 videobuf_queue_vmalloc_init(&fh->vb_vbiq, &au0828_vbi_qops,
973 V4L2_BUF_TYPE_VBI_CAPTURE,
975 sizeof(struct au0828_buffer), fh);
981 static int au0828_v4l2_close(struct file *filp)
984 struct au0828_fh *fh = filp->private_data;
985 struct au0828_dev *dev = fh->dev;
987 if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
988 videobuf_stop(&fh->vb_vidq);
989 res_free(fh, AU0828_RESOURCE_VIDEO);
992 if (res_check(fh, AU0828_RESOURCE_VBI)) {
993 videobuf_stop(&fh->vb_vbiq);
994 res_free(fh, AU0828_RESOURCE_VBI);
997 if (dev->users == 1) {
998 if (dev->dev_state & DEV_DISCONNECTED) {
999 au0828_analog_unregister(dev);
1004 au0828_analog_stream_disable(dev);
1006 au0828_uninit_isoc(dev);
1008 /* Save some power by putting tuner to sleep */
1009 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
1011 /* When close the device, set the usb intf0 into alt0 to free
1013 ret = usb_set_interface(dev->usbdev, 0, 0);
1015 printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
1018 videobuf_mmap_free(&fh->vb_vidq);
1019 videobuf_mmap_free(&fh->vb_vbiq);
1022 wake_up_interruptible_nr(&dev->open, 1);
1026 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
1027 size_t count, loff_t *pos)
1029 struct au0828_fh *fh = filp->private_data;
1030 struct au0828_dev *dev = fh->dev;
1033 rc = check_dev(dev);
1037 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1038 if (res_locked(dev, AU0828_RESOURCE_VIDEO))
1041 return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1042 filp->f_flags & O_NONBLOCK);
1045 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1046 if (!res_get(fh, AU0828_RESOURCE_VBI))
1049 return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
1050 filp->f_flags & O_NONBLOCK);
1056 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
1058 struct au0828_fh *fh = filp->private_data;
1059 struct au0828_dev *dev = fh->dev;
1062 rc = check_dev(dev);
1066 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1067 if (!res_get(fh, AU0828_RESOURCE_VIDEO))
1069 return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1070 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1071 if (!res_get(fh, AU0828_RESOURCE_VBI))
1073 return videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
1079 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
1081 struct au0828_fh *fh = filp->private_data;
1082 struct au0828_dev *dev = fh->dev;
1085 rc = check_dev(dev);
1089 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1090 rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1091 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1092 rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
1097 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
1098 struct v4l2_format *format)
1101 int width = format->fmt.pix.width;
1102 int height = format->fmt.pix.height;
1103 unsigned int maxwidth, maxheight;
1108 if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1111 /* If they are demanding a format other than the one we support,
1112 bail out (tvtime asks for UYVY and then retries with YUYV) */
1113 if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
1116 /* format->fmt.pix.width only support 720 and height 480 */
1122 format->fmt.pix.width = width;
1123 format->fmt.pix.height = height;
1124 format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1125 format->fmt.pix.bytesperline = width * 2;
1126 format->fmt.pix.sizeimage = width * height * 2;
1127 format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1128 format->fmt.pix.field = V4L2_FIELD_INTERLACED;
1130 if (cmd == VIDIOC_TRY_FMT)
1133 /* maybe set new image format, driver current only support 720*480 */
1135 dev->height = height;
1136 dev->frame_size = width * height * 2;
1137 dev->field_size = width * height;
1138 dev->bytesperline = width * 2;
1140 if (dev->stream_state == STREAM_ON) {
1141 dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
1142 ret = au0828_stream_interrupt(dev);
1144 dprintk(1, "error interrupting video stream!\n");
1149 /* set au0828 interface0 to AS5 here again */
1150 ret = usb_set_interface(dev->usbdev, 0, 5);
1152 printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
1156 au0828_analog_stream_enable(dev);
1162 static int vidioc_queryctrl(struct file *file, void *priv,
1163 struct v4l2_queryctrl *qc)
1165 struct au0828_fh *fh = priv;
1166 struct au0828_dev *dev = fh->dev;
1167 v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
1174 static int vidioc_querycap(struct file *file, void *priv,
1175 struct v4l2_capability *cap)
1177 struct au0828_fh *fh = priv;
1178 struct au0828_dev *dev = fh->dev;
1180 strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1181 strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1182 strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
1184 cap->version = AU0828_VERSION_CODE;
1186 /*set the device capabilities */
1187 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1188 V4L2_CAP_VBI_CAPTURE |
1190 V4L2_CAP_READWRITE |
1191 V4L2_CAP_STREAMING |
1196 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1197 struct v4l2_fmtdesc *f)
1202 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1203 strcpy(f->description, "Packed YUV2");
1206 f->pixelformat = V4L2_PIX_FMT_UYVY;
1211 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1212 struct v4l2_format *f)
1214 struct au0828_fh *fh = priv;
1215 struct au0828_dev *dev = fh->dev;
1217 f->fmt.pix.width = dev->width;
1218 f->fmt.pix.height = dev->height;
1219 f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1220 f->fmt.pix.bytesperline = dev->bytesperline;
1221 f->fmt.pix.sizeimage = dev->frame_size;
1222 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1223 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1227 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1228 struct v4l2_format *f)
1230 struct au0828_fh *fh = priv;
1231 struct au0828_dev *dev = fh->dev;
1233 return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1236 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1237 struct v4l2_format *f)
1239 struct au0828_fh *fh = priv;
1240 struct au0828_dev *dev = fh->dev;
1243 rc = check_dev(dev);
1247 mutex_lock(&dev->lock);
1249 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1250 printk(KERN_INFO "%s queue busy\n", __func__);
1255 rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1257 mutex_unlock(&dev->lock);
1261 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1263 struct au0828_fh *fh = priv;
1264 struct au0828_dev *dev = fh->dev;
1266 /* FIXME: when we support something other than NTSC, we are going to
1267 have to make the au0828 bridge adjust the size of its capture
1268 buffer, which is currently hardcoded at 720x480 */
1270 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
1274 static int vidioc_enum_input(struct file *file, void *priv,
1275 struct v4l2_input *input)
1277 struct au0828_fh *fh = priv;
1278 struct au0828_dev *dev = fh->dev;
1281 static const char *inames[] = {
1282 [AU0828_VMUX_UNDEFINED] = "Undefined",
1283 [AU0828_VMUX_COMPOSITE] = "Composite",
1284 [AU0828_VMUX_SVIDEO] = "S-Video",
1285 [AU0828_VMUX_CABLE] = "Cable TV",
1286 [AU0828_VMUX_TELEVISION] = "Television",
1287 [AU0828_VMUX_DVB] = "DVB",
1288 [AU0828_VMUX_DEBUG] = "tv debug"
1293 if (tmp >= AU0828_MAX_INPUT)
1295 if (AUVI_INPUT(tmp).type == 0)
1299 strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1300 if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1301 (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1302 input->type |= V4L2_INPUT_TYPE_TUNER;
1304 input->type |= V4L2_INPUT_TYPE_CAMERA;
1306 input->std = dev->vdev->tvnorms;
1311 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1313 struct au0828_fh *fh = priv;
1314 struct au0828_dev *dev = fh->dev;
1315 *i = dev->ctrl_input;
1319 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1321 struct au0828_fh *fh = priv;
1322 struct au0828_dev *dev = fh->dev;
1325 dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1327 if (index >= AU0828_MAX_INPUT)
1329 if (AUVI_INPUT(index).type == 0)
1331 dev->ctrl_input = index;
1333 switch (AUVI_INPUT(index).type) {
1334 case AU0828_VMUX_SVIDEO:
1335 dev->input_type = AU0828_VMUX_SVIDEO;
1337 case AU0828_VMUX_COMPOSITE:
1338 dev->input_type = AU0828_VMUX_COMPOSITE;
1340 case AU0828_VMUX_TELEVISION:
1341 dev->input_type = AU0828_VMUX_TELEVISION;
1344 dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1345 AUVI_INPUT(index).type);
1349 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1350 AUVI_INPUT(index).vmux, 0, 0);
1352 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1354 if (AUVI_INPUT(i).audio_setup == NULL)
1362 (AUVI_INPUT(i).audio_setup)(dev, enable);
1364 /* Make sure we leave it turned on if some
1365 other input is routed to this callback */
1366 if ((AUVI_INPUT(i).audio_setup) !=
1367 ((AUVI_INPUT(index).audio_setup))) {
1368 (AUVI_INPUT(i).audio_setup)(dev, enable);
1373 v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1374 AUVI_INPUT(index).amux, 0, 0);
1378 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1380 struct au0828_fh *fh = priv;
1381 struct au0828_dev *dev = fh->dev;
1382 unsigned int index = a->index;
1387 index = dev->ctrl_ainput;
1389 strcpy(a->name, "Television");
1391 strcpy(a->name, "Line in");
1393 a->capability = V4L2_AUDCAP_STEREO;
1398 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1400 struct au0828_fh *fh = priv;
1401 struct au0828_dev *dev = fh->dev;
1402 if (a->index != dev->ctrl_ainput)
1407 static int vidioc_g_ctrl(struct file *file, void *priv,
1408 struct v4l2_control *ctrl)
1410 struct au0828_fh *fh = priv;
1411 struct au0828_dev *dev = fh->dev;
1413 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1418 static int vidioc_s_ctrl(struct file *file, void *priv,
1419 struct v4l2_control *ctrl)
1421 struct au0828_fh *fh = priv;
1422 struct au0828_dev *dev = fh->dev;
1423 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1427 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1429 struct au0828_fh *fh = priv;
1430 struct au0828_dev *dev = fh->dev;
1435 strcpy(t->name, "Auvitek tuner");
1436 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1440 static int vidioc_s_tuner(struct file *file, void *priv,
1441 struct v4l2_tuner *t)
1443 struct au0828_fh *fh = priv;
1444 struct au0828_dev *dev = fh->dev;
1449 t->type = V4L2_TUNER_ANALOG_TV;
1450 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1451 dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1457 static int vidioc_g_frequency(struct file *file, void *priv,
1458 struct v4l2_frequency *freq)
1460 struct au0828_fh *fh = priv;
1461 struct au0828_dev *dev = fh->dev;
1463 freq->type = V4L2_TUNER_ANALOG_TV;
1464 freq->frequency = dev->ctrl_freq;
1468 static int vidioc_s_frequency(struct file *file, void *priv,
1469 struct v4l2_frequency *freq)
1471 struct au0828_fh *fh = priv;
1472 struct au0828_dev *dev = fh->dev;
1474 if (freq->tuner != 0)
1476 if (freq->type != V4L2_TUNER_ANALOG_TV)
1479 dev->ctrl_freq = freq->frequency;
1481 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1483 au0828_analog_stream_reset(dev);
1489 /* RAW VBI ioctls */
1491 static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1492 struct v4l2_format *format)
1494 struct au0828_fh *fh = priv;
1495 struct au0828_dev *dev = fh->dev;
1497 format->fmt.vbi.samples_per_line = dev->vbi_width;
1498 format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1499 format->fmt.vbi.offset = 0;
1500 format->fmt.vbi.flags = 0;
1501 format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1503 format->fmt.vbi.count[0] = dev->vbi_height;
1504 format->fmt.vbi.count[1] = dev->vbi_height;
1505 format->fmt.vbi.start[0] = 21;
1506 format->fmt.vbi.start[1] = 284;
1511 static int vidioc_g_chip_ident(struct file *file, void *priv,
1512 struct v4l2_dbg_chip_ident *chip)
1514 struct au0828_fh *fh = priv;
1515 struct au0828_dev *dev = fh->dev;
1516 chip->ident = V4L2_IDENT_NONE;
1519 if (v4l2_chip_match_host(&chip->match)) {
1520 chip->ident = V4L2_IDENT_AU0828;
1524 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1525 if (chip->ident == V4L2_IDENT_NONE)
1531 static int vidioc_cropcap(struct file *file, void *priv,
1532 struct v4l2_cropcap *cc)
1534 struct au0828_fh *fh = priv;
1535 struct au0828_dev *dev = fh->dev;
1537 if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1540 cc->bounds.left = 0;
1542 cc->bounds.width = dev->width;
1543 cc->bounds.height = dev->height;
1545 cc->defrect = cc->bounds;
1547 cc->pixelaspect.numerator = 54;
1548 cc->pixelaspect.denominator = 59;
1553 static int vidioc_streamon(struct file *file, void *priv,
1554 enum v4l2_buf_type type)
1556 struct au0828_fh *fh = priv;
1557 struct au0828_dev *dev = fh->dev;
1560 rc = check_dev(dev);
1564 if (unlikely(type != fh->type))
1567 dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1568 fh, type, fh->resources, dev->resources);
1570 if (unlikely(!res_get(fh, get_ressource(fh))))
1573 if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1574 au0828_analog_stream_enable(dev);
1575 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1578 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1579 rc = videobuf_streamon(&fh->vb_vidq);
1580 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1581 rc = videobuf_streamon(&fh->vb_vbiq);
1586 static int vidioc_streamoff(struct file *file, void *priv,
1587 enum v4l2_buf_type type)
1589 struct au0828_fh *fh = priv;
1590 struct au0828_dev *dev = fh->dev;
1594 rc = check_dev(dev);
1598 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1599 fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1601 if (type != fh->type)
1604 dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1605 fh, type, fh->resources, dev->resources);
1607 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1608 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1609 rc = au0828_stream_interrupt(dev);
1613 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1614 if (AUVI_INPUT(i).audio_setup == NULL)
1616 (AUVI_INPUT(i).audio_setup)(dev, 0);
1619 videobuf_streamoff(&fh->vb_vidq);
1620 res_free(fh, AU0828_RESOURCE_VIDEO);
1621 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1622 videobuf_streamoff(&fh->vb_vbiq);
1623 res_free(fh, AU0828_RESOURCE_VBI);
1629 #ifdef CONFIG_VIDEO_ADV_DEBUG
1630 static int vidioc_g_register(struct file *file, void *priv,
1631 struct v4l2_dbg_register *reg)
1633 struct au0828_fh *fh = priv;
1634 struct au0828_dev *dev = fh->dev;
1636 switch (reg->match.type) {
1637 case V4L2_CHIP_MATCH_I2C_DRIVER:
1638 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1645 static int vidioc_s_register(struct file *file, void *priv,
1646 struct v4l2_dbg_register *reg)
1648 struct au0828_fh *fh = priv;
1649 struct au0828_dev *dev = fh->dev;
1651 switch (reg->match.type) {
1652 case V4L2_CHIP_MATCH_I2C_DRIVER:
1653 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1662 static int vidioc_reqbufs(struct file *file, void *priv,
1663 struct v4l2_requestbuffers *rb)
1665 struct au0828_fh *fh = priv;
1666 struct au0828_dev *dev = fh->dev;
1669 rc = check_dev(dev);
1673 return videobuf_reqbufs(&fh->vb_vidq, rb);
1676 static int vidioc_querybuf(struct file *file, void *priv,
1677 struct v4l2_buffer *b)
1679 struct au0828_fh *fh = priv;
1680 struct au0828_dev *dev = fh->dev;
1683 rc = check_dev(dev);
1687 return videobuf_querybuf(&fh->vb_vidq, b);
1690 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1692 struct au0828_fh *fh = priv;
1693 struct au0828_dev *dev = fh->dev;
1696 rc = check_dev(dev);
1700 return videobuf_qbuf(&fh->vb_vidq, b);
1703 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1705 struct au0828_fh *fh = priv;
1706 struct au0828_dev *dev = fh->dev;
1709 rc = check_dev(dev);
1713 /* Workaround for a bug in the au0828 hardware design that sometimes
1714 results in the colorspace being inverted */
1715 if (dev->greenscreen_detected == 1) {
1716 dprintk(1, "Detected green frame. Resetting stream...\n");
1717 au0828_analog_stream_reset(dev);
1718 dev->greenscreen_detected = 0;
1721 return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1724 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1725 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1727 struct au0828_fh *fh = priv;
1729 return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1733 static struct v4l2_file_operations au0828_v4l_fops = {
1734 .owner = THIS_MODULE,
1735 .open = au0828_v4l2_open,
1736 .release = au0828_v4l2_close,
1737 .read = au0828_v4l2_read,
1738 .poll = au0828_v4l2_poll,
1739 .mmap = au0828_v4l2_mmap,
1740 .ioctl = video_ioctl2,
1743 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1744 .vidioc_querycap = vidioc_querycap,
1745 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1746 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1747 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1748 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1749 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1750 .vidioc_s_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1751 .vidioc_g_audio = vidioc_g_audio,
1752 .vidioc_s_audio = vidioc_s_audio,
1753 .vidioc_cropcap = vidioc_cropcap,
1754 .vidioc_reqbufs = vidioc_reqbufs,
1755 .vidioc_querybuf = vidioc_querybuf,
1756 .vidioc_qbuf = vidioc_qbuf,
1757 .vidioc_dqbuf = vidioc_dqbuf,
1758 .vidioc_s_std = vidioc_s_std,
1759 .vidioc_enum_input = vidioc_enum_input,
1760 .vidioc_g_input = vidioc_g_input,
1761 .vidioc_s_input = vidioc_s_input,
1762 .vidioc_queryctrl = vidioc_queryctrl,
1763 .vidioc_g_ctrl = vidioc_g_ctrl,
1764 .vidioc_s_ctrl = vidioc_s_ctrl,
1765 .vidioc_streamon = vidioc_streamon,
1766 .vidioc_streamoff = vidioc_streamoff,
1767 .vidioc_g_tuner = vidioc_g_tuner,
1768 .vidioc_s_tuner = vidioc_s_tuner,
1769 .vidioc_g_frequency = vidioc_g_frequency,
1770 .vidioc_s_frequency = vidioc_s_frequency,
1771 #ifdef CONFIG_VIDEO_ADV_DEBUG
1772 .vidioc_g_register = vidioc_g_register,
1773 .vidioc_s_register = vidioc_s_register,
1775 .vidioc_g_chip_ident = vidioc_g_chip_ident,
1776 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1777 .vidiocgmbuf = vidiocgmbuf,
1781 static const struct video_device au0828_video_template = {
1782 .fops = &au0828_v4l_fops,
1783 .release = video_device_release,
1784 .ioctl_ops = &video_ioctl_ops,
1785 .tvnorms = V4L2_STD_NTSC_M,
1786 .current_norm = V4L2_STD_NTSC_M,
1789 /**************************************************************************/
1791 int au0828_analog_register(struct au0828_dev *dev,
1792 struct usb_interface *interface)
1794 int retval = -ENOMEM;
1795 struct usb_host_interface *iface_desc;
1796 struct usb_endpoint_descriptor *endpoint;
1799 dprintk(1, "au0828_analog_register called!\n");
1801 /* set au0828 usb interface0 to as5 */
1802 retval = usb_set_interface(dev->usbdev,
1803 interface->cur_altsetting->desc.bInterfaceNumber, 5);
1805 printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1809 /* Figure out which endpoint has the isoc interface */
1810 iface_desc = interface->cur_altsetting;
1811 for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1812 endpoint = &iface_desc->endpoint[i].desc;
1813 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1815 ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1816 == USB_ENDPOINT_XFER_ISOC)) {
1818 /* we find our isoc in endpoint */
1819 u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1820 dev->max_pkt_size = (tmp & 0x07ff) *
1821 (((tmp & 0x1800) >> 11) + 1);
1822 dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1825 if (!(dev->isoc_in_endpointaddr)) {
1826 printk(KERN_INFO "Could not locate isoc endpoint\n");
1831 init_waitqueue_head(&dev->open);
1832 spin_lock_init(&dev->slock);
1833 mutex_init(&dev->lock);
1835 /* init video dma queues */
1836 INIT_LIST_HEAD(&dev->vidq.active);
1837 INIT_LIST_HEAD(&dev->vidq.queued);
1838 INIT_LIST_HEAD(&dev->vbiq.active);
1839 INIT_LIST_HEAD(&dev->vbiq.queued);
1841 dev->width = NTSC_STD_W;
1842 dev->height = NTSC_STD_H;
1843 dev->field_size = dev->width * dev->height;
1844 dev->frame_size = dev->field_size << 1;
1845 dev->bytesperline = dev->width << 1;
1846 dev->ctrl_ainput = 0;
1848 /* allocate and fill v4l2 video struct */
1849 dev->vdev = video_device_alloc();
1850 if (NULL == dev->vdev) {
1851 dprintk(1, "Can't allocate video_device.\n");
1855 /* allocate the VBI struct */
1856 dev->vbi_dev = video_device_alloc();
1857 if (NULL == dev->vbi_dev) {
1858 dprintk(1, "Can't allocate vbi_device.\n");
1863 /* Fill the video capture device struct */
1864 *dev->vdev = au0828_video_template;
1865 dev->vdev->parent = &dev->usbdev->dev;
1866 strcpy(dev->vdev->name, "au0828a video");
1868 /* Setup the VBI device */
1869 *dev->vbi_dev = au0828_video_template;
1870 dev->vbi_dev->parent = &dev->usbdev->dev;
1871 strcpy(dev->vbi_dev->name, "au0828a vbi");
1873 /* Register the v4l2 device */
1874 video_set_drvdata(dev->vdev, dev);
1875 retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
1877 dprintk(1, "unable to register video device (error = %d).\n",
1879 video_device_release(dev->vdev);
1883 /* Register the vbi device */
1884 video_set_drvdata(dev->vbi_dev, dev);
1885 retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
1887 dprintk(1, "unable to register vbi device (error = %d).\n",
1889 video_device_release(dev->vbi_dev);
1890 video_device_release(dev->vdev);
1894 dprintk(1, "%s completed!\n", __func__);