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