]> Pileus Git - ~andy/linux/blob - drivers/media/usb/au0828/au0828-video.c
Merge tag 'firewire-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[~andy/linux] / drivers / media / usb / au0828 / au0828-video.c
1 /*
2  * Auvitek AU0828 USB Bridge (Analog video support)
3  *
4  * Copyright (C) 2009 Devin Heitmueller <dheitmueller@linuxtv.org>
5  * Copyright (C) 2005-2008 Auvitek International, Ltd.
6  *
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.
11  *
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.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301, USA.
21  */
22
23 /* Developer Notes:
24  *
25  * VBI support is not yet working
26  * The hardware scaler supported is unimplemented
27  * AC97 audio support is unimplemented (only i2s audio mode)
28  *
29  */
30
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/init.h>
34 #include <linux/device.h>
35 #include <linux/suspend.h>
36 #include <media/v4l2-common.h>
37 #include <media/v4l2-ioctl.h>
38 #include <media/v4l2-event.h>
39 #include <media/tuner.h>
40 #include "au0828.h"
41 #include "au0828-reg.h"
42
43 static DEFINE_MUTEX(au0828_sysfs_lock);
44
45 /* ------------------------------------------------------------------
46         Videobuf operations
47    ------------------------------------------------------------------*/
48
49 static unsigned int isoc_debug;
50 module_param(isoc_debug, int, 0644);
51 MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
52
53 #define au0828_isocdbg(fmt, arg...) \
54 do {\
55         if (isoc_debug) { \
56                 printk(KERN_INFO "au0828 %s :"fmt, \
57                        __func__ , ##arg);          \
58         } \
59   } while (0)
60
61 static inline void i2c_gate_ctrl(struct au0828_dev *dev, int val)
62 {
63         if (dev->dvb.frontend && dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl)
64                 dev->dvb.frontend->ops.analog_ops.i2c_gate_ctrl(dev->dvb.frontend, val);
65 }
66
67 static inline void print_err_status(struct au0828_dev *dev,
68                                     int packet, int status)
69 {
70         char *errmsg = "Unknown";
71
72         switch (status) {
73         case -ENOENT:
74                 errmsg = "unlinked synchronuously";
75                 break;
76         case -ECONNRESET:
77                 errmsg = "unlinked asynchronuously";
78                 break;
79         case -ENOSR:
80                 errmsg = "Buffer error (overrun)";
81                 break;
82         case -EPIPE:
83                 errmsg = "Stalled (device not responding)";
84                 break;
85         case -EOVERFLOW:
86                 errmsg = "Babble (bad cable?)";
87                 break;
88         case -EPROTO:
89                 errmsg = "Bit-stuff error (bad cable?)";
90                 break;
91         case -EILSEQ:
92                 errmsg = "CRC/Timeout (could be anything)";
93                 break;
94         case -ETIME:
95                 errmsg = "Device does not respond";
96                 break;
97         }
98         if (packet < 0) {
99                 au0828_isocdbg("URB status %d [%s].\n", status, errmsg);
100         } else {
101                 au0828_isocdbg("URB packet %d, status %d [%s].\n",
102                                packet, status, errmsg);
103         }
104 }
105
106 static int check_dev(struct au0828_dev *dev)
107 {
108         if (dev->dev_state & DEV_DISCONNECTED) {
109                 printk(KERN_INFO "v4l2 ioctl: device not present\n");
110                 return -ENODEV;
111         }
112
113         if (dev->dev_state & DEV_MISCONFIGURED) {
114                 printk(KERN_INFO "v4l2 ioctl: device is misconfigured; "
115                        "close and open it again\n");
116                 return -EIO;
117         }
118         return 0;
119 }
120
121 /*
122  * IRQ callback, called by URB callback
123  */
124 static void au0828_irq_callback(struct urb *urb)
125 {
126         struct au0828_dmaqueue  *dma_q = urb->context;
127         struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
128         unsigned long flags = 0;
129         int i;
130
131         switch (urb->status) {
132         case 0:             /* success */
133         case -ETIMEDOUT:    /* NAK */
134                 break;
135         case -ECONNRESET:   /* kill */
136         case -ENOENT:
137         case -ESHUTDOWN:
138                 au0828_isocdbg("au0828_irq_callback called: status kill\n");
139                 return;
140         default:            /* unknown error */
141                 au0828_isocdbg("urb completition error %d.\n", urb->status);
142                 break;
143         }
144
145         /* Copy data from URB */
146         spin_lock_irqsave(&dev->slock, flags);
147         dev->isoc_ctl.isoc_copy(dev, urb);
148         spin_unlock_irqrestore(&dev->slock, flags);
149
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;
154         }
155         urb->status = 0;
156
157         urb->status = usb_submit_urb(urb, GFP_ATOMIC);
158         if (urb->status) {
159                 au0828_isocdbg("urb resubmit failed (error=%i)\n",
160                                urb->status);
161         }
162 }
163
164 /*
165  * Stop and Deallocate URBs
166  */
167 static void au0828_uninit_isoc(struct au0828_dev *dev)
168 {
169         struct urb *urb;
170         int i;
171
172         au0828_isocdbg("au0828: called au0828_uninit_isoc\n");
173
174         dev->isoc_ctl.nfields = -1;
175         for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
176                 urb = dev->isoc_ctl.urb[i];
177                 if (urb) {
178                         if (!irqs_disabled())
179                                 usb_kill_urb(urb);
180                         else
181                                 usb_unlink_urb(urb);
182
183                         if (dev->isoc_ctl.transfer_buffer[i]) {
184                                 usb_free_coherent(dev->usbdev,
185                                         urb->transfer_buffer_length,
186                                         dev->isoc_ctl.transfer_buffer[i],
187                                         urb->transfer_dma);
188                         }
189                         usb_free_urb(urb);
190                         dev->isoc_ctl.urb[i] = NULL;
191                 }
192                 dev->isoc_ctl.transfer_buffer[i] = NULL;
193         }
194
195         kfree(dev->isoc_ctl.urb);
196         kfree(dev->isoc_ctl.transfer_buffer);
197
198         dev->isoc_ctl.urb = NULL;
199         dev->isoc_ctl.transfer_buffer = NULL;
200         dev->isoc_ctl.num_bufs = 0;
201 }
202
203 /*
204  * Allocate URBs and start IRQ
205  */
206 static 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))
209 {
210         struct au0828_dmaqueue *dma_q = &dev->vidq;
211         int i;
212         int sb_size, pipe;
213         struct urb *urb;
214         int j, k;
215         int rc;
216
217         au0828_isocdbg("au0828: called au0828_prepare_isoc\n");
218
219         /* De-allocates all pending stuff */
220         au0828_uninit_isoc(dev);
221
222         dev->isoc_ctl.isoc_copy = isoc_copy;
223         dev->isoc_ctl.num_bufs = num_bufs;
224
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");
228                 return -ENOMEM;
229         }
230
231         dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
232                                               GFP_KERNEL);
233         if (!dev->isoc_ctl.transfer_buffer) {
234                 au0828_isocdbg("cannot allocate memory for usb transfer\n");
235                 kfree(dev->isoc_ctl.urb);
236                 return -ENOMEM;
237         }
238
239         dev->isoc_ctl.max_pkt_size = max_pkt_size;
240         dev->isoc_ctl.buf = NULL;
241
242         sb_size = max_packets * dev->isoc_ctl.max_pkt_size;
243
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);
247                 if (!urb) {
248                         au0828_isocdbg("cannot alloc isoc_ctl.urb %i\n", i);
249                         au0828_uninit_isoc(dev);
250                         return -ENOMEM;
251                 }
252                 dev->isoc_ctl.urb[i] = urb;
253
254                 dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(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"
258                                         " buffer %i%s\n",
259                                         sb_size, i,
260                                         in_interrupt() ? " while in int" : "");
261                         au0828_uninit_isoc(dev);
262                         return -ENOMEM;
263                 }
264                 memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
265
266                 pipe = usb_rcvisocpipe(dev->usbdev,
267                                        dev->isoc_in_endpointaddr),
268
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);
272
273                 urb->number_of_packets = max_packets;
274                 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
275
276                 k = 0;
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;
282                 }
283         }
284
285         init_waitqueue_head(&dma_q->wq);
286
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);
290                 if (rc) {
291                         au0828_isocdbg("submit of urb %i failed (error=%i)\n",
292                                        i, rc);
293                         au0828_uninit_isoc(dev);
294                         return rc;
295                 }
296         }
297
298         return 0;
299 }
300
301 /*
302  * Announces that a buffer were filled and request the next
303  */
304 static inline void buffer_filled(struct au0828_dev *dev,
305                                   struct au0828_dmaqueue *dma_q,
306                                   struct au0828_buffer *buf)
307 {
308         /* Advice that buffer was filled */
309         au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
310
311         buf->vb.state = VIDEOBUF_DONE;
312         buf->vb.field_count++;
313         v4l2_get_timestamp(&buf->vb.ts);
314
315         dev->isoc_ctl.buf = NULL;
316
317         list_del(&buf->vb.queue);
318         wake_up(&buf->vb.done);
319 }
320
321 static inline void vbi_buffer_filled(struct au0828_dev *dev,
322                                      struct au0828_dmaqueue *dma_q,
323                                      struct au0828_buffer *buf)
324 {
325         /* Advice that buffer was filled */
326         au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
327
328         buf->vb.state = VIDEOBUF_DONE;
329         buf->vb.field_count++;
330         v4l2_get_timestamp(&buf->vb.ts);
331
332         dev->isoc_ctl.vbi_buf = NULL;
333
334         list_del(&buf->vb.queue);
335         wake_up(&buf->vb.done);
336 }
337
338 /*
339  * Identify the buffer header type and properly handles
340  */
341 static void au0828_copy_video(struct au0828_dev *dev,
342                               struct au0828_dmaqueue  *dma_q,
343                               struct au0828_buffer *buf,
344                               unsigned char *p,
345                               unsigned char *outp, unsigned long len)
346 {
347         void *fieldstart, *startwrite, *startread;
348         int  linesdone, currlinedone, offset, lencopy, remain;
349         int bytesperline = dev->width << 1; /* Assumes 16-bit depth @@@@ */
350
351         if (len == 0)
352                 return;
353
354         if (dma_q->pos + len > buf->vb.size)
355                 len = buf->vb.size - dma_q->pos;
356
357         startread = p;
358         remain = len;
359
360         /* Interlaces frame */
361         if (buf->top_field)
362                 fieldstart = outp;
363         else
364                 fieldstart = outp + bytesperline;
365
366         linesdone = dma_q->pos / bytesperline;
367         currlinedone = dma_q->pos % bytesperline;
368         offset = linesdone * bytesperline * 2 + currlinedone;
369         startwrite = fieldstart + offset;
370         lencopy = bytesperline - currlinedone;
371         lencopy = lencopy > remain ? remain : lencopy;
372
373         if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
374                 au0828_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
375                                ((char *)startwrite + lencopy) -
376                                ((char *)outp + buf->vb.size));
377                 remain = (char *)outp + buf->vb.size - (char *)startwrite;
378                 lencopy = remain;
379         }
380         if (lencopy <= 0)
381                 return;
382         memcpy(startwrite, startread, lencopy);
383
384         remain -= lencopy;
385
386         while (remain > 0) {
387                 startwrite += lencopy + bytesperline;
388                 startread += lencopy;
389                 if (bytesperline > remain)
390                         lencopy = remain;
391                 else
392                         lencopy = bytesperline;
393
394                 if ((char *)startwrite + lencopy > (char *)outp +
395                     buf->vb.size) {
396                         au0828_isocdbg("Overflow %zi bytes past buf end (2)\n",
397                                        ((char *)startwrite + lencopy) -
398                                        ((char *)outp + buf->vb.size));
399                         lencopy = remain = (char *)outp + buf->vb.size -
400                                            (char *)startwrite;
401                 }
402                 if (lencopy <= 0)
403                         break;
404
405                 memcpy(startwrite, startread, lencopy);
406
407                 remain -= lencopy;
408         }
409
410         if (offset > 1440) {
411                 /* We have enough data to check for greenscreen */
412                 if (outp[0] < 0x60 && outp[1440] < 0x60)
413                         dev->greenscreen_detected = 1;
414         }
415
416         dma_q->pos += len;
417 }
418
419 /*
420  * video-buf generic routine to get the next available buffer
421  */
422 static inline void get_next_buf(struct au0828_dmaqueue *dma_q,
423                                 struct au0828_buffer **buf)
424 {
425         struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vidq);
426
427         if (list_empty(&dma_q->active)) {
428                 au0828_isocdbg("No active queue to serve\n");
429                 dev->isoc_ctl.buf = NULL;
430                 *buf = NULL;
431                 return;
432         }
433
434         /* Get the next buffer */
435         *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
436         dev->isoc_ctl.buf = *buf;
437
438         return;
439 }
440
441 static void au0828_copy_vbi(struct au0828_dev *dev,
442                               struct au0828_dmaqueue  *dma_q,
443                               struct au0828_buffer *buf,
444                               unsigned char *p,
445                               unsigned char *outp, unsigned long len)
446 {
447         unsigned char *startwrite, *startread;
448         int bytesperline;
449         int i, j = 0;
450
451         if (dev == NULL) {
452                 au0828_isocdbg("dev is null\n");
453                 return;
454         }
455
456         if (dma_q == NULL) {
457                 au0828_isocdbg("dma_q is null\n");
458                 return;
459         }
460         if (buf == NULL)
461                 return;
462         if (p == NULL) {
463                 au0828_isocdbg("p is null\n");
464                 return;
465         }
466         if (outp == NULL) {
467                 au0828_isocdbg("outp is null\n");
468                 return;
469         }
470
471         bytesperline = dev->vbi_width;
472
473         if (dma_q->pos + len > buf->vb.size)
474                 len = buf->vb.size - dma_q->pos;
475
476         startread = p;
477         startwrite = outp + (dma_q->pos / 2);
478
479         /* Make sure the bottom field populates the second half of the frame */
480         if (buf->top_field == 0)
481                 startwrite += bytesperline * dev->vbi_height;
482
483         for (i = 0; i < len; i += 2)
484                 startwrite[j++] = startread[i+1];
485
486         dma_q->pos += len;
487 }
488
489
490 /*
491  * video-buf generic routine to get the next available VBI buffer
492  */
493 static inline void vbi_get_next_buf(struct au0828_dmaqueue *dma_q,
494                                     struct au0828_buffer **buf)
495 {
496         struct au0828_dev *dev = container_of(dma_q, struct au0828_dev, vbiq);
497         char *outp;
498
499         if (list_empty(&dma_q->active)) {
500                 au0828_isocdbg("No active queue to serve\n");
501                 dev->isoc_ctl.vbi_buf = NULL;
502                 *buf = NULL;
503                 return;
504         }
505
506         /* Get the next buffer */
507         *buf = list_entry(dma_q->active.next, struct au0828_buffer, vb.queue);
508         /* Cleans up buffer - Useful for testing for frame/URB loss */
509         outp = videobuf_to_vmalloc(&(*buf)->vb);
510         memset(outp, 0x00, (*buf)->vb.size);
511
512         dev->isoc_ctl.vbi_buf = *buf;
513
514         return;
515 }
516
517 /*
518  * Controls the isoc copy of each urb packet
519  */
520 static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb)
521 {
522         struct au0828_buffer    *buf;
523         struct au0828_buffer    *vbi_buf;
524         struct au0828_dmaqueue  *dma_q = urb->context;
525         struct au0828_dmaqueue  *vbi_dma_q = &dev->vbiq;
526         unsigned char *outp = NULL;
527         unsigned char *vbioutp = NULL;
528         int i, len = 0, rc = 1;
529         unsigned char *p;
530         unsigned char fbyte;
531         unsigned int vbi_field_size;
532         unsigned int remain, lencopy;
533
534         if (!dev)
535                 return 0;
536
537         if ((dev->dev_state & DEV_DISCONNECTED) ||
538             (dev->dev_state & DEV_MISCONFIGURED))
539                 return 0;
540
541         if (urb->status < 0) {
542                 print_err_status(dev, -1, urb->status);
543                 if (urb->status == -ENOENT)
544                         return 0;
545         }
546
547         buf = dev->isoc_ctl.buf;
548         if (buf != NULL)
549                 outp = videobuf_to_vmalloc(&buf->vb);
550
551         vbi_buf = dev->isoc_ctl.vbi_buf;
552         if (vbi_buf != NULL)
553                 vbioutp = videobuf_to_vmalloc(&vbi_buf->vb);
554
555         for (i = 0; i < urb->number_of_packets; i++) {
556                 int status = urb->iso_frame_desc[i].status;
557
558                 if (status < 0) {
559                         print_err_status(dev, i, status);
560                         if (urb->iso_frame_desc[i].status != -EPROTO)
561                                 continue;
562                 }
563
564                 if (urb->iso_frame_desc[i].actual_length <= 0)
565                         continue;
566
567                 if (urb->iso_frame_desc[i].actual_length >
568                                                 dev->max_pkt_size) {
569                         au0828_isocdbg("packet bigger than packet size");
570                         continue;
571                 }
572
573                 p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
574                 fbyte = p[0];
575                 len = urb->iso_frame_desc[i].actual_length - 4;
576                 p += 4;
577
578                 if (fbyte & 0x80) {
579                         len -= 4;
580                         p += 4;
581                         au0828_isocdbg("Video frame %s\n",
582                                        (fbyte & 0x40) ? "odd" : "even");
583                         if (fbyte & 0x40) {
584                                 /* VBI */
585                                 if (vbi_buf != NULL)
586                                         vbi_buffer_filled(dev,
587                                                           vbi_dma_q,
588                                                           vbi_buf);
589                                 vbi_get_next_buf(vbi_dma_q, &vbi_buf);
590                                 if (vbi_buf == NULL)
591                                         vbioutp = NULL;
592                                 else
593                                         vbioutp = videobuf_to_vmalloc(
594                                                 &vbi_buf->vb);
595
596                                 /* Video */
597                                 if (buf != NULL)
598                                         buffer_filled(dev, dma_q, buf);
599                                 get_next_buf(dma_q, &buf);
600                                 if (buf == NULL)
601                                         outp = NULL;
602                                 else
603                                         outp = videobuf_to_vmalloc(&buf->vb);
604
605                                 /* As long as isoc traffic is arriving, keep
606                                    resetting the timer */
607                                 if (dev->vid_timeout_running)
608                                         mod_timer(&dev->vid_timeout,
609                                                   jiffies + (HZ / 10));
610                                 if (dev->vbi_timeout_running)
611                                         mod_timer(&dev->vbi_timeout,
612                                                   jiffies + (HZ / 10));
613                         }
614
615                         if (buf != NULL) {
616                                 if (fbyte & 0x40)
617                                         buf->top_field = 1;
618                                 else
619                                         buf->top_field = 0;
620                         }
621
622                         if (vbi_buf != NULL) {
623                                 if (fbyte & 0x40)
624                                         vbi_buf->top_field = 1;
625                                 else
626                                         vbi_buf->top_field = 0;
627                         }
628
629                         dev->vbi_read = 0;
630                         vbi_dma_q->pos = 0;
631                         dma_q->pos = 0;
632                 }
633
634                 vbi_field_size = dev->vbi_width * dev->vbi_height * 2;
635                 if (dev->vbi_read < vbi_field_size) {
636                         remain  = vbi_field_size - dev->vbi_read;
637                         if (len < remain)
638                                 lencopy = len;
639                         else
640                                 lencopy = remain;
641
642                         if (vbi_buf != NULL)
643                                 au0828_copy_vbi(dev, vbi_dma_q, vbi_buf, p,
644                                                 vbioutp, len);
645
646                         len -= lencopy;
647                         p += lencopy;
648                         dev->vbi_read += lencopy;
649                 }
650
651                 if (dev->vbi_read >= vbi_field_size && buf != NULL)
652                         au0828_copy_video(dev, dma_q, buf, p, outp, len);
653         }
654         return rc;
655 }
656
657 static int
658 buffer_setup(struct videobuf_queue *vq, unsigned int *count,
659              unsigned int *size)
660 {
661         struct au0828_fh *fh = vq->priv_data;
662         *size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
663
664         if (0 == *count)
665                 *count = AU0828_DEF_BUF;
666
667         if (*count < AU0828_MIN_BUF)
668                 *count = AU0828_MIN_BUF;
669         return 0;
670 }
671
672 /* This is called *without* dev->slock held; please keep it that way */
673 static void free_buffer(struct videobuf_queue *vq, struct au0828_buffer *buf)
674 {
675         struct au0828_fh     *fh  = vq->priv_data;
676         struct au0828_dev    *dev = fh->dev;
677         unsigned long flags = 0;
678         if (in_interrupt())
679                 BUG();
680
681         /* We used to wait for the buffer to finish here, but this didn't work
682            because, as we were keeping the state as VIDEOBUF_QUEUED,
683            videobuf_queue_cancel marked it as finished for us.
684            (Also, it could wedge forever if the hardware was misconfigured.)
685
686            This should be safe; by the time we get here, the buffer isn't
687            queued anymore. If we ever start marking the buffers as
688            VIDEOBUF_ACTIVE, it won't be, though.
689         */
690         spin_lock_irqsave(&dev->slock, flags);
691         if (dev->isoc_ctl.buf == buf)
692                 dev->isoc_ctl.buf = NULL;
693         spin_unlock_irqrestore(&dev->slock, flags);
694
695         videobuf_vmalloc_free(&buf->vb);
696         buf->vb.state = VIDEOBUF_NEEDS_INIT;
697 }
698
699 static int
700 buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
701                                                 enum v4l2_field field)
702 {
703         struct au0828_fh     *fh  = vq->priv_data;
704         struct au0828_buffer *buf = container_of(vb, struct au0828_buffer, vb);
705         struct au0828_dev    *dev = fh->dev;
706         int                  rc = 0, urb_init = 0;
707
708         buf->vb.size = (fh->dev->width * fh->dev->height * 16 + 7) >> 3;
709
710         if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
711                 return -EINVAL;
712
713         buf->vb.width  = dev->width;
714         buf->vb.height = dev->height;
715         buf->vb.field  = field;
716
717         if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
718                 rc = videobuf_iolock(vq, &buf->vb, NULL);
719                 if (rc < 0) {
720                         printk(KERN_INFO "videobuf_iolock failed\n");
721                         goto fail;
722                 }
723         }
724
725         if (!dev->isoc_ctl.num_bufs)
726                 urb_init = 1;
727
728         if (urb_init) {
729                 rc = au0828_init_isoc(dev, AU0828_ISO_PACKETS_PER_URB,
730                                       AU0828_MAX_ISO_BUFS, dev->max_pkt_size,
731                                       au0828_isoc_copy);
732                 if (rc < 0) {
733                         printk(KERN_INFO "au0828_init_isoc failed\n");
734                         goto fail;
735                 }
736         }
737
738         buf->vb.state = VIDEOBUF_PREPARED;
739         return 0;
740
741 fail:
742         free_buffer(vq, buf);
743         return rc;
744 }
745
746 static void
747 buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
748 {
749         struct au0828_buffer    *buf     = container_of(vb,
750                                                         struct au0828_buffer,
751                                                         vb);
752         struct au0828_fh        *fh      = vq->priv_data;
753         struct au0828_dev       *dev     = fh->dev;
754         struct au0828_dmaqueue  *vidq    = &dev->vidq;
755
756         buf->vb.state = VIDEOBUF_QUEUED;
757         list_add_tail(&buf->vb.queue, &vidq->active);
758 }
759
760 static void buffer_release(struct videobuf_queue *vq,
761                                 struct videobuf_buffer *vb)
762 {
763         struct au0828_buffer   *buf  = container_of(vb,
764                                                     struct au0828_buffer,
765                                                     vb);
766
767         free_buffer(vq, buf);
768 }
769
770 static struct videobuf_queue_ops au0828_video_qops = {
771         .buf_setup      = buffer_setup,
772         .buf_prepare    = buffer_prepare,
773         .buf_queue      = buffer_queue,
774         .buf_release    = buffer_release,
775 };
776
777 /* ------------------------------------------------------------------
778    V4L2 interface
779    ------------------------------------------------------------------*/
780
781 static int au0828_i2s_init(struct au0828_dev *dev)
782 {
783         /* Enable i2s mode */
784         au0828_writereg(dev, AU0828_AUDIOCTRL_50C, 0x01);
785         return 0;
786 }
787
788 /*
789  * Auvitek au0828 analog stream enable
790  * Please set interface0 to AS5 before enable the stream
791  */
792 static int au0828_analog_stream_enable(struct au0828_dev *d)
793 {
794         dprintk(1, "au0828_analog_stream_enable called\n");
795         au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00);
796         au0828_writereg(d, 0x106, 0x00);
797         /* set x position */
798         au0828_writereg(d, 0x110, 0x00);
799         au0828_writereg(d, 0x111, 0x00);
800         au0828_writereg(d, 0x114, 0xa0);
801         au0828_writereg(d, 0x115, 0x05);
802         /* set y position */
803         au0828_writereg(d, 0x112, 0x00);
804         au0828_writereg(d, 0x113, 0x00);
805         au0828_writereg(d, 0x116, 0xf2);
806         au0828_writereg(d, 0x117, 0x00);
807         au0828_writereg(d, AU0828_SENSORCTRL_100, 0xb3);
808
809         return 0;
810 }
811
812 int au0828_analog_stream_disable(struct au0828_dev *d)
813 {
814         dprintk(1, "au0828_analog_stream_disable called\n");
815         au0828_writereg(d, AU0828_SENSORCTRL_100, 0x0);
816         return 0;
817 }
818
819 static void au0828_analog_stream_reset(struct au0828_dev *dev)
820 {
821         dprintk(1, "au0828_analog_stream_reset called\n");
822         au0828_writereg(dev, AU0828_SENSORCTRL_100, 0x0);
823         mdelay(30);
824         au0828_writereg(dev, AU0828_SENSORCTRL_100, 0xb3);
825 }
826
827 /*
828  * Some operations needs to stop current streaming
829  */
830 static int au0828_stream_interrupt(struct au0828_dev *dev)
831 {
832         int ret = 0;
833
834         dev->stream_state = STREAM_INTERRUPT;
835         if (dev->dev_state == DEV_DISCONNECTED)
836                 return -ENODEV;
837         else if (ret) {
838                 dev->dev_state = DEV_MISCONFIGURED;
839                 dprintk(1, "%s device is misconfigured!\n", __func__);
840                 return ret;
841         }
842         return 0;
843 }
844
845 /*
846  * au0828_release_resources
847  * unregister v4l2 devices
848  */
849 void au0828_analog_unregister(struct au0828_dev *dev)
850 {
851         dprintk(1, "au0828_release_resources called\n");
852         mutex_lock(&au0828_sysfs_lock);
853
854         if (dev->vdev)
855                 video_unregister_device(dev->vdev);
856         if (dev->vbi_dev)
857                 video_unregister_device(dev->vbi_dev);
858
859         mutex_unlock(&au0828_sysfs_lock);
860 }
861
862
863 /* Usage lock check functions */
864 static int res_get(struct au0828_fh *fh, unsigned int bit)
865 {
866         struct au0828_dev    *dev = fh->dev;
867
868         if (fh->resources & bit)
869                 /* have it already allocated */
870                 return 1;
871
872         /* is it free? */
873         if (dev->resources & bit) {
874                 /* no, someone else uses it */
875                 return 0;
876         }
877         /* it's free, grab it */
878         fh->resources  |= bit;
879         dev->resources |= bit;
880         dprintk(1, "res: get %d\n", bit);
881
882         return 1;
883 }
884
885 static int res_check(struct au0828_fh *fh, unsigned int bit)
886 {
887         return fh->resources & bit;
888 }
889
890 static int res_locked(struct au0828_dev *dev, unsigned int bit)
891 {
892         return dev->resources & bit;
893 }
894
895 static void res_free(struct au0828_fh *fh, unsigned int bits)
896 {
897         struct au0828_dev    *dev = fh->dev;
898
899         BUG_ON((fh->resources & bits) != bits);
900
901         fh->resources  &= ~bits;
902         dev->resources &= ~bits;
903         dprintk(1, "res: put %d\n", bits);
904 }
905
906 static int get_ressource(struct au0828_fh *fh)
907 {
908         switch (fh->type) {
909         case V4L2_BUF_TYPE_VIDEO_CAPTURE:
910                 return AU0828_RESOURCE_VIDEO;
911         case V4L2_BUF_TYPE_VBI_CAPTURE:
912                 return AU0828_RESOURCE_VBI;
913         default:
914                 BUG();
915                 return 0;
916         }
917 }
918
919 /* This function ensures that video frames continue to be delivered even if
920    the ITU-656 input isn't receiving any data (thereby preventing applications
921    such as tvtime from hanging) */
922 static void au0828_vid_buffer_timeout(unsigned long data)
923 {
924         struct au0828_dev *dev = (struct au0828_dev *) data;
925         struct au0828_dmaqueue *dma_q = &dev->vidq;
926         struct au0828_buffer *buf;
927         unsigned char *vid_data;
928         unsigned long flags = 0;
929
930         spin_lock_irqsave(&dev->slock, flags);
931
932         buf = dev->isoc_ctl.buf;
933         if (buf != NULL) {
934                 vid_data = videobuf_to_vmalloc(&buf->vb);
935                 memset(vid_data, 0x00, buf->vb.size); /* Blank green frame */
936                 buffer_filled(dev, dma_q, buf);
937         }
938         get_next_buf(dma_q, &buf);
939
940         if (dev->vid_timeout_running == 1)
941                 mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
942
943         spin_unlock_irqrestore(&dev->slock, flags);
944 }
945
946 static void au0828_vbi_buffer_timeout(unsigned long data)
947 {
948         struct au0828_dev *dev = (struct au0828_dev *) data;
949         struct au0828_dmaqueue *dma_q = &dev->vbiq;
950         struct au0828_buffer *buf;
951         unsigned char *vbi_data;
952         unsigned long flags = 0;
953
954         spin_lock_irqsave(&dev->slock, flags);
955
956         buf = dev->isoc_ctl.vbi_buf;
957         if (buf != NULL) {
958                 vbi_data = videobuf_to_vmalloc(&buf->vb);
959                 memset(vbi_data, 0x00, buf->vb.size);
960                 vbi_buffer_filled(dev, dma_q, buf);
961         }
962         vbi_get_next_buf(dma_q, &buf);
963
964         if (dev->vbi_timeout_running == 1)
965                 mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
966         spin_unlock_irqrestore(&dev->slock, flags);
967 }
968
969
970 static int au0828_v4l2_open(struct file *filp)
971 {
972         int ret = 0;
973         struct video_device *vdev = video_devdata(filp);
974         struct au0828_dev *dev = video_drvdata(filp);
975         struct au0828_fh *fh;
976         int type;
977
978         switch (vdev->vfl_type) {
979         case VFL_TYPE_GRABBER:
980                 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
981                 break;
982         case VFL_TYPE_VBI:
983                 type = V4L2_BUF_TYPE_VBI_CAPTURE;
984                 break;
985         default:
986                 return -EINVAL;
987         }
988
989         fh = kzalloc(sizeof(struct au0828_fh), GFP_KERNEL);
990         if (NULL == fh) {
991                 dprintk(1, "Failed allocate au0828_fh struct!\n");
992                 return -ENOMEM;
993         }
994
995         fh->type = type;
996         fh->dev = dev;
997         v4l2_fh_init(&fh->fh, vdev);
998         filp->private_data = fh;
999
1000         if (mutex_lock_interruptible(&dev->lock)) {
1001                 kfree(fh);
1002                 return -ERESTARTSYS;
1003         }
1004         if (dev->users == 0) {
1005                 /* set au0828 interface0 to AS5 here again */
1006                 ret = usb_set_interface(dev->usbdev, 0, 5);
1007                 if (ret < 0) {
1008                         mutex_unlock(&dev->lock);
1009                         printk(KERN_INFO "Au0828 can't set alternate to 5!\n");
1010                         kfree(fh);
1011                         return -EBUSY;
1012                 }
1013
1014                 au0828_analog_stream_enable(dev);
1015                 au0828_analog_stream_reset(dev);
1016
1017                 /* If we were doing ac97 instead of i2s, it would go here...*/
1018                 au0828_i2s_init(dev);
1019
1020                 dev->stream_state = STREAM_OFF;
1021                 dev->dev_state |= DEV_INITIALIZED;
1022         }
1023
1024         dev->users++;
1025         mutex_unlock(&dev->lock);
1026
1027         videobuf_queue_vmalloc_init(&fh->vb_vidq, &au0828_video_qops,
1028                                     NULL, &dev->slock,
1029                                     V4L2_BUF_TYPE_VIDEO_CAPTURE,
1030                                     V4L2_FIELD_INTERLACED,
1031                                     sizeof(struct au0828_buffer), fh,
1032                                     &dev->lock);
1033
1034         /* VBI Setup */
1035         videobuf_queue_vmalloc_init(&fh->vb_vbiq, &au0828_vbi_qops,
1036                                     NULL, &dev->slock,
1037                                     V4L2_BUF_TYPE_VBI_CAPTURE,
1038                                     V4L2_FIELD_SEQ_TB,
1039                                     sizeof(struct au0828_buffer), fh,
1040                                     &dev->lock);
1041         v4l2_fh_add(&fh->fh);
1042         return ret;
1043 }
1044
1045 static int au0828_v4l2_close(struct file *filp)
1046 {
1047         int ret;
1048         struct au0828_fh *fh = filp->private_data;
1049         struct au0828_dev *dev = fh->dev;
1050
1051         v4l2_fh_del(&fh->fh);
1052         v4l2_fh_exit(&fh->fh);
1053         mutex_lock(&dev->lock);
1054         if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1055                 /* Cancel timeout thread in case they didn't call streamoff */
1056                 dev->vid_timeout_running = 0;
1057                 del_timer_sync(&dev->vid_timeout);
1058
1059                 videobuf_stop(&fh->vb_vidq);
1060                 res_free(fh, AU0828_RESOURCE_VIDEO);
1061         }
1062
1063         if (res_check(fh, AU0828_RESOURCE_VBI)) {
1064                 /* Cancel timeout thread in case they didn't call streamoff */
1065                 dev->vbi_timeout_running = 0;
1066                 del_timer_sync(&dev->vbi_timeout);
1067
1068                 videobuf_stop(&fh->vb_vbiq);
1069                 res_free(fh, AU0828_RESOURCE_VBI);
1070         }
1071
1072         if (dev->users == 1 && video_is_registered(video_devdata(filp))) {
1073                 au0828_analog_stream_disable(dev);
1074
1075                 au0828_uninit_isoc(dev);
1076
1077                 /* Save some power by putting tuner to sleep */
1078                 v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
1079                 dev->std_set_in_tuner_core = 0;
1080
1081                 /* When close the device, set the usb intf0 into alt0 to free
1082                    USB bandwidth */
1083                 ret = usb_set_interface(dev->usbdev, 0, 0);
1084                 if (ret < 0)
1085                         printk(KERN_INFO "Au0828 can't set alternate to 0!\n");
1086         }
1087         mutex_unlock(&dev->lock);
1088
1089         videobuf_mmap_free(&fh->vb_vidq);
1090         videobuf_mmap_free(&fh->vb_vbiq);
1091         kfree(fh);
1092         dev->users--;
1093         wake_up_interruptible_nr(&dev->open, 1);
1094         return 0;
1095 }
1096
1097 /* Must be called with dev->lock held */
1098 static void au0828_init_tuner(struct au0828_dev *dev)
1099 {
1100         struct v4l2_frequency f = {
1101                 .frequency = dev->ctrl_freq,
1102                 .type = V4L2_TUNER_ANALOG_TV,
1103         };
1104
1105         if (dev->std_set_in_tuner_core)
1106                 return;
1107         dev->std_set_in_tuner_core = 1;
1108         i2c_gate_ctrl(dev, 1);
1109         /* If we've never sent the standard in tuner core, do so now.
1110            We don't do this at device probe because we don't want to
1111            incur the cost of a firmware load */
1112         v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->std);
1113         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
1114         i2c_gate_ctrl(dev, 0);
1115 }
1116
1117 static ssize_t au0828_v4l2_read(struct file *filp, char __user *buf,
1118                                 size_t count, loff_t *pos)
1119 {
1120         struct au0828_fh *fh = filp->private_data;
1121         struct au0828_dev *dev = fh->dev;
1122         int rc;
1123
1124         rc = check_dev(dev);
1125         if (rc < 0)
1126                 return rc;
1127
1128         if (mutex_lock_interruptible(&dev->lock))
1129                 return -ERESTARTSYS;
1130         au0828_init_tuner(dev);
1131         mutex_unlock(&dev->lock);
1132
1133         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1134                 if (res_locked(dev, AU0828_RESOURCE_VIDEO))
1135                         return -EBUSY;
1136
1137                 return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
1138                                         filp->f_flags & O_NONBLOCK);
1139         }
1140
1141         if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1142                 if (!res_get(fh, AU0828_RESOURCE_VBI))
1143                         return -EBUSY;
1144
1145                 if (dev->vbi_timeout_running == 0) {
1146                         /* Handle case where caller tries to read without
1147                            calling streamon first */
1148                         dev->vbi_timeout_running = 1;
1149                         mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1150                 }
1151
1152                 return videobuf_read_stream(&fh->vb_vbiq, buf, count, pos, 0,
1153                                             filp->f_flags & O_NONBLOCK);
1154         }
1155
1156         return 0;
1157 }
1158
1159 static unsigned int au0828_v4l2_poll(struct file *filp, poll_table *wait)
1160 {
1161         struct au0828_fh *fh = filp->private_data;
1162         struct au0828_dev *dev = fh->dev;
1163         unsigned long req_events = poll_requested_events(wait);
1164         unsigned int res;
1165
1166         if (check_dev(dev) < 0)
1167                 return POLLERR;
1168
1169         res = v4l2_ctrl_poll(filp, wait);
1170         if (!(req_events & (POLLIN | POLLRDNORM)))
1171                 return res;
1172
1173         if (mutex_lock_interruptible(&dev->lock))
1174                 return -ERESTARTSYS;
1175         au0828_init_tuner(dev);
1176         mutex_unlock(&dev->lock);
1177
1178         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1179                 if (!res_get(fh, AU0828_RESOURCE_VIDEO))
1180                         return POLLERR;
1181                 return res | videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1182         }
1183         if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1184                 if (!res_get(fh, AU0828_RESOURCE_VBI))
1185                         return POLLERR;
1186                 return res | videobuf_poll_stream(filp, &fh->vb_vbiq, wait);
1187         }
1188         return POLLERR;
1189 }
1190
1191 static int au0828_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
1192 {
1193         struct au0828_fh *fh    = filp->private_data;
1194         struct au0828_dev *dev   = fh->dev;
1195         int              rc;
1196
1197         rc = check_dev(dev);
1198         if (rc < 0)
1199                 return rc;
1200
1201         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1202                 rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1203         else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1204                 rc = videobuf_mmap_mapper(&fh->vb_vbiq, vma);
1205
1206         return rc;
1207 }
1208
1209 static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd,
1210                              struct v4l2_format *format)
1211 {
1212         int ret;
1213         int width = format->fmt.pix.width;
1214         int height = format->fmt.pix.height;
1215
1216         /* If they are demanding a format other than the one we support,
1217            bail out (tvtime asks for UYVY and then retries with YUYV) */
1218         if (format->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
1219                 return -EINVAL;
1220
1221         /* format->fmt.pix.width only support 720 and height 480 */
1222         if (width != 720)
1223                 width = 720;
1224         if (height != 480)
1225                 height = 480;
1226
1227         format->fmt.pix.width = width;
1228         format->fmt.pix.height = height;
1229         format->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1230         format->fmt.pix.bytesperline = width * 2;
1231         format->fmt.pix.sizeimage = width * height * 2;
1232         format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
1233         format->fmt.pix.field = V4L2_FIELD_INTERLACED;
1234         format->fmt.pix.priv = 0;
1235
1236         if (cmd == VIDIOC_TRY_FMT)
1237                 return 0;
1238
1239         /* maybe set new image format, driver current only support 720*480 */
1240         dev->width = width;
1241         dev->height = height;
1242         dev->frame_size = width * height * 2;
1243         dev->field_size = width * height;
1244         dev->bytesperline = width * 2;
1245
1246         if (dev->stream_state == STREAM_ON) {
1247                 dprintk(1, "VIDIOC_SET_FMT: interrupting stream!\n");
1248                 ret = au0828_stream_interrupt(dev);
1249                 if (ret != 0) {
1250                         dprintk(1, "error interrupting video stream!\n");
1251                         return ret;
1252                 }
1253         }
1254
1255         /* set au0828 interface0 to AS5 here again */
1256         ret = usb_set_interface(dev->usbdev, 0, 5);
1257         if (ret < 0) {
1258                 printk(KERN_INFO "Au0828 can't set alt setting to 5!\n");
1259                 return -EBUSY;
1260         }
1261
1262         au0828_analog_stream_enable(dev);
1263
1264         return 0;
1265 }
1266
1267
1268 static int vidioc_querycap(struct file *file, void  *priv,
1269                            struct v4l2_capability *cap)
1270 {
1271         struct video_device *vdev = video_devdata(file);
1272         struct au0828_fh *fh = priv;
1273         struct au0828_dev *dev = fh->dev;
1274
1275         strlcpy(cap->driver, "au0828", sizeof(cap->driver));
1276         strlcpy(cap->card, dev->board.name, sizeof(cap->card));
1277         usb_make_path(dev->usbdev, cap->bus_info, sizeof(cap->bus_info));
1278
1279         /* set the device capabilities */
1280         cap->device_caps = V4L2_CAP_AUDIO |
1281                 V4L2_CAP_READWRITE |
1282                 V4L2_CAP_STREAMING |
1283                 V4L2_CAP_TUNER;
1284         if (vdev->vfl_type == VFL_TYPE_GRABBER)
1285                 cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
1286         else
1287                 cap->device_caps |= V4L2_CAP_VBI_CAPTURE;
1288         cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS |
1289                 V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VIDEO_CAPTURE;
1290         return 0;
1291 }
1292
1293 static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1294                                         struct v4l2_fmtdesc *f)
1295 {
1296         if (f->index)
1297                 return -EINVAL;
1298
1299         f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1300         strcpy(f->description, "Packed YUV2");
1301
1302         f->flags = 0;
1303         f->pixelformat = V4L2_PIX_FMT_UYVY;
1304
1305         return 0;
1306 }
1307
1308 static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1309                                         struct v4l2_format *f)
1310 {
1311         struct au0828_fh *fh  = priv;
1312         struct au0828_dev *dev = fh->dev;
1313
1314         f->fmt.pix.width = dev->width;
1315         f->fmt.pix.height = dev->height;
1316         f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
1317         f->fmt.pix.bytesperline = dev->bytesperline;
1318         f->fmt.pix.sizeimage = dev->frame_size;
1319         f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; /* NTSC/PAL */
1320         f->fmt.pix.field = V4L2_FIELD_INTERLACED;
1321         f->fmt.pix.priv = 0;
1322         return 0;
1323 }
1324
1325 static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1326                                   struct v4l2_format *f)
1327 {
1328         struct au0828_fh *fh  = priv;
1329         struct au0828_dev *dev = fh->dev;
1330
1331         return au0828_set_format(dev, VIDIOC_TRY_FMT, f);
1332 }
1333
1334 static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1335                                 struct v4l2_format *f)
1336 {
1337         struct au0828_fh *fh  = priv;
1338         struct au0828_dev *dev = fh->dev;
1339         int rc;
1340
1341         rc = check_dev(dev);
1342         if (rc < 0)
1343                 return rc;
1344
1345         if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1346                 printk(KERN_INFO "%s queue busy\n", __func__);
1347                 rc = -EBUSY;
1348                 goto out;
1349         }
1350
1351         rc = au0828_set_format(dev, VIDIOC_S_FMT, f);
1352 out:
1353         return rc;
1354 }
1355
1356 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
1357 {
1358         struct au0828_fh *fh = priv;
1359         struct au0828_dev *dev = fh->dev;
1360
1361         dev->std = norm;
1362
1363         au0828_init_tuner(dev);
1364
1365         i2c_gate_ctrl(dev, 1);
1366
1367         /* FIXME: when we support something other than NTSC, we are going to
1368            have to make the au0828 bridge adjust the size of its capture
1369            buffer, which is currently hardcoded at 720x480 */
1370
1371         v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, norm);
1372
1373         i2c_gate_ctrl(dev, 0);
1374
1375         return 0;
1376 }
1377
1378 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *norm)
1379 {
1380         struct au0828_fh *fh = priv;
1381         struct au0828_dev *dev = fh->dev;
1382
1383         *norm = dev->std;
1384         return 0;
1385 }
1386
1387 static int vidioc_enum_input(struct file *file, void *priv,
1388                                 struct v4l2_input *input)
1389 {
1390         struct au0828_fh *fh = priv;
1391         struct au0828_dev *dev = fh->dev;
1392         unsigned int tmp;
1393
1394         static const char *inames[] = {
1395                 [AU0828_VMUX_UNDEFINED] = "Undefined",
1396                 [AU0828_VMUX_COMPOSITE] = "Composite",
1397                 [AU0828_VMUX_SVIDEO] = "S-Video",
1398                 [AU0828_VMUX_CABLE] = "Cable TV",
1399                 [AU0828_VMUX_TELEVISION] = "Television",
1400                 [AU0828_VMUX_DVB] = "DVB",
1401                 [AU0828_VMUX_DEBUG] = "tv debug"
1402         };
1403
1404         tmp = input->index;
1405
1406         if (tmp >= AU0828_MAX_INPUT)
1407                 return -EINVAL;
1408         if (AUVI_INPUT(tmp).type == 0)
1409                 return -EINVAL;
1410
1411         input->index = tmp;
1412         strcpy(input->name, inames[AUVI_INPUT(tmp).type]);
1413         if ((AUVI_INPUT(tmp).type == AU0828_VMUX_TELEVISION) ||
1414             (AUVI_INPUT(tmp).type == AU0828_VMUX_CABLE)) {
1415                 input->type |= V4L2_INPUT_TYPE_TUNER;
1416                 input->audioset = 1;
1417         } else {
1418                 input->type |= V4L2_INPUT_TYPE_CAMERA;
1419                 input->audioset = 2;
1420         }
1421
1422         input->std = dev->vdev->tvnorms;
1423
1424         return 0;
1425 }
1426
1427 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1428 {
1429         struct au0828_fh *fh = priv;
1430         struct au0828_dev *dev = fh->dev;
1431         *i = dev->ctrl_input;
1432         return 0;
1433 }
1434
1435 static void au0828_s_input(struct au0828_dev *dev, int index)
1436 {
1437         int i;
1438
1439         switch (AUVI_INPUT(index).type) {
1440         case AU0828_VMUX_SVIDEO:
1441                 dev->input_type = AU0828_VMUX_SVIDEO;
1442                 dev->ctrl_ainput = 1;
1443                 break;
1444         case AU0828_VMUX_COMPOSITE:
1445                 dev->input_type = AU0828_VMUX_COMPOSITE;
1446                 dev->ctrl_ainput = 1;
1447                 break;
1448         case AU0828_VMUX_TELEVISION:
1449                 dev->input_type = AU0828_VMUX_TELEVISION;
1450                 dev->ctrl_ainput = 0;
1451                 break;
1452         default:
1453                 dprintk(1, "unknown input type set [%d]\n",
1454                         AUVI_INPUT(index).type);
1455                 break;
1456         }
1457
1458         v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
1459                         AUVI_INPUT(index).vmux, 0, 0);
1460
1461         for (i = 0; i < AU0828_MAX_INPUT; i++) {
1462                 int enable = 0;
1463                 if (AUVI_INPUT(i).audio_setup == NULL)
1464                         continue;
1465
1466                 if (i == index)
1467                         enable = 1;
1468                 else
1469                         enable = 0;
1470                 if (enable) {
1471                         (AUVI_INPUT(i).audio_setup)(dev, enable);
1472                 } else {
1473                         /* Make sure we leave it turned on if some
1474                            other input is routed to this callback */
1475                         if ((AUVI_INPUT(i).audio_setup) !=
1476                             ((AUVI_INPUT(index).audio_setup))) {
1477                                 (AUVI_INPUT(i).audio_setup)(dev, enable);
1478                         }
1479                 }
1480         }
1481
1482         v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
1483                         AUVI_INPUT(index).amux, 0, 0);
1484 }
1485
1486 static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
1487 {
1488         struct au0828_fh *fh = priv;
1489         struct au0828_dev *dev = fh->dev;
1490
1491         dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
1492                 index);
1493         if (index >= AU0828_MAX_INPUT)
1494                 return -EINVAL;
1495         if (AUVI_INPUT(index).type == 0)
1496                 return -EINVAL;
1497         dev->ctrl_input = index;
1498         au0828_s_input(dev, index);
1499         return 0;
1500 }
1501
1502 static int vidioc_enumaudio(struct file *file, void *priv, struct v4l2_audio *a)
1503 {
1504         if (a->index > 1)
1505                 return -EINVAL;
1506
1507         if (a->index == 0)
1508                 strcpy(a->name, "Television");
1509         else
1510                 strcpy(a->name, "Line in");
1511
1512         a->capability = V4L2_AUDCAP_STEREO;
1513         return 0;
1514 }
1515
1516 static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1517 {
1518         struct au0828_fh *fh = priv;
1519         struct au0828_dev *dev = fh->dev;
1520
1521         a->index = dev->ctrl_ainput;
1522         if (a->index == 0)
1523                 strcpy(a->name, "Television");
1524         else
1525                 strcpy(a->name, "Line in");
1526
1527         a->capability = V4L2_AUDCAP_STEREO;
1528         return 0;
1529 }
1530
1531 static int vidioc_s_audio(struct file *file, void *priv, const struct v4l2_audio *a)
1532 {
1533         struct au0828_fh *fh = priv;
1534         struct au0828_dev *dev = fh->dev;
1535
1536         if (a->index != dev->ctrl_ainput)
1537                 return -EINVAL;
1538         return 0;
1539 }
1540
1541 static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1542 {
1543         struct au0828_fh *fh = priv;
1544         struct au0828_dev *dev = fh->dev;
1545
1546         if (t->index != 0)
1547                 return -EINVAL;
1548
1549         strcpy(t->name, "Auvitek tuner");
1550
1551         au0828_init_tuner(dev);
1552         i2c_gate_ctrl(dev, 1);
1553         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1554         i2c_gate_ctrl(dev, 0);
1555         return 0;
1556 }
1557
1558 static int vidioc_s_tuner(struct file *file, void *priv,
1559                                 const struct v4l2_tuner *t)
1560 {
1561         struct au0828_fh *fh = priv;
1562         struct au0828_dev *dev = fh->dev;
1563
1564         if (t->index != 0)
1565                 return -EINVAL;
1566
1567         au0828_init_tuner(dev);
1568         i2c_gate_ctrl(dev, 1);
1569         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1570         i2c_gate_ctrl(dev, 0);
1571
1572         dprintk(1, "VIDIOC_S_TUNER: signal = %x, afc = %x\n", t->signal,
1573                 t->afc);
1574
1575         return 0;
1576
1577 }
1578
1579 static int vidioc_g_frequency(struct file *file, void *priv,
1580                                 struct v4l2_frequency *freq)
1581 {
1582         struct au0828_fh *fh = priv;
1583         struct au0828_dev *dev = fh->dev;
1584
1585         if (freq->tuner != 0)
1586                 return -EINVAL;
1587         freq->frequency = dev->ctrl_freq;
1588         return 0;
1589 }
1590
1591 static int vidioc_s_frequency(struct file *file, void *priv,
1592                                 const struct v4l2_frequency *freq)
1593 {
1594         struct au0828_fh *fh = priv;
1595         struct au0828_dev *dev = fh->dev;
1596         struct v4l2_frequency new_freq = *freq;
1597
1598         if (freq->tuner != 0)
1599                 return -EINVAL;
1600
1601         au0828_init_tuner(dev);
1602         i2c_gate_ctrl(dev, 1);
1603
1604         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, freq);
1605         /* Get the actual set (and possibly clamped) frequency */
1606         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_frequency, &new_freq);
1607         dev->ctrl_freq = new_freq.frequency;
1608
1609         i2c_gate_ctrl(dev, 0);
1610
1611         au0828_analog_stream_reset(dev);
1612
1613         return 0;
1614 }
1615
1616
1617 /* RAW VBI ioctls */
1618
1619 static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1620                                 struct v4l2_format *format)
1621 {
1622         struct au0828_fh      *fh  = priv;
1623         struct au0828_dev     *dev = fh->dev;
1624
1625         format->fmt.vbi.samples_per_line = dev->vbi_width;
1626         format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1627         format->fmt.vbi.offset = 0;
1628         format->fmt.vbi.flags = 0;
1629         format->fmt.vbi.sampling_rate = 6750000 * 4 / 2;
1630
1631         format->fmt.vbi.count[0] = dev->vbi_height;
1632         format->fmt.vbi.count[1] = dev->vbi_height;
1633         format->fmt.vbi.start[0] = 21;
1634         format->fmt.vbi.start[1] = 284;
1635         memset(format->fmt.vbi.reserved, 0, sizeof(format->fmt.vbi.reserved));
1636
1637         return 0;
1638 }
1639
1640 static int vidioc_cropcap(struct file *file, void *priv,
1641                           struct v4l2_cropcap *cc)
1642 {
1643         struct au0828_fh *fh = priv;
1644         struct au0828_dev *dev = fh->dev;
1645
1646         if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1647                 return -EINVAL;
1648
1649         cc->bounds.left = 0;
1650         cc->bounds.top = 0;
1651         cc->bounds.width = dev->width;
1652         cc->bounds.height = dev->height;
1653
1654         cc->defrect = cc->bounds;
1655
1656         cc->pixelaspect.numerator = 54;
1657         cc->pixelaspect.denominator = 59;
1658
1659         return 0;
1660 }
1661
1662 static int vidioc_streamon(struct file *file, void *priv,
1663                            enum v4l2_buf_type type)
1664 {
1665         struct au0828_fh      *fh  = priv;
1666         struct au0828_dev     *dev = fh->dev;
1667         int                   rc = -EINVAL;
1668
1669         rc = check_dev(dev);
1670         if (rc < 0)
1671                 return rc;
1672
1673         if (unlikely(type != fh->type))
1674                 return -EINVAL;
1675
1676         dprintk(1, "vidioc_streamon fh=%p t=%d fh->res=%d dev->res=%d\n",
1677                 fh, type, fh->resources, dev->resources);
1678
1679         if (unlikely(!res_get(fh, get_ressource(fh))))
1680                 return -EBUSY;
1681
1682         au0828_init_tuner(dev);
1683         if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1684                 au0828_analog_stream_enable(dev);
1685                 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 1);
1686         }
1687
1688         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1689                 rc = videobuf_streamon(&fh->vb_vidq);
1690                 dev->vid_timeout_running = 1;
1691                 mod_timer(&dev->vid_timeout, jiffies + (HZ / 10));
1692         } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1693                 rc = videobuf_streamon(&fh->vb_vbiq);
1694                 dev->vbi_timeout_running = 1;
1695                 mod_timer(&dev->vbi_timeout, jiffies + (HZ / 10));
1696         }
1697
1698         return rc;
1699 }
1700
1701 static int vidioc_streamoff(struct file *file, void *priv,
1702                             enum v4l2_buf_type type)
1703 {
1704         struct au0828_fh      *fh  = priv;
1705         struct au0828_dev     *dev = fh->dev;
1706         int                   rc;
1707         int                   i;
1708
1709         rc = check_dev(dev);
1710         if (rc < 0)
1711                 return rc;
1712
1713         if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1714             fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)
1715                 return -EINVAL;
1716         if (type != fh->type)
1717                 return -EINVAL;
1718
1719         dprintk(1, "vidioc_streamoff fh=%p t=%d fh->res=%d dev->res=%d\n",
1720                 fh, type, fh->resources, dev->resources);
1721
1722         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1723                 dev->vid_timeout_running = 0;
1724                 del_timer_sync(&dev->vid_timeout);
1725
1726                 v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
1727                 rc = au0828_stream_interrupt(dev);
1728                 if (rc != 0)
1729                         return rc;
1730
1731                 for (i = 0; i < AU0828_MAX_INPUT; i++) {
1732                         if (AUVI_INPUT(i).audio_setup == NULL)
1733                                 continue;
1734                         (AUVI_INPUT(i).audio_setup)(dev, 0);
1735                 }
1736
1737                 if (res_check(fh, AU0828_RESOURCE_VIDEO)) {
1738                         videobuf_streamoff(&fh->vb_vidq);
1739                         res_free(fh, AU0828_RESOURCE_VIDEO);
1740                 }
1741         } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1742                 dev->vbi_timeout_running = 0;
1743                 del_timer_sync(&dev->vbi_timeout);
1744
1745                 if (res_check(fh, AU0828_RESOURCE_VBI)) {
1746                         videobuf_streamoff(&fh->vb_vbiq);
1747                         res_free(fh, AU0828_RESOURCE_VBI);
1748                 }
1749         }
1750
1751         return 0;
1752 }
1753
1754 #ifdef CONFIG_VIDEO_ADV_DEBUG
1755 static int vidioc_g_register(struct file *file, void *priv,
1756                              struct v4l2_dbg_register *reg)
1757 {
1758         struct au0828_fh *fh = priv;
1759         struct au0828_dev *dev = fh->dev;
1760
1761         reg->val = au0828_read(dev, reg->reg);
1762         reg->size = 1;
1763         return 0;
1764 }
1765
1766 static int vidioc_s_register(struct file *file, void *priv,
1767                              const struct v4l2_dbg_register *reg)
1768 {
1769         struct au0828_fh *fh = priv;
1770         struct au0828_dev *dev = fh->dev;
1771
1772         return au0828_writereg(dev, reg->reg, reg->val);
1773 }
1774 #endif
1775
1776 static int vidioc_log_status(struct file *file, void *fh)
1777 {
1778         struct video_device *vdev = video_devdata(file);
1779
1780         v4l2_ctrl_log_status(file, fh);
1781         v4l2_device_call_all(vdev->v4l2_dev, 0, core, log_status);
1782         return 0;
1783 }
1784
1785 static int vidioc_reqbufs(struct file *file, void *priv,
1786                           struct v4l2_requestbuffers *rb)
1787 {
1788         struct au0828_fh *fh = priv;
1789         struct au0828_dev *dev = fh->dev;
1790         int rc;
1791
1792         rc = check_dev(dev);
1793         if (rc < 0)
1794                 return rc;
1795
1796         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1797                 rc = videobuf_reqbufs(&fh->vb_vidq, rb);
1798         else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1799                 rc = videobuf_reqbufs(&fh->vb_vbiq, rb);
1800
1801         return rc;
1802 }
1803
1804 static int vidioc_querybuf(struct file *file, void *priv,
1805                            struct v4l2_buffer *b)
1806 {
1807         struct au0828_fh *fh = priv;
1808         struct au0828_dev *dev = fh->dev;
1809         int rc;
1810
1811         rc = check_dev(dev);
1812         if (rc < 0)
1813                 return rc;
1814
1815         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1816                 rc = videobuf_querybuf(&fh->vb_vidq, b);
1817         else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1818                 rc = videobuf_querybuf(&fh->vb_vbiq, b);
1819
1820         return rc;
1821 }
1822
1823 static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1824 {
1825         struct au0828_fh *fh = priv;
1826         struct au0828_dev *dev = fh->dev;
1827         int rc;
1828
1829         rc = check_dev(dev);
1830         if (rc < 0)
1831                 return rc;
1832
1833         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1834                 rc = videobuf_qbuf(&fh->vb_vidq, b);
1835         else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1836                 rc = videobuf_qbuf(&fh->vb_vbiq, b);
1837
1838         return rc;
1839 }
1840
1841 static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1842 {
1843         struct au0828_fh *fh = priv;
1844         struct au0828_dev *dev = fh->dev;
1845         int rc;
1846
1847         rc = check_dev(dev);
1848         if (rc < 0)
1849                 return rc;
1850
1851         /* Workaround for a bug in the au0828 hardware design that sometimes
1852            results in the colorspace being inverted */
1853         if (dev->greenscreen_detected == 1) {
1854                 dprintk(1, "Detected green frame.  Resetting stream...\n");
1855                 au0828_analog_stream_reset(dev);
1856                 dev->greenscreen_detected = 0;
1857         }
1858
1859         if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1860                 rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1861         else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1862                 rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK);
1863
1864         return rc;
1865 }
1866
1867 static struct v4l2_file_operations au0828_v4l_fops = {
1868         .owner      = THIS_MODULE,
1869         .open       = au0828_v4l2_open,
1870         .release    = au0828_v4l2_close,
1871         .read       = au0828_v4l2_read,
1872         .poll       = au0828_v4l2_poll,
1873         .mmap       = au0828_v4l2_mmap,
1874         .unlocked_ioctl = video_ioctl2,
1875 };
1876
1877 static const struct v4l2_ioctl_ops video_ioctl_ops = {
1878         .vidioc_querycap            = vidioc_querycap,
1879         .vidioc_enum_fmt_vid_cap    = vidioc_enum_fmt_vid_cap,
1880         .vidioc_g_fmt_vid_cap       = vidioc_g_fmt_vid_cap,
1881         .vidioc_try_fmt_vid_cap     = vidioc_try_fmt_vid_cap,
1882         .vidioc_s_fmt_vid_cap       = vidioc_s_fmt_vid_cap,
1883         .vidioc_g_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1884         .vidioc_try_fmt_vbi_cap     = vidioc_g_fmt_vbi_cap,
1885         .vidioc_s_fmt_vbi_cap       = vidioc_g_fmt_vbi_cap,
1886         .vidioc_enumaudio           = vidioc_enumaudio,
1887         .vidioc_g_audio             = vidioc_g_audio,
1888         .vidioc_s_audio             = vidioc_s_audio,
1889         .vidioc_cropcap             = vidioc_cropcap,
1890         .vidioc_reqbufs             = vidioc_reqbufs,
1891         .vidioc_querybuf            = vidioc_querybuf,
1892         .vidioc_qbuf                = vidioc_qbuf,
1893         .vidioc_dqbuf               = vidioc_dqbuf,
1894         .vidioc_s_std               = vidioc_s_std,
1895         .vidioc_g_std               = vidioc_g_std,
1896         .vidioc_enum_input          = vidioc_enum_input,
1897         .vidioc_g_input             = vidioc_g_input,
1898         .vidioc_s_input             = vidioc_s_input,
1899         .vidioc_streamon            = vidioc_streamon,
1900         .vidioc_streamoff           = vidioc_streamoff,
1901         .vidioc_g_tuner             = vidioc_g_tuner,
1902         .vidioc_s_tuner             = vidioc_s_tuner,
1903         .vidioc_g_frequency         = vidioc_g_frequency,
1904         .vidioc_s_frequency         = vidioc_s_frequency,
1905 #ifdef CONFIG_VIDEO_ADV_DEBUG
1906         .vidioc_g_register          = vidioc_g_register,
1907         .vidioc_s_register          = vidioc_s_register,
1908 #endif
1909         .vidioc_log_status          = vidioc_log_status,
1910         .vidioc_subscribe_event     = v4l2_ctrl_subscribe_event,
1911         .vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
1912 };
1913
1914 static const struct video_device au0828_video_template = {
1915         .fops                       = &au0828_v4l_fops,
1916         .release                    = video_device_release,
1917         .ioctl_ops                  = &video_ioctl_ops,
1918         .tvnorms                    = V4L2_STD_NTSC_M,
1919 };
1920
1921 /**************************************************************************/
1922
1923 int au0828_analog_register(struct au0828_dev *dev,
1924                            struct usb_interface *interface)
1925 {
1926         int retval = -ENOMEM;
1927         struct usb_host_interface *iface_desc;
1928         struct usb_endpoint_descriptor *endpoint;
1929         int i, ret;
1930
1931         dprintk(1, "au0828_analog_register called!\n");
1932
1933         /* set au0828 usb interface0 to as5 */
1934         retval = usb_set_interface(dev->usbdev,
1935                         interface->cur_altsetting->desc.bInterfaceNumber, 5);
1936         if (retval != 0) {
1937                 printk(KERN_INFO "Failure setting usb interface0 to as5\n");
1938                 return retval;
1939         }
1940
1941         /* Figure out which endpoint has the isoc interface */
1942         iface_desc = interface->cur_altsetting;
1943         for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
1944                 endpoint = &iface_desc->endpoint[i].desc;
1945                 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
1946                      == USB_DIR_IN) &&
1947                     ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
1948                      == USB_ENDPOINT_XFER_ISOC)) {
1949
1950                         /* we find our isoc in endpoint */
1951                         u16 tmp = le16_to_cpu(endpoint->wMaxPacketSize);
1952                         dev->max_pkt_size = (tmp & 0x07ff) *
1953                                 (((tmp & 0x1800) >> 11) + 1);
1954                         dev->isoc_in_endpointaddr = endpoint->bEndpointAddress;
1955                 }
1956         }
1957         if (!(dev->isoc_in_endpointaddr)) {
1958                 printk(KERN_INFO "Could not locate isoc endpoint\n");
1959                 kfree(dev);
1960                 return -ENODEV;
1961         }
1962
1963         init_waitqueue_head(&dev->open);
1964         spin_lock_init(&dev->slock);
1965
1966         /* init video dma queues */
1967         INIT_LIST_HEAD(&dev->vidq.active);
1968         INIT_LIST_HEAD(&dev->vidq.queued);
1969         INIT_LIST_HEAD(&dev->vbiq.active);
1970         INIT_LIST_HEAD(&dev->vbiq.queued);
1971
1972         dev->vid_timeout.function = au0828_vid_buffer_timeout;
1973         dev->vid_timeout.data = (unsigned long) dev;
1974         init_timer(&dev->vid_timeout);
1975
1976         dev->vbi_timeout.function = au0828_vbi_buffer_timeout;
1977         dev->vbi_timeout.data = (unsigned long) dev;
1978         init_timer(&dev->vbi_timeout);
1979
1980         dev->width = NTSC_STD_W;
1981         dev->height = NTSC_STD_H;
1982         dev->field_size = dev->width * dev->height;
1983         dev->frame_size = dev->field_size << 1;
1984         dev->bytesperline = dev->width << 1;
1985         dev->vbi_width = 720;
1986         dev->vbi_height = 1;
1987         dev->ctrl_ainput = 0;
1988         dev->ctrl_freq = 960;
1989         dev->std = V4L2_STD_NTSC_M;
1990         au0828_s_input(dev, 0);
1991
1992         /* allocate and fill v4l2 video struct */
1993         dev->vdev = video_device_alloc();
1994         if (NULL == dev->vdev) {
1995                 dprintk(1, "Can't allocate video_device.\n");
1996                 return -ENOMEM;
1997         }
1998
1999         /* allocate the VBI struct */
2000         dev->vbi_dev = video_device_alloc();
2001         if (NULL == dev->vbi_dev) {
2002                 dprintk(1, "Can't allocate vbi_device.\n");
2003                 ret = -ENOMEM;
2004                 goto err_vdev;
2005         }
2006
2007         /* Fill the video capture device struct */
2008         *dev->vdev = au0828_video_template;
2009         dev->vdev->v4l2_dev = &dev->v4l2_dev;
2010         dev->vdev->lock = &dev->lock;
2011         set_bit(V4L2_FL_USE_FH_PRIO, &dev->vdev->flags);
2012         strcpy(dev->vdev->name, "au0828a video");
2013
2014         /* Setup the VBI device */
2015         *dev->vbi_dev = au0828_video_template;
2016         dev->vbi_dev->v4l2_dev = &dev->v4l2_dev;
2017         dev->vbi_dev->lock = &dev->lock;
2018         set_bit(V4L2_FL_USE_FH_PRIO, &dev->vbi_dev->flags);
2019         strcpy(dev->vbi_dev->name, "au0828a vbi");
2020
2021         /* Register the v4l2 device */
2022         video_set_drvdata(dev->vdev, dev);
2023         retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1);
2024         if (retval != 0) {
2025                 dprintk(1, "unable to register video device (error = %d).\n",
2026                         retval);
2027                 ret = -ENODEV;
2028                 goto err_vbi_dev;
2029         }
2030
2031         /* Register the vbi device */
2032         video_set_drvdata(dev->vbi_dev, dev);
2033         retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1);
2034         if (retval != 0) {
2035                 dprintk(1, "unable to register vbi device (error = %d).\n",
2036                         retval);
2037                 ret = -ENODEV;
2038                 goto err_vbi_dev;
2039         }
2040
2041         dprintk(1, "%s completed!\n", __func__);
2042
2043         return 0;
2044
2045 err_vbi_dev:
2046         video_device_release(dev->vbi_dev);
2047 err_vdev:
2048         video_device_release(dev->vdev);
2049         return ret;
2050 }
2051