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