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;
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 bytesperline = dev->vbi_width;
469 if (dma_q->pos + len > buf->vb.size)
470 len = buf->vb.size - dma_q->pos;
473 startwrite = outp + (dma_q->pos / 2);
475 /* Make sure the bottom field populates the second half of the frame */
476 if (buf->top_field == 0)
477 startwrite += bytesperline * dev->vbi_height;
479 for (i = 0; i < len; i += 2)
480 startwrite[j++] = startread[i+1];
487 * video-buf generic routine to get the next available VBI buffer
489 static inline void vbi_get_next_buf(struct au0828_dmaqueue *dma_q,
490 struct au0828_buffer **buf)
492 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vbiq);
495 if (list_empty(&dma_q->active)) {
496 au0828_isocdbg("No active queue to serve\n");
497 dev->isoc_ctl.vbi_buf = NULL;
502 /* Get the next buffer */
503 *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
504 /* Cleans up buffer - Usefull for testing for frame/URB loss */
505 outp = videobuf_to_vmalloc(&(*buf)->vb);
506 memset(outp, 0x00, (*buf)->vb.size);
508 dev->isoc_ctl.vbi_buf = *buf;
514 * Controls the isoc copy of each urb packet
516 static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb)
518 struct au0828_buffer *buf;
519 struct au0828_buffer *vbi_buf;
520 struct au0828_dmaqueue *dma_q = urb->context;
521 struct au0828_dmaqueue *vbi_dma_q = &dev->vbiq;
522 unsigned char *outp = NULL;
523 unsigned char *vbioutp = NULL;
524 int i, len = 0, rc = 1;
527 unsigned int vbi_field_size;
528 unsigned int remain, lencopy;
533 if ((dev->dev_state & DEV_DISCONNECTED) ||
534 (dev->dev_state & DEV_MISCONFIGURED))
537 if (urb->status < 0) {
538 print_err_status(dev, -1, urb->status);
539 if (urb->status == -ENOENT)
543 buf = dev->isoc_ctl.buf;
545 outp = videobuf_to_vmalloc(&buf->vb);
547 vbi_buf = dev->isoc_ctl.vbi_buf;
549 vbioutp = videobuf_to_vmalloc(&vbi_buf->vb);
551 for (i = 0; i < urb->number_of_packets; i++) {
552 int status = urb->iso_frame_desc[i].status;
555 print_err_status(dev, i, status);
556 if (urb->iso_frame_desc[i].status != -EPROTO)
560 if (urb->iso_frame_desc[i].actual_length <= 0)
563 if (urb->iso_frame_desc[i].actual_length >
565 au0828_isocdbg("packet bigger than packet size");
569 p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
571 len = urb->iso_frame_desc[i].actual_length - 4;
577 au0828_isocdbg("Video frame %s\n",
578 (fbyte & 0x40) ? "odd" : "even");
579 if (!(fbyte & 0x40)) {
582 vbi_buffer_filled(dev,
585 vbi_get_next_buf(vbi_dma_q, &vbi_buf);
589 vbioutp = videobuf_to_vmalloc(
594 buffer_filled(dev, dma_q, buf);
595 get_next_buf(dma_q, &buf);
599 outp = videobuf_to_vmalloc(&buf->vb);
609 if (vbi_buf != NULL) {
611 vbi_buf->top_field = 1;
613 vbi_buf->top_field = 0;
621 vbi_field_size = dev->vbi_width * dev->vbi_height * 2;
622 if (dev->vbi_read < vbi_field_size) {
623 remain = vbi_field_size - dev->vbi_read;
630 au0828_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
635 dev->vbi_read += lencopy;
638 if (dev->vbi_read >= vbi_field_size && buf != NULL)
639 au0828_copy_video(dev, dma_q, buf, p, outp, len);
645 buffer_setup(struct videobuf_queue *vq, unsigned int *count,
648 struct au0828_fh *fh = vq->priv_data;
649 *size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
652 *count = AU0828_DEF_BUF;
654 if (*count < AU0828_MIN_BUF)
655 *count = AU0828_MIN_BUF;
659 /* This is called *without* dev->slock held; please keep it that way */
660 static void free_buffer(struct videobuf_queue *vq, struct au0828_buffer *buf)
662 struct au0828_fh *fh = vq->priv_data;
663 struct au0828_dev *dev = fh->dev;
664 unsigned long flags = 0;
668 /* We used to wait for the buffer to finish here, but this didn't work
669 because, as we were keeping the state as VIDEOBUF_QUEUED,
670 videobuf_queue_cancel marked it as finished for us.
671 (Also, it could wedge forever if the hardware was misconfigured.)
673 This should be safe; by the time we get here, the buffer isn't
674 queued anymore. If we ever start marking the buffers as
675 VIDEOBUF_ACTIVE, it won't be, though.
677 spin_lock_irqsave(&dev->slock, flags);
678 if (dev->isoc_ctl.buf == buf)
679 dev->isoc_ctl.buf = NULL;
680 spin_unlock_irqrestore(&dev->slock, flags);
682 videobuf_vmalloc_free(&buf->vb);
683 buf->vb.state = VIDEOBUF_NEEDS_INIT;
687 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
688 enum v4l2_field field)
690 struct au0828_fh *fh = vq->priv_data;
691 struct au0828_buffer *buf = container_of(vb, struct au0828_buffer, vb);
692 struct au0828_dev *dev = fh->dev;
693 int rc = 0, urb_init = 0;
695 buf->vb.size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
697 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
700 buf->vb.width = dev->width;
701 buf->vb.height = dev->height;
702 buf->vb.field = field;
704 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
705 rc = videobuf_iolock(vq, &buf->vb, NULL);
707 printk(KERN_INFO "videobuf_iolock failed\n");
712 if (!dev->isoc_ctl.num_bufs)
716 rc = au0828_init_isoc(dev, AU0828_ISO_PACKETS_PER_URB,
717 AU0828_MAX_ISO_BUFS, dev->max_pkt_size,
720 printk(KERN_INFO "au0828_init_isoc failed\n");
725 buf->vb.state = VIDEOBUF_PREPARED;
729 free_buffer(vq, buf);
734 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
736 struct au0828_buffer *buf = container_of(vb,
737 struct au0828_buffer,
739 struct au0828_fh *fh = vq->priv_data;
740 struct au0828_dev *dev = fh->dev;
741 struct au0828_dmaqueue *vidq = &dev->vidq;
743 buf->vb.state = VIDEOBUF_QUEUED;
744 list_add_tail(&buf->vb.queue, &vidq->active);
747 static void buffer_release(struct videobuf_queue *vq,
748 struct videobuf_buffer *vb)
750 struct au0828_buffer *buf = container_of(vb,
751 struct au0828_buffer,
754 free_buffer(vq, buf);
757 static struct videobuf_queue_ops au0828_video_qops = {
758 .buf_setup = buffer_setup,
759 .buf_prepare = buffer_prepare,
760 .buf_queue = buffer_queue,
761 .buf_release = buffer_release,
764 /* ------------------------------------------------------------------
766 ------------------------------------------------------------------*/
768 static int au0828_i2s_init(struct au0828_dev *dev)
770 /* Enable i2s mode */
771 au0828_writereg(dev, AU0828_AUDIOCTRL_50C, 0x01);
776 * Auvitek au0828 analog stream enable
777 * Please set interface0 to AS5 before enable the stream
779 int au0828_analog_stream_enable(struct au0828_dev *d)
781 dprintk(1, "au0828_analog_stream_enable called\n");
782 au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00);
783 au0828_writereg(d, 0x106, 0x00);
785 au0828_writereg(d, 0x110, 0x00);
786 au0828_writereg(d, 0x111, 0x00);
787 au0828_writereg(d, 0x114, 0xa0);
788 au0828_writereg(d, 0x115, 0x05);
790 au0828_writereg(d, 0x112, 0x00);
791 au0828_writereg(d, 0x113, 0x00);
792 au0828_writereg(d, 0x116, 0xf2);
793 au0828_writereg(d, 0x117, 0x00);
794 au0828_writereg(d, AU0828_SENSORCTRL_100, 0xb3);
799 int au0828_analog_stream_disable(struct au0828_dev *d)
801 dprintk(1, "au0828_analog_stream_disable called\n");
802 au0828_writereg(d, AU0828_SENSORCTRL_100, 0x0);
806 void au0828_analog_stream_reset(struct au0828_dev *dev)
808 dprintk(1, "au0828_analog_stream_reset called\n");
809 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0x0);
811 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0xb3);
815 * Some operations needs to stop current streaming
817 static int au0828_stream_interrupt(struct au0828_dev *dev)
821 dev->stream_state = STREAM_INTERRUPT;
822 if (dev->dev_state == DEV_DISCONNECTED)
825 dev->dev_state = DEV_MISCONFIGURED;
826 dprintk(1, "%s device is misconfigured!\n", __func__);
833 * au0828_release_resources
834 * unregister v4l2 devices
836 void au0828_analog_unregister(struct au0828_dev *dev)
838 dprintk(1, "au0828_release_resources called\n");
839 mutex_lock(&au0828_sysfs_lock);
842 video_unregister_device(dev->vdev);
844 video_unregister_device(dev->vbi_dev);
846 mutex_unlock(&au0828_sysfs_lock);
850 /* Usage lock check functions */
851 static int res_get(struct au0828_fh *fh, unsigned int bit)
853 struct au0828_dev *dev = fh->dev;
855 if (fh->resources & bit)
856 /* have it already allocated */
860 mutex_lock(&dev->lock);
861 if (dev->resources & bit) {
862 /* no, someone else uses it */
863 mutex_unlock(&dev->lock);
866 /* it's free, grab it */
867 fh->resources |= bit;
868 dev->resources |= bit;
869 dprintk(1, "res: get %d\n", bit);
870 mutex_unlock(&dev->lock);
874 static int res_check(struct au0828_fh *fh, unsigned int bit)
876 return fh->resources & bit;
879 static int res_locked(struct au0828_dev *dev, unsigned int bit)
881 return dev->resources & bit;
884 static void res_free(struct au0828_fh *fh, unsigned int bits)
886 struct au0828_dev *dev = fh->dev;
888 BUG_ON((fh->resources & bits) != bits);
890 mutex_lock(&dev->lock);
891 fh->resources &= ~bits;
892 dev->resources &= ~bits;
893 dprintk(1, "res: put %d\n", bits);
894 mutex_unlock(&dev->lock);
897 static int get_ressource(struct au0828_fh *fh)
900 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
901 return AU0828_RESOURCE_VIDEO;
902 case V4L2_BUF_TYPE_VBI_CAPTURE:
903 return AU0828_RESOURCE_VBI;
910 static int au0828_v4l2_open(struct file *filp)
913 struct video_device *vdev = video_devdata(filp);
914 struct au0828_dev *dev = video_drvdata(filp);
915 struct au0828_fh *fh;
918 switch (vdev->vfl_type) {
919 case VFL_TYPE_GRABBER:
920 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
923 type = V4L2_BUF_TYPE_VBI_CAPTURE;
929 fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
931 dprintk(1, "Failed allocate au0828_fh struct!\n");
937 filp->private_data = fh;
939 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
940 /* set au0828 interface0 to AS5 here again */
941 ret = usb_set_interface(dev->usbdev, 0, 5);
943 printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
946 dev->width = NTSC_STD_W;
947 dev->height = NTSC_STD_H;
948 dev->frame_size = dev->width * dev->height * 2;
949 dev->field_size = dev->width * dev->height;
950 dev->bytesperline = dev->width * 2;
952 au0828_analog_stream_enable(dev);
953 au0828_analog_stream_reset(dev);
955 /* If we were doing ac97 instead of i2s, it would go here...*/
956 au0828_i2s_init(dev);
958 dev->stream_state = STREAM_OFF;
959 dev->dev_state |= DEV_INITIALIZED;
964 videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
966 V4L2_BUF_TYPE_VIDEO_CAPTURE,
967 V4L2_FIELD_INTERLACED,
968 sizeof(struct au0828_buffer), fh, NULL);
971 dev->vbi_width = 720;
973 videobuf_queue_vmalloc_init(&fh->vb_vbiq, &au0828_vbi_qops,
975 V4L2_BUF_TYPE_VBI_CAPTURE,
977 sizeof(struct au0828_buffer), fh, NULL);
983 static int au0828_v4l2_close(struct file *filp)
986 struct au0828_fh *fh = filp->private_data;
987 struct au0828_dev *dev = fh->dev;
989 if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
990 videobuf_stop(&fh->vb_vidq);
991 res_free(fh, AU0828_RESOURCE_VIDEO);
994 if (res_check(fh, AU0828_RESOURCE_VBI)) {
995 videobuf_stop(&fh->vb_vbiq);
996 res_free(fh, AU0828_RESOURCE_VBI);
999 if (dev->users == 1) {
1000 if (dev->dev_state & DEV_DISCONNECTED) {
1001 au0828_analog_unregister(dev);
1006 au0828_analog_stream_disable(dev);
1008 au0828_uninit_isoc(dev);
1010 /* Save some power by putting tuner to sleep */
1011 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
1013 /* When close the device, set the usb intf0 into alt0 to free
1015 ret = usb_set_interface(dev->usbdev, 0, 0);
1017 printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
1020 videobuf_mmap_free(&fh->vb_vidq);
1021 videobuf_mmap_free(&fh->vb_vbiq);
1024 wake_up_interruptible_nr(&dev->open, 1);
1028 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
1029 size_t count, loff_t *pos)
1031 struct au0828_fh *fh = filp->private_data;
1032 struct au0828_dev *dev = fh->dev;
1035 rc = check_dev(dev);
1039 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1040 if (res_locked(dev, AU0828_RESOURCE_VIDEO))
1043 return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1044 filp->f_flags & O_NONBLOCK);
1047 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1048 if (!res_get(fh, AU0828_RESOURCE_VBI))
1051 return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
1052 filp->f_flags & O_NONBLOCK);
1058 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
1060 struct au0828_fh *fh = filp->private_data;
1061 struct au0828_dev *dev = fh->dev;
1064 rc = check_dev(dev);
1068 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1069 if (!res_get(fh, AU0828_RESOURCE_VIDEO))
1071 return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1072 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1073 if (!res_get(fh, AU0828_RESOURCE_VBI))
1075 return videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
1081 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
1083 struct au0828_fh *fh = filp->private_data;
1084 struct au0828_dev *dev = fh->dev;
1087 rc = check_dev(dev);
1091 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1092 rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1093 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1094 rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
1099 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
1100 struct v4l2_format *format)
1103 int width = format->fmt.pix.width;
1104 int height = format->fmt.pix.height;
1105 unsigned int maxwidth, maxheight;
1110 if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1113 /* If they are demanding a format other than the one we support,
1114 bail out (tvtime asks for UYVY and then retries with YUYV) */
1115 if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
1118 /* format->fmt.pix.width only support 720 and height 480 */
1124 format->fmt.pix.width = width;
1125 format->fmt.pix.height = height;
1126 format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1127 format->fmt.pix.bytesperline = width * 2;
1128 format->fmt.pix.sizeimage = width * height * 2;
1129 format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1130 format->fmt.pix.field = V4L2_FIELD_INTERLACED;
1132 if (cmd == VIDIOC_TRY_FMT)
1135 /* maybe set new image format, driver current only support 720*480 */
1137 dev->height = height;
1138 dev->frame_size = width * height * 2;
1139 dev->field_size = width * height;
1140 dev->bytesperline = width * 2;
1142 if (dev->stream_state == STREAM_ON) {
1143 dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
1144 ret = au0828_stream_interrupt(dev);
1146 dprintk(1, "error interrupting video stream!\n");
1151 /* set au0828 interface0 to AS5 here again */
1152 ret = usb_set_interface(dev->usbdev, 0, 5);
1154 printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
1158 au0828_analog_stream_enable(dev);
1164 static int vidioc_queryctrl(struct file *file, void *priv,
1165 struct v4l2_queryctrl *qc)
1167 struct au0828_fh *fh = priv;
1168 struct au0828_dev *dev = fh->dev;
1169 v4l2_device_call_all(&dev->v4l2_dev, 0, core, queryctrl, qc);
1176 static int vidioc_querycap(struct file *file, void *priv,
1177 struct v4l2_capability *cap)
1179 struct au0828_fh *fh = priv;
1180 struct au0828_dev *dev = fh->dev;
1182 strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1183 strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1184 strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
1186 cap->version = AU0828_VERSION_CODE;
1188 /*set the device capabilities */
1189 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1190 V4L2_CAP_VBI_CAPTURE |
1192 V4L2_CAP_READWRITE |
1193 V4L2_CAP_STREAMING |
1198 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1199 struct v4l2_fmtdesc *f)
1204 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1205 strcpy(f->description, "Packed YUV2");
1208 f->pixelformat = V4L2_PIX_FMT_UYVY;
1213 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1214 struct v4l2_format *f)
1216 struct au0828_fh *fh = priv;
1217 struct au0828_dev *dev = fh->dev;
1219 f->fmt.pix.width = dev->width;
1220 f->fmt.pix.height = dev->height;
1221 f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1222 f->fmt.pix.bytesperline = dev->bytesperline;
1223 f->fmt.pix.sizeimage = dev->frame_size;
1224 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1225 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1229 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1230 struct v4l2_format *f)
1232 struct au0828_fh *fh = priv;
1233 struct au0828_dev *dev = fh->dev;
1235 return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1238 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1239 struct v4l2_format *f)
1241 struct au0828_fh *fh = priv;
1242 struct au0828_dev *dev = fh->dev;
1245 rc = check_dev(dev);
1249 mutex_lock(&dev->lock);
1251 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1252 printk(KERN_INFO "%s queue busy\n", __func__);
1257 rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1259 mutex_unlock(&dev->lock);
1263 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1265 struct au0828_fh *fh = priv;
1266 struct au0828_dev *dev = fh->dev;
1268 /* FIXME: when we support something other than NTSC, we are going to
1269 have to make the au0828 bridge adjust the size of its capture
1270 buffer, which is currently hardcoded at 720x480 */
1272 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, *norm);
1276 static int vidioc_enum_input(struct file *file, void *priv,
1277 struct v4l2_input *input)
1279 struct au0828_fh *fh = priv;
1280 struct au0828_dev *dev = fh->dev;
1283 static const char *inames[] = {
1284 [AU0828_VMUX_UNDEFINED] = "Undefined",
1285 [AU0828_VMUX_COMPOSITE] = "Composite",
1286 [AU0828_VMUX_SVIDEO] = "S-Video",
1287 [AU0828_VMUX_CABLE] = "Cable TV",
1288 [AU0828_VMUX_TELEVISION] = "Television",
1289 [AU0828_VMUX_DVB] = "DVB",
1290 [AU0828_VMUX_DEBUG] = "tv debug"
1295 if (tmp >= AU0828_MAX_INPUT)
1297 if (AUVI_INPUT(tmp).type == 0)
1301 strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1302 if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1303 (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1304 input->type |= V4L2_INPUT_TYPE_TUNER;
1306 input->type |= V4L2_INPUT_TYPE_CAMERA;
1308 input->std = dev->vdev->tvnorms;
1313 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1315 struct au0828_fh *fh = priv;
1316 struct au0828_dev *dev = fh->dev;
1317 *i = dev->ctrl_input;
1321 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1323 struct au0828_fh *fh = priv;
1324 struct au0828_dev *dev = fh->dev;
1327 dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1329 if (index >= AU0828_MAX_INPUT)
1331 if (AUVI_INPUT(index).type == 0)
1333 dev->ctrl_input = index;
1335 switch (AUVI_INPUT(index).type) {
1336 case AU0828_VMUX_SVIDEO:
1337 dev->input_type = AU0828_VMUX_SVIDEO;
1339 case AU0828_VMUX_COMPOSITE:
1340 dev->input_type = AU0828_VMUX_COMPOSITE;
1342 case AU0828_VMUX_TELEVISION:
1343 dev->input_type = AU0828_VMUX_TELEVISION;
1346 dprintk(1, "VIDIOC_S_INPUT unknown input type set [%d]\n",
1347 AUVI_INPUT(index).type);
1351 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1352 AUVI_INPUT(index).vmux, 0, 0);
1354 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1356 if (AUVI_INPUT(i).audio_setup == NULL)
1364 (AUVI_INPUT(i).audio_setup)(dev, enable);
1366 /* Make sure we leave it turned on if some
1367 other input is routed to this callback */
1368 if ((AUVI_INPUT(i).audio_setup) !=
1369 ((AUVI_INPUT(index).audio_setup))) {
1370 (AUVI_INPUT(i).audio_setup)(dev, enable);
1375 v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1376 AUVI_INPUT(index).amux, 0, 0);
1380 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1382 struct au0828_fh *fh = priv;
1383 struct au0828_dev *dev = fh->dev;
1384 unsigned int index = a->index;
1389 index = dev->ctrl_ainput;
1391 strcpy(a->name, "Television");
1393 strcpy(a->name, "Line in");
1395 a->capability = V4L2_AUDCAP_STEREO;
1400 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1402 struct au0828_fh *fh = priv;
1403 struct au0828_dev *dev = fh->dev;
1404 if (a->index != dev->ctrl_ainput)
1409 static int vidioc_g_ctrl(struct file *file, void *priv,
1410 struct v4l2_control *ctrl)
1412 struct au0828_fh *fh = priv;
1413 struct au0828_dev *dev = fh->dev;
1415 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_ctrl, ctrl);
1420 static int vidioc_s_ctrl(struct file *file, void *priv,
1421 struct v4l2_control *ctrl)
1423 struct au0828_fh *fh = priv;
1424 struct au0828_dev *dev = fh->dev;
1425 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_ctrl, ctrl);
1429 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1431 struct au0828_fh *fh = priv;
1432 struct au0828_dev *dev = fh->dev;
1437 strcpy(t->name, "Auvitek tuner");
1438 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1442 static int vidioc_s_tuner(struct file *file, void *priv,
1443 struct v4l2_tuner *t)
1445 struct au0828_fh *fh = priv;
1446 struct au0828_dev *dev = fh->dev;
1451 t->type = V4L2_TUNER_ANALOG_TV;
1452 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1453 dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1459 static int vidioc_g_frequency(struct file *file, void *priv,
1460 struct v4l2_frequency *freq)
1462 struct au0828_fh *fh = priv;
1463 struct au0828_dev *dev = fh->dev;
1465 freq->type = V4L2_TUNER_ANALOG_TV;
1466 freq->frequency = dev->ctrl_freq;
1470 static int vidioc_s_frequency(struct file *file, void *priv,
1471 struct v4l2_frequency *freq)
1473 struct au0828_fh *fh = priv;
1474 struct au0828_dev *dev = fh->dev;
1476 if (freq->tuner != 0)
1478 if (freq->type != V4L2_TUNER_ANALOG_TV)
1481 dev->ctrl_freq = freq->frequency;
1483 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1485 au0828_analog_stream_reset(dev);
1491 /* RAW VBI ioctls */
1493 static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1494 struct v4l2_format *format)
1496 struct au0828_fh *fh = priv;
1497 struct au0828_dev *dev = fh->dev;
1499 format->fmt.vbi.samples_per_line = dev->vbi_width;
1500 format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1501 format->fmt.vbi.offset = 0;
1502 format->fmt.vbi.flags = 0;
1503 format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1505 format->fmt.vbi.count[0] = dev->vbi_height;
1506 format->fmt.vbi.count[1] = dev->vbi_height;
1507 format->fmt.vbi.start[0] = 21;
1508 format->fmt.vbi.start[1] = 284;
1513 static int vidioc_g_chip_ident(struct file *file, void *priv,
1514 struct v4l2_dbg_chip_ident *chip)
1516 struct au0828_fh *fh = priv;
1517 struct au0828_dev *dev = fh->dev;
1518 chip->ident = V4L2_IDENT_NONE;
1521 if (v4l2_chip_match_host(&chip->match)) {
1522 chip->ident = V4L2_IDENT_AU0828;
1526 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_chip_ident, chip);
1527 if (chip->ident == V4L2_IDENT_NONE)
1533 static int vidioc_cropcap(struct file *file, void *priv,
1534 struct v4l2_cropcap *cc)
1536 struct au0828_fh *fh = priv;
1537 struct au0828_dev *dev = fh->dev;
1539 if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1542 cc->bounds.left = 0;
1544 cc->bounds.width = dev->width;
1545 cc->bounds.height = dev->height;
1547 cc->defrect = cc->bounds;
1549 cc->pixelaspect.numerator = 54;
1550 cc->pixelaspect.denominator = 59;
1555 static int vidioc_streamon(struct file *file, void *priv,
1556 enum v4l2_buf_type type)
1558 struct au0828_fh *fh = priv;
1559 struct au0828_dev *dev = fh->dev;
1562 rc = check_dev(dev);
1566 if (unlikely(type != fh->type))
1569 dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1570 fh, type, fh->resources, dev->resources);
1572 if (unlikely(!res_get(fh, get_ressource(fh))))
1575 if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1576 au0828_analog_stream_enable(dev);
1577 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1580 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1581 rc = videobuf_streamon(&fh->vb_vidq);
1582 else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1583 rc = videobuf_streamon(&fh->vb_vbiq);
1588 static int vidioc_streamoff(struct file *file, void *priv,
1589 enum v4l2_buf_type type)
1591 struct au0828_fh *fh = priv;
1592 struct au0828_dev *dev = fh->dev;
1596 rc = check_dev(dev);
1600 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1601 fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1603 if (type != fh->type)
1606 dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1607 fh, type, fh->resources, dev->resources);
1609 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1610 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1611 rc = au0828_stream_interrupt(dev);
1615 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1616 if (AUVI_INPUT(i).audio_setup == NULL)
1618 (AUVI_INPUT(i).audio_setup)(dev, 0);
1621 videobuf_streamoff(&fh->vb_vidq);
1622 res_free(fh, AU0828_RESOURCE_VIDEO);
1623 } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1624 videobuf_streamoff(&fh->vb_vbiq);
1625 res_free(fh, AU0828_RESOURCE_VBI);
1631 #ifdef CONFIG_VIDEO_ADV_DEBUG
1632 static int vidioc_g_register(struct file *file, void *priv,
1633 struct v4l2_dbg_register *reg)
1635 struct au0828_fh *fh = priv;
1636 struct au0828_dev *dev = fh->dev;
1638 switch (reg->match.type) {
1639 case V4L2_CHIP_MATCH_I2C_DRIVER:
1640 v4l2_device_call_all(&dev->v4l2_dev, 0, core, g_register, reg);
1647 static int vidioc_s_register(struct file *file, void *priv,
1648 struct v4l2_dbg_register *reg)
1650 struct au0828_fh *fh = priv;
1651 struct au0828_dev *dev = fh->dev;
1653 switch (reg->match.type) {
1654 case V4L2_CHIP_MATCH_I2C_DRIVER:
1655 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_register, reg);
1664 static int vidioc_reqbufs(struct file *file, void *priv,
1665 struct v4l2_requestbuffers *rb)
1667 struct au0828_fh *fh = priv;
1668 struct au0828_dev *dev = fh->dev;
1671 rc = check_dev(dev);
1675 return videobuf_reqbufs(&fh->vb_vidq, rb);
1678 static int vidioc_querybuf(struct file *file, void *priv,
1679 struct v4l2_buffer *b)
1681 struct au0828_fh *fh = priv;
1682 struct au0828_dev *dev = fh->dev;
1685 rc = check_dev(dev);
1689 return videobuf_querybuf(&fh->vb_vidq, b);
1692 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1694 struct au0828_fh *fh = priv;
1695 struct au0828_dev *dev = fh->dev;
1698 rc = check_dev(dev);
1702 return videobuf_qbuf(&fh->vb_vidq, b);
1705 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1707 struct au0828_fh *fh = priv;
1708 struct au0828_dev *dev = fh->dev;
1711 rc = check_dev(dev);
1715 /* Workaround for a bug in the au0828 hardware design that sometimes
1716 results in the colorspace being inverted */
1717 if (dev->greenscreen_detected == 1) {
1718 dprintk(1, "Detected green frame. Resetting stream...\n");
1719 au0828_analog_stream_reset(dev);
1720 dev->greenscreen_detected = 0;
1723 return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1726 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1727 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1729 struct au0828_fh *fh = priv;
1731 return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1735 static struct v4l2_file_operations au0828_v4l_fops = {
1736 .owner = THIS_MODULE,
1737 .open = au0828_v4l2_open,
1738 .release = au0828_v4l2_close,
1739 .read = au0828_v4l2_read,
1740 .poll = au0828_v4l2_poll,
1741 .mmap = au0828_v4l2_mmap,
1742 .ioctl = video_ioctl2,
1745 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1746 .vidioc_querycap = vidioc_querycap,
1747 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1748 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1749 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1750 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1751 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1752 .vidioc_s_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1753 .vidioc_g_audio = vidioc_g_audio,
1754 .vidioc_s_audio = vidioc_s_audio,
1755 .vidioc_cropcap = vidioc_cropcap,
1756 .vidioc_reqbufs = vidioc_reqbufs,
1757 .vidioc_querybuf = vidioc_querybuf,
1758 .vidioc_qbuf = vidioc_qbuf,
1759 .vidioc_dqbuf = vidioc_dqbuf,
1760 .vidioc_s_std = vidioc_s_std,
1761 .vidioc_enum_input = vidioc_enum_input,
1762 .vidioc_g_input = vidioc_g_input,
1763 .vidioc_s_input = vidioc_s_input,
1764 .vidioc_queryctrl = vidioc_queryctrl,
1765 .vidioc_g_ctrl = vidioc_g_ctrl,
1766 .vidioc_s_ctrl = vidioc_s_ctrl,
1767 .vidioc_streamon = vidioc_streamon,
1768 .vidioc_streamoff = vidioc_streamoff,
1769 .vidioc_g_tuner = vidioc_g_tuner,
1770 .vidioc_s_tuner = vidioc_s_tuner,
1771 .vidioc_g_frequency = vidioc_g_frequency,
1772 .vidioc_s_frequency = vidioc_s_frequency,
1773 #ifdef CONFIG_VIDEO_ADV_DEBUG
1774 .vidioc_g_register = vidioc_g_register,
1775 .vidioc_s_register = vidioc_s_register,
1777 .vidioc_g_chip_ident = vidioc_g_chip_ident,
1778 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1779 .vidiocgmbuf = vidiocgmbuf,
1783 static const struct video_device au0828_video_template = {
1784 .fops = &au0828_v4l_fops,
1785 .release = video_device_release,
1786 .ioctl_ops = &video_ioctl_ops,
1787 .tvnorms = V4L2_STD_NTSC_M,
1788 .current_norm = V4L2_STD_NTSC_M,
1791 /**************************************************************************/
1793 int au0828_analog_register(struct au0828_dev *dev,
1794 struct usb_interface *interface)
1796 int retval = -ENOMEM;
1797 struct usb_host_interface *iface_desc;
1798 struct usb_endpoint_descriptor *endpoint;
1801 dprintk(1, "au0828_analog_register called!\n");
1803 /* set au0828 usb interface0 to as5 */
1804 retval = usb_set_interface(dev->usbdev,
1805 interface->cur_altsetting->desc.bInterfaceNumber, 5);
1807 printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1811 /* Figure out which endpoint has the isoc interface */
1812 iface_desc = interface->cur_altsetting;
1813 for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1814 endpoint = &iface_desc->endpoint[i].desc;
1815 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1817 ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1818 == USB_ENDPOINT_XFER_ISOC)) {
1820 /* we find our isoc in endpoint */
1821 u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1822 dev->max_pkt_size = (tmp & 0x07ff) *
1823 (((tmp & 0x1800) >> 11) + 1);
1824 dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1827 if (!(dev->isoc_in_endpointaddr)) {
1828 printk(KERN_INFO "Could not locate isoc endpoint\n");
1833 init_waitqueue_head(&dev->open);
1834 spin_lock_init(&dev->slock);
1835 mutex_init(&dev->lock);
1837 /* init video dma queues */
1838 INIT_LIST_HEAD(&dev->vidq.active);
1839 INIT_LIST_HEAD(&dev->vidq.queued);
1840 INIT_LIST_HEAD(&dev->vbiq.active);
1841 INIT_LIST_HEAD(&dev->vbiq.queued);
1843 dev->width = NTSC_STD_W;
1844 dev->height = NTSC_STD_H;
1845 dev->field_size = dev->width * dev->height;
1846 dev->frame_size = dev->field_size << 1;
1847 dev->bytesperline = dev->width << 1;
1848 dev->ctrl_ainput = 0;
1850 /* allocate and fill v4l2 video struct */
1851 dev->vdev = video_device_alloc();
1852 if (NULL == dev->vdev) {
1853 dprintk(1, "Can't allocate video_device.\n");
1857 /* allocate the VBI struct */
1858 dev->vbi_dev = video_device_alloc();
1859 if (NULL == dev->vbi_dev) {
1860 dprintk(1, "Can't allocate vbi_device.\n");
1865 /* Fill the video capture device struct */
1866 *dev->vdev = au0828_video_template;
1867 dev->vdev->parent = &dev->usbdev->dev;
1868 strcpy(dev->vdev->name, "au0828a video");
1870 /* Setup the VBI device */
1871 *dev->vbi_dev = au0828_video_template;
1872 dev->vbi_dev->parent = &dev->usbdev->dev;
1873 strcpy(dev->vbi_dev->name, "au0828a vbi");
1875 /* Register the v4l2 device */
1876 video_set_drvdata(dev->vdev, dev);
1877 retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
1879 dprintk(1, "unable to register video device (error = %d).\n",
1881 video_device_release(dev->vdev);
1885 /* Register the vbi device */
1886 video_set_drvdata(dev->vbi_dev, dev);
1887 retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
1889 dprintk(1, "unable to register vbi device (error = %d).\n",
1891 video_device_release(dev->vbi_dev);
1892 video_device_release(dev->vdev);
1896 dprintk(1, "%s completed!\n", __func__);