File Index
Files and directories
Sign in
FILE

bttv-driver.c

File preview with syntax highlighting.

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