cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bttv-driver.c (116445B)


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