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/init.h>
33 #include <linux/device.h>
34 #include <linux/suspend.h>
35 #include <linux/version.h>
36 #include <linux/videodev.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 LIST_HEAD(au0828_devlist);
45 static DEFINE_MUTEX(au0828_sysfs_lock);
47 #define AU0828_VERSION_CODE KERNEL_VERSION(0, 0, 1)
49 /* Forward declarations */
50 void au0828_analog_stream_reset(struct au0828_dev *dev);
52 /* ------------------------------------------------------------------
54 ------------------------------------------------------------------*/
56 static unsigned int isoc_debug;
57 module_param(isoc_debug, int, 0644);
58 MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
60 #define au0828_isocdbg(fmt, arg...) \
63 printk(KERN_INFO "au0828 %s :"fmt, \
68 static inline void print_err_status(struct au0828_dev *dev,
69 int packet, int status)
71 char *errmsg = "Unknown";
75 errmsg = "unlinked synchronuously";
78 errmsg = "unlinked asynchronuously";
81 errmsg = "Buffer error (overrun)";
84 errmsg = "Stalled (device not responding)";
87 errmsg = "Babble (bad cable?)";
90 errmsg = "Bit-stuff error (bad cable?)";
93 errmsg = "CRC/Timeout (could be anything)";
96 errmsg = "Device does not respond";
100 au0828_isocdbg("URB status %d [%s].\n", status, errmsg);
102 au0828_isocdbg("URB packet %d, status %d [%s].\n",
103 packet, status, errmsg);
107 static int check_dev(struct au0828_dev *dev)
109 if (dev->dev_state & DEV_DISCONNECTED) {
110 printk("v4l2 ioctl: device not present\n");
114 if (dev->dev_state & DEV_MISCONFIGURED) {
115 printk("v4l2 ioctl: device is misconfigured; "
116 "close and open it again\n");
123 * IRQ callback, called by URB callback
125 static void au0828_irq_callback(struct urb *urb)
127 struct au0828_dmaqueue *dma_q = urb->context;
128 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
131 switch (urb->status) {
132 case 0: /* success */
133 case -ETIMEDOUT: /* NAK */
135 case -ECONNRESET: /* kill */
138 au0828_isocdbg("au0828_irq_callback called: status kill\n");
140 default: /* unknown error */
141 au0828_isocdbg("urb completition error %d.\n", urb->status);
145 /* Copy data from URB */
146 spin_lock(&dev->slock);
147 rc = dev->isoc_ctl.isoc_copy(dev, urb);
148 spin_unlock(&dev->slock);
150 /* Reset urb buffers */
151 for (i = 0; i < urb->number_of_packets; i++) {
152 urb->iso_frame_desc[i].status = 0;
153 urb->iso_frame_desc[i].actual_length = 0;
157 urb->status = usb_submit_urb(urb, GFP_ATOMIC);
159 au0828_isocdbg("urb resubmit failed (error=%i)\n",
165 * Stop and Deallocate URBs
167 void au0828_uninit_isoc(struct au0828_dev *dev)
172 au0828_isocdbg("au0828: called au0828_uninit_isoc\n");
174 dev->isoc_ctl.nfields = -1;
175 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
176 urb = dev->isoc_ctl.urb[i];
178 if (!irqs_disabled())
183 if (dev->isoc_ctl.transfer_buffer[i]) {
184 usb_buffer_free(dev->usbdev,
185 urb->transfer_buffer_length,
186 dev->isoc_ctl.transfer_buffer[i],
190 dev->isoc_ctl.urb[i] = NULL;
192 dev->isoc_ctl.transfer_buffer[i] = NULL;
195 kfree(dev->isoc_ctl.urb);
196 kfree(dev->isoc_ctl.transfer_buffer);
198 dev->isoc_ctl.urb = NULL;
199 dev->isoc_ctl.transfer_buffer = NULL;
200 dev->isoc_ctl.num_bufs = 0;
204 * Allocate URBs and start IRQ
206 int au0828_init_isoc(struct au0828_dev *dev, int max_packets,
207 int num_bufs, int max_pkt_size,
208 int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb))
210 struct au0828_dmaqueue *dma_q = &dev->vidq;
217 au0828_isocdbg("au0828: called au0828_prepare_isoc\n");
219 /* De-allocates all pending stuff */
220 au0828_uninit_isoc(dev);
222 dev->isoc_ctl.isoc_copy = isoc_copy;
223 dev->isoc_ctl.num_bufs = num_bufs;
225 dev->isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
226 if (!dev->isoc_ctl.urb) {
227 au0828_isocdbg("cannot alloc memory for usb buffers\n");
231 dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
233 if (!dev->isoc_ctl.transfer_buffer) {
234 au0828_isocdbg("cannot allocate memory for usb transfer\n");
235 kfree(dev->isoc_ctl.urb);
239 dev->isoc_ctl.max_pkt_size = max_pkt_size;
240 dev->isoc_ctl.buf = NULL;
242 sb_size = max_packets * dev->isoc_ctl.max_pkt_size;
244 /* allocate urbs and transfer buffers */
245 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
246 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
248 au0828_isocdbg("cannot alloc isoc_ctl.urb %i\n", i);
249 au0828_uninit_isoc(dev);
252 dev->isoc_ctl.urb[i] = urb;
254 dev->isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->usbdev,
255 sb_size, GFP_KERNEL, &urb->transfer_dma);
256 if (!dev->isoc_ctl.transfer_buffer[i]) {
257 printk("unable to allocate %i bytes for transfer"
260 in_interrupt() ? " while in int" : "");
261 au0828_uninit_isoc(dev);
264 memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
266 pipe = usb_rcvisocpipe(dev->usbdev,
267 dev->isoc_in_endpointaddr),
269 usb_fill_int_urb(urb, dev->usbdev, pipe,
270 dev->isoc_ctl.transfer_buffer[i], sb_size,
271 au0828_irq_callback, dma_q, 1);
273 urb->number_of_packets = max_packets;
274 urb->transfer_flags = URB_ISO_ASAP;
277 for (j = 0; j < max_packets; j++) {
278 urb->iso_frame_desc[j].offset = k;
279 urb->iso_frame_desc[j].length =
280 dev->isoc_ctl.max_pkt_size;
281 k += dev->isoc_ctl.max_pkt_size;
285 init_waitqueue_head(&dma_q->wq);
287 /* submit urbs and enables IRQ */
288 for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
289 rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
291 au0828_isocdbg("submit of urb %i failed (error=%i)\n",
293 au0828_uninit_isoc(dev);
302 * Announces that a buffer were filled and request the next
304 static inline void buffer_filled(struct au0828_dev *dev,
305 struct au0828_dmaqueue *dma_q,
306 struct au0828_buffer *buf)
308 /* Advice that buffer was filled */
309 au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
311 buf->vb.state = VIDEOBUF_DONE;
312 buf->vb.field_count++;
313 do_gettimeofday(&buf->vb.ts);
315 dev->isoc_ctl.buf = NULL;
317 list_del(&buf->vb.queue);
318 wake_up(&buf->vb.done);
322 * Identify the buffer header type and properly handles
324 static void au0828_copy_video(struct au0828_dev *dev,
325 struct au0828_dmaqueue *dma_q,
326 struct au0828_buffer *buf,
328 unsigned char *outp, unsigned long len)
330 void *fieldstart, *startwrite, *startread;
331 int linesdone, currlinedone, offset, lencopy, remain;
332 int bytesperline = dev->width << 1; /* Assumes 16-bit depth @@@@ */
334 if (dma_q->pos + len > buf->vb.size)
335 len = buf->vb.size - dma_q->pos;
340 /* Interlaces frame */
344 fieldstart = outp + bytesperline;
346 linesdone = dma_q->pos / bytesperline;
347 currlinedone = dma_q->pos % bytesperline;
348 offset = linesdone * bytesperline * 2 + currlinedone;
349 startwrite = fieldstart + offset;
350 lencopy = bytesperline - currlinedone;
351 lencopy = lencopy > remain ? remain : lencopy;
353 if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
354 au0828_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
355 ((char *)startwrite + lencopy) -
356 ((char *)outp + buf->vb.size));
357 remain = (char *)outp + buf->vb.size - (char *)startwrite;
362 memcpy(startwrite, startread, lencopy);
367 startwrite += lencopy + bytesperline;
368 startread += lencopy;
369 if (bytesperline > remain)
372 lencopy = bytesperline;
374 if ((char *)startwrite + lencopy > (char *)outp +
376 au0828_isocdbg("Overflow of %zi bytes past buffer end (2)\n",
377 ((char *)startwrite + lencopy) -
378 ((char *)outp + buf->vb.size));
379 lencopy = remain = (char *)outp + buf->vb.size -
385 memcpy(startwrite, startread, lencopy);
391 /* We have enough data to check for greenscreen */
392 if (outp[0] < 0x60 && outp[1440] < 0x60) {
393 dev->greenscreen_detected = 1;
401 * video-buf generic routine to get the next available buffer
403 static inline void get_next_buf(struct au0828_dmaqueue *dma_q,
404 struct au0828_buffer **buf)
406 struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
408 if (list_empty(&dma_q->active)) {
409 au0828_isocdbg("No active queue to serve\n");
410 dev->isoc_ctl.buf = NULL;
415 /* Get the next buffer */
416 *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
417 dev->isoc_ctl.buf = *buf;
423 * Controls the isoc copy of each urb packet
425 static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb)
427 struct au0828_buffer *buf;
428 struct au0828_dmaqueue *dma_q = urb->context;
429 unsigned char *outp = NULL;
430 int i, len = 0, rc = 1;
437 if ((dev->dev_state & DEV_DISCONNECTED) ||
438 (dev->dev_state & DEV_MISCONFIGURED))
441 if (urb->status < 0) {
442 print_err_status(dev, -1, urb->status);
443 if (urb->status == -ENOENT)
447 buf = dev->isoc_ctl.buf;
449 outp = videobuf_to_vmalloc(&buf->vb);
451 for (i = 0; i < urb->number_of_packets; i++) {
452 int status = urb->iso_frame_desc[i].status;
455 print_err_status(dev, i, status);
456 if (urb->iso_frame_desc[i].status != -EPROTO)
460 if (urb->iso_frame_desc[i].actual_length <= 0) {
463 if (urb->iso_frame_desc[i].actual_length >
465 au0828_isocdbg("packet bigger than packet size");
469 p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
471 len = urb->iso_frame_desc[i].actual_length - 4;
477 au0828_isocdbg("Video frame %s\n",
478 (fbyte & 0x40) ? "odd" : "even");
479 if (!(fbyte & 0x40)) {
481 buffer_filled(dev, dma_q, buf);
482 get_next_buf(dma_q, &buf);
486 outp = videobuf_to_vmalloc(&buf->vb);
500 au0828_copy_video(dev, dma_q, buf, p, outp, len);
507 buffer_setup(struct videobuf_queue *vq, unsigned int *count,
510 struct au0828_fh *fh = vq->priv_data;
511 *size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
514 *count = AU0828_DEF_BUF;
516 if (*count < AU0828_MIN_BUF)
517 *count = AU0828_MIN_BUF;
521 /* This is called *without* dev->slock held; please keep it that way */
522 static void free_buffer(struct videobuf_queue *vq, struct au0828_buffer *buf)
524 struct au0828_fh *fh = vq->priv_data;
525 struct au0828_dev *dev = fh->dev;
526 unsigned long flags = 0;
530 /* We used to wait for the buffer to finish here, but this didn't work
531 because, as we were keeping the state as VIDEOBUF_QUEUED,
532 videobuf_queue_cancel marked it as finished for us.
533 (Also, it could wedge forever if the hardware was misconfigured.)
535 This should be safe; by the time we get here, the buffer isn't
536 queued anymore. If we ever start marking the buffers as
537 VIDEOBUF_ACTIVE, it won't be, though.
539 spin_lock_irqsave(&dev->slock, flags);
540 if (dev->isoc_ctl.buf == buf)
541 dev->isoc_ctl.buf = NULL;
542 spin_unlock_irqrestore(&dev->slock, flags);
544 videobuf_vmalloc_free(&buf->vb);
545 buf->vb.state = VIDEOBUF_NEEDS_INIT;
549 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
550 enum v4l2_field field)
552 struct au0828_fh *fh = vq->priv_data;
553 struct au0828_buffer *buf = container_of(vb, struct au0828_buffer, vb);
554 struct au0828_dev *dev = fh->dev;
555 int rc = 0, urb_init = 0;
557 buf->vb.size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
559 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
562 buf->vb.width = dev->width;
563 buf->vb.height = dev->height;
564 buf->vb.field = field;
566 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
567 rc = videobuf_iolock(vq, &buf->vb, NULL);
569 printk("videobuf_iolock failed\n");
574 if (!dev->isoc_ctl.num_bufs)
578 rc = au0828_init_isoc(dev, AU0828_ISO_PACKETS_PER_URB,
579 AU0828_MAX_ISO_BUFS, dev->max_pkt_size,
582 printk("au0828_init_isoc failed\n");
587 buf->vb.state = VIDEOBUF_PREPARED;
591 free_buffer(vq, buf);
596 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
598 struct au0828_buffer *buf = container_of(vb,
599 struct au0828_buffer,
601 struct au0828_fh *fh = vq->priv_data;
602 struct au0828_dev *dev = fh->dev;
603 struct au0828_dmaqueue *vidq = &dev->vidq;
605 buf->vb.state = VIDEOBUF_QUEUED;
606 list_add_tail(&buf->vb.queue, &vidq->active);
609 static void buffer_release(struct videobuf_queue *vq,
610 struct videobuf_buffer *vb)
612 struct au0828_buffer *buf = container_of(vb,
613 struct au0828_buffer,
616 free_buffer(vq, buf);
619 static struct videobuf_queue_ops au0828_video_qops = {
620 .buf_setup = buffer_setup,
621 .buf_prepare = buffer_prepare,
622 .buf_queue = buffer_queue,
623 .buf_release = buffer_release,
626 /* ------------------------------------------------------------------
628 ------------------------------------------------------------------*/
630 static int au0828_i2s_init(struct au0828_dev *dev)
632 /* Enable i2s mode */
633 au0828_writereg(dev, AU0828_AUDIOCTRL_50C, 0x01);
638 * Auvitek au0828 analog stream enable
639 * Please set interface0 to AS5 before enable the stream
641 int au0828_analog_stream_enable(struct au0828_dev *d)
643 dprintk(1, "au0828_analog_stream_enable called\n");
644 au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00);
645 au0828_writereg(d, 0x106, 0x00);
647 au0828_writereg(d, 0x110, 0x00);
648 au0828_writereg(d, 0x111, 0x00);
649 au0828_writereg(d, 0x114, 0xa0);
650 au0828_writereg(d, 0x115, 0x05);
652 au0828_writereg(d, 0x112, 0x02);
653 au0828_writereg(d, 0x113, 0x00);
654 au0828_writereg(d, 0x116, 0xf2);
655 au0828_writereg(d, 0x117, 0x00);
656 au0828_writereg(d, AU0828_SENSORCTRL_100, 0xb3);
661 int au0828_analog_stream_disable(struct au0828_dev *d)
663 dprintk(1, "au0828_analog_stream_disable called\n");
664 au0828_writereg(d, AU0828_SENSORCTRL_100, 0x0);
668 void au0828_analog_stream_reset(struct au0828_dev *dev)
670 dprintk(1, "au0828_analog_stream_reset called\n");
671 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0x0);
673 au0828_writereg(dev, AU0828_SENSORCTRL_100, 0xb3);
677 * Some operations needs to stop current streaming
679 static int au0828_stream_interrupt(struct au0828_dev *dev)
683 dev->stream_state = STREAM_INTERRUPT;
684 if(dev->dev_state == DEV_DISCONNECTED)
687 dev->dev_state = DEV_MISCONFIGURED;
688 dprintk(1, "%s device is misconfigured!\n", __FUNCTION__);
695 * au0828_release_resources
696 * unregister v4l2 devices
698 void au0828_analog_unregister(struct au0828_dev *dev)
700 dprintk(1, "au0828_release_resources called\n");
701 mutex_lock(&au0828_sysfs_lock);
704 list_del(&dev->au0828list);
705 video_unregister_device(dev->vdev);
708 video_unregister_device(dev->vbi_dev);
710 mutex_unlock(&au0828_sysfs_lock);
714 /* Usage lock check functions */
715 static int res_get(struct au0828_fh *fh)
717 struct au0828_dev *dev = fh->dev;
720 /* This instance already has stream_on */
732 static int res_check(struct au0828_fh *fh)
734 return fh->stream_on;
737 static void res_free(struct au0828_fh *fh)
739 struct au0828_dev *dev = fh->dev;
745 static int au0828_v4l2_open(struct file *filp)
747 int minor = video_devdata(filp)->minor;
749 struct au0828_dev *h, *dev = NULL;
750 struct au0828_fh *fh;
752 struct list_head *list;
754 list_for_each(list, &au0828_devlist) {
755 h = list_entry(list, struct au0828_dev, au0828list);
756 if(h->vdev->minor == minor) {
758 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
760 #ifdef VBI_NOT_YET_WORKING
761 if(h->vbi_dev->minor == minor) {
763 type = V4L2_BUF_TYPE_VBI_CAPTURE;
771 fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
773 dprintk(1, "Failed allocate au0828_fh struct!\n");
779 filp->private_data = fh;
781 if(fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
782 /* set au0828 interface0 to AS5 here again */
783 ret = usb_set_interface(dev->usbdev, 0, 5);
785 printk("Au0828 can't set alt setting to 5!\n");
788 dev->width = NTSC_STD_W;
789 dev->height = NTSC_STD_H;
790 dev->frame_size = dev->width * dev->height * 2;
791 dev->field_size = dev->width * dev->height;
792 dev->bytesperline = dev->width * 2;
794 au0828_analog_stream_enable(dev);
795 au0828_analog_stream_reset(dev);
797 /* If we were doing ac97 instead of i2s, it would go here...*/
798 au0828_i2s_init(dev);
800 dev->stream_state = STREAM_OFF;
801 dev->dev_state |= DEV_INITIALIZED;
806 videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
807 NULL, &dev->slock, fh->type,
808 V4L2_FIELD_INTERLACED,
809 sizeof(struct au0828_buffer), fh);
814 static int au0828_v4l2_close(struct file *filp)
817 struct au0828_fh *fh = filp->private_data;
818 struct au0828_dev *dev = fh->dev;
820 mutex_lock(&dev->lock);
824 if(dev->users == 1) {
825 videobuf_stop(&fh->vb_vidq);
826 videobuf_mmap_free(&fh->vb_vidq);
828 if(dev->dev_state & DEV_DISCONNECTED) {
829 au0828_analog_unregister(dev);
830 mutex_unlock(&dev->lock);
835 au0828_analog_stream_disable(dev);
837 au0828_uninit_isoc(dev);
839 /* When close the device, set the usb intf0 into alt0 to free
841 ret = usb_set_interface(dev->usbdev, 0, 0);
843 printk("Au0828 can't set alt setting to 0!\n");
848 wake_up_interruptible_nr(&dev->open, 1);
849 mutex_unlock(&dev->lock);
853 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
854 size_t count, loff_t *pos)
856 struct au0828_fh *fh = filp->private_data;
857 struct au0828_dev *dev = fh->dev;
864 if(fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
865 mutex_lock(&dev->lock);
867 mutex_unlock(&dev->lock);
869 if (unlikely(rc < 0))
872 return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
873 filp->f_flags & O_NONBLOCK);
878 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
880 struct au0828_fh *fh = filp->private_data;
881 struct au0828_dev *dev = fh->dev;
888 mutex_lock(&dev->lock);
890 mutex_unlock(&dev->lock);
892 if (unlikely(rc < 0))
895 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
898 return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
901 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
903 struct au0828_fh *fh = filp->private_data;
904 struct au0828_dev *dev = fh->dev;
911 mutex_lock(&dev->lock);
913 mutex_unlock(&dev->lock);
915 if (unlikely(rc < 0))
918 rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
920 dprintk(2, "vma start=0x%08lx, size=%ld, ret=%d\n",
921 (unsigned long)vma->vm_start,
922 (unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
928 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
929 struct v4l2_format *format)
932 int width = format->fmt.pix.width;
933 int height = format->fmt.pix.height;
934 unsigned int maxwidth, maxheight;
939 #ifdef VBI_NOT_YET_WORKING
940 if(format->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
941 dprintk(1, "VBI format set: to be supported!\n");
944 if(format->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
948 if(format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
952 /* If they are demanding a format other than the one we support,
953 bail out (tvtime asks for UYVY and then retries with YUYV) */
954 if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY) {
958 /* format->fmt.pix.width only support 720 and height 480 */
964 format->fmt.pix.width = width;
965 format->fmt.pix.height = height;
966 format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
967 format->fmt.pix.bytesperline = width * 2;
968 format->fmt.pix.sizeimage = width * height * 2;
969 format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
970 format->fmt.pix.field = V4L2_FIELD_INTERLACED;
972 if(cmd == VIDIOC_TRY_FMT)
975 /* maybe set new image format, driver current only support 720*480 */
977 dev->height = height;
978 dev->frame_size = width * height * 2;
979 dev->field_size = width * height;
980 dev->bytesperline = width * 2;
982 if(dev->stream_state == STREAM_ON) {
983 dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
984 if((ret = au0828_stream_interrupt(dev))) {
985 dprintk(1, "error interrupting video stream!\n");
990 /* set au0828 interface0 to AS5 here again */
991 ret = usb_set_interface(dev->usbdev, 0, 5);
993 printk("Au0828 can't set alt setting to 5!\n");
997 au0828_analog_stream_enable(dev);
1003 static int vidioc_queryctrl(struct file *file, void *priv,
1004 struct v4l2_queryctrl *qc)
1006 struct au0828_fh *fh = priv;
1007 struct au0828_dev *dev = fh->dev;
1008 au0828_call_i2c_clients(dev, VIDIOC_QUERYCTRL, qc);
1015 static int vidioc_querycap(struct file *file, void *priv,
1016 struct v4l2_capability *cap)
1018 struct au0828_fh *fh = priv;
1019 struct au0828_dev *dev = fh->dev;
1021 memset(cap, 0, sizeof(*cap));
1022 strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1023 strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1024 strlcpy(cap->bus_info, dev->usbdev->dev.bus_id, sizeof(cap->bus_info));
1026 cap->version = AU0828_VERSION_CODE;
1028 /*set the device capabilities */
1029 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1030 #ifdef VBI_NOT_YET_WORKING
1031 V4L2_CAP_VBI_CAPTURE |
1034 V4L2_CAP_READWRITE |
1035 V4L2_CAP_STREAMING |
1040 static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1041 struct v4l2_fmtdesc *f)
1046 memset(f, 0, sizeof(*f));
1047 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1048 strcpy(f->description, "Packed YUV2");
1051 f->pixelformat = V4L2_PIX_FMT_UYVY;
1053 memset(f->reserved, 0, sizeof(f->reserved));
1057 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1058 struct v4l2_format *f)
1060 struct au0828_fh *fh = priv;
1061 struct au0828_dev *dev = fh->dev;
1063 f->fmt.pix.width = dev->width;
1064 f->fmt.pix.height = dev->height;
1065 f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1066 f->fmt.pix.bytesperline = dev->bytesperline;
1067 f->fmt.pix.sizeimage = dev->frame_size;
1068 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1069 f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1073 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1074 struct v4l2_format *f)
1076 struct au0828_fh *fh = priv;
1077 struct au0828_dev *dev = fh->dev;
1079 return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1082 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1083 struct v4l2_format *f)
1085 struct au0828_fh *fh = priv;
1086 struct au0828_dev *dev = fh->dev;
1089 if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1090 printk("%s queue busy\n", __func__);
1095 if (dev->stream_on && !fh->stream_on) {
1096 printk("%s device in use by another fh\n", __func__);
1101 return au0828_set_format(dev, VIDIOC_S_FMT, f);
1106 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
1108 struct au0828_fh *fh = priv;
1109 struct au0828_dev *dev = fh->dev;
1111 /* FIXME: when we support something other than NTSC, we are going to
1112 have to make the au0828 bridge adjust the size of its capture
1113 buffer, which is currently hardcoded at 720x480 */
1115 au0828_call_i2c_clients(dev, VIDIOC_S_STD, norm);
1119 static int vidioc_enum_input(struct file *file, void *priv,
1120 struct v4l2_input *input)
1122 struct au0828_fh *fh = priv;
1123 struct au0828_dev *dev = fh->dev;
1126 static const char *inames[] = {
1127 [AU0828_VMUX_COMPOSITE] = "Composite",
1128 [AU0828_VMUX_SVIDEO] = "S-Video",
1129 [AU0828_VMUX_CABLE] = "Cable TV",
1130 [AU0828_VMUX_TELEVISION] = "Television",
1131 [AU0828_VMUX_DVB] = "DVB",
1132 [AU0828_VMUX_DEBUG] = "tv debug"
1137 if(tmp > AU0828_MAX_INPUT)
1139 if(AUVI_INPUT(tmp).type == 0)
1142 memset(input, 0, sizeof(*input));
1144 strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1145 if((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1146 (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE))
1147 input->type |= V4L2_INPUT_TYPE_TUNER;
1149 input->type |= V4L2_INPUT_TYPE_CAMERA;
1151 input->std = dev->vdev->tvnorms;
1156 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1158 struct au0828_fh *fh = priv;
1159 struct au0828_dev *dev = fh->dev;
1160 *i = dev->ctrl_input;
1164 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1166 struct au0828_fh *fh = priv;
1167 struct au0828_dev *dev = fh->dev;
1169 struct v4l2_routing route;
1171 dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __FUNCTION__,
1173 if(index >= AU0828_MAX_INPUT)
1175 if(AUVI_INPUT(index).type == 0)
1177 dev->ctrl_input = index;
1179 switch(AUVI_INPUT(index).type) {
1180 case AU0828_VMUX_SVIDEO:
1182 dev->input_type = AU0828_VMUX_SVIDEO;
1185 case AU0828_VMUX_COMPOSITE:
1187 dev->input_type = AU0828_VMUX_COMPOSITE;
1190 case AU0828_VMUX_TELEVISION:
1192 dev->input_type = AU0828_VMUX_TELEVISION;
1199 route.input = AUVI_INPUT(index).vmux;
1201 au0828_call_i2c_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
1203 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1205 if (AUVI_INPUT(i).audio_setup == NULL) {
1214 (AUVI_INPUT(i).audio_setup)(dev, enable);
1216 /* Make sure we leave it turned on if some
1217 other input is routed to this callback */
1218 if ((AUVI_INPUT(i).audio_setup) !=
1219 ((AUVI_INPUT(index).audio_setup))) {
1220 (AUVI_INPUT(i).audio_setup)(dev, enable);
1225 route.input = AUVI_INPUT(index).amux;
1226 au0828_call_i2c_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING,
1231 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1233 struct au0828_fh *fh = priv;
1234 struct au0828_dev *dev = fh->dev;
1235 unsigned int index = a->index;
1240 memset(a, 0, sizeof(*a));
1241 index = dev->ctrl_ainput;
1243 strcpy(a->name, "Television");
1245 strcpy(a->name, "Line in");
1247 a->capability = V4L2_AUDCAP_STEREO;
1252 static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1254 struct au0828_fh *fh = priv;
1255 struct au0828_dev *dev = fh->dev;
1256 if(a->index != dev->ctrl_ainput)
1261 static int vidioc_g_ctrl(struct file *file, void *priv,
1262 struct v4l2_control *ctrl)
1264 struct au0828_fh *fh = priv;
1265 struct au0828_dev *dev = fh->dev;
1267 au0828_call_i2c_clients(dev, VIDIOC_G_CTRL, ctrl);
1272 static int vidioc_s_ctrl(struct file *file, void *priv,
1273 struct v4l2_control *ctrl)
1275 struct au0828_fh *fh = priv;
1276 struct au0828_dev *dev = fh->dev;
1277 au0828_call_i2c_clients(dev, VIDIOC_S_CTRL, ctrl);
1281 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1283 struct au0828_fh *fh = priv;
1284 struct au0828_dev *dev = fh->dev;
1289 memset(t, 0, sizeof(*t));
1290 strcpy(t->name, "Auvitek tuner");
1292 au0828_call_i2c_clients(dev, VIDIOC_G_TUNER, t);
1296 static int vidioc_s_tuner(struct file *file, void *priv,
1297 struct v4l2_tuner *t)
1299 struct au0828_fh *fh = priv;
1300 struct au0828_dev *dev = fh->dev;
1305 t->type = V4L2_TUNER_ANALOG_TV;
1306 au0828_call_i2c_clients(dev, VIDIOC_S_TUNER, t);
1307 dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1313 static int vidioc_g_frequency(struct file *file, void *priv,
1314 struct v4l2_frequency *freq)
1316 struct au0828_fh *fh = priv;
1317 struct au0828_dev *dev = fh->dev;
1318 memset(freq, 0, sizeof(*freq));
1319 freq->type = V4L2_TUNER_ANALOG_TV;
1320 freq->frequency = dev->ctrl_freq;
1324 static int vidioc_s_frequency(struct file *file, void *priv,
1325 struct v4l2_frequency *freq)
1327 struct au0828_fh *fh = priv;
1328 struct au0828_dev *dev = fh->dev;
1330 if(freq->tuner != 0)
1332 if(freq->type != V4L2_TUNER_ANALOG_TV)
1335 dev->ctrl_freq = freq->frequency;
1337 au0828_call_i2c_clients(dev, VIDIOC_S_FREQUENCY, freq);
1339 au0828_analog_stream_reset(dev);
1344 static int vidioc_g_chip_ident(struct file *file, void *priv,
1345 struct v4l2_dbg_chip_ident *chip)
1347 struct au0828_fh *fh = priv;
1348 struct au0828_dev *dev = fh->dev;
1349 chip->ident = V4L2_IDENT_NONE;
1352 if (v4l2_chip_match_host(&chip->match)) {
1353 chip->ident = V4L2_IDENT_AU0828;
1357 au0828_call_i2c_clients(dev, VIDIOC_DBG_G_CHIP_IDENT, chip);
1358 if (chip->ident == V4L2_IDENT_NONE)
1364 static int vidioc_cropcap(struct file *file, void *priv,
1365 struct v4l2_cropcap *cc)
1367 struct au0828_fh *fh = priv;
1368 struct au0828_dev *dev = fh->dev;
1370 if(cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1373 cc->bounds.left = 0;
1375 cc->bounds.width = dev->width;
1376 cc->bounds.height = dev->height;
1378 cc->defrect = cc->bounds;
1380 cc->pixelaspect.numerator = 54;
1381 cc->pixelaspect.denominator = 59;
1386 static int vidioc_streamon(struct file *file, void *priv,
1387 enum v4l2_buf_type type)
1389 struct au0828_fh *fh = priv;
1390 struct au0828_dev *dev = fh->dev;
1391 int b = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1394 rc = check_dev(dev);
1398 if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1399 au0828_analog_stream_enable(dev);
1400 au0828_call_i2c_clients(dev, VIDIOC_STREAMON, &b);
1403 mutex_lock(&dev->lock);
1406 if (likely(rc >= 0))
1407 rc = videobuf_streamon(&fh->vb_vidq);
1408 mutex_unlock(&dev->lock);
1413 static int vidioc_streamoff(struct file *file, void *priv,
1414 enum v4l2_buf_type type)
1416 struct au0828_fh *fh = priv;
1417 struct au0828_dev *dev = fh->dev;
1418 int b = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1423 rc = check_dev(dev);
1427 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1429 if (type != fh->type)
1432 if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1433 au0828_call_i2c_clients(dev, VIDIOC_STREAMOFF, &b);
1434 if((ret = au0828_stream_interrupt(dev)) != 0)
1438 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1439 if (AUVI_INPUT(i).audio_setup == NULL) {
1442 (AUVI_INPUT(i).audio_setup)(dev, 0);
1445 mutex_lock(&dev->lock);
1446 videobuf_streamoff(&fh->vb_vidq);
1448 mutex_unlock(&dev->lock);
1453 static int vidioc_g_register(struct file *file, void *priv,
1454 struct v4l2_dbg_register *reg)
1456 struct au0828_fh *fh = priv;
1457 struct au0828_dev *dev = fh->dev;
1459 switch (reg->match.type) {
1460 case V4L2_CHIP_MATCH_I2C_DRIVER:
1461 au0828_call_i2c_clients(dev, VIDIOC_DBG_G_REGISTER, reg);
1468 static int vidioc_s_register(struct file *file, void *priv,
1469 struct v4l2_dbg_register *reg)
1471 struct au0828_fh *fh = priv;
1472 struct au0828_dev *dev = fh->dev;
1474 switch (reg->match.type) {
1475 case V4L2_CHIP_MATCH_I2C_DRIVER:
1476 au0828_call_i2c_clients(dev, VIDIOC_DBG_S_REGISTER, reg);
1484 static int vidioc_reqbufs(struct file *file, void *priv,
1485 struct v4l2_requestbuffers *rb)
1487 struct au0828_fh *fh = priv;
1488 struct au0828_dev *dev = fh->dev;
1491 rc = check_dev(dev);
1495 return videobuf_reqbufs(&fh->vb_vidq, rb);
1498 static int vidioc_querybuf(struct file *file, void *priv,
1499 struct v4l2_buffer *b)
1501 struct au0828_fh *fh = priv;
1502 struct au0828_dev *dev = fh->dev;
1505 rc = check_dev(dev);
1509 return videobuf_querybuf(&fh->vb_vidq, b);
1512 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1514 struct au0828_fh *fh = priv;
1515 struct au0828_dev *dev = fh->dev;
1518 rc = check_dev(dev);
1522 return videobuf_qbuf(&fh->vb_vidq, b);
1525 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1527 struct au0828_fh *fh = priv;
1528 struct au0828_dev *dev = fh->dev;
1531 rc = check_dev(dev);
1535 /* Workaround for a bug in the au0828 hardware design that sometimes
1536 results in the colorspace being inverted */
1537 if (dev->greenscreen_detected == 1) {
1538 dprintk(1, "Detected green frame. Resetting stream...\n");
1539 au0828_analog_stream_reset(dev);
1540 dev->greenscreen_detected = 0;
1543 return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1546 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1547 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1549 struct au0828_fh *fh = priv;
1551 return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1555 static struct v4l2_file_operations au0828_v4l_fops = {
1556 .owner = THIS_MODULE,
1557 .open = au0828_v4l2_open,
1558 .release = au0828_v4l2_close,
1559 .read = au0828_v4l2_read,
1560 .poll = au0828_v4l2_poll,
1561 .mmap = au0828_v4l2_mmap,
1562 .ioctl = video_ioctl2,
1565 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1566 .vidioc_querycap = vidioc_querycap,
1567 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1568 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1569 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1570 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1571 #ifdef VBI_NOT_YET_WORKING
1572 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1573 .vidioc_try_fmt_vbi_cap = vidioc_s_fmt_vbi_cap,
1574 .vidioc_s_fmt_vbi_cap = vidioc_s_fmt_vbi_cap,
1576 .vidioc_g_audio = vidioc_g_audio,
1577 .vidioc_s_audio = vidioc_s_audio,
1578 .vidioc_cropcap = vidioc_cropcap,
1579 #ifdef VBI_NOT_YET_WORKING
1580 .vidioc_g_fmt_sliced_vbi_cap = vidioc_g_fmt_sliced_vbi_cap,
1581 .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_set_sliced_vbi_cap,
1582 .vidioc_s_fmt_sliced_vbi_cap = vidioc_try_set_sliced_vbi_cap,
1584 .vidioc_reqbufs = vidioc_reqbufs,
1585 .vidioc_querybuf = vidioc_querybuf,
1586 .vidioc_qbuf = vidioc_qbuf,
1587 .vidioc_dqbuf = vidioc_dqbuf,
1588 .vidioc_s_std = vidioc_s_std,
1589 .vidioc_enum_input = vidioc_enum_input,
1590 .vidioc_g_input = vidioc_g_input,
1591 .vidioc_s_input = vidioc_s_input,
1592 .vidioc_queryctrl = vidioc_queryctrl,
1593 .vidioc_g_ctrl = vidioc_g_ctrl,
1594 .vidioc_s_ctrl = vidioc_s_ctrl,
1595 .vidioc_streamon = vidioc_streamon,
1596 .vidioc_streamoff = vidioc_streamoff,
1597 .vidioc_g_tuner = vidioc_g_tuner,
1598 .vidioc_s_tuner = vidioc_s_tuner,
1599 .vidioc_g_frequency = vidioc_g_frequency,
1600 .vidioc_s_frequency = vidioc_s_frequency,
1601 #ifdef CONFIG_VIDEO_ADV_DEBUG
1602 .vidioc_g_register = vidioc_g_register,
1603 .vidioc_s_register = vidioc_s_register,
1604 .vidioc_g_chip_ident = vidioc_g_chip_ident,
1606 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1607 .vidiocgmbuf = vidiocgmbuf,
1611 static const struct video_device au0828_video_template = {
1612 .fops = &au0828_v4l_fops,
1613 .release = video_device_release,
1614 .ioctl_ops = &video_ioctl_ops,
1616 .tvnorms = V4L2_STD_NTSC_M,
1617 .current_norm = V4L2_STD_NTSC_M,
1620 /**************************************************************************/
1622 int au0828_analog_register(struct au0828_dev *dev,
1623 struct usb_interface *interface)
1625 int retval = -ENOMEM;
1626 struct usb_host_interface *iface_desc;
1627 struct usb_endpoint_descriptor *endpoint;
1630 dprintk(1, "au0828_analog_register called!\n");
1632 /* set au0828 usb interface0 to as5 */
1633 retval = usb_set_interface(dev->usbdev,
1634 interface->cur_altsetting->desc.bInterfaceNumber, 5);
1636 printk("Failure setting usb interface0 to as5\n");
1640 /* Figure out which endpoint has the isoc interface */
1641 iface_desc = interface->cur_altsetting;
1642 for(i = 0; i < iface_desc->desc.bNumEndpoints; i++){
1643 endpoint = &iface_desc->endpoint[i].desc;
1644 if(((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) &&
1645 ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_ISOC)){
1647 /* we find our isoc in endpoint */
1648 u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1649 dev->max_pkt_size = (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1650 dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1653 if(!(dev->isoc_in_endpointaddr)) {
1654 printk("Could not locate isoc endpoint\n");
1659 init_waitqueue_head(&dev->open);
1660 spin_lock_init(&dev->slock);
1661 mutex_init(&dev->lock);
1663 INIT_LIST_HEAD(&dev->vidq.active);
1664 INIT_LIST_HEAD(&dev->vidq.queued);
1666 dev->width = NTSC_STD_W;
1667 dev->height = NTSC_STD_H;
1668 dev->field_size = dev->width * dev->height;
1669 dev->frame_size = dev->field_size << 1;
1670 dev->bytesperline = dev->width << 1;
1671 dev->ctrl_ainput = 0;
1673 /* allocate and fill v4l2 video struct */
1674 dev->vdev = video_device_alloc();
1675 if(NULL == dev->vdev) {
1676 dprintk(1, "Can't allocate video_device.\n");
1680 #ifdef VBI_NOT_YET_WORKING
1681 dev->vbi_dev = video_device_alloc();
1682 if(NULL == dev->vbi_dev) {
1683 dprintk(1, "Can't allocate vbi_device.\n");
1689 /* Fill the video capture device struct */
1690 *dev->vdev = au0828_video_template;
1691 dev->vdev->vfl_type = VID_TYPE_CAPTURE | VID_TYPE_TUNER;
1692 dev->vdev->parent = &dev->usbdev->dev;
1693 strcpy(dev->vdev->name, "au0828a video");
1695 #ifdef VBI_NOT_YET_WORKING
1696 /* Setup the VBI device */
1697 *dev->vbi_dev = au0828_video_template;
1698 dev->vbi_dev->vfl_type = VFL_TYPE_VBI;
1699 dev->vbi_dev->parent = &dev->usbdev->dev;
1700 strcpy(dev->vbi_dev->name, "au0828a vbi");
1703 list_add_tail(&dev->au0828list, &au0828_devlist);
1705 /* Register the v4l2 device */
1706 if((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1)) != 0) {
1707 dprintk(1, "unable to register video device (error = %d).\n", retval);
1708 list_del(&dev->au0828list);
1709 video_device_release(dev->vdev);
1713 #ifdef VBI_NOT_YET_WORKING
1714 /* Register the vbi device */
1715 if((retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1)) != 0) {
1716 dprintk(1, "unable to register vbi device (error = %d).\n", retval);
1717 list_del(&dev->au0828list);
1718 video_device_release(dev->vbi_dev);
1719 video_device_release(dev->vdev);
1724 dprintk(1, "%s completed!\n", __FUNCTION__);