linux/drivers/media/pci/bt8xx/bttv-driver.c
<<
>>
Prefs
   1/*
   2
   3    bttv - Bt848 frame grabber driver
   4
   5    Copyright (C) 1996,97,98 Ralph  Metzler <rjkm@thp.uni-koeln.de>
   6                           & Marcus Metzler <mocm@thp.uni-koeln.de>
   7    (c) 1999-2002 Gerd Knorr <kraxel@bytesex.org>
   8
   9    some v4l2 code lines are taken from Justin's bttv2 driver which is
  10    (c) 2000 Justin Schoeman <justin@suntiger.ee.up.ac.za>
  11
  12    V4L1 removal from:
  13    (c) 2005-2006 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
  14
  15    Fixes to be fully V4L2 compliant by
  16    (c) 2006 Mauro Carvalho Chehab <mchehab@infradead.org>
  17
  18    Cropping and overscan support
  19    Copyright (C) 2005, 2006 Michael H. Schimek <mschimek@gmx.at>
  20    Sponsored by OPQ Systems AB
  21
  22    This program is free software; you can redistribute it and/or modify
  23    it under the terms of the GNU General Public License as published by
  24    the Free Software Foundation; either version 2 of the License, or
  25    (at your option) any later version.
  26
  27    This program is distributed in the hope that it will be useful,
  28    but WITHOUT ANY WARRANTY; without even the implied warranty of
  29    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30    GNU General Public License for more details.
  31
  32    You should have received a copy of the GNU General Public License
  33    along with this program; if not, write to the Free Software
  34    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  35*/
  36
  37#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  38
  39#include <linux/init.h>
  40#include <linux/module.h>
  41#include <linux/delay.h>
  42#include <linux/slab.h>
  43#include <linux/errno.h>
  44#include <linux/fs.h>
  45#include <linux/kernel.h>
  46#include <linux/sched.h>
  47#include <linux/interrupt.h>
  48#include <linux/kdev_t.h>
  49#include "bttvp.h"
  50#include <media/v4l2-common.h>
  51#include <media/v4l2-ioctl.h>
  52#include <media/v4l2-event.h>
  53#include <media/tvaudio.h>
  54#include <media/msp3400.h>
  55
  56#include <linux/dma-mapping.h>
  57
  58#include <asm/io.h>
  59#include <asm/byteorder.h>
  60
  61#include <media/saa6588.h>
  62
  63#define BTTV_VERSION "0.9.19"
  64
  65unsigned int bttv_num;                  /* number of Bt848s in use */
  66struct bttv *bttvs[BTTV_MAX];
  67
  68unsigned int bttv_debug;
  69unsigned int bttv_verbose = 1;
  70unsigned int bttv_gpio;
  71
  72/* config variables */
  73#ifdef __BIG_ENDIAN
  74static unsigned int bigendian=1;
  75#else
  76static unsigned int bigendian;
  77#endif
  78static unsigned int radio[BTTV_MAX];
  79static unsigned int irq_debug;
  80static unsigned int gbuffers = 8;
  81static unsigned int gbufsize = 0x208000;
  82static unsigned int reset_crop = 1;
  83
  84static int video_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
  85static int radio_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
  86static int vbi_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
  87static int debug_latency;
  88static int disable_ir;
  89
  90static unsigned int fdsr;
  91
  92/* options */
  93static unsigned int combfilter;
  94static unsigned int lumafilter;
  95static unsigned int automute    = 1;
  96static unsigned int chroma_agc;
  97static unsigned int agc_crush   = 1;
  98static unsigned int whitecrush_upper = 0xCF;
  99static unsigned int whitecrush_lower = 0x7F;
 100static unsigned int vcr_hack;
 101static unsigned int irq_iswitch;
 102static unsigned int uv_ratio    = 50;
 103static unsigned int full_luma_range;
 104static unsigned int coring;
 105
 106/* API features (turn on/off stuff for testing) */
 107static unsigned int v4l2        = 1;
 108
 109/* insmod args */
 110module_param(bttv_verbose,      int, 0644);
 111module_param(bttv_gpio,         int, 0644);
 112module_param(bttv_debug,        int, 0644);
 113module_param(irq_debug,         int, 0644);
 114module_param(debug_latency,     int, 0644);
 115module_param(disable_ir,        int, 0444);
 116
 117module_param(fdsr,              int, 0444);
 118module_param(gbuffers,          int, 0444);
 119module_param(gbufsize,          int, 0444);
 120module_param(reset_crop,        int, 0444);
 121
 122module_param(v4l2,              int, 0644);
 123module_param(bigendian,         int, 0644);
 124module_param(irq_iswitch,       int, 0644);
 125module_param(combfilter,        int, 0444);
 126module_param(lumafilter,        int, 0444);
 127module_param(automute,          int, 0444);
 128module_param(chroma_agc,        int, 0444);
 129module_param(agc_crush,         int, 0444);
 130module_param(whitecrush_upper,  int, 0444);
 131module_param(whitecrush_lower,  int, 0444);
 132module_param(vcr_hack,          int, 0444);
 133module_param(uv_ratio,          int, 0444);
 134module_param(full_luma_range,   int, 0444);
 135module_param(coring,            int, 0444);
 136
 137module_param_array(radio,       int, NULL, 0444);
 138module_param_array(video_nr,    int, NULL, 0444);
 139module_param_array(radio_nr,    int, NULL, 0444);
 140module_param_array(vbi_nr,      int, NULL, 0444);
 141
 142MODULE_PARM_DESC(radio, "The TV card supports radio, default is 0 (no)");
 143MODULE_PARM_DESC(bigendian, "byte order of the framebuffer, default is native endian");
 144MODULE_PARM_DESC(bttv_verbose, "verbose startup messages, default is 1 (yes)");
 145MODULE_PARM_DESC(bttv_gpio, "log gpio changes, default is 0 (no)");
 146MODULE_PARM_DESC(bttv_debug, "debug messages, default is 0 (no)");
 147MODULE_PARM_DESC(irq_debug, "irq handler debug messages, default is 0 (no)");
 148MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
 149MODULE_PARM_DESC(gbuffers, "number of capture buffers. range 2-32, default 8");
 150MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 0x208000");
 151MODULE_PARM_DESC(reset_crop, "reset cropping parameters at open(), default "
 152                 "is 1 (yes) for compatibility with older applications");
 153MODULE_PARM_DESC(automute, "mute audio on bad/missing video signal, default is 1 (yes)");
 154MODULE_PARM_DESC(chroma_agc, "enables the AGC of chroma signal, default is 0 (no)");
 155MODULE_PARM_DESC(agc_crush, "enables the luminance AGC crush, default is 1 (yes)");
 156MODULE_PARM_DESC(whitecrush_upper, "sets the white crush upper value, default is 207");
 157MODULE_PARM_DESC(whitecrush_lower, "sets the white crush lower value, default is 127");
 158MODULE_PARM_DESC(vcr_hack, "enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
 159MODULE_PARM_DESC(irq_iswitch, "switch inputs in irq handler");
 160MODULE_PARM_DESC(uv_ratio, "ratio between u and v gains, default is 50");
 161MODULE_PARM_DESC(full_luma_range, "use the full luma range, default is 0 (no)");
 162MODULE_PARM_DESC(coring, "set the luma coring level, default is 0 (no)");
 163MODULE_PARM_DESC(video_nr, "video device numbers");
 164MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
 165MODULE_PARM_DESC(radio_nr, "radio device numbers");
 166
 167MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
 168MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
 169MODULE_LICENSE("GPL");
 170MODULE_VERSION(BTTV_VERSION);
 171
 172#define V4L2_CID_PRIVATE_COMBFILTER             (V4L2_CID_USER_BTTV_BASE + 0)
 173#define V4L2_CID_PRIVATE_AUTOMUTE               (V4L2_CID_USER_BTTV_BASE + 1)
 174#define V4L2_CID_PRIVATE_LUMAFILTER             (V4L2_CID_USER_BTTV_BASE + 2)
 175#define V4L2_CID_PRIVATE_AGC_CRUSH              (V4L2_CID_USER_BTTV_BASE + 3)
 176#define V4L2_CID_PRIVATE_VCR_HACK               (V4L2_CID_USER_BTTV_BASE + 4)
 177#define V4L2_CID_PRIVATE_WHITECRUSH_LOWER       (V4L2_CID_USER_BTTV_BASE + 5)
 178#define V4L2_CID_PRIVATE_WHITECRUSH_UPPER       (V4L2_CID_USER_BTTV_BASE + 6)
 179#define V4L2_CID_PRIVATE_UV_RATIO               (V4L2_CID_USER_BTTV_BASE + 7)
 180#define V4L2_CID_PRIVATE_FULL_LUMA_RANGE        (V4L2_CID_USER_BTTV_BASE + 8)
 181#define V4L2_CID_PRIVATE_CORING                 (V4L2_CID_USER_BTTV_BASE + 9)
 182
 183/* ----------------------------------------------------------------------- */
 184/* sysfs                                                                   */
 185
 186static ssize_t show_card(struct device *cd,
 187                         struct device_attribute *attr, char *buf)
 188{
 189        struct video_device *vfd = container_of(cd, struct video_device, dev);
 190        struct bttv *btv = video_get_drvdata(vfd);
 191        return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
 192}
 193static DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
 194
 195/* ----------------------------------------------------------------------- */
 196/* dvb auto-load setup                                                     */
 197#if defined(CONFIG_MODULES) && defined(MODULE)
 198static void request_module_async(struct work_struct *work)
 199{
 200        request_module("dvb-bt8xx");
 201}
 202
 203static void request_modules(struct bttv *dev)
 204{
 205        INIT_WORK(&dev->request_module_wk, request_module_async);
 206        schedule_work(&dev->request_module_wk);
 207}
 208
 209static void flush_request_modules(struct bttv *dev)
 210{
 211        flush_work(&dev->request_module_wk);
 212}
 213#else
 214#define request_modules(dev)
 215#define flush_request_modules(dev) do {} while(0)
 216#endif /* CONFIG_MODULES */
 217
 218
 219/* ----------------------------------------------------------------------- */
 220/* static data                                                             */
 221
 222/* special timing tables from conexant... */
 223static u8 SRAM_Table[][60] =
 224{
 225        /* PAL digital input over GPIO[7:0] */
 226        {
 227                45, // 45 bytes following
 228                0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
 229                0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
 230                0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
 231                0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
 232                0x37,0x00,0xAF,0x21,0x00
 233        },
 234        /* NTSC digital input over GPIO[7:0] */
 235        {
 236                51, // 51 bytes following
 237                0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
 238                0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
 239                0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
 240                0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
 241                0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
 242                0x00,
 243        },
 244        // TGB_NTSC392 // quartzsight
 245        // This table has been modified to be used for Fusion Rev D
 246        {
 247                0x2A, // size of table = 42
 248                0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
 249                0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
 250                0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
 251                0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
 252                0x20, 0x00
 253        }
 254};
 255
 256/* minhdelayx1  first video pixel we can capture on a line and
 257   hdelayx1     start of active video, both relative to rising edge of
 258                /HRESET pulse (0H) in 1 / fCLKx1.
 259   swidth       width of active video and
 260   totalwidth   total line width, both in 1 / fCLKx1.
 261   sqwidth      total line width in square pixels.
 262   vdelay       start of active video in 2 * field lines relative to
 263                trailing edge of /VRESET pulse (VDELAY register).
 264   sheight      height of active video in 2 * field lines.
 265   extraheight  Added to sheight for cropcap.bounds.height only
 266   videostart0  ITU-R frame line number of the line corresponding
 267                to vdelay in the first field. */
 268#define CROPCAP(minhdelayx1, hdelayx1, swidth, totalwidth, sqwidth,      \
 269                vdelay, sheight, extraheight, videostart0)               \
 270        .cropcap.bounds.left = minhdelayx1,                              \
 271        /* * 2 because vertically we count field lines times two, */     \
 272        /* e.g. 23 * 2 to 23 * 2 + 576 in PAL-BGHI defrect. */           \
 273        .cropcap.bounds.top = (videostart0) * 2 - (vdelay) + MIN_VDELAY, \
 274        /* 4 is a safety margin at the end of the line. */               \
 275        .cropcap.bounds.width = (totalwidth) - (minhdelayx1) - 4,        \
 276        .cropcap.bounds.height = (sheight) + (extraheight) + (vdelay) -  \
 277                                 MIN_VDELAY,                             \
 278        .cropcap.defrect.left = hdelayx1,                                \
 279        .cropcap.defrect.top = (videostart0) * 2,                        \
 280        .cropcap.defrect.width = swidth,                                 \
 281        .cropcap.defrect.height = sheight,                               \
 282        .cropcap.pixelaspect.numerator = totalwidth,                     \
 283        .cropcap.pixelaspect.denominator = sqwidth,
 284
 285const struct bttv_tvnorm bttv_tvnorms[] = {
 286        /* PAL-BDGHI */
 287        /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
 288        /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
 289        {
 290                .v4l2_id        = V4L2_STD_PAL,
 291                .name           = "PAL",
 292                .Fsc            = 35468950,
 293                .swidth         = 924,
 294                .sheight        = 576,
 295                .totalwidth     = 1135,
 296                .adelay         = 0x7f,
 297                .bdelay         = 0x72,
 298                .iform          = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
 299                .scaledtwidth   = 1135,
 300                .hdelayx1       = 186,
 301                .hactivex1      = 924,
 302                .vdelay         = 0x20,
 303                .vbipack        = 255, /* min (2048 / 4, 0x1ff) & 0xff */
 304                .sram           = 0,
 305                /* ITU-R frame line number of the first VBI line
 306                   we can capture, of the first and second field.
 307                   The last line is determined by cropcap.bounds. */
 308                .vbistart       = { 7, 320 },
 309                CROPCAP(/* minhdelayx1 */ 68,
 310                        /* hdelayx1 */ 186,
 311                        /* Should be (768 * 1135 + 944 / 2) / 944.
 312                           cropcap.defrect is used for image width
 313                           checks, so we keep the old value 924. */
 314                        /* swidth */ 924,
 315                        /* totalwidth */ 1135,
 316                        /* sqwidth */ 944,
 317                        /* vdelay */ 0x20,
 318                        /* sheight */ 576,
 319                        /* bt878 (and bt848?) can capture another
 320                           line below active video. */
 321                        /* extraheight */ 2,
 322                        /* videostart0 */ 23)
 323        },{
 324                .v4l2_id        = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
 325                .name           = "NTSC",
 326                .Fsc            = 28636363,
 327                .swidth         = 768,
 328                .sheight        = 480,
 329                .totalwidth     = 910,
 330                .adelay         = 0x68,
 331                .bdelay         = 0x5d,
 332                .iform          = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
 333                .scaledtwidth   = 910,
 334                .hdelayx1       = 128,
 335                .hactivex1      = 910,
 336                .vdelay         = 0x1a,
 337                .vbipack        = 144, /* min (1600 / 4, 0x1ff) & 0xff */
 338                .sram           = 1,
 339                .vbistart       = { 10, 273 },
 340                CROPCAP(/* minhdelayx1 */ 68,
 341                        /* hdelayx1 */ 128,
 342                        /* Should be (640 * 910 + 780 / 2) / 780? */
 343                        /* swidth */ 768,
 344                        /* totalwidth */ 910,
 345                        /* sqwidth */ 780,
 346                        /* vdelay */ 0x1a,
 347                        /* sheight */ 480,
 348                        /* extraheight */ 0,
 349                        /* videostart0 */ 23)
 350        },{
 351                .v4l2_id        = V4L2_STD_SECAM,
 352                .name           = "SECAM",
 353                .Fsc            = 35468950,
 354                .swidth         = 924,
 355                .sheight        = 576,
 356                .totalwidth     = 1135,
 357                .adelay         = 0x7f,
 358                .bdelay         = 0xb0,
 359                .iform          = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
 360                .scaledtwidth   = 1135,
 361                .hdelayx1       = 186,
 362                .hactivex1      = 922,
 363                .vdelay         = 0x20,
 364                .vbipack        = 255,
 365                .sram           = 0, /* like PAL, correct? */
 366                .vbistart       = { 7, 320 },
 367                CROPCAP(/* minhdelayx1 */ 68,
 368                        /* hdelayx1 */ 186,
 369                        /* swidth */ 924,
 370                        /* totalwidth */ 1135,
 371                        /* sqwidth */ 944,
 372                        /* vdelay */ 0x20,
 373                        /* sheight */ 576,
 374                        /* extraheight */ 0,
 375                        /* videostart0 */ 23)
 376        },{
 377                .v4l2_id        = V4L2_STD_PAL_Nc,
 378                .name           = "PAL-Nc",
 379                .Fsc            = 28636363,
 380                .swidth         = 640,
 381                .sheight        = 576,
 382                .totalwidth     = 910,
 383                .adelay         = 0x68,
 384                .bdelay         = 0x5d,
 385                .iform          = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
 386                .scaledtwidth   = 780,
 387                .hdelayx1       = 130,
 388                .hactivex1      = 734,
 389                .vdelay         = 0x1a,
 390                .vbipack        = 144,
 391                .sram           = -1,
 392                .vbistart       = { 7, 320 },
 393                CROPCAP(/* minhdelayx1 */ 68,
 394                        /* hdelayx1 */ 130,
 395                        /* swidth */ (640 * 910 + 780 / 2) / 780,
 396                        /* totalwidth */ 910,
 397                        /* sqwidth */ 780,
 398                        /* vdelay */ 0x1a,
 399                        /* sheight */ 576,
 400                        /* extraheight */ 0,
 401                        /* videostart0 */ 23)
 402        },{
 403                .v4l2_id        = V4L2_STD_PAL_M,
 404                .name           = "PAL-M",
 405                .Fsc            = 28636363,
 406                .swidth         = 640,
 407                .sheight        = 480,
 408                .totalwidth     = 910,
 409                .adelay         = 0x68,
 410                .bdelay         = 0x5d,
 411                .iform          = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
 412                .scaledtwidth   = 780,
 413                .hdelayx1       = 135,
 414                .hactivex1      = 754,
 415                .vdelay         = 0x1a,
 416                .vbipack        = 144,
 417                .sram           = -1,
 418                .vbistart       = { 10, 273 },
 419                CROPCAP(/* minhdelayx1 */ 68,
 420                        /* hdelayx1 */ 135,
 421                        /* swidth */ (640 * 910 + 780 / 2) / 780,
 422                        /* totalwidth */ 910,
 423                        /* sqwidth */ 780,
 424                        /* vdelay */ 0x1a,
 425                        /* sheight */ 480,
 426                        /* extraheight */ 0,
 427                        /* videostart0 */ 23)
 428        },{
 429                .v4l2_id        = V4L2_STD_PAL_N,
 430                .name           = "PAL-N",
 431                .Fsc            = 35468950,
 432                .swidth         = 768,
 433                .sheight        = 576,
 434                .totalwidth     = 1135,
 435                .adelay         = 0x7f,
 436                .bdelay         = 0x72,
 437                .iform          = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
 438                .scaledtwidth   = 944,
 439                .hdelayx1       = 186,
 440                .hactivex1      = 922,
 441                .vdelay         = 0x20,
 442                .vbipack        = 144,
 443                .sram           = -1,
 444                .vbistart       = { 7, 320 },
 445                CROPCAP(/* minhdelayx1 */ 68,
 446                        /* hdelayx1 */ 186,
 447                        /* swidth */ (768 * 1135 + 944 / 2) / 944,
 448                        /* totalwidth */ 1135,
 449                        /* sqwidth */ 944,
 450                        /* vdelay */ 0x20,
 451                        /* sheight */ 576,
 452                        /* extraheight */ 0,
 453                        /* videostart0 */ 23)
 454        },{
 455                .v4l2_id        = V4L2_STD_NTSC_M_JP,
 456                .name           = "NTSC-JP",
 457                .Fsc            = 28636363,
 458                .swidth         = 640,
 459                .sheight        = 480,
 460                .totalwidth     = 910,
 461                .adelay         = 0x68,
 462                .bdelay         = 0x5d,
 463                .iform          = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
 464                .scaledtwidth   = 780,
 465                .hdelayx1       = 135,
 466                .hactivex1      = 754,
 467                .vdelay         = 0x16,
 468                .vbipack        = 144,
 469                .sram           = -1,
 470                .vbistart       = { 10, 273 },
 471                CROPCAP(/* minhdelayx1 */ 68,
 472                        /* hdelayx1 */ 135,
 473                        /* swidth */ (640 * 910 + 780 / 2) / 780,
 474                        /* totalwidth */ 910,
 475                        /* sqwidth */ 780,
 476                        /* vdelay */ 0x16,
 477                        /* sheight */ 480,
 478                        /* extraheight */ 0,
 479                        /* videostart0 */ 23)
 480        },{
 481                /* that one hopefully works with the strange timing
 482                 * which video recorders produce when playing a NTSC
 483                 * tape on a PAL TV ... */
 484                .v4l2_id        = V4L2_STD_PAL_60,
 485                .name           = "PAL-60",
 486                .Fsc            = 35468950,
 487                .swidth         = 924,
 488                .sheight        = 480,
 489                .totalwidth     = 1135,
 490                .adelay         = 0x7f,
 491                .bdelay         = 0x72,
 492                .iform          = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
 493                .scaledtwidth   = 1135,
 494                .hdelayx1       = 186,
 495                .hactivex1      = 924,
 496                .vdelay         = 0x1a,
 497                .vbipack        = 255,
 498                .vtotal         = 524,
 499                .sram           = -1,
 500                .vbistart       = { 10, 273 },
 501                CROPCAP(/* minhdelayx1 */ 68,
 502                        /* hdelayx1 */ 186,
 503                        /* swidth */ 924,
 504                        /* totalwidth */ 1135,
 505                        /* sqwidth */ 944,
 506                        /* vdelay */ 0x1a,
 507                        /* sheight */ 480,
 508                        /* extraheight */ 0,
 509                        /* videostart0 */ 23)
 510        }
 511};
 512static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
 513
 514/* ----------------------------------------------------------------------- */
 515/* bttv format list
 516   packed pixel formats must come first */
 517static const struct bttv_format formats[] = {
 518        {
 519                .name     = "8 bpp, gray",
 520                .fourcc   = V4L2_PIX_FMT_GREY,
 521                .btformat = BT848_COLOR_FMT_Y8,
 522                .depth    = 8,
 523                .flags    = FORMAT_FLAGS_PACKED,
 524        },{
 525                .name     = "8 bpp, dithered color",
 526                .fourcc   = V4L2_PIX_FMT_HI240,
 527                .btformat = BT848_COLOR_FMT_RGB8,
 528                .depth    = 8,
 529                .flags    = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
 530        },{
 531                .name     = "15 bpp RGB, le",
 532                .fourcc   = V4L2_PIX_FMT_RGB555,
 533                .btformat = BT848_COLOR_FMT_RGB15,
 534                .depth    = 16,
 535                .flags    = FORMAT_FLAGS_PACKED,
 536        },{
 537                .name     = "15 bpp RGB, be",
 538                .fourcc   = V4L2_PIX_FMT_RGB555X,
 539                .btformat = BT848_COLOR_FMT_RGB15,
 540                .btswap   = 0x03, /* byteswap */
 541                .depth    = 16,
 542                .flags    = FORMAT_FLAGS_PACKED,
 543        },{
 544                .name     = "16 bpp RGB, le",
 545                .fourcc   = V4L2_PIX_FMT_RGB565,
 546                .btformat = BT848_COLOR_FMT_RGB16,
 547                .depth    = 16,
 548                .flags    = FORMAT_FLAGS_PACKED,
 549        },{
 550                .name     = "16 bpp RGB, be",
 551                .fourcc   = V4L2_PIX_FMT_RGB565X,
 552                .btformat = BT848_COLOR_FMT_RGB16,
 553                .btswap   = 0x03, /* byteswap */
 554                .depth    = 16,
 555                .flags    = FORMAT_FLAGS_PACKED,
 556        },{
 557                .name     = "24 bpp RGB, le",
 558                .fourcc   = V4L2_PIX_FMT_BGR24,
 559                .btformat = BT848_COLOR_FMT_RGB24,
 560                .depth    = 24,
 561                .flags    = FORMAT_FLAGS_PACKED,
 562        },{
 563                .name     = "32 bpp RGB, le",
 564                .fourcc   = V4L2_PIX_FMT_BGR32,
 565                .btformat = BT848_COLOR_FMT_RGB32,
 566                .depth    = 32,
 567                .flags    = FORMAT_FLAGS_PACKED,
 568        },{
 569                .name     = "32 bpp RGB, be",
 570                .fourcc   = V4L2_PIX_FMT_RGB32,
 571                .btformat = BT848_COLOR_FMT_RGB32,
 572                .btswap   = 0x0f, /* byte+word swap */
 573                .depth    = 32,
 574                .flags    = FORMAT_FLAGS_PACKED,
 575        },{
 576                .name     = "4:2:2, packed, YUYV",
 577                .fourcc   = V4L2_PIX_FMT_YUYV,
 578                .btformat = BT848_COLOR_FMT_YUY2,
 579                .depth    = 16,
 580                .flags    = FORMAT_FLAGS_PACKED,
 581        },{
 582                .name     = "4:2:2, packed, UYVY",
 583                .fourcc   = V4L2_PIX_FMT_UYVY,
 584                .btformat = BT848_COLOR_FMT_YUY2,
 585                .btswap   = 0x03, /* byteswap */
 586                .depth    = 16,
 587                .flags    = FORMAT_FLAGS_PACKED,
 588        },{
 589                .name     = "4:2:2, planar, Y-Cb-Cr",
 590                .fourcc   = V4L2_PIX_FMT_YUV422P,
 591                .btformat = BT848_COLOR_FMT_YCrCb422,
 592                .depth    = 16,
 593                .flags    = FORMAT_FLAGS_PLANAR,
 594                .hshift   = 1,
 595                .vshift   = 0,
 596        },{
 597                .name     = "4:2:0, planar, Y-Cb-Cr",
 598                .fourcc   = V4L2_PIX_FMT_YUV420,
 599                .btformat = BT848_COLOR_FMT_YCrCb422,
 600                .depth    = 12,
 601                .flags    = FORMAT_FLAGS_PLANAR,
 602                .hshift   = 1,
 603                .vshift   = 1,
 604        },{
 605                .name     = "4:2:0, planar, Y-Cr-Cb",
 606                .fourcc   = V4L2_PIX_FMT_YVU420,
 607                .btformat = BT848_COLOR_FMT_YCrCb422,
 608                .depth    = 12,
 609                .flags    = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
 610                .hshift   = 1,
 611                .vshift   = 1,
 612        },{
 613                .name     = "4:1:1, planar, Y-Cb-Cr",
 614                .fourcc   = V4L2_PIX_FMT_YUV411P,
 615                .btformat = BT848_COLOR_FMT_YCrCb411,
 616                .depth    = 12,
 617                .flags    = FORMAT_FLAGS_PLANAR,
 618                .hshift   = 2,
 619                .vshift   = 0,
 620        },{
 621                .name     = "4:1:0, planar, Y-Cb-Cr",
 622                .fourcc   = V4L2_PIX_FMT_YUV410,
 623                .btformat = BT848_COLOR_FMT_YCrCb411,
 624                .depth    = 9,
 625                .flags    = FORMAT_FLAGS_PLANAR,
 626                .hshift   = 2,
 627                .vshift   = 2,
 628        },{
 629                .name     = "4:1:0, planar, Y-Cr-Cb",
 630                .fourcc   = V4L2_PIX_FMT_YVU410,
 631                .btformat = BT848_COLOR_FMT_YCrCb411,
 632                .depth    = 9,
 633                .flags    = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
 634                .hshift   = 2,
 635                .vshift   = 2,
 636        },{
 637                .name     = "raw scanlines",
 638                .fourcc   = -1,
 639                .btformat = BT848_COLOR_FMT_RAW,
 640                .depth    = 8,
 641                .flags    = FORMAT_FLAGS_RAW,
 642        }
 643};
 644static const unsigned int FORMATS = ARRAY_SIZE(formats);
 645
 646/* ----------------------------------------------------------------------- */
 647/* resource management                                                     */
 648
 649/*
 650   RESOURCE_    allocated by                freed by
 651
 652   VIDEO_READ   bttv_read 1)                bttv_read 2)
 653
 654   VIDEO_STREAM VIDIOC_STREAMON             VIDIOC_STREAMOFF
 655                 VIDIOC_QBUF 1)              bttv_release
 656                 VIDIOCMCAPTURE 1)
 657
 658   OVERLAY       VIDIOCCAPTURE on            VIDIOCCAPTURE off
 659                 VIDIOC_OVERLAY on           VIDIOC_OVERLAY off
 660                 3)                          bttv_release
 661
 662   VBI           VIDIOC_STREAMON             VIDIOC_STREAMOFF
 663                 VIDIOC_QBUF 1)              bttv_release
 664                 bttv_read, bttv_poll 1) 4)
 665
 666   1) The resource must be allocated when we enter buffer prepare functions
 667      and remain allocated while buffers are in the DMA queue.
 668   2) This is a single frame read.
 669   3) VIDIOC_S_FBUF and VIDIOC_S_FMT (OVERLAY) still work when
 670      RESOURCE_OVERLAY is allocated.
 671   4) This is a continuous read, implies VIDIOC_STREAMON.
 672
 673   Note this driver permits video input and standard changes regardless if
 674   resources are allocated.
 675*/
 676
 677#define VBI_RESOURCES (RESOURCE_VBI)
 678#define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
 679                         RESOURCE_VIDEO_STREAM | \
 680                         RESOURCE_OVERLAY)
 681
 682static
 683int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit)
 684{
 685        int xbits; /* mutual exclusive resources */
 686
 687        if (fh->resources & bit)
 688                /* have it already allocated */
 689                return 1;
 690
 691        xbits = bit;
 692        if (bit & (RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM))
 693                xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
 694
 695        /* is it free? */
 696        if (btv->resources & xbits) {
 697                /* no, someone else uses it */
 698                goto fail;
 699        }
 700
 701        if ((bit & VIDEO_RESOURCES)
 702            && 0 == (btv->resources & VIDEO_RESOURCES)) {
 703                /* Do crop - use current, don't - use default parameters. */
 704                __s32 top = btv->crop[!!fh->do_crop].rect.top;
 705
 706                if (btv->vbi_end > top)
 707                        goto fail;
 708
 709                /* We cannot capture the same line as video and VBI data.
 710                   Claim scan lines crop[].rect.top to bottom. */
 711                btv->crop_start = top;
 712        } else if (bit & VBI_RESOURCES) {
 713                __s32 end = fh->vbi_fmt.end;
 714
 715                if (end > btv->crop_start)
 716                        goto fail;
 717
 718                /* Claim scan lines above fh->vbi_fmt.end. */
 719                btv->vbi_end = end;
 720        }
 721
 722        /* it's free, grab it */
 723        fh->resources  |= bit;
 724        btv->resources |= bit;
 725        return 1;
 726
 727 fail:
 728        return 0;
 729}
 730
 731static
 732int check_btres(struct bttv_fh *fh, int bit)
 733{
 734        return (fh->resources & bit);
 735}
 736
 737static
 738int locked_btres(struct bttv *btv, int bit)
 739{
 740        return (btv->resources & bit);
 741}
 742
 743/* Call with btv->lock down. */
 744static void
 745disclaim_vbi_lines(struct bttv *btv)
 746{
 747        btv->vbi_end = 0;
 748}
 749
 750/* Call with btv->lock down. */
 751static void
 752disclaim_video_lines(struct bttv *btv)
 753{
 754        const struct bttv_tvnorm *tvnorm;
 755        u8 crop;
 756
 757        tvnorm = &bttv_tvnorms[btv->tvnorm];
 758        btv->crop_start = tvnorm->cropcap.bounds.top
 759                + tvnorm->cropcap.bounds.height;
 760
 761        /* VBI capturing ends at VDELAY, start of video capturing, no
 762           matter how many lines the VBI RISC program expects. When video
 763           capturing is off, it shall no longer "preempt" VBI capturing,
 764           so we set VDELAY to maximum. */
 765        crop = btread(BT848_E_CROP) | 0xc0;
 766        btwrite(crop, BT848_E_CROP);
 767        btwrite(0xfe, BT848_E_VDELAY_LO);
 768        btwrite(crop, BT848_O_CROP);
 769        btwrite(0xfe, BT848_O_VDELAY_LO);
 770}
 771
 772static
 773void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits)
 774{
 775        if ((fh->resources & bits) != bits) {
 776                /* trying to free resources not allocated by us ... */
 777                pr_err("BUG! (btres)\n");
 778        }
 779        fh->resources  &= ~bits;
 780        btv->resources &= ~bits;
 781
 782        bits = btv->resources;
 783
 784        if (0 == (bits & VIDEO_RESOURCES))
 785                disclaim_video_lines(btv);
 786
 787        if (0 == (bits & VBI_RESOURCES))
 788                disclaim_vbi_lines(btv);
 789}
 790
 791/* ----------------------------------------------------------------------- */
 792/* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC          */
 793
 794/* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
 795   PLL_X = Reference pre-divider (0=1, 1=2)
 796   PLL_C = Post divider (0=6, 1=4)
 797   PLL_I = Integer input
 798   PLL_F = Fractional input
 799
 800   F_input = 28.636363 MHz:
 801   PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
 802*/
 803
 804static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
 805{
 806        unsigned char fl, fh, fi;
 807
 808        /* prevent overflows */
 809        fin/=4;
 810        fout/=4;
 811
 812        fout*=12;
 813        fi=fout/fin;
 814
 815        fout=(fout%fin)*256;
 816        fh=fout/fin;
 817
 818        fout=(fout%fin)*256;
 819        fl=fout/fin;
 820
 821        btwrite(fl, BT848_PLL_F_LO);
 822        btwrite(fh, BT848_PLL_F_HI);
 823        btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
 824}
 825
 826static void set_pll(struct bttv *btv)
 827{
 828        int i;
 829
 830        if (!btv->pll.pll_crystal)
 831                return;
 832
 833        if (btv->pll.pll_ofreq == btv->pll.pll_current) {
 834                dprintk("%d: PLL: no change required\n", btv->c.nr);
 835                return;
 836        }
 837
 838        if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
 839                /* no PLL needed */
 840                if (btv->pll.pll_current == 0)
 841                        return;
 842                if (bttv_verbose)
 843                        pr_info("%d: PLL can sleep, using XTAL (%d)\n",
 844                                btv->c.nr, btv->pll.pll_ifreq);
 845                btwrite(0x00,BT848_TGCTRL);
 846                btwrite(0x00,BT848_PLL_XCI);
 847                btv->pll.pll_current = 0;
 848                return;
 849        }
 850
 851        if (bttv_verbose)
 852                pr_info("%d: Setting PLL: %d => %d (needs up to 100ms)\n",
 853                        btv->c.nr,
 854                        btv->pll.pll_ifreq, btv->pll.pll_ofreq);
 855        set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
 856
 857        for (i=0; i<10; i++) {
 858                /*  Let other people run while the PLL stabilizes */
 859                msleep(10);
 860
 861                if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
 862                        btwrite(0,BT848_DSTATUS);
 863                } else {
 864                        btwrite(0x08,BT848_TGCTRL);
 865                        btv->pll.pll_current = btv->pll.pll_ofreq;
 866                        if (bttv_verbose)
 867                                pr_info("PLL set ok\n");
 868                        return;
 869                }
 870        }
 871        btv->pll.pll_current = -1;
 872        if (bttv_verbose)
 873                pr_info("Setting PLL failed\n");
 874        return;
 875}
 876
 877/* used to switch between the bt848's analog/digital video capture modes */
 878static void bt848A_set_timing(struct bttv *btv)
 879{
 880        int i, len;
 881        int table_idx = bttv_tvnorms[btv->tvnorm].sram;
 882        int fsc       = bttv_tvnorms[btv->tvnorm].Fsc;
 883
 884        if (btv->input == btv->dig) {
 885                dprintk("%d: load digital timing table (table_idx=%d)\n",
 886                        btv->c.nr,table_idx);
 887
 888                /* timing change...reset timing generator address */
 889                btwrite(0x00, BT848_TGCTRL);
 890                btwrite(0x02, BT848_TGCTRL);
 891                btwrite(0x00, BT848_TGCTRL);
 892
 893                len=SRAM_Table[table_idx][0];
 894                for(i = 1; i <= len; i++)
 895                        btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
 896                btv->pll.pll_ofreq = 27000000;
 897
 898                set_pll(btv);
 899                btwrite(0x11, BT848_TGCTRL);
 900                btwrite(0x41, BT848_DVSIF);
 901        } else {
 902                btv->pll.pll_ofreq = fsc;
 903                set_pll(btv);
 904                btwrite(0x0, BT848_DVSIF);
 905        }
 906}
 907
 908/* ----------------------------------------------------------------------- */
 909
 910static void bt848_bright(struct bttv *btv, int bright)
 911{
 912        int value;
 913
 914        // printk("set bright: %d\n", bright); // DEBUG
 915        btv->bright = bright;
 916
 917        /* We want -128 to 127 we get 0-65535 */
 918        value = (bright >> 8) - 128;
 919        btwrite(value & 0xff, BT848_BRIGHT);
 920}
 921
 922static void bt848_hue(struct bttv *btv, int hue)
 923{
 924        int value;
 925
 926        btv->hue = hue;
 927
 928        /* -128 to 127 */
 929        value = (hue >> 8) - 128;
 930        btwrite(value & 0xff, BT848_HUE);
 931}
 932
 933static void bt848_contrast(struct bttv *btv, int cont)
 934{
 935        int value,hibit;
 936
 937        btv->contrast = cont;
 938
 939        /* 0-511 */
 940        value = (cont  >> 7);
 941        hibit = (value >> 6) & 4;
 942        btwrite(value & 0xff, BT848_CONTRAST_LO);
 943        btaor(hibit, ~4, BT848_E_CONTROL);
 944        btaor(hibit, ~4, BT848_O_CONTROL);
 945}
 946
 947static void bt848_sat(struct bttv *btv, int color)
 948{
 949        int val_u,val_v,hibits;
 950
 951        btv->saturation = color;
 952
 953        /* 0-511 for the color */
 954        val_u   = ((color * btv->opt_uv_ratio) / 50) >> 7;
 955        val_v   = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
 956        hibits  = (val_u >> 7) & 2;
 957        hibits |= (val_v >> 8) & 1;
 958        btwrite(val_u & 0xff, BT848_SAT_U_LO);
 959        btwrite(val_v & 0xff, BT848_SAT_V_LO);
 960        btaor(hibits, ~3, BT848_E_CONTROL);
 961        btaor(hibits, ~3, BT848_O_CONTROL);
 962}
 963
 964/* ----------------------------------------------------------------------- */
 965
 966static int
 967video_mux(struct bttv *btv, unsigned int input)
 968{
 969        int mux,mask2;
 970
 971        if (input >= bttv_tvcards[btv->c.type].video_inputs)
 972                return -EINVAL;
 973
 974        /* needed by RemoteVideo MX */
 975        mask2 = bttv_tvcards[btv->c.type].gpiomask2;
 976        if (mask2)
 977                gpio_inout(mask2,mask2);
 978
 979        if (input == btv->svhs)  {
 980                btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
 981                btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
 982        } else {
 983                btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
 984                btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
 985        }
 986        mux = bttv_muxsel(btv, input);
 987        btaor(mux<<5, ~(3<<5), BT848_IFORM);
 988        dprintk("%d: video mux: input=%d mux=%d\n", btv->c.nr, input, mux);
 989
 990        /* card specific hook */
 991        if(bttv_tvcards[btv->c.type].muxsel_hook)
 992                bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
 993        return 0;
 994}
 995
 996static char *audio_modes[] = {
 997        "audio: tuner", "audio: radio", "audio: extern",
 998        "audio: intern", "audio: mute"
 999};
1000
1001static void
1002audio_mux_gpio(struct bttv *btv, int input, int mute)
1003{
1004        int gpio_val, signal, mute_gpio;
1005
1006        gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
1007                   bttv_tvcards[btv->c.type].gpiomask);
1008        signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
1009
1010        /* automute */
1011        mute_gpio = mute || (btv->opt_automute && (!signal || !btv->users)
1012                                && !btv->has_radio_tuner);
1013
1014        if (mute_gpio)
1015                gpio_val = bttv_tvcards[btv->c.type].gpiomute;
1016        else
1017                gpio_val = bttv_tvcards[btv->c.type].gpiomux[input];
1018
1019        switch (btv->c.type) {
1020        case BTTV_BOARD_VOODOOTV_FM:
1021        case BTTV_BOARD_VOODOOTV_200:
1022                gpio_val = bttv_tda9880_setnorm(btv, gpio_val);
1023                break;
1024
1025        default:
1026                gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpio_val);
1027        }
1028
1029        if (bttv_gpio)
1030                bttv_gpio_tracking(btv, audio_modes[mute_gpio ? 4 : input]);
1031}
1032
1033static int
1034audio_mute(struct bttv *btv, int mute)
1035{
1036        struct v4l2_ctrl *ctrl;
1037
1038        audio_mux_gpio(btv, btv->audio_input, mute);
1039
1040        if (btv->sd_msp34xx) {
1041                ctrl = v4l2_ctrl_find(btv->sd_msp34xx->ctrl_handler, V4L2_CID_AUDIO_MUTE);
1042                if (ctrl)
1043                        v4l2_ctrl_s_ctrl(ctrl, mute);
1044        }
1045        if (btv->sd_tvaudio) {
1046                ctrl = v4l2_ctrl_find(btv->sd_tvaudio->ctrl_handler, V4L2_CID_AUDIO_MUTE);
1047                if (ctrl)
1048                        v4l2_ctrl_s_ctrl(ctrl, mute);
1049        }
1050        if (btv->sd_tda7432) {
1051                ctrl = v4l2_ctrl_find(btv->sd_tda7432->ctrl_handler, V4L2_CID_AUDIO_MUTE);
1052                if (ctrl)
1053                        v4l2_ctrl_s_ctrl(ctrl, mute);
1054        }
1055        return 0;
1056}
1057
1058static int
1059audio_input(struct bttv *btv, int input)
1060{
1061        audio_mux_gpio(btv, input, btv->mute);
1062
1063        if (btv->sd_msp34xx) {
1064                u32 in;
1065
1066                /* Note: the inputs tuner/radio/extern/intern are translated
1067                   to msp routings. This assumes common behavior for all msp3400
1068                   based TV cards. When this assumption fails, then the
1069                   specific MSP routing must be added to the card table.
1070                   For now this is sufficient. */
1071                switch (input) {
1072                case TVAUDIO_INPUT_RADIO:
1073                        /* Some boards need the msp do to the radio demod */
1074                        if (btv->radio_uses_msp_demodulator) {
1075                                in = MSP_INPUT_DEFAULT;
1076                                break;
1077                        }
1078                        in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1079                                    MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1080                        break;
1081                case TVAUDIO_INPUT_EXTERN:
1082                        in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
1083                                    MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1084                        break;
1085                case TVAUDIO_INPUT_INTERN:
1086                        /* Yes, this is the same input as for RADIO. I doubt
1087                           if this is ever used. The only board with an INTERN
1088                           input is the BTTV_BOARD_AVERMEDIA98. I wonder how
1089                           that was tested. My guess is that the whole INTERN
1090                           input does not work. */
1091                        in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1092                                    MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1093                        break;
1094                case TVAUDIO_INPUT_TUNER:
1095                default:
1096                        /* This is the only card that uses TUNER2, and afaik,
1097                           is the only difference between the VOODOOTV_FM
1098                           and VOODOOTV_200 */
1099                        if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
1100                                in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
1101                                        MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
1102                        else
1103                                in = MSP_INPUT_DEFAULT;
1104                        break;
1105                }
1106                v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing,
1107                               in, MSP_OUTPUT_DEFAULT, 0);
1108        }
1109        if (btv->sd_tvaudio) {
1110                v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing,
1111                                 input, 0, 0);
1112        }
1113        return 0;
1114}
1115
1116static void
1117bttv_crop_calc_limits(struct bttv_crop *c)
1118{
1119        /* Scale factor min. 1:1, max. 16:1. Min. image size
1120           48 x 32. Scaled width must be a multiple of 4. */
1121
1122        if (1) {
1123                /* For bug compatibility with VIDIOCGCAP and image
1124                   size checks in earlier driver versions. */
1125                c->min_scaled_width = 48;
1126                c->min_scaled_height = 32;
1127        } else {
1128                c->min_scaled_width =
1129                        (max_t(unsigned int, 48, c->rect.width >> 4) + 3) & ~3;
1130                c->min_scaled_height =
1131                        max_t(unsigned int, 32, c->rect.height >> 4);
1132        }
1133
1134        c->max_scaled_width  = c->rect.width & ~3;
1135        c->max_scaled_height = c->rect.height;
1136}
1137
1138static void
1139bttv_crop_reset(struct bttv_crop *c, unsigned int norm)
1140{
1141        c->rect = bttv_tvnorms[norm].cropcap.defrect;
1142        bttv_crop_calc_limits(c);
1143}
1144
1145/* Call with btv->lock down. */
1146static int
1147set_tvnorm(struct bttv *btv, unsigned int norm)
1148{
1149        const struct bttv_tvnorm *tvnorm;
1150        v4l2_std_id id;
1151
1152        BUG_ON(norm >= BTTV_TVNORMS);
1153        BUG_ON(btv->tvnorm >= BTTV_TVNORMS);
1154
1155        tvnorm = &bttv_tvnorms[norm];
1156
1157        if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
1158                    sizeof (tvnorm->cropcap))) {
1159                bttv_crop_reset(&btv->crop[0], norm);
1160                btv->crop[1] = btv->crop[0]; /* current = default */
1161
1162                if (0 == (btv->resources & VIDEO_RESOURCES)) {
1163                        btv->crop_start = tvnorm->cropcap.bounds.top
1164                                + tvnorm->cropcap.bounds.height;
1165                }
1166        }
1167
1168        btv->tvnorm = norm;
1169
1170        btwrite(tvnorm->adelay, BT848_ADELAY);
1171        btwrite(tvnorm->bdelay, BT848_BDELAY);
1172        btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
1173              BT848_IFORM);
1174        btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
1175        btwrite(1, BT848_VBI_PACK_DEL);
1176        bt848A_set_timing(btv);
1177
1178        switch (btv->c.type) {
1179        case BTTV_BOARD_VOODOOTV_FM:
1180        case BTTV_BOARD_VOODOOTV_200:
1181                bttv_tda9880_setnorm(btv, gpio_read());
1182                break;
1183        }
1184        id = tvnorm->v4l2_id;
1185        bttv_call_all(btv, video, s_std, id);
1186
1187        return 0;
1188}
1189
1190/* Call with btv->lock down. */
1191static void
1192set_input(struct bttv *btv, unsigned int input, unsigned int norm)
1193{
1194        unsigned long flags;
1195
1196        btv->input = input;
1197        if (irq_iswitch) {
1198                spin_lock_irqsave(&btv->s_lock,flags);
1199                if (btv->curr.frame_irq) {
1200                        /* active capture -> delayed input switch */
1201                        btv->new_input = input;
1202                } else {
1203                        video_mux(btv,input);
1204                }
1205                spin_unlock_irqrestore(&btv->s_lock,flags);
1206        } else {
1207                video_mux(btv,input);
1208        }
1209        btv->audio_input = (btv->tuner_type != TUNER_ABSENT && input == 0) ?
1210                                TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN;
1211        audio_input(btv, btv->audio_input);
1212        set_tvnorm(btv, norm);
1213}
1214
1215static void init_irqreg(struct bttv *btv)
1216{
1217        /* clear status */
1218        btwrite(0xfffffUL, BT848_INT_STAT);
1219
1220        if (bttv_tvcards[btv->c.type].no_video) {
1221                /* i2c only */
1222                btwrite(BT848_INT_I2CDONE,
1223                        BT848_INT_MASK);
1224        } else {
1225                /* full video */
1226                btwrite((btv->triton1)  |
1227                        (btv->gpioirq ? BT848_INT_GPINT : 0) |
1228                        BT848_INT_SCERR |
1229                        (fdsr ? BT848_INT_FDSR : 0) |
1230                        BT848_INT_RISCI | BT848_INT_OCERR |
1231                        BT848_INT_FMTCHG|BT848_INT_HLOCK|
1232                        BT848_INT_I2CDONE,
1233                        BT848_INT_MASK);
1234        }
1235}
1236
1237static void init_bt848(struct bttv *btv)
1238{
1239        if (bttv_tvcards[btv->c.type].no_video) {
1240                /* very basic init only */
1241                init_irqreg(btv);
1242                return;
1243        }
1244
1245        btwrite(0x00, BT848_CAP_CTL);
1246        btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1247        btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1248
1249        /* set planar and packed mode trigger points and         */
1250        /* set rising edge of inverted GPINTR pin as irq trigger */
1251        btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1252                BT848_GPIO_DMA_CTL_PLTP1_16|
1253                BT848_GPIO_DMA_CTL_PLTP23_16|
1254                BT848_GPIO_DMA_CTL_GPINTC|
1255                BT848_GPIO_DMA_CTL_GPINTI,
1256                BT848_GPIO_DMA_CTL);
1257
1258        btwrite(0x20, BT848_E_VSCALE_HI);
1259        btwrite(0x20, BT848_O_VSCALE_HI);
1260
1261        v4l2_ctrl_handler_setup(&btv->ctrl_handler);
1262
1263        /* interrupt */
1264        init_irqreg(btv);
1265}
1266
1267static void bttv_reinit_bt848(struct bttv *btv)
1268{
1269        unsigned long flags;
1270
1271        if (bttv_verbose)
1272                pr_info("%d: reset, reinitialize\n", btv->c.nr);
1273        spin_lock_irqsave(&btv->s_lock,flags);
1274        btv->errors=0;
1275        bttv_set_dma(btv,0);
1276        spin_unlock_irqrestore(&btv->s_lock,flags);
1277
1278        init_bt848(btv);
1279        btv->pll.pll_current = -1;
1280        set_input(btv, btv->input, btv->tvnorm);
1281}
1282
1283static int bttv_s_ctrl(struct v4l2_ctrl *c)
1284{
1285        struct bttv *btv = container_of(c->handler, struct bttv, ctrl_handler);
1286        int val;
1287
1288        switch (c->id) {
1289        case V4L2_CID_BRIGHTNESS:
1290                bt848_bright(btv, c->val);
1291                break;
1292        case V4L2_CID_HUE:
1293                bt848_hue(btv, c->val);
1294                break;
1295        case V4L2_CID_CONTRAST:
1296                bt848_contrast(btv, c->val);
1297                break;
1298        case V4L2_CID_SATURATION:
1299                bt848_sat(btv, c->val);
1300                break;
1301        case V4L2_CID_COLOR_KILLER:
1302                if (c->val) {
1303                        btor(BT848_SCLOOP_CKILL, BT848_E_SCLOOP);
1304                        btor(BT848_SCLOOP_CKILL, BT848_O_SCLOOP);
1305                } else {
1306                        btand(~BT848_SCLOOP_CKILL, BT848_E_SCLOOP);
1307                        btand(~BT848_SCLOOP_CKILL, BT848_O_SCLOOP);
1308                }
1309                break;
1310        case V4L2_CID_AUDIO_MUTE:
1311                audio_mute(btv, c->val);
1312                btv->mute = c->val;
1313                break;
1314        case V4L2_CID_AUDIO_VOLUME:
1315                btv->volume_gpio(btv, c->val);
1316                break;
1317
1318        case V4L2_CID_CHROMA_AGC:
1319                val = c->val ? BT848_SCLOOP_CAGC : 0;
1320                btwrite(val, BT848_E_SCLOOP);
1321                btwrite(val, BT848_O_SCLOOP);
1322                break;
1323        case V4L2_CID_PRIVATE_COMBFILTER:
1324                btv->opt_combfilter = c->val;
1325                break;
1326        case V4L2_CID_PRIVATE_LUMAFILTER:
1327                if (c->val) {
1328                        btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1329                        btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1330                } else {
1331                        btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1332                        btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1333                }
1334                break;
1335        case V4L2_CID_PRIVATE_AUTOMUTE:
1336                btv->opt_automute = c->val;
1337                break;
1338        case V4L2_CID_PRIVATE_AGC_CRUSH:
1339                btwrite(BT848_ADC_RESERVED |
1340                                (c->val ? BT848_ADC_CRUSH : 0),
1341                                BT848_ADC);
1342                break;
1343        case V4L2_CID_PRIVATE_VCR_HACK:
1344                btv->opt_vcr_hack = c->val;
1345                break;
1346        case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1347                btwrite(c->val, BT848_WC_UP);
1348                break;
1349        case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1350                btwrite(c->val, BT848_WC_DOWN);
1351                break;
1352        case V4L2_CID_PRIVATE_UV_RATIO:
1353                btv->opt_uv_ratio = c->val;
1354                bt848_sat(btv, btv->saturation);
1355                break;
1356        case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1357                btaor((c->val << 7), ~BT848_OFORM_RANGE, BT848_OFORM);
1358                break;
1359        case V4L2_CID_PRIVATE_CORING:
1360                btaor((c->val << 5), ~BT848_OFORM_CORE32, BT848_OFORM);
1361                break;
1362        default:
1363                return -EINVAL;
1364        }
1365        return 0;
1366}
1367
1368/* ----------------------------------------------------------------------- */
1369
1370static const struct v4l2_ctrl_ops bttv_ctrl_ops = {
1371        .s_ctrl = bttv_s_ctrl,
1372};
1373
1374static struct v4l2_ctrl_config bttv_ctrl_combfilter = {
1375        .ops = &bttv_ctrl_ops,
1376        .id = V4L2_CID_PRIVATE_COMBFILTER,
1377        .name = "Comb Filter",
1378        .type = V4L2_CTRL_TYPE_BOOLEAN,
1379        .min = 0,
1380        .max = 1,
1381        .step = 1,
1382        .def = 1,
1383};
1384
1385static struct v4l2_ctrl_config bttv_ctrl_automute = {
1386        .ops = &bttv_ctrl_ops,
1387        .id = V4L2_CID_PRIVATE_AUTOMUTE,
1388        .name = "Auto Mute",
1389        .type = V4L2_CTRL_TYPE_BOOLEAN,
1390        .min = 0,
1391        .max = 1,
1392        .step = 1,
1393        .def = 1,
1394};
1395
1396static struct v4l2_ctrl_config bttv_ctrl_lumafilter = {
1397        .ops = &bttv_ctrl_ops,
1398        .id = V4L2_CID_PRIVATE_LUMAFILTER,
1399        .name = "Luma Decimation Filter",
1400        .type = V4L2_CTRL_TYPE_BOOLEAN,
1401        .min = 0,
1402        .max = 1,
1403        .step = 1,
1404        .def = 1,
1405};
1406
1407static struct v4l2_ctrl_config bttv_ctrl_agc_crush = {
1408        .ops = &bttv_ctrl_ops,
1409        .id = V4L2_CID_PRIVATE_AGC_CRUSH,
1410        .name = "AGC Crush",
1411        .type = V4L2_CTRL_TYPE_BOOLEAN,
1412        .min = 0,
1413        .max = 1,
1414        .step = 1,
1415        .def = 1,
1416};
1417
1418static struct v4l2_ctrl_config bttv_ctrl_vcr_hack = {
1419        .ops = &bttv_ctrl_ops,
1420        .id = V4L2_CID_PRIVATE_VCR_HACK,
1421        .name = "VCR Hack",
1422        .type = V4L2_CTRL_TYPE_BOOLEAN,
1423        .min = 0,
1424        .max = 1,
1425        .step = 1,
1426        .def = 1,
1427};
1428
1429static struct v4l2_ctrl_config bttv_ctrl_whitecrush_lower = {
1430        .ops = &bttv_ctrl_ops,
1431        .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
1432        .name = "Whitecrush Lower",
1433        .type = V4L2_CTRL_TYPE_INTEGER,
1434        .min = 0,
1435        .max = 255,
1436        .step = 1,
1437        .def = 0x7f,
1438};
1439
1440static struct v4l2_ctrl_config bttv_ctrl_whitecrush_upper = {
1441        .ops = &bttv_ctrl_ops,
1442        .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
1443        .name = "Whitecrush Upper",
1444        .type = V4L2_CTRL_TYPE_INTEGER,
1445        .min = 0,
1446        .max = 255,
1447        .step = 1,
1448        .def = 0xcf,
1449};
1450
1451static struct v4l2_ctrl_config bttv_ctrl_uv_ratio = {
1452        .ops = &bttv_ctrl_ops,
1453        .id = V4L2_CID_PRIVATE_UV_RATIO,
1454        .name = "UV Ratio",
1455        .type = V4L2_CTRL_TYPE_INTEGER,
1456        .min = 0,
1457        .max = 100,
1458        .step = 1,
1459        .def = 50,
1460};
1461
1462static struct v4l2_ctrl_config bttv_ctrl_full_luma = {
1463        .ops = &bttv_ctrl_ops,
1464        .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
1465        .name = "Full Luma Range",
1466        .type = V4L2_CTRL_TYPE_BOOLEAN,
1467        .min = 0,
1468        .max = 1,
1469        .step = 1,
1470};
1471
1472static struct v4l2_ctrl_config bttv_ctrl_coring = {
1473        .ops = &bttv_ctrl_ops,
1474        .id = V4L2_CID_PRIVATE_CORING,
1475        .name = "Coring",
1476        .type = V4L2_CTRL_TYPE_INTEGER,
1477        .min = 0,
1478        .max = 3,
1479        .step = 1,
1480};
1481
1482
1483/* ----------------------------------------------------------------------- */
1484
1485void bttv_gpio_tracking(struct bttv *btv, char *comment)
1486{
1487        unsigned int outbits, data;
1488        outbits = btread(BT848_GPIO_OUT_EN);
1489        data    = btread(BT848_GPIO_DATA);
1490        pr_debug("%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1491                 btv->c.nr, outbits, data & outbits, data & ~outbits, comment);
1492}
1493
1494static void bttv_field_count(struct bttv *btv)
1495{
1496        int need_count = 0;
1497
1498        if (btv->users)
1499                need_count++;
1500
1501        if (need_count) {
1502                /* start field counter */
1503                btor(BT848_INT_VSYNC,BT848_INT_MASK);
1504        } else {
1505                /* stop field counter */
1506                btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1507                btv->field_count = 0;
1508        }
1509}
1510
1511static const struct bttv_format*
1512format_by_fourcc(int fourcc)
1513{
1514        unsigned int i;
1515
1516        for (i = 0; i < FORMATS; i++) {
1517                if (-1 == formats[i].fourcc)
1518                        continue;
1519                if (formats[i].fourcc == fourcc)
1520                        return formats+i;
1521        }
1522        return NULL;
1523}
1524
1525/* ----------------------------------------------------------------------- */
1526/* misc helpers                                                            */
1527
1528static int
1529bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1530                    struct bttv_buffer *new)
1531{
1532        struct bttv_buffer *old;
1533        unsigned long flags;
1534
1535        dprintk("switch_overlay: enter [new=%p]\n", new);
1536        if (new)
1537                new->vb.state = VIDEOBUF_DONE;
1538        spin_lock_irqsave(&btv->s_lock,flags);
1539        old = btv->screen;
1540        btv->screen = new;
1541        btv->loop_irq |= 1;
1542        bttv_set_dma(btv, 0x03);
1543        spin_unlock_irqrestore(&btv->s_lock,flags);
1544        if (NULL != old) {
1545                dprintk("switch_overlay: old=%p state is %d\n",
1546                        old, old->vb.state);
1547                bttv_dma_free(&fh->cap,btv, old);
1548                kfree(old);
1549        }
1550        if (NULL == new)
1551                free_btres_lock(btv,fh,RESOURCE_OVERLAY);
1552        dprintk("switch_overlay: done\n");
1553        return 0;
1554}
1555
1556/* ----------------------------------------------------------------------- */
1557/* video4linux (1) interface                                               */
1558
1559static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
1560                               struct bttv_buffer *buf,
1561                               const struct bttv_format *fmt,
1562                               unsigned int width, unsigned int height,
1563                               enum v4l2_field field)
1564{
1565        struct bttv_fh *fh = q->priv_data;
1566        int redo_dma_risc = 0;
1567        struct bttv_crop c;
1568        int norm;
1569        int rc;
1570
1571        /* check settings */
1572        if (NULL == fmt)
1573                return -EINVAL;
1574        if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1575                width  = RAW_BPL;
1576                height = RAW_LINES*2;
1577                if (width*height > buf->vb.bsize)
1578                        return -EINVAL;
1579                buf->vb.size = buf->vb.bsize;
1580
1581                /* Make sure tvnorm and vbi_end remain consistent
1582                   until we're done. */
1583
1584                norm = btv->tvnorm;
1585
1586                /* In this mode capturing always starts at defrect.top
1587                   (default VDELAY), ignoring cropping parameters. */
1588                if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
1589                        return -EINVAL;
1590                }
1591
1592                c.rect = bttv_tvnorms[norm].cropcap.defrect;
1593        } else {
1594                norm = btv->tvnorm;
1595                c = btv->crop[!!fh->do_crop];
1596
1597                if (width < c.min_scaled_width ||
1598                    width > c.max_scaled_width ||
1599                    height < c.min_scaled_height)
1600                        return -EINVAL;
1601
1602                switch (field) {
1603                case V4L2_FIELD_TOP:
1604                case V4L2_FIELD_BOTTOM:
1605                case V4L2_FIELD_ALTERNATE:
1606                        /* btv->crop counts frame lines. Max. scale
1607                           factor is 16:1 for frames, 8:1 for fields. */
1608                        if (height * 2 > c.max_scaled_height)
1609                                return -EINVAL;
1610                        break;
1611
1612                default:
1613                        if (height > c.max_scaled_height)
1614                                return -EINVAL;
1615                        break;
1616                }
1617
1618                buf->vb.size = (width * height * fmt->depth) >> 3;
1619                if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
1620                        return -EINVAL;
1621        }
1622
1623        /* alloc + fill struct bttv_buffer (if changed) */
1624        if (buf->vb.width != width || buf->vb.height != height ||
1625            buf->vb.field != field ||
1626            buf->tvnorm != norm || buf->fmt != fmt ||
1627            buf->crop.top != c.rect.top ||
1628            buf->crop.left != c.rect.left ||
1629            buf->crop.width != c.rect.width ||
1630            buf->crop.height != c.rect.height) {
1631                buf->vb.width  = width;
1632                buf->vb.height = height;
1633                buf->vb.field  = field;
1634                buf->tvnorm    = norm;
1635                buf->fmt       = fmt;
1636                buf->crop      = c.rect;
1637                redo_dma_risc = 1;
1638        }
1639
1640        /* alloc risc memory */
1641        if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1642                redo_dma_risc = 1;
1643                if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
1644                        goto fail;
1645        }
1646
1647        if (redo_dma_risc)
1648                if (0 != (rc = bttv_buffer_risc(btv,buf)))
1649                        goto fail;
1650
1651        buf->vb.state = VIDEOBUF_PREPARED;
1652        return 0;
1653
1654 fail:
1655        bttv_dma_free(q,btv,buf);
1656        return rc;
1657}
1658
1659static int
1660buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1661{
1662        struct bttv_fh *fh = q->priv_data;
1663
1664        *size = fh->fmt->depth*fh->width*fh->height >> 3;
1665        if (0 == *count)
1666                *count = gbuffers;
1667        if (*size * *count > gbuffers * gbufsize)
1668                *count = (gbuffers * gbufsize) / *size;
1669        return 0;
1670}
1671
1672static int
1673buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1674               enum v4l2_field field)
1675{
1676        struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1677        struct bttv_fh *fh = q->priv_data;
1678
1679        return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
1680                                   fh->width, fh->height, field);
1681}
1682
1683static void
1684buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1685{
1686        struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1687        struct bttv_fh *fh = q->priv_data;
1688        struct bttv    *btv = fh->btv;
1689
1690        buf->vb.state = VIDEOBUF_QUEUED;
1691        list_add_tail(&buf->vb.queue,&btv->capture);
1692        if (!btv->curr.frame_irq) {
1693                btv->loop_irq |= 1;
1694                bttv_set_dma(btv, 0x03);
1695        }
1696}
1697
1698static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1699{
1700        struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1701        struct bttv_fh *fh = q->priv_data;
1702
1703        bttv_dma_free(q,fh->btv,buf);
1704}
1705
1706static struct videobuf_queue_ops bttv_video_qops = {
1707        .buf_setup    = buffer_setup,
1708        .buf_prepare  = buffer_prepare,
1709        .buf_queue    = buffer_queue,
1710        .buf_release  = buffer_release,
1711};
1712
1713static void radio_enable(struct bttv *btv)
1714{
1715        /* Switch to the radio tuner */
1716        if (!btv->has_radio_tuner) {
1717                btv->has_radio_tuner = 1;
1718                bttv_call_all(btv, tuner, s_radio);
1719                btv->audio_input = TVAUDIO_INPUT_RADIO;
1720                audio_input(btv, btv->audio_input);
1721        }
1722}
1723
1724static int bttv_s_std(struct file *file, void *priv, v4l2_std_id id)
1725{
1726        struct bttv_fh *fh  = priv;
1727        struct bttv *btv = fh->btv;
1728        unsigned int i;
1729        int err = 0;
1730
1731        for (i = 0; i < BTTV_TVNORMS; i++)
1732                if (id & bttv_tvnorms[i].v4l2_id)
1733                        break;
1734        if (i == BTTV_TVNORMS) {
1735                err = -EINVAL;
1736                goto err;
1737        }
1738
1739        btv->std = id;
1740        set_tvnorm(btv, i);
1741
1742err:
1743
1744        return err;
1745}
1746
1747static int bttv_g_std(struct file *file, void *priv, v4l2_std_id *id)
1748{
1749        struct bttv_fh *fh  = priv;
1750        struct bttv *btv = fh->btv;
1751
1752        *id = btv->std;
1753        return 0;
1754}
1755
1756static int bttv_querystd(struct file *file, void *f, v4l2_std_id *id)
1757{
1758        struct bttv_fh *fh = f;
1759        struct bttv *btv = fh->btv;
1760
1761        if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1762                *id &= V4L2_STD_625_50;
1763        else
1764                *id &= V4L2_STD_525_60;
1765        return 0;
1766}
1767
1768static int bttv_enum_input(struct file *file, void *priv,
1769                                        struct v4l2_input *i)
1770{
1771        struct bttv_fh *fh = priv;
1772        struct bttv *btv = fh->btv;
1773        int rc = 0;
1774
1775        if (i->index >= bttv_tvcards[btv->c.type].video_inputs) {
1776                rc = -EINVAL;
1777                goto err;
1778        }
1779
1780        i->type     = V4L2_INPUT_TYPE_CAMERA;
1781        i->audioset = 0;
1782
1783        if (btv->tuner_type != TUNER_ABSENT && i->index == 0) {
1784                sprintf(i->name, "Television");
1785                i->type  = V4L2_INPUT_TYPE_TUNER;
1786                i->tuner = 0;
1787        } else if (i->index == btv->svhs) {
1788                sprintf(i->name, "S-Video");
1789        } else {
1790                sprintf(i->name, "Composite%d", i->index);
1791        }
1792
1793        if (i->index == btv->input) {
1794                __u32 dstatus = btread(BT848_DSTATUS);
1795                if (0 == (dstatus & BT848_DSTATUS_PRES))
1796                        i->status |= V4L2_IN_ST_NO_SIGNAL;
1797                if (0 == (dstatus & BT848_DSTATUS_HLOC))
1798                        i->status |= V4L2_IN_ST_NO_H_LOCK;
1799        }
1800
1801        i->std = BTTV_NORMS;
1802
1803err:
1804
1805        return rc;
1806}
1807
1808static int bttv_g_input(struct file *file, void *priv, unsigned int *i)
1809{
1810        struct bttv_fh *fh = priv;
1811        struct bttv *btv = fh->btv;
1812
1813        *i = btv->input;
1814
1815        return 0;
1816}
1817
1818static int bttv_s_input(struct file *file, void *priv, unsigned int i)
1819{
1820        struct bttv_fh *fh  = priv;
1821        struct bttv *btv = fh->btv;
1822
1823        if (i >= bttv_tvcards[btv->c.type].video_inputs)
1824                return -EINVAL;
1825
1826        set_input(btv, i, btv->tvnorm);
1827        return 0;
1828}
1829
1830static int bttv_s_tuner(struct file *file, void *priv,
1831                                        const struct v4l2_tuner *t)
1832{
1833        struct bttv_fh *fh  = priv;
1834        struct bttv *btv = fh->btv;
1835
1836        if (t->index)
1837                return -EINVAL;
1838
1839        bttv_call_all(btv, tuner, s_tuner, t);
1840
1841        if (btv->audio_mode_gpio) {
1842                struct v4l2_tuner copy = *t;
1843
1844                btv->audio_mode_gpio(btv, &copy, 1);
1845        }
1846        return 0;
1847}
1848
1849static int bttv_g_frequency(struct file *file, void *priv,
1850                                        struct v4l2_frequency *f)
1851{
1852        struct bttv_fh *fh  = priv;
1853        struct bttv *btv = fh->btv;
1854
1855        if (f->tuner)
1856                return -EINVAL;
1857
1858        if (f->type == V4L2_TUNER_RADIO)
1859                radio_enable(btv);
1860        f->frequency = f->type == V4L2_TUNER_RADIO ?
1861                                btv->radio_freq : btv->tv_freq;
1862
1863        return 0;
1864}
1865
1866static void bttv_set_frequency(struct bttv *btv, const struct v4l2_frequency *f)
1867{
1868        struct v4l2_frequency new_freq = *f;
1869
1870        bttv_call_all(btv, tuner, s_frequency, f);
1871        /* s_frequency may clamp the frequency, so get the actual
1872           frequency before assigning radio/tv_freq. */
1873        bttv_call_all(btv, tuner, g_frequency, &new_freq);
1874        if (new_freq.type == V4L2_TUNER_RADIO) {
1875                radio_enable(btv);
1876                btv->radio_freq = new_freq.frequency;
1877                if (btv->has_matchbox)
1878                        tea5757_set_freq(btv, btv->radio_freq);
1879        } else {
1880                btv->tv_freq = new_freq.frequency;
1881        }
1882}
1883
1884static int bttv_s_frequency(struct file *file, void *priv,
1885                                        const struct v4l2_frequency *f)
1886{
1887        struct bttv_fh *fh  = priv;
1888        struct bttv *btv = fh->btv;
1889
1890        if (f->tuner)
1891                return -EINVAL;
1892
1893        bttv_set_frequency(btv, f);
1894        return 0;
1895}
1896
1897static int bttv_log_status(struct file *file, void *f)
1898{
1899        struct video_device *vdev = video_devdata(file);
1900        struct bttv_fh *fh  = f;
1901        struct bttv *btv = fh->btv;
1902
1903        v4l2_ctrl_handler_log_status(vdev->ctrl_handler, btv->c.v4l2_dev.name);
1904        bttv_call_all(btv, core, log_status);
1905        return 0;
1906}
1907
1908#ifdef CONFIG_VIDEO_ADV_DEBUG
1909static int bttv_g_register(struct file *file, void *f,
1910                                        struct v4l2_dbg_register *reg)
1911{
1912        struct bttv_fh *fh = f;
1913        struct bttv *btv = fh->btv;
1914
1915        /* bt848 has a 12-bit register space */
1916        reg->reg &= 0xfff;
1917        reg->val = btread(reg->reg);
1918        reg->size = 1;
1919
1920        return 0;
1921}
1922
1923static int bttv_s_register(struct file *file, void *f,
1924                                        const struct v4l2_dbg_register *reg)
1925{
1926        struct bttv_fh *fh = f;
1927        struct bttv *btv = fh->btv;
1928
1929        /* bt848 has a 12-bit register space */
1930        btwrite(reg->val, reg->reg & 0xfff);
1931
1932        return 0;
1933}
1934#endif
1935
1936/* Given cropping boundaries b and the scaled width and height of a
1937   single field or frame, which must not exceed hardware limits, this
1938   function adjusts the cropping parameters c. */
1939static void
1940bttv_crop_adjust        (struct bttv_crop *             c,
1941                         const struct v4l2_rect *       b,
1942                         __s32                          width,
1943                         __s32                          height,
1944                         enum v4l2_field                field)
1945{
1946        __s32 frame_height = height << !V4L2_FIELD_HAS_BOTH(field);
1947        __s32 max_left;
1948        __s32 max_top;
1949
1950        if (width < c->min_scaled_width) {
1951                /* Max. hor. scale factor 16:1. */
1952                c->rect.width = width * 16;
1953        } else if (width > c->max_scaled_width) {
1954                /* Min. hor. scale factor 1:1. */
1955                c->rect.width = width;
1956
1957                max_left = b->left + b->width - width;
1958                max_left = min(max_left, (__s32) MAX_HDELAY);
1959                if (c->rect.left > max_left)
1960                        c->rect.left = max_left;
1961        }
1962
1963        if (height < c->min_scaled_height) {
1964                /* Max. vert. scale factor 16:1, single fields 8:1. */
1965                c->rect.height = height * 16;
1966        } else if (frame_height > c->max_scaled_height) {
1967                /* Min. vert. scale factor 1:1.
1968                   Top and height count field lines times two. */
1969                c->rect.height = (frame_height + 1) & ~1;
1970
1971                max_top = b->top + b->height - c->rect.height;
1972                if (c->rect.top > max_top)
1973                        c->rect.top = max_top;
1974        }
1975
1976        bttv_crop_calc_limits(c);
1977}
1978
1979/* Returns an error if scaling to a frame or single field with the given
1980   width and height is not possible with the current cropping parameters
1981   and width aligned according to width_mask. If adjust_size is TRUE the
1982   function may adjust the width and/or height instead, rounding width
1983   to (width + width_bias) & width_mask. If adjust_crop is TRUE it may
1984   also adjust the current cropping parameters to get closer to the
1985   desired image size. */
1986static int
1987limit_scaled_size_lock       (struct bttv_fh *               fh,
1988                         __s32 *                        width,
1989                         __s32 *                        height,
1990                         enum v4l2_field                field,
1991                         unsigned int                   width_mask,
1992                         unsigned int                   width_bias,
1993                         int                            adjust_size,
1994                         int                            adjust_crop)
1995{
1996        struct bttv *btv = fh->btv;
1997        const struct v4l2_rect *b;
1998        struct bttv_crop *c;
1999        __s32 min_width;
2000        __s32 min_height;
2001        __s32 max_width;
2002        __s32 max_height;
2003        int rc;
2004
2005        BUG_ON((int) width_mask >= 0 ||
2006               width_bias >= (unsigned int) -width_mask);
2007
2008        /* Make sure tvnorm, vbi_end and the current cropping parameters
2009           remain consistent until we're done. */
2010
2011        b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2012
2013        /* Do crop - use current, don't - use default parameters. */
2014        c = &btv->crop[!!fh->do_crop];
2015
2016        if (fh->do_crop
2017            && adjust_size
2018            && adjust_crop
2019            && !locked_btres(btv, VIDEO_RESOURCES)) {
2020                min_width = 48;
2021                min_height = 32;
2022
2023                /* We cannot scale up. When the scaled image is larger
2024                   than crop.rect we adjust the crop.rect as required
2025                   by the V4L2 spec, hence cropcap.bounds are our limit. */
2026                max_width = min_t(unsigned int, b->width, MAX_HACTIVE);
2027                max_height = b->height;
2028
2029                /* We cannot capture the same line as video and VBI data.
2030                   Note btv->vbi_end is really a minimum, see
2031                   bttv_vbi_try_fmt(). */
2032                if (btv->vbi_end > b->top) {
2033                        max_height -= btv->vbi_end - b->top;
2034                        rc = -EBUSY;
2035                        if (min_height > max_height)
2036                                goto fail;
2037                }
2038        } else {
2039                rc = -EBUSY;
2040                if (btv->vbi_end > c->rect.top)
2041                        goto fail;
2042
2043                min_width  = c->min_scaled_width;
2044                min_height = c->min_scaled_height;
2045                max_width  = c->max_scaled_width;
2046                max_height = c->max_scaled_height;
2047
2048                adjust_crop = 0;
2049        }
2050
2051        min_width = (min_width - width_mask - 1) & width_mask;
2052        max_width = max_width & width_mask;
2053
2054        /* Max. scale factor is 16:1 for frames, 8:1 for fields. */
2055        min_height = min_height;
2056        /* Min. scale factor is 1:1. */
2057        max_height >>= !V4L2_FIELD_HAS_BOTH(field);
2058
2059        if (adjust_size) {
2060                *width = clamp(*width, min_width, max_width);
2061                *height = clamp(*height, min_height, max_height);
2062
2063                /* Round after clamping to avoid overflow. */
2064                *width = (*width + width_bias) & width_mask;
2065
2066                if (adjust_crop) {
2067                        bttv_crop_adjust(c, b, *width, *height, field);
2068
2069                        if (btv->vbi_end > c->rect.top) {
2070                                /* Move the crop window out of the way. */
2071                                c->rect.top = btv->vbi_end;
2072                        }
2073                }
2074        } else {
2075                rc = -EINVAL;
2076                if (*width  < min_width ||
2077                    *height < min_height ||
2078                    *width  > max_width ||
2079                    *height > max_height ||
2080                    0 != (*width & ~width_mask))
2081                        goto fail;
2082        }
2083
2084        rc = 0; /* success */
2085
2086 fail:
2087
2088        return rc;
2089}
2090
2091/* Returns an error if the given overlay window dimensions are not
2092   possible with the current cropping parameters. If adjust_size is
2093   TRUE the function may adjust the window width and/or height
2094   instead, however it always rounds the horizontal position and
2095   width as btcx_align() does. If adjust_crop is TRUE the function
2096   may also adjust the current cropping parameters to get closer
2097   to the desired window size. */
2098static int
2099verify_window_lock(struct bttv_fh *fh, struct v4l2_window *win,
2100                         int adjust_size, int adjust_crop)
2101{
2102        enum v4l2_field field;
2103        unsigned int width_mask;
2104        int rc;
2105
2106        if (win->w.width < 48)
2107                win->w.width = 48;
2108        if (win->w.height < 32)
2109                win->w.height = 32;
2110        if (win->clipcount > 2048)
2111                win->clipcount = 2048;
2112
2113        win->chromakey = 0;
2114        win->global_alpha = 0;
2115        field = win->field;
2116
2117        switch (field) {
2118        case V4L2_FIELD_TOP:
2119        case V4L2_FIELD_BOTTOM:
2120        case V4L2_FIELD_INTERLACED:
2121                break;
2122        default:
2123                field = V4L2_FIELD_ANY;
2124                break;
2125        }
2126        if (V4L2_FIELD_ANY == field) {
2127                __s32 height2;
2128
2129                height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
2130                field = (win->w.height > height2)
2131                        ? V4L2_FIELD_INTERLACED
2132                        : V4L2_FIELD_TOP;
2133        }
2134        win->field = field;
2135
2136        if (NULL == fh->ovfmt)
2137                return -EINVAL;
2138        /* 4-byte alignment. */
2139        width_mask = ~0;
2140        switch (fh->ovfmt->depth) {
2141        case 8:
2142        case 24:
2143                width_mask = ~3;
2144                break;
2145        case 16:
2146                width_mask = ~1;
2147                break;
2148        case 32:
2149                break;
2150        default:
2151                BUG();
2152        }
2153
2154        win->w.width -= win->w.left & ~width_mask;
2155        win->w.left = (win->w.left - width_mask - 1) & width_mask;
2156
2157        rc = limit_scaled_size_lock(fh, &win->w.width, &win->w.height,
2158                               field, width_mask,
2159                               /* width_bias: round down */ 0,
2160                               adjust_size, adjust_crop);
2161        if (0 != rc)
2162                return rc;
2163        return 0;
2164}
2165
2166static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
2167                        struct v4l2_window *win, int fixup)
2168{
2169        struct v4l2_clip *clips = NULL;
2170        int n,size,retval = 0;
2171
2172        if (NULL == fh->ovfmt)
2173                return -EINVAL;
2174        if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
2175                return -EINVAL;
2176        retval = verify_window_lock(fh, win,
2177                               /* adjust_size */ fixup,
2178                               /* adjust_crop */ fixup);
2179        if (0 != retval)
2180                return retval;
2181
2182        /* copy clips  --  luckily v4l1 + v4l2 are binary
2183           compatible here ...*/
2184        n = win->clipcount;
2185        size = sizeof(*clips)*(n+4);
2186        clips = kmalloc(size,GFP_KERNEL);
2187        if (NULL == clips)
2188                return -ENOMEM;
2189        if (n > 0) {
2190                if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
2191                        kfree(clips);
2192                        return -EFAULT;
2193                }
2194        }
2195
2196        /* clip against screen */
2197        if (NULL != btv->fbuf.base)
2198                n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
2199                                      &win->w, clips, n);
2200        btcx_sort_clips(clips,n);
2201
2202        /* 4-byte alignments */
2203        switch (fh->ovfmt->depth) {
2204        case 8:
2205        case 24:
2206                btcx_align(&win->w, clips, n, 3);
2207                break;
2208        case 16:
2209                btcx_align(&win->w, clips, n, 1);
2210                break;
2211        case 32:
2212                /* no alignment fixups needed */
2213                break;
2214        default:
2215                BUG();
2216        }
2217
2218        kfree(fh->ov.clips);
2219        fh->ov.clips    = clips;
2220        fh->ov.nclips   = n;
2221
2222        fh->ov.w        = win->w;
2223        fh->ov.field    = win->field;
2224        fh->ov.setup_ok = 1;
2225
2226        btv->init.ov.w.width   = win->w.width;
2227        btv->init.ov.w.height  = win->w.height;
2228        btv->init.ov.field     = win->field;
2229
2230        /* update overlay if needed */
2231        retval = 0;
2232        if (check_btres(fh, RESOURCE_OVERLAY)) {
2233                struct bttv_buffer *new;
2234
2235                new = videobuf_sg_alloc(sizeof(*new));
2236                new->crop = btv->crop[!!fh->do_crop].rect;
2237                bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2238                retval = bttv_switch_overlay(btv,fh,new);
2239        }
2240        return retval;
2241}
2242
2243/* ----------------------------------------------------------------------- */
2244
2245static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
2246{
2247        struct videobuf_queue* q = NULL;
2248
2249        switch (fh->type) {
2250        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2251                q = &fh->cap;
2252                break;
2253        case V4L2_BUF_TYPE_VBI_CAPTURE:
2254                q = &fh->vbi;
2255                break;
2256        default:
2257                BUG();
2258        }
2259        return q;
2260}
2261
2262static int bttv_resource(struct bttv_fh *fh)
2263{
2264        int res = 0;
2265
2266        switch (fh->type) {
2267        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2268                res = RESOURCE_VIDEO_STREAM;
2269                break;
2270        case V4L2_BUF_TYPE_VBI_CAPTURE:
2271                res = RESOURCE_VBI;
2272                break;
2273        default:
2274                BUG();
2275        }
2276        return res;
2277}
2278
2279static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2280{
2281        struct videobuf_queue *q = bttv_queue(fh);
2282        int res = bttv_resource(fh);
2283
2284        if (check_btres(fh,res))
2285                return -EBUSY;
2286        if (videobuf_queue_is_busy(q))
2287                return -EBUSY;
2288        fh->type = type;
2289        return 0;
2290}
2291
2292static void
2293pix_format_set_size     (struct v4l2_pix_format *       f,
2294                         const struct bttv_format *     fmt,
2295                         unsigned int                   width,
2296                         unsigned int                   height)
2297{
2298        f->width = width;
2299        f->height = height;
2300
2301        if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2302                f->bytesperline = width; /* Y plane */
2303                f->sizeimage = (width * height * fmt->depth) >> 3;
2304        } else {
2305                f->bytesperline = (width * fmt->depth) >> 3;
2306                f->sizeimage = height * f->bytesperline;
2307        }
2308}
2309
2310static int bttv_g_fmt_vid_cap(struct file *file, void *priv,
2311                                        struct v4l2_format *f)
2312{
2313        struct bttv_fh *fh  = priv;
2314
2315        pix_format_set_size(&f->fmt.pix, fh->fmt,
2316                                fh->width, fh->height);
2317        f->fmt.pix.field        = fh->cap.field;
2318        f->fmt.pix.pixelformat  = fh->fmt->fourcc;
2319        f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
2320
2321        return 0;
2322}
2323
2324static int bttv_g_fmt_vid_overlay(struct file *file, void *priv,
2325                                        struct v4l2_format *f)
2326{
2327        struct bttv_fh *fh  = priv;
2328
2329        f->fmt.win.w     = fh->ov.w;
2330        f->fmt.win.field = fh->ov.field;
2331
2332        return 0;
2333}
2334
2335static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
2336                                                struct v4l2_format *f)
2337{
2338        const struct bttv_format *fmt;
2339        struct bttv_fh *fh = priv;
2340        struct bttv *btv = fh->btv;
2341        enum v4l2_field field;
2342        __s32 width, height;
2343        __s32 height2;
2344        int rc;
2345
2346        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2347        if (NULL == fmt)
2348                return -EINVAL;
2349
2350        field = f->fmt.pix.field;
2351
2352        switch (field) {
2353        case V4L2_FIELD_TOP:
2354        case V4L2_FIELD_BOTTOM:
2355        case V4L2_FIELD_ALTERNATE:
2356        case V4L2_FIELD_INTERLACED:
2357                break;
2358        case V4L2_FIELD_SEQ_BT:
2359        case V4L2_FIELD_SEQ_TB:
2360                if (!(fmt->flags & FORMAT_FLAGS_PLANAR)) {
2361                        field = V4L2_FIELD_SEQ_TB;
2362                        break;
2363                }
2364                /* fall through */
2365        default: /* FIELD_ANY case */
2366                height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
2367                field = (f->fmt.pix.height > height2)
2368                        ? V4L2_FIELD_INTERLACED
2369                        : V4L2_FIELD_BOTTOM;
2370                break;
2371        }
2372
2373        width = f->fmt.pix.width;
2374        height = f->fmt.pix.height;
2375
2376        rc = limit_scaled_size_lock(fh, &width, &height, field,
2377                               /* width_mask: 4 pixels */ ~3,
2378                               /* width_bias: nearest */ 2,
2379                               /* adjust_size */ 1,
2380                               /* adjust_crop */ 0);
2381        if (0 != rc)
2382                return rc;
2383
2384        /* update data for the application */
2385        f->fmt.pix.field = field;
2386        pix_format_set_size(&f->fmt.pix, fmt, width, height);
2387        f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
2388
2389        return 0;
2390}
2391
2392static int bttv_try_fmt_vid_overlay(struct file *file, void *priv,
2393                                                struct v4l2_format *f)
2394{
2395        struct bttv_fh *fh = priv;
2396
2397        verify_window_lock(fh, &f->fmt.win,
2398                        /* adjust_size */ 1,
2399                        /* adjust_crop */ 0);
2400        return 0;
2401}
2402
2403static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
2404                                struct v4l2_format *f)
2405{
2406        int retval;
2407        const struct bttv_format *fmt;
2408        struct bttv_fh *fh = priv;
2409        struct bttv *btv = fh->btv;
2410        __s32 width, height;
2411        enum v4l2_field field;
2412
2413        retval = bttv_switch_type(fh, f->type);
2414        if (0 != retval)
2415                return retval;
2416
2417        retval = bttv_try_fmt_vid_cap(file, priv, f);
2418        if (0 != retval)
2419                return retval;
2420
2421        width = f->fmt.pix.width;
2422        height = f->fmt.pix.height;
2423        field = f->fmt.pix.field;
2424
2425        retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field,
2426                               /* width_mask: 4 pixels */ ~3,
2427                               /* width_bias: nearest */ 2,
2428                               /* adjust_size */ 1,
2429                               /* adjust_crop */ 1);
2430        if (0 != retval)
2431                return retval;
2432
2433        f->fmt.pix.field = field;
2434
2435        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2436
2437        /* update our state informations */
2438        fh->fmt              = fmt;
2439        fh->cap.field        = f->fmt.pix.field;
2440        fh->cap.last         = V4L2_FIELD_NONE;
2441        fh->width            = f->fmt.pix.width;
2442        fh->height           = f->fmt.pix.height;
2443        btv->init.fmt        = fmt;
2444        btv->init.width      = f->fmt.pix.width;
2445        btv->init.height     = f->fmt.pix.height;
2446
2447        return 0;
2448}
2449
2450static int bttv_s_fmt_vid_overlay(struct file *file, void *priv,
2451                                struct v4l2_format *f)
2452{
2453        struct bttv_fh *fh = priv;
2454        struct bttv *btv = fh->btv;
2455
2456        if (no_overlay > 0) {
2457                pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2458                return -EINVAL;
2459        }
2460
2461        return setup_window_lock(fh, btv, &f->fmt.win, 1);
2462}
2463
2464static int bttv_querycap(struct file *file, void  *priv,
2465                                struct v4l2_capability *cap)
2466{
2467        struct video_device *vdev = video_devdata(file);
2468        struct bttv_fh *fh = priv;
2469        struct bttv *btv = fh->btv;
2470
2471        if (0 == v4l2)
2472                return -EINVAL;
2473
2474        strlcpy(cap->driver, "bttv", sizeof(cap->driver));
2475        strlcpy(cap->card, btv->video_dev->name, sizeof(cap->card));
2476        snprintf(cap->bus_info, sizeof(cap->bus_info),
2477                 "PCI:%s", pci_name(btv->c.pci));
2478        cap->capabilities =
2479                V4L2_CAP_VIDEO_CAPTURE |
2480                V4L2_CAP_READWRITE |
2481                V4L2_CAP_STREAMING |
2482                V4L2_CAP_DEVICE_CAPS;
2483        if (no_overlay <= 0)
2484                cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2485        if (btv->vbi_dev)
2486                cap->capabilities |= V4L2_CAP_VBI_CAPTURE;
2487        if (btv->radio_dev)
2488                cap->capabilities |= V4L2_CAP_RADIO;
2489
2490        /*
2491         * No need to lock here: those vars are initialized during board
2492         * probe and remains untouched during the rest of the driver lifecycle
2493         */
2494        if (btv->has_saa6588)
2495                cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
2496        if (btv->tuner_type != TUNER_ABSENT)
2497                cap->capabilities |= V4L2_CAP_TUNER;
2498        if (vdev->vfl_type == VFL_TYPE_GRABBER)
2499                cap->device_caps = cap->capabilities &
2500                        (V4L2_CAP_VIDEO_CAPTURE |
2501                         V4L2_CAP_READWRITE |
2502                         V4L2_CAP_STREAMING |
2503                         V4L2_CAP_VIDEO_OVERLAY |
2504                         V4L2_CAP_TUNER);
2505        else if (vdev->vfl_type == VFL_TYPE_VBI)
2506                cap->device_caps = cap->capabilities &
2507                        (V4L2_CAP_VBI_CAPTURE |
2508                         V4L2_CAP_READWRITE |
2509                         V4L2_CAP_STREAMING |
2510                         V4L2_CAP_TUNER);
2511        else {
2512                cap->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
2513                if (btv->has_saa6588)
2514                        cap->device_caps |= V4L2_CAP_READWRITE |
2515                                                V4L2_CAP_RDS_CAPTURE;
2516        }
2517        return 0;
2518}
2519
2520static int bttv_enum_fmt_cap_ovr(struct v4l2_fmtdesc *f)
2521{
2522        int index = -1, i;
2523
2524        for (i = 0; i < FORMATS; i++) {
2525                if (formats[i].fourcc != -1)
2526                        index++;
2527                if ((unsigned int)index == f->index)
2528                        break;
2529        }
2530        if (FORMATS == i)
2531                return -EINVAL;
2532
2533        f->pixelformat = formats[i].fourcc;
2534        strlcpy(f->description, formats[i].name, sizeof(f->description));
2535
2536        return i;
2537}
2538
2539static int bttv_enum_fmt_vid_cap(struct file *file, void  *priv,
2540                                struct v4l2_fmtdesc *f)
2541{
2542        int rc = bttv_enum_fmt_cap_ovr(f);
2543
2544        if (rc < 0)
2545                return rc;
2546
2547        return 0;
2548}
2549
2550static int bttv_enum_fmt_vid_overlay(struct file *file, void  *priv,
2551                                        struct v4l2_fmtdesc *f)
2552{
2553        int rc;
2554
2555        if (no_overlay > 0) {
2556                pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2557                return -EINVAL;
2558        }
2559
2560        rc = bttv_enum_fmt_cap_ovr(f);
2561
2562        if (rc < 0)
2563                return rc;
2564
2565        if (!(formats[rc].flags & FORMAT_FLAGS_PACKED))
2566                return -EINVAL;
2567
2568        return 0;
2569}
2570
2571static int bttv_g_fbuf(struct file *file, void *f,
2572                                struct v4l2_framebuffer *fb)
2573{
2574        struct bttv_fh *fh = f;
2575        struct bttv *btv = fh->btv;
2576
2577        *fb = btv->fbuf;
2578        fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2579        fb->flags = V4L2_FBUF_FLAG_PRIMARY;
2580        if (fh->ovfmt)
2581                fb->fmt.pixelformat  = fh->ovfmt->fourcc;
2582        return 0;
2583}
2584
2585static int bttv_overlay(struct file *file, void *f, unsigned int on)
2586{
2587        struct bttv_fh *fh = f;
2588        struct bttv *btv = fh->btv;
2589        struct bttv_buffer *new;
2590        int retval = 0;
2591
2592        if (on) {
2593                /* verify args */
2594                if (unlikely(!btv->fbuf.base)) {
2595                        return -EINVAL;
2596                }
2597                if (unlikely(!fh->ov.setup_ok)) {
2598                        dprintk("%d: overlay: !setup_ok\n", btv->c.nr);
2599                        retval = -EINVAL;
2600                }
2601                if (retval)
2602                        return retval;
2603        }
2604
2605        if (!check_alloc_btres_lock(btv, fh, RESOURCE_OVERLAY))
2606                return -EBUSY;
2607
2608        if (on) {
2609                fh->ov.tvnorm = btv->tvnorm;
2610                new = videobuf_sg_alloc(sizeof(*new));
2611                new->crop = btv->crop[!!fh->do_crop].rect;
2612                bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2613        } else {
2614                new = NULL;
2615        }
2616
2617        /* switch over */
2618        retval = bttv_switch_overlay(btv, fh, new);
2619        return retval;
2620}
2621
2622static int bttv_s_fbuf(struct file *file, void *f,
2623                                const struct v4l2_framebuffer *fb)
2624{
2625        struct bttv_fh *fh = f;
2626        struct bttv *btv = fh->btv;
2627        const struct bttv_format *fmt;
2628        int retval;
2629
2630        if (!capable(CAP_SYS_ADMIN) &&
2631                !capable(CAP_SYS_RAWIO))
2632                return -EPERM;
2633
2634        /* check args */
2635        fmt = format_by_fourcc(fb->fmt.pixelformat);
2636        if (NULL == fmt)
2637                return -EINVAL;
2638        if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2639                return -EINVAL;
2640
2641        retval = -EINVAL;
2642        if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2643                __s32 width = fb->fmt.width;
2644                __s32 height = fb->fmt.height;
2645
2646                retval = limit_scaled_size_lock(fh, &width, &height,
2647                                           V4L2_FIELD_INTERLACED,
2648                                           /* width_mask */ ~3,
2649                                           /* width_bias */ 2,
2650                                           /* adjust_size */ 0,
2651                                           /* adjust_crop */ 0);
2652                if (0 != retval)
2653                        return retval;
2654        }
2655
2656        /* ok, accept it */
2657        btv->fbuf.base       = fb->base;
2658        btv->fbuf.fmt.width  = fb->fmt.width;
2659        btv->fbuf.fmt.height = fb->fmt.height;
2660        if (0 != fb->fmt.bytesperline)
2661                btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2662        else
2663                btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2664
2665        retval = 0;
2666        fh->ovfmt = fmt;
2667        btv->init.ovfmt = fmt;
2668        if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2669                fh->ov.w.left   = 0;
2670                fh->ov.w.top    = 0;
2671                fh->ov.w.width  = fb->fmt.width;
2672                fh->ov.w.height = fb->fmt.height;
2673                btv->init.ov.w.width  = fb->fmt.width;
2674                btv->init.ov.w.height = fb->fmt.height;
2675                        kfree(fh->ov.clips);
2676                fh->ov.clips = NULL;
2677                fh->ov.nclips = 0;
2678
2679                if (check_btres(fh, RESOURCE_OVERLAY)) {
2680                        struct bttv_buffer *new;
2681
2682                        new = videobuf_sg_alloc(sizeof(*new));
2683                        new->crop = btv->crop[!!fh->do_crop].rect;
2684                        bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2685                        retval = bttv_switch_overlay(btv, fh, new);
2686                }
2687        }
2688        return retval;
2689}
2690
2691static int bttv_reqbufs(struct file *file, void *priv,
2692                                struct v4l2_requestbuffers *p)
2693{
2694        struct bttv_fh *fh = priv;
2695        return videobuf_reqbufs(bttv_queue(fh), p);
2696}
2697
2698static int bttv_querybuf(struct file *file, void *priv,
2699                                struct v4l2_buffer *b)
2700{
2701        struct bttv_fh *fh = priv;
2702        return videobuf_querybuf(bttv_queue(fh), b);
2703}
2704
2705static int bttv_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2706{
2707        struct bttv_fh *fh = priv;
2708        struct bttv *btv = fh->btv;
2709        int res = bttv_resource(fh);
2710
2711        if (!check_alloc_btres_lock(btv, fh, res))
2712                return -EBUSY;
2713
2714        return videobuf_qbuf(bttv_queue(fh), b);
2715}
2716
2717static int bttv_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2718{
2719        struct bttv_fh *fh = priv;
2720        return videobuf_dqbuf(bttv_queue(fh), b,
2721                        file->f_flags & O_NONBLOCK);
2722}
2723
2724static int bttv_streamon(struct file *file, void *priv,
2725                                        enum v4l2_buf_type type)
2726{
2727        struct bttv_fh *fh = priv;
2728        struct bttv *btv = fh->btv;
2729        int res = bttv_resource(fh);
2730
2731        if (!check_alloc_btres_lock(btv, fh, res))
2732                return -EBUSY;
2733        return videobuf_streamon(bttv_queue(fh));
2734}
2735
2736
2737static int bttv_streamoff(struct file *file, void *priv,
2738                                        enum v4l2_buf_type type)
2739{
2740        struct bttv_fh *fh = priv;
2741        struct bttv *btv = fh->btv;
2742        int retval;
2743        int res = bttv_resource(fh);
2744
2745
2746        retval = videobuf_streamoff(bttv_queue(fh));
2747        if (retval < 0)
2748                return retval;
2749        free_btres_lock(btv, fh, res);
2750        return 0;
2751}
2752
2753static int bttv_g_parm(struct file *file, void *f,
2754                                struct v4l2_streamparm *parm)
2755{
2756        struct bttv_fh *fh = f;
2757        struct bttv *btv = fh->btv;
2758
2759        if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2760                return -EINVAL;
2761        parm->parm.capture.readbuffers = gbuffers;
2762        v4l2_video_std_frame_period(bttv_tvnorms[btv->tvnorm].v4l2_id,
2763                                    &parm->parm.capture.timeperframe);
2764
2765        return 0;
2766}
2767
2768static int bttv_g_tuner(struct file *file, void *priv,
2769                                struct v4l2_tuner *t)
2770{
2771        struct bttv_fh *fh = priv;
2772        struct bttv *btv = fh->btv;
2773
2774        if (0 != t->index)
2775                return -EINVAL;
2776
2777        t->rxsubchans = V4L2_TUNER_SUB_MONO;
2778        t->capability = V4L2_TUNER_CAP_NORM;
2779        bttv_call_all(btv, tuner, g_tuner, t);
2780        strcpy(t->name, "Television");
2781        t->type       = V4L2_TUNER_ANALOG_TV;
2782        if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
2783                t->signal = 0xffff;
2784
2785        if (btv->audio_mode_gpio)
2786                btv->audio_mode_gpio(btv, t, 0);
2787
2788        return 0;
2789}
2790
2791static int bttv_cropcap(struct file *file, void *priv,
2792                                struct v4l2_cropcap *cap)
2793{
2794        struct bttv_fh *fh = priv;
2795        struct bttv *btv = fh->btv;
2796
2797        if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2798            cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2799                return -EINVAL;
2800
2801        *cap = bttv_tvnorms[btv->tvnorm].cropcap;
2802
2803        return 0;
2804}
2805
2806static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
2807{
2808        struct bttv_fh *fh = f;
2809        struct bttv *btv = fh->btv;
2810
2811        if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2812            crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2813                return -EINVAL;
2814
2815        /* No fh->do_crop = 1; because btv->crop[1] may be
2816           inconsistent with fh->width or fh->height and apps
2817           do not expect a change here. */
2818
2819        crop->c = btv->crop[!!fh->do_crop].rect;
2820
2821        return 0;
2822}
2823
2824static int bttv_s_crop(struct file *file, void *f, const struct v4l2_crop *crop)
2825{
2826        struct bttv_fh *fh = f;
2827        struct bttv *btv = fh->btv;
2828        const struct v4l2_rect *b;
2829        int retval;
2830        struct bttv_crop c;
2831        __s32 b_left;
2832        __s32 b_top;
2833        __s32 b_right;
2834        __s32 b_bottom;
2835
2836        if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2837            crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2838                return -EINVAL;
2839
2840        /* Make sure tvnorm, vbi_end and the current cropping
2841           parameters remain consistent until we're done. Note
2842           read() may change vbi_end in check_alloc_btres_lock(). */
2843        retval = -EBUSY;
2844
2845        if (locked_btres(fh->btv, VIDEO_RESOURCES)) {
2846                return retval;
2847        }
2848
2849        b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2850
2851        b_left = b->left;
2852        b_right = b_left + b->width;
2853        b_bottom = b->top + b->height;
2854
2855        b_top = max(b->top, btv->vbi_end);
2856        if (b_top + 32 >= b_bottom) {
2857                return retval;
2858        }
2859
2860        /* Min. scaled size 48 x 32. */
2861        c.rect.left = clamp_t(s32, crop->c.left, b_left, b_right - 48);
2862        c.rect.left = min(c.rect.left, (__s32) MAX_HDELAY);
2863
2864        c.rect.width = clamp_t(s32, crop->c.width,
2865                             48, b_right - c.rect.left);
2866
2867        c.rect.top = clamp_t(s32, crop->c.top, b_top, b_bottom - 32);
2868        /* Top and height must be a multiple of two. */
2869        c.rect.top = (c.rect.top + 1) & ~1;
2870
2871        c.rect.height = clamp_t(s32, crop->c.height,
2872                              32, b_bottom - c.rect.top);
2873        c.rect.height = (c.rect.height + 1) & ~1;
2874
2875        bttv_crop_calc_limits(&c);
2876
2877        btv->crop[1] = c;
2878
2879        fh->do_crop = 1;
2880
2881        if (fh->width < c.min_scaled_width) {
2882                fh->width = c.min_scaled_width;
2883                btv->init.width = c.min_scaled_width;
2884        } else if (fh->width > c.max_scaled_width) {
2885                fh->width = c.max_scaled_width;
2886                btv->init.width = c.max_scaled_width;
2887        }
2888
2889        if (fh->height < c.min_scaled_height) {
2890                fh->height = c.min_scaled_height;
2891                btv->init.height = c.min_scaled_height;
2892        } else if (fh->height > c.max_scaled_height) {
2893                fh->height = c.max_scaled_height;
2894                btv->init.height = c.max_scaled_height;
2895        }
2896
2897        return 0;
2898}
2899
2900static ssize_t bttv_read(struct file *file, char __user *data,
2901                         size_t count, loff_t *ppos)
2902{
2903        struct bttv_fh *fh = file->private_data;
2904        int retval = 0;
2905
2906        if (fh->btv->errors)
2907                bttv_reinit_bt848(fh->btv);
2908        dprintk("%d: read count=%d type=%s\n",
2909                fh->btv->c.nr, (int)count, v4l2_type_names[fh->type]);
2910
2911        switch (fh->type) {
2912        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2913                if (!check_alloc_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ)) {
2914                        /* VIDEO_READ in use by another fh,
2915                           or VIDEO_STREAM by any fh. */
2916                        return -EBUSY;
2917                }
2918                retval = videobuf_read_one(&fh->cap, data, count, ppos,
2919                                           file->f_flags & O_NONBLOCK);
2920                free_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ);
2921                break;
2922        case V4L2_BUF_TYPE_VBI_CAPTURE:
2923                if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
2924                        return -EBUSY;
2925                retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
2926                                              file->f_flags & O_NONBLOCK);
2927                break;
2928        default:
2929                BUG();
2930        }
2931        return retval;
2932}
2933
2934static unsigned int bttv_poll(struct file *file, poll_table *wait)
2935{
2936        struct bttv_fh *fh = file->private_data;
2937        struct bttv_buffer *buf;
2938        enum v4l2_field field;
2939        unsigned int rc = 0;
2940        unsigned long req_events = poll_requested_events(wait);
2941
2942        if (v4l2_event_pending(&fh->fh))
2943                rc = POLLPRI;
2944        else if (req_events & POLLPRI)
2945                poll_wait(file, &fh->fh.wait, wait);
2946
2947        if (!(req_events & (POLLIN | POLLRDNORM)))
2948                return rc;
2949
2950        if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2951                if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
2952                        return rc | POLLERR;
2953                return rc | videobuf_poll_stream(file, &fh->vbi, wait);
2954        }
2955
2956        if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
2957                /* streaming capture */
2958                if (list_empty(&fh->cap.stream))
2959                        return rc | POLLERR;
2960                buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
2961        } else {
2962                /* read() capture */
2963                if (NULL == fh->cap.read_buf) {
2964                        /* need to capture a new frame */
2965                        if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM))
2966                                return rc | POLLERR;
2967                        fh->cap.read_buf = videobuf_sg_alloc(fh->cap.msize);
2968                        if (NULL == fh->cap.read_buf)
2969                                return rc | POLLERR;
2970                        fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
2971                        field = videobuf_next_field(&fh->cap);
2972                        if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
2973                                kfree (fh->cap.read_buf);
2974                                fh->cap.read_buf = NULL;
2975                                return rc | POLLERR;
2976                        }
2977                        fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
2978                        fh->cap.read_off = 0;
2979                }
2980                buf = (struct bttv_buffer*)fh->cap.read_buf;
2981        }
2982
2983        poll_wait(file, &buf->vb.done, wait);
2984        if (buf->vb.state == VIDEOBUF_DONE ||
2985            buf->vb.state == VIDEOBUF_ERROR)
2986                rc = rc | POLLIN|POLLRDNORM;
2987        return rc;
2988}
2989
2990static int bttv_open(struct file *file)
2991{
2992        struct video_device *vdev = video_devdata(file);
2993        struct bttv *btv = video_drvdata(file);
2994        struct bttv_fh *fh;
2995        enum v4l2_buf_type type = 0;
2996
2997        dprintk("open dev=%s\n", video_device_node_name(vdev));
2998
2999        if (vdev->vfl_type == VFL_TYPE_GRABBER) {
3000                type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3001        } else if (vdev->vfl_type == VFL_TYPE_VBI) {
3002                type = V4L2_BUF_TYPE_VBI_CAPTURE;
3003        } else {
3004                WARN_ON(1);
3005                return -ENODEV;
3006        }
3007
3008        dprintk("%d: open called (type=%s)\n",
3009                btv->c.nr, v4l2_type_names[type]);
3010
3011        /* allocate per filehandle data */
3012        fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3013        if (unlikely(!fh))
3014                return -ENOMEM;
3015        btv->users++;
3016        file->private_data = fh;
3017
3018        *fh = btv->init;
3019        v4l2_fh_init(&fh->fh, vdev);
3020
3021        fh->type = type;
3022        fh->ov.setup_ok = 0;
3023
3024        videobuf_queue_sg_init(&fh->cap, &bttv_video_qops,
3025                            &btv->c.pci->dev, &btv->s_lock,
3026                            V4L2_BUF_TYPE_VIDEO_CAPTURE,
3027                            V4L2_FIELD_INTERLACED,
3028                            sizeof(struct bttv_buffer),
3029                            fh, &btv->lock);
3030        videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops,
3031                            &btv->c.pci->dev, &btv->s_lock,
3032                            V4L2_BUF_TYPE_VBI_CAPTURE,
3033                            V4L2_FIELD_SEQ_TB,
3034                            sizeof(struct bttv_buffer),
3035                            fh, &btv->lock);
3036        set_tvnorm(btv,btv->tvnorm);
3037        set_input(btv, btv->input, btv->tvnorm);
3038        audio_mute(btv, btv->mute);
3039
3040        /* The V4L2 spec requires one global set of cropping parameters
3041           which only change on request. These are stored in btv->crop[1].
3042           However for compatibility with V4L apps and cropping unaware
3043           V4L2 apps we now reset the cropping parameters as seen through
3044           this fh, which is to say VIDIOC_G_CROP and scaling limit checks
3045           will use btv->crop[0], the default cropping parameters for the
3046           current video standard, and VIDIOC_S_FMT will not implicitely
3047           change the cropping parameters until VIDIOC_S_CROP has been
3048           called. */
3049        fh->do_crop = !reset_crop; /* module parameter */
3050
3051        /* Likewise there should be one global set of VBI capture
3052           parameters, but for compatibility with V4L apps and earlier
3053           driver versions each fh has its own parameters. */
3054        bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
3055
3056        bttv_field_count(btv);
3057        v4l2_fh_add(&fh->fh);
3058        return 0;
3059}
3060
3061static int bttv_release(struct file *file)
3062{
3063        struct bttv_fh *fh = file->private_data;
3064        struct bttv *btv = fh->btv;
3065
3066        /* turn off overlay */
3067        if (check_btres(fh, RESOURCE_OVERLAY))
3068                bttv_switch_overlay(btv,fh,NULL);
3069
3070        /* stop video capture */
3071        if (check_btres(fh, RESOURCE_VIDEO_STREAM)) {
3072                videobuf_streamoff(&fh->cap);
3073                free_btres_lock(btv,fh,RESOURCE_VIDEO_STREAM);
3074        }
3075        if (fh->cap.read_buf) {
3076                buffer_release(&fh->cap,fh->cap.read_buf);
3077                kfree(fh->cap.read_buf);
3078        }
3079        if (check_btres(fh, RESOURCE_VIDEO_READ)) {
3080                free_btres_lock(btv, fh, RESOURCE_VIDEO_READ);
3081        }
3082
3083        /* stop vbi capture */
3084        if (check_btres(fh, RESOURCE_VBI)) {
3085                videobuf_stop(&fh->vbi);
3086                free_btres_lock(btv,fh,RESOURCE_VBI);
3087        }
3088
3089        /* free stuff */
3090
3091        videobuf_mmap_free(&fh->cap);
3092        videobuf_mmap_free(&fh->vbi);
3093        file->private_data = NULL;
3094
3095        btv->users--;
3096        bttv_field_count(btv);
3097
3098        if (!btv->users)
3099                audio_mute(btv, btv->mute);
3100
3101        v4l2_fh_del(&fh->fh);
3102        v4l2_fh_exit(&fh->fh);
3103        kfree(fh);
3104        return 0;
3105}
3106
3107static int
3108bttv_mmap(struct file *file, struct vm_area_struct *vma)
3109{
3110        struct bttv_fh *fh = file->private_data;
3111
3112        dprintk("%d: mmap type=%s 0x%lx+%ld\n",
3113                fh->btv->c.nr, v4l2_type_names[fh->type],
3114                vma->vm_start, vma->vm_end - vma->vm_start);
3115        return videobuf_mmap_mapper(bttv_queue(fh),vma);
3116}
3117
3118static const struct v4l2_file_operations bttv_fops =
3119{
3120        .owner            = THIS_MODULE,
3121        .open             = bttv_open,
3122        .release          = bttv_release,
3123        .unlocked_ioctl   = video_ioctl2,
3124        .read             = bttv_read,
3125        .mmap             = bttv_mmap,
3126        .poll             = bttv_poll,
3127};
3128
3129static const struct v4l2_ioctl_ops bttv_ioctl_ops = {
3130        .vidioc_querycap                = bttv_querycap,
3131        .vidioc_enum_fmt_vid_cap        = bttv_enum_fmt_vid_cap,
3132        .vidioc_g_fmt_vid_cap           = bttv_g_fmt_vid_cap,
3133        .vidioc_try_fmt_vid_cap         = bttv_try_fmt_vid_cap,
3134        .vidioc_s_fmt_vid_cap           = bttv_s_fmt_vid_cap,
3135        .vidioc_enum_fmt_vid_overlay    = bttv_enum_fmt_vid_overlay,
3136        .vidioc_g_fmt_vid_overlay       = bttv_g_fmt_vid_overlay,
3137        .vidioc_try_fmt_vid_overlay     = bttv_try_fmt_vid_overlay,
3138        .vidioc_s_fmt_vid_overlay       = bttv_s_fmt_vid_overlay,
3139        .vidioc_g_fmt_vbi_cap           = bttv_g_fmt_vbi_cap,
3140        .vidioc_try_fmt_vbi_cap         = bttv_try_fmt_vbi_cap,
3141        .vidioc_s_fmt_vbi_cap           = bttv_s_fmt_vbi_cap,
3142        .vidioc_cropcap                 = bttv_cropcap,
3143        .vidioc_reqbufs                 = bttv_reqbufs,
3144        .vidioc_querybuf                = bttv_querybuf,
3145        .vidioc_qbuf                    = bttv_qbuf,
3146        .vidioc_dqbuf                   = bttv_dqbuf,
3147        .vidioc_s_std                   = bttv_s_std,
3148        .vidioc_g_std                   = bttv_g_std,
3149        .vidioc_enum_input              = bttv_enum_input,
3150        .vidioc_g_input                 = bttv_g_input,
3151        .vidioc_s_input                 = bttv_s_input,
3152        .vidioc_streamon                = bttv_streamon,
3153        .vidioc_streamoff               = bttv_streamoff,
3154        .vidioc_g_tuner                 = bttv_g_tuner,
3155        .vidioc_s_tuner                 = bttv_s_tuner,
3156        .vidioc_g_crop                  = bttv_g_crop,
3157        .vidioc_s_crop                  = bttv_s_crop,
3158        .vidioc_g_fbuf                  = bttv_g_fbuf,
3159        .vidioc_s_fbuf                  = bttv_s_fbuf,
3160        .vidioc_overlay                 = bttv_overlay,
3161        .vidioc_g_parm                  = bttv_g_parm,
3162        .vidioc_g_frequency             = bttv_g_frequency,
3163        .vidioc_s_frequency             = bttv_s_frequency,
3164        .vidioc_log_status              = bttv_log_status,
3165        .vidioc_querystd                = bttv_querystd,
3166        .vidioc_subscribe_event         = v4l2_ctrl_subscribe_event,
3167        .vidioc_unsubscribe_event       = v4l2_event_unsubscribe,
3168#ifdef CONFIG_VIDEO_ADV_DEBUG
3169        .vidioc_g_register              = bttv_g_register,
3170        .vidioc_s_register              = bttv_s_register,
3171#endif
3172};
3173
3174static struct video_device bttv_video_template = {
3175        .fops         = &bttv_fops,
3176        .ioctl_ops    = &bttv_ioctl_ops,
3177        .tvnorms      = BTTV_NORMS,
3178};
3179
3180/* ----------------------------------------------------------------------- */
3181/* radio interface                                                         */
3182
3183static int radio_open(struct file *file)
3184{
3185        struct video_device *vdev = video_devdata(file);
3186        struct bttv *btv = video_drvdata(file);
3187        struct bttv_fh *fh;
3188
3189        dprintk("open dev=%s\n", video_device_node_name(vdev));
3190
3191        dprintk("%d: open called (radio)\n", btv->c.nr);
3192
3193        /* allocate per filehandle data */
3194        fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3195        if (unlikely(!fh))
3196                return -ENOMEM;
3197        file->private_data = fh;
3198        *fh = btv->init;
3199        v4l2_fh_init(&fh->fh, vdev);
3200
3201        btv->radio_user++;
3202        audio_mute(btv, btv->mute);
3203
3204        v4l2_fh_add(&fh->fh);
3205
3206        return 0;
3207}
3208
3209static int radio_release(struct file *file)
3210{
3211        struct bttv_fh *fh = file->private_data;
3212        struct bttv *btv = fh->btv;
3213        struct saa6588_command cmd;
3214
3215        file->private_data = NULL;
3216        v4l2_fh_del(&fh->fh);
3217        v4l2_fh_exit(&fh->fh);
3218        kfree(fh);
3219
3220        btv->radio_user--;
3221
3222        bttv_call_all(btv, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
3223
3224        if (btv->radio_user == 0)
3225                btv->has_radio_tuner = 0;
3226        return 0;
3227}
3228
3229static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
3230{
3231        struct bttv_fh *fh = priv;
3232        struct bttv *btv = fh->btv;
3233
3234        if (0 != t->index)
3235                return -EINVAL;
3236        strcpy(t->name, "Radio");
3237        t->type = V4L2_TUNER_RADIO;
3238        radio_enable(btv);
3239
3240        bttv_call_all(btv, tuner, g_tuner, t);
3241
3242        if (btv->audio_mode_gpio)
3243                btv->audio_mode_gpio(btv, t, 0);
3244
3245        return 0;
3246}
3247
3248static int radio_s_tuner(struct file *file, void *priv,
3249                                        const struct v4l2_tuner *t)
3250{
3251        struct bttv_fh *fh = priv;
3252        struct bttv *btv = fh->btv;
3253
3254        if (0 != t->index)
3255                return -EINVAL;
3256
3257        radio_enable(btv);
3258        bttv_call_all(btv, tuner, s_tuner, t);
3259        return 0;
3260}
3261
3262static ssize_t radio_read(struct file *file, char __user *data,
3263                         size_t count, loff_t *ppos)
3264{
3265        struct bttv_fh *fh = file->private_data;
3266        struct bttv *btv = fh->btv;
3267        struct saa6588_command cmd;
3268
3269        cmd.block_count = count / 3;
3270        cmd.nonblocking = file->f_flags & O_NONBLOCK;
3271        cmd.buffer = data;
3272        cmd.instance = file;
3273        cmd.result = -ENODEV;
3274        radio_enable(btv);
3275
3276        bttv_call_all(btv, core, ioctl, SAA6588_CMD_READ, &cmd);
3277
3278        return cmd.result;
3279}
3280
3281static unsigned int radio_poll(struct file *file, poll_table *wait)
3282{
3283        struct bttv_fh *fh = file->private_data;
3284        struct bttv *btv = fh->btv;
3285        unsigned long req_events = poll_requested_events(wait);
3286        struct saa6588_command cmd;
3287        unsigned int res = 0;
3288
3289        if (v4l2_event_pending(&fh->fh))
3290                res = POLLPRI;
3291        else if (req_events & POLLPRI)
3292                poll_wait(file, &fh->fh.wait, wait);
3293        radio_enable(btv);
3294        cmd.instance = file;
3295        cmd.event_list = wait;
3296        cmd.result = res;
3297        bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd);
3298
3299        return cmd.result;
3300}
3301
3302static const struct v4l2_file_operations radio_fops =
3303{
3304        .owner    = THIS_MODULE,
3305        .open     = radio_open,
3306        .read     = radio_read,
3307        .release  = radio_release,
3308        .unlocked_ioctl = video_ioctl2,
3309        .poll     = radio_poll,
3310};
3311
3312static const struct v4l2_ioctl_ops radio_ioctl_ops = {
3313        .vidioc_querycap        = bttv_querycap,
3314        .vidioc_log_status      = bttv_log_status,
3315        .vidioc_g_tuner         = radio_g_tuner,
3316        .vidioc_s_tuner         = radio_s_tuner,
3317        .vidioc_g_frequency     = bttv_g_frequency,
3318        .vidioc_s_frequency     = bttv_s_frequency,
3319        .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
3320        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
3321};
3322
3323static struct video_device radio_template = {
3324        .fops      = &radio_fops,
3325        .ioctl_ops = &radio_ioctl_ops,
3326};
3327
3328/* ----------------------------------------------------------------------- */
3329/* some debug code                                                         */
3330
3331static int bttv_risc_decode(u32 risc)
3332{
3333        static char *instr[16] = {
3334                [ BT848_RISC_WRITE     >> 28 ] = "write",
3335                [ BT848_RISC_SKIP      >> 28 ] = "skip",
3336                [ BT848_RISC_WRITEC    >> 28 ] = "writec",
3337                [ BT848_RISC_JUMP      >> 28 ] = "jump",
3338                [ BT848_RISC_SYNC      >> 28 ] = "sync",
3339                [ BT848_RISC_WRITE123  >> 28 ] = "write123",
3340                [ BT848_RISC_SKIP123   >> 28 ] = "skip123",
3341                [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3342        };
3343        static int incr[16] = {
3344                [ BT848_RISC_WRITE     >> 28 ] = 2,
3345                [ BT848_RISC_JUMP      >> 28 ] = 2,
3346                [ BT848_RISC_SYNC      >> 28 ] = 2,
3347                [ BT848_RISC_WRITE123  >> 28 ] = 5,
3348                [ BT848_RISC_SKIP123   >> 28 ] = 2,
3349                [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3350        };
3351        static char *bits[] = {
3352                "be0",  "be1",  "be2",  "be3/resync",
3353                "set0", "set1", "set2", "set3",
3354                "clr0", "clr1", "clr2", "clr3",
3355                "irq",  "res",  "eol",  "sol",
3356        };
3357        int i;
3358
3359        pr_cont("0x%08x [ %s", risc,
3360               instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3361        for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3362                if (risc & (1 << (i + 12)))
3363                        pr_cont(" %s", bits[i]);
3364        pr_cont(" count=%d ]\n", risc & 0xfff);
3365        return incr[risc >> 28] ? incr[risc >> 28] : 1;
3366}
3367
3368static void bttv_risc_disasm(struct bttv *btv,
3369                             struct btcx_riscmem *risc)
3370{
3371        unsigned int i,j,n;
3372
3373        pr_info("%s: risc disasm: %p [dma=0x%08lx]\n",
3374                btv->c.v4l2_dev.name, risc->cpu, (unsigned long)risc->dma);
3375        for (i = 0; i < (risc->size >> 2); i += n) {
3376                pr_info("%s:   0x%lx: ",
3377                        btv->c.v4l2_dev.name,
3378                        (unsigned long)(risc->dma + (i<<2)));
3379                n = bttv_risc_decode(le32_to_cpu(risc->cpu[i]));
3380                for (j = 1; j < n; j++)
3381                        pr_info("%s:   0x%lx: 0x%08x [ arg #%d ]\n",
3382                                btv->c.v4l2_dev.name,
3383                                (unsigned long)(risc->dma + ((i+j)<<2)),
3384                                risc->cpu[i+j], j);
3385                if (0 == risc->cpu[i])
3386                        break;
3387        }
3388}
3389
3390static void bttv_print_riscaddr(struct bttv *btv)
3391{
3392        pr_info("  main: %08llx\n", (unsigned long long)btv->main.dma);
3393        pr_info("  vbi : o=%08llx e=%08llx\n",
3394                btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3395                btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3396        pr_info("  cap : o=%08llx e=%08llx\n",
3397                btv->curr.top
3398                ? (unsigned long long)btv->curr.top->top.dma : 0,
3399                btv->curr.bottom
3400                ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3401        pr_info("  scr : o=%08llx e=%08llx\n",
3402                btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3403                btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3404        bttv_risc_disasm(btv, &btv->main);
3405}
3406
3407/* ----------------------------------------------------------------------- */
3408/* irq handler                                                             */
3409
3410static char *irq_name[] = {
3411        "FMTCHG",  // format change detected (525 vs. 625)
3412        "VSYNC",   // vertical sync (new field)
3413        "HSYNC",   // horizontal sync
3414        "OFLOW",   // chroma/luma AGC overflow
3415        "HLOCK",   // horizontal lock changed
3416        "VPRES",   // video presence changed
3417        "6", "7",
3418        "I2CDONE", // hw irc operation finished
3419        "GPINT",   // gpio port triggered irq
3420        "10",
3421        "RISCI",   // risc instruction triggered irq
3422        "FBUS",    // pixel data fifo dropped data (high pci bus latencies)
3423        "FTRGT",   // pixel data fifo overrun
3424        "FDSR",    // fifo data stream resyncronisation
3425        "PPERR",   // parity error (data transfer)
3426        "RIPERR",  // parity error (read risc instructions)
3427        "PABORT",  // pci abort
3428        "OCERR",   // risc instruction error
3429        "SCERR",   // syncronisation error
3430};
3431
3432static void bttv_print_irqbits(u32 print, u32 mark)
3433{
3434        unsigned int i;
3435
3436        pr_cont("bits:");
3437        for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3438                if (print & (1 << i))
3439                        pr_cont(" %s", irq_name[i]);
3440                if (mark & (1 << i))
3441                        pr_cont("*");
3442        }
3443}
3444
3445static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3446{
3447        pr_warn("%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3448                btv->c.nr,
3449                (unsigned long)btv->main.dma,
3450                (unsigned long)le32_to_cpu(btv->main.cpu[RISC_SLOT_O_VBI+1]),
3451                (unsigned long)le32_to_cpu(btv->main.cpu[RISC_SLOT_O_FIELD+1]),
3452                (unsigned long)rc);
3453
3454        if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3455                pr_notice("%d: Oh, there (temporarily?) is no input signal. "
3456                          "Ok, then this is harmless, don't worry ;)\n",
3457                          btv->c.nr);
3458                return;
3459        }
3460        pr_notice("%d: Uhm. Looks like we have unusual high IRQ latencies\n",
3461                  btv->c.nr);
3462        pr_notice("%d: Lets try to catch the culpit red-handed ...\n",
3463                  btv->c.nr);
3464        dump_stack();
3465}
3466
3467static int
3468bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3469{
3470        struct bttv_buffer *item;
3471
3472        memset(set,0,sizeof(*set));
3473
3474        /* capture request ? */
3475        if (!list_empty(&btv->capture)) {
3476                set->frame_irq = 1;
3477                item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3478                if (V4L2_FIELD_HAS_TOP(item->vb.field))
3479                        set->top    = item;
3480                if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3481                        set->bottom = item;
3482
3483                /* capture request for other field ? */
3484                if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3485                    (item->vb.queue.next != &btv->capture)) {
3486                        item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3487                        /* Mike Isely <isely@pobox.com> - Only check
3488                         * and set up the bottom field in the logic
3489                         * below.  Don't ever do the top field.  This
3490                         * of course means that if we set up the
3491                         * bottom field in the above code that we'll
3492                         * actually skip a field.  But that's OK.
3493                         * Having processed only a single buffer this
3494                         * time, then the next time around the first
3495                         * available buffer should be for a top field.
3496                         * That will then cause us here to set up a
3497                         * top then a bottom field in the normal way.
3498                         * The alternative to this understanding is
3499                         * that we set up the second available buffer
3500                         * as a top field, but that's out of order
3501                         * since this driver always processes the top
3502                         * field first - the effect will be the two
3503                         * buffers being returned in the wrong order,
3504                         * with the second buffer also being delayed
3505                         * by one field time (owing to the fifo nature
3506                         * of videobuf).  Worse still, we'll be stuck
3507                         * doing fields out of order now every time
3508                         * until something else causes a field to be
3509                         * dropped.  By effectively forcing a field to
3510                         * drop this way then we always get back into
3511                         * sync within a single frame time.  (Out of
3512                         * order fields can screw up deinterlacing
3513                         * algorithms.) */
3514                        if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3515                                if (NULL == set->bottom &&
3516                                    V4L2_FIELD_BOTTOM == item->vb.field) {
3517                                        set->bottom = item;
3518                                }
3519                                if (NULL != set->top  &&  NULL != set->bottom)
3520                                        set->top_irq = 2;
3521                        }
3522                }
3523        }
3524
3525        /* screen overlay ? */
3526        if (NULL != btv->screen) {
3527                if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3528                        if (NULL == set->top && NULL == set->bottom) {
3529                                set->top    = btv->screen;
3530                                set->bottom = btv->screen;
3531                        }
3532                } else {
3533                        if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3534                            NULL == set->top) {
3535                                set->top = btv->screen;
3536                        }
3537                        if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3538                            NULL == set->bottom) {
3539                                set->bottom = btv->screen;
3540                        }
3541                }
3542        }
3543
3544        dprintk("%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3545                btv->c.nr, set->top, set->bottom,
3546                btv->screen, set->frame_irq, set->top_irq);
3547        return 0;
3548}
3549
3550static void
3551bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3552                      struct bttv_buffer_set *curr, unsigned int state)
3553{
3554        struct timeval ts;
3555
3556        v4l2_get_timestamp(&ts);
3557
3558        if (wakeup->top == wakeup->bottom) {
3559                if (NULL != wakeup->top && curr->top != wakeup->top) {
3560                        if (irq_debug > 1)
3561                                pr_debug("%d: wakeup: both=%p\n",
3562                                         btv->c.nr, wakeup->top);
3563                        wakeup->top->vb.ts = ts;
3564                        wakeup->top->vb.field_count = btv->field_count;
3565                        wakeup->top->vb.state = state;
3566                        wake_up(&wakeup->top->vb.done);
3567                }
3568        } else {
3569                if (NULL != wakeup->top && curr->top != wakeup->top) {
3570                        if (irq_debug > 1)
3571                                pr_debug("%d: wakeup: top=%p\n",
3572                                         btv->c.nr, wakeup->top);
3573                        wakeup->top->vb.ts = ts;
3574                        wakeup->top->vb.field_count = btv->field_count;
3575                        wakeup->top->vb.state = state;
3576                        wake_up(&wakeup->top->vb.done);
3577                }
3578                if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3579                        if (irq_debug > 1)
3580                                pr_debug("%d: wakeup: bottom=%p\n",
3581                                         btv->c.nr, wakeup->bottom);
3582                        wakeup->bottom->vb.ts = ts;
3583                        wakeup->bottom->vb.field_count = btv->field_count;
3584                        wakeup->bottom->vb.state = state;
3585                        wake_up(&wakeup->bottom->vb.done);
3586                }
3587        }
3588}
3589
3590static void
3591bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3592                    unsigned int state)
3593{
3594        struct timeval ts;
3595
3596        if (NULL == wakeup)
3597                return;
3598
3599        v4l2_get_timestamp(&ts);
3600        wakeup->vb.ts = ts;
3601        wakeup->vb.field_count = btv->field_count;
3602        wakeup->vb.state = state;
3603        wake_up(&wakeup->vb.done);
3604}
3605
3606static void bttv_irq_timeout(unsigned long data)
3607{
3608        struct bttv *btv = (struct bttv *)data;
3609        struct bttv_buffer_set old,new;
3610        struct bttv_buffer *ovbi;
3611        struct bttv_buffer *item;
3612        unsigned long flags;
3613
3614        if (bttv_verbose) {
3615                pr_info("%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3616                        btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3617                        btread(BT848_RISC_COUNT));
3618                bttv_print_irqbits(btread(BT848_INT_STAT),0);
3619                pr_cont("\n");
3620        }
3621
3622        spin_lock_irqsave(&btv->s_lock,flags);
3623
3624        /* deactivate stuff */
3625        memset(&new,0,sizeof(new));
3626        old  = btv->curr;
3627        ovbi = btv->cvbi;
3628        btv->curr = new;
3629        btv->cvbi = NULL;
3630        btv->loop_irq = 0;
3631        bttv_buffer_activate_video(btv, &new);
3632        bttv_buffer_activate_vbi(btv,   NULL);
3633        bttv_set_dma(btv, 0);
3634
3635        /* wake up */
3636        bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_ERROR);
3637        bttv_irq_wakeup_vbi(btv, ovbi, VIDEOBUF_ERROR);
3638
3639        /* cancel all outstanding capture / vbi requests */
3640        while (!list_empty(&btv->capture)) {
3641                item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3642                list_del(&item->vb.queue);
3643                item->vb.state = VIDEOBUF_ERROR;
3644                wake_up(&item->vb.done);
3645        }
3646        while (!list_empty(&btv->vcapture)) {
3647                item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3648                list_del(&item->vb.queue);
3649                item->vb.state = VIDEOBUF_ERROR;
3650                wake_up(&item->vb.done);
3651        }
3652
3653        btv->errors++;
3654        spin_unlock_irqrestore(&btv->s_lock,flags);
3655}
3656
3657static void
3658bttv_irq_wakeup_top(struct bttv *btv)
3659{
3660        struct bttv_buffer *wakeup = btv->curr.top;
3661
3662        if (NULL == wakeup)
3663                return;
3664
3665        spin_lock(&btv->s_lock);
3666        btv->curr.top_irq = 0;
3667        btv->curr.top = NULL;
3668        bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3669
3670        v4l2_get_timestamp(&wakeup->vb.ts);
3671        wakeup->vb.field_count = btv->field_count;
3672        wakeup->vb.state = VIDEOBUF_DONE;
3673        wake_up(&wakeup->vb.done);
3674        spin_unlock(&btv->s_lock);
3675}
3676
3677static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3678{
3679        if (rc < risc->dma)
3680                return 0;
3681        if (rc > risc->dma + risc->size)
3682                return 0;
3683        return 1;
3684}
3685
3686static void
3687bttv_irq_switch_video(struct bttv *btv)
3688{
3689        struct bttv_buffer_set new;
3690        struct bttv_buffer_set old;
3691        dma_addr_t rc;
3692
3693        spin_lock(&btv->s_lock);
3694
3695        /* new buffer set */
3696        bttv_irq_next_video(btv, &new);
3697        rc = btread(BT848_RISC_COUNT);
3698        if ((btv->curr.top    && is_active(&btv->curr.top->top,       rc)) ||
3699            (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3700                btv->framedrop++;
3701                if (debug_latency)
3702                        bttv_irq_debug_low_latency(btv, rc);
3703                spin_unlock(&btv->s_lock);
3704                return;
3705        }
3706
3707        /* switch over */
3708        old = btv->curr;
3709        btv->curr = new;
3710        btv->loop_irq &= ~1;
3711        bttv_buffer_activate_video(btv, &new);
3712        bttv_set_dma(btv, 0);
3713
3714        /* switch input */
3715        if (UNSET != btv->new_input) {
3716                video_mux(btv,btv->new_input);
3717                btv->new_input = UNSET;
3718        }
3719
3720        /* wake up finished buffers */
3721        bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_DONE);
3722        spin_unlock(&btv->s_lock);
3723}
3724
3725static void
3726bttv_irq_switch_vbi(struct bttv *btv)
3727{
3728        struct bttv_buffer *new = NULL;
3729        struct bttv_buffer *old;
3730        u32 rc;
3731
3732        spin_lock(&btv->s_lock);
3733
3734        if (!list_empty(&btv->vcapture))
3735                new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3736        old = btv->cvbi;
3737
3738        rc = btread(BT848_RISC_COUNT);
3739        if (NULL != old && (is_active(&old->top,    rc) ||
3740                            is_active(&old->bottom, rc))) {
3741                btv->framedrop++;
3742                if (debug_latency)
3743                        bttv_irq_debug_low_latency(btv, rc);
3744                spin_unlock(&btv->s_lock);
3745                return;
3746        }
3747
3748        /* switch */
3749        btv->cvbi = new;
3750        btv->loop_irq &= ~4;
3751        bttv_buffer_activate_vbi(btv, new);
3752        bttv_set_dma(btv, 0);
3753
3754        bttv_irq_wakeup_vbi(btv, old, VIDEOBUF_DONE);
3755        spin_unlock(&btv->s_lock);
3756}
3757
3758static irqreturn_t bttv_irq(int irq, void *dev_id)
3759{
3760        u32 stat,astat;
3761        u32 dstat;
3762        int count;
3763        struct bttv *btv;
3764        int handled = 0;
3765
3766        btv=(struct bttv *)dev_id;
3767
3768        count=0;
3769        while (1) {
3770                /* get/clear interrupt status bits */
3771                stat=btread(BT848_INT_STAT);
3772                astat=stat&btread(BT848_INT_MASK);
3773                if (!astat)
3774                        break;
3775                handled = 1;
3776                btwrite(stat,BT848_INT_STAT);
3777
3778                /* get device status bits */
3779                dstat=btread(BT848_DSTATUS);
3780
3781                if (irq_debug) {
3782                        pr_debug("%d: irq loop=%d fc=%d riscs=%x, riscc=%08x, ",
3783                                 btv->c.nr, count, btv->field_count,
3784                                 stat>>28, btread(BT848_RISC_COUNT));
3785                        bttv_print_irqbits(stat,astat);
3786                        if (stat & BT848_INT_HLOCK)
3787                                pr_cont("   HLOC => %s",
3788                                        dstat & BT848_DSTATUS_HLOC
3789                                        ? "yes" : "no");
3790                        if (stat & BT848_INT_VPRES)
3791                                pr_cont("   PRES => %s",
3792                                        dstat & BT848_DSTATUS_PRES
3793                                        ? "yes" : "no");
3794                        if (stat & BT848_INT_FMTCHG)
3795                                pr_cont("   NUML => %s",
3796                                        dstat & BT848_DSTATUS_NUML
3797                                        ? "625" : "525");
3798                        pr_cont("\n");
3799                }
3800
3801                if (astat&BT848_INT_VSYNC)
3802                        btv->field_count++;
3803
3804                if ((astat & BT848_INT_GPINT) && btv->remote) {
3805                        bttv_input_irq(btv);
3806                }
3807
3808                if (astat & BT848_INT_I2CDONE) {
3809                        btv->i2c_done = stat;
3810                        wake_up(&btv->i2c_queue);
3811                }
3812
3813                if ((astat & BT848_INT_RISCI)  &&  (stat & (4<<28)))
3814                        bttv_irq_switch_vbi(btv);
3815
3816                if ((astat & BT848_INT_RISCI)  &&  (stat & (2<<28)))
3817                        bttv_irq_wakeup_top(btv);
3818
3819                if ((astat & BT848_INT_RISCI)  &&  (stat & (1<<28)))
3820                        bttv_irq_switch_video(btv);
3821
3822                if ((astat & BT848_INT_HLOCK)  &&  btv->opt_automute)
3823                        /* trigger automute */
3824                        audio_mux_gpio(btv, btv->audio_input, btv->mute);
3825
3826                if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
3827                        pr_info("%d: %s%s @ %08x,",
3828                                btv->c.nr,
3829                                (astat & BT848_INT_SCERR) ? "SCERR" : "",
3830                                (astat & BT848_INT_OCERR) ? "OCERR" : "",
3831                                btread(BT848_RISC_COUNT));
3832                        bttv_print_irqbits(stat,astat);
3833                        pr_cont("\n");
3834                        if (bttv_debug)
3835                                bttv_print_riscaddr(btv);
3836                }
3837                if (fdsr && astat & BT848_INT_FDSR) {
3838                        pr_info("%d: FDSR @ %08x\n",
3839                                btv->c.nr, btread(BT848_RISC_COUNT));
3840                        if (bttv_debug)
3841                                bttv_print_riscaddr(btv);
3842                }
3843
3844                count++;
3845                if (count > 4) {
3846
3847                        if (count > 8 || !(astat & BT848_INT_GPINT)) {
3848                                btwrite(0, BT848_INT_MASK);
3849
3850                                pr_err("%d: IRQ lockup, cleared int mask [",
3851                                       btv->c.nr);
3852                        } else {
3853                                pr_err("%d: IRQ lockup, clearing GPINT from int mask [",
3854                                       btv->c.nr);
3855
3856                                btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
3857                                                BT848_INT_MASK);
3858                        }
3859
3860                        bttv_print_irqbits(stat,astat);
3861
3862                        pr_cont("]\n");
3863                }
3864        }
3865        btv->irq_total++;
3866        if (handled)
3867                btv->irq_me++;
3868        return IRQ_RETVAL(handled);
3869}
3870
3871
3872/* ----------------------------------------------------------------------- */
3873/* initialization                                                          */
3874
3875static struct video_device *vdev_init(struct bttv *btv,
3876                                      const struct video_device *template,
3877                                      const char *type_name)
3878{
3879        struct video_device *vfd;
3880
3881        vfd = video_device_alloc();
3882        if (NULL == vfd)
3883                return NULL;
3884        *vfd = *template;
3885        vfd->v4l2_dev = &btv->c.v4l2_dev;
3886        vfd->release = video_device_release;
3887        vfd->debug   = bttv_debug;
3888        video_set_drvdata(vfd, btv);
3889        snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
3890                 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
3891                 type_name, bttv_tvcards[btv->c.type].name);
3892        if (btv->tuner_type == TUNER_ABSENT) {
3893                v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
3894                v4l2_disable_ioctl(vfd, VIDIOC_S_FREQUENCY);
3895                v4l2_disable_ioctl(vfd, VIDIOC_G_TUNER);
3896                v4l2_disable_ioctl(vfd, VIDIOC_S_TUNER);
3897        }
3898        return vfd;
3899}
3900
3901static void bttv_unregister_video(struct bttv *btv)
3902{
3903        if (btv->video_dev) {
3904                if (video_is_registered(btv->video_dev))
3905                        video_unregister_device(btv->video_dev);
3906                else
3907                        video_device_release(btv->video_dev);
3908                btv->video_dev = NULL;
3909        }
3910        if (btv->vbi_dev) {
3911                if (video_is_registered(btv->vbi_dev))
3912                        video_unregister_device(btv->vbi_dev);
3913                else
3914                        video_device_release(btv->vbi_dev);
3915                btv->vbi_dev = NULL;
3916        }
3917        if (btv->radio_dev) {
3918                if (video_is_registered(btv->radio_dev))
3919                        video_unregister_device(btv->radio_dev);
3920                else
3921                        video_device_release(btv->radio_dev);
3922                btv->radio_dev = NULL;
3923        }
3924}
3925
3926/* register video4linux devices */
3927static int bttv_register_video(struct bttv *btv)
3928{
3929        if (no_overlay > 0)
3930                pr_notice("Overlay support disabled\n");
3931
3932        /* video */
3933        btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
3934
3935        if (NULL == btv->video_dev)
3936                goto err;
3937        if (video_register_device(btv->video_dev, VFL_TYPE_GRABBER,
3938                                  video_nr[btv->c.nr]) < 0)
3939                goto err;
3940        pr_info("%d: registered device %s\n",
3941                btv->c.nr, video_device_node_name(btv->video_dev));
3942        if (device_create_file(&btv->video_dev->dev,
3943                                     &dev_attr_card)<0) {
3944                pr_err("%d: device_create_file 'card' failed\n", btv->c.nr);
3945                goto err;
3946        }
3947
3948        /* vbi */
3949        btv->vbi_dev = vdev_init(btv, &bttv_video_template, "vbi");
3950
3951        if (NULL == btv->vbi_dev)
3952                goto err;
3953        if (video_register_device(btv->vbi_dev, VFL_TYPE_VBI,
3954                                  vbi_nr[btv->c.nr]) < 0)
3955                goto err;
3956        pr_info("%d: registered device %s\n",
3957                btv->c.nr, video_device_node_name(btv->vbi_dev));
3958
3959        if (!btv->has_radio)
3960                return 0;
3961        /* radio */
3962        btv->radio_dev = vdev_init(btv, &radio_template, "radio");
3963        if (NULL == btv->radio_dev)
3964                goto err;
3965        btv->radio_dev->ctrl_handler = &btv->radio_ctrl_handler;
3966        if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,
3967                                  radio_nr[btv->c.nr]) < 0)
3968                goto err;
3969        pr_info("%d: registered device %s\n",
3970                btv->c.nr, video_device_node_name(btv->radio_dev));
3971
3972        /* all done */
3973        return 0;
3974
3975 err:
3976        bttv_unregister_video(btv);
3977        return -1;
3978}
3979
3980
3981/* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
3982/* response on cards with no firmware is not enabled by OF */
3983static void pci_set_command(struct pci_dev *dev)
3984{
3985#if defined(__powerpc__)
3986        unsigned int cmd;
3987
3988        pci_read_config_dword(dev, PCI_COMMAND, &cmd);
3989        cmd = (cmd | PCI_COMMAND_MEMORY );
3990        pci_write_config_dword(dev, PCI_COMMAND, cmd);
3991#endif
3992}
3993
3994static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
3995{
3996        struct v4l2_frequency init_freq = {
3997                .tuner = 0,
3998                .type = V4L2_TUNER_ANALOG_TV,
3999                .frequency = 980,
4000        };
4001        int result;
4002        unsigned char lat;
4003        struct bttv *btv;
4004        struct v4l2_ctrl_handler *hdl;
4005
4006        if (bttv_num == BTTV_MAX)
4007                return -ENOMEM;
4008        pr_info("Bt8xx card found (%d)\n", bttv_num);
4009        bttvs[bttv_num] = btv = kzalloc(sizeof(*btv), GFP_KERNEL);
4010        if (btv == NULL) {
4011                pr_err("out of memory\n");
4012                return -ENOMEM;
4013        }
4014        btv->c.nr  = bttv_num;
4015        snprintf(btv->c.v4l2_dev.name, sizeof(btv->c.v4l2_dev.name),
4016                        "bttv%d", btv->c.nr);
4017
4018        /* initialize structs / fill in defaults */
4019        mutex_init(&btv->lock);
4020        spin_lock_init(&btv->s_lock);
4021        spin_lock_init(&btv->gpio_lock);
4022        init_waitqueue_head(&btv->i2c_queue);
4023        INIT_LIST_HEAD(&btv->c.subs);
4024        INIT_LIST_HEAD(&btv->capture);
4025        INIT_LIST_HEAD(&btv->vcapture);
4026
4027        init_timer(&btv->timeout);
4028        btv->timeout.function = bttv_irq_timeout;
4029        btv->timeout.data     = (unsigned long)btv;
4030
4031        btv->i2c_rc = -1;
4032        btv->tuner_type  = UNSET;
4033        btv->new_input   = UNSET;
4034        btv->has_radio=radio[btv->c.nr];
4035
4036        /* pci stuff (init, get irq/mmio, ... */
4037        btv->c.pci = dev;
4038        btv->id  = dev->device;
4039        if (pci_enable_device(dev)) {
4040                pr_warn("%d: Can't enable device\n", btv->c.nr);
4041                return -EIO;
4042        }
4043        if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
4044                pr_warn("%d: No suitable DMA available\n", btv->c.nr);
4045                return -EIO;
4046        }
4047        if (!request_mem_region(pci_resource_start(dev,0),
4048                                pci_resource_len(dev,0),
4049                                btv->c.v4l2_dev.name)) {
4050                pr_warn("%d: can't request iomem (0x%llx)\n",
4051                        btv->c.nr,
4052                        (unsigned long long)pci_resource_start(dev, 0));
4053                return -EBUSY;
4054        }
4055        pci_set_master(dev);
4056        pci_set_command(dev);
4057
4058        result = v4l2_device_register(&dev->dev, &btv->c.v4l2_dev);
4059        if (result < 0) {
4060                pr_warn("%d: v4l2_device_register() failed\n", btv->c.nr);
4061                goto fail0;
4062        }
4063        hdl = &btv->ctrl_handler;
4064        v4l2_ctrl_handler_init(hdl, 20);
4065        btv->c.v4l2_dev.ctrl_handler = hdl;
4066        v4l2_ctrl_handler_init(&btv->radio_ctrl_handler, 6);
4067
4068        btv->revision = dev->revision;
4069        pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
4070        pr_info("%d: Bt%d (rev %d) at %s, irq: %d, latency: %d, mmio: 0x%llx\n",
4071                bttv_num, btv->id, btv->revision, pci_name(dev),
4072                btv->c.pci->irq, lat,
4073                (unsigned long long)pci_resource_start(dev, 0));
4074        schedule();
4075
4076        btv->bt848_mmio = ioremap(pci_resource_start(dev, 0), 0x1000);
4077        if (NULL == btv->bt848_mmio) {
4078                pr_err("%d: ioremap() failed\n", btv->c.nr);
4079                result = -EIO;
4080                goto fail1;
4081        }
4082
4083        /* identify card */
4084        bttv_idcard(btv);
4085
4086        /* disable irqs, register irq handler */
4087        btwrite(0, BT848_INT_MASK);
4088        result = request_irq(btv->c.pci->irq, bttv_irq,
4089            IRQF_SHARED, btv->c.v4l2_dev.name, (void *)btv);
4090        if (result < 0) {
4091                pr_err("%d: can't get IRQ %d\n",
4092                       bttv_num, btv->c.pci->irq);
4093                goto fail1;
4094        }
4095
4096        if (0 != bttv_handle_chipset(btv)) {
4097                result = -EIO;
4098                goto fail2;
4099        }
4100
4101        /* init options from insmod args */
4102        btv->opt_combfilter = combfilter;
4103        bttv_ctrl_combfilter.def = combfilter;
4104        bttv_ctrl_lumafilter.def = lumafilter;
4105        btv->opt_automute   = automute;
4106        bttv_ctrl_automute.def = automute;
4107        bttv_ctrl_agc_crush.def = agc_crush;
4108        btv->opt_vcr_hack   = vcr_hack;
4109        bttv_ctrl_vcr_hack.def = vcr_hack;
4110        bttv_ctrl_whitecrush_upper.def = whitecrush_upper;
4111        bttv_ctrl_whitecrush_lower.def = whitecrush_lower;
4112        btv->opt_uv_ratio   = uv_ratio;
4113        bttv_ctrl_uv_ratio.def = uv_ratio;
4114        bttv_ctrl_full_luma.def = full_luma_range;
4115        bttv_ctrl_coring.def = coring;
4116
4117        /* fill struct bttv with some useful defaults */
4118        btv->init.btv         = btv;
4119        btv->init.ov.w.width  = 320;
4120        btv->init.ov.w.height = 240;
4121        btv->init.fmt         = format_by_fourcc(V4L2_PIX_FMT_BGR24);
4122        btv->init.width       = 320;
4123        btv->init.height      = 240;
4124        btv->init.ov.w.width  = 320;
4125        btv->init.ov.w.height = 240;
4126        btv->init.ov.field    = V4L2_FIELD_INTERLACED;
4127        btv->input = 0;
4128
4129        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4130                        V4L2_CID_BRIGHTNESS, 0, 0xff00, 0x100, 32768);
4131        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4132                        V4L2_CID_CONTRAST, 0, 0xff80, 0x80, 0x6c00);
4133        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4134                        V4L2_CID_SATURATION, 0, 0xff80, 0x80, 32768);
4135        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4136                        V4L2_CID_COLOR_KILLER, 0, 1, 1, 0);
4137        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4138                        V4L2_CID_HUE, 0, 0xff00, 0x100, 32768);
4139        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4140                        V4L2_CID_CHROMA_AGC, 0, 1, 1, !!chroma_agc);
4141        v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4142                V4L2_CID_AUDIO_MUTE, 0, 1, 1, 0);
4143        if (btv->volume_gpio)
4144                v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4145                        V4L2_CID_AUDIO_VOLUME, 0, 0xff00, 0x100, 0xff00);
4146        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_combfilter, NULL);
4147        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_automute, NULL);
4148        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_lumafilter, NULL);
4149        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_agc_crush, NULL);
4150        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_vcr_hack, NULL);
4151        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_whitecrush_lower, NULL);
4152        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_whitecrush_upper, NULL);
4153        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_uv_ratio, NULL);
4154        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_full_luma, NULL);
4155        v4l2_ctrl_new_custom(hdl, &bttv_ctrl_coring, NULL);
4156
4157        /* initialize hardware */
4158        if (bttv_gpio)
4159                bttv_gpio_tracking(btv,"pre-init");
4160
4161        bttv_risc_init_main(btv);
4162        init_bt848(btv);
4163
4164        /* gpio */
4165        btwrite(0x00, BT848_GPIO_REG_INP);
4166        btwrite(0x00, BT848_GPIO_OUT_EN);
4167        if (bttv_verbose)
4168                bttv_gpio_tracking(btv,"init");
4169
4170        /* needs to be done before i2c is registered */
4171        bttv_init_card1(btv);
4172
4173        /* register i2c + gpio */
4174        init_bttv_i2c(btv);
4175
4176        /* some card-specific stuff (needs working i2c) */
4177        bttv_init_card2(btv);
4178        bttv_init_tuner(btv);
4179        if (btv->tuner_type != TUNER_ABSENT) {
4180                bttv_set_frequency(btv, &init_freq);
4181                btv->radio_freq = 90500 * 16; /* 90.5Mhz default */
4182        }
4183        btv->std = V4L2_STD_PAL;
4184        init_irqreg(btv);
4185        if (!bttv_tvcards[btv->c.type].no_video)
4186                v4l2_ctrl_handler_setup(hdl);
4187        if (hdl->error) {
4188                result = hdl->error;
4189                goto fail2;
4190        }
4191        /* mute device */
4192        audio_mute(btv, 1);
4193
4194        /* register video4linux + input */
4195        if (!bttv_tvcards[btv->c.type].no_video) {
4196                v4l2_ctrl_add_handler(&btv->radio_ctrl_handler, hdl,
4197                                v4l2_ctrl_radio_filter);
4198                if (btv->radio_ctrl_handler.error) {
4199                        result = btv->radio_ctrl_handler.error;
4200                        goto fail2;
4201                }
4202                set_input(btv, 0, btv->tvnorm);
4203                bttv_crop_reset(&btv->crop[0], btv->tvnorm);
4204                btv->crop[1] = btv->crop[0]; /* current = default */
4205                disclaim_vbi_lines(btv);
4206                disclaim_video_lines(btv);
4207                bttv_register_video(btv);
4208        }
4209
4210        /* add subdevices and autoload dvb-bt8xx if needed */
4211        if (bttv_tvcards[btv->c.type].has_dvb) {
4212                bttv_sub_add_device(&btv->c, "dvb");
4213                request_modules(btv);
4214        }
4215
4216        if (!disable_ir) {
4217                init_bttv_i2c_ir(btv);
4218                bttv_input_init(btv);
4219        }
4220
4221        /* everything is fine */
4222        bttv_num++;
4223        return 0;
4224
4225fail2:
4226        free_irq(btv->c.pci->irq,btv);
4227
4228fail1:
4229        v4l2_ctrl_handler_free(&btv->ctrl_handler);
4230        v4l2_ctrl_handler_free(&btv->radio_ctrl_handler);
4231        v4l2_device_unregister(&btv->c.v4l2_dev);
4232
4233fail0:
4234        if (btv->bt848_mmio)
4235                iounmap(btv->bt848_mmio);
4236        release_mem_region(pci_resource_start(btv->c.pci,0),
4237                           pci_resource_len(btv->c.pci,0));
4238        return result;
4239}
4240
4241static void bttv_remove(struct pci_dev *pci_dev)
4242{
4243        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4244        struct bttv *btv = to_bttv(v4l2_dev);
4245
4246        if (bttv_verbose)
4247                pr_info("%d: unloading\n", btv->c.nr);
4248
4249        if (bttv_tvcards[btv->c.type].has_dvb)
4250                flush_request_modules(btv);
4251
4252        /* shutdown everything (DMA+IRQs) */
4253        btand(~15, BT848_GPIO_DMA_CTL);
4254        btwrite(0, BT848_INT_MASK);
4255        btwrite(~0x0, BT848_INT_STAT);
4256        btwrite(0x0, BT848_GPIO_OUT_EN);
4257        if (bttv_gpio)
4258                bttv_gpio_tracking(btv,"cleanup");
4259
4260        /* tell gpio modules we are leaving ... */
4261        btv->shutdown=1;
4262        bttv_input_fini(btv);
4263        bttv_sub_del_devices(&btv->c);
4264
4265        /* unregister i2c_bus + input */
4266        fini_bttv_i2c(btv);
4267
4268        /* unregister video4linux */
4269        bttv_unregister_video(btv);
4270
4271        /* free allocated memory */
4272        v4l2_ctrl_handler_free(&btv->ctrl_handler);
4273        v4l2_ctrl_handler_free(&btv->radio_ctrl_handler);
4274        btcx_riscmem_free(btv->c.pci,&btv->main);
4275
4276        /* free resources */
4277        free_irq(btv->c.pci->irq,btv);
4278        iounmap(btv->bt848_mmio);
4279        release_mem_region(pci_resource_start(btv->c.pci,0),
4280                           pci_resource_len(btv->c.pci,0));
4281
4282        v4l2_device_unregister(&btv->c.v4l2_dev);
4283        bttvs[btv->c.nr] = NULL;
4284        kfree(btv);
4285
4286        return;
4287}
4288
4289#ifdef CONFIG_PM
4290static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4291{
4292        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4293        struct bttv *btv = to_bttv(v4l2_dev);
4294        struct bttv_buffer_set idle;
4295        unsigned long flags;
4296
4297        dprintk("%d: suspend %d\n", btv->c.nr, state.event);
4298
4299        /* stop dma + irqs */
4300        spin_lock_irqsave(&btv->s_lock,flags);
4301        memset(&idle, 0, sizeof(idle));
4302        btv->state.video = btv->curr;
4303        btv->state.vbi   = btv->cvbi;
4304        btv->state.loop_irq = btv->loop_irq;
4305        btv->curr = idle;
4306        btv->loop_irq = 0;
4307        bttv_buffer_activate_video(btv, &idle);
4308        bttv_buffer_activate_vbi(btv, NULL);
4309        bttv_set_dma(btv, 0);
4310        btwrite(0, BT848_INT_MASK);
4311        spin_unlock_irqrestore(&btv->s_lock,flags);
4312
4313        /* save bt878 state */
4314        btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4315        btv->state.gpio_data   = gpio_read();
4316
4317        /* save pci state */
4318        pci_save_state(pci_dev);
4319        if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4320                pci_disable_device(pci_dev);
4321                btv->state.disabled = 1;
4322        }
4323        return 0;
4324}
4325
4326static int bttv_resume(struct pci_dev *pci_dev)
4327{
4328        struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4329        struct bttv *btv = to_bttv(v4l2_dev);
4330        unsigned long flags;
4331        int err;
4332
4333        dprintk("%d: resume\n", btv->c.nr);
4334
4335        /* restore pci state */
4336        if (btv->state.disabled) {
4337                err=pci_enable_device(pci_dev);
4338                if (err) {
4339                        pr_warn("%d: Can't enable device\n", btv->c.nr);
4340                        return err;
4341                }
4342                btv->state.disabled = 0;
4343        }
4344        err=pci_set_power_state(pci_dev, PCI_D0);
4345        if (err) {
4346                pci_disable_device(pci_dev);
4347                pr_warn("%d: Can't enable device\n", btv->c.nr);
4348                btv->state.disabled = 1;
4349                return err;
4350        }
4351
4352        pci_restore_state(pci_dev);
4353
4354        /* restore bt878 state */
4355        bttv_reinit_bt848(btv);
4356        gpio_inout(0xffffff, btv->state.gpio_enable);
4357        gpio_write(btv->state.gpio_data);
4358
4359        /* restart dma */
4360        spin_lock_irqsave(&btv->s_lock,flags);
4361        btv->curr = btv->state.video;
4362        btv->cvbi = btv->state.vbi;
4363        btv->loop_irq = btv->state.loop_irq;
4364        bttv_buffer_activate_video(btv, &btv->curr);
4365        bttv_buffer_activate_vbi(btv, btv->cvbi);
4366        bttv_set_dma(btv, 0);
4367        spin_unlock_irqrestore(&btv->s_lock,flags);
4368        return 0;
4369}
4370#endif
4371
4372static struct pci_device_id bttv_pci_tbl[] = {
4373        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT848), 0},
4374        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT849), 0},
4375        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT878), 0},
4376        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT879), 0},
4377        {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_FUSION879), 0},
4378        {0,}
4379};
4380
4381MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4382
4383static struct pci_driver bttv_pci_driver = {
4384        .name     = "bttv",
4385        .id_table = bttv_pci_tbl,
4386        .probe    = bttv_probe,
4387        .remove   = bttv_remove,
4388#ifdef CONFIG_PM
4389        .suspend  = bttv_suspend,
4390        .resume   = bttv_resume,
4391#endif
4392};
4393
4394static int __init bttv_init_module(void)
4395{
4396        int ret;
4397
4398        bttv_num = 0;
4399
4400        pr_info("driver version %s loaded\n", BTTV_VERSION);
4401        if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4402                gbuffers = 2;
4403        if (gbufsize > BTTV_MAX_FBUF)
4404                gbufsize = BTTV_MAX_FBUF;
4405        gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4406        if (bttv_verbose)
4407                pr_info("using %d buffers with %dk (%d pages) each for capture\n",
4408                        gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4409
4410        bttv_check_chipset();
4411
4412        ret = bus_register(&bttv_sub_bus_type);
4413        if (ret < 0) {
4414                pr_warn("bus_register error: %d\n", ret);
4415                return ret;
4416        }
4417        ret = pci_register_driver(&bttv_pci_driver);
4418        if (ret < 0)
4419                bus_unregister(&bttv_sub_bus_type);
4420
4421        return ret;
4422}
4423
4424static void __exit bttv_cleanup_module(void)
4425{
4426        pci_unregister_driver(&bttv_pci_driver);
4427        bus_unregister(&bttv_sub_bus_type);
4428}
4429
4430module_init(bttv_init_module);
4431module_exit(bttv_cleanup_module);
4432
4433/*
4434 * Local variables:
4435 * c-basic-offset: 8
4436 * End:
4437 */
4438