linux/drivers/media/video/cx231xx/cx231xx-video.c
<<
>>
Prefs
   1/*
   2   cx231xx-video.c - driver for Conexant Cx23100/101/102
   3                     USB video capture devices
   4
   5   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
   6        Based on em28xx driver
   7        Based on cx23885 driver
   8        Based on cx88 driver
   9
  10   This program is free software; you can redistribute it and/or modify
  11   it under the terms of the GNU General Public License as published by
  12   the Free Software Foundation; either version 2 of the License, or
  13   (at your option) any later version.
  14
  15   This program is distributed in the hope that it will be useful,
  16   but WITHOUT ANY WARRANTY; without even the implied warranty of
  17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18   GNU General Public License for more details.
  19
  20   You should have received a copy of the GNU General Public License
  21   along with this program; if not, write to the Free Software
  22   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23 */
  24
  25#include <linux/init.h>
  26#include <linux/list.h>
  27#include <linux/module.h>
  28#include <linux/kernel.h>
  29#include <linux/bitmap.h>
  30#include <linux/usb.h>
  31#include <linux/i2c.h>
  32#include <linux/version.h>
  33#include <linux/mm.h>
  34#include <linux/mutex.h>
  35
  36#include <media/v4l2-common.h>
  37#include <media/v4l2-ioctl.h>
  38#include <media/v4l2-chip-ident.h>
  39#include <media/msp3400.h>
  40#include <media/tuner.h>
  41
  42#include "dvb_frontend.h"
  43
  44#include "cx231xx.h"
  45#include "cx231xx-vbi.h"
  46
  47#define CX231XX_VERSION_CODE            KERNEL_VERSION(0, 0, 1)
  48
  49#define DRIVER_AUTHOR   "Srinivasa Deevi <srinivasa.deevi@conexant.com>"
  50#define DRIVER_DESC     "Conexant cx231xx based USB video device driver"
  51
  52#define cx231xx_videodbg(fmt, arg...) do {\
  53        if (video_debug) \
  54                printk(KERN_INFO "%s %s :"fmt, \
  55                         dev->name, __func__ , ##arg); } while (0)
  56
  57static unsigned int isoc_debug;
  58module_param(isoc_debug, int, 0644);
  59MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
  60
  61#define cx231xx_isocdbg(fmt, arg...) \
  62do {\
  63        if (isoc_debug) { \
  64                printk(KERN_INFO "%s %s :"fmt, \
  65                         dev->name, __func__ , ##arg); \
  66        } \
  67  } while (0)
  68
  69MODULE_AUTHOR(DRIVER_AUTHOR);
  70MODULE_DESCRIPTION(DRIVER_DESC);
  71MODULE_LICENSE("GPL");
  72
  73static unsigned int card[]     = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
  74static unsigned int video_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
  75static unsigned int vbi_nr[]   = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
  76static unsigned int radio_nr[] = {[0 ... (CX231XX_MAXBOARDS - 1)] = UNSET };
  77
  78module_param_array(card, int, NULL, 0444);
  79module_param_array(video_nr, int, NULL, 0444);
  80module_param_array(vbi_nr, int, NULL, 0444);
  81module_param_array(radio_nr, int, NULL, 0444);
  82
  83MODULE_PARM_DESC(card, "card type");
  84MODULE_PARM_DESC(video_nr, "video device numbers");
  85MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
  86MODULE_PARM_DESC(radio_nr, "radio device numbers");
  87
  88static unsigned int video_debug;
  89module_param(video_debug, int, 0644);
  90MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
  91
  92/* supported video standards */
  93static struct cx231xx_fmt format[] = {
  94        {
  95         .name = "16bpp YUY2, 4:2:2, packed",
  96         .fourcc = V4L2_PIX_FMT_YUYV,
  97         .depth = 16,
  98         .reg = 0,
  99         },
 100};
 101
 102/* supported controls */
 103/* Common to all boards */
 104
 105/* ------------------------------------------------------------------- */
 106
 107static const struct v4l2_queryctrl no_ctl = {
 108        .name = "42",
 109        .flags = V4L2_CTRL_FLAG_DISABLED,
 110};
 111
 112static struct cx231xx_ctrl cx231xx_ctls[] = {
 113        /* --- video --- */
 114        {
 115                .v = {
 116                        .id = V4L2_CID_BRIGHTNESS,
 117                        .name = "Brightness",
 118                        .minimum = 0x00,
 119                        .maximum = 0xff,
 120                        .step = 1,
 121                        .default_value = 0x7f,
 122                        .type = V4L2_CTRL_TYPE_INTEGER,
 123                },
 124                .off = 128,
 125                .reg = LUMA_CTRL,
 126                .mask = 0x00ff,
 127                .shift = 0,
 128        }, {
 129                .v = {
 130                        .id = V4L2_CID_CONTRAST,
 131                        .name = "Contrast",
 132                        .minimum = 0,
 133                        .maximum = 0xff,
 134                        .step = 1,
 135                        .default_value = 0x3f,
 136                        .type = V4L2_CTRL_TYPE_INTEGER,
 137                },
 138                .off = 0,
 139                .reg = LUMA_CTRL,
 140                .mask = 0xff00,
 141                .shift = 8,
 142        }, {
 143                .v = {
 144                        .id = V4L2_CID_HUE,
 145                        .name = "Hue",
 146                        .minimum = 0,
 147                        .maximum = 0xff,
 148                        .step = 1,
 149                        .default_value = 0x7f,
 150                        .type = V4L2_CTRL_TYPE_INTEGER,
 151                },
 152                .off = 128,
 153                .reg = CHROMA_CTRL,
 154                .mask = 0xff0000,
 155                .shift = 16,
 156        }, {
 157        /* strictly, this only describes only U saturation.
 158        * V saturation is handled specially through code.
 159        */
 160                .v = {
 161                        .id = V4L2_CID_SATURATION,
 162                        .name = "Saturation",
 163                        .minimum = 0,
 164                        .maximum = 0xff,
 165                        .step = 1,
 166                        .default_value = 0x7f,
 167                        .type = V4L2_CTRL_TYPE_INTEGER,
 168                },
 169                .off = 0,
 170                .reg = CHROMA_CTRL,
 171                .mask = 0x00ff,
 172                .shift = 0,
 173        }, {
 174                /* --- audio --- */
 175                .v = {
 176                        .id = V4L2_CID_AUDIO_MUTE,
 177                        .name = "Mute",
 178                        .minimum = 0,
 179                        .maximum = 1,
 180                        .default_value = 1,
 181                        .type = V4L2_CTRL_TYPE_BOOLEAN,
 182                },
 183                .reg = PATH1_CTL1,
 184                .mask = (0x1f << 24),
 185                .shift = 24,
 186        }, {
 187                .v = {
 188                        .id = V4L2_CID_AUDIO_VOLUME,
 189                        .name = "Volume",
 190                        .minimum = 0,
 191                        .maximum = 0x3f,
 192                        .step = 1,
 193                        .default_value = 0x3f,
 194                        .type = V4L2_CTRL_TYPE_INTEGER,
 195                },
 196                .reg = PATH1_VOL_CTL,
 197                .mask = 0xff,
 198                .shift = 0,
 199        }
 200};
 201static const int CX231XX_CTLS = ARRAY_SIZE(cx231xx_ctls);
 202
 203static const u32 cx231xx_user_ctrls[] = {
 204        V4L2_CID_USER_CLASS,
 205        V4L2_CID_BRIGHTNESS,
 206        V4L2_CID_CONTRAST,
 207        V4L2_CID_SATURATION,
 208        V4L2_CID_HUE,
 209        V4L2_CID_AUDIO_VOLUME,
 210#if 0
 211        V4L2_CID_AUDIO_BALANCE,
 212#endif
 213        V4L2_CID_AUDIO_MUTE,
 214        0
 215};
 216
 217static const u32 *ctrl_classes[] = {
 218        cx231xx_user_ctrls,
 219        NULL
 220};
 221
 222/* ------------------------------------------------------------------
 223        Video buffer and parser functions
 224   ------------------------------------------------------------------*/
 225
 226/*
 227 * Announces that a buffer were filled and request the next
 228 */
 229static inline void buffer_filled(struct cx231xx *dev,
 230                                 struct cx231xx_dmaqueue *dma_q,
 231                                 struct cx231xx_buffer *buf)
 232{
 233        /* Advice that buffer was filled */
 234        cx231xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
 235        buf->vb.state = VIDEOBUF_DONE;
 236        buf->vb.field_count++;
 237        do_gettimeofday(&buf->vb.ts);
 238
 239        dev->video_mode.isoc_ctl.buf = NULL;
 240
 241        list_del(&buf->vb.queue);
 242        wake_up(&buf->vb.done);
 243}
 244
 245static inline void print_err_status(struct cx231xx *dev, int packet, int status)
 246{
 247        char *errmsg = "Unknown";
 248
 249        switch (status) {
 250        case -ENOENT:
 251                errmsg = "unlinked synchronuously";
 252                break;
 253        case -ECONNRESET:
 254                errmsg = "unlinked asynchronuously";
 255                break;
 256        case -ENOSR:
 257                errmsg = "Buffer error (overrun)";
 258                break;
 259        case -EPIPE:
 260                errmsg = "Stalled (device not responding)";
 261                break;
 262        case -EOVERFLOW:
 263                errmsg = "Babble (bad cable?)";
 264                break;
 265        case -EPROTO:
 266                errmsg = "Bit-stuff error (bad cable?)";
 267                break;
 268        case -EILSEQ:
 269                errmsg = "CRC/Timeout (could be anything)";
 270                break;
 271        case -ETIME:
 272                errmsg = "Device does not respond";
 273                break;
 274        }
 275        if (packet < 0) {
 276                cx231xx_isocdbg("URB status %d [%s].\n", status, errmsg);
 277        } else {
 278                cx231xx_isocdbg("URB packet %d, status %d [%s].\n",
 279                                packet, status, errmsg);
 280        }
 281}
 282
 283/*
 284 * video-buf generic routine to get the next available buffer
 285 */
 286static inline void get_next_buf(struct cx231xx_dmaqueue *dma_q,
 287                                struct cx231xx_buffer **buf)
 288{
 289        struct cx231xx_video_mode *vmode =
 290            container_of(dma_q, struct cx231xx_video_mode, vidq);
 291        struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
 292
 293        char *outp;
 294
 295        if (list_empty(&dma_q->active)) {
 296                cx231xx_isocdbg("No active queue to serve\n");
 297                dev->video_mode.isoc_ctl.buf = NULL;
 298                *buf = NULL;
 299                return;
 300        }
 301
 302        /* Get the next buffer */
 303        *buf = list_entry(dma_q->active.next, struct cx231xx_buffer, vb.queue);
 304
 305        /* Cleans up buffer - Usefull for testing for frame/URB loss */
 306        outp = videobuf_to_vmalloc(&(*buf)->vb);
 307        memset(outp, 0, (*buf)->vb.size);
 308
 309        dev->video_mode.isoc_ctl.buf = *buf;
 310
 311        return;
 312}
 313
 314/*
 315 * Controls the isoc copy of each urb packet
 316 */
 317static inline int cx231xx_isoc_copy(struct cx231xx *dev, struct urb *urb)
 318{
 319        struct cx231xx_buffer *buf;
 320        struct cx231xx_dmaqueue *dma_q = urb->context;
 321        unsigned char *outp = NULL;
 322        int i, rc = 1;
 323        unsigned char *p_buffer;
 324        u32 bytes_parsed = 0, buffer_size = 0;
 325        u8 sav_eav = 0;
 326
 327        if (!dev)
 328                return 0;
 329
 330        if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
 331                return 0;
 332
 333        if (urb->status < 0) {
 334                print_err_status(dev, -1, urb->status);
 335                if (urb->status == -ENOENT)
 336                        return 0;
 337        }
 338
 339        buf = dev->video_mode.isoc_ctl.buf;
 340        if (buf != NULL)
 341                outp = videobuf_to_vmalloc(&buf->vb);
 342
 343        for (i = 0; i < urb->number_of_packets; i++) {
 344                int status = urb->iso_frame_desc[i].status;
 345
 346                if (status < 0) {
 347                        print_err_status(dev, i, status);
 348                        if (urb->iso_frame_desc[i].status != -EPROTO)
 349                                continue;
 350                }
 351
 352                if (urb->iso_frame_desc[i].actual_length <= 0) {
 353                        /* cx231xx_isocdbg("packet %d is empty",i); - spammy */
 354                        continue;
 355                }
 356                if (urb->iso_frame_desc[i].actual_length >
 357                    dev->video_mode.max_pkt_size) {
 358                        cx231xx_isocdbg("packet bigger than packet size");
 359                        continue;
 360                }
 361
 362                /*  get buffer pointer and length */
 363                p_buffer = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
 364                buffer_size = urb->iso_frame_desc[i].actual_length;
 365                bytes_parsed = 0;
 366
 367                if (dma_q->is_partial_line) {
 368                        /* Handle the case of a partial line */
 369                        sav_eav = dma_q->last_sav;
 370                } else {
 371                        /* Check for a SAV/EAV overlapping
 372                                the buffer boundary */
 373                        sav_eav =
 374                            cx231xx_find_boundary_SAV_EAV(p_buffer,
 375                                                          dma_q->partial_buf,
 376                                                          &bytes_parsed);
 377                }
 378
 379                sav_eav &= 0xF0;
 380                /* Get the first line if we have some portion of an SAV/EAV from
 381                   the last buffer or a partial line  */
 382                if (sav_eav) {
 383                        bytes_parsed += cx231xx_get_video_line(dev, dma_q,
 384                                sav_eav,        /* SAV/EAV */
 385                                p_buffer + bytes_parsed,        /* p_buffer */
 386                                buffer_size - bytes_parsed);/* buf size */
 387                }
 388
 389                /* Now parse data that is completely in this buffer */
 390                /* dma_q->is_partial_line = 0;  */
 391
 392                while (bytes_parsed < buffer_size) {
 393                        u32 bytes_used = 0;
 394
 395                        sav_eav = cx231xx_find_next_SAV_EAV(
 396                                p_buffer + bytes_parsed,        /* p_buffer */
 397                                buffer_size - bytes_parsed,     /* buf size */
 398                                &bytes_used);/* bytes used to get SAV/EAV */
 399
 400                        bytes_parsed += bytes_used;
 401
 402                        sav_eav &= 0xF0;
 403                        if (sav_eav && (bytes_parsed < buffer_size)) {
 404                                bytes_parsed += cx231xx_get_video_line(dev,
 405                                        dma_q, sav_eav, /* SAV/EAV */
 406                                        p_buffer + bytes_parsed,/* p_buffer */
 407                                        buffer_size - bytes_parsed);/*buf size*/
 408                        }
 409                }
 410
 411                /* Save the last four bytes of the buffer so we can check the
 412                   buffer boundary condition next time */
 413                memcpy(dma_q->partial_buf, p_buffer + buffer_size - 4, 4);
 414                bytes_parsed = 0;
 415
 416        }
 417        return rc;
 418}
 419
 420u8 cx231xx_find_boundary_SAV_EAV(u8 *p_buffer, u8 *partial_buf,
 421                                 u32 *p_bytes_used)
 422{
 423        u32 bytes_used;
 424        u8 boundary_bytes[8];
 425        u8 sav_eav = 0;
 426
 427        *p_bytes_used = 0;
 428
 429        /* Create an array of the last 4 bytes of the last buffer and the first
 430           4 bytes of the current buffer. */
 431
 432        memcpy(boundary_bytes, partial_buf, 4);
 433        memcpy(boundary_bytes + 4, p_buffer, 4);
 434
 435        /* Check for the SAV/EAV in the boundary buffer */
 436        sav_eav = cx231xx_find_next_SAV_EAV((u8 *)&boundary_bytes, 8,
 437                                            &bytes_used);
 438
 439        if (sav_eav) {
 440                /* found a boundary SAV/EAV.  Updates the bytes used to reflect
 441                   only those used in the new buffer */
 442                *p_bytes_used = bytes_used - 4;
 443        }
 444
 445        return sav_eav;
 446}
 447
 448u8 cx231xx_find_next_SAV_EAV(u8 *p_buffer, u32 buffer_size, u32 *p_bytes_used)
 449{
 450        u32 i;
 451        u8 sav_eav = 0;
 452
 453        /*
 454         * Don't search if the buffer size is less than 4.  It causes a page
 455         * fault since buffer_size - 4 evaluates to a large number in that
 456         * case.
 457         */
 458        if (buffer_size < 4) {
 459                *p_bytes_used = buffer_size;
 460                return 0;
 461        }
 462
 463        for (i = 0; i < (buffer_size - 3); i++) {
 464
 465                if ((p_buffer[i] == 0xFF) &&
 466                    (p_buffer[i + 1] == 0x00) && (p_buffer[i + 2] == 0x00)) {
 467
 468                        *p_bytes_used = i + 4;
 469                        sav_eav = p_buffer[i + 3];
 470                        return sav_eav;
 471                }
 472        }
 473
 474        *p_bytes_used = buffer_size;
 475        return 0;
 476}
 477
 478u32 cx231xx_get_video_line(struct cx231xx *dev,
 479                           struct cx231xx_dmaqueue *dma_q, u8 sav_eav,
 480                           u8 *p_buffer, u32 buffer_size)
 481{
 482        u32 bytes_copied = 0;
 483        int current_field = -1;
 484
 485        switch (sav_eav) {
 486        case SAV_ACTIVE_VIDEO_FIELD1:
 487                /* looking for skipped line which occurred in PAL 720x480 mode.
 488                   In this case, there will be no active data contained
 489                   between the SAV and EAV */
 490                if ((buffer_size > 3) && (p_buffer[0] == 0xFF) &&
 491                    (p_buffer[1] == 0x00) && (p_buffer[2] == 0x00) &&
 492                    ((p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD1) ||
 493                     (p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD2) ||
 494                     (p_buffer[3] == EAV_VBLANK_FIELD1) ||
 495                     (p_buffer[3] == EAV_VBLANK_FIELD2)))
 496                        return bytes_copied;
 497                current_field = 1;
 498                break;
 499
 500        case SAV_ACTIVE_VIDEO_FIELD2:
 501                /* looking for skipped line which occurred in PAL 720x480 mode.
 502                   In this case, there will be no active data contained between
 503                   the SAV and EAV */
 504                if ((buffer_size > 3) && (p_buffer[0] == 0xFF) &&
 505                    (p_buffer[1] == 0x00) && (p_buffer[2] == 0x00) &&
 506                    ((p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD1) ||
 507                     (p_buffer[3] == EAV_ACTIVE_VIDEO_FIELD2) ||
 508                     (p_buffer[3] == EAV_VBLANK_FIELD1)       ||
 509                     (p_buffer[3] == EAV_VBLANK_FIELD2)))
 510                        return bytes_copied;
 511                current_field = 2;
 512                break;
 513        }
 514
 515        dma_q->last_sav = sav_eav;
 516
 517        bytes_copied = cx231xx_copy_video_line(dev, dma_q, p_buffer,
 518                                               buffer_size, current_field);
 519
 520        return bytes_copied;
 521}
 522
 523u32 cx231xx_copy_video_line(struct cx231xx *dev,
 524                            struct cx231xx_dmaqueue *dma_q, u8 *p_line,
 525                            u32 length, int field_number)
 526{
 527        u32 bytes_to_copy;
 528        struct cx231xx_buffer *buf;
 529        u32 _line_size = dev->width * 2;
 530
 531        if (dma_q->current_field != field_number)
 532                cx231xx_reset_video_buffer(dev, dma_q);
 533
 534        /* get the buffer pointer */
 535        buf = dev->video_mode.isoc_ctl.buf;
 536
 537        /* Remember the field number for next time */
 538        dma_q->current_field = field_number;
 539
 540        bytes_to_copy = dma_q->bytes_left_in_line;
 541        if (bytes_to_copy > length)
 542                bytes_to_copy = length;
 543
 544        if (dma_q->lines_completed >= dma_q->lines_per_field) {
 545                dma_q->bytes_left_in_line -= bytes_to_copy;
 546                dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0) ?
 547                                          0 : 1;
 548                return 0;
 549        }
 550
 551        dma_q->is_partial_line = 1;
 552
 553        /* If we don't have a buffer, just return the number of bytes we would
 554           have copied if we had a buffer. */
 555        if (!buf) {
 556                dma_q->bytes_left_in_line -= bytes_to_copy;
 557                dma_q->is_partial_line = (dma_q->bytes_left_in_line == 0)
 558                                         ? 0 : 1;
 559                return bytes_to_copy;
 560        }
 561
 562        /* copy the data to video buffer */
 563        cx231xx_do_copy(dev, dma_q, p_line, bytes_to_copy);
 564
 565        dma_q->pos += bytes_to_copy;
 566        dma_q->bytes_left_in_line -= bytes_to_copy;
 567
 568        if (dma_q->bytes_left_in_line == 0) {
 569                dma_q->bytes_left_in_line = _line_size;
 570                dma_q->lines_completed++;
 571                dma_q->is_partial_line = 0;
 572
 573                if (cx231xx_is_buffer_done(dev, dma_q) && buf) {
 574                        buffer_filled(dev, dma_q, buf);
 575
 576                        dma_q->pos = 0;
 577                        buf = NULL;
 578                        dma_q->lines_completed = 0;
 579                }
 580        }
 581
 582        return bytes_to_copy;
 583}
 584
 585void cx231xx_reset_video_buffer(struct cx231xx *dev,
 586                                struct cx231xx_dmaqueue *dma_q)
 587{
 588        struct cx231xx_buffer *buf;
 589
 590        /* handle the switch from field 1 to field 2 */
 591        if (dma_q->current_field == 1) {
 592                if (dma_q->lines_completed >= dma_q->lines_per_field)
 593                        dma_q->field1_done = 1;
 594                else
 595                        dma_q->field1_done = 0;
 596        }
 597
 598        buf = dev->video_mode.isoc_ctl.buf;
 599
 600        if (buf == NULL) {
 601                u8 *outp = NULL;
 602                /* first try to get the buffer */
 603                get_next_buf(dma_q, &buf);
 604
 605                if (buf)
 606                        outp = videobuf_to_vmalloc(&buf->vb);
 607
 608                dma_q->pos = 0;
 609                dma_q->field1_done = 0;
 610                dma_q->current_field = -1;
 611        }
 612
 613        /* reset the counters */
 614        dma_q->bytes_left_in_line = dev->width << 1;
 615        dma_q->lines_completed = 0;
 616}
 617
 618int cx231xx_do_copy(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q,
 619                    u8 *p_buffer, u32 bytes_to_copy)
 620{
 621        u8 *p_out_buffer = NULL;
 622        u32 current_line_bytes_copied = 0;
 623        struct cx231xx_buffer *buf;
 624        u32 _line_size = dev->width << 1;
 625        void *startwrite;
 626        int offset, lencopy;
 627
 628        buf = dev->video_mode.isoc_ctl.buf;
 629
 630        if (buf == NULL)
 631                return -1;
 632
 633        p_out_buffer = videobuf_to_vmalloc(&buf->vb);
 634
 635        current_line_bytes_copied = _line_size - dma_q->bytes_left_in_line;
 636
 637        /* Offset field 2 one line from the top of the buffer */
 638        offset = (dma_q->current_field == 1) ? 0 : _line_size;
 639
 640        /* Offset for field 2 */
 641        startwrite = p_out_buffer + offset;
 642
 643        /* lines already completed in the current field */
 644        startwrite += (dma_q->lines_completed * _line_size * 2);
 645
 646        /* bytes already completed in the current line */
 647        startwrite += current_line_bytes_copied;
 648
 649        lencopy = dma_q->bytes_left_in_line > bytes_to_copy ?
 650                  bytes_to_copy : dma_q->bytes_left_in_line;
 651
 652        if ((u8 *)(startwrite + lencopy) > (u8 *)(p_out_buffer + buf->vb.size))
 653                return 0;
 654
 655        /* The below copies the UYVY data straight into video buffer */
 656        cx231xx_swab((u16 *) p_buffer, (u16 *) startwrite, (u16) lencopy);
 657
 658        return 0;
 659}
 660
 661void cx231xx_swab(u16 *from, u16 *to, u16 len)
 662{
 663        u16 i;
 664
 665        if (len <= 0)
 666                return;
 667
 668        for (i = 0; i < len / 2; i++)
 669                to[i] = (from[i] << 8) | (from[i] >> 8);
 670}
 671
 672u8 cx231xx_is_buffer_done(struct cx231xx *dev, struct cx231xx_dmaqueue *dma_q)
 673{
 674        u8 buffer_complete = 0;
 675
 676        /* Dual field stream */
 677        buffer_complete = ((dma_q->current_field == 2) &&
 678                           (dma_q->lines_completed >= dma_q->lines_per_field) &&
 679                            dma_q->field1_done);
 680
 681        return buffer_complete;
 682}
 683
 684/* ------------------------------------------------------------------
 685        Videobuf operations
 686   ------------------------------------------------------------------*/
 687
 688static int
 689buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
 690{
 691        struct cx231xx_fh *fh = vq->priv_data;
 692        struct cx231xx *dev = fh->dev;
 693        struct v4l2_frequency f;
 694
 695        *size = (fh->dev->width * fh->dev->height * dev->format->depth + 7)>>3;
 696        if (0 == *count)
 697                *count = CX231XX_DEF_BUF;
 698
 699        if (*count < CX231XX_MIN_BUF)
 700                *count = CX231XX_MIN_BUF;
 701
 702        /* Ask tuner to go to analog mode */
 703        memset(&f, 0, sizeof(f));
 704        f.frequency = dev->ctl_freq;
 705        f.type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
 706
 707        call_all(dev, tuner, s_frequency, &f);
 708
 709        return 0;
 710}
 711
 712/* This is called *without* dev->slock held; please keep it that way */
 713static void free_buffer(struct videobuf_queue *vq, struct cx231xx_buffer *buf)
 714{
 715        struct cx231xx_fh *fh = vq->priv_data;
 716        struct cx231xx *dev = fh->dev;
 717        unsigned long flags = 0;
 718
 719        if (in_interrupt())
 720                BUG();
 721
 722        /* We used to wait for the buffer to finish here, but this didn't work
 723           because, as we were keeping the state as VIDEOBUF_QUEUED,
 724           videobuf_queue_cancel marked it as finished for us.
 725           (Also, it could wedge forever if the hardware was misconfigured.)
 726
 727           This should be safe; by the time we get here, the buffer isn't
 728           queued anymore. If we ever start marking the buffers as
 729           VIDEOBUF_ACTIVE, it won't be, though.
 730         */
 731        spin_lock_irqsave(&dev->video_mode.slock, flags);
 732        if (dev->video_mode.isoc_ctl.buf == buf)
 733                dev->video_mode.isoc_ctl.buf = NULL;
 734        spin_unlock_irqrestore(&dev->video_mode.slock, flags);
 735
 736        videobuf_vmalloc_free(&buf->vb);
 737        buf->vb.state = VIDEOBUF_NEEDS_INIT;
 738}
 739
 740static int
 741buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
 742               enum v4l2_field field)
 743{
 744        struct cx231xx_fh *fh = vq->priv_data;
 745        struct cx231xx_buffer *buf =
 746            container_of(vb, struct cx231xx_buffer, vb);
 747        struct cx231xx *dev = fh->dev;
 748        int rc = 0, urb_init = 0;
 749
 750        /* The only currently supported format is 16 bits/pixel */
 751        buf->vb.size = (fh->dev->width * fh->dev->height * dev->format->depth
 752                        + 7) >> 3;
 753        if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
 754                return -EINVAL;
 755
 756        buf->vb.width = dev->width;
 757        buf->vb.height = dev->height;
 758        buf->vb.field = field;
 759
 760        if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
 761                rc = videobuf_iolock(vq, &buf->vb, NULL);
 762                if (rc < 0)
 763                        goto fail;
 764        }
 765
 766        if (!dev->video_mode.isoc_ctl.num_bufs)
 767                urb_init = 1;
 768
 769        if (urb_init) {
 770                rc = cx231xx_init_isoc(dev, CX231XX_NUM_PACKETS,
 771                                       CX231XX_NUM_BUFS,
 772                                       dev->video_mode.max_pkt_size,
 773                                       cx231xx_isoc_copy);
 774                if (rc < 0)
 775                        goto fail;
 776        }
 777
 778        buf->vb.state = VIDEOBUF_PREPARED;
 779        return 0;
 780
 781fail:
 782        free_buffer(vq, buf);
 783        return rc;
 784}
 785
 786static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 787{
 788        struct cx231xx_buffer *buf =
 789            container_of(vb, struct cx231xx_buffer, vb);
 790        struct cx231xx_fh *fh = vq->priv_data;
 791        struct cx231xx *dev = fh->dev;
 792        struct cx231xx_dmaqueue *vidq = &dev->video_mode.vidq;
 793
 794        buf->vb.state = VIDEOBUF_QUEUED;
 795        list_add_tail(&buf->vb.queue, &vidq->active);
 796
 797}
 798
 799static void buffer_release(struct videobuf_queue *vq,
 800                           struct videobuf_buffer *vb)
 801{
 802        struct cx231xx_buffer *buf =
 803            container_of(vb, struct cx231xx_buffer, vb);
 804        struct cx231xx_fh *fh = vq->priv_data;
 805        struct cx231xx *dev = (struct cx231xx *)fh->dev;
 806
 807        cx231xx_isocdbg("cx231xx: called buffer_release\n");
 808
 809        free_buffer(vq, buf);
 810}
 811
 812static struct videobuf_queue_ops cx231xx_video_qops = {
 813        .buf_setup = buffer_setup,
 814        .buf_prepare = buffer_prepare,
 815        .buf_queue = buffer_queue,
 816        .buf_release = buffer_release,
 817};
 818
 819/*********************  v4l2 interface  **************************************/
 820
 821void video_mux(struct cx231xx *dev, int index)
 822{
 823        dev->video_input = index;
 824        dev->ctl_ainput = INPUT(index)->amux;
 825
 826        cx231xx_set_video_input_mux(dev, index);
 827
 828        cx25840_call(dev, video, s_routing, INPUT(index)->vmux, 0, 0);
 829
 830        cx231xx_set_audio_input(dev, dev->ctl_ainput);
 831
 832        cx231xx_info("video_mux : %d\n", index);
 833
 834        /* do mode control overrides if required */
 835        cx231xx_do_mode_ctrl_overrides(dev);
 836}
 837
 838/* Usage lock check functions */
 839static int res_get(struct cx231xx_fh *fh)
 840{
 841        struct cx231xx *dev = fh->dev;
 842        int rc = 0;
 843
 844        /* This instance already has stream_on */
 845        if (fh->stream_on)
 846                return rc;
 847
 848        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
 849                if (dev->stream_on)
 850                        return -EBUSY;
 851                dev->stream_on = 1;
 852        } else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
 853                if (dev->vbi_stream_on)
 854                        return -EBUSY;
 855                dev->vbi_stream_on = 1;
 856        } else
 857                return -EINVAL;
 858
 859        fh->stream_on = 1;
 860
 861        return rc;
 862}
 863
 864static int res_check(struct cx231xx_fh *fh)
 865{
 866        return fh->stream_on;
 867}
 868
 869static void res_free(struct cx231xx_fh *fh)
 870{
 871        struct cx231xx *dev = fh->dev;
 872
 873        fh->stream_on = 0;
 874
 875        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
 876                dev->stream_on = 0;
 877        if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
 878                dev->vbi_stream_on = 0;
 879}
 880
 881static int check_dev(struct cx231xx *dev)
 882{
 883        if (dev->state & DEV_DISCONNECTED) {
 884                cx231xx_errdev("v4l2 ioctl: device not present\n");
 885                return -ENODEV;
 886        }
 887
 888        if (dev->state & DEV_MISCONFIGURED) {
 889                cx231xx_errdev("v4l2 ioctl: device is misconfigured; "
 890                               "close and open it again\n");
 891                return -EIO;
 892        }
 893        return 0;
 894}
 895
 896static void get_scale(struct cx231xx *dev,
 897                      unsigned int width, unsigned int height,
 898                      unsigned int *hscale, unsigned int *vscale)
 899{
 900        unsigned int maxw = norm_maxw(dev);
 901        unsigned int maxh = norm_maxh(dev);
 902
 903        *hscale = (((unsigned long)maxw) << 12) / width - 4096L;
 904        if (*hscale >= 0x4000)
 905                *hscale = 0x3fff;
 906
 907        *vscale = (((unsigned long)maxh) << 12) / height - 4096L;
 908        if (*vscale >= 0x4000)
 909                *vscale = 0x3fff;
 910}
 911
 912/* ------------------------------------------------------------------
 913        IOCTL vidioc handling
 914   ------------------------------------------------------------------*/
 915
 916static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
 917                                struct v4l2_format *f)
 918{
 919        struct cx231xx_fh *fh = priv;
 920        struct cx231xx *dev = fh->dev;
 921
 922        mutex_lock(&dev->lock);
 923
 924        f->fmt.pix.width = dev->width;
 925        f->fmt.pix.height = dev->height;
 926        f->fmt.pix.pixelformat = dev->format->fourcc;
 927        f->fmt.pix.bytesperline = (dev->width * dev->format->depth + 7) >> 3;
 928        f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * dev->height;
 929        f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
 930
 931        f->fmt.pix.field = V4L2_FIELD_INTERLACED;
 932
 933        mutex_unlock(&dev->lock);
 934
 935        return 0;
 936}
 937
 938static struct cx231xx_fmt *format_by_fourcc(unsigned int fourcc)
 939{
 940        unsigned int i;
 941
 942        for (i = 0; i < ARRAY_SIZE(format); i++)
 943                if (format[i].fourcc == fourcc)
 944                        return &format[i];
 945
 946        return NULL;
 947}
 948
 949static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
 950                                  struct v4l2_format *f)
 951{
 952        struct cx231xx_fh *fh = priv;
 953        struct cx231xx *dev = fh->dev;
 954        unsigned int width = f->fmt.pix.width;
 955        unsigned int height = f->fmt.pix.height;
 956        unsigned int maxw = norm_maxw(dev);
 957        unsigned int maxh = norm_maxh(dev);
 958        unsigned int hscale, vscale;
 959        struct cx231xx_fmt *fmt;
 960
 961        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
 962        if (!fmt) {
 963                cx231xx_videodbg("Fourcc format (%08x) invalid.\n",
 964                                 f->fmt.pix.pixelformat);
 965                return -EINVAL;
 966        }
 967
 968        /* width must even because of the YUYV format
 969           height must be even because of interlacing */
 970        v4l_bound_align_image(&width, 48, maxw, 1, &height, 32, maxh, 1, 0);
 971
 972        get_scale(dev, width, height, &hscale, &vscale);
 973
 974        width = (((unsigned long)maxw) << 12) / (hscale + 4096L);
 975        height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
 976
 977        f->fmt.pix.width = width;
 978        f->fmt.pix.height = height;
 979        f->fmt.pix.pixelformat = fmt->fourcc;
 980        f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3;
 981        f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
 982        f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
 983        f->fmt.pix.field = V4L2_FIELD_INTERLACED;
 984
 985        return 0;
 986}
 987
 988static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 989                                struct v4l2_format *f)
 990{
 991        struct cx231xx_fh *fh = priv;
 992        struct cx231xx *dev = fh->dev;
 993        int rc;
 994        struct cx231xx_fmt *fmt;
 995
 996        rc = check_dev(dev);
 997        if (rc < 0)
 998                return rc;
 999
1000        mutex_lock(&dev->lock);
1001
1002        vidioc_try_fmt_vid_cap(file, priv, f);
1003
1004        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1005        if (!fmt) {
1006                rc = -EINVAL;
1007                goto out;
1008        }
1009
1010        if (videobuf_queue_is_busy(&fh->vb_vidq)) {
1011                cx231xx_errdev("%s queue busy\n", __func__);
1012                rc = -EBUSY;
1013                goto out;
1014        }
1015
1016        if (dev->stream_on && !fh->stream_on) {
1017                cx231xx_errdev("%s device in use by another fh\n", __func__);
1018                rc = -EBUSY;
1019                goto out;
1020        }
1021
1022        /* set new image size */
1023        dev->width = f->fmt.pix.width;
1024        dev->height = f->fmt.pix.height;
1025        dev->format = fmt;
1026        get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
1027
1028        call_all(dev, video, s_fmt, f);
1029
1030        /* Set the correct alternate setting for this resolution */
1031        cx231xx_resolution_set(dev);
1032
1033out:
1034        mutex_unlock(&dev->lock);
1035        return rc;
1036}
1037
1038static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id * id)
1039{
1040        struct cx231xx_fh *fh = priv;
1041        struct cx231xx *dev = fh->dev;
1042
1043        *id = dev->norm;
1044        return 0;
1045}
1046
1047static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
1048{
1049        struct cx231xx_fh *fh = priv;
1050        struct cx231xx *dev = fh->dev;
1051        struct v4l2_format f;
1052        int rc;
1053
1054        rc = check_dev(dev);
1055        if (rc < 0)
1056                return rc;
1057
1058        cx231xx_info("vidioc_s_std : 0x%x\n", (unsigned int)*norm);
1059
1060        mutex_lock(&dev->lock);
1061        dev->norm = *norm;
1062
1063        /* Adjusts width/height, if needed */
1064        f.fmt.pix.width = dev->width;
1065        f.fmt.pix.height = dev->height;
1066        vidioc_try_fmt_vid_cap(file, priv, &f);
1067
1068        /* set new image size */
1069        dev->width = f.fmt.pix.width;
1070        dev->height = f.fmt.pix.height;
1071        get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
1072
1073        call_all(dev, core, s_std, dev->norm);
1074
1075        mutex_unlock(&dev->lock);
1076
1077        cx231xx_resolution_set(dev);
1078
1079        /* do mode control overrides */
1080        cx231xx_do_mode_ctrl_overrides(dev);
1081
1082        return 0;
1083}
1084
1085static const char *iname[] = {
1086        [CX231XX_VMUX_COMPOSITE1] = "Composite1",
1087        [CX231XX_VMUX_SVIDEO]     = "S-Video",
1088        [CX231XX_VMUX_TELEVISION] = "Television",
1089        [CX231XX_VMUX_CABLE]      = "Cable TV",
1090        [CX231XX_VMUX_DVB]        = "DVB",
1091        [CX231XX_VMUX_DEBUG]      = "for debug only",
1092};
1093
1094static int vidioc_enum_input(struct file *file, void *priv,
1095                             struct v4l2_input *i)
1096{
1097        struct cx231xx_fh *fh = priv;
1098        struct cx231xx *dev = fh->dev;
1099        unsigned int n;
1100
1101        n = i->index;
1102        if (n >= MAX_CX231XX_INPUT)
1103                return -EINVAL;
1104        if (0 == INPUT(n)->type)
1105                return -EINVAL;
1106
1107        i->index = n;
1108        i->type = V4L2_INPUT_TYPE_CAMERA;
1109
1110        strcpy(i->name, iname[INPUT(n)->type]);
1111
1112        if ((CX231XX_VMUX_TELEVISION == INPUT(n)->type) ||
1113            (CX231XX_VMUX_CABLE == INPUT(n)->type))
1114                i->type = V4L2_INPUT_TYPE_TUNER;
1115
1116        i->std = dev->vdev->tvnorms;
1117
1118        return 0;
1119}
1120
1121static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1122{
1123        struct cx231xx_fh *fh = priv;
1124        struct cx231xx *dev = fh->dev;
1125
1126        *i = dev->video_input;
1127
1128        return 0;
1129}
1130
1131static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1132{
1133        struct cx231xx_fh *fh = priv;
1134        struct cx231xx *dev = fh->dev;
1135        int rc;
1136
1137        rc = check_dev(dev);
1138        if (rc < 0)
1139                return rc;
1140
1141        if (i >= MAX_CX231XX_INPUT)
1142                return -EINVAL;
1143        if (0 == INPUT(i)->type)
1144                return -EINVAL;
1145
1146        mutex_lock(&dev->lock);
1147
1148        video_mux(dev, i);
1149
1150        mutex_unlock(&dev->lock);
1151        return 0;
1152}
1153
1154static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1155{
1156        struct cx231xx_fh *fh = priv;
1157        struct cx231xx *dev = fh->dev;
1158
1159        switch (a->index) {
1160        case CX231XX_AMUX_VIDEO:
1161                strcpy(a->name, "Television");
1162                break;
1163        case CX231XX_AMUX_LINE_IN:
1164                strcpy(a->name, "Line In");
1165                break;
1166        default:
1167                return -EINVAL;
1168        }
1169
1170        a->index = dev->ctl_ainput;
1171        a->capability = V4L2_AUDCAP_STEREO;
1172
1173        return 0;
1174}
1175
1176static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
1177{
1178        struct cx231xx_fh *fh = priv;
1179        struct cx231xx *dev = fh->dev;
1180        int status = 0;
1181
1182        /* Doesn't allow manual routing */
1183        if (a->index != dev->ctl_ainput)
1184                return -EINVAL;
1185
1186        dev->ctl_ainput = INPUT(a->index)->amux;
1187        status = cx231xx_set_audio_input(dev, dev->ctl_ainput);
1188
1189        return status;
1190}
1191
1192static int vidioc_queryctrl(struct file *file, void *priv,
1193                            struct v4l2_queryctrl *qc)
1194{
1195        struct cx231xx_fh *fh = priv;
1196        struct cx231xx *dev = fh->dev;
1197        int id = qc->id;
1198        int i;
1199        int rc;
1200
1201        rc = check_dev(dev);
1202        if (rc < 0)
1203                return rc;
1204
1205        qc->id = v4l2_ctrl_next(ctrl_classes, qc->id);
1206        if (unlikely(qc->id == 0))
1207                return -EINVAL;
1208
1209        memset(qc, 0, sizeof(*qc));
1210
1211        qc->id = id;
1212
1213        if (qc->id < V4L2_CID_BASE || qc->id >= V4L2_CID_LASTP1)
1214                return -EINVAL;
1215
1216        for (i = 0; i < CX231XX_CTLS; i++)
1217                if (cx231xx_ctls[i].v.id == qc->id)
1218                        break;
1219
1220        if (i == CX231XX_CTLS) {
1221                *qc = no_ctl;
1222                return 0;
1223        }
1224        *qc = cx231xx_ctls[i].v;
1225
1226        mutex_lock(&dev->lock);
1227        call_all(dev, core, queryctrl, qc);
1228        mutex_unlock(&dev->lock);
1229
1230        if (qc->type)
1231                return 0;
1232        else
1233                return -EINVAL;
1234}
1235
1236static int vidioc_g_ctrl(struct file *file, void *priv,
1237                         struct v4l2_control *ctrl)
1238{
1239        struct cx231xx_fh *fh = priv;
1240        struct cx231xx *dev = fh->dev;
1241        int rc;
1242
1243        rc = check_dev(dev);
1244        if (rc < 0)
1245                return rc;
1246
1247        mutex_lock(&dev->lock);
1248        call_all(dev, core, g_ctrl, ctrl);
1249        mutex_unlock(&dev->lock);
1250        return rc;
1251}
1252
1253static int vidioc_s_ctrl(struct file *file, void *priv,
1254                         struct v4l2_control *ctrl)
1255{
1256        struct cx231xx_fh *fh = priv;
1257        struct cx231xx *dev = fh->dev;
1258        int rc;
1259
1260        rc = check_dev(dev);
1261        if (rc < 0)
1262                return rc;
1263
1264        mutex_lock(&dev->lock);
1265        call_all(dev, core, s_ctrl, ctrl);
1266        mutex_unlock(&dev->lock);
1267        return rc;
1268}
1269
1270static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1271{
1272        struct cx231xx_fh *fh = priv;
1273        struct cx231xx *dev = fh->dev;
1274        int rc;
1275
1276        rc = check_dev(dev);
1277        if (rc < 0)
1278                return rc;
1279
1280        if (0 != t->index)
1281                return -EINVAL;
1282
1283        strcpy(t->name, "Tuner");
1284
1285        t->type = V4L2_TUNER_ANALOG_TV;
1286        t->capability = V4L2_TUNER_CAP_NORM;
1287        t->rangehigh = 0xffffffffUL;
1288        t->signal = 0xffff;     /* LOCKED */
1289
1290        return 0;
1291}
1292
1293static int vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1294{
1295        struct cx231xx_fh *fh = priv;
1296        struct cx231xx *dev = fh->dev;
1297        int rc;
1298
1299        rc = check_dev(dev);
1300        if (rc < 0)
1301                return rc;
1302
1303        if (0 != t->index)
1304                return -EINVAL;
1305#if 0
1306        mutex_lock(&dev->lock);
1307        call_all(dev, tuner, s_tuner, t);
1308        mutex_unlock(&dev->lock);
1309#endif
1310        return 0;
1311}
1312
1313static int vidioc_g_frequency(struct file *file, void *priv,
1314                              struct v4l2_frequency *f)
1315{
1316        struct cx231xx_fh *fh = priv;
1317        struct cx231xx *dev = fh->dev;
1318
1319        mutex_lock(&dev->lock);
1320        f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
1321        f->frequency = dev->ctl_freq;
1322
1323        call_all(dev, tuner, g_frequency, f);
1324
1325        mutex_unlock(&dev->lock);
1326
1327        return 0;
1328}
1329
1330static int vidioc_s_frequency(struct file *file, void *priv,
1331                              struct v4l2_frequency *f)
1332{
1333        struct cx231xx_fh *fh = priv;
1334        struct cx231xx *dev = fh->dev;
1335        int rc;
1336
1337        rc = check_dev(dev);
1338        if (rc < 0)
1339                return rc;
1340
1341        if (0 != f->tuner)
1342                return -EINVAL;
1343
1344        if (unlikely(0 == fh->radio && f->type != V4L2_TUNER_ANALOG_TV))
1345                return -EINVAL;
1346        if (unlikely(1 == fh->radio && f->type != V4L2_TUNER_RADIO))
1347                return -EINVAL;
1348
1349        /* set pre channel change settings in DIF first */
1350        rc = cx231xx_tuner_pre_channel_change(dev);
1351
1352        mutex_lock(&dev->lock);
1353
1354        dev->ctl_freq = f->frequency;
1355
1356        if (dev->tuner_type == TUNER_XC5000) {
1357                if (dev->cx231xx_set_analog_freq != NULL)
1358                        dev->cx231xx_set_analog_freq(dev, f->frequency);
1359        } else
1360                call_all(dev, tuner, s_frequency, f);
1361
1362        mutex_unlock(&dev->lock);
1363
1364        /* set post channel change settings in DIF first */
1365        rc = cx231xx_tuner_post_channel_change(dev);
1366
1367        cx231xx_info("Set New FREQUENCY to %d\n", f->frequency);
1368
1369        return rc;
1370}
1371
1372#ifdef CONFIG_VIDEO_ADV_DEBUG
1373
1374/*
1375  -R, --list-registers=type=<host/i2cdrv/i2caddr>,
1376                                chip=<chip>[,min=<addr>,max=<addr>]
1377                     dump registers from <min> to <max> [VIDIOC_DBG_G_REGISTER]
1378  -r, --set-register=type=<host/i2cdrv/i2caddr>,
1379                                chip=<chip>,reg=<addr>,val=<val>
1380                     set the register [VIDIOC_DBG_S_REGISTER]
1381
1382  if type == host, then <chip> is the hosts chip ID (default 0)
1383  if type == i2cdrv (default), then <chip> is the I2C driver name or ID
1384  if type == i2caddr, then <chip> is the 7-bit I2C address
1385*/
1386
1387static int vidioc_g_register(struct file *file, void *priv,
1388                             struct v4l2_dbg_register *reg)
1389{
1390        struct cx231xx_fh *fh = priv;
1391        struct cx231xx *dev = fh->dev;
1392        int ret = 0;
1393        u8 value[4] = { 0, 0, 0, 0 };
1394        u32 data = 0;
1395
1396        switch (reg->match.type) {
1397        case V4L2_CHIP_MATCH_HOST:
1398                switch (reg->match.addr) {
1399                case 0: /* Cx231xx - internal registers */
1400                        ret = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER,
1401                                                  (u16)reg->reg, value, 4);
1402                        reg->val = value[0] | value[1] << 8 |
1403                                   value[2] << 16 | value[3] << 24;
1404                        break;
1405                case 1: /* AFE - read byte */
1406                        ret = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
1407                                                  (u16)reg->reg, 2, &data, 1);
1408                        reg->val = le32_to_cpu(data & 0xff);
1409                        break;
1410                case 14: /* AFE - read dword */
1411                        ret = cx231xx_read_i2c_data(dev, AFE_DEVICE_ADDRESS,
1412                                                  (u16)reg->reg, 2, &data, 4);
1413                        reg->val = le32_to_cpu(data);
1414                        break;
1415                case 2: /* Video Block - read byte */
1416                        ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1417                                                  (u16)reg->reg, 2, &data, 1);
1418                        reg->val = le32_to_cpu(data & 0xff);
1419                        break;
1420                case 24: /* Video Block - read dword */
1421                        ret = cx231xx_read_i2c_data(dev, VID_BLK_I2C_ADDRESS,
1422                                                  (u16)reg->reg, 2, &data, 4);
1423                        reg->val = le32_to_cpu(data);
1424                        break;
1425                case 3: /* I2S block - read byte */
1426                        ret = cx231xx_read_i2c_data(dev,
1427                                                    I2S_BLK_DEVICE_ADDRESS,
1428                                                    (u16)reg->reg, 1,
1429                                                    &data, 1);
1430                        reg->val = le32_to_cpu(data & 0xff);
1431                        break;
1432                case 34: /* I2S Block - read dword */
1433                        ret =
1434                            cx231xx_read_i2c_data(dev, I2S_BLK_DEVICE_ADDRESS,
1435                                                  (u16)reg->reg, 1, &data, 4);
1436                        reg->val = le32_to_cpu(data);
1437                        break;
1438                }
1439                return ret < 0 ? ret : 0;
1440
1441        case V4L2_CHIP_MATCH_I2C_DRIVER:
1442                call_all(dev, core, g_register, reg);
1443                return 0;
1444        case V4L2_CHIP_MATCH_I2C_ADDR:
1445                /* Not supported yet */
1446                return -EINVAL;
1447        default:
1448                if (!v4l2_chip_match_host(&reg->match))
1449                        return -EINVAL;
1450        }
1451
1452        mutex_lock(&dev->lock);
1453        call_all(dev, core, g_register, reg);
1454        mutex_unlock(&dev->lock);
1455
1456        return ret;
1457}
1458
1459static int vidioc_s_register(struct file *file, void *priv,
1460                             struct v4l2_dbg_register *reg)
1461{
1462        struct cx231xx_fh *fh = priv;
1463        struct cx231xx *dev = fh->dev;
1464        int ret = 0;
1465        __le64 buf;
1466        u32 value;
1467        u8 data[4] = { 0, 0, 0, 0 };
1468
1469        buf = cpu_to_le64(reg->val);
1470
1471        switch (reg->match.type) {
1472        case V4L2_CHIP_MATCH_HOST:
1473                {
1474                        value = (u32) buf & 0xffffffff;
1475
1476                        switch (reg->match.addr) {
1477                        case 0: /* cx231xx internal registers */
1478                                data[0] = (u8) value;
1479                                data[1] = (u8) (value >> 8);
1480                                data[2] = (u8) (value >> 16);
1481                                data[3] = (u8) (value >> 24);
1482                                ret = cx231xx_write_ctrl_reg(dev,
1483                                                           VRT_SET_REGISTER,
1484                                                           (u16)reg->reg, data,
1485                                                           4);
1486                                break;
1487                        case 1: /* AFE - read byte */
1488                                ret = cx231xx_write_i2c_data(dev,
1489                                                        AFE_DEVICE_ADDRESS,
1490                                                        (u16)reg->reg, 2,
1491                                                        value, 1);
1492                                break;
1493                        case 14: /* AFE - read dword */
1494                                ret = cx231xx_write_i2c_data(dev,
1495                                                        AFE_DEVICE_ADDRESS,
1496                                                        (u16)reg->reg, 2,
1497                                                        value, 4);
1498                                break;
1499                        case 2: /* Video Block - read byte */
1500                                ret =
1501                                    cx231xx_write_i2c_data(dev,
1502                                                        VID_BLK_I2C_ADDRESS,
1503                                                        (u16)reg->reg, 2,
1504                                                        value, 1);
1505                                break;
1506                        case 24: /* Video Block - read dword */
1507                                ret =
1508                                    cx231xx_write_i2c_data(dev,
1509                                                        VID_BLK_I2C_ADDRESS,
1510                                                        (u16)reg->reg, 2,
1511                                                        value, 4);
1512                                break;
1513                        case 3: /* I2S block - read byte */
1514                                ret =
1515                                    cx231xx_write_i2c_data(dev,
1516                                                        I2S_BLK_DEVICE_ADDRESS,
1517                                                        (u16)reg->reg, 1,
1518                                                        value, 1);
1519                                break;
1520                        case 34: /* I2S block - read dword */
1521                                ret =
1522                                    cx231xx_write_i2c_data(dev,
1523                                                        I2S_BLK_DEVICE_ADDRESS,
1524                                                        (u16)reg->reg, 1,
1525                                                        value, 4);
1526                                break;
1527                        }
1528                }
1529                return ret < 0 ? ret : 0;
1530
1531        default:
1532                break;
1533        }
1534
1535        mutex_lock(&dev->lock);
1536        call_all(dev, core, s_register, reg);
1537        mutex_unlock(&dev->lock);
1538
1539        return ret;
1540}
1541#endif
1542
1543static int vidioc_cropcap(struct file *file, void *priv,
1544                          struct v4l2_cropcap *cc)
1545{
1546        struct cx231xx_fh *fh = priv;
1547        struct cx231xx *dev = fh->dev;
1548
1549        if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1550                return -EINVAL;
1551
1552        cc->bounds.left = 0;
1553        cc->bounds.top = 0;
1554        cc->bounds.width = dev->width;
1555        cc->bounds.height = dev->height;
1556        cc->defrect = cc->bounds;
1557        cc->pixelaspect.numerator = 54; /* 4:3 FIXME: remove magic numbers */
1558        cc->pixelaspect.denominator = 59;
1559
1560        return 0;
1561}
1562
1563static int vidioc_streamon(struct file *file, void *priv,
1564                           enum v4l2_buf_type type)
1565{
1566        struct cx231xx_fh *fh = priv;
1567        struct cx231xx *dev = fh->dev;
1568        int rc;
1569
1570        rc = check_dev(dev);
1571        if (rc < 0)
1572                return rc;
1573
1574        mutex_lock(&dev->lock);
1575        rc = res_get(fh);
1576
1577        if (likely(rc >= 0))
1578                rc = videobuf_streamon(&fh->vb_vidq);
1579
1580        call_all(dev, video, s_stream, 1);
1581
1582        mutex_unlock(&dev->lock);
1583
1584        return rc;
1585}
1586
1587static int vidioc_streamoff(struct file *file, void *priv,
1588                            enum v4l2_buf_type type)
1589{
1590        struct cx231xx_fh *fh = priv;
1591        struct cx231xx *dev = fh->dev;
1592        int rc;
1593
1594        rc = check_dev(dev);
1595        if (rc < 0)
1596                return rc;
1597
1598        if ((fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
1599            (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE))
1600                return -EINVAL;
1601        if (type != fh->type)
1602                return -EINVAL;
1603
1604        mutex_lock(&dev->lock);
1605
1606        cx25840_call(dev, video, s_stream, 0);
1607
1608        videobuf_streamoff(&fh->vb_vidq);
1609        res_free(fh);
1610
1611        mutex_unlock(&dev->lock);
1612
1613        return 0;
1614}
1615
1616static int vidioc_querycap(struct file *file, void *priv,
1617                           struct v4l2_capability *cap)
1618{
1619        struct cx231xx_fh *fh = priv;
1620        struct cx231xx *dev = fh->dev;
1621
1622        strlcpy(cap->driver, "cx231xx", sizeof(cap->driver));
1623        strlcpy(cap->card, cx231xx_boards[dev->model].name, sizeof(cap->card));
1624        usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
1625
1626        cap->version = CX231XX_VERSION_CODE;
1627
1628        cap->capabilities = V4L2_CAP_VBI_CAPTURE |
1629#if 0
1630                V4L2_CAP_SLICED_VBI_CAPTURE |
1631#endif
1632                V4L2_CAP_VIDEO_CAPTURE  |
1633                V4L2_CAP_AUDIO          |
1634                V4L2_CAP_READWRITE      |
1635                V4L2_CAP_STREAMING;
1636
1637        if (dev->tuner_type != TUNER_ABSENT)
1638                cap->capabilities |= V4L2_CAP_TUNER;
1639
1640        return 0;
1641}
1642
1643static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
1644                                   struct v4l2_fmtdesc *f)
1645{
1646        if (unlikely(f->index >= ARRAY_SIZE(format)))
1647                return -EINVAL;
1648
1649        strlcpy(f->description, format[f->index].name, sizeof(f->description));
1650        f->pixelformat = format[f->index].fourcc;
1651
1652        return 0;
1653}
1654
1655/* Sliced VBI ioctls */
1656static int vidioc_g_fmt_sliced_vbi_cap(struct file *file, void *priv,
1657                                       struct v4l2_format *f)
1658{
1659        struct cx231xx_fh *fh = priv;
1660        struct cx231xx *dev = fh->dev;
1661        int rc;
1662
1663        rc = check_dev(dev);
1664        if (rc < 0)
1665                return rc;
1666
1667        mutex_lock(&dev->lock);
1668
1669        f->fmt.sliced.service_set = 0;
1670
1671        call_all(dev, video, g_fmt, f);
1672
1673        if (f->fmt.sliced.service_set == 0)
1674                rc = -EINVAL;
1675
1676        mutex_unlock(&dev->lock);
1677        return rc;
1678}
1679
1680static int vidioc_try_set_sliced_vbi_cap(struct file *file, void *priv,
1681                                         struct v4l2_format *f)
1682{
1683        struct cx231xx_fh *fh = priv;
1684        struct cx231xx *dev = fh->dev;
1685        int rc;
1686
1687        rc = check_dev(dev);
1688        if (rc < 0)
1689                return rc;
1690
1691        mutex_lock(&dev->lock);
1692        call_all(dev, video, g_fmt, f);
1693        mutex_unlock(&dev->lock);
1694
1695        if (f->fmt.sliced.service_set == 0)
1696                return -EINVAL;
1697
1698        return 0;
1699}
1700
1701/* RAW VBI ioctls */
1702
1703static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv,
1704                                struct v4l2_format *f)
1705{
1706        struct cx231xx_fh *fh = priv;
1707        struct cx231xx *dev = fh->dev;
1708
1709        f->fmt.vbi.sampling_rate = (dev->norm & V4L2_STD_625_50) ?
1710            35468950 : 28636363;
1711        f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
1712        f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1713        f->fmt.vbi.offset = 64 * 4;
1714        f->fmt.vbi.start[0] = (dev->norm & V4L2_STD_625_50) ?
1715            PAL_VBI_START_LINE : NTSC_VBI_START_LINE;
1716        f->fmt.vbi.count[0] = (dev->norm & V4L2_STD_625_50) ?
1717            PAL_VBI_LINES : NTSC_VBI_LINES;
1718        f->fmt.vbi.start[1] = (dev->norm & V4L2_STD_625_50) ?
1719            PAL_VBI_START_LINE + 312 : NTSC_VBI_START_LINE + 263;
1720        f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
1721
1722        return 0;
1723
1724}
1725
1726static int vidioc_try_fmt_vbi_cap(struct file *file, void *priv,
1727                                  struct v4l2_format *f)
1728{
1729        struct cx231xx_fh *fh = priv;
1730        struct cx231xx *dev = fh->dev;
1731
1732        if (dev->vbi_stream_on && !fh->stream_on) {
1733                cx231xx_errdev("%s device in use by another fh\n", __func__);
1734                return -EBUSY;
1735        }
1736
1737        f->type = V4L2_BUF_TYPE_VBI_CAPTURE;
1738        f->fmt.vbi.sampling_rate = (dev->norm & V4L2_STD_625_50) ?
1739            35468950 : 28636363;
1740        f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
1741        f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1742        f->fmt.vbi.offset = 244;
1743        f->fmt.vbi.flags = 0;
1744        f->fmt.vbi.start[0] = (dev->norm & V4L2_STD_625_50) ?
1745            PAL_VBI_START_LINE : NTSC_VBI_START_LINE;
1746        f->fmt.vbi.count[0] = (dev->norm & V4L2_STD_625_50) ?
1747            PAL_VBI_LINES : NTSC_VBI_LINES;
1748        f->fmt.vbi.start[1] = (dev->norm & V4L2_STD_625_50) ?
1749            PAL_VBI_START_LINE + 312 : NTSC_VBI_START_LINE + 263;
1750        f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
1751
1752        return 0;
1753
1754}
1755
1756static int vidioc_reqbufs(struct file *file, void *priv,
1757                          struct v4l2_requestbuffers *rb)
1758{
1759        struct cx231xx_fh *fh = priv;
1760        struct cx231xx *dev = fh->dev;
1761        int rc;
1762
1763        rc = check_dev(dev);
1764        if (rc < 0)
1765                return rc;
1766
1767        return videobuf_reqbufs(&fh->vb_vidq, rb);
1768}
1769
1770static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *b)
1771{
1772        struct cx231xx_fh *fh = priv;
1773        struct cx231xx *dev = fh->dev;
1774        int rc;
1775
1776        rc = check_dev(dev);
1777        if (rc < 0)
1778                return rc;
1779
1780        return videobuf_querybuf(&fh->vb_vidq, b);
1781}
1782
1783static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1784{
1785        struct cx231xx_fh *fh = priv;
1786        struct cx231xx *dev = fh->dev;
1787        int rc;
1788
1789        rc = check_dev(dev);
1790        if (rc < 0)
1791                return rc;
1792
1793        return videobuf_qbuf(&fh->vb_vidq, b);
1794}
1795
1796static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1797{
1798        struct cx231xx_fh *fh = priv;
1799        struct cx231xx *dev = fh->dev;
1800        int rc;
1801
1802        rc = check_dev(dev);
1803        if (rc < 0)
1804                return rc;
1805
1806        return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
1807}
1808
1809#ifdef CONFIG_VIDEO_V4L1_COMPAT
1810static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1811{
1812        struct cx231xx_fh *fh = priv;
1813
1814        return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1815}
1816#endif
1817
1818/* ----------------------------------------------------------- */
1819/* RADIO ESPECIFIC IOCTLS                                      */
1820/* ----------------------------------------------------------- */
1821
1822static int radio_querycap(struct file *file, void *priv,
1823                          struct v4l2_capability *cap)
1824{
1825        struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
1826
1827        strlcpy(cap->driver, "cx231xx", sizeof(cap->driver));
1828        strlcpy(cap->card, cx231xx_boards[dev->model].name, sizeof(cap->card));
1829        usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
1830
1831        cap->version = CX231XX_VERSION_CODE;
1832        cap->capabilities = V4L2_CAP_TUNER;
1833        return 0;
1834}
1835
1836static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1837{
1838        struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
1839
1840        if (unlikely(t->index > 0))
1841                return -EINVAL;
1842
1843        strcpy(t->name, "Radio");
1844        t->type = V4L2_TUNER_RADIO;
1845
1846        mutex_lock(&dev->lock);
1847        call_all(dev, tuner, s_tuner, t);
1848        mutex_unlock(&dev->lock);
1849
1850        return 0;
1851}
1852
1853static int radio_enum_input(struct file *file, void *priv, struct v4l2_input *i)
1854{
1855        if (i->index != 0)
1856                return -EINVAL;
1857        strcpy(i->name, "Radio");
1858        i->type = V4L2_INPUT_TYPE_TUNER;
1859
1860        return 0;
1861}
1862
1863static int radio_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
1864{
1865        if (unlikely(a->index))
1866                return -EINVAL;
1867
1868        strcpy(a->name, "Radio");
1869        return 0;
1870}
1871
1872static int radio_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
1873{
1874        struct cx231xx *dev = ((struct cx231xx_fh *)priv)->dev;
1875
1876        if (0 != t->index)
1877                return -EINVAL;
1878
1879        mutex_lock(&dev->lock);
1880        call_all(dev, tuner, s_tuner, t);
1881        mutex_unlock(&dev->lock);
1882
1883        return 0;
1884}
1885
1886static int radio_s_audio(struct file *file, void *fh, struct v4l2_audio *a)
1887{
1888        return 0;
1889}
1890
1891static int radio_s_input(struct file *file, void *fh, unsigned int i)
1892{
1893        return 0;
1894}
1895
1896static int radio_queryctrl(struct file *file, void *priv,
1897                           struct v4l2_queryctrl *c)
1898{
1899        int i;
1900
1901        if (c->id < V4L2_CID_BASE || c->id >= V4L2_CID_LASTP1)
1902                return -EINVAL;
1903        if (c->id == V4L2_CID_AUDIO_MUTE) {
1904                for (i = 0; i < CX231XX_CTLS; i++)
1905                        if (cx231xx_ctls[i].v.id == c->id)
1906                                break;
1907                *c = cx231xx_ctls[i].v;
1908        } else
1909                *c = no_ctl;
1910        return 0;
1911}
1912
1913/*
1914 * cx231xx_v4l2_open()
1915 * inits the device and starts isoc transfer
1916 */
1917static int cx231xx_v4l2_open(struct file *filp)
1918{
1919        int minor = video_devdata(filp)->minor;
1920        int errCode = 0, radio = 0;
1921        struct cx231xx *dev = NULL;
1922        struct cx231xx_fh *fh;
1923        enum v4l2_buf_type fh_type = 0;
1924
1925        dev = cx231xx_get_device(minor, &fh_type, &radio);
1926        if (NULL == dev)
1927                return -ENODEV;
1928
1929        mutex_lock(&dev->lock);
1930
1931        cx231xx_videodbg("open minor=%d type=%s users=%d\n",
1932                         minor, v4l2_type_names[fh_type], dev->users);
1933
1934#if 0
1935        errCode = cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1936        if (errCode < 0) {
1937                cx231xx_errdev
1938                    ("Device locked on digital mode. Can't open analog\n");
1939                mutex_unlock(&dev->lock);
1940                return -EBUSY;
1941        }
1942#endif
1943
1944        fh = kzalloc(sizeof(struct cx231xx_fh), GFP_KERNEL);
1945        if (!fh) {
1946                cx231xx_errdev("cx231xx-video.c: Out of memory?!\n");
1947                mutex_unlock(&dev->lock);
1948                return -ENOMEM;
1949        }
1950        fh->dev = dev;
1951        fh->radio = radio;
1952        fh->type = fh_type;
1953        filp->private_data = fh;
1954
1955        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
1956                dev->width = norm_maxw(dev);
1957                dev->height = norm_maxh(dev);
1958                dev->hscale = 0;
1959                dev->vscale = 0;
1960
1961                /* Power up in Analog TV mode */
1962                cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
1963
1964#if 0
1965                cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
1966#endif
1967                cx231xx_resolution_set(dev);
1968
1969                /* set video alternate setting */
1970                cx231xx_set_video_alternate(dev);
1971
1972                /* Needed, since GPIO might have disabled power of
1973                   some i2c device */
1974                cx231xx_config_i2c(dev);
1975
1976                /* device needs to be initialized before isoc transfer */
1977                dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1978                video_mux(dev, dev->video_input);
1979
1980        }
1981        if (fh->radio) {
1982                cx231xx_videodbg("video_open: setting radio device\n");
1983
1984                /* cx231xx_start_radio(dev); */
1985
1986                call_all(dev, tuner, s_radio);
1987        }
1988
1989        dev->users++;
1990
1991        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1992                videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_video_qops,
1993                                            NULL, &dev->video_mode.slock,
1994                                            fh->type, V4L2_FIELD_INTERLACED,
1995                                            sizeof(struct cx231xx_buffer), fh);
1996        if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
1997                /* Set the required alternate setting  VBI interface works in
1998                   Bulk mode only */
1999                cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
2000
2001                videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_vbi_qops,
2002                                            NULL, &dev->vbi_mode.slock,
2003                                            fh->type, V4L2_FIELD_SEQ_TB,
2004                                            sizeof(struct cx231xx_buffer), fh);
2005        }
2006
2007        mutex_unlock(&dev->lock);
2008
2009        return errCode;
2010}
2011
2012/*
2013 * cx231xx_realease_resources()
2014 * unregisters the v4l2,i2c and usb devices
2015 * called when the device gets disconected or at module unload
2016*/
2017void cx231xx_release_analog_resources(struct cx231xx *dev)
2018{
2019
2020        /*FIXME: I2C IR should be disconnected */
2021
2022        if (dev->radio_dev) {
2023                if (-1 != dev->radio_dev->minor)
2024                        video_unregister_device(dev->radio_dev);
2025                else
2026                        video_device_release(dev->radio_dev);
2027                dev->radio_dev = NULL;
2028        }
2029        if (dev->vbi_dev) {
2030                cx231xx_info("V4L2 device /dev/vbi%d deregistered\n",
2031                             dev->vbi_dev->num);
2032                if (-1 != dev->vbi_dev->minor)
2033                        video_unregister_device(dev->vbi_dev);
2034                else
2035                        video_device_release(dev->vbi_dev);
2036                dev->vbi_dev = NULL;
2037        }
2038        if (dev->vdev) {
2039                cx231xx_info("V4L2 device /dev/video%d deregistered\n",
2040                             dev->vdev->num);
2041                if (-1 != dev->vdev->minor)
2042                        video_unregister_device(dev->vdev);
2043                else
2044                        video_device_release(dev->vdev);
2045                dev->vdev = NULL;
2046        }
2047}
2048
2049/*
2050 * cx231xx_v4l2_close()
2051 * stops streaming and deallocates all resources allocated by the v4l2
2052 * calls and ioctls
2053 */
2054static int cx231xx_v4l2_close(struct file *filp)
2055{
2056        struct cx231xx_fh *fh = filp->private_data;
2057        struct cx231xx *dev = fh->dev;
2058
2059        cx231xx_videodbg("users=%d\n", dev->users);
2060
2061        mutex_lock(&dev->lock);
2062
2063        if (res_check(fh))
2064                res_free(fh);
2065
2066        if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
2067                videobuf_stop(&fh->vb_vidq);
2068                videobuf_mmap_free(&fh->vb_vidq);
2069
2070                /* the device is already disconnect,
2071                   free the remaining resources */
2072                if (dev->state & DEV_DISCONNECTED) {
2073                        cx231xx_release_resources(dev);
2074                        mutex_unlock(&dev->lock);
2075                        kfree(dev);
2076                        return 0;
2077                }
2078
2079                /* do this before setting alternate! */
2080                cx231xx_uninit_vbi_isoc(dev);
2081
2082                /* set alternate 0 */
2083                if (!dev->vbi_or_sliced_cc_mode)
2084                        cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
2085                else
2086                        cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
2087
2088                kfree(fh);
2089                dev->users--;
2090                wake_up_interruptible_nr(&dev->open, 1);
2091                mutex_unlock(&dev->lock);
2092                return 0;
2093        }
2094
2095        if (dev->users == 1) {
2096                videobuf_stop(&fh->vb_vidq);
2097                videobuf_mmap_free(&fh->vb_vidq);
2098
2099                /* the device is already disconnect,
2100                   free the remaining resources */
2101                if (dev->state & DEV_DISCONNECTED) {
2102                        cx231xx_release_resources(dev);
2103                        mutex_unlock(&dev->lock);
2104                        kfree(dev);
2105                        return 0;
2106                }
2107
2108                /* Save some power by putting tuner to sleep */
2109                call_all(dev, tuner, s_standby);
2110
2111                /* do this before setting alternate! */
2112                cx231xx_uninit_isoc(dev);
2113                cx231xx_set_mode(dev, CX231XX_SUSPEND);
2114
2115                /* set alternate 0 */
2116                cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
2117        }
2118        kfree(fh);
2119        dev->users--;
2120        wake_up_interruptible_nr(&dev->open, 1);
2121        mutex_unlock(&dev->lock);
2122        return 0;
2123}
2124
2125/*
2126 * cx231xx_v4l2_read()
2127 * will allocate buffers when called for the first time
2128 */
2129static ssize_t
2130cx231xx_v4l2_read(struct file *filp, char __user *buf, size_t count,
2131                  loff_t *pos)
2132{
2133        struct cx231xx_fh *fh = filp->private_data;
2134        struct cx231xx *dev = fh->dev;
2135        int rc;
2136
2137        rc = check_dev(dev);
2138        if (rc < 0)
2139                return rc;
2140
2141        if ((fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ||
2142            (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)) {
2143                mutex_lock(&dev->lock);
2144                rc = res_get(fh);
2145                mutex_unlock(&dev->lock);
2146
2147                if (unlikely(rc < 0))
2148                        return rc;
2149
2150                return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
2151                                            filp->f_flags & O_NONBLOCK);
2152        }
2153        return 0;
2154}
2155
2156/*
2157 * cx231xx_v4l2_poll()
2158 * will allocate buffers when called for the first time
2159 */
2160static unsigned int cx231xx_v4l2_poll(struct file *filp, poll_table * wait)
2161{
2162        struct cx231xx_fh *fh = filp->private_data;
2163        struct cx231xx *dev = fh->dev;
2164        int rc;
2165
2166        rc = check_dev(dev);
2167        if (rc < 0)
2168                return rc;
2169
2170        mutex_lock(&dev->lock);
2171        rc = res_get(fh);
2172        mutex_unlock(&dev->lock);
2173
2174        if (unlikely(rc < 0))
2175                return POLLERR;
2176
2177        if ((V4L2_BUF_TYPE_VIDEO_CAPTURE == fh->type) ||
2178            (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type))
2179                return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
2180        else
2181                return POLLERR;
2182}
2183
2184/*
2185 * cx231xx_v4l2_mmap()
2186 */
2187static int cx231xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
2188{
2189        struct cx231xx_fh *fh = filp->private_data;
2190        struct cx231xx *dev = fh->dev;
2191        int rc;
2192
2193        rc = check_dev(dev);
2194        if (rc < 0)
2195                return rc;
2196
2197        mutex_lock(&dev->lock);
2198        rc = res_get(fh);
2199        mutex_unlock(&dev->lock);
2200
2201        if (unlikely(rc < 0))
2202                return rc;
2203
2204        rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
2205
2206        cx231xx_videodbg("vma start=0x%08lx, size=%ld, ret=%d\n",
2207                         (unsigned long)vma->vm_start,
2208                         (unsigned long)vma->vm_end -
2209                         (unsigned long)vma->vm_start, rc);
2210
2211        return rc;
2212}
2213
2214static const struct v4l2_file_operations cx231xx_v4l_fops = {
2215        .owner   = THIS_MODULE,
2216        .open    = cx231xx_v4l2_open,
2217        .release = cx231xx_v4l2_close,
2218        .read    = cx231xx_v4l2_read,
2219        .poll    = cx231xx_v4l2_poll,
2220        .mmap    = cx231xx_v4l2_mmap,
2221        .ioctl   = video_ioctl2,
2222};
2223
2224static const struct v4l2_ioctl_ops video_ioctl_ops = {
2225        .vidioc_querycap               = vidioc_querycap,
2226        .vidioc_enum_fmt_vid_cap       = vidioc_enum_fmt_vid_cap,
2227        .vidioc_g_fmt_vid_cap          = vidioc_g_fmt_vid_cap,
2228        .vidioc_try_fmt_vid_cap        = vidioc_try_fmt_vid_cap,
2229        .vidioc_s_fmt_vid_cap          = vidioc_s_fmt_vid_cap,
2230        .vidioc_g_fmt_vbi_cap          = vidioc_g_fmt_vbi_cap,
2231        .vidioc_try_fmt_vbi_cap        = vidioc_try_fmt_vbi_cap,
2232        .vidioc_s_fmt_vbi_cap          = vidioc_try_fmt_vbi_cap,
2233        .vidioc_g_audio                =  vidioc_g_audio,
2234        .vidioc_s_audio                = vidioc_s_audio,
2235        .vidioc_cropcap                = vidioc_cropcap,
2236        .vidioc_g_fmt_sliced_vbi_cap   = vidioc_g_fmt_sliced_vbi_cap,
2237        .vidioc_try_fmt_sliced_vbi_cap = vidioc_try_set_sliced_vbi_cap,
2238        .vidioc_reqbufs                = vidioc_reqbufs,
2239        .vidioc_querybuf               = vidioc_querybuf,
2240        .vidioc_qbuf                   = vidioc_qbuf,
2241        .vidioc_dqbuf                  = vidioc_dqbuf,
2242        .vidioc_s_std                  = vidioc_s_std,
2243        .vidioc_g_std                  = vidioc_g_std,
2244        .vidioc_enum_input             = vidioc_enum_input,
2245        .vidioc_g_input                = vidioc_g_input,
2246        .vidioc_s_input                = vidioc_s_input,
2247        .vidioc_queryctrl              = vidioc_queryctrl,
2248        .vidioc_g_ctrl                 = vidioc_g_ctrl,
2249        .vidioc_s_ctrl                 = vidioc_s_ctrl,
2250        .vidioc_streamon               = vidioc_streamon,
2251        .vidioc_streamoff              = vidioc_streamoff,
2252        .vidioc_g_tuner                = vidioc_g_tuner,
2253        .vidioc_s_tuner                = vidioc_s_tuner,
2254        .vidioc_g_frequency            = vidioc_g_frequency,
2255        .vidioc_s_frequency            = vidioc_s_frequency,
2256#ifdef CONFIG_VIDEO_ADV_DEBUG
2257        .vidioc_g_register             = vidioc_g_register,
2258        .vidioc_s_register             = vidioc_s_register,
2259#endif
2260#ifdef CONFIG_VIDEO_V4L1_COMPAT
2261        .vidiocgmbuf                   = vidiocgmbuf,
2262#endif
2263};
2264
2265static struct video_device cx231xx_vbi_template;
2266
2267static const struct video_device cx231xx_video_template = {
2268        .fops         = &cx231xx_v4l_fops,
2269        .release      = video_device_release,
2270        .ioctl_ops    = &video_ioctl_ops,
2271        .minor        = -1,
2272        .tvnorms      = V4L2_STD_ALL,
2273        .current_norm = V4L2_STD_PAL,
2274};
2275
2276static const struct v4l2_file_operations radio_fops = {
2277        .owner   = THIS_MODULE,
2278        .open   = cx231xx_v4l2_open,
2279        .release = cx231xx_v4l2_close,
2280        .ioctl   = video_ioctl2,
2281};
2282
2283static const struct v4l2_ioctl_ops radio_ioctl_ops = {
2284        .vidioc_querycap    = radio_querycap,
2285        .vidioc_g_tuner     = radio_g_tuner,
2286        .vidioc_enum_input  = radio_enum_input,
2287        .vidioc_g_audio     = radio_g_audio,
2288        .vidioc_s_tuner     = radio_s_tuner,
2289        .vidioc_s_audio     = radio_s_audio,
2290        .vidioc_s_input     = radio_s_input,
2291        .vidioc_queryctrl   = radio_queryctrl,
2292        .vidioc_g_ctrl      = vidioc_g_ctrl,
2293        .vidioc_s_ctrl      = vidioc_s_ctrl,
2294        .vidioc_g_frequency = vidioc_g_frequency,
2295        .vidioc_s_frequency = vidioc_s_frequency,
2296#ifdef CONFIG_VIDEO_ADV_DEBUG
2297        .vidioc_g_register  = vidioc_g_register,
2298        .vidioc_s_register  = vidioc_s_register,
2299#endif
2300};
2301
2302static struct video_device cx231xx_radio_template = {
2303        .name      = "cx231xx-radio",
2304        .fops      = &radio_fops,
2305        .ioctl_ops = &radio_ioctl_ops,
2306        .minor     = -1,
2307};
2308
2309/******************************** usb interface ******************************/
2310
2311static struct video_device *cx231xx_vdev_init(struct cx231xx *dev,
2312                const struct video_device
2313                *template, const char *type_name)
2314{
2315        struct video_device *vfd;
2316
2317        vfd = video_device_alloc();
2318        if (NULL == vfd)
2319                return NULL;
2320
2321        *vfd = *template;
2322        vfd->minor = -1;
2323        vfd->v4l2_dev = &dev->v4l2_dev;
2324        vfd->release = video_device_release;
2325        vfd->debug = video_debug;
2326
2327        snprintf(vfd->name, sizeof(vfd->name), "%s %s", dev->name, type_name);
2328
2329        return vfd;
2330}
2331
2332int cx231xx_register_analog_devices(struct cx231xx *dev)
2333{
2334        int ret;
2335
2336        cx231xx_info("%s: v4l2 driver version %d.%d.%d\n",
2337                     dev->name,
2338                     (CX231XX_VERSION_CODE >> 16) & 0xff,
2339                     (CX231XX_VERSION_CODE >> 8) & 0xff,
2340                     CX231XX_VERSION_CODE & 0xff);
2341
2342        /* set default norm */
2343        /*dev->norm = cx231xx_video_template.current_norm; */
2344        dev->width = norm_maxw(dev);
2345        dev->height = norm_maxh(dev);
2346        dev->interlaced = 0;
2347        dev->hscale = 0;
2348        dev->vscale = 0;
2349
2350        /* Analog specific initialization */
2351        dev->format = &format[0];
2352        /* video_mux(dev, dev->video_input); */
2353
2354        /* Audio defaults */
2355        dev->mute = 1;
2356        dev->volume = 0x1f;
2357
2358        /* enable vbi capturing */
2359        /* write code here...  */
2360
2361        /* allocate and fill video video_device struct */
2362        dev->vdev = cx231xx_vdev_init(dev, &cx231xx_video_template, "video");
2363        if (!dev->vdev) {
2364                cx231xx_errdev("cannot allocate video_device.\n");
2365                return -ENODEV;
2366        }
2367
2368        /* register v4l2 video video_device */
2369        ret = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
2370                                    video_nr[dev->devno]);
2371        if (ret) {
2372                cx231xx_errdev("unable to register video device (error=%i).\n",
2373                               ret);
2374                return ret;
2375        }
2376
2377        cx231xx_info("%s/0: registered device video%d [v4l2]\n",
2378                     dev->name, dev->vdev->num);
2379
2380        /* Initialize VBI template */
2381        memcpy(&cx231xx_vbi_template, &cx231xx_video_template,
2382               sizeof(cx231xx_vbi_template));
2383        strcpy(cx231xx_vbi_template.name, "cx231xx-vbi");
2384
2385        /* Allocate and fill vbi video_device struct */
2386        dev->vbi_dev = cx231xx_vdev_init(dev, &cx231xx_vbi_template, "vbi");
2387
2388        /* register v4l2 vbi video_device */
2389        ret = video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
2390                                    vbi_nr[dev->devno]);
2391        if (ret < 0) {
2392                cx231xx_errdev("unable to register vbi device\n");
2393                return ret;
2394        }
2395
2396        cx231xx_info("%s/0: registered device vbi%d\n",
2397                     dev->name, dev->vbi_dev->num);
2398
2399        if (cx231xx_boards[dev->model].radio.type == CX231XX_RADIO) {
2400                dev->radio_dev = cx231xx_vdev_init(dev, &cx231xx_radio_template,
2401                                                   "radio");
2402                if (!dev->radio_dev) {
2403                        cx231xx_errdev("cannot allocate video_device.\n");
2404                        return -ENODEV;
2405                }
2406                ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
2407                                            radio_nr[dev->devno]);
2408                if (ret < 0) {
2409                        cx231xx_errdev("can't register radio device\n");
2410                        return ret;
2411                }
2412                cx231xx_info("Registered radio device as /dev/radio%d\n",
2413                             dev->radio_dev->num);
2414        }
2415
2416        cx231xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n",
2417                     dev->vdev->num, dev->vbi_dev->num);
2418
2419        return 0;
2420}
2421