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