linux/drivers/media/pci/cx23885/cx23885-video.c
<<
>>
Prefs
   1/*
   2 *  Driver for the Conexant CX23885 PCIe bridge
   3 *
   4 *  Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License as published by
   8 *  the Free Software Foundation; either version 2 of the License, or
   9 *  (at your option) any later version.
  10 *
  11 *  This program is distributed in the hope that it will be useful,
  12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *
  15 *  GNU General Public License for more details.
  16 *
  17 *  You should have received a copy of the GNU General Public License
  18 *  along with this program; if not, write to the Free Software
  19 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 */
  21
  22#include <linux/init.h>
  23#include <linux/list.h>
  24#include <linux/module.h>
  25#include <linux/moduleparam.h>
  26#include <linux/kmod.h>
  27#include <linux/kernel.h>
  28#include <linux/slab.h>
  29#include <linux/interrupt.h>
  30#include <linux/delay.h>
  31#include <linux/kthread.h>
  32#include <asm/div64.h>
  33
  34#include "cx23885.h"
  35#include <media/v4l2-common.h>
  36#include <media/v4l2-ioctl.h>
  37#include "cx23885-ioctl.h"
  38#include "tuner-xc2028.h"
  39
  40#include <media/cx25840.h>
  41
  42MODULE_DESCRIPTION("v4l2 driver module for cx23885 based TV cards");
  43MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
  44MODULE_LICENSE("GPL");
  45
  46/* ------------------------------------------------------------------ */
  47
  48static unsigned int video_nr[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET };
  49static unsigned int vbi_nr[]   = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET };
  50static unsigned int radio_nr[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET };
  51
  52module_param_array(video_nr, int, NULL, 0444);
  53module_param_array(vbi_nr,   int, NULL, 0444);
  54module_param_array(radio_nr, int, NULL, 0444);
  55
  56MODULE_PARM_DESC(video_nr, "video device numbers");
  57MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
  58MODULE_PARM_DESC(radio_nr, "radio device numbers");
  59
  60static unsigned int video_debug;
  61module_param(video_debug, int, 0644);
  62MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
  63
  64static unsigned int irq_debug;
  65module_param(irq_debug, int, 0644);
  66MODULE_PARM_DESC(irq_debug, "enable debug messages [IRQ handler]");
  67
  68static unsigned int vid_limit = 16;
  69module_param(vid_limit, int, 0644);
  70MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");
  71
  72#define dprintk(level, fmt, arg...)\
  73        do { if (video_debug >= level)\
  74                printk(KERN_DEBUG "%s: " fmt, dev->name, ## arg);\
  75        } while (0)
  76
  77/* ------------------------------------------------------------------- */
  78/* static data                                                         */
  79
  80#define FORMAT_FLAGS_PACKED       0x01
  81#if 0
  82static struct cx23885_fmt formats[] = {
  83        {
  84                .name     = "8 bpp, gray",
  85                .fourcc   = V4L2_PIX_FMT_GREY,
  86                .depth    = 8,
  87                .flags    = FORMAT_FLAGS_PACKED,
  88        }, {
  89                .name     = "15 bpp RGB, le",
  90                .fourcc   = V4L2_PIX_FMT_RGB555,
  91                .depth    = 16,
  92                .flags    = FORMAT_FLAGS_PACKED,
  93        }, {
  94                .name     = "15 bpp RGB, be",
  95                .fourcc   = V4L2_PIX_FMT_RGB555X,
  96                .depth    = 16,
  97                .flags    = FORMAT_FLAGS_PACKED,
  98        }, {
  99                .name     = "16 bpp RGB, le",
 100                .fourcc   = V4L2_PIX_FMT_RGB565,
 101                .depth    = 16,
 102                .flags    = FORMAT_FLAGS_PACKED,
 103        }, {
 104                .name     = "16 bpp RGB, be",
 105                .fourcc   = V4L2_PIX_FMT_RGB565X,
 106                .depth    = 16,
 107                .flags    = FORMAT_FLAGS_PACKED,
 108        }, {
 109                .name     = "24 bpp RGB, le",
 110                .fourcc   = V4L2_PIX_FMT_BGR24,
 111                .depth    = 24,
 112                .flags    = FORMAT_FLAGS_PACKED,
 113        }, {
 114                .name     = "32 bpp RGB, le",
 115                .fourcc   = V4L2_PIX_FMT_BGR32,
 116                .depth    = 32,
 117                .flags    = FORMAT_FLAGS_PACKED,
 118        }, {
 119                .name     = "32 bpp RGB, be",
 120                .fourcc   = V4L2_PIX_FMT_RGB32,
 121                .depth    = 32,
 122                .flags    = FORMAT_FLAGS_PACKED,
 123        }, {
 124                .name     = "4:2:2, packed, YUYV",
 125                .fourcc   = V4L2_PIX_FMT_YUYV,
 126                .depth    = 16,
 127                .flags    = FORMAT_FLAGS_PACKED,
 128        }, {
 129                .name     = "4:2:2, packed, UYVY",
 130                .fourcc   = V4L2_PIX_FMT_UYVY,
 131                .depth    = 16,
 132                .flags    = FORMAT_FLAGS_PACKED,
 133        },
 134};
 135#else
 136static struct cx23885_fmt formats[] = {
 137        {
 138#if 0
 139                .name     = "4:2:2, packed, UYVY",
 140                .fourcc   = V4L2_PIX_FMT_UYVY,
 141                .depth    = 16,
 142                .flags    = FORMAT_FLAGS_PACKED,
 143        }, {
 144#endif
 145                .name     = "4:2:2, packed, YUYV",
 146                .fourcc   = V4L2_PIX_FMT_YUYV,
 147                .depth    = 16,
 148                .flags    = FORMAT_FLAGS_PACKED,
 149        }
 150};
 151#endif
 152
 153static struct cx23885_fmt *format_by_fourcc(unsigned int fourcc)
 154{
 155        unsigned int i;
 156
 157        for (i = 0; i < ARRAY_SIZE(formats); i++)
 158                if (formats[i].fourcc == fourcc)
 159                        return formats+i;
 160
 161        printk(KERN_ERR "%s(%c%c%c%c) NOT FOUND\n", __func__,
 162                (fourcc & 0xff),
 163                ((fourcc >> 8) & 0xff),
 164                ((fourcc >> 16) & 0xff),
 165                ((fourcc >> 24) & 0xff)
 166                );
 167        return NULL;
 168}
 169
 170/* ------------------------------------------------------------------- */
 171
 172static const struct v4l2_queryctrl no_ctl = {
 173        .name  = "42",
 174        .flags = V4L2_CTRL_FLAG_DISABLED,
 175};
 176
 177static struct cx23885_ctrl cx23885_ctls[] = {
 178        /* --- video --- */
 179        {
 180                .v = {
 181                        .id            = V4L2_CID_BRIGHTNESS,
 182                        .name          = "Brightness",
 183                        .minimum       = 0x00,
 184                        .maximum       = 0xff,
 185                        .step          = 1,
 186                        .default_value = 0x7f,
 187                        .type          = V4L2_CTRL_TYPE_INTEGER,
 188                },
 189                .off                   = 128,
 190                .reg                   = LUMA_CTRL,
 191                .mask                  = 0x00ff,
 192                .shift                 = 0,
 193        }, {
 194                .v = {
 195                        .id            = V4L2_CID_CONTRAST,
 196                        .name          = "Contrast",
 197                        .minimum       = 0,
 198                        .maximum       = 0x7f,
 199                        .step          = 1,
 200                        .default_value = 0x3f,
 201                        .type          = V4L2_CTRL_TYPE_INTEGER,
 202                },
 203                .off                   = 0,
 204                .reg                   = LUMA_CTRL,
 205                .mask                  = 0xff00,
 206                .shift                 = 8,
 207        }, {
 208                .v = {
 209                        .id            = V4L2_CID_HUE,
 210                        .name          = "Hue",
 211                        .minimum       = -127,
 212                        .maximum       = 128,
 213                        .step          = 1,
 214                        .default_value = 0x0,
 215                        .type          = V4L2_CTRL_TYPE_INTEGER,
 216                },
 217                .off                   = 128,
 218                .reg                   = CHROMA_CTRL,
 219                .mask                  = 0xff0000,
 220                .shift                 = 16,
 221        }, {
 222                /* strictly, this only describes only U saturation.
 223                 * V saturation is handled specially through code.
 224                 */
 225                .v = {
 226                        .id            = V4L2_CID_SATURATION,
 227                        .name          = "Saturation",
 228                        .minimum       = 0,
 229                        .maximum       = 0x7f,
 230                        .step          = 1,
 231                        .default_value = 0x3f,
 232                        .type          = V4L2_CTRL_TYPE_INTEGER,
 233                },
 234                .off                   = 0,
 235                .reg                   = CHROMA_CTRL,
 236                .mask                  = 0x00ff,
 237                .shift                 = 0,
 238        }, {
 239        /* --- audio --- */
 240                .v = {
 241                        .id            = V4L2_CID_AUDIO_MUTE,
 242                        .name          = "Mute",
 243                        .minimum       = 0,
 244                        .maximum       = 1,
 245                        .default_value = 1,
 246                        .type          = V4L2_CTRL_TYPE_BOOLEAN,
 247                },
 248                .reg                   = PATH1_CTL1,
 249                .mask                  = (0x1f << 24),
 250                .shift                 = 24,
 251        }, {
 252                .v = {
 253                        .id            = V4L2_CID_AUDIO_VOLUME,
 254                        .name          = "Volume",
 255                        .minimum       = 0,
 256                        .maximum       = 65535,
 257                        .step          = 65535 / 100,
 258                        .default_value = 65535,
 259                        .type          = V4L2_CTRL_TYPE_INTEGER,
 260                },
 261                .reg                   = PATH1_VOL_CTL,
 262                .mask                  = 0xff,
 263                .shift                 = 0,
 264        }
 265};
 266static const int CX23885_CTLS = ARRAY_SIZE(cx23885_ctls);
 267
 268/* Must be sorted from low to high control ID! */
 269static const u32 cx23885_user_ctrls[] = {
 270        V4L2_CID_USER_CLASS,
 271        V4L2_CID_BRIGHTNESS,
 272        V4L2_CID_CONTRAST,
 273        V4L2_CID_SATURATION,
 274        V4L2_CID_HUE,
 275        V4L2_CID_AUDIO_VOLUME,
 276        V4L2_CID_AUDIO_MUTE,
 277        0
 278};
 279
 280static const u32 *ctrl_classes[] = {
 281        cx23885_user_ctrls,
 282        NULL
 283};
 284
 285void cx23885_video_wakeup(struct cx23885_dev *dev,
 286        struct cx23885_dmaqueue *q, u32 count)
 287{
 288        struct cx23885_buffer *buf;
 289        int bc;
 290
 291        for (bc = 0;; bc++) {
 292                if (list_empty(&q->active))
 293                        break;
 294                buf = list_entry(q->active.next,
 295                                 struct cx23885_buffer, vb.queue);
 296
 297                /* count comes from the hw and is is 16bit wide --
 298                 * this trick handles wrap-arounds correctly for
 299                 * up to 32767 buffers in flight... */
 300                if ((s16) (count - buf->count) < 0)
 301                        break;
 302
 303                v4l2_get_timestamp(&buf->vb.ts);
 304                dprintk(2, "[%p/%d] wakeup reg=%d buf=%d\n", buf, buf->vb.i,
 305                        count, buf->count);
 306                buf->vb.state = VIDEOBUF_DONE;
 307                list_del(&buf->vb.queue);
 308                wake_up(&buf->vb.done);
 309        }
 310        if (list_empty(&q->active))
 311                del_timer(&q->timeout);
 312        else
 313                mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
 314        if (bc != 1)
 315                printk(KERN_ERR "%s: %d buffers handled (should be 1)\n",
 316                        __func__, bc);
 317}
 318
 319int cx23885_set_tvnorm(struct cx23885_dev *dev, v4l2_std_id norm)
 320{
 321        dprintk(1, "%s(norm = 0x%08x) name: [%s]\n",
 322                __func__,
 323                (unsigned int)norm,
 324                v4l2_norm_to_name(norm));
 325
 326        dev->tvnorm = norm;
 327
 328        call_all(dev, core, s_std, norm);
 329
 330        return 0;
 331}
 332
 333static struct video_device *cx23885_vdev_init(struct cx23885_dev *dev,
 334                                    struct pci_dev *pci,
 335                                    struct video_device *template,
 336                                    char *type)
 337{
 338        struct video_device *vfd;
 339        dprintk(1, "%s()\n", __func__);
 340
 341        vfd = video_device_alloc();
 342        if (NULL == vfd)
 343                return NULL;
 344        *vfd = *template;
 345        vfd->v4l2_dev = &dev->v4l2_dev;
 346        vfd->release = video_device_release;
 347        snprintf(vfd->name, sizeof(vfd->name), "%s (%s)",
 348                 cx23885_boards[dev->board].name, type);
 349        video_set_drvdata(vfd, dev);
 350        return vfd;
 351}
 352
 353static int cx23885_ctrl_query(struct v4l2_queryctrl *qctrl)
 354{
 355        int i;
 356
 357        if (qctrl->id < V4L2_CID_BASE ||
 358            qctrl->id >= V4L2_CID_LASTP1)
 359                return -EINVAL;
 360        for (i = 0; i < CX23885_CTLS; i++)
 361                if (cx23885_ctls[i].v.id == qctrl->id)
 362                        break;
 363        if (i == CX23885_CTLS) {
 364                *qctrl = no_ctl;
 365                return 0;
 366        }
 367        *qctrl = cx23885_ctls[i].v;
 368        return 0;
 369}
 370
 371/* ------------------------------------------------------------------- */
 372/* resource management                                                 */
 373
 374static int res_get(struct cx23885_dev *dev, struct cx23885_fh *fh,
 375        unsigned int bit)
 376{
 377        dprintk(1, "%s()\n", __func__);
 378        if (fh->resources & bit)
 379                /* have it already allocated */
 380                return 1;
 381
 382        /* is it free? */
 383        mutex_lock(&dev->lock);
 384        if (dev->resources & bit) {
 385                /* no, someone else uses it */
 386                mutex_unlock(&dev->lock);
 387                return 0;
 388        }
 389        /* it's free, grab it */
 390        fh->resources  |= bit;
 391        dev->resources |= bit;
 392        dprintk(1, "res: get %d\n", bit);
 393        mutex_unlock(&dev->lock);
 394        return 1;
 395}
 396
 397static int res_check(struct cx23885_fh *fh, unsigned int bit)
 398{
 399        return fh->resources & bit;
 400}
 401
 402static int res_locked(struct cx23885_dev *dev, unsigned int bit)
 403{
 404        return dev->resources & bit;
 405}
 406
 407static void res_free(struct cx23885_dev *dev, struct cx23885_fh *fh,
 408        unsigned int bits)
 409{
 410        BUG_ON((fh->resources & bits) != bits);
 411        dprintk(1, "%s()\n", __func__);
 412
 413        mutex_lock(&dev->lock);
 414        fh->resources  &= ~bits;
 415        dev->resources &= ~bits;
 416        dprintk(1, "res: put %d\n", bits);
 417        mutex_unlock(&dev->lock);
 418}
 419
 420static int cx23885_flatiron_write(struct cx23885_dev *dev, u8 reg, u8 data)
 421{
 422        /* 8 bit registers, 8 bit values */
 423        u8 buf[] = { reg, data };
 424
 425        struct i2c_msg msg = { .addr = 0x98 >> 1,
 426                .flags = 0, .buf = buf, .len = 2 };
 427
 428        return i2c_transfer(&dev->i2c_bus[2].i2c_adap, &msg, 1);
 429}
 430
 431static u8 cx23885_flatiron_read(struct cx23885_dev *dev, u8 reg)
 432{
 433        /* 8 bit registers, 8 bit values */
 434        int ret;
 435        u8 b0[] = { reg };
 436        u8 b1[] = { 0 };
 437
 438        struct i2c_msg msg[] = {
 439                { .addr = 0x98 >> 1, .flags = 0, .buf = b0, .len = 1 },
 440                { .addr = 0x98 >> 1, .flags = I2C_M_RD, .buf = b1, .len = 1 }
 441        };
 442
 443        ret = i2c_transfer(&dev->i2c_bus[2].i2c_adap, &msg[0], 2);
 444        if (ret != 2)
 445                printk(KERN_ERR "%s() error\n", __func__);
 446
 447        return b1[0];
 448}
 449
 450static void cx23885_flatiron_dump(struct cx23885_dev *dev)
 451{
 452        int i;
 453        dprintk(1, "Flatiron dump\n");
 454        for (i = 0; i < 0x24; i++) {
 455                dprintk(1, "FI[%02x] = %02x\n", i,
 456                        cx23885_flatiron_read(dev, i));
 457        }
 458}
 459
 460static int cx23885_flatiron_mux(struct cx23885_dev *dev, int input)
 461{
 462        u8 val;
 463        dprintk(1, "%s(input = %d)\n", __func__, input);
 464
 465        if (input == 1)
 466                val = cx23885_flatiron_read(dev, CH_PWR_CTRL1) & ~FLD_CH_SEL;
 467        else if (input == 2)
 468                val = cx23885_flatiron_read(dev, CH_PWR_CTRL1) | FLD_CH_SEL;
 469        else
 470                return -EINVAL;
 471
 472        val |= 0x20; /* Enable clock to delta-sigma and dec filter */
 473
 474        cx23885_flatiron_write(dev, CH_PWR_CTRL1, val);
 475
 476        /* Wake up */
 477        cx23885_flatiron_write(dev, CH_PWR_CTRL2, 0);
 478
 479        if (video_debug)
 480                cx23885_flatiron_dump(dev);
 481
 482        return 0;
 483}
 484
 485static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
 486{
 487        dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n",
 488                __func__,
 489                input, INPUT(input)->vmux,
 490                INPUT(input)->gpio0, INPUT(input)->gpio1,
 491                INPUT(input)->gpio2, INPUT(input)->gpio3);
 492        dev->input = input;
 493
 494        if (dev->board == CX23885_BOARD_MYGICA_X8506 ||
 495                dev->board == CX23885_BOARD_MAGICPRO_PROHDTVE2 ||
 496                dev->board == CX23885_BOARD_MYGICA_X8507) {
 497                /* Select Analog TV */
 498                if (INPUT(input)->type == CX23885_VMUX_TELEVISION)
 499                        cx23885_gpio_clear(dev, GPIO_0);
 500        }
 501
 502        /* Tell the internal A/V decoder */
 503        v4l2_subdev_call(dev->sd_cx25840, video, s_routing,
 504                        INPUT(input)->vmux, 0, 0);
 505
 506        if ((dev->board == CX23885_BOARD_HAUPPAUGE_HVR1800) ||
 507                (dev->board == CX23885_BOARD_MPX885) ||
 508                (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1250) ||
 509                (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255) ||
 510                (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255_22111) ||
 511                (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1850) ||
 512                (dev->board == CX23885_BOARD_MYGICA_X8507) ||
 513                (dev->board == CX23885_BOARD_AVERMEDIA_HC81R)) {
 514                /* Configure audio routing */
 515                v4l2_subdev_call(dev->sd_cx25840, audio, s_routing,
 516                        INPUT(input)->amux, 0, 0);
 517
 518                if (INPUT(input)->amux == CX25840_AUDIO7)
 519                        cx23885_flatiron_mux(dev, 1);
 520                else if (INPUT(input)->amux == CX25840_AUDIO6)
 521                        cx23885_flatiron_mux(dev, 2);
 522        }
 523
 524        return 0;
 525}
 526
 527static int cx23885_audio_mux(struct cx23885_dev *dev, unsigned int input)
 528{
 529        dprintk(1, "%s(input=%d)\n", __func__, input);
 530
 531        /* The baseband video core of the cx23885 has two audio inputs.
 532         * LR1 and LR2. In almost every single case so far only HVR1xxx
 533         * cards we've only ever supported LR1. Time to support LR2,
 534         * which is available via the optional white breakout header on
 535         * the board.
 536         * We'll use a could of existing enums in the card struct to allow
 537         * devs to specify which baseband input they need, or just default
 538         * to what we've always used.
 539         */
 540        if (INPUT(input)->amux == CX25840_AUDIO7)
 541                cx23885_flatiron_mux(dev, 1);
 542        else if (INPUT(input)->amux == CX25840_AUDIO6)
 543                cx23885_flatiron_mux(dev, 2);
 544        else {
 545                /* Not specifically defined, assume the default. */
 546                cx23885_flatiron_mux(dev, 1);
 547        }
 548
 549        return 0;
 550}
 551
 552/* ------------------------------------------------------------------ */
 553static int cx23885_start_video_dma(struct cx23885_dev *dev,
 554                           struct cx23885_dmaqueue *q,
 555                           struct cx23885_buffer *buf)
 556{
 557        dprintk(1, "%s()\n", __func__);
 558
 559        /* Stop the dma/fifo before we tamper with it's risc programs */
 560        cx_clear(VID_A_DMA_CTL, 0x11);
 561
 562        /* setup fifo + format */
 563        cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH01],
 564                                buf->bpl, buf->risc.dma);
 565
 566        /* reset counter */
 567        cx_write(VID_A_GPCNT_CTL, 3);
 568        q->count = 1;
 569
 570        /* enable irq */
 571        cx23885_irq_add_enable(dev, 0x01);
 572        cx_set(VID_A_INT_MSK, 0x000011);
 573
 574        /* start dma */
 575        cx_set(DEV_CNTRL2, (1<<5));
 576        cx_set(VID_A_DMA_CTL, 0x11); /* FIFO and RISC enable */
 577
 578        return 0;
 579}
 580
 581
 582static int cx23885_restart_video_queue(struct cx23885_dev *dev,
 583                               struct cx23885_dmaqueue *q)
 584{
 585        struct cx23885_buffer *buf, *prev;
 586        struct list_head *item;
 587        dprintk(1, "%s()\n", __func__);
 588
 589        if (!list_empty(&q->active)) {
 590                buf = list_entry(q->active.next, struct cx23885_buffer,
 591                        vb.queue);
 592                dprintk(2, "restart_queue [%p/%d]: restart dma\n",
 593                        buf, buf->vb.i);
 594                cx23885_start_video_dma(dev, q, buf);
 595                list_for_each(item, &q->active) {
 596                        buf = list_entry(item, struct cx23885_buffer,
 597                                vb.queue);
 598                        buf->count    = q->count++;
 599                }
 600                mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
 601                return 0;
 602        }
 603
 604        prev = NULL;
 605        for (;;) {
 606                if (list_empty(&q->queued))
 607                        return 0;
 608                buf = list_entry(q->queued.next, struct cx23885_buffer,
 609                        vb.queue);
 610                if (NULL == prev) {
 611                        list_move_tail(&buf->vb.queue, &q->active);
 612                        cx23885_start_video_dma(dev, q, buf);
 613                        buf->vb.state = VIDEOBUF_ACTIVE;
 614                        buf->count    = q->count++;
 615                        mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
 616                        dprintk(2, "[%p/%d] restart_queue - first active\n",
 617                                buf, buf->vb.i);
 618
 619                } else if (prev->vb.width  == buf->vb.width  &&
 620                           prev->vb.height == buf->vb.height &&
 621                           prev->fmt       == buf->fmt) {
 622                        list_move_tail(&buf->vb.queue, &q->active);
 623                        buf->vb.state = VIDEOBUF_ACTIVE;
 624                        buf->count    = q->count++;
 625                        prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
 626                        prev->risc.jmp[2] = cpu_to_le32(0); /* Bits 63 - 32 */
 627                        dprintk(2, "[%p/%d] restart_queue - move to active\n",
 628                                buf, buf->vb.i);
 629                } else {
 630                        return 0;
 631                }
 632                prev = buf;
 633        }
 634}
 635
 636static int buffer_setup(struct videobuf_queue *q, unsigned int *count,
 637        unsigned int *size)
 638{
 639        struct cx23885_fh *fh = q->priv_data;
 640
 641        *size = fh->fmt->depth*fh->width*fh->height >> 3;
 642        if (0 == *count)
 643                *count = 32;
 644        if (*size * *count > vid_limit * 1024 * 1024)
 645                *count = (vid_limit * 1024 * 1024) / *size;
 646        return 0;
 647}
 648
 649static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
 650               enum v4l2_field field)
 651{
 652        struct cx23885_fh *fh  = q->priv_data;
 653        struct cx23885_dev *dev = fh->dev;
 654        struct cx23885_buffer *buf =
 655                container_of(vb, struct cx23885_buffer, vb);
 656        int rc, init_buffer = 0;
 657        u32 line0_offset, line1_offset;
 658        struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
 659        int field_tff;
 660
 661        BUG_ON(NULL == fh->fmt);
 662        if (fh->width  < 48 || fh->width  > norm_maxw(dev->tvnorm) ||
 663            fh->height < 32 || fh->height > norm_maxh(dev->tvnorm))
 664                return -EINVAL;
 665        buf->vb.size = (fh->width * fh->height * fh->fmt->depth) >> 3;
 666        if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
 667                return -EINVAL;
 668
 669        if (buf->fmt       != fh->fmt    ||
 670            buf->vb.width  != fh->width  ||
 671            buf->vb.height != fh->height ||
 672            buf->vb.field  != field) {
 673                buf->fmt       = fh->fmt;
 674                buf->vb.width  = fh->width;
 675                buf->vb.height = fh->height;
 676                buf->vb.field  = field;
 677                init_buffer = 1;
 678        }
 679
 680        if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
 681                init_buffer = 1;
 682                rc = videobuf_iolock(q, &buf->vb, NULL);
 683                if (0 != rc)
 684                        goto fail;
 685        }
 686
 687        if (init_buffer) {
 688                buf->bpl = buf->vb.width * buf->fmt->depth >> 3;
 689                switch (buf->vb.field) {
 690                case V4L2_FIELD_TOP:
 691                        cx23885_risc_buffer(dev->pci, &buf->risc,
 692                                         dma->sglist, 0, UNSET,
 693                                         buf->bpl, 0, buf->vb.height);
 694                        break;
 695                case V4L2_FIELD_BOTTOM:
 696                        cx23885_risc_buffer(dev->pci, &buf->risc,
 697                                         dma->sglist, UNSET, 0,
 698                                         buf->bpl, 0, buf->vb.height);
 699                        break;
 700                case V4L2_FIELD_INTERLACED:
 701                        if (dev->tvnorm & V4L2_STD_NTSC)
 702                                /* NTSC or  */
 703                                field_tff = 1;
 704                        else
 705                                field_tff = 0;
 706
 707                        if (cx23885_boards[dev->board].force_bff)
 708                                /* PAL / SECAM OR 888 in NTSC MODE */
 709                                field_tff = 0;
 710
 711                        if (field_tff) {
 712                                /* cx25840 transmits NTSC bottom field first */
 713                                dprintk(1, "%s() Creating TFF/NTSC risc\n",
 714                                        __func__);
 715                                line0_offset = buf->bpl;
 716                                line1_offset = 0;
 717                        } else {
 718                                /* All other formats are top field first */
 719                                dprintk(1, "%s() Creating BFF/PAL/SECAM risc\n",
 720                                        __func__);
 721                                line0_offset = 0;
 722                                line1_offset = buf->bpl;
 723                        }
 724                        cx23885_risc_buffer(dev->pci, &buf->risc,
 725                                        dma->sglist, line0_offset,
 726                                        line1_offset,
 727                                        buf->bpl, buf->bpl,
 728                                        buf->vb.height >> 1);
 729                        break;
 730                case V4L2_FIELD_SEQ_TB:
 731                        cx23885_risc_buffer(dev->pci, &buf->risc,
 732                                         dma->sglist,
 733                                         0, buf->bpl * (buf->vb.height >> 1),
 734                                         buf->bpl, 0,
 735                                         buf->vb.height >> 1);
 736                        break;
 737                case V4L2_FIELD_SEQ_BT:
 738                        cx23885_risc_buffer(dev->pci, &buf->risc,
 739                                         dma->sglist,
 740                                         buf->bpl * (buf->vb.height >> 1), 0,
 741                                         buf->bpl, 0,
 742                                         buf->vb.height >> 1);
 743                        break;
 744                default:
 745                        BUG();
 746                }
 747        }
 748        dprintk(2, "[%p/%d] buffer_prep - %dx%d %dbpp \"%s\" - dma=0x%08lx\n",
 749                buf, buf->vb.i,
 750                fh->width, fh->height, fh->fmt->depth, fh->fmt->name,
 751                (unsigned long)buf->risc.dma);
 752
 753        buf->vb.state = VIDEOBUF_PREPARED;
 754        return 0;
 755
 756 fail:
 757        cx23885_free_buffer(q, buf);
 758        return rc;
 759}
 760
 761static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
 762{
 763        struct cx23885_buffer   *buf = container_of(vb,
 764                struct cx23885_buffer, vb);
 765        struct cx23885_buffer   *prev;
 766        struct cx23885_fh       *fh   = vq->priv_data;
 767        struct cx23885_dev      *dev  = fh->dev;
 768        struct cx23885_dmaqueue *q    = &dev->vidq;
 769
 770        /* add jump to stopper */
 771        buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
 772        buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma);
 773        buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */
 774
 775        if (!list_empty(&q->queued)) {
 776                list_add_tail(&buf->vb.queue, &q->queued);
 777                buf->vb.state = VIDEOBUF_QUEUED;
 778                dprintk(2, "[%p/%d] buffer_queue - append to queued\n",
 779                        buf, buf->vb.i);
 780
 781        } else if (list_empty(&q->active)) {
 782                list_add_tail(&buf->vb.queue, &q->active);
 783                cx23885_start_video_dma(dev, q, buf);
 784                buf->vb.state = VIDEOBUF_ACTIVE;
 785                buf->count    = q->count++;
 786                mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
 787                dprintk(2, "[%p/%d] buffer_queue - first active\n",
 788                        buf, buf->vb.i);
 789
 790        } else {
 791                prev = list_entry(q->active.prev, struct cx23885_buffer,
 792                        vb.queue);
 793                if (prev->vb.width  == buf->vb.width  &&
 794                    prev->vb.height == buf->vb.height &&
 795                    prev->fmt       == buf->fmt) {
 796                        list_add_tail(&buf->vb.queue, &q->active);
 797                        buf->vb.state = VIDEOBUF_ACTIVE;
 798                        buf->count    = q->count++;
 799                        prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
 800                        /* 64 bit bits 63-32 */
 801                        prev->risc.jmp[2] = cpu_to_le32(0);
 802                        dprintk(2, "[%p/%d] buffer_queue - append to active\n",
 803                                buf, buf->vb.i);
 804
 805                } else {
 806                        list_add_tail(&buf->vb.queue, &q->queued);
 807                        buf->vb.state = VIDEOBUF_QUEUED;
 808                        dprintk(2, "[%p/%d] buffer_queue - first queued\n",
 809                                buf, buf->vb.i);
 810                }
 811        }
 812}
 813
 814static void buffer_release(struct videobuf_queue *q,
 815        struct videobuf_buffer *vb)
 816{
 817        struct cx23885_buffer *buf = container_of(vb,
 818                struct cx23885_buffer, vb);
 819
 820        cx23885_free_buffer(q, buf);
 821}
 822
 823static struct videobuf_queue_ops cx23885_video_qops = {
 824        .buf_setup    = buffer_setup,
 825        .buf_prepare  = buffer_prepare,
 826        .buf_queue    = buffer_queue,
 827        .buf_release  = buffer_release,
 828};
 829
 830static struct videobuf_queue *get_queue(struct cx23885_fh *fh)
 831{
 832        switch (fh->type) {
 833        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 834                return &fh->vidq;
 835        case V4L2_BUF_TYPE_VBI_CAPTURE:
 836                return &fh->vbiq;
 837        default:
 838                BUG();
 839                return NULL;
 840        }
 841}
 842
 843static int get_resource(struct cx23885_fh *fh)
 844{
 845        switch (fh->type) {
 846        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 847                return RESOURCE_VIDEO;
 848        case V4L2_BUF_TYPE_VBI_CAPTURE:
 849                return RESOURCE_VBI;
 850        default:
 851                BUG();
 852                return 0;
 853        }
 854}
 855
 856static int video_open(struct file *file)
 857{
 858        struct video_device *vdev = video_devdata(file);
 859        struct cx23885_dev *dev = video_drvdata(file);
 860        struct cx23885_fh *fh;
 861        enum v4l2_buf_type type = 0;
 862        int radio = 0;
 863
 864        switch (vdev->vfl_type) {
 865        case VFL_TYPE_GRABBER:
 866                type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 867                break;
 868        case VFL_TYPE_VBI:
 869                type = V4L2_BUF_TYPE_VBI_CAPTURE;
 870                break;
 871        case VFL_TYPE_RADIO:
 872                radio = 1;
 873                break;
 874        }
 875
 876        dprintk(1, "open dev=%s radio=%d type=%s\n",
 877                video_device_node_name(vdev), radio, v4l2_type_names[type]);
 878
 879        /* allocate + initialize per filehandle data */
 880        fh = kzalloc(sizeof(*fh), GFP_KERNEL);
 881        if (NULL == fh)
 882                return -ENOMEM;
 883
 884        file->private_data = fh;
 885        fh->dev      = dev;
 886        fh->radio    = radio;
 887        fh->type     = type;
 888        fh->width    = 320;
 889        fh->height   = 240;
 890        fh->fmt      = format_by_fourcc(V4L2_PIX_FMT_YUYV);
 891
 892        videobuf_queue_sg_init(&fh->vidq, &cx23885_video_qops,
 893                            &dev->pci->dev, &dev->slock,
 894                            V4L2_BUF_TYPE_VIDEO_CAPTURE,
 895                            V4L2_FIELD_INTERLACED,
 896                            sizeof(struct cx23885_buffer),
 897                            fh, NULL);
 898
 899        videobuf_queue_sg_init(&fh->vbiq, &cx23885_vbi_qops,
 900                &dev->pci->dev, &dev->slock,
 901                V4L2_BUF_TYPE_VBI_CAPTURE,
 902                V4L2_FIELD_SEQ_TB,
 903                sizeof(struct cx23885_buffer),
 904                fh, NULL);
 905
 906
 907        dprintk(1, "post videobuf_queue_init()\n");
 908
 909        return 0;
 910}
 911
 912static ssize_t video_read(struct file *file, char __user *data,
 913        size_t count, loff_t *ppos)
 914{
 915        struct cx23885_fh *fh = file->private_data;
 916
 917        switch (fh->type) {
 918        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
 919                if (res_locked(fh->dev, RESOURCE_VIDEO))
 920                        return -EBUSY;
 921                return videobuf_read_one(&fh->vidq, data, count, ppos,
 922                                         file->f_flags & O_NONBLOCK);
 923        case V4L2_BUF_TYPE_VBI_CAPTURE:
 924                if (!res_get(fh->dev, fh, RESOURCE_VBI))
 925                        return -EBUSY;
 926                return videobuf_read_stream(&fh->vbiq, data, count, ppos, 1,
 927                                            file->f_flags & O_NONBLOCK);
 928        default:
 929                BUG();
 930                return 0;
 931        }
 932}
 933
 934static unsigned int video_poll(struct file *file,
 935        struct poll_table_struct *wait)
 936{
 937        struct cx23885_fh *fh = file->private_data;
 938        struct cx23885_buffer *buf;
 939        unsigned int rc = POLLERR;
 940
 941        if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
 942                if (!res_get(fh->dev, fh, RESOURCE_VBI))
 943                        return POLLERR;
 944                return videobuf_poll_stream(file, &fh->vbiq, wait);
 945        }
 946
 947        mutex_lock(&fh->vidq.vb_lock);
 948        if (res_check(fh, RESOURCE_VIDEO)) {
 949                /* streaming capture */
 950                if (list_empty(&fh->vidq.stream))
 951                        goto done;
 952                buf = list_entry(fh->vidq.stream.next,
 953                        struct cx23885_buffer, vb.stream);
 954        } else {
 955                /* read() capture */
 956                buf = (struct cx23885_buffer *)fh->vidq.read_buf;
 957                if (NULL == buf)
 958                        goto done;
 959        }
 960        poll_wait(file, &buf->vb.done, wait);
 961        if (buf->vb.state == VIDEOBUF_DONE ||
 962            buf->vb.state == VIDEOBUF_ERROR)
 963                rc =  POLLIN|POLLRDNORM;
 964        else
 965                rc = 0;
 966done:
 967        mutex_unlock(&fh->vidq.vb_lock);
 968        return rc;
 969}
 970
 971static int video_release(struct file *file)
 972{
 973        struct cx23885_fh *fh = file->private_data;
 974        struct cx23885_dev *dev = fh->dev;
 975
 976        /* turn off overlay */
 977        if (res_check(fh, RESOURCE_OVERLAY)) {
 978                /* FIXME */
 979                res_free(dev, fh, RESOURCE_OVERLAY);
 980        }
 981
 982        /* stop video capture */
 983        if (res_check(fh, RESOURCE_VIDEO)) {
 984                videobuf_queue_cancel(&fh->vidq);
 985                res_free(dev, fh, RESOURCE_VIDEO);
 986        }
 987        if (fh->vidq.read_buf) {
 988                buffer_release(&fh->vidq, fh->vidq.read_buf);
 989                kfree(fh->vidq.read_buf);
 990        }
 991
 992        /* stop vbi capture */
 993        if (res_check(fh, RESOURCE_VBI)) {
 994                if (fh->vbiq.streaming)
 995                        videobuf_streamoff(&fh->vbiq);
 996                if (fh->vbiq.reading)
 997                        videobuf_read_stop(&fh->vbiq);
 998                res_free(dev, fh, RESOURCE_VBI);
 999        }
1000
1001        videobuf_mmap_free(&fh->vidq);
1002        videobuf_mmap_free(&fh->vbiq);
1003
1004        file->private_data = NULL;
1005        kfree(fh);
1006
1007        /* We are not putting the tuner to sleep here on exit, because
1008         * we want to use the mpeg encoder in another session to capture
1009         * tuner video. Closing this will result in no video to the encoder.
1010         */
1011
1012        return 0;
1013}
1014
1015static int video_mmap(struct file *file, struct vm_area_struct *vma)
1016{
1017        struct cx23885_fh *fh = file->private_data;
1018
1019        return videobuf_mmap_mapper(get_queue(fh), vma);
1020}
1021
1022/* ------------------------------------------------------------------ */
1023/* VIDEO CTRL IOCTLS                                                  */
1024
1025int cx23885_get_control(struct cx23885_dev *dev,
1026        struct v4l2_control *ctl)
1027{
1028        dprintk(1, "%s() calling cx25840(VIDIOC_G_CTRL)\n", __func__);
1029        call_all(dev, core, g_ctrl, ctl);
1030        return 0;
1031}
1032
1033int cx23885_set_control(struct cx23885_dev *dev,
1034        struct v4l2_control *ctl)
1035{
1036        dprintk(1, "%s() calling cx25840(VIDIOC_S_CTRL)\n", __func__);
1037        call_all(dev, core, s_ctrl, ctl);
1038
1039        return 0;
1040}
1041
1042static void init_controls(struct cx23885_dev *dev)
1043{
1044        struct v4l2_control ctrl;
1045        int i;
1046
1047        for (i = 0; i < CX23885_CTLS; i++) {
1048                ctrl.id = cx23885_ctls[i].v.id;
1049                ctrl.value = cx23885_ctls[i].v.default_value;
1050
1051                cx23885_set_control(dev, &ctrl);
1052        }
1053}
1054
1055/* ------------------------------------------------------------------ */
1056/* VIDEO IOCTLS                                                       */
1057
1058static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
1059        struct v4l2_format *f)
1060{
1061        struct cx23885_fh *fh   = priv;
1062
1063        f->fmt.pix.width        = fh->width;
1064        f->fmt.pix.height       = fh->height;
1065        f->fmt.pix.field        = fh->vidq.field;
1066        f->fmt.pix.pixelformat  = fh->fmt->fourcc;
1067        f->fmt.pix.bytesperline =
1068                (f->fmt.pix.width * fh->fmt->depth) >> 3;
1069        f->fmt.pix.sizeimage =
1070                f->fmt.pix.height * f->fmt.pix.bytesperline;
1071
1072        return 0;
1073}
1074
1075static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
1076        struct v4l2_format *f)
1077{
1078        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1079        struct cx23885_fmt *fmt;
1080        enum v4l2_field   field;
1081        unsigned int      maxw, maxh;
1082
1083        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1084        if (NULL == fmt)
1085                return -EINVAL;
1086
1087        field = f->fmt.pix.field;
1088        maxw  = norm_maxw(dev->tvnorm);
1089        maxh  = norm_maxh(dev->tvnorm);
1090
1091        if (V4L2_FIELD_ANY == field) {
1092                field = (f->fmt.pix.height > maxh/2)
1093                        ? V4L2_FIELD_INTERLACED
1094                        : V4L2_FIELD_BOTTOM;
1095        }
1096
1097        switch (field) {
1098        case V4L2_FIELD_TOP:
1099        case V4L2_FIELD_BOTTOM:
1100                maxh = maxh / 2;
1101                break;
1102        case V4L2_FIELD_INTERLACED:
1103                break;
1104        default:
1105                return -EINVAL;
1106        }
1107
1108        f->fmt.pix.field = field;
1109        v4l_bound_align_image(&f->fmt.pix.width, 48, maxw, 2,
1110                              &f->fmt.pix.height, 32, maxh, 0, 0);
1111        f->fmt.pix.bytesperline =
1112                (f->fmt.pix.width * fmt->depth) >> 3;
1113        f->fmt.pix.sizeimage =
1114                f->fmt.pix.height * f->fmt.pix.bytesperline;
1115
1116        return 0;
1117}
1118
1119static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1120        struct v4l2_format *f)
1121{
1122        struct cx23885_fh *fh = priv;
1123        struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
1124        struct v4l2_mbus_framefmt mbus_fmt;
1125        int err;
1126
1127        dprintk(2, "%s()\n", __func__);
1128        err = vidioc_try_fmt_vid_cap(file, priv, f);
1129
1130        if (0 != err)
1131                return err;
1132        fh->fmt        = format_by_fourcc(f->fmt.pix.pixelformat);
1133        fh->width      = f->fmt.pix.width;
1134        fh->height     = f->fmt.pix.height;
1135        fh->vidq.field = f->fmt.pix.field;
1136        dprintk(2, "%s() width=%d height=%d field=%d\n", __func__,
1137                fh->width, fh->height, fh->vidq.field);
1138        v4l2_fill_mbus_format(&mbus_fmt, &f->fmt.pix, V4L2_MBUS_FMT_FIXED);
1139        call_all(dev, video, s_mbus_fmt, &mbus_fmt);
1140        v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
1141        return 0;
1142}
1143
1144static int vidioc_querycap(struct file *file, void  *priv,
1145        struct v4l2_capability *cap)
1146{
1147        struct cx23885_dev *dev  = ((struct cx23885_fh *)priv)->dev;
1148
1149        strcpy(cap->driver, "cx23885");
1150        strlcpy(cap->card, cx23885_boards[dev->board].name,
1151                sizeof(cap->card));
1152        sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci));
1153        cap->capabilities =
1154                V4L2_CAP_VIDEO_CAPTURE |
1155                V4L2_CAP_READWRITE     |
1156                V4L2_CAP_STREAMING     |
1157                V4L2_CAP_VBI_CAPTURE;
1158        if (UNSET != dev->tuner_type)
1159                cap->capabilities |= V4L2_CAP_TUNER;
1160        return 0;
1161}
1162
1163static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
1164        struct v4l2_fmtdesc *f)
1165{
1166        if (unlikely(f->index >= ARRAY_SIZE(formats)))
1167                return -EINVAL;
1168
1169        strlcpy(f->description, formats[f->index].name,
1170                sizeof(f->description));
1171        f->pixelformat = formats[f->index].fourcc;
1172
1173        return 0;
1174}
1175
1176static int vidioc_reqbufs(struct file *file, void *priv,
1177        struct v4l2_requestbuffers *p)
1178{
1179        struct cx23885_fh *fh = priv;
1180        return videobuf_reqbufs(get_queue(fh), p);
1181}
1182
1183static int vidioc_querybuf(struct file *file, void *priv,
1184        struct v4l2_buffer *p)
1185{
1186        struct cx23885_fh *fh = priv;
1187        return videobuf_querybuf(get_queue(fh), p);
1188}
1189
1190static int vidioc_qbuf(struct file *file, void *priv,
1191        struct v4l2_buffer *p)
1192{
1193        struct cx23885_fh *fh = priv;
1194        return videobuf_qbuf(get_queue(fh), p);
1195}
1196
1197static int vidioc_dqbuf(struct file *file, void *priv,
1198        struct v4l2_buffer *p)
1199{
1200        struct cx23885_fh *fh = priv;
1201        return videobuf_dqbuf(get_queue(fh), p,
1202                                file->f_flags & O_NONBLOCK);
1203}
1204
1205static int vidioc_streamon(struct file *file, void *priv,
1206        enum v4l2_buf_type i)
1207{
1208        struct cx23885_fh *fh = priv;
1209        struct cx23885_dev *dev = fh->dev;
1210        dprintk(1, "%s()\n", __func__);
1211
1212        if ((fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
1213                (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE))
1214                return -EINVAL;
1215        if (unlikely(i != fh->type))
1216                return -EINVAL;
1217
1218        if (unlikely(!res_get(dev, fh, get_resource(fh))))
1219                return -EBUSY;
1220
1221        /* Don't start VBI streaming unless vida streaming
1222         * has already started.
1223         */
1224        if ((fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) &&
1225                ((cx_read(VID_A_DMA_CTL) & 0x11) == 0))
1226                return -EINVAL;
1227
1228        return videobuf_streamon(get_queue(fh));
1229}
1230
1231static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
1232{
1233        struct cx23885_fh *fh = priv;
1234        struct cx23885_dev *dev = fh->dev;
1235        int err, res;
1236        dprintk(1, "%s()\n", __func__);
1237
1238        if ((fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) &&
1239                (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE))
1240                return -EINVAL;
1241        if (i != fh->type)
1242                return -EINVAL;
1243
1244        res = get_resource(fh);
1245        err = videobuf_streamoff(get_queue(fh));
1246        if (err < 0)
1247                return err;
1248        res_free(dev, fh, res);
1249        return 0;
1250}
1251
1252static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
1253{
1254        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1255        dprintk(1, "%s()\n", __func__);
1256
1257        *id = dev->tvnorm;
1258        return 0;
1259}
1260
1261static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id tvnorms)
1262{
1263        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1264        dprintk(1, "%s()\n", __func__);
1265
1266        mutex_lock(&dev->lock);
1267        cx23885_set_tvnorm(dev, tvnorms);
1268        mutex_unlock(&dev->lock);
1269
1270        return 0;
1271}
1272
1273int cx23885_enum_input(struct cx23885_dev *dev, struct v4l2_input *i)
1274{
1275        static const char *iname[] = {
1276                [CX23885_VMUX_COMPOSITE1] = "Composite1",
1277                [CX23885_VMUX_COMPOSITE2] = "Composite2",
1278                [CX23885_VMUX_COMPOSITE3] = "Composite3",
1279                [CX23885_VMUX_COMPOSITE4] = "Composite4",
1280                [CX23885_VMUX_SVIDEO]     = "S-Video",
1281                [CX23885_VMUX_COMPONENT]  = "Component",
1282                [CX23885_VMUX_TELEVISION] = "Television",
1283                [CX23885_VMUX_CABLE]      = "Cable TV",
1284                [CX23885_VMUX_DVB]        = "DVB",
1285                [CX23885_VMUX_DEBUG]      = "for debug only",
1286        };
1287        unsigned int n;
1288        dprintk(1, "%s()\n", __func__);
1289
1290        n = i->index;
1291        if (n >= MAX_CX23885_INPUT)
1292                return -EINVAL;
1293
1294        if (0 == INPUT(n)->type)
1295                return -EINVAL;
1296
1297        i->index = n;
1298        i->type  = V4L2_INPUT_TYPE_CAMERA;
1299        strcpy(i->name, iname[INPUT(n)->type]);
1300        if ((CX23885_VMUX_TELEVISION == INPUT(n)->type) ||
1301                (CX23885_VMUX_CABLE == INPUT(n)->type)) {
1302                i->type = V4L2_INPUT_TYPE_TUNER;
1303                i->std = CX23885_NORMS;
1304        }
1305
1306        /* Two selectable audio inputs for non-tv inputs */
1307        if (INPUT(n)->type != CX23885_VMUX_TELEVISION)
1308                i->audioset = 0x3;
1309
1310        if (dev->input == n) {
1311                /* enum'd input matches our configured input.
1312                 * Ask the video decoder to process the call
1313                 * and give it an oppertunity to update the
1314                 * status field.
1315                 */
1316                call_all(dev, video, g_input_status, &i->status);
1317        }
1318
1319        return 0;
1320}
1321
1322static int vidioc_enum_input(struct file *file, void *priv,
1323                                struct v4l2_input *i)
1324{
1325        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1326        dprintk(1, "%s()\n", __func__);
1327        return cx23885_enum_input(dev, i);
1328}
1329
1330int cx23885_get_input(struct file *file, void *priv, unsigned int *i)
1331{
1332        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1333
1334        *i = dev->input;
1335        dprintk(1, "%s() returns %d\n", __func__, *i);
1336        return 0;
1337}
1338
1339static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1340{
1341        return cx23885_get_input(file, priv, i);
1342}
1343
1344int cx23885_set_input(struct file *file, void *priv, unsigned int i)
1345{
1346        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1347
1348        dprintk(1, "%s(%d)\n", __func__, i);
1349
1350        if (i >= MAX_CX23885_INPUT) {
1351                dprintk(1, "%s() -EINVAL\n", __func__);
1352                return -EINVAL;
1353        }
1354
1355        if (INPUT(i)->type == 0)
1356                return -EINVAL;
1357
1358        mutex_lock(&dev->lock);
1359        cx23885_video_mux(dev, i);
1360
1361        /* By default establish the default audio input for the card also */
1362        /* Caller is free to use VIDIOC_S_AUDIO to override afterwards */
1363        cx23885_audio_mux(dev, i);
1364        mutex_unlock(&dev->lock);
1365        return 0;
1366}
1367
1368static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1369{
1370        return cx23885_set_input(file, priv, i);
1371}
1372
1373static int vidioc_log_status(struct file *file, void *priv)
1374{
1375        struct cx23885_fh  *fh  = priv;
1376        struct cx23885_dev *dev = fh->dev;
1377
1378        printk(KERN_INFO
1379                "%s/0: ============  START LOG STATUS  ============\n",
1380                dev->name);
1381        call_all(dev, core, log_status);
1382        printk(KERN_INFO
1383                "%s/0: =============  END LOG STATUS  =============\n",
1384                dev->name);
1385        return 0;
1386}
1387
1388static int cx23885_query_audinput(struct file *file, void *priv,
1389        struct v4l2_audio *i)
1390{
1391        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1392        static const char *iname[] = {
1393                [0] = "Baseband L/R 1",
1394                [1] = "Baseband L/R 2",
1395        };
1396        unsigned int n;
1397        dprintk(1, "%s()\n", __func__);
1398
1399        n = i->index;
1400        if (n >= 2)
1401                return -EINVAL;
1402
1403        memset(i, 0, sizeof(*i));
1404        i->index = n;
1405        strcpy(i->name, iname[n]);
1406        i->capability  = V4L2_AUDCAP_STEREO;
1407        i->mode  = V4L2_AUDMODE_AVL;
1408        return 0;
1409
1410}
1411
1412static int vidioc_enum_audinput(struct file *file, void *priv,
1413                                struct v4l2_audio *i)
1414{
1415        return cx23885_query_audinput(file, priv, i);
1416}
1417
1418static int vidioc_g_audinput(struct file *file, void *priv,
1419        struct v4l2_audio *i)
1420{
1421        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1422
1423        i->index = dev->audinput;
1424        dprintk(1, "%s(input=%d)\n", __func__, i->index);
1425
1426        return cx23885_query_audinput(file, priv, i);
1427}
1428
1429static int vidioc_s_audinput(struct file *file, void *priv,
1430        const struct v4l2_audio *i)
1431{
1432        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1433        if (i->index >= 2)
1434                return -EINVAL;
1435
1436        dprintk(1, "%s(%d)\n", __func__, i->index);
1437
1438        dev->audinput = i->index;
1439
1440        /* Skip the audio defaults from the cards struct, caller wants
1441         * directly touch the audio mux hardware. */
1442        cx23885_flatiron_mux(dev, dev->audinput + 1);
1443        return 0;
1444}
1445
1446static int vidioc_queryctrl(struct file *file, void *priv,
1447                                struct v4l2_queryctrl *qctrl)
1448{
1449        qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id);
1450        if (unlikely(qctrl->id == 0))
1451                return -EINVAL;
1452        return cx23885_ctrl_query(qctrl);
1453}
1454
1455static int vidioc_g_ctrl(struct file *file, void *priv,
1456                                struct v4l2_control *ctl)
1457{
1458        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1459
1460        return cx23885_get_control(dev, ctl);
1461}
1462
1463static int vidioc_s_ctrl(struct file *file, void *priv,
1464                                struct v4l2_control *ctl)
1465{
1466        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1467
1468        return cx23885_set_control(dev, ctl);
1469}
1470
1471static int vidioc_g_tuner(struct file *file, void *priv,
1472                                struct v4l2_tuner *t)
1473{
1474        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1475
1476        if (unlikely(UNSET == dev->tuner_type))
1477                return -EINVAL;
1478        if (0 != t->index)
1479                return -EINVAL;
1480
1481        strcpy(t->name, "Television");
1482
1483        call_all(dev, tuner, g_tuner, t);
1484        return 0;
1485}
1486
1487static int vidioc_s_tuner(struct file *file, void *priv,
1488                                const struct v4l2_tuner *t)
1489{
1490        struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
1491
1492        if (UNSET == dev->tuner_type)
1493                return -EINVAL;
1494        if (0 != t->index)
1495                return -EINVAL;
1496        /* Update the A/V core */
1497        call_all(dev, tuner, s_tuner, t);
1498
1499        return 0;
1500}
1501
1502static int vidioc_g_frequency(struct file *file, void *priv,
1503                                struct v4l2_frequency *f)
1504{
1505        struct cx23885_fh *fh = priv;
1506        struct cx23885_dev *dev = fh->dev;
1507
1508        if (unlikely(UNSET == dev->tuner_type))
1509                return -EINVAL;
1510
1511        /* f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV; */
1512        f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
1513        f->frequency = dev->freq;
1514
1515        call_all(dev, tuner, g_frequency, f);
1516
1517        return 0;
1518}
1519
1520static int cx23885_set_freq(struct cx23885_dev *dev, const struct v4l2_frequency *f)
1521{
1522        struct v4l2_control ctrl;
1523
1524        if (unlikely(UNSET == dev->tuner_type))
1525                return -EINVAL;
1526        if (unlikely(f->tuner != 0))
1527                return -EINVAL;
1528
1529        mutex_lock(&dev->lock);
1530        dev->freq = f->frequency;
1531
1532        /* I need to mute audio here */
1533        ctrl.id = V4L2_CID_AUDIO_MUTE;
1534        ctrl.value = 1;
1535        cx23885_set_control(dev, &ctrl);
1536
1537        call_all(dev, tuner, s_frequency, f);
1538
1539        /* When changing channels it is required to reset TVAUDIO */
1540        msleep(100);
1541
1542        /* I need to unmute audio here */
1543        ctrl.value = 0;
1544        cx23885_set_control(dev, &ctrl);
1545
1546        mutex_unlock(&dev->lock);
1547
1548        return 0;
1549}
1550
1551static int cx23885_set_freq_via_ops(struct cx23885_dev *dev,
1552        const struct v4l2_frequency *f)
1553{
1554        struct v4l2_control ctrl;
1555        struct videobuf_dvb_frontend *vfe;
1556        struct dvb_frontend *fe;
1557
1558        struct analog_parameters params = {
1559                .mode      = V4L2_TUNER_ANALOG_TV,
1560                .audmode   = V4L2_TUNER_MODE_STEREO,
1561                .std       = dev->tvnorm,
1562                .frequency = f->frequency
1563        };
1564
1565        mutex_lock(&dev->lock);
1566        dev->freq = f->frequency;
1567
1568        /* I need to mute audio here */
1569        ctrl.id = V4L2_CID_AUDIO_MUTE;
1570        ctrl.value = 1;
1571        cx23885_set_control(dev, &ctrl);
1572
1573        /* If HVR1850 */
1574        dprintk(1, "%s() frequency=%d tuner=%d std=0x%llx\n", __func__,
1575                params.frequency, f->tuner, params.std);
1576
1577        vfe = videobuf_dvb_get_frontend(&dev->ts2.frontends, 1);
1578        if (!vfe) {
1579                mutex_unlock(&dev->lock);
1580                return -EINVAL;
1581        }
1582
1583        fe = vfe->dvb.frontend;
1584
1585        if ((dev->board == CX23885_BOARD_HAUPPAUGE_HVR1850) ||
1586            (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255) ||
1587            (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255_22111))
1588                fe = &dev->ts1.analog_fe;
1589
1590        if (fe && fe->ops.tuner_ops.set_analog_params) {
1591                call_all(dev, core, s_std, dev->tvnorm);
1592                fe->ops.tuner_ops.set_analog_params(fe, &params);
1593        }
1594        else
1595                printk(KERN_ERR "%s() No analog tuner, aborting\n", __func__);
1596
1597        /* When changing channels it is required to reset TVAUDIO */
1598        msleep(100);
1599
1600        /* I need to unmute audio here */
1601        ctrl.value = 0;
1602        cx23885_set_control(dev, &ctrl);
1603
1604        mutex_unlock(&dev->lock);
1605
1606        return 0;
1607}
1608
1609int cx23885_set_frequency(struct file *file, void *priv,
1610        const struct v4l2_frequency *f)
1611{
1612        struct cx23885_fh *fh = priv;
1613        struct cx23885_dev *dev = fh->dev;
1614        int ret;
1615
1616        switch (dev->board) {
1617        case CX23885_BOARD_HAUPPAUGE_HVR1255:
1618        case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1619        case CX23885_BOARD_HAUPPAUGE_HVR1850:
1620                ret = cx23885_set_freq_via_ops(dev, f);
1621                break;
1622        default:
1623                ret = cx23885_set_freq(dev, f);
1624        }
1625
1626        return ret;
1627}
1628
1629static int vidioc_s_frequency(struct file *file, void *priv,
1630        const struct v4l2_frequency *f)
1631{
1632        return cx23885_set_frequency(file, priv, f);
1633}
1634
1635/* ----------------------------------------------------------- */
1636
1637static void cx23885_vid_timeout(unsigned long data)
1638{
1639        struct cx23885_dev *dev = (struct cx23885_dev *)data;
1640        struct cx23885_dmaqueue *q = &dev->vidq;
1641        struct cx23885_buffer *buf;
1642        unsigned long flags;
1643
1644        spin_lock_irqsave(&dev->slock, flags);
1645        while (!list_empty(&q->active)) {
1646                buf = list_entry(q->active.next,
1647                        struct cx23885_buffer, vb.queue);
1648                list_del(&buf->vb.queue);
1649                buf->vb.state = VIDEOBUF_ERROR;
1650                wake_up(&buf->vb.done);
1651                printk(KERN_ERR "%s: [%p/%d] timeout - dma=0x%08lx\n",
1652                        dev->name, buf, buf->vb.i,
1653                        (unsigned long)buf->risc.dma);
1654        }
1655        cx23885_restart_video_queue(dev, q);
1656        spin_unlock_irqrestore(&dev->slock, flags);
1657}
1658
1659int cx23885_video_irq(struct cx23885_dev *dev, u32 status)
1660{
1661        u32 mask, count;
1662        int handled = 0;
1663
1664        mask   = cx_read(VID_A_INT_MSK);
1665        if (0 == (status & mask))
1666                return handled;
1667
1668        cx_write(VID_A_INT_STAT, status);
1669
1670        /* risc op code error, fifo overflow or line sync detection error */
1671        if ((status & VID_BC_MSK_OPC_ERR) ||
1672                (status & VID_BC_MSK_SYNC) ||
1673                (status & VID_BC_MSK_OF)) {
1674
1675                if (status & VID_BC_MSK_OPC_ERR) {
1676                        dprintk(7, " (VID_BC_MSK_OPC_ERR 0x%08x)\n",
1677                                VID_BC_MSK_OPC_ERR);
1678                        printk(KERN_WARNING "%s: video risc op code error\n",
1679                                dev->name);
1680                        cx23885_sram_channel_dump(dev,
1681                                &dev->sram_channels[SRAM_CH01]);
1682                }
1683
1684                if (status & VID_BC_MSK_SYNC)
1685                        dprintk(7, " (VID_BC_MSK_SYNC 0x%08x) "
1686                                "video lines miss-match\n",
1687                                VID_BC_MSK_SYNC);
1688
1689                if (status & VID_BC_MSK_OF)
1690                        dprintk(7, " (VID_BC_MSK_OF 0x%08x) fifo overflow\n",
1691                                VID_BC_MSK_OF);
1692
1693        }
1694
1695        /* Video */
1696        if (status & VID_BC_MSK_RISCI1) {
1697                spin_lock(&dev->slock);
1698                count = cx_read(VID_A_GPCNT);
1699                cx23885_video_wakeup(dev, &dev->vidq, count);
1700                spin_unlock(&dev->slock);
1701                handled++;
1702        }
1703        if (status & VID_BC_MSK_RISCI2) {
1704                dprintk(2, "stopper video\n");
1705                spin_lock(&dev->slock);
1706                cx23885_restart_video_queue(dev, &dev->vidq);
1707                spin_unlock(&dev->slock);
1708                handled++;
1709        }
1710
1711        /* Allow the VBI framework to process it's payload */
1712        handled += cx23885_vbi_irq(dev, status);
1713
1714        return handled;
1715}
1716
1717/* ----------------------------------------------------------- */
1718/* exported stuff                                              */
1719
1720static const struct v4l2_file_operations video_fops = {
1721        .owner         = THIS_MODULE,
1722        .open          = video_open,
1723        .release       = video_release,
1724        .read          = video_read,
1725        .poll          = video_poll,
1726        .mmap          = video_mmap,
1727        .ioctl         = video_ioctl2,
1728};
1729
1730static const struct v4l2_ioctl_ops video_ioctl_ops = {
1731        .vidioc_querycap      = vidioc_querycap,
1732        .vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
1733        .vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
1734        .vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
1735        .vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
1736        .vidioc_g_fmt_vbi_cap     = cx23885_vbi_fmt,
1737        .vidioc_try_fmt_vbi_cap   = cx23885_vbi_fmt,
1738        .vidioc_s_fmt_vbi_cap     = cx23885_vbi_fmt,
1739        .vidioc_reqbufs       = vidioc_reqbufs,
1740        .vidioc_querybuf      = vidioc_querybuf,
1741        .vidioc_qbuf          = vidioc_qbuf,
1742        .vidioc_dqbuf         = vidioc_dqbuf,
1743        .vidioc_s_std         = vidioc_s_std,
1744        .vidioc_g_std         = vidioc_g_std,
1745        .vidioc_enum_input    = vidioc_enum_input,
1746        .vidioc_g_input       = vidioc_g_input,
1747        .vidioc_s_input       = vidioc_s_input,
1748        .vidioc_log_status    = vidioc_log_status,
1749        .vidioc_queryctrl     = vidioc_queryctrl,
1750        .vidioc_g_ctrl        = vidioc_g_ctrl,
1751        .vidioc_s_ctrl        = vidioc_s_ctrl,
1752        .vidioc_streamon      = vidioc_streamon,
1753        .vidioc_streamoff     = vidioc_streamoff,
1754        .vidioc_g_tuner       = vidioc_g_tuner,
1755        .vidioc_s_tuner       = vidioc_s_tuner,
1756        .vidioc_g_frequency   = vidioc_g_frequency,
1757        .vidioc_s_frequency   = vidioc_s_frequency,
1758#ifdef CONFIG_VIDEO_ADV_DEBUG
1759        .vidioc_g_chip_info   = cx23885_g_chip_info,
1760        .vidioc_g_register    = cx23885_g_register,
1761        .vidioc_s_register    = cx23885_s_register,
1762#endif
1763        .vidioc_enumaudio     = vidioc_enum_audinput,
1764        .vidioc_g_audio       = vidioc_g_audinput,
1765        .vidioc_s_audio       = vidioc_s_audinput,
1766};
1767
1768static struct video_device cx23885_vbi_template;
1769static struct video_device cx23885_video_template = {
1770        .name                 = "cx23885-video",
1771        .fops                 = &video_fops,
1772        .ioctl_ops            = &video_ioctl_ops,
1773        .tvnorms              = CX23885_NORMS,
1774};
1775
1776static const struct v4l2_file_operations radio_fops = {
1777        .owner         = THIS_MODULE,
1778        .open          = video_open,
1779        .release       = video_release,
1780        .ioctl         = video_ioctl2,
1781};
1782
1783
1784void cx23885_video_unregister(struct cx23885_dev *dev)
1785{
1786        dprintk(1, "%s()\n", __func__);
1787        cx23885_irq_remove(dev, 0x01);
1788
1789        if (dev->vbi_dev) {
1790                if (video_is_registered(dev->vbi_dev))
1791                        video_unregister_device(dev->vbi_dev);
1792                else
1793                        video_device_release(dev->vbi_dev);
1794                dev->vbi_dev = NULL;
1795                btcx_riscmem_free(dev->pci, &dev->vbiq.stopper);
1796        }
1797        if (dev->video_dev) {
1798                if (video_is_registered(dev->video_dev))
1799                        video_unregister_device(dev->video_dev);
1800                else
1801                        video_device_release(dev->video_dev);
1802                dev->video_dev = NULL;
1803
1804                btcx_riscmem_free(dev->pci, &dev->vidq.stopper);
1805        }
1806
1807        if (dev->audio_dev)
1808                cx23885_audio_unregister(dev);
1809}
1810
1811int cx23885_video_register(struct cx23885_dev *dev)
1812{
1813        int err;
1814
1815        dprintk(1, "%s()\n", __func__);
1816        spin_lock_init(&dev->slock);
1817
1818        /* Initialize VBI template */
1819        cx23885_vbi_template = cx23885_video_template;
1820        strcpy(cx23885_vbi_template.name, "cx23885-vbi");
1821
1822        dev->tvnorm = V4L2_STD_NTSC_M;
1823
1824        /* init video dma queues */
1825        INIT_LIST_HEAD(&dev->vidq.active);
1826        INIT_LIST_HEAD(&dev->vidq.queued);
1827        dev->vidq.timeout.function = cx23885_vid_timeout;
1828        dev->vidq.timeout.data = (unsigned long)dev;
1829        init_timer(&dev->vidq.timeout);
1830        cx23885_risc_stopper(dev->pci, &dev->vidq.stopper,
1831                VID_A_DMA_CTL, 0x11, 0x00);
1832
1833        /* init vbi dma queues */
1834        INIT_LIST_HEAD(&dev->vbiq.active);
1835        INIT_LIST_HEAD(&dev->vbiq.queued);
1836        dev->vbiq.timeout.function = cx23885_vbi_timeout;
1837        dev->vbiq.timeout.data = (unsigned long)dev;
1838        init_timer(&dev->vbiq.timeout);
1839        cx23885_risc_stopper(dev->pci, &dev->vbiq.stopper,
1840                VID_A_DMA_CTL, 0x22, 0x00);
1841
1842        cx23885_irq_add_enable(dev, 0x01);
1843
1844        if ((TUNER_ABSENT != dev->tuner_type) &&
1845                        ((dev->tuner_bus == 0) || (dev->tuner_bus == 1))) {
1846                struct v4l2_subdev *sd = NULL;
1847
1848                if (dev->tuner_addr)
1849                        sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1850                                &dev->i2c_bus[dev->tuner_bus].i2c_adap,
1851                                "tuner", dev->tuner_addr, NULL);
1852                else
1853                        sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1854                                &dev->i2c_bus[dev->tuner_bus].i2c_adap,
1855                                "tuner", 0, v4l2_i2c_tuner_addrs(ADDRS_TV));
1856                if (sd) {
1857                        struct tuner_setup tun_setup;
1858
1859                        memset(&tun_setup, 0, sizeof(tun_setup));
1860                        tun_setup.mode_mask = T_ANALOG_TV;
1861                        tun_setup.type = dev->tuner_type;
1862                        tun_setup.addr = v4l2_i2c_subdev_addr(sd);
1863                        tun_setup.tuner_callback = cx23885_tuner_callback;
1864
1865                        v4l2_subdev_call(sd, tuner, s_type_addr, &tun_setup);
1866
1867                        if (dev->board == CX23885_BOARD_LEADTEK_WINFAST_PXTV1200) {
1868                                struct xc2028_ctrl ctrl = {
1869                                        .fname = XC2028_DEFAULT_FIRMWARE,
1870                                        .max_len = 64
1871                                };
1872                                struct v4l2_priv_tun_config cfg = {
1873                                        .tuner = dev->tuner_type,
1874                                        .priv = &ctrl
1875                                };
1876                                v4l2_subdev_call(sd, tuner, s_config, &cfg);
1877                        }
1878
1879                        if (dev->board == CX23885_BOARD_AVERMEDIA_HC81R) {
1880                                struct xc2028_ctrl ctrl = {
1881                                        .fname = "xc3028L-v36.fw",
1882                                        .max_len = 64
1883                                };
1884                                struct v4l2_priv_tun_config cfg = {
1885                                        .tuner = dev->tuner_type,
1886                                        .priv = &ctrl
1887                                };
1888                                v4l2_subdev_call(sd, tuner, s_config, &cfg);
1889                        }
1890                }
1891        }
1892
1893        /* register Video device */
1894        dev->video_dev = cx23885_vdev_init(dev, dev->pci,
1895                &cx23885_video_template, "video");
1896        err = video_register_device(dev->video_dev, VFL_TYPE_GRABBER,
1897                                    video_nr[dev->nr]);
1898        if (err < 0) {
1899                printk(KERN_INFO "%s: can't register video device\n",
1900                        dev->name);
1901                goto fail_unreg;
1902        }
1903        printk(KERN_INFO "%s: registered device %s [v4l2]\n",
1904               dev->name, video_device_node_name(dev->video_dev));
1905
1906        /* register VBI device */
1907        dev->vbi_dev = cx23885_vdev_init(dev, dev->pci,
1908                &cx23885_vbi_template, "vbi");
1909        err = video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
1910                                    vbi_nr[dev->nr]);
1911        if (err < 0) {
1912                printk(KERN_INFO "%s: can't register vbi device\n",
1913                        dev->name);
1914                goto fail_unreg;
1915        }
1916        printk(KERN_INFO "%s: registered device %s\n",
1917               dev->name, video_device_node_name(dev->vbi_dev));
1918
1919        /* Register ALSA audio device */
1920        dev->audio_dev = cx23885_audio_register(dev);
1921
1922        /* initial device configuration */
1923        mutex_lock(&dev->lock);
1924        cx23885_set_tvnorm(dev, dev->tvnorm);
1925        init_controls(dev);
1926        cx23885_video_mux(dev, 0);
1927        cx23885_audio_mux(dev, 0);
1928        mutex_unlock(&dev->lock);
1929
1930        return 0;
1931
1932fail_unreg:
1933        cx23885_video_unregister(dev);
1934        return err;
1935}
1936
1937