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