linux/drivers/media/video/tm6000/tm6000-video.c
<<
>>
Prefs
   1/*
   2 *   tm6000-video.c - driver for TM5600/TM6000/TM6010 USB video capture devices
   3 *
   4 *  Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org>
   5 *
   6 *  Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com>
   7 *      - Fixed module load/unload
   8 *
   9 *  This program is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License as published by
  11 *  the Free Software Foundation version 2
  12 *
  13 *  This program is distributed in the hope that it will be useful,
  14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 *  GNU General Public License for more details.
  17 *
  18 *  You should have received a copy of the GNU General Public License
  19 *  along with this program; if not, write to the Free Software
  20 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21 */
  22
  23#include <linux/module.h>
  24#include <linux/delay.h>
  25#include <linux/errno.h>
  26#include <linux/fs.h>
  27#include <linux/kernel.h>
  28#include <linux/slab.h>
  29#include <linux/mm.h>
  30#include <linux/ioport.h>
  31#include <linux/init.h>
  32#include <linux/sched.h>
  33#include <linux/random.h>
  34#include <linux/usb.h>
  35#include <linux/videodev2.h>
  36#include <media/v4l2-ioctl.h>
  37#include <media/tuner.h>
  38#include <linux/interrupt.h>
  39#include <linux/kthread.h>
  40#include <linux/highmem.h>
  41#include <linux/freezer.h>
  42
  43#include "tm6000-regs.h"
  44#include "tm6000.h"
  45
  46#define BUFFER_TIMEOUT     msecs_to_jiffies(2000)  /* 2 seconds */
  47
  48/* Limits minimum and default number of buffers */
  49#define TM6000_MIN_BUF 4
  50#define TM6000_DEF_BUF 8
  51
  52#define TM6000_MAX_ISO_PACKETS  46      /* Max number of ISO packets */
  53
  54/* Declare static vars that will be used as parameters */
  55static unsigned int vid_limit = 16;     /* Video memory limit, in Mb */
  56static int video_nr = -1;               /* /dev/videoN, -1 for autodetect */
  57static int radio_nr = -1;               /* /dev/radioN, -1 for autodetect */
  58
  59/* Debug level */
  60int tm6000_debug;
  61EXPORT_SYMBOL_GPL(tm6000_debug);
  62
  63static const struct v4l2_queryctrl no_ctrl = {
  64        .name  = "42",
  65        .flags = V4L2_CTRL_FLAG_DISABLED,
  66};
  67
  68/* supported controls */
  69static struct v4l2_queryctrl tm6000_qctrl[] = {
  70        {
  71                .id            = V4L2_CID_BRIGHTNESS,
  72                .type          = V4L2_CTRL_TYPE_INTEGER,
  73                .name          = "Brightness",
  74                .minimum       = 0,
  75                .maximum       = 255,
  76                .step          = 1,
  77                .default_value = 54,
  78                .flags         = 0,
  79        }, {
  80                .id            = V4L2_CID_CONTRAST,
  81                .type          = V4L2_CTRL_TYPE_INTEGER,
  82                .name          = "Contrast",
  83                .minimum       = 0,
  84                .maximum       = 255,
  85                .step          = 0x1,
  86                .default_value = 119,
  87                .flags         = 0,
  88        }, {
  89                .id            = V4L2_CID_SATURATION,
  90                .type          = V4L2_CTRL_TYPE_INTEGER,
  91                .name          = "Saturation",
  92                .minimum       = 0,
  93                .maximum       = 255,
  94                .step          = 0x1,
  95                .default_value = 112,
  96                .flags         = 0,
  97        }, {
  98                .id            = V4L2_CID_HUE,
  99                .type          = V4L2_CTRL_TYPE_INTEGER,
 100                .name          = "Hue",
 101                .minimum       = -128,
 102                .maximum       = 127,
 103                .step          = 0x1,
 104                .default_value = 0,
 105                .flags         = 0,
 106        },
 107                /* --- audio --- */
 108        {
 109                .id            = V4L2_CID_AUDIO_MUTE,
 110                .name          = "Mute",
 111                .minimum       = 0,
 112                .maximum       = 1,
 113                .type          = V4L2_CTRL_TYPE_BOOLEAN,
 114        }, {
 115                .id            = V4L2_CID_AUDIO_VOLUME,
 116                .name          = "Volume",
 117                .minimum       = -15,
 118                .maximum       = 15,
 119                .step          = 1,
 120                .default_value = 0,
 121                .type          = V4L2_CTRL_TYPE_INTEGER,
 122        }
 123};
 124
 125static const unsigned int CTRLS = ARRAY_SIZE(tm6000_qctrl);
 126static int qctl_regs[ARRAY_SIZE(tm6000_qctrl)];
 127
 128static struct tm6000_fmt format[] = {
 129        {
 130                .name     = "4:2:2, packed, YVY2",
 131                .fourcc   = V4L2_PIX_FMT_YUYV,
 132                .depth    = 16,
 133        }, {
 134                .name     = "4:2:2, packed, UYVY",
 135                .fourcc   = V4L2_PIX_FMT_UYVY,
 136                .depth    = 16,
 137        }, {
 138                .name     = "A/V + VBI mux packet",
 139                .fourcc   = V4L2_PIX_FMT_TM6000,
 140                .depth    = 16,
 141        }
 142};
 143
 144static const struct v4l2_queryctrl *ctrl_by_id(unsigned int id)
 145{
 146        unsigned int i;
 147
 148        for (i = 0; i < CTRLS; i++)
 149                if (tm6000_qctrl[i].id == id)
 150                        return tm6000_qctrl+i;
 151        return NULL;
 152}
 153
 154/* ------------------------------------------------------------------
 155 *      DMA and thread functions
 156 * ------------------------------------------------------------------
 157 */
 158
 159#define norm_maxw(a) 720
 160#define norm_maxh(a) 576
 161
 162#define norm_minw(a) norm_maxw(a)
 163#define norm_minh(a) norm_maxh(a)
 164
 165/*
 166 * video-buf generic routine to get the next available buffer
 167 */
 168static inline void get_next_buf(struct tm6000_dmaqueue *dma_q,
 169                               struct tm6000_buffer   **buf)
 170{
 171        struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
 172
 173        if (list_empty(&dma_q->active)) {
 174                dprintk(dev, V4L2_DEBUG_QUEUE, "No active queue to serve\n");
 175                *buf = NULL;
 176                return;
 177        }
 178
 179        *buf = list_entry(dma_q->active.next,
 180                        struct tm6000_buffer, vb.queue);
 181}
 182
 183/*
 184 * Announces that a buffer were filled and request the next
 185 */
 186static inline void buffer_filled(struct tm6000_core *dev,
 187                                 struct tm6000_dmaqueue *dma_q,
 188                                 struct tm6000_buffer *buf)
 189{
 190        /* Advice that buffer was filled */
 191        dprintk(dev, V4L2_DEBUG_ISOC, "[%p/%d] wakeup\n", buf, buf->vb.i);
 192        buf->vb.state = VIDEOBUF_DONE;
 193        buf->vb.field_count++;
 194        do_gettimeofday(&buf->vb.ts);
 195
 196        list_del(&buf->vb.queue);
 197        wake_up(&buf->vb.done);
 198}
 199
 200/*
 201 * Identify the tm5600/6000 buffer header type and properly handles
 202 */
 203static int copy_streams(u8 *data, unsigned long len,
 204                        struct urb *urb)
 205{
 206        struct tm6000_dmaqueue  *dma_q = urb->context;
 207        struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
 208        u8 *ptr = data, *endp = data+len;
 209        unsigned long header = 0;
 210        int rc = 0;
 211        unsigned int cmd, cpysize, pktsize, size, field, block, line, pos = 0;
 212        struct tm6000_buffer *vbuf = NULL;
 213        char *voutp = NULL;
 214        unsigned int linewidth;
 215
 216        if (!dev->radio) {
 217                /* get video buffer */
 218                get_next_buf(dma_q, &vbuf);
 219
 220                if (!vbuf)
 221                        return rc;
 222                voutp = videobuf_to_vmalloc(&vbuf->vb);
 223
 224                if (!voutp)
 225                        return 0;
 226        }
 227
 228        for (ptr = data; ptr < endp;) {
 229                if (!dev->isoc_ctl.cmd) {
 230                        /* Header */
 231                        if (dev->isoc_ctl.tmp_buf_len > 0) {
 232                                /* from last urb or packet */
 233                                header = dev->isoc_ctl.tmp_buf;
 234                                if (4 - dev->isoc_ctl.tmp_buf_len > 0) {
 235                                        memcpy((u8 *)&header +
 236                                                dev->isoc_ctl.tmp_buf_len,
 237                                                ptr,
 238                                                4 - dev->isoc_ctl.tmp_buf_len);
 239                                        ptr += 4 - dev->isoc_ctl.tmp_buf_len;
 240                                }
 241                                dev->isoc_ctl.tmp_buf_len = 0;
 242                        } else {
 243                                if (ptr + 3 >= endp) {
 244                                        /* have incomplete header */
 245                                        dev->isoc_ctl.tmp_buf_len = endp - ptr;
 246                                        memcpy(&dev->isoc_ctl.tmp_buf, ptr,
 247                                                dev->isoc_ctl.tmp_buf_len);
 248                                        return rc;
 249                                }
 250                                /* Seek for sync */
 251                                for (; ptr < endp - 3; ptr++) {
 252                                        if (*(ptr + 3) == 0x47)
 253                                                break;
 254                                }
 255                                /* Get message header */
 256                                header = *(unsigned long *)ptr;
 257                                ptr += 4;
 258                        }
 259
 260                        /* split the header fields */
 261                        size = ((header & 0x7e) << 1);
 262                        if (size > 0)
 263                                size -= 4;
 264                        block = (header >> 7) & 0xf;
 265                        field = (header >> 11) & 0x1;
 266                        line  = (header >> 12) & 0x1ff;
 267                        cmd   = (header >> 21) & 0x7;
 268                        /* Validates haeder fields */
 269                        if (size > TM6000_URB_MSG_LEN)
 270                                size = TM6000_URB_MSG_LEN;
 271                        pktsize = TM6000_URB_MSG_LEN;
 272                        /*
 273                         * calculate position in buffer and change the buffer
 274                         */
 275                        switch (cmd) {
 276                        case TM6000_URB_MSG_VIDEO:
 277                                if (!dev->radio) {
 278                                        if ((dev->isoc_ctl.vfield != field) &&
 279                                                (field == 1)) {
 280                                                /*
 281                                                 * Announces that a new buffer
 282                                                 * were filled
 283                                                 */
 284                                                buffer_filled(dev, dma_q, vbuf);
 285                                                dprintk(dev, V4L2_DEBUG_ISOC,
 286                                                        "new buffer filled\n");
 287                                                get_next_buf(dma_q, &vbuf);
 288                                                if (!vbuf)
 289                                                        return rc;
 290                                                voutp = videobuf_to_vmalloc(&vbuf->vb);
 291                                                if (!voutp)
 292                                                        return rc;
 293                                                memset(voutp, 0, vbuf->vb.size);
 294                                        }
 295                                        linewidth = vbuf->vb.width << 1;
 296                                        pos = ((line << 1) - field - 1) *
 297                                        linewidth + block * TM6000_URB_MSG_LEN;
 298                                        /* Don't allow to write out of the buffer */
 299                                        if (pos + size > vbuf->vb.size)
 300                                                cmd = TM6000_URB_MSG_ERR;
 301                                        dev->isoc_ctl.vfield = field;
 302                                }
 303                                break;
 304                        case TM6000_URB_MSG_VBI:
 305                                break;
 306                        case TM6000_URB_MSG_AUDIO:
 307                        case TM6000_URB_MSG_PTS:
 308                                size = pktsize; /* Size is always 180 bytes */
 309                                break;
 310                        }
 311                } else {
 312                        /* Continue the last copy */
 313                        cmd = dev->isoc_ctl.cmd;
 314                        size = dev->isoc_ctl.size;
 315                        pos = dev->isoc_ctl.pos;
 316                        pktsize = dev->isoc_ctl.pktsize;
 317                        field = dev->isoc_ctl.field;
 318                }
 319                cpysize = (endp - ptr > size) ? size : endp - ptr;
 320                if (cpysize) {
 321                        /* copy data in different buffers */
 322                        switch (cmd) {
 323                        case TM6000_URB_MSG_VIDEO:
 324                                /* Fills video buffer */
 325                                if (vbuf)
 326                                        memcpy(&voutp[pos], ptr, cpysize);
 327                                break;
 328                        case TM6000_URB_MSG_AUDIO: {
 329                                int i;
 330                                for (i = 0; i < cpysize; i += 2)
 331                                        swab16s((u16 *)(ptr + i));
 332
 333                                tm6000_call_fillbuf(dev, TM6000_AUDIO, ptr, cpysize);
 334                                break;
 335                        }
 336                        case TM6000_URB_MSG_VBI:
 337                                /* Need some code to copy vbi buffer */
 338                                break;
 339                        case TM6000_URB_MSG_PTS: {
 340                                /* Need some code to copy pts */
 341                                u32 pts;
 342                                pts = *(u32 *)ptr;
 343                                dprintk(dev, V4L2_DEBUG_ISOC, "field %d, PTS %x",
 344                                        field, pts);
 345                                break;
 346                        }
 347                        }
 348                }
 349                if (ptr + pktsize > endp) {
 350                        /*
 351                         * End of URB packet, but cmd processing is not
 352                         * complete. Preserve the state for a next packet
 353                         */
 354                        dev->isoc_ctl.pos = pos + cpysize;
 355                        dev->isoc_ctl.size = size - cpysize;
 356                        dev->isoc_ctl.cmd = cmd;
 357                        dev->isoc_ctl.field = field;
 358                        dev->isoc_ctl.pktsize = pktsize - (endp - ptr);
 359                        ptr += endp - ptr;
 360                } else {
 361                        dev->isoc_ctl.cmd = 0;
 362                        ptr += pktsize;
 363                }
 364        }
 365        return 0;
 366}
 367
 368/*
 369 * Identify the tm5600/6000 buffer header type and properly handles
 370 */
 371static int copy_multiplexed(u8 *ptr, unsigned long len,
 372                        struct urb *urb)
 373{
 374        struct tm6000_dmaqueue  *dma_q = urb->context;
 375        struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
 376        unsigned int pos = dev->isoc_ctl.pos, cpysize;
 377        int rc = 1;
 378        struct tm6000_buffer *buf;
 379        char *outp = NULL;
 380
 381        get_next_buf(dma_q, &buf);
 382        if (buf)
 383                outp = videobuf_to_vmalloc(&buf->vb);
 384
 385        if (!outp)
 386                return 0;
 387
 388        while (len > 0) {
 389                cpysize = min(len, buf->vb.size-pos);
 390                memcpy(&outp[pos], ptr, cpysize);
 391                pos += cpysize;
 392                ptr += cpysize;
 393                len -= cpysize;
 394                if (pos >= buf->vb.size) {
 395                        pos = 0;
 396                        /* Announces that a new buffer were filled */
 397                        buffer_filled(dev, dma_q, buf);
 398                        dprintk(dev, V4L2_DEBUG_ISOC, "new buffer filled\n");
 399                        get_next_buf(dma_q, &buf);
 400                        if (!buf)
 401                                break;
 402                        outp = videobuf_to_vmalloc(&(buf->vb));
 403                        if (!outp)
 404                                return rc;
 405                        pos = 0;
 406                }
 407        }
 408
 409        dev->isoc_ctl.pos = pos;
 410        return rc;
 411}
 412
 413static inline void print_err_status(struct tm6000_core *dev,
 414                                     int packet, int status)
 415{
 416        char *errmsg = "Unknown";
 417
 418        switch (status) {
 419        case -ENOENT:
 420                errmsg = "unlinked synchronuously";
 421                break;
 422        case -ECONNRESET:
 423                errmsg = "unlinked asynchronuously";
 424                break;
 425        case -ENOSR:
 426                errmsg = "Buffer error (overrun)";
 427                break;
 428        case -EPIPE:
 429                errmsg = "Stalled (device not responding)";
 430                break;
 431        case -EOVERFLOW:
 432                errmsg = "Babble (bad cable?)";
 433                break;
 434        case -EPROTO:
 435                errmsg = "Bit-stuff error (bad cable?)";
 436                break;
 437        case -EILSEQ:
 438                errmsg = "CRC/Timeout (could be anything)";
 439                break;
 440        case -ETIME:
 441                errmsg = "Device does not respond";
 442                break;
 443        }
 444        if (packet < 0) {
 445                dprintk(dev, V4L2_DEBUG_QUEUE, "URB status %d [%s].\n",
 446                        status, errmsg);
 447        } else {
 448                dprintk(dev, V4L2_DEBUG_QUEUE, "URB packet %d, status %d [%s].\n",
 449                        packet, status, errmsg);
 450        }
 451}
 452
 453
 454/*
 455 * Controls the isoc copy of each urb packet
 456 */
 457static inline int tm6000_isoc_copy(struct urb *urb)
 458{
 459        struct tm6000_dmaqueue  *dma_q = urb->context;
 460        struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
 461        int i, len = 0, rc = 1, status;
 462        char *p;
 463
 464        if (urb->status < 0) {
 465                print_err_status(dev, -1, urb->status);
 466                return 0;
 467        }
 468
 469        for (i = 0; i < urb->number_of_packets; i++) {
 470                status = urb->iso_frame_desc[i].status;
 471
 472                if (status < 0) {
 473                        print_err_status(dev, i, status);
 474                        continue;
 475                }
 476
 477                len = urb->iso_frame_desc[i].actual_length;
 478
 479                if (len > 0) {
 480                        p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
 481                        if (!urb->iso_frame_desc[i].status) {
 482                                if ((dev->fourcc) == V4L2_PIX_FMT_TM6000) {
 483                                        rc = copy_multiplexed(p, len, urb);
 484                                        if (rc <= 0)
 485                                                return rc;
 486                                } else {
 487                                        copy_streams(p, len, urb);
 488                                }
 489                        }
 490                }
 491        }
 492        return rc;
 493}
 494
 495/* ------------------------------------------------------------------
 496 *      URB control
 497 * ------------------------------------------------------------------
 498 */
 499
 500/*
 501 * IRQ callback, called by URB callback
 502 */
 503static void tm6000_irq_callback(struct urb *urb)
 504{
 505        struct tm6000_dmaqueue  *dma_q = urb->context;
 506        struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
 507        int i;
 508
 509        switch (urb->status) {
 510        case 0:
 511        case -ETIMEDOUT:
 512                break;
 513
 514        case -ECONNRESET:
 515        case -ENOENT:
 516        case -ESHUTDOWN:
 517                return;
 518
 519        default:
 520                tm6000_err("urb completion error %d.\n", urb->status);
 521                break;
 522        }
 523
 524        spin_lock(&dev->slock);
 525        tm6000_isoc_copy(urb);
 526        spin_unlock(&dev->slock);
 527
 528        /* Reset urb buffers */
 529        for (i = 0; i < urb->number_of_packets; i++) {
 530                urb->iso_frame_desc[i].status = 0;
 531                urb->iso_frame_desc[i].actual_length = 0;
 532        }
 533
 534        urb->status = usb_submit_urb(urb, GFP_ATOMIC);
 535        if (urb->status)
 536                tm6000_err("urb resubmit failed (error=%i)\n",
 537                        urb->status);
 538}
 539
 540/*
 541 * Stop and Deallocate URBs
 542 */
 543static void tm6000_uninit_isoc(struct tm6000_core *dev)
 544{
 545        struct urb *urb;
 546        int i;
 547
 548        dev->isoc_ctl.buf = NULL;
 549        for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
 550                urb = dev->isoc_ctl.urb[i];
 551                if (urb) {
 552                        usb_kill_urb(urb);
 553                        usb_unlink_urb(urb);
 554                        if (dev->isoc_ctl.transfer_buffer[i]) {
 555                                usb_free_coherent(dev->udev,
 556                                                urb->transfer_buffer_length,
 557                                                dev->isoc_ctl.transfer_buffer[i],
 558                                                urb->transfer_dma);
 559                        }
 560                        usb_free_urb(urb);
 561                        dev->isoc_ctl.urb[i] = NULL;
 562                }
 563                dev->isoc_ctl.transfer_buffer[i] = NULL;
 564        }
 565
 566        kfree(dev->isoc_ctl.urb);
 567        kfree(dev->isoc_ctl.transfer_buffer);
 568
 569        dev->isoc_ctl.urb = NULL;
 570        dev->isoc_ctl.transfer_buffer = NULL;
 571        dev->isoc_ctl.num_bufs = 0;
 572}
 573
 574/*
 575 * Allocate URBs and start IRQ
 576 */
 577static int tm6000_prepare_isoc(struct tm6000_core *dev)
 578{
 579        struct tm6000_dmaqueue *dma_q = &dev->vidq;
 580        int i, j, sb_size, pipe, size, max_packets, num_bufs = 8;
 581        struct urb *urb;
 582
 583        /* De-allocates all pending stuff */
 584        tm6000_uninit_isoc(dev);
 585        /* Stop interrupt USB pipe */
 586        tm6000_ir_int_stop(dev);
 587
 588        usb_set_interface(dev->udev,
 589                          dev->isoc_in.bInterfaceNumber,
 590                          dev->isoc_in.bAlternateSetting);
 591
 592        /* Start interrupt USB pipe */
 593        tm6000_ir_int_start(dev);
 594
 595        pipe = usb_rcvisocpipe(dev->udev,
 596                               dev->isoc_in.endp->desc.bEndpointAddress &
 597                               USB_ENDPOINT_NUMBER_MASK);
 598
 599        size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe));
 600
 601        if (size > dev->isoc_in.maxsize)
 602                size = dev->isoc_in.maxsize;
 603
 604        dev->isoc_ctl.max_pkt_size = size;
 605
 606        max_packets = TM6000_MAX_ISO_PACKETS;
 607        sb_size = max_packets * size;
 608
 609        dev->isoc_ctl.num_bufs = num_bufs;
 610
 611        dev->isoc_ctl.urb = kmalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
 612        if (!dev->isoc_ctl.urb) {
 613                tm6000_err("cannot alloc memory for usb buffers\n");
 614                return -ENOMEM;
 615        }
 616
 617        dev->isoc_ctl.transfer_buffer = kmalloc(sizeof(void *)*num_bufs,
 618                                   GFP_KERNEL);
 619        if (!dev->isoc_ctl.transfer_buffer) {
 620                tm6000_err("cannot allocate memory for usbtransfer\n");
 621                kfree(dev->isoc_ctl.urb);
 622                return -ENOMEM;
 623        }
 624
 625        dprintk(dev, V4L2_DEBUG_QUEUE, "Allocating %d x %d packets"
 626                    " (%d bytes) of %d bytes each to handle %u size\n",
 627                    max_packets, num_bufs, sb_size,
 628                    dev->isoc_in.maxsize, size);
 629
 630        /* allocate urbs and transfer buffers */
 631        for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
 632                urb = usb_alloc_urb(max_packets, GFP_KERNEL);
 633                if (!urb) {
 634                        tm6000_err("cannot alloc isoc_ctl.urb %i\n", i);
 635                        tm6000_uninit_isoc(dev);
 636                        usb_free_urb(urb);
 637                        return -ENOMEM;
 638                }
 639                dev->isoc_ctl.urb[i] = urb;
 640
 641                dev->isoc_ctl.transfer_buffer[i] = usb_alloc_coherent(dev->udev,
 642                        sb_size, GFP_KERNEL, &urb->transfer_dma);
 643                if (!dev->isoc_ctl.transfer_buffer[i]) {
 644                        tm6000_err("unable to allocate %i bytes for transfer"
 645                                        " buffer %i%s\n",
 646                                        sb_size, i,
 647                                        in_interrupt() ? " while in int" : "");
 648                        tm6000_uninit_isoc(dev);
 649                        return -ENOMEM;
 650                }
 651                memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);
 652
 653                usb_fill_bulk_urb(urb, dev->udev, pipe,
 654                                  dev->isoc_ctl.transfer_buffer[i], sb_size,
 655                                  tm6000_irq_callback, dma_q);
 656                urb->interval = dev->isoc_in.endp->desc.bInterval;
 657                urb->number_of_packets = max_packets;
 658                urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
 659
 660                for (j = 0; j < max_packets; j++) {
 661                        urb->iso_frame_desc[j].offset = size * j;
 662                        urb->iso_frame_desc[j].length = size;
 663                }
 664        }
 665
 666        return 0;
 667}
 668
 669static int tm6000_start_thread(struct tm6000_core *dev)
 670{
 671        struct tm6000_dmaqueue *dma_q = &dev->vidq;
 672        int i;
 673
 674        dma_q->frame = 0;
 675        dma_q->ini_jiffies = jiffies;
 676
 677        init_waitqueue_head(&dma_q->wq);
 678
 679        /* submit urbs and enables IRQ */
 680        for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
 681                int rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
 682                if (rc) {
 683                        tm6000_err("submit of urb %i failed (error=%i)\n", i,
 684                                   rc);
 685                        tm6000_uninit_isoc(dev);
 686                        return rc;
 687                }
 688        }
 689
 690        return 0;
 691}
 692
 693/* ------------------------------------------------------------------
 694 *      Videobuf operations
 695 * ------------------------------------------------------------------
 696 */
 697
 698static int
 699buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
 700{
 701        struct tm6000_fh *fh = vq->priv_data;
 702
 703        *size = fh->fmt->depth * fh->width * fh->height >> 3;
 704        if (0 == *count)
 705                *count = TM6000_DEF_BUF;
 706
 707        if (*count < TM6000_MIN_BUF)
 708                *count = TM6000_MIN_BUF;
 709
 710        while (*size * *count > vid_limit * 1024 * 1024)
 711                (*count)--;
 712
 713        return 0;
 714}
 715
 716static void free_buffer(struct videobuf_queue *vq, struct tm6000_buffer *buf)
 717{
 718        struct tm6000_fh *fh = vq->priv_data;
 719        struct tm6000_core   *dev = fh->dev;
 720        unsigned long flags;
 721
 722        if (in_interrupt())
 723                BUG();
 724
 725        /* We used to wait for the buffer to finish here, but this didn't work
 726           because, as we were keeping the state as VIDEOBUF_QUEUED,
 727           videobuf_queue_cancel marked it as finished for us.
 728           (Also, it could wedge forever if the hardware was misconfigured.)
 729
 730           This should be safe; by the time we get here, the buffer isn't
 731           queued anymore. If we ever start marking the buffers as
 732           VIDEOBUF_ACTIVE, it won't be, though.
 733        */
 734        spin_lock_irqsave(&dev->slock, flags);
 735        if (dev->isoc_ctl.buf == buf)
 736                dev->isoc_ctl.buf = NULL;
 737        spin_unlock_irqrestore(&dev->slock, flags);
 738
 739        videobuf_vmalloc_free(&buf->vb);
 740        buf->vb.state = VIDEOBUF_NEEDS_INIT;
 741}
 742
 743static int
 744buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
 745                                                enum v4l2_field field)
 746{
 747        struct tm6000_fh     *fh  = vq->priv_data;
 748        struct tm6000_buffer *buf = container_of(vb, struct tm6000_buffer, vb);
 749        struct tm6000_core   *dev = fh->dev;
 750        int rc = 0;
 751
 752        BUG_ON(NULL == fh->fmt);
 753
 754
 755        /* FIXME: It assumes depth=2 */
 756        /* The only currently supported format is 16 bits/pixel */
 757        buf->vb.size = fh->fmt->depth*fh->width*fh->height >> 3;
 758        if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
 759                return -EINVAL;
 760
 761        if (buf->fmt       != fh->fmt    ||
 762            buf->vb.width  != fh->width  ||
 763            buf->vb.height != fh->height ||
 764            buf->vb.field  != field) {
 765                buf->fmt       = fh->fmt;
 766                buf->vb.width  = fh->width;
 767                buf->vb.height = fh->height;
 768                buf->vb.field  = field;
 769                buf->vb.state = VIDEOBUF_NEEDS_INIT;
 770        }
 771
 772        if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
 773                rc = videobuf_iolock(vq, &buf->vb, NULL);
 774                if (rc != 0)
 775                        goto fail;
 776        }
 777
 778        if (!dev->isoc_ctl.num_bufs) {
 779                rc = tm6000_prepare_isoc(dev);
 780                if (rc < 0)
 781                        goto fail;
 782
 783                rc = tm6000_start_thread(dev);
 784                if (rc < 0)
 785                        goto fail;
 786
 787        }
 788
 789        buf->vb.state = VIDEOBUF_PREPARED;
 790        return 0;
 791
 792fail:
 793        free_buffer(vq, buf);
 794        return rc;
 795}
 796
 797static void
 798buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 799{
 800        struct tm6000_buffer    *buf     = container_of(vb, struct tm6000_buffer, vb);
 801        struct tm6000_fh        *fh      = vq->priv_data;
 802        struct tm6000_core      *dev     = fh->dev;
 803        struct tm6000_dmaqueue  *vidq    = &dev->vidq;
 804
 805        buf->vb.state = VIDEOBUF_QUEUED;
 806        list_add_tail(&buf->vb.queue, &vidq->active);
 807}
 808
 809static void buffer_release(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 810{
 811        struct tm6000_buffer   *buf  = container_of(vb, struct tm6000_buffer, vb);
 812
 813        free_buffer(vq, buf);
 814}
 815
 816static struct videobuf_queue_ops tm6000_video_qops = {
 817        .buf_setup      = buffer_setup,
 818        .buf_prepare    = buffer_prepare,
 819        .buf_queue      = buffer_queue,
 820        .buf_release    = buffer_release,
 821};
 822
 823/* ------------------------------------------------------------------
 824 *      IOCTL handling
 825 * ------------------------------------------------------------------
 826 */
 827
 828static bool is_res_read(struct tm6000_core *dev, struct tm6000_fh *fh)
 829{
 830        /* Is the current fh handling it? if so, that's OK */
 831        if (dev->resources == fh && dev->is_res_read)
 832                return true;
 833
 834        return false;
 835}
 836
 837static bool is_res_streaming(struct tm6000_core *dev, struct tm6000_fh *fh)
 838{
 839        /* Is the current fh handling it? if so, that's OK */
 840        if (dev->resources == fh)
 841                return true;
 842
 843        return false;
 844}
 845
 846static bool res_get(struct tm6000_core *dev, struct tm6000_fh *fh,
 847                   bool is_res_read)
 848{
 849        /* Is the current fh handling it? if so, that's OK */
 850        if (dev->resources == fh && dev->is_res_read == is_res_read)
 851                return true;
 852
 853        /* is it free? */
 854        if (dev->resources)
 855                return false;
 856
 857        /* grab it */
 858        dev->resources = fh;
 859        dev->is_res_read = is_res_read;
 860        dprintk(dev, V4L2_DEBUG_RES_LOCK, "res: get\n");
 861        return true;
 862}
 863
 864static void res_free(struct tm6000_core *dev, struct tm6000_fh *fh)
 865{
 866        /* Is the current fh handling it? if so, that's OK */
 867        if (dev->resources != fh)
 868                return;
 869
 870        dev->resources = NULL;
 871        dprintk(dev, V4L2_DEBUG_RES_LOCK, "res: put\n");
 872}
 873
 874/* ------------------------------------------------------------------
 875 *      IOCTL vidioc handling
 876 * ------------------------------------------------------------------
 877 */
 878static int vidioc_querycap(struct file *file, void  *priv,
 879                                        struct v4l2_capability *cap)
 880{
 881        struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev;
 882
 883        strlcpy(cap->driver, "tm6000", sizeof(cap->driver));
 884        strlcpy(cap->card, "Trident TVMaster TM5600/6000/6010", sizeof(cap->card));
 885        cap->capabilities =     V4L2_CAP_VIDEO_CAPTURE |
 886                                V4L2_CAP_STREAMING     |
 887                                V4L2_CAP_AUDIO         |
 888                                V4L2_CAP_READWRITE;
 889
 890        if (dev->tuner_type != TUNER_ABSENT)
 891                cap->capabilities |= V4L2_CAP_TUNER;
 892
 893        return 0;
 894}
 895
 896static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
 897                                        struct v4l2_fmtdesc *f)
 898{
 899        if (unlikely(f->index >= ARRAY_SIZE(format)))
 900                return -EINVAL;
 901
 902        strlcpy(f->description, format[f->index].name, sizeof(f->description));
 903        f->pixelformat = format[f->index].fourcc;
 904        return 0;
 905}
 906
 907static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
 908                                        struct v4l2_format *f)
 909{
 910        struct tm6000_fh  *fh = priv;
 911
 912        f->fmt.pix.width        = fh->width;
 913        f->fmt.pix.height       = fh->height;
 914        f->fmt.pix.field        = fh->vb_vidq.field;
 915        f->fmt.pix.pixelformat  = fh->fmt->fourcc;
 916        f->fmt.pix.bytesperline =
 917                (f->fmt.pix.width * fh->fmt->depth) >> 3;
 918        f->fmt.pix.sizeimage =
 919                f->fmt.pix.height * f->fmt.pix.bytesperline;
 920
 921        return 0;
 922}
 923
 924static struct tm6000_fmt *format_by_fourcc(unsigned int fourcc)
 925{
 926        unsigned int i;
 927
 928        for (i = 0; i < ARRAY_SIZE(format); i++)
 929                if (format[i].fourcc == fourcc)
 930                        return format+i;
 931        return NULL;
 932}
 933
 934static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
 935                        struct v4l2_format *f)
 936{
 937        struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev;
 938        struct tm6000_fmt *fmt;
 939        enum v4l2_field field;
 940
 941        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
 942        if (NULL == fmt) {
 943                dprintk(dev, V4L2_DEBUG_IOCTL_ARG, "Fourcc format (0x%08x)"
 944                                " invalid.\n", f->fmt.pix.pixelformat);
 945                return -EINVAL;
 946        }
 947
 948        field = f->fmt.pix.field;
 949
 950        if (field == V4L2_FIELD_ANY)
 951                field = V4L2_FIELD_SEQ_TB;
 952        else if (V4L2_FIELD_INTERLACED != field) {
 953                dprintk(dev, V4L2_DEBUG_IOCTL_ARG, "Field type invalid.\n");
 954                return -EINVAL;
 955        }
 956
 957        tm6000_get_std_res(dev);
 958
 959        f->fmt.pix.width  = dev->width;
 960        f->fmt.pix.height = dev->height;
 961
 962        f->fmt.pix.width &= ~0x01;
 963
 964        f->fmt.pix.field = field;
 965
 966        f->fmt.pix.bytesperline =
 967                (f->fmt.pix.width * fmt->depth) >> 3;
 968        f->fmt.pix.sizeimage =
 969                f->fmt.pix.height * f->fmt.pix.bytesperline;
 970
 971        return 0;
 972}
 973
 974/*FIXME: This seems to be generic enough to be at videodev2 */
 975static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 976                                        struct v4l2_format *f)
 977{
 978        struct tm6000_fh  *fh = priv;
 979        struct tm6000_core *dev = fh->dev;
 980        int ret = vidioc_try_fmt_vid_cap(file, fh, f);
 981        if (ret < 0)
 982                return ret;
 983
 984        fh->fmt           = format_by_fourcc(f->fmt.pix.pixelformat);
 985        fh->width         = f->fmt.pix.width;
 986        fh->height        = f->fmt.pix.height;
 987        fh->vb_vidq.field = f->fmt.pix.field;
 988        fh->type          = f->type;
 989
 990        dev->fourcc       = f->fmt.pix.pixelformat;
 991
 992        tm6000_set_fourcc_format(dev);
 993
 994        return 0;
 995}
 996
 997static int vidioc_reqbufs(struct file *file, void *priv,
 998                           struct v4l2_requestbuffers *p)
 999{
1000        struct tm6000_fh  *fh = priv;
1001
1002        return videobuf_reqbufs(&fh->vb_vidq, p);
1003}
1004
1005static int vidioc_querybuf(struct file *file, void *priv,
1006                            struct v4l2_buffer *p)
1007{
1008        struct tm6000_fh  *fh = priv;
1009
1010        return videobuf_querybuf(&fh->vb_vidq, p);
1011}
1012
1013static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1014{
1015        struct tm6000_fh  *fh = priv;
1016
1017        return videobuf_qbuf(&fh->vb_vidq, p);
1018}
1019
1020static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1021{
1022        struct tm6000_fh  *fh = priv;
1023
1024        return videobuf_dqbuf(&fh->vb_vidq, p,
1025                                file->f_flags & O_NONBLOCK);
1026}
1027
1028static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
1029{
1030        struct tm6000_fh *fh = priv;
1031        struct tm6000_core *dev = fh->dev;
1032
1033        if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1034                return -EINVAL;
1035        if (i != fh->type)
1036                return -EINVAL;
1037
1038        if (!res_get(dev, fh, false))
1039                return -EBUSY;
1040        return videobuf_streamon(&fh->vb_vidq);
1041}
1042
1043static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
1044{
1045        struct tm6000_fh *fh = priv;
1046        struct tm6000_core *dev = fh->dev;
1047
1048        if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1049                return -EINVAL;
1050
1051        if (i != fh->type)
1052                return -EINVAL;
1053
1054        videobuf_streamoff(&fh->vb_vidq);
1055        res_free(dev, fh);
1056
1057        return 0;
1058}
1059
1060static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
1061{
1062        int rc = 0;
1063        struct tm6000_fh *fh = priv;
1064        struct tm6000_core *dev = fh->dev;
1065
1066        dev->norm = *norm;
1067        rc = tm6000_init_analog_mode(dev);
1068
1069        fh->width  = dev->width;
1070        fh->height = dev->height;
1071
1072        if (rc < 0)
1073                return rc;
1074
1075        v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
1076
1077        return 0;
1078}
1079
1080static const char *iname[] = {
1081        [TM6000_INPUT_TV] = "Television",
1082        [TM6000_INPUT_COMPOSITE1] = "Composite 1",
1083        [TM6000_INPUT_COMPOSITE2] = "Composite 2",
1084        [TM6000_INPUT_SVIDEO] = "S-Video",
1085};
1086
1087static int vidioc_enum_input(struct file *file, void *priv,
1088                                struct v4l2_input *i)
1089{
1090        struct tm6000_fh   *fh = priv;
1091        struct tm6000_core *dev = fh->dev;
1092        unsigned int n;
1093
1094        n = i->index;
1095        if (n >= 3)
1096                return -EINVAL;
1097
1098        if (!dev->vinput[n].type)
1099                return -EINVAL;
1100
1101        i->index = n;
1102
1103        if (dev->vinput[n].type == TM6000_INPUT_TV)
1104                i->type = V4L2_INPUT_TYPE_TUNER;
1105        else
1106                i->type = V4L2_INPUT_TYPE_CAMERA;
1107
1108        strcpy(i->name, iname[dev->vinput[n].type]);
1109
1110        i->std = TM6000_STD;
1111
1112        return 0;
1113}
1114
1115static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1116{
1117        struct tm6000_fh   *fh = priv;
1118        struct tm6000_core *dev = fh->dev;
1119
1120        *i = dev->input;
1121
1122        return 0;
1123}
1124
1125static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1126{
1127        struct tm6000_fh   *fh = priv;
1128        struct tm6000_core *dev = fh->dev;
1129        int rc = 0;
1130
1131        if (i >= 3)
1132                return -EINVAL;
1133        if (!dev->vinput[i].type)
1134                return -EINVAL;
1135
1136        dev->input = i;
1137
1138        rc = vidioc_s_std(file, priv, &dev->vfd->current_norm);
1139
1140        return rc;
1141}
1142
1143/* --- controls ---------------------------------------------- */
1144static int vidioc_queryctrl(struct file *file, void *priv,
1145                                struct v4l2_queryctrl *qc)
1146{
1147        int i;
1148
1149        for (i = 0; i < ARRAY_SIZE(tm6000_qctrl); i++)
1150                if (qc->id && qc->id == tm6000_qctrl[i].id) {
1151                        memcpy(qc, &(tm6000_qctrl[i]),
1152                                sizeof(*qc));
1153                        return 0;
1154                }
1155
1156        return -EINVAL;
1157}
1158
1159static int vidioc_g_ctrl(struct file *file, void *priv,
1160                                struct v4l2_control *ctrl)
1161{
1162        struct tm6000_fh  *fh = priv;
1163        struct tm6000_core *dev    = fh->dev;
1164        int  val;
1165
1166        /* FIXME: Probably, those won't work! Maybe we need shadow regs */
1167        switch (ctrl->id) {
1168        case V4L2_CID_CONTRAST:
1169                val = tm6000_get_reg(dev, TM6010_REQ07_R08_LUMA_CONTRAST_ADJ, 0);
1170                break;
1171        case V4L2_CID_BRIGHTNESS:
1172                val = tm6000_get_reg(dev, TM6010_REQ07_R09_LUMA_BRIGHTNESS_ADJ, 0);
1173                return 0;
1174        case V4L2_CID_SATURATION:
1175                val = tm6000_get_reg(dev, TM6010_REQ07_R0A_CHROMA_SATURATION_ADJ, 0);
1176                return 0;
1177        case V4L2_CID_HUE:
1178                val = tm6000_get_reg(dev, TM6010_REQ07_R0B_CHROMA_HUE_PHASE_ADJ, 0);
1179                return 0;
1180        case V4L2_CID_AUDIO_MUTE:
1181                val = dev->ctl_mute;
1182                return 0;
1183        case V4L2_CID_AUDIO_VOLUME:
1184                val = dev->ctl_volume;
1185                return 0;
1186        default:
1187                return -EINVAL;
1188        }
1189
1190        if (val < 0)
1191                return val;
1192
1193        ctrl->value = val;
1194
1195        return 0;
1196}
1197static int vidioc_s_ctrl(struct file *file, void *priv,
1198                                struct v4l2_control *ctrl)
1199{
1200        struct tm6000_fh   *fh  = priv;
1201        struct tm6000_core *dev = fh->dev;
1202        u8  val = ctrl->value;
1203
1204        switch (ctrl->id) {
1205        case V4L2_CID_CONTRAST:
1206                tm6000_set_reg(dev, TM6010_REQ07_R08_LUMA_CONTRAST_ADJ, val);
1207                return 0;
1208        case V4L2_CID_BRIGHTNESS:
1209                tm6000_set_reg(dev, TM6010_REQ07_R09_LUMA_BRIGHTNESS_ADJ, val);
1210                return 0;
1211        case V4L2_CID_SATURATION:
1212                tm6000_set_reg(dev, TM6010_REQ07_R0A_CHROMA_SATURATION_ADJ, val);
1213                return 0;
1214        case V4L2_CID_HUE:
1215                tm6000_set_reg(dev, TM6010_REQ07_R0B_CHROMA_HUE_PHASE_ADJ, val);
1216                return 0;
1217        case V4L2_CID_AUDIO_MUTE:
1218                dev->ctl_mute = val;
1219                tm6000_tvaudio_set_mute(dev, val);
1220                return 0;
1221        case V4L2_CID_AUDIO_VOLUME:
1222                dev->ctl_volume = val;
1223                tm6000_set_volume(dev, val);
1224                return 0;
1225        }
1226        return -EINVAL;
1227}
1228
1229static int vidioc_g_tuner(struct file *file, void *priv,
1230                                struct v4l2_tuner *t)
1231{
1232        struct tm6000_fh   *fh  = priv;
1233        struct tm6000_core *dev = fh->dev;
1234
1235        if (unlikely(UNSET == dev->tuner_type))
1236                return -EINVAL;
1237        if (0 != t->index)
1238                return -EINVAL;
1239
1240        strcpy(t->name, "Television");
1241        t->type       = V4L2_TUNER_ANALOG_TV;
1242        t->capability = V4L2_TUNER_CAP_NORM;
1243        t->rangehigh  = 0xffffffffUL;
1244        t->rxsubchans = V4L2_TUNER_SUB_STEREO;
1245
1246        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1247
1248        t->audmode = dev->amode;
1249
1250        return 0;
1251}
1252
1253static int vidioc_s_tuner(struct file *file, void *priv,
1254                                struct v4l2_tuner *t)
1255{
1256        struct tm6000_fh   *fh  = priv;
1257        struct tm6000_core *dev = fh->dev;
1258
1259        if (UNSET == dev->tuner_type)
1260                return -EINVAL;
1261        if (0 != t->index)
1262                return -EINVAL;
1263
1264        dev->amode = t->audmode;
1265        dprintk(dev, 3, "audio mode: %x\n", t->audmode);
1266
1267        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1268
1269        return 0;
1270}
1271
1272static int vidioc_g_frequency(struct file *file, void *priv,
1273                                struct v4l2_frequency *f)
1274{
1275        struct tm6000_fh   *fh  = priv;
1276        struct tm6000_core *dev = fh->dev;
1277
1278        if (unlikely(UNSET == dev->tuner_type))
1279                return -EINVAL;
1280
1281        f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
1282        f->frequency = dev->freq;
1283
1284        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_frequency, f);
1285
1286        return 0;
1287}
1288
1289static int vidioc_s_frequency(struct file *file, void *priv,
1290                                struct v4l2_frequency *f)
1291{
1292        struct tm6000_fh   *fh  = priv;
1293        struct tm6000_core *dev = fh->dev;
1294
1295        if (unlikely(UNSET == dev->tuner_type))
1296                return -EINVAL;
1297        if (unlikely(f->tuner != 0))
1298                return -EINVAL;
1299        if (0 == fh->radio && V4L2_TUNER_ANALOG_TV != f->type)
1300                return -EINVAL;
1301        if (1 == fh->radio && V4L2_TUNER_RADIO != f->type)
1302                return -EINVAL;
1303
1304        dev->freq = f->frequency;
1305        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, f);
1306
1307        return 0;
1308}
1309
1310static int radio_querycap(struct file *file, void *priv,
1311                                        struct v4l2_capability *cap)
1312{
1313        struct tm6000_fh *fh = file->private_data;
1314        struct tm6000_core *dev = fh->dev;
1315
1316        strcpy(cap->driver, "tm6000");
1317        strlcpy(cap->card, dev->name, sizeof(dev->name));
1318        sprintf(cap->bus_info, "USB%04x:%04x",
1319                le16_to_cpu(dev->udev->descriptor.idVendor),
1320                le16_to_cpu(dev->udev->descriptor.idProduct));
1321        cap->version = dev->dev_type;
1322        cap->capabilities = V4L2_CAP_TUNER |
1323                        V4L2_CAP_AUDIO     |
1324                        V4L2_CAP_RADIO     |
1325                        V4L2_CAP_READWRITE |
1326                        V4L2_CAP_STREAMING;
1327
1328        return 0;
1329}
1330
1331static int radio_g_tuner(struct file *file, void *priv,
1332                                        struct v4l2_tuner *t)
1333{
1334        struct tm6000_fh *fh = file->private_data;
1335        struct tm6000_core *dev = fh->dev;
1336
1337        if (0 != t->index)
1338                return -EINVAL;
1339
1340        memset(t, 0, sizeof(*t));
1341        strcpy(t->name, "Radio");
1342        t->type = V4L2_TUNER_RADIO;
1343        t->rxsubchans = V4L2_TUNER_SUB_STEREO;
1344
1345        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
1346
1347        return 0;
1348}
1349
1350static int radio_s_tuner(struct file *file, void *priv,
1351                                        struct v4l2_tuner *t)
1352{
1353        struct tm6000_fh *fh = file->private_data;
1354        struct tm6000_core *dev = fh->dev;
1355
1356        if (0 != t->index)
1357                return -EINVAL;
1358
1359        v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1360
1361        return 0;
1362}
1363
1364static int radio_enum_input(struct file *file, void *priv,
1365                                        struct v4l2_input *i)
1366{
1367        struct tm6000_fh *fh = priv;
1368        struct tm6000_core *dev = fh->dev;
1369
1370        if (i->index != 0)
1371                return -EINVAL;
1372
1373        if (!dev->rinput.type)
1374                return -EINVAL;
1375
1376        strcpy(i->name, "Radio");
1377        i->type = V4L2_INPUT_TYPE_TUNER;
1378
1379        return 0;
1380}
1381
1382static int radio_g_input(struct file *filp, void *priv, unsigned int *i)
1383{
1384        struct tm6000_fh *fh = priv;
1385        struct tm6000_core *dev = fh->dev;
1386
1387        if (dev->input != 5)
1388                return -EINVAL;
1389
1390        *i = dev->input - 5;
1391
1392        return 0;
1393}
1394
1395static int radio_g_audio(struct file *file, void *priv,
1396                                        struct v4l2_audio *a)
1397{
1398        memset(a, 0, sizeof(*a));
1399        strcpy(a->name, "Radio");
1400        return 0;
1401}
1402
1403static int radio_s_audio(struct file *file, void *priv,
1404                                        struct v4l2_audio *a)
1405{
1406        return 0;
1407}
1408
1409static int radio_s_input(struct file *filp, void *priv, unsigned int i)
1410{
1411        struct tm6000_fh *fh = priv;
1412        struct tm6000_core *dev = fh->dev;
1413
1414        if (i)
1415                return -EINVAL;
1416
1417        if (!dev->rinput.type)
1418                return -EINVAL;
1419
1420        dev->input = i + 5;
1421
1422        return 0;
1423}
1424
1425static int radio_s_std(struct file *file, void *fh, v4l2_std_id *norm)
1426{
1427        return 0;
1428}
1429
1430static int radio_queryctrl(struct file *file, void *priv,
1431                                        struct v4l2_queryctrl *c)
1432{
1433        const struct v4l2_queryctrl *ctrl;
1434
1435        if (c->id <  V4L2_CID_BASE ||
1436            c->id >= V4L2_CID_LASTP1)
1437                return -EINVAL;
1438        if (c->id == V4L2_CID_AUDIO_MUTE) {
1439                ctrl = ctrl_by_id(c->id);
1440                *c = *ctrl;
1441        } else
1442                *c = no_ctrl;
1443
1444        return 0;
1445}
1446
1447/* ------------------------------------------------------------------
1448        File operations for the device
1449   ------------------------------------------------------------------*/
1450
1451static int tm6000_open(struct file *file)
1452{
1453        struct video_device *vdev = video_devdata(file);
1454        struct tm6000_core *dev = video_drvdata(file);
1455        struct tm6000_fh *fh;
1456        enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1457        int i, rc;
1458        int radio = 0;
1459
1460        dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: open called (dev=%s)\n",
1461                video_device_node_name(vdev));
1462
1463        switch (vdev->vfl_type) {
1464        case VFL_TYPE_GRABBER:
1465                type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1466                break;
1467        case VFL_TYPE_VBI:
1468                type = V4L2_BUF_TYPE_VBI_CAPTURE;
1469                break;
1470        case VFL_TYPE_RADIO:
1471                radio = 1;
1472                break;
1473        }
1474
1475        /* If more than one user, mutex should be added */
1476        dev->users++;
1477
1478        dprintk(dev, V4L2_DEBUG_OPEN, "open dev=%s type=%s users=%d\n",
1479                video_device_node_name(vdev), v4l2_type_names[type],
1480                dev->users);
1481
1482        /* allocate + initialize per filehandle data */
1483        fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1484        if (NULL == fh) {
1485                dev->users--;
1486                return -ENOMEM;
1487        }
1488
1489        file->private_data = fh;
1490        fh->dev      = dev;
1491        fh->radio    = radio;
1492        dev->radio   = radio;
1493        fh->type     = type;
1494        dev->fourcc  = format[0].fourcc;
1495
1496        fh->fmt      = format_by_fourcc(dev->fourcc);
1497
1498        tm6000_get_std_res(dev);
1499
1500        fh->width = dev->width;
1501        fh->height = dev->height;
1502
1503        dprintk(dev, V4L2_DEBUG_OPEN, "Open: fh=0x%08lx, dev=0x%08lx, "
1504                                                "dev->vidq=0x%08lx\n",
1505                        (unsigned long)fh, (unsigned long)dev,
1506                        (unsigned long)&dev->vidq);
1507        dprintk(dev, V4L2_DEBUG_OPEN, "Open: list_empty "
1508                                "queued=%d\n", list_empty(&dev->vidq.queued));
1509        dprintk(dev, V4L2_DEBUG_OPEN, "Open: list_empty "
1510                                "active=%d\n", list_empty(&dev->vidq.active));
1511
1512        /* initialize hardware on analog mode */
1513        rc = tm6000_init_analog_mode(dev);
1514        if (rc < 0)
1515                return rc;
1516
1517        if (dev->mode != TM6000_MODE_ANALOG) {
1518                /* Put all controls at a sane state */
1519                for (i = 0; i < ARRAY_SIZE(tm6000_qctrl); i++)
1520                        qctl_regs[i] = tm6000_qctrl[i].default_value;
1521
1522                dev->mode = TM6000_MODE_ANALOG;
1523        }
1524
1525        if (!fh->radio) {
1526                videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops,
1527                                NULL, &dev->slock,
1528                                fh->type,
1529                                V4L2_FIELD_INTERLACED,
1530                                sizeof(struct tm6000_buffer), fh, &dev->lock);
1531        } else {
1532                dprintk(dev, V4L2_DEBUG_OPEN, "video_open: setting radio device\n");
1533                dev->input = 5;
1534                tm6000_set_audio_rinput(dev);
1535                v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_radio);
1536                tm6000_prepare_isoc(dev);
1537                tm6000_start_thread(dev);
1538        }
1539
1540        return 0;
1541}
1542
1543static ssize_t
1544tm6000_read(struct file *file, char __user *data, size_t count, loff_t *pos)
1545{
1546        struct tm6000_fh        *fh = file->private_data;
1547
1548        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1549                if (!res_get(fh->dev, fh, true))
1550                        return -EBUSY;
1551
1552                return videobuf_read_stream(&fh->vb_vidq, data, count, pos, 0,
1553                                        file->f_flags & O_NONBLOCK);
1554        }
1555        return 0;
1556}
1557
1558static unsigned int
1559tm6000_poll(struct file *file, struct poll_table_struct *wait)
1560{
1561        struct tm6000_fh        *fh = file->private_data;
1562        struct tm6000_buffer    *buf;
1563
1564        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
1565                return POLLERR;
1566
1567        if (!!is_res_streaming(fh->dev, fh))
1568                return POLLERR;
1569
1570        if (!is_res_read(fh->dev, fh)) {
1571                /* streaming capture */
1572                if (list_empty(&fh->vb_vidq.stream))
1573                        return POLLERR;
1574                buf = list_entry(fh->vb_vidq.stream.next, struct tm6000_buffer, vb.stream);
1575        } else {
1576                /* read() capture */
1577                return videobuf_poll_stream(file, &fh->vb_vidq, wait);
1578        }
1579        poll_wait(file, &buf->vb.done, wait);
1580        if (buf->vb.state == VIDEOBUF_DONE ||
1581            buf->vb.state == VIDEOBUF_ERROR)
1582                return POLLIN | POLLRDNORM;
1583        return 0;
1584}
1585
1586static int tm6000_release(struct file *file)
1587{
1588        struct tm6000_fh         *fh = file->private_data;
1589        struct tm6000_core      *dev = fh->dev;
1590        struct video_device    *vdev = video_devdata(file);
1591
1592        dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: close called (dev=%s, users=%d)\n",
1593                video_device_node_name(vdev), dev->users);
1594
1595        dev->users--;
1596
1597        res_free(dev, fh);
1598
1599        if (!dev->users) {
1600                tm6000_uninit_isoc(dev);
1601
1602                /* Stop interrupt USB pipe */
1603                tm6000_ir_int_stop(dev);
1604
1605                usb_reset_configuration(dev->udev);
1606
1607                if (dev->int_in.endp)
1608                        usb_set_interface(dev->udev,
1609                                        dev->isoc_in.bInterfaceNumber, 2);
1610                else
1611                        usb_set_interface(dev->udev,
1612                                        dev->isoc_in.bInterfaceNumber, 0);
1613
1614                /* Start interrupt USB pipe */
1615                tm6000_ir_int_start(dev);
1616
1617                if (!fh->radio)
1618                        videobuf_mmap_free(&fh->vb_vidq);
1619        }
1620
1621        kfree(fh);
1622
1623        return 0;
1624}
1625
1626static int tm6000_mmap(struct file *file, struct vm_area_struct * vma)
1627{
1628        struct tm6000_fh *fh = file->private_data;
1629
1630        return videobuf_mmap_mapper(&fh->vb_vidq, vma);
1631}
1632
1633static struct v4l2_file_operations tm6000_fops = {
1634        .owner = THIS_MODULE,
1635        .open = tm6000_open,
1636        .release = tm6000_release,
1637        .unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
1638        .read = tm6000_read,
1639        .poll = tm6000_poll,
1640        .mmap = tm6000_mmap,
1641};
1642
1643static const struct v4l2_ioctl_ops video_ioctl_ops = {
1644        .vidioc_querycap          = vidioc_querycap,
1645        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
1646        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
1647        .vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
1648        .vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
1649        .vidioc_s_std             = vidioc_s_std,
1650        .vidioc_enum_input        = vidioc_enum_input,
1651        .vidioc_g_input           = vidioc_g_input,
1652        .vidioc_s_input           = vidioc_s_input,
1653        .vidioc_queryctrl         = vidioc_queryctrl,
1654        .vidioc_g_ctrl            = vidioc_g_ctrl,
1655        .vidioc_s_ctrl            = vidioc_s_ctrl,
1656        .vidioc_g_tuner           = vidioc_g_tuner,
1657        .vidioc_s_tuner           = vidioc_s_tuner,
1658        .vidioc_g_frequency       = vidioc_g_frequency,
1659        .vidioc_s_frequency       = vidioc_s_frequency,
1660        .vidioc_streamon          = vidioc_streamon,
1661        .vidioc_streamoff         = vidioc_streamoff,
1662        .vidioc_reqbufs           = vidioc_reqbufs,
1663        .vidioc_querybuf          = vidioc_querybuf,
1664        .vidioc_qbuf              = vidioc_qbuf,
1665        .vidioc_dqbuf             = vidioc_dqbuf,
1666};
1667
1668static struct video_device tm6000_template = {
1669        .name           = "tm6000",
1670        .fops           = &tm6000_fops,
1671        .ioctl_ops      = &video_ioctl_ops,
1672        .release        = video_device_release,
1673        .tvnorms        = TM6000_STD,
1674        .current_norm   = V4L2_STD_NTSC_M,
1675};
1676
1677static const struct v4l2_file_operations radio_fops = {
1678        .owner          = THIS_MODULE,
1679        .open           = tm6000_open,
1680        .release        = tm6000_release,
1681        .unlocked_ioctl = video_ioctl2,
1682};
1683
1684static const struct v4l2_ioctl_ops radio_ioctl_ops = {
1685        .vidioc_querycap        = radio_querycap,
1686        .vidioc_g_tuner         = radio_g_tuner,
1687        .vidioc_enum_input      = radio_enum_input,
1688        .vidioc_g_audio         = radio_g_audio,
1689        .vidioc_s_tuner         = radio_s_tuner,
1690        .vidioc_s_audio         = radio_s_audio,
1691        .vidioc_s_input         = radio_s_input,
1692        .vidioc_s_std           = radio_s_std,
1693        .vidioc_queryctrl       = radio_queryctrl,
1694        .vidioc_g_input         = radio_g_input,
1695        .vidioc_g_ctrl          = vidioc_g_ctrl,
1696        .vidioc_s_ctrl          = vidioc_s_ctrl,
1697        .vidioc_g_frequency     = vidioc_g_frequency,
1698        .vidioc_s_frequency     = vidioc_s_frequency,
1699};
1700
1701static struct video_device tm6000_radio_template = {
1702        .name                   = "tm6000",
1703        .fops                   = &radio_fops,
1704        .ioctl_ops              = &radio_ioctl_ops,
1705};
1706
1707/* -----------------------------------------------------------------
1708 *      Initialization and module stuff
1709 * ------------------------------------------------------------------
1710 */
1711
1712static struct video_device *vdev_init(struct tm6000_core *dev,
1713                const struct video_device
1714                *template, const char *type_name)
1715{
1716        struct video_device *vfd;
1717
1718        vfd = video_device_alloc();
1719        if (NULL == vfd)
1720                return NULL;
1721
1722        *vfd = *template;
1723        vfd->v4l2_dev = &dev->v4l2_dev;
1724        vfd->release = video_device_release;
1725        vfd->debug = tm6000_debug;
1726        vfd->lock = &dev->lock;
1727        /* Locking in file operations other than ioctl should be done
1728           by the driver, not the V4L2 core.
1729           This driver needs auditing so that this flag can be removed. */
1730        set_bit(V4L2_FL_LOCK_ALL_FOPS, &vfd->flags);
1731
1732        snprintf(vfd->name, sizeof(vfd->name), "%s %s", dev->name, type_name);
1733
1734        video_set_drvdata(vfd, dev);
1735        return vfd;
1736}
1737
1738int tm6000_v4l2_register(struct tm6000_core *dev)
1739{
1740        int ret = -1;
1741
1742        dev->vfd = vdev_init(dev, &tm6000_template, "video");
1743
1744        if (!dev->vfd) {
1745                printk(KERN_INFO "%s: can't register video device\n",
1746                       dev->name);
1747                return -ENOMEM;
1748        }
1749
1750        /* init video dma queues */
1751        INIT_LIST_HEAD(&dev->vidq.active);
1752        INIT_LIST_HEAD(&dev->vidq.queued);
1753
1754        ret = video_register_device(dev->vfd, VFL_TYPE_GRABBER, video_nr);
1755
1756        if (ret < 0) {
1757                printk(KERN_INFO "%s: can't register video device\n",
1758                       dev->name);
1759                return ret;
1760        }
1761
1762        printk(KERN_INFO "%s: registered device %s\n",
1763               dev->name, video_device_node_name(dev->vfd));
1764
1765        if (dev->caps.has_radio) {
1766                dev->radio_dev = vdev_init(dev, &tm6000_radio_template,
1767                                                           "radio");
1768                if (!dev->radio_dev) {
1769                        printk(KERN_INFO "%s: can't register radio device\n",
1770                               dev->name);
1771                        return ret; /* FIXME release resource */
1772                }
1773
1774                ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
1775                                            radio_nr);
1776                if (ret < 0) {
1777                        printk(KERN_INFO "%s: can't register radio device\n",
1778                               dev->name);
1779                        return ret; /* FIXME release resource */
1780                }
1781
1782                printk(KERN_INFO "%s: registered device %s\n",
1783                       dev->name, video_device_node_name(dev->radio_dev));
1784        }
1785
1786        printk(KERN_INFO "Trident TVMaster TM5600/TM6000/TM6010 USB2 board (Load status: %d)\n", ret);
1787        return ret;
1788}
1789
1790int tm6000_v4l2_unregister(struct tm6000_core *dev)
1791{
1792        video_unregister_device(dev->vfd);
1793
1794        if (dev->radio_dev) {
1795                if (video_is_registered(dev->radio_dev))
1796                        video_unregister_device(dev->radio_dev);
1797                else
1798                        video_device_release(dev->radio_dev);
1799                dev->radio_dev = NULL;
1800        }
1801
1802        return 0;
1803}
1804
1805int tm6000_v4l2_exit(void)
1806{
1807        return 0;
1808}
1809
1810module_param(video_nr, int, 0);
1811MODULE_PARM_DESC(video_nr, "Allow changing video device number");
1812
1813module_param_named(debug, tm6000_debug, int, 0444);
1814MODULE_PARM_DESC(debug, "activates debug info");
1815
1816module_param(vid_limit, int, 0644);
1817MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");
1818
1819