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