3 bttv - Bt848 frame grabber driver
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>
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>
13 (c) 2005-2006 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
15 Fixes to be fully V4L2 compliant by
16 (c) 2006 Mauro Carvalho Chehab <mchehab@infradead.org>
18 Cropping and overscan support
19 Copyright (C) 2005, 2006 Michael H. Schimek <mschimek@gmx.at>
20 Sponsored by OPQ Systems AB
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.
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.
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.
37 #include <linux/init.h>
38 #include <linux/module.h>
39 #include <linux/delay.h>
40 #include <linux/errno.h>
42 #include <linux/kernel.h>
43 #include <linux/sched.h>
44 #include <linux/interrupt.h>
45 #include <linux/kdev_t.h>
47 #include <media/v4l2-common.h>
48 #include <media/tvaudio.h>
49 #include <media/msp3400.h>
51 #include <linux/dma-mapping.h>
54 #include <asm/byteorder.h>
56 #include <media/rds.h>
59 unsigned int bttv_num; /* number of Bt848s in use */
60 struct bttv bttvs[BTTV_MAX];
62 unsigned int bttv_debug;
63 unsigned int bttv_verbose = 1;
64 unsigned int bttv_gpio;
66 /* config variables */
68 static unsigned int bigendian=1;
70 static unsigned int bigendian;
72 static unsigned int radio[BTTV_MAX];
73 static unsigned int irq_debug;
74 static unsigned int gbuffers = 8;
75 static unsigned int gbufsize = 0x208000;
76 static unsigned int reset_crop = 1;
78 static int video_nr = -1;
79 static int radio_nr = -1;
80 static int vbi_nr = -1;
81 static int debug_latency;
83 static unsigned int fdsr;
86 static unsigned int combfilter;
87 static unsigned int lumafilter;
88 static unsigned int automute = 1;
89 static unsigned int chroma_agc;
90 static unsigned int adc_crush = 1;
91 static unsigned int whitecrush_upper = 0xCF;
92 static unsigned int whitecrush_lower = 0x7F;
93 static unsigned int vcr_hack;
94 static unsigned int irq_iswitch;
95 static unsigned int uv_ratio = 50;
96 static unsigned int full_luma_range;
97 static unsigned int coring;
98 extern int no_overlay;
100 /* API features (turn on/off stuff for testing) */
101 static unsigned int v4l2 = 1;
104 module_param(bttv_verbose, int, 0644);
105 module_param(bttv_gpio, int, 0644);
106 module_param(bttv_debug, int, 0644);
107 module_param(irq_debug, int, 0644);
108 module_param(debug_latency, int, 0644);
110 module_param(fdsr, int, 0444);
111 module_param(video_nr, int, 0444);
112 module_param(radio_nr, int, 0444);
113 module_param(vbi_nr, int, 0444);
114 module_param(gbuffers, int, 0444);
115 module_param(gbufsize, int, 0444);
116 module_param(reset_crop, int, 0444);
118 module_param(v4l2, int, 0644);
119 module_param(bigendian, int, 0644);
120 module_param(irq_iswitch, int, 0644);
121 module_param(combfilter, int, 0444);
122 module_param(lumafilter, int, 0444);
123 module_param(automute, int, 0444);
124 module_param(chroma_agc, int, 0444);
125 module_param(adc_crush, int, 0444);
126 module_param(whitecrush_upper, int, 0444);
127 module_param(whitecrush_lower, int, 0444);
128 module_param(vcr_hack, int, 0444);
129 module_param(uv_ratio, int, 0444);
130 module_param(full_luma_range, int, 0444);
131 module_param(coring, int, 0444);
133 module_param_array(radio, int, NULL, 0444);
135 MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
136 MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
137 MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
138 MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
139 MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
140 MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
141 MODULE_PARM_DESC(gbuffers,"number of capture buffers. range 2-32, default 8");
142 MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
143 MODULE_PARM_DESC(reset_crop,"reset cropping parameters at open(), default "
144 "is 1 (yes) for compatibility with older applications");
145 MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
146 MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
147 MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
148 MODULE_PARM_DESC(whitecrush_upper,"sets the white crush upper value, default is 207");
149 MODULE_PARM_DESC(whitecrush_lower,"sets the white crush lower value, default is 127");
150 MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
151 MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler");
152 MODULE_PARM_DESC(uv_ratio,"ratio between u and v gains, default is 50");
153 MODULE_PARM_DESC(full_luma_range,"use the full luma range, default is 0 (no)");
154 MODULE_PARM_DESC(coring,"set the luma coring level, default is 0 (no)");
156 MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
157 MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
158 MODULE_LICENSE("GPL");
160 /* ----------------------------------------------------------------------- */
163 static ssize_t show_card(struct device *cd,
164 struct device_attribute *attr, char *buf)
166 struct video_device *vfd = container_of(cd, struct video_device, class_dev);
167 struct bttv *btv = dev_get_drvdata(vfd->dev);
168 return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
170 static DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
172 /* ----------------------------------------------------------------------- */
173 /* dvb auto-load setup */
174 #if defined(CONFIG_MODULES) && defined(MODULE)
175 static void request_module_async(struct work_struct *work)
177 request_module("dvb-bt8xx");
180 static void request_modules(struct bttv *dev)
182 INIT_WORK(&dev->request_module_wk, request_module_async);
183 schedule_work(&dev->request_module_wk);
186 #define request_modules(dev)
187 #endif /* CONFIG_MODULES */
190 /* ----------------------------------------------------------------------- */
193 /* special timing tables from conexant... */
194 static u8 SRAM_Table[][60] =
196 /* PAL digital input over GPIO[7:0] */
198 45, // 45 bytes following
199 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
200 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
201 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
202 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
203 0x37,0x00,0xAF,0x21,0x00
205 /* NTSC digital input over GPIO[7:0] */
207 51, // 51 bytes following
208 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
209 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
210 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
211 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
212 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
215 // TGB_NTSC392 // quartzsight
216 // This table has been modified to be used for Fusion Rev D
218 0x2A, // size of table = 42
219 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
220 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
221 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
222 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
227 /* minhdelayx1 first video pixel we can capture on a line and
228 hdelayx1 start of active video, both relative to rising edge of
229 /HRESET pulse (0H) in 1 / fCLKx1.
230 swidth width of active video and
231 totalwidth total line width, both in 1 / fCLKx1.
232 sqwidth total line width in square pixels.
233 vdelay start of active video in 2 * field lines relative to
234 trailing edge of /VRESET pulse (VDELAY register).
235 sheight height of active video in 2 * field lines.
236 videostart0 ITU-R frame line number of the line corresponding
237 to vdelay in the first field. */
238 #define CROPCAP(minhdelayx1, hdelayx1, swidth, totalwidth, sqwidth, \
239 vdelay, sheight, videostart0) \
240 .cropcap.bounds.left = minhdelayx1, \
241 /* * 2 because vertically we count field lines times two, */ \
242 /* e.g. 23 * 2 to 23 * 2 + 576 in PAL-BGHI defrect. */ \
243 .cropcap.bounds.top = (videostart0) * 2 - (vdelay) + MIN_VDELAY, \
244 /* 4 is a safety margin at the end of the line. */ \
245 .cropcap.bounds.width = (totalwidth) - (minhdelayx1) - 4, \
246 .cropcap.bounds.height = (sheight) + (vdelay) - MIN_VDELAY, \
247 .cropcap.defrect.left = hdelayx1, \
248 .cropcap.defrect.top = (videostart0) * 2, \
249 .cropcap.defrect.width = swidth, \
250 .cropcap.defrect.height = sheight, \
251 .cropcap.pixelaspect.numerator = totalwidth, \
252 .cropcap.pixelaspect.denominator = sqwidth,
254 const struct bttv_tvnorm bttv_tvnorms[] = {
256 /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
257 /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
259 .v4l2_id = V4L2_STD_PAL,
267 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
268 .scaledtwidth = 1135,
272 .vbipack = 255, /* min (2048 / 4, 0x1ff) & 0xff */
274 /* ITU-R frame line number of the first VBI line
275 we can capture, of the first and second field.
276 The last line is determined by cropcap.bounds. */
277 .vbistart = { 7, 320 },
278 CROPCAP(/* minhdelayx1 */ 68,
280 /* Should be (768 * 1135 + 944 / 2) / 944.
281 cropcap.defrect is used for image width
282 checks, so we keep the old value 924. */
284 /* totalwidth */ 1135,
288 /* videostart0 */ 23)
289 /* bt878 (and bt848?) can capture another
290 line below active video. */
291 .cropcap.bounds.height = (576 + 2) + 0x20 - 2,
293 .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
301 .iform = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
306 .vbipack = 144, /* min (1600 / 4, 0x1ff) & 0xff */
308 .vbistart = { 10, 273 },
309 CROPCAP(/* minhdelayx1 */ 68,
311 /* Should be (640 * 910 + 780 / 2) / 780? */
313 /* totalwidth */ 910,
317 /* videostart0 */ 23)
319 .v4l2_id = V4L2_STD_SECAM,
327 .iform = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
328 .scaledtwidth = 1135,
333 .sram = 0, /* like PAL, correct? */
334 .vbistart = { 7, 320 },
335 CROPCAP(/* minhdelayx1 */ 68,
338 /* totalwidth */ 1135,
342 /* videostart0 */ 23)
344 .v4l2_id = V4L2_STD_PAL_Nc,
352 .iform = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
359 .vbistart = { 7, 320 },
360 CROPCAP(/* minhdelayx1 */ 68,
362 /* swidth */ (640 * 910 + 780 / 2) / 780,
363 /* totalwidth */ 910,
367 /* videostart0 */ 23)
369 .v4l2_id = V4L2_STD_PAL_M,
377 .iform = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
384 .vbistart = { 10, 273 },
385 CROPCAP(/* minhdelayx1 */ 68,
387 /* swidth */ (640 * 910 + 780 / 2) / 780,
388 /* totalwidth */ 910,
392 /* videostart0 */ 23)
394 .v4l2_id = V4L2_STD_PAL_N,
402 .iform = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
409 .vbistart = { 7, 320 },
410 CROPCAP(/* minhdelayx1 */ 68,
412 /* swidth */ (768 * 1135 + 944 / 2) / 944,
413 /* totalwidth */ 1135,
417 /* videostart0 */ 23)
419 .v4l2_id = V4L2_STD_NTSC_M_JP,
427 .iform = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
434 .vbistart = { 10, 273 },
435 CROPCAP(/* minhdelayx1 */ 68,
437 /* swidth */ (640 * 910 + 780 / 2) / 780,
438 /* totalwidth */ 910,
442 /* videostart0 */ 23)
444 /* that one hopefully works with the strange timing
445 * which video recorders produce when playing a NTSC
446 * tape on a PAL TV ... */
447 .v4l2_id = V4L2_STD_PAL_60,
455 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
456 .scaledtwidth = 1135,
463 .vbistart = { 10, 273 },
464 CROPCAP(/* minhdelayx1 */ 68,
467 /* totalwidth */ 1135,
471 /* videostart0 */ 23)
474 static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
476 /* ----------------------------------------------------------------------- */
478 packed pixel formats must come first */
479 static const struct bttv_format formats[] = {
481 .name = "8 bpp, gray",
482 .fourcc = V4L2_PIX_FMT_GREY,
483 .btformat = BT848_COLOR_FMT_Y8,
485 .flags = FORMAT_FLAGS_PACKED,
487 .name = "8 bpp, dithered color",
488 .fourcc = V4L2_PIX_FMT_HI240,
489 .btformat = BT848_COLOR_FMT_RGB8,
491 .flags = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
493 .name = "15 bpp RGB, le",
494 .fourcc = V4L2_PIX_FMT_RGB555,
495 .btformat = BT848_COLOR_FMT_RGB15,
497 .flags = FORMAT_FLAGS_PACKED,
499 .name = "15 bpp RGB, be",
500 .fourcc = V4L2_PIX_FMT_RGB555X,
501 .btformat = BT848_COLOR_FMT_RGB15,
502 .btswap = 0x03, /* byteswap */
504 .flags = FORMAT_FLAGS_PACKED,
506 .name = "16 bpp RGB, le",
507 .fourcc = V4L2_PIX_FMT_RGB565,
508 .btformat = BT848_COLOR_FMT_RGB16,
510 .flags = FORMAT_FLAGS_PACKED,
512 .name = "16 bpp RGB, be",
513 .fourcc = V4L2_PIX_FMT_RGB565X,
514 .btformat = BT848_COLOR_FMT_RGB16,
515 .btswap = 0x03, /* byteswap */
517 .flags = FORMAT_FLAGS_PACKED,
519 .name = "24 bpp RGB, le",
520 .fourcc = V4L2_PIX_FMT_BGR24,
521 .btformat = BT848_COLOR_FMT_RGB24,
523 .flags = FORMAT_FLAGS_PACKED,
525 .name = "32 bpp RGB, le",
526 .fourcc = V4L2_PIX_FMT_BGR32,
527 .btformat = BT848_COLOR_FMT_RGB32,
529 .flags = FORMAT_FLAGS_PACKED,
531 .name = "32 bpp RGB, be",
532 .fourcc = V4L2_PIX_FMT_RGB32,
533 .btformat = BT848_COLOR_FMT_RGB32,
534 .btswap = 0x0f, /* byte+word swap */
536 .flags = FORMAT_FLAGS_PACKED,
538 .name = "4:2:2, packed, YUYV",
539 .fourcc = V4L2_PIX_FMT_YUYV,
540 .btformat = BT848_COLOR_FMT_YUY2,
542 .flags = FORMAT_FLAGS_PACKED,
544 .name = "4:2:2, packed, YUYV",
545 .fourcc = V4L2_PIX_FMT_YUYV,
546 .btformat = BT848_COLOR_FMT_YUY2,
548 .flags = FORMAT_FLAGS_PACKED,
550 .name = "4:2:2, packed, UYVY",
551 .fourcc = V4L2_PIX_FMT_UYVY,
552 .btformat = BT848_COLOR_FMT_YUY2,
553 .btswap = 0x03, /* byteswap */
555 .flags = FORMAT_FLAGS_PACKED,
557 .name = "4:2:2, planar, Y-Cb-Cr",
558 .fourcc = V4L2_PIX_FMT_YUV422P,
559 .btformat = BT848_COLOR_FMT_YCrCb422,
561 .flags = FORMAT_FLAGS_PLANAR,
565 .name = "4:2:0, planar, Y-Cb-Cr",
566 .fourcc = V4L2_PIX_FMT_YUV420,
567 .btformat = BT848_COLOR_FMT_YCrCb422,
569 .flags = FORMAT_FLAGS_PLANAR,
573 .name = "4:2:0, planar, Y-Cr-Cb",
574 .fourcc = V4L2_PIX_FMT_YVU420,
575 .btformat = BT848_COLOR_FMT_YCrCb422,
577 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
581 .name = "4:1:1, planar, Y-Cb-Cr",
582 .fourcc = V4L2_PIX_FMT_YUV411P,
583 .btformat = BT848_COLOR_FMT_YCrCb411,
585 .flags = FORMAT_FLAGS_PLANAR,
589 .name = "4:1:0, planar, Y-Cb-Cr",
590 .fourcc = V4L2_PIX_FMT_YUV410,
591 .btformat = BT848_COLOR_FMT_YCrCb411,
593 .flags = FORMAT_FLAGS_PLANAR,
597 .name = "4:1:0, planar, Y-Cr-Cb",
598 .fourcc = V4L2_PIX_FMT_YVU410,
599 .btformat = BT848_COLOR_FMT_YCrCb411,
601 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
605 .name = "raw scanlines",
607 .btformat = BT848_COLOR_FMT_RAW,
609 .flags = FORMAT_FLAGS_RAW,
612 static const unsigned int FORMATS = ARRAY_SIZE(formats);
614 /* ----------------------------------------------------------------------- */
616 #define V4L2_CID_PRIVATE_CHROMA_AGC (V4L2_CID_PRIVATE_BASE + 0)
617 #define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_PRIVATE_BASE + 1)
618 #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2)
619 #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3)
620 #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4)
621 #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5)
622 #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6)
623 #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7)
624 #define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8)
625 #define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9)
626 #define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10)
627 #define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11)
629 static const struct v4l2_queryctrl no_ctl = {
631 .flags = V4L2_CTRL_FLAG_DISABLED,
633 static const struct v4l2_queryctrl bttv_ctls[] = {
636 .id = V4L2_CID_BRIGHTNESS,
637 .name = "Brightness",
641 .default_value = 32768,
642 .type = V4L2_CTRL_TYPE_INTEGER,
644 .id = V4L2_CID_CONTRAST,
649 .default_value = 32768,
650 .type = V4L2_CTRL_TYPE_INTEGER,
652 .id = V4L2_CID_SATURATION,
653 .name = "Saturation",
657 .default_value = 32768,
658 .type = V4L2_CTRL_TYPE_INTEGER,
665 .default_value = 32768,
666 .type = V4L2_CTRL_TYPE_INTEGER,
670 .id = V4L2_CID_AUDIO_MUTE,
674 .type = V4L2_CTRL_TYPE_BOOLEAN,
676 .id = V4L2_CID_AUDIO_VOLUME,
681 .default_value = 65535,
682 .type = V4L2_CTRL_TYPE_INTEGER,
684 .id = V4L2_CID_AUDIO_BALANCE,
689 .default_value = 32768,
690 .type = V4L2_CTRL_TYPE_INTEGER,
692 .id = V4L2_CID_AUDIO_BASS,
697 .default_value = 32768,
698 .type = V4L2_CTRL_TYPE_INTEGER,
700 .id = V4L2_CID_AUDIO_TREBLE,
705 .default_value = 32768,
706 .type = V4L2_CTRL_TYPE_INTEGER,
708 /* --- private --- */
710 .id = V4L2_CID_PRIVATE_CHROMA_AGC,
711 .name = "chroma agc",
714 .type = V4L2_CTRL_TYPE_BOOLEAN,
716 .id = V4L2_CID_PRIVATE_COMBFILTER,
717 .name = "combfilter",
720 .type = V4L2_CTRL_TYPE_BOOLEAN,
722 .id = V4L2_CID_PRIVATE_AUTOMUTE,
726 .type = V4L2_CTRL_TYPE_BOOLEAN,
728 .id = V4L2_CID_PRIVATE_LUMAFILTER,
729 .name = "luma decimation filter",
732 .type = V4L2_CTRL_TYPE_BOOLEAN,
734 .id = V4L2_CID_PRIVATE_AGC_CRUSH,
738 .type = V4L2_CTRL_TYPE_BOOLEAN,
740 .id = V4L2_CID_PRIVATE_VCR_HACK,
744 .type = V4L2_CTRL_TYPE_BOOLEAN,
746 .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
747 .name = "whitecrush upper",
751 .default_value = 0xCF,
752 .type = V4L2_CTRL_TYPE_INTEGER,
754 .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
755 .name = "whitecrush lower",
759 .default_value = 0x7F,
760 .type = V4L2_CTRL_TYPE_INTEGER,
762 .id = V4L2_CID_PRIVATE_UV_RATIO,
768 .type = V4L2_CTRL_TYPE_INTEGER,
770 .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
771 .name = "full luma range",
774 .type = V4L2_CTRL_TYPE_BOOLEAN,
776 .id = V4L2_CID_PRIVATE_CORING,
782 .type = V4L2_CTRL_TYPE_INTEGER,
788 static const int BTTV_CTLS = ARRAY_SIZE(bttv_ctls);
790 static const struct v4l2_queryctrl *ctrl_by_id(int id)
794 for (i = 0; i < BTTV_CTLS; i++)
795 if (bttv_ctls[i].id == id)
800 /* ----------------------------------------------------------------------- */
801 /* resource management */
804 RESOURCE_ allocated by freed by
806 VIDEO_READ bttv_read 1) bttv_read 2)
808 VIDEO_STREAM VIDIOC_STREAMON VIDIOC_STREAMOFF
809 VIDIOC_QBUF 1) bttv_release
812 OVERLAY VIDIOCCAPTURE on VIDIOCCAPTURE off
813 VIDIOC_OVERLAY on VIDIOC_OVERLAY off
816 VBI VIDIOC_STREAMON VIDIOC_STREAMOFF
817 VIDIOC_QBUF 1) bttv_release
818 bttv_read, bttv_poll 1) 4)
820 1) The resource must be allocated when we enter buffer prepare functions
821 and remain allocated while buffers are in the DMA queue.
822 2) This is a single frame read.
823 3) VIDIOC_S_FBUF and VIDIOC_S_FMT (OVERLAY) still work when
824 RESOURCE_OVERLAY is allocated.
825 4) This is a continuous read, implies VIDIOC_STREAMON.
827 Note this driver permits video input and standard changes regardless if
828 resources are allocated.
831 #define VBI_RESOURCES (RESOURCE_VBI)
832 #define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
833 RESOURCE_VIDEO_STREAM | \
837 int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit)
839 int xbits; /* mutual exclusive resources */
841 if (fh->resources & bit)
842 /* have it already allocated */
846 if (bit & (RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM))
847 xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
850 mutex_lock(&btv->lock);
851 if (btv->resources & xbits) {
852 /* no, someone else uses it */
856 if ((bit & VIDEO_RESOURCES)
857 && 0 == (btv->resources & VIDEO_RESOURCES)) {
858 /* Do crop - use current, don't - use default parameters. */
859 __s32 top = btv->crop[!!fh->do_crop].rect.top;
861 if (btv->vbi_end > top)
864 /* We cannot capture the same line as video and VBI data.
865 Claim scan lines crop[].rect.top to bottom. */
866 btv->crop_start = top;
867 } else if (bit & VBI_RESOURCES) {
868 __s32 end = fh->vbi_fmt.end;
870 if (end > btv->crop_start)
873 /* Claim scan lines above fh->vbi_fmt.end. */
877 /* it's free, grab it */
878 fh->resources |= bit;
879 btv->resources |= bit;
880 mutex_unlock(&btv->lock);
884 mutex_unlock(&btv->lock);
889 int check_btres(struct bttv_fh *fh, int bit)
891 return (fh->resources & bit);
895 int locked_btres(struct bttv *btv, int bit)
897 return (btv->resources & bit);
900 /* Call with btv->lock down. */
902 disclaim_vbi_lines(struct bttv *btv)
907 /* Call with btv->lock down. */
909 disclaim_video_lines(struct bttv *btv)
911 const struct bttv_tvnorm *tvnorm;
914 tvnorm = &bttv_tvnorms[btv->tvnorm];
915 btv->crop_start = tvnorm->cropcap.bounds.top
916 + tvnorm->cropcap.bounds.height;
918 /* VBI capturing ends at VDELAY, start of video capturing, no
919 matter how many lines the VBI RISC program expects. When video
920 capturing is off, it shall no longer "preempt" VBI capturing,
921 so we set VDELAY to maximum. */
922 crop = btread(BT848_E_CROP) | 0xc0;
923 btwrite(crop, BT848_E_CROP);
924 btwrite(0xfe, BT848_E_VDELAY_LO);
925 btwrite(crop, BT848_O_CROP);
926 btwrite(0xfe, BT848_O_VDELAY_LO);
930 void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
932 if ((fh->resources & bits) != bits) {
933 /* trying to free ressources not allocated by us ... */
934 printk("bttv: BUG! (btres)\n");
936 mutex_lock(&btv->lock);
937 fh->resources &= ~bits;
938 btv->resources &= ~bits;
940 bits = btv->resources;
942 if (0 == (bits & VIDEO_RESOURCES))
943 disclaim_video_lines(btv);
945 if (0 == (bits & VBI_RESOURCES))
946 disclaim_vbi_lines(btv);
948 mutex_unlock(&btv->lock);
951 /* ----------------------------------------------------------------------- */
952 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
954 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
955 PLL_X = Reference pre-divider (0=1, 1=2)
956 PLL_C = Post divider (0=6, 1=4)
957 PLL_I = Integer input
958 PLL_F = Fractional input
960 F_input = 28.636363 MHz:
961 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
964 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
966 unsigned char fl, fh, fi;
968 /* prevent overflows */
981 btwrite(fl, BT848_PLL_F_LO);
982 btwrite(fh, BT848_PLL_F_HI);
983 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
986 static void set_pll(struct bttv *btv)
990 if (!btv->pll.pll_crystal)
993 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
994 dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
998 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
1000 if (btv->pll.pll_current == 0)
1002 bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
1003 btv->c.nr,btv->pll.pll_ifreq);
1004 btwrite(0x00,BT848_TGCTRL);
1005 btwrite(0x00,BT848_PLL_XCI);
1006 btv->pll.pll_current = 0;
1010 bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
1011 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1012 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1014 for (i=0; i<10; i++) {
1015 /* Let other people run while the PLL stabilizes */
1019 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
1020 btwrite(0,BT848_DSTATUS);
1022 btwrite(0x08,BT848_TGCTRL);
1023 btv->pll.pll_current = btv->pll.pll_ofreq;
1024 bttv_printk(" ok\n");
1028 btv->pll.pll_current = -1;
1029 bttv_printk("failed\n");
1033 /* used to switch between the bt848's analog/digital video capture modes */
1034 static void bt848A_set_timing(struct bttv *btv)
1037 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
1038 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
1040 if (UNSET == bttv_tvcards[btv->c.type].muxsel[btv->input]) {
1041 dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
1042 btv->c.nr,table_idx);
1044 /* timing change...reset timing generator address */
1045 btwrite(0x00, BT848_TGCTRL);
1046 btwrite(0x02, BT848_TGCTRL);
1047 btwrite(0x00, BT848_TGCTRL);
1049 len=SRAM_Table[table_idx][0];
1050 for(i = 1; i <= len; i++)
1051 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
1052 btv->pll.pll_ofreq = 27000000;
1055 btwrite(0x11, BT848_TGCTRL);
1056 btwrite(0x41, BT848_DVSIF);
1058 btv->pll.pll_ofreq = fsc;
1060 btwrite(0x0, BT848_DVSIF);
1064 /* ----------------------------------------------------------------------- */
1066 static void bt848_bright(struct bttv *btv, int bright)
1070 // printk("bttv: set bright: %d\n",bright); // DEBUG
1071 btv->bright = bright;
1073 /* We want -128 to 127 we get 0-65535 */
1074 value = (bright >> 8) - 128;
1075 btwrite(value & 0xff, BT848_BRIGHT);
1078 static void bt848_hue(struct bttv *btv, int hue)
1085 value = (hue >> 8) - 128;
1086 btwrite(value & 0xff, BT848_HUE);
1089 static void bt848_contrast(struct bttv *btv, int cont)
1093 btv->contrast = cont;
1096 value = (cont >> 7);
1097 hibit = (value >> 6) & 4;
1098 btwrite(value & 0xff, BT848_CONTRAST_LO);
1099 btaor(hibit, ~4, BT848_E_CONTROL);
1100 btaor(hibit, ~4, BT848_O_CONTROL);
1103 static void bt848_sat(struct bttv *btv, int color)
1105 int val_u,val_v,hibits;
1107 btv->saturation = color;
1109 /* 0-511 for the color */
1110 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
1111 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
1112 hibits = (val_u >> 7) & 2;
1113 hibits |= (val_v >> 8) & 1;
1114 btwrite(val_u & 0xff, BT848_SAT_U_LO);
1115 btwrite(val_v & 0xff, BT848_SAT_V_LO);
1116 btaor(hibits, ~3, BT848_E_CONTROL);
1117 btaor(hibits, ~3, BT848_O_CONTROL);
1120 /* ----------------------------------------------------------------------- */
1123 video_mux(struct bttv *btv, unsigned int input)
1127 if (input >= bttv_tvcards[btv->c.type].video_inputs)
1130 /* needed by RemoteVideo MX */
1131 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
1133 gpio_inout(mask2,mask2);
1135 if (input == btv->svhs) {
1136 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
1137 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
1139 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
1140 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
1142 mux = bttv_tvcards[btv->c.type].muxsel[input] & 3;
1143 btaor(mux<<5, ~(3<<5), BT848_IFORM);
1144 dprintk(KERN_DEBUG "bttv%d: video mux: input=%d mux=%d\n",
1145 btv->c.nr,input,mux);
1147 /* card specific hook */
1148 if(bttv_tvcards[btv->c.type].muxsel_hook)
1149 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
1153 static char *audio_modes[] = {
1154 "audio: tuner", "audio: radio", "audio: extern",
1155 "audio: intern", "audio: mute"
1159 audio_mux(struct bttv *btv, int input, int mute)
1161 int gpio_val, signal;
1162 struct v4l2_control ctrl;
1163 struct i2c_client *c;
1165 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
1166 bttv_tvcards[btv->c.type].gpiomask);
1167 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
1173 mute = mute || (btv->opt_automute && !signal && !btv->radio_user);
1176 gpio_val = bttv_tvcards[btv->c.type].gpiomute;
1178 gpio_val = bttv_tvcards[btv->c.type].gpiomux[input];
1180 gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpio_val);
1182 bttv_gpio_tracking(btv, audio_modes[mute ? 4 : input]);
1186 ctrl.id = V4L2_CID_AUDIO_MUTE;
1187 ctrl.value = btv->mute;
1188 bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, &ctrl);
1189 c = btv->i2c_msp34xx_client;
1191 struct v4l2_routing route;
1193 /* Note: the inputs tuner/radio/extern/intern are translated
1194 to msp routings. This assumes common behavior for all msp3400
1195 based TV cards. When this assumption fails, then the
1196 specific MSP routing must be added to the card table.
1197 For now this is sufficient. */
1199 case TVAUDIO_INPUT_RADIO:
1200 route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1201 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1203 case TVAUDIO_INPUT_EXTERN:
1204 route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
1205 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1207 case TVAUDIO_INPUT_INTERN:
1208 /* Yes, this is the same input as for RADIO. I doubt
1209 if this is ever used. The only board with an INTERN
1210 input is the BTTV_BOARD_AVERMEDIA98. I wonder how
1211 that was tested. My guess is that the whole INTERN
1212 input does not work. */
1213 route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1214 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1216 case TVAUDIO_INPUT_TUNER:
1218 /* This is the only card that uses TUNER2, and afaik,
1219 is the only difference between the VOODOOTV_FM
1221 if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
1222 route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
1223 MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
1225 route.input = MSP_INPUT_DEFAULT;
1228 route.output = MSP_OUTPUT_DEFAULT;
1229 c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
1231 c = btv->i2c_tvaudio_client;
1233 struct v4l2_routing route;
1235 route.input = input;
1237 c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
1243 audio_mute(struct bttv *btv, int mute)
1245 return audio_mux(btv, btv->audio, mute);
1249 audio_input(struct bttv *btv, int input)
1251 return audio_mux(btv, input, btv->mute);
1255 bttv_crop_calc_limits(struct bttv_crop *c)
1257 /* Scale factor min. 1:1, max. 16:1. Min. image size
1258 48 x 32. Scaled width must be a multiple of 4. */
1261 /* For bug compatibility with VIDIOCGCAP and image
1262 size checks in earlier driver versions. */
1263 c->min_scaled_width = 48;
1264 c->min_scaled_height = 32;
1266 c->min_scaled_width =
1267 (max(48, c->rect.width >> 4) + 3) & ~3;
1268 c->min_scaled_height =
1269 max(32, c->rect.height >> 4);
1272 c->max_scaled_width = c->rect.width & ~3;
1273 c->max_scaled_height = c->rect.height;
1277 bttv_crop_reset(struct bttv_crop *c, int norm)
1279 c->rect = bttv_tvnorms[norm].cropcap.defrect;
1280 bttv_crop_calc_limits(c);
1283 /* Call with btv->lock down. */
1285 set_tvnorm(struct bttv *btv, unsigned int norm)
1287 const struct bttv_tvnorm *tvnorm;
1290 if (norm < 0 || norm >= BTTV_TVNORMS)
1293 tvnorm = &bttv_tvnorms[norm];
1295 if (btv->tvnorm < 0 ||
1296 btv->tvnorm >= BTTV_TVNORMS ||
1297 0 != memcmp(&bttv_tvnorms[btv->tvnorm].cropcap,
1299 sizeof (tvnorm->cropcap))) {
1300 bttv_crop_reset(&btv->crop[0], norm);
1301 btv->crop[1] = btv->crop[0]; /* current = default */
1303 if (0 == (btv->resources & VIDEO_RESOURCES)) {
1304 btv->crop_start = tvnorm->cropcap.bounds.top
1305 + tvnorm->cropcap.bounds.height;
1311 btwrite(tvnorm->adelay, BT848_ADELAY);
1312 btwrite(tvnorm->bdelay, BT848_BDELAY);
1313 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
1315 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
1316 btwrite(1, BT848_VBI_PACK_DEL);
1317 bt848A_set_timing(btv);
1319 switch (btv->c.type) {
1320 case BTTV_BOARD_VOODOOTV_FM:
1321 case BTTV_BOARD_VOODOOTV_200:
1322 bttv_tda9880_setnorm(btv,norm);
1325 id = tvnorm->v4l2_id;
1326 bttv_call_i2c_clients(btv, VIDIOC_S_STD, &id);
1331 /* Call with btv->lock down. */
1333 set_input(struct bttv *btv, unsigned int input, unsigned int norm)
1335 unsigned long flags;
1339 spin_lock_irqsave(&btv->s_lock,flags);
1340 if (btv->curr.frame_irq) {
1341 /* active capture -> delayed input switch */
1342 btv->new_input = input;
1344 video_mux(btv,input);
1346 spin_unlock_irqrestore(&btv->s_lock,flags);
1348 video_mux(btv,input);
1350 audio_input(btv,(input == bttv_tvcards[btv->c.type].tuner ?
1351 TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN));
1352 set_tvnorm(btv, norm);
1355 static void init_irqreg(struct bttv *btv)
1358 btwrite(0xfffffUL, BT848_INT_STAT);
1360 if (bttv_tvcards[btv->c.type].no_video) {
1362 btwrite(BT848_INT_I2CDONE,
1366 btwrite((btv->triton1) |
1367 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1369 (fdsr ? BT848_INT_FDSR : 0) |
1370 BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
1371 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1377 static void init_bt848(struct bttv *btv)
1381 if (bttv_tvcards[btv->c.type].no_video) {
1382 /* very basic init only */
1387 btwrite(0x00, BT848_CAP_CTL);
1388 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1389 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1391 /* set planar and packed mode trigger points and */
1392 /* set rising edge of inverted GPINTR pin as irq trigger */
1393 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1394 BT848_GPIO_DMA_CTL_PLTP1_16|
1395 BT848_GPIO_DMA_CTL_PLTP23_16|
1396 BT848_GPIO_DMA_CTL_GPINTC|
1397 BT848_GPIO_DMA_CTL_GPINTI,
1398 BT848_GPIO_DMA_CTL);
1400 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1401 btwrite(val, BT848_E_SCLOOP);
1402 btwrite(val, BT848_O_SCLOOP);
1404 btwrite(0x20, BT848_E_VSCALE_HI);
1405 btwrite(0x20, BT848_O_VSCALE_HI);
1406 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1409 btwrite(whitecrush_upper, BT848_WC_UP);
1410 btwrite(whitecrush_lower, BT848_WC_DOWN);
1412 if (btv->opt_lumafilter) {
1413 btwrite(0, BT848_E_CONTROL);
1414 btwrite(0, BT848_O_CONTROL);
1416 btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1417 btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1420 bt848_bright(btv, btv->bright);
1421 bt848_hue(btv, btv->hue);
1422 bt848_contrast(btv, btv->contrast);
1423 bt848_sat(btv, btv->saturation);
1429 static void bttv_reinit_bt848(struct bttv *btv)
1431 unsigned long flags;
1434 printk(KERN_INFO "bttv%d: reset, reinitialize\n",btv->c.nr);
1435 spin_lock_irqsave(&btv->s_lock,flags);
1437 bttv_set_dma(btv,0);
1438 spin_unlock_irqrestore(&btv->s_lock,flags);
1441 btv->pll.pll_current = -1;
1442 set_input(btv, btv->input, btv->tvnorm);
1445 /* ----------------------------------------------------------------------- */
1447 void bttv_gpio_tracking(struct bttv *btv, char *comment)
1449 unsigned int outbits, data;
1450 outbits = btread(BT848_GPIO_OUT_EN);
1451 data = btread(BT848_GPIO_DATA);
1452 printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1453 btv->c.nr,outbits,data & outbits, data & ~outbits, comment);
1456 static void bttv_field_count(struct bttv *btv)
1464 /* start field counter */
1465 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1467 /* stop field counter */
1468 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1469 btv->field_count = 0;
1473 static const struct bttv_format*
1474 format_by_fourcc(int fourcc)
1478 for (i = 0; i < FORMATS; i++) {
1479 if (-1 == formats[i].fourcc)
1481 if (formats[i].fourcc == fourcc)
1487 /* ----------------------------------------------------------------------- */
1491 bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1492 struct bttv_buffer *new)
1494 struct bttv_buffer *old;
1495 unsigned long flags;
1498 dprintk("switch_overlay: enter [new=%p]\n",new);
1500 new->vb.state = VIDEOBUF_DONE;
1501 spin_lock_irqsave(&btv->s_lock,flags);
1505 bttv_set_dma(btv, 0x03);
1506 spin_unlock_irqrestore(&btv->s_lock,flags);
1508 dprintk("switch_overlay: old=%p state is %d\n",old,old->vb.state);
1509 bttv_dma_free(&fh->cap,btv, old);
1513 free_btres(btv,fh,RESOURCE_OVERLAY);
1514 dprintk("switch_overlay: done\n");
1518 /* ----------------------------------------------------------------------- */
1519 /* video4linux (1) interface */
1521 static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
1522 struct bttv_buffer *buf,
1523 const struct bttv_format *fmt,
1524 unsigned int width, unsigned int height,
1525 enum v4l2_field field)
1527 struct bttv_fh *fh = q->priv_data;
1528 int redo_dma_risc = 0;
1533 /* check settings */
1536 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1538 height = RAW_LINES*2;
1539 if (width*height > buf->vb.bsize)
1541 buf->vb.size = buf->vb.bsize;
1543 /* Make sure tvnorm and vbi_end remain consistent
1544 until we're done. */
1545 mutex_lock(&btv->lock);
1549 /* In this mode capturing always starts at defrect.top
1550 (default VDELAY), ignoring cropping parameters. */
1551 if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
1552 mutex_unlock(&btv->lock);
1556 mutex_unlock(&btv->lock);
1558 c.rect = bttv_tvnorms[norm].cropcap.defrect;
1560 mutex_lock(&btv->lock);
1563 c = btv->crop[!!fh->do_crop];
1565 mutex_unlock(&btv->lock);
1567 if (width < c.min_scaled_width ||
1568 width > c.max_scaled_width ||
1569 height < c.min_scaled_height)
1573 case V4L2_FIELD_TOP:
1574 case V4L2_FIELD_BOTTOM:
1575 case V4L2_FIELD_ALTERNATE:
1576 /* btv->crop counts frame lines. Max. scale
1577 factor is 16:1 for frames, 8:1 for fields. */
1578 if (height * 2 > c.max_scaled_height)
1583 if (height > c.max_scaled_height)
1588 buf->vb.size = (width * height * fmt->depth) >> 3;
1589 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1593 /* alloc + fill struct bttv_buffer (if changed) */
1594 if (buf->vb.width != width || buf->vb.height != height ||
1595 buf->vb.field != field ||
1596 buf->tvnorm != norm || buf->fmt != fmt ||
1597 buf->crop.top != c.rect.top ||
1598 buf->crop.left != c.rect.left ||
1599 buf->crop.width != c.rect.width ||
1600 buf->crop.height != c.rect.height) {
1601 buf->vb.width = width;
1602 buf->vb.height = height;
1603 buf->vb.field = field;
1610 /* alloc risc memory */
1611 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1613 if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
1618 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1621 buf->vb.state = VIDEOBUF_PREPARED;
1625 bttv_dma_free(q,btv,buf);
1630 buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1632 struct bttv_fh *fh = q->priv_data;
1634 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1637 while (*size * *count > gbuffers * gbufsize)
1643 buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1644 enum v4l2_field field)
1646 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1647 struct bttv_fh *fh = q->priv_data;
1649 return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
1650 fh->width, fh->height, field);
1654 buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1656 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1657 struct bttv_fh *fh = q->priv_data;
1658 struct bttv *btv = fh->btv;
1660 buf->vb.state = VIDEOBUF_QUEUED;
1661 list_add_tail(&buf->vb.queue,&btv->capture);
1662 if (!btv->curr.frame_irq) {
1664 bttv_set_dma(btv, 0x03);
1668 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1670 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1671 struct bttv_fh *fh = q->priv_data;
1673 bttv_dma_free(q,fh->btv,buf);
1676 static struct videobuf_queue_ops bttv_video_qops = {
1677 .buf_setup = buffer_setup,
1678 .buf_prepare = buffer_prepare,
1679 .buf_queue = buffer_queue,
1680 .buf_release = buffer_release,
1683 static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id)
1685 struct bttv_fh *fh = priv;
1686 struct bttv *btv = fh->btv;
1690 err = v4l2_prio_check(&btv->prio, &fh->prio);
1694 for (i = 0; i < BTTV_TVNORMS; i++)
1695 if (*id & bttv_tvnorms[i].v4l2_id)
1697 if (i == BTTV_TVNORMS)
1700 mutex_lock(&btv->lock);
1702 mutex_unlock(&btv->lock);
1707 static int bttv_querystd(struct file *file, void *f, v4l2_std_id *id)
1709 struct bttv_fh *fh = f;
1710 struct bttv *btv = fh->btv;
1712 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1713 *id = V4L2_STD_625_50;
1715 *id = V4L2_STD_525_60;
1719 static int bttv_enum_input(struct file *file, void *priv,
1720 struct v4l2_input *i)
1722 struct bttv_fh *fh = priv;
1723 struct bttv *btv = fh->btv;
1728 if (n >= bttv_tvcards[btv->c.type].video_inputs)
1731 memset(i, 0, sizeof(*i));
1734 i->type = V4L2_INPUT_TYPE_CAMERA;
1737 if (i->index == bttv_tvcards[btv->c.type].tuner) {
1738 sprintf(i->name, "Television");
1739 i->type = V4L2_INPUT_TYPE_TUNER;
1741 } else if (i->index == btv->svhs) {
1742 sprintf(i->name, "S-Video");
1744 sprintf(i->name, "Composite%d", i->index);
1747 if (i->index == btv->input) {
1748 __u32 dstatus = btread(BT848_DSTATUS);
1749 if (0 == (dstatus & BT848_DSTATUS_PRES))
1750 i->status |= V4L2_IN_ST_NO_SIGNAL;
1751 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1752 i->status |= V4L2_IN_ST_NO_H_LOCK;
1755 for (n = 0; n < BTTV_TVNORMS; n++)
1756 i->std |= bttv_tvnorms[n].v4l2_id;
1761 static int bttv_g_input(struct file *file, void *priv, unsigned int *i)
1763 struct bttv_fh *fh = priv;
1764 struct bttv *btv = fh->btv;
1770 static int bttv_s_input(struct file *file, void *priv, unsigned int i)
1772 struct bttv_fh *fh = priv;
1773 struct bttv *btv = fh->btv;
1777 err = v4l2_prio_check(&btv->prio, &fh->prio);
1781 if (i > bttv_tvcards[btv->c.type].video_inputs)
1784 mutex_lock(&btv->lock);
1785 set_input(btv, i, btv->tvnorm);
1786 mutex_unlock(&btv->lock);
1790 static int bttv_s_tuner(struct file *file, void *priv,
1791 struct v4l2_tuner *t)
1793 struct bttv_fh *fh = priv;
1794 struct bttv *btv = fh->btv;
1797 err = v4l2_prio_check(&btv->prio, &fh->prio);
1801 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1807 mutex_lock(&btv->lock);
1808 bttv_call_i2c_clients(btv, VIDIOC_S_TUNER, t);
1810 if (btv->audio_mode_gpio)
1811 btv->audio_mode_gpio(btv, t, 1);
1813 mutex_unlock(&btv->lock);
1818 static int bttv_g_frequency(struct file *file, void *priv,
1819 struct v4l2_frequency *f)
1821 struct bttv_fh *fh = priv;
1822 struct bttv *btv = fh->btv;
1825 err = v4l2_prio_check(&btv->prio, &fh->prio);
1829 f->type = V4L2_TUNER_ANALOG_TV;
1830 f->frequency = btv->freq;
1835 static int bttv_s_frequency(struct file *file, void *priv,
1836 struct v4l2_frequency *f)
1838 struct bttv_fh *fh = priv;
1839 struct bttv *btv = fh->btv;
1842 err = v4l2_prio_check(&btv->prio, &fh->prio);
1846 if (unlikely(f->tuner != 0))
1848 if (unlikely(f->type != V4L2_TUNER_ANALOG_TV))
1850 mutex_lock(&btv->lock);
1851 btv->freq = f->frequency;
1852 bttv_call_i2c_clients(btv, VIDIOC_S_FREQUENCY, f);
1853 if (btv->has_matchbox && btv->radio_user)
1854 tea5757_set_freq(btv, btv->freq);
1855 mutex_unlock(&btv->lock);
1859 static int bttv_log_status(struct file *file, void *f)
1861 struct bttv_fh *fh = f;
1862 struct bttv *btv = fh->btv;
1864 printk(KERN_INFO "bttv%d: ======== START STATUS CARD #%d ========\n",
1865 btv->c.nr, btv->c.nr);
1866 bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
1867 printk(KERN_INFO "bttv%d: ======== END STATUS CARD #%d ========\n",
1868 btv->c.nr, btv->c.nr);
1872 static int bttv_g_ctrl(struct file *file, void *priv,
1873 struct v4l2_control *c)
1875 struct bttv_fh *fh = priv;
1876 struct bttv *btv = fh->btv;
1879 case V4L2_CID_BRIGHTNESS:
1880 c->value = btv->bright;
1883 c->value = btv->hue;
1885 case V4L2_CID_CONTRAST:
1886 c->value = btv->contrast;
1888 case V4L2_CID_SATURATION:
1889 c->value = btv->saturation;
1892 case V4L2_CID_AUDIO_MUTE:
1893 case V4L2_CID_AUDIO_VOLUME:
1894 case V4L2_CID_AUDIO_BALANCE:
1895 case V4L2_CID_AUDIO_BASS:
1896 case V4L2_CID_AUDIO_TREBLE:
1897 bttv_call_i2c_clients(btv, VIDIOC_G_CTRL, c);
1900 case V4L2_CID_PRIVATE_CHROMA_AGC:
1901 c->value = btv->opt_chroma_agc;
1903 case V4L2_CID_PRIVATE_COMBFILTER:
1904 c->value = btv->opt_combfilter;
1906 case V4L2_CID_PRIVATE_LUMAFILTER:
1907 c->value = btv->opt_lumafilter;
1909 case V4L2_CID_PRIVATE_AUTOMUTE:
1910 c->value = btv->opt_automute;
1912 case V4L2_CID_PRIVATE_AGC_CRUSH:
1913 c->value = btv->opt_adc_crush;
1915 case V4L2_CID_PRIVATE_VCR_HACK:
1916 c->value = btv->opt_vcr_hack;
1918 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1919 c->value = btv->opt_whitecrush_upper;
1921 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1922 c->value = btv->opt_whitecrush_lower;
1924 case V4L2_CID_PRIVATE_UV_RATIO:
1925 c->value = btv->opt_uv_ratio;
1927 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1928 c->value = btv->opt_full_luma_range;
1930 case V4L2_CID_PRIVATE_CORING:
1931 c->value = btv->opt_coring;
1939 static int bttv_s_ctrl(struct file *file, void *f,
1940 struct v4l2_control *c)
1944 struct bttv_fh *fh = f;
1945 struct bttv *btv = fh->btv;
1947 err = v4l2_prio_check(&btv->prio, &fh->prio);
1952 case V4L2_CID_BRIGHTNESS:
1953 bt848_bright(btv, c->value);
1956 bt848_hue(btv, c->value);
1958 case V4L2_CID_CONTRAST:
1959 bt848_contrast(btv, c->value);
1961 case V4L2_CID_SATURATION:
1962 bt848_sat(btv, c->value);
1964 case V4L2_CID_AUDIO_MUTE:
1965 audio_mute(btv, c->value);
1967 case V4L2_CID_AUDIO_VOLUME:
1968 if (btv->volume_gpio)
1969 btv->volume_gpio(btv, c->value);
1971 bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c);
1973 case V4L2_CID_AUDIO_BALANCE:
1974 case V4L2_CID_AUDIO_BASS:
1975 case V4L2_CID_AUDIO_TREBLE:
1976 bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c);
1979 case V4L2_CID_PRIVATE_CHROMA_AGC:
1980 btv->opt_chroma_agc = c->value;
1981 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1982 btwrite(val, BT848_E_SCLOOP);
1983 btwrite(val, BT848_O_SCLOOP);
1985 case V4L2_CID_PRIVATE_COMBFILTER:
1986 btv->opt_combfilter = c->value;
1988 case V4L2_CID_PRIVATE_LUMAFILTER:
1989 btv->opt_lumafilter = c->value;
1990 if (btv->opt_lumafilter) {
1991 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1992 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1994 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1995 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1998 case V4L2_CID_PRIVATE_AUTOMUTE:
1999 btv->opt_automute = c->value;
2001 case V4L2_CID_PRIVATE_AGC_CRUSH:
2002 btv->opt_adc_crush = c->value;
2003 btwrite(BT848_ADC_RESERVED |
2004 (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
2007 case V4L2_CID_PRIVATE_VCR_HACK:
2008 btv->opt_vcr_hack = c->value;
2010 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
2011 btv->opt_whitecrush_upper = c->value;
2012 btwrite(c->value, BT848_WC_UP);
2014 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
2015 btv->opt_whitecrush_lower = c->value;
2016 btwrite(c->value, BT848_WC_DOWN);
2018 case V4L2_CID_PRIVATE_UV_RATIO:
2019 btv->opt_uv_ratio = c->value;
2020 bt848_sat(btv, btv->saturation);
2022 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
2023 btv->opt_full_luma_range = c->value;
2024 btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM);
2026 case V4L2_CID_PRIVATE_CORING:
2027 btv->opt_coring = c->value;
2028 btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM);
2036 #ifdef CONFIG_VIDEO_ADV_DEBUG
2037 static int bttv_g_register(struct file *file, void *f,
2038 struct v4l2_register *reg)
2040 struct bttv_fh *fh = f;
2041 struct bttv *btv = fh->btv;
2043 if (!capable(CAP_SYS_ADMIN))
2046 if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
2049 /* bt848 has a 12-bit register space */
2051 reg->val = btread(reg->reg);
2056 static int bttv_s_register(struct file *file, void *f,
2057 struct v4l2_register *reg)
2059 struct bttv_fh *fh = f;
2060 struct bttv *btv = fh->btv;
2062 if (!capable(CAP_SYS_ADMIN))
2065 if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
2068 /* bt848 has a 12-bit register space */
2070 btwrite(reg->val, reg->reg);
2076 /* Given cropping boundaries b and the scaled width and height of a
2077 single field or frame, which must not exceed hardware limits, this
2078 function adjusts the cropping parameters c. */
2080 bttv_crop_adjust (struct bttv_crop * c,
2081 const struct v4l2_rect * b,
2084 enum v4l2_field field)
2086 __s32 frame_height = height << !V4L2_FIELD_HAS_BOTH(field);
2090 if (width < c->min_scaled_width) {
2091 /* Max. hor. scale factor 16:1. */
2092 c->rect.width = width * 16;
2093 } else if (width > c->max_scaled_width) {
2094 /* Min. hor. scale factor 1:1. */
2095 c->rect.width = width;
2097 max_left = b->left + b->width - width;
2098 max_left = min(max_left, (__s32) MAX_HDELAY);
2099 if (c->rect.left > max_left)
2100 c->rect.left = max_left;
2103 if (height < c->min_scaled_height) {
2104 /* Max. vert. scale factor 16:1, single fields 8:1. */
2105 c->rect.height = height * 16;
2106 } else if (frame_height > c->max_scaled_height) {
2107 /* Min. vert. scale factor 1:1.
2108 Top and height count field lines times two. */
2109 c->rect.height = (frame_height + 1) & ~1;
2111 max_top = b->top + b->height - c->rect.height;
2112 if (c->rect.top > max_top)
2113 c->rect.top = max_top;
2116 bttv_crop_calc_limits(c);
2119 /* Returns an error if scaling to a frame or single field with the given
2120 width and height is not possible with the current cropping parameters
2121 and width aligned according to width_mask. If adjust_size is TRUE the
2122 function may adjust the width and/or height instead, rounding width
2123 to (width + width_bias) & width_mask. If adjust_crop is TRUE it may
2124 also adjust the current cropping parameters to get closer to the
2125 desired image size. */
2127 limit_scaled_size (struct bttv_fh * fh,
2130 enum v4l2_field field,
2131 unsigned int width_mask,
2132 unsigned int width_bias,
2136 struct bttv *btv = fh->btv;
2137 const struct v4l2_rect *b;
2138 struct bttv_crop *c;
2145 BUG_ON((int) width_mask >= 0 ||
2146 width_bias >= (unsigned int) -width_mask);
2148 /* Make sure tvnorm, vbi_end and the current cropping parameters
2149 remain consistent until we're done. */
2150 mutex_lock(&btv->lock);
2152 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2154 /* Do crop - use current, don't - use default parameters. */
2155 c = &btv->crop[!!fh->do_crop];
2160 && !locked_btres(btv, VIDEO_RESOURCES)) {
2164 /* We cannot scale up. When the scaled image is larger
2165 than crop.rect we adjust the crop.rect as required
2166 by the V4L2 spec, hence cropcap.bounds are our limit. */
2167 max_width = min(b->width, (__s32) MAX_HACTIVE);
2168 max_height = b->height;
2170 /* We cannot capture the same line as video and VBI data.
2171 Note btv->vbi_end is really a minimum, see
2172 bttv_vbi_try_fmt(). */
2173 if (btv->vbi_end > b->top) {
2174 max_height -= btv->vbi_end - b->top;
2176 if (min_height > max_height)
2181 if (btv->vbi_end > c->rect.top)
2184 min_width = c->min_scaled_width;
2185 min_height = c->min_scaled_height;
2186 max_width = c->max_scaled_width;
2187 max_height = c->max_scaled_height;
2192 min_width = (min_width - width_mask - 1) & width_mask;
2193 max_width = max_width & width_mask;
2195 /* Max. scale factor is 16:1 for frames, 8:1 for fields. */
2196 min_height = min_height;
2197 /* Min. scale factor is 1:1. */
2198 max_height >>= !V4L2_FIELD_HAS_BOTH(field);
2201 *width = clamp(*width, min_width, max_width);
2202 *height = clamp(*height, min_height, max_height);
2204 /* Round after clamping to avoid overflow. */
2205 *width = (*width + width_bias) & width_mask;
2208 bttv_crop_adjust(c, b, *width, *height, field);
2210 if (btv->vbi_end > c->rect.top) {
2211 /* Move the crop window out of the way. */
2212 c->rect.top = btv->vbi_end;
2217 if (*width < min_width ||
2218 *height < min_height ||
2219 *width > max_width ||
2220 *height > max_height ||
2221 0 != (*width & ~width_mask))
2225 rc = 0; /* success */
2228 mutex_unlock(&btv->lock);
2233 /* Returns an error if the given overlay window dimensions are not
2234 possible with the current cropping parameters. If adjust_size is
2235 TRUE the function may adjust the window width and/or height
2236 instead, however it always rounds the horizontal position and
2237 width as btcx_align() does. If adjust_crop is TRUE the function
2238 may also adjust the current cropping parameters to get closer
2239 to the desired window size. */
2241 verify_window (struct bttv_fh * fh,
2242 struct v4l2_window * win,
2246 enum v4l2_field field;
2247 unsigned int width_mask;
2250 if (win->w.width < 48 || win->w.height < 32)
2252 if (win->clipcount > 2048)
2257 if (V4L2_FIELD_ANY == field) {
2260 height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
2261 field = (win->w.height > height2)
2262 ? V4L2_FIELD_INTERLACED
2266 case V4L2_FIELD_TOP:
2267 case V4L2_FIELD_BOTTOM:
2268 case V4L2_FIELD_INTERLACED:
2274 /* 4-byte alignment. */
2275 if (NULL == fh->ovfmt)
2278 switch (fh->ovfmt->depth) {
2292 win->w.width -= win->w.left & ~width_mask;
2293 win->w.left = (win->w.left - width_mask - 1) & width_mask;
2295 rc = limit_scaled_size(fh, &win->w.width, &win->w.height,
2297 /* width_bias: round down */ 0,
2298 adjust_size, adjust_crop);
2306 static int setup_window(struct bttv_fh *fh, struct bttv *btv,
2307 struct v4l2_window *win, int fixup)
2309 struct v4l2_clip *clips = NULL;
2310 int n,size,retval = 0;
2312 if (NULL == fh->ovfmt)
2314 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
2316 retval = verify_window(fh, win,
2317 /* adjust_size */ fixup,
2318 /* adjust_crop */ fixup);
2322 /* copy clips -- luckily v4l1 + v4l2 are binary
2323 compatible here ...*/
2325 size = sizeof(*clips)*(n+4);
2326 clips = kmalloc(size,GFP_KERNEL);
2330 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
2335 /* clip against screen */
2336 if (NULL != btv->fbuf.base)
2337 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
2339 btcx_sort_clips(clips,n);
2341 /* 4-byte alignments */
2342 switch (fh->ovfmt->depth) {
2345 btcx_align(&win->w, clips, n, 3);
2348 btcx_align(&win->w, clips, n, 1);
2351 /* no alignment fixups needed */
2357 mutex_lock(&fh->cap.lock);
2358 kfree(fh->ov.clips);
2359 fh->ov.clips = clips;
2363 fh->ov.field = win->field;
2364 fh->ov.setup_ok = 1;
2365 btv->init.ov.w.width = win->w.width;
2366 btv->init.ov.w.height = win->w.height;
2367 btv->init.ov.field = win->field;
2369 /* update overlay if needed */
2371 if (check_btres(fh, RESOURCE_OVERLAY)) {
2372 struct bttv_buffer *new;
2374 new = videobuf_pci_alloc(sizeof(*new));
2375 new->crop = btv->crop[!!fh->do_crop].rect;
2376 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2377 retval = bttv_switch_overlay(btv,fh,new);
2379 mutex_unlock(&fh->cap.lock);
2383 /* ----------------------------------------------------------------------- */
2385 static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
2387 struct videobuf_queue* q = NULL;
2390 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2393 case V4L2_BUF_TYPE_VBI_CAPTURE:
2402 static int bttv_resource(struct bttv_fh *fh)
2407 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2408 res = RESOURCE_VIDEO_STREAM;
2410 case V4L2_BUF_TYPE_VBI_CAPTURE:
2419 static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2421 struct videobuf_queue *q = bttv_queue(fh);
2422 int res = bttv_resource(fh);
2424 if (check_btres(fh,res))
2426 if (videobuf_queue_is_busy(q))
2433 pix_format_set_size (struct v4l2_pix_format * f,
2434 const struct bttv_format * fmt,
2436 unsigned int height)
2441 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2442 f->bytesperline = width; /* Y plane */
2443 f->sizeimage = (width * height * fmt->depth) >> 3;
2445 f->bytesperline = (width * fmt->depth) >> 3;
2446 f->sizeimage = height * f->bytesperline;
2450 static int bttv_g_fmt_cap(struct file *file, void *priv,
2451 struct v4l2_format *f)
2453 struct bttv_fh *fh = priv;
2455 pix_format_set_size(&f->fmt.pix, fh->fmt,
2456 fh->width, fh->height);
2457 f->fmt.pix.field = fh->cap.field;
2458 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2463 static int bttv_g_fmt_overlay(struct file *file, void *priv,
2464 struct v4l2_format *f)
2466 struct bttv_fh *fh = priv;
2468 f->fmt.win.w = fh->ov.w;
2469 f->fmt.win.field = fh->ov.field;
2474 static int bttv_try_fmt_cap(struct file *file, void *priv,
2475 struct v4l2_format *f)
2477 const struct bttv_format *fmt;
2478 struct bttv_fh *fh = priv;
2479 struct bttv *btv = fh->btv;
2480 enum v4l2_field field;
2481 __s32 width, height;
2483 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2487 field = f->fmt.pix.field;
2489 if (V4L2_FIELD_ANY == field) {
2492 height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
2493 field = (f->fmt.pix.height > height2)
2494 ? V4L2_FIELD_INTERLACED
2495 : V4L2_FIELD_BOTTOM;
2498 if (V4L2_FIELD_SEQ_BT == field)
2499 field = V4L2_FIELD_SEQ_TB;
2502 case V4L2_FIELD_TOP:
2503 case V4L2_FIELD_BOTTOM:
2504 case V4L2_FIELD_ALTERNATE:
2505 case V4L2_FIELD_INTERLACED:
2507 case V4L2_FIELD_SEQ_TB:
2508 if (fmt->flags & FORMAT_FLAGS_PLANAR)
2515 width = f->fmt.pix.width;
2516 height = f->fmt.pix.height;
2518 /* update data for the application */
2519 f->fmt.pix.field = field;
2520 pix_format_set_size(&f->fmt.pix, fmt, width, height);
2525 static int bttv_try_fmt_overlay(struct file *file, void *priv,
2526 struct v4l2_format *f)
2528 struct bttv_fh *fh = priv;
2530 return verify_window(fh, &f->fmt.win,
2531 /* adjust_size */ 1,
2532 /* adjust_crop */ 0);
2535 static int bttv_s_fmt_cap(struct file *file, void *priv,
2536 struct v4l2_format *f)
2539 const struct bttv_format *fmt;
2540 struct bttv_fh *fh = priv;
2541 struct bttv *btv = fh->btv;
2543 retval = bttv_switch_type(fh, f->type);
2547 retval = bttv_try_fmt_cap(file, priv, f);
2551 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2553 /* update our state informations */
2554 mutex_lock(&fh->cap.lock);
2556 fh->cap.field = f->fmt.pix.field;
2557 fh->cap.last = V4L2_FIELD_NONE;
2558 fh->width = f->fmt.pix.width;
2559 fh->height = f->fmt.pix.height;
2560 btv->init.fmt = fmt;
2561 btv->init.width = f->fmt.pix.width;
2562 btv->init.height = f->fmt.pix.height;
2563 mutex_unlock(&fh->cap.lock);
2568 static int bttv_s_fmt_overlay(struct file *file, void *priv,
2569 struct v4l2_format *f)
2571 struct bttv_fh *fh = priv;
2572 struct bttv *btv = fh->btv;
2577 return setup_window(fh, btv, &f->fmt.win, 1);
2580 #ifdef CONFIG_VIDEO_V4L1_COMPAT
2581 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
2585 struct bttv_fh *fh = priv;
2587 mutex_lock(&fh->cap.lock);
2588 retval = videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
2591 mutex_unlock(&fh->cap.lock);
2596 memset(mbuf, 0, sizeof(*mbuf));
2597 mbuf->frames = gbuffers;
2598 mbuf->size = gbuffers * gbufsize;
2600 for (i = 0; i < gbuffers; i++)
2601 mbuf->offsets[i] = i * gbufsize;
2603 mutex_unlock(&fh->cap.lock);
2608 static int bttv_querycap(struct file *file, void *priv,
2609 struct v4l2_capability *cap)
2611 struct bttv_fh *fh = priv;
2612 struct bttv *btv = fh->btv;
2617 strlcpy(cap->driver, "bttv", sizeof(cap->driver));
2618 strlcpy(cap->card, btv->video_dev->name, sizeof(cap->card));
2619 snprintf(cap->bus_info, sizeof(cap->bus_info),
2620 "PCI:%s", pci_name(btv->c.pci));
2621 cap->version = BTTV_VERSION_CODE;
2623 V4L2_CAP_VIDEO_CAPTURE |
2624 V4L2_CAP_VBI_CAPTURE |
2625 V4L2_CAP_READWRITE |
2627 if (no_overlay <= 0)
2628 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2630 if (bttv_tvcards[btv->c.type].tuner != UNSET &&
2631 bttv_tvcards[btv->c.type].tuner != TUNER_ABSENT)
2632 cap->capabilities |= V4L2_CAP_TUNER;
2636 static int bttv_enum_fmt_cap(struct file *file, void *priv,
2637 struct v4l2_fmtdesc *f)
2639 if (f->index >= FORMATS)
2642 strlcpy(f->description, formats[f->index].name, sizeof(f->description));
2643 f->pixelformat = formats[f->index].fourcc;
2648 static int bttv_enum_fmt_overlay(struct file *file, void *priv,
2649 struct v4l2_fmtdesc *f)
2651 if (no_overlay > 0) {
2652 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2656 if (f->index >= FORMATS)
2659 strlcpy(f->description, formats[f->index].name,
2660 sizeof(f->description));
2662 f->pixelformat = formats[f->index].fourcc;
2667 static int bttv_enum_fmt_vbi(struct file *file, void *priv,
2668 struct v4l2_fmtdesc *f)
2673 f->pixelformat = V4L2_PIX_FMT_GREY;
2674 strcpy(f->description, "vbi data");
2679 static int bttv_g_fbuf(struct file *file, void *f,
2680 struct v4l2_framebuffer *fb)
2682 struct bttv_fh *fh = f;
2683 struct bttv *btv = fh->btv;
2686 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2688 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2692 static int bttv_overlay(struct file *file, void *f, unsigned int on)
2694 struct bttv_fh *fh = f;
2695 struct bttv *btv = fh->btv;
2696 struct bttv_buffer *new;
2701 if (NULL == btv->fbuf.base)
2703 if (!fh->ov.setup_ok) {
2704 dprintk("bttv%d: overlay: !setup_ok\n", btv->c.nr);
2709 if (!check_alloc_btres(btv, fh, RESOURCE_OVERLAY))
2712 mutex_lock(&fh->cap.lock);
2714 fh->ov.tvnorm = btv->tvnorm;
2715 new = videobuf_pci_alloc(sizeof(*new));
2716 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2722 retval = bttv_switch_overlay(btv, fh, new);
2723 mutex_unlock(&fh->cap.lock);
2727 static int bttv_s_fbuf(struct file *file, void *f,
2728 struct v4l2_framebuffer *fb)
2730 struct bttv_fh *fh = f;
2731 struct bttv *btv = fh->btv;
2732 const struct bttv_format *fmt;
2735 if (!capable(CAP_SYS_ADMIN) &&
2736 !capable(CAP_SYS_RAWIO))
2740 fmt = format_by_fourcc(fb->fmt.pixelformat);
2743 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2747 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2748 __s32 width = fb->fmt.width;
2749 __s32 height = fb->fmt.height;
2751 retval = limit_scaled_size(fh, &width, &height,
2752 V4L2_FIELD_INTERLACED,
2753 /* width_mask */ ~3,
2755 /* adjust_size */ 0,
2756 /* adjust_crop */ 0);
2762 mutex_lock(&fh->cap.lock);
2763 btv->fbuf.base = fb->base;
2764 btv->fbuf.fmt.width = fb->fmt.width;
2765 btv->fbuf.fmt.height = fb->fmt.height;
2766 if (0 != fb->fmt.bytesperline)
2767 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2769 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2773 btv->init.ovfmt = fmt;
2774 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2777 fh->ov.w.width = fb->fmt.width;
2778 fh->ov.w.height = fb->fmt.height;
2779 btv->init.ov.w.width = fb->fmt.width;
2780 btv->init.ov.w.height = fb->fmt.height;
2781 kfree(fh->ov.clips);
2782 fh->ov.clips = NULL;
2785 if (check_btres(fh, RESOURCE_OVERLAY)) {
2786 struct bttv_buffer *new;
2788 new = videobuf_pci_alloc(sizeof(*new));
2789 new->crop = btv->crop[!!fh->do_crop].rect;
2790 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2791 retval = bttv_switch_overlay(btv, fh, new);
2794 mutex_unlock(&fh->cap.lock);
2798 static int bttv_reqbufs(struct file *file, void *priv,
2799 struct v4l2_requestbuffers *p)
2801 struct bttv_fh *fh = priv;
2802 return videobuf_reqbufs(bttv_queue(fh), p);
2805 static int bttv_querybuf(struct file *file, void *priv,
2806 struct v4l2_buffer *b)
2808 struct bttv_fh *fh = priv;
2809 return videobuf_querybuf(bttv_queue(fh), b);
2812 static int bttv_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2814 struct bttv_fh *fh = priv;
2815 struct bttv *btv = fh->btv;
2816 int res = bttv_resource(fh);
2818 if (!check_alloc_btres(btv, fh, res))
2821 return videobuf_qbuf(bttv_queue(fh), b);
2824 static int bttv_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2826 struct bttv_fh *fh = priv;
2827 return videobuf_dqbuf(bttv_queue(fh), b,
2828 file->f_flags & O_NONBLOCK);
2831 static int bttv_streamon(struct file *file, void *priv,
2832 enum v4l2_buf_type type)
2834 struct bttv_fh *fh = priv;
2835 struct bttv *btv = fh->btv;
2836 int res = bttv_resource(fh);
2838 if (!check_alloc_btres(btv, fh, res))
2840 return videobuf_streamon(bttv_queue(fh));
2844 static int bttv_streamoff(struct file *file, void *priv,
2845 enum v4l2_buf_type type)
2847 struct bttv_fh *fh = priv;
2848 struct bttv *btv = fh->btv;
2850 int res = bttv_resource(fh);
2853 retval = videobuf_streamoff(bttv_queue(fh));
2856 free_btres(btv, fh, res);
2860 static int bttv_queryctrl(struct file *file, void *priv,
2861 struct v4l2_queryctrl *c)
2863 struct bttv_fh *fh = priv;
2864 struct bttv *btv = fh->btv;
2865 const struct v4l2_queryctrl *ctrl;
2867 if ((c->id < V4L2_CID_BASE ||
2868 c->id >= V4L2_CID_LASTP1) &&
2869 (c->id < V4L2_CID_PRIVATE_BASE ||
2870 c->id >= V4L2_CID_PRIVATE_LASTP1))
2873 ctrl = ctrl_by_id(c->id);
2874 *c = (NULL != ctrl) ? *ctrl : no_ctl;
2876 if (!btv->volume_gpio &&
2877 (ctrl->id == V4L2_CID_AUDIO_VOLUME))
2883 static int bttv_g_parm(struct file *file, void *f,
2884 struct v4l2_streamparm *parm)
2886 struct bttv_fh *fh = f;
2887 struct bttv *btv = fh->btv;
2888 struct v4l2_standard s;
2890 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2892 v4l2_video_std_construct(&s, bttv_tvnorms[btv->tvnorm].v4l2_id,
2893 bttv_tvnorms[btv->tvnorm].name);
2894 parm->parm.capture.timeperframe = s.frameperiod;
2898 static int bttv_g_tuner(struct file *file, void *priv,
2899 struct v4l2_tuner *t)
2901 struct bttv_fh *fh = priv;
2902 struct bttv *btv = fh->btv;
2904 if (UNSET == bttv_tvcards[btv->c.type].tuner)
2909 mutex_lock(&btv->lock);
2910 memset(t, 0, sizeof(*t));
2911 t->rxsubchans = V4L2_TUNER_SUB_MONO;
2912 bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
2913 strcpy(t->name, "Television");
2914 t->capability = V4L2_TUNER_CAP_NORM;
2915 t->type = V4L2_TUNER_ANALOG_TV;
2916 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
2919 if (btv->audio_mode_gpio)
2920 btv->audio_mode_gpio(btv, t, 0);
2922 mutex_unlock(&btv->lock);
2926 static int bttv_g_priority(struct file *file, void *f, enum v4l2_priority *p)
2928 struct bttv_fh *fh = f;
2929 struct bttv *btv = fh->btv;
2931 *p = v4l2_prio_max(&btv->prio);
2936 static int bttv_s_priority(struct file *file, void *f,
2937 enum v4l2_priority prio)
2939 struct bttv_fh *fh = f;
2940 struct bttv *btv = fh->btv;
2942 return v4l2_prio_change(&btv->prio, &fh->prio, prio);
2945 static int bttv_cropcap(struct file *file, void *priv,
2946 struct v4l2_cropcap *cap)
2948 struct bttv_fh *fh = priv;
2949 struct bttv *btv = fh->btv;
2951 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2952 cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2955 *cap = bttv_tvnorms[btv->tvnorm].cropcap;
2960 static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
2962 struct bttv_fh *fh = f;
2963 struct bttv *btv = fh->btv;
2965 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2966 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2969 /* No fh->do_crop = 1; because btv->crop[1] may be
2970 inconsistent with fh->width or fh->height and apps
2971 do not expect a change here. */
2973 crop->c = btv->crop[!!fh->do_crop].rect;
2978 static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
2980 struct bttv_fh *fh = f;
2981 struct bttv *btv = fh->btv;
2982 const struct v4l2_rect *b;
2990 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2991 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2994 retval = v4l2_prio_check(&btv->prio, &fh->prio);
2998 /* Make sure tvnorm, vbi_end and the current cropping
2999 parameters remain consistent until we're done. Note
3000 read() may change vbi_end in check_alloc_btres(). */
3001 mutex_lock(&btv->lock);
3005 if (locked_btres(fh->btv, VIDEO_RESOURCES)) {
3006 mutex_unlock(&btv->lock);
3010 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
3013 b_right = b_left + b->width;
3014 b_bottom = b->top + b->height;
3016 b_top = max(b->top, btv->vbi_end);
3017 if (b_top + 32 >= b_bottom) {
3018 mutex_unlock(&btv->lock);
3022 /* Min. scaled size 48 x 32. */
3023 c.rect.left = clamp(crop->c.left, b_left, b_right - 48);
3024 c.rect.left = min(c.rect.left, (__s32) MAX_HDELAY);
3026 c.rect.width = clamp(crop->c.width,
3027 48, b_right - c.rect.left);
3029 c.rect.top = clamp(crop->c.top, b_top, b_bottom - 32);
3030 /* Top and height must be a multiple of two. */
3031 c.rect.top = (c.rect.top + 1) & ~1;
3033 c.rect.height = clamp(crop->c.height,
3034 32, b_bottom - c.rect.top);
3035 c.rect.height = (c.rect.height + 1) & ~1;
3037 bttv_crop_calc_limits(&c);
3041 mutex_unlock(&btv->lock);
3045 mutex_lock(&fh->cap.lock);
3047 if (fh->width < c.min_scaled_width) {
3048 fh->width = c.min_scaled_width;
3049 btv->init.width = c.min_scaled_width;
3050 } else if (fh->width > c.max_scaled_width) {
3051 fh->width = c.max_scaled_width;
3052 btv->init.width = c.max_scaled_width;
3055 if (fh->height < c.min_scaled_height) {
3056 fh->height = c.min_scaled_height;
3057 btv->init.height = c.min_scaled_height;
3058 } else if (fh->height > c.max_scaled_height) {
3059 fh->height = c.max_scaled_height;
3060 btv->init.height = c.max_scaled_height;
3063 mutex_unlock(&fh->cap.lock);
3068 static int bttv_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
3070 strcpy(a->name, "audio");
3074 static int bttv_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
3079 static ssize_t bttv_read(struct file *file, char __user *data,
3080 size_t count, loff_t *ppos)
3082 struct bttv_fh *fh = file->private_data;
3085 if (fh->btv->errors)
3086 bttv_reinit_bt848(fh->btv);
3087 dprintk("bttv%d: read count=%d type=%s\n",
3088 fh->btv->c.nr,(int)count,v4l2_type_names[fh->type]);
3091 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3092 if (!check_alloc_btres(fh->btv, fh, RESOURCE_VIDEO_READ)) {
3093 /* VIDEO_READ in use by another fh,
3094 or VIDEO_STREAM by any fh. */
3097 retval = videobuf_read_one(&fh->cap, data, count, ppos,
3098 file->f_flags & O_NONBLOCK);
3099 free_btres(fh->btv, fh, RESOURCE_VIDEO_READ);
3101 case V4L2_BUF_TYPE_VBI_CAPTURE:
3102 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
3104 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
3105 file->f_flags & O_NONBLOCK);
3113 static unsigned int bttv_poll(struct file *file, poll_table *wait)
3115 struct bttv_fh *fh = file->private_data;
3116 struct bttv_buffer *buf;
3117 enum v4l2_field field;
3119 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
3120 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
3122 return videobuf_poll_stream(file, &fh->vbi, wait);
3125 if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
3126 /* streaming capture */
3127 if (list_empty(&fh->cap.stream))
3129 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
3131 /* read() capture */
3132 mutex_lock(&fh->cap.lock);
3133 if (NULL == fh->cap.read_buf) {
3134 /* need to capture a new frame */
3135 if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM)) {
3136 mutex_unlock(&fh->cap.lock);
3139 fh->cap.read_buf = videobuf_pci_alloc(fh->cap.msize);
3140 if (NULL == fh->cap.read_buf) {
3141 mutex_unlock(&fh->cap.lock);
3144 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
3145 field = videobuf_next_field(&fh->cap);
3146 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
3147 kfree (fh->cap.read_buf);
3148 fh->cap.read_buf = NULL;
3149 mutex_unlock(&fh->cap.lock);
3152 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
3153 fh->cap.read_off = 0;
3155 mutex_unlock(&fh->cap.lock);
3156 buf = (struct bttv_buffer*)fh->cap.read_buf;
3159 poll_wait(file, &buf->vb.done, wait);
3160 if (buf->vb.state == VIDEOBUF_DONE ||
3161 buf->vb.state == VIDEOBUF_ERROR)
3162 return POLLIN|POLLRDNORM;
3166 static int bttv_open(struct inode *inode, struct file *file)
3168 int minor = iminor(inode);
3169 struct bttv *btv = NULL;
3171 enum v4l2_buf_type type = 0;
3174 dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
3176 for (i = 0; i < bttv_num; i++) {
3177 if (bttvs[i].video_dev &&
3178 bttvs[i].video_dev->minor == minor) {
3180 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3183 if (bttvs[i].vbi_dev &&
3184 bttvs[i].vbi_dev->minor == minor) {
3186 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3193 dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
3194 btv->c.nr,v4l2_type_names[type]);
3196 /* allocate per filehandle data */
3197 fh = kmalloc(sizeof(*fh),GFP_KERNEL);
3200 file->private_data = fh;
3203 fh->ov.setup_ok = 0;
3204 v4l2_prio_open(&btv->prio,&fh->prio);
3206 videobuf_queue_pci_init(&fh->cap, &bttv_video_qops,
3207 btv->c.pci, &btv->s_lock,
3208 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3209 V4L2_FIELD_INTERLACED,
3210 sizeof(struct bttv_buffer),
3212 videobuf_queue_pci_init(&fh->vbi, &bttv_vbi_qops,
3213 btv->c.pci, &btv->s_lock,
3214 V4L2_BUF_TYPE_VBI_CAPTURE,
3216 sizeof(struct bttv_buffer),
3218 set_tvnorm(btv,btv->tvnorm);
3222 /* The V4L2 spec requires one global set of cropping parameters
3223 which only change on request. These are stored in btv->crop[1].
3224 However for compatibility with V4L apps and cropping unaware
3225 V4L2 apps we now reset the cropping parameters as seen through
3226 this fh, which is to say VIDIOC_G_CROP and scaling limit checks
3227 will use btv->crop[0], the default cropping parameters for the
3228 current video standard, and VIDIOC_S_FMT will not implicitely
3229 change the cropping parameters until VIDIOC_S_CROP has been
3231 fh->do_crop = !reset_crop; /* module parameter */
3233 /* Likewise there should be one global set of VBI capture
3234 parameters, but for compatibility with V4L apps and earlier
3235 driver versions each fh has its own parameters. */
3236 bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
3238 bttv_field_count(btv);
3242 static int bttv_release(struct inode *inode, struct file *file)
3244 struct bttv_fh *fh = file->private_data;
3245 struct bttv *btv = fh->btv;
3247 /* turn off overlay */
3248 if (check_btres(fh, RESOURCE_OVERLAY))
3249 bttv_switch_overlay(btv,fh,NULL);
3251 /* stop video capture */
3252 if (check_btres(fh, RESOURCE_VIDEO_STREAM)) {
3253 videobuf_streamoff(&fh->cap);
3254 free_btres(btv,fh,RESOURCE_VIDEO_STREAM);
3256 if (fh->cap.read_buf) {
3257 buffer_release(&fh->cap,fh->cap.read_buf);
3258 kfree(fh->cap.read_buf);
3260 if (check_btres(fh, RESOURCE_VIDEO_READ)) {
3261 free_btres(btv, fh, RESOURCE_VIDEO_READ);
3264 /* stop vbi capture */
3265 if (check_btres(fh, RESOURCE_VBI)) {
3266 videobuf_stop(&fh->vbi);
3267 free_btres(btv,fh,RESOURCE_VBI);
3271 videobuf_mmap_free(&fh->cap);
3272 videobuf_mmap_free(&fh->vbi);
3273 v4l2_prio_close(&btv->prio,&fh->prio);
3274 file->private_data = NULL;
3278 bttv_field_count(btv);
3283 bttv_mmap(struct file *file, struct vm_area_struct *vma)
3285 struct bttv_fh *fh = file->private_data;
3287 dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
3288 fh->btv->c.nr, v4l2_type_names[fh->type],
3289 vma->vm_start, vma->vm_end - vma->vm_start);
3290 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3293 static const struct file_operations bttv_fops =
3295 .owner = THIS_MODULE,
3297 .release = bttv_release,
3298 .ioctl = video_ioctl2,
3299 .compat_ioctl = v4l_compat_ioctl32,
3300 .llseek = no_llseek,
3306 static struct video_device bttv_video_template =
3309 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|
3310 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
3313 .vidioc_querycap = bttv_querycap,
3314 .vidioc_enum_fmt_cap = bttv_enum_fmt_cap,
3315 .vidioc_g_fmt_cap = bttv_g_fmt_cap,
3316 .vidioc_try_fmt_cap = bttv_try_fmt_cap,
3317 .vidioc_s_fmt_cap = bttv_s_fmt_cap,
3318 .vidioc_enum_fmt_overlay = bttv_enum_fmt_overlay,
3319 .vidioc_g_fmt_overlay = bttv_g_fmt_overlay,
3320 .vidioc_try_fmt_overlay = bttv_try_fmt_overlay,
3321 .vidioc_s_fmt_overlay = bttv_s_fmt_overlay,
3322 .vidioc_enum_fmt_vbi = bttv_enum_fmt_vbi,
3323 .vidioc_g_fmt_vbi = bttv_g_fmt_vbi,
3324 .vidioc_try_fmt_vbi = bttv_try_fmt_vbi,
3325 .vidioc_s_fmt_vbi = bttv_s_fmt_vbi,
3326 .vidioc_g_audio = bttv_g_audio,
3327 .vidioc_s_audio = bttv_s_audio,
3328 .vidioc_cropcap = bttv_cropcap,
3329 .vidioc_reqbufs = bttv_reqbufs,
3330 .vidioc_querybuf = bttv_querybuf,
3331 .vidioc_qbuf = bttv_qbuf,
3332 .vidioc_dqbuf = bttv_dqbuf,
3333 .vidioc_s_std = bttv_s_std,
3334 .vidioc_enum_input = bttv_enum_input,
3335 .vidioc_g_input = bttv_g_input,
3336 .vidioc_s_input = bttv_s_input,
3337 .vidioc_queryctrl = bttv_queryctrl,
3338 .vidioc_g_ctrl = bttv_g_ctrl,
3339 .vidioc_s_ctrl = bttv_s_ctrl,
3340 .vidioc_streamon = bttv_streamon,
3341 .vidioc_streamoff = bttv_streamoff,
3342 .vidioc_g_tuner = bttv_g_tuner,
3343 .vidioc_s_tuner = bttv_s_tuner,
3344 #ifdef CONFIG_VIDEO_V4L1_COMPAT
3345 .vidiocgmbuf = vidiocgmbuf,
3347 .vidioc_g_crop = bttv_g_crop,
3348 .vidioc_g_crop = bttv_g_crop,
3349 .vidioc_s_crop = bttv_s_crop,
3350 .vidioc_g_fbuf = bttv_g_fbuf,
3351 .vidioc_s_fbuf = bttv_s_fbuf,
3352 .vidioc_overlay = bttv_overlay,
3353 .vidioc_g_priority = bttv_g_priority,
3354 .vidioc_s_priority = bttv_s_priority,
3355 .vidioc_g_parm = bttv_g_parm,
3356 .vidioc_g_frequency = bttv_g_frequency,
3357 .vidioc_s_frequency = bttv_s_frequency,
3358 .vidioc_log_status = bttv_log_status,
3359 .vidioc_querystd = bttv_querystd,
3360 .vidioc_g_register = bttv_g_register,
3361 .vidioc_s_register = bttv_s_register,
3362 .tvnorms = BTTV_NORMS,
3363 .current_norm = V4L2_STD_PAL,
3366 static struct video_device bttv_vbi_template =
3368 .name = "bt848/878 vbi",
3369 .type = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
3374 /* ----------------------------------------------------------------------- */
3375 /* radio interface */
3377 static int radio_open(struct inode *inode, struct file *file)
3379 int minor = iminor(inode);
3380 struct bttv *btv = NULL;
3383 dprintk("bttv: open minor=%d\n",minor);
3385 for (i = 0; i < bttv_num; i++) {
3386 if (bttvs[i].radio_dev->minor == minor) {
3394 dprintk("bttv%d: open called (radio)\n",btv->c.nr);
3395 mutex_lock(&btv->lock);
3399 file->private_data = btv;
3401 bttv_call_i2c_clients(btv,AUDC_SET_RADIO,NULL);
3402 audio_input(btv,TVAUDIO_INPUT_RADIO);
3404 mutex_unlock(&btv->lock);
3408 static int radio_release(struct inode *inode, struct file *file)
3410 struct bttv *btv = file->private_data;
3411 struct rds_command cmd;
3415 bttv_call_i2c_clients(btv, RDS_CMD_CLOSE, &cmd);
3420 static int radio_querycap(struct file *file, void *priv,
3421 struct v4l2_capability *cap)
3423 struct bttv_fh *fh = priv;
3424 struct bttv *btv = fh->btv;
3426 strcpy(cap->driver, "bttv");
3427 strlcpy(cap->card, btv->radio_dev->name, sizeof(cap->card));
3428 sprintf(cap->bus_info, "PCI:%s", pci_name(btv->c.pci));
3429 cap->version = BTTV_VERSION_CODE;
3430 cap->capabilities = V4L2_CAP_TUNER;
3435 static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
3437 struct bttv_fh *fh = priv;
3438 struct bttv *btv = fh->btv;
3440 if (UNSET == bttv_tvcards[btv->c.type].tuner)
3444 mutex_lock(&btv->lock);
3445 memset(t, 0, sizeof(*t));
3446 strcpy(t->name, "Radio");
3447 t->type = V4L2_TUNER_RADIO;
3449 bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
3451 if (btv->audio_mode_gpio)
3452 btv->audio_mode_gpio(btv, t, 0);
3454 mutex_unlock(&btv->lock);
3459 static int radio_enum_input(struct file *file, void *priv,
3460 struct v4l2_input *i)
3465 strcpy(i->name, "Radio");
3466 i->type = V4L2_INPUT_TYPE_TUNER;
3471 static int radio_g_audio(struct file *file, void *priv,
3472 struct v4l2_audio *a)
3474 memset(a, 0, sizeof(*a));
3475 strcpy(a->name, "Radio");
3479 static int radio_s_tuner(struct file *file, void *priv,
3480 struct v4l2_tuner *t)
3482 struct bttv_fh *fh = priv;
3483 struct bttv *btv = fh->btv;
3488 bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
3492 static int radio_s_audio(struct file *file, void *priv,
3493 struct v4l2_audio *a)
3498 static int radio_s_input(struct file *filp, void *priv, unsigned int i)
3503 static int radio_s_std(struct file *file, void *fh, v4l2_std_id *norm)
3508 static int radio_queryctrl(struct file *file, void *priv,
3509 struct v4l2_queryctrl *c)
3511 const struct v4l2_queryctrl *ctrl;
3513 if (c->id < V4L2_CID_BASE ||
3514 c->id >= V4L2_CID_LASTP1)
3517 if (c->id == V4L2_CID_AUDIO_MUTE) {
3518 ctrl = ctrl_by_id(c->id);
3526 static int radio_g_input(struct file *filp, void *priv, unsigned int *i)
3532 static ssize_t radio_read(struct file *file, char __user *data,
3533 size_t count, loff_t *ppos)
3535 struct bttv *btv = file->private_data;
3536 struct rds_command cmd;
3537 cmd.block_count = count/3;
3539 cmd.instance = file;
3540 cmd.result = -ENODEV;
3542 bttv_call_i2c_clients(btv, RDS_CMD_READ, &cmd);
3547 static unsigned int radio_poll(struct file *file, poll_table *wait)
3549 struct bttv *btv = file->private_data;
3550 struct rds_command cmd;
3551 cmd.instance = file;
3552 cmd.event_list = wait;
3553 cmd.result = -ENODEV;
3554 bttv_call_i2c_clients(btv, RDS_CMD_POLL, &cmd);
3559 static const struct file_operations radio_fops =
3561 .owner = THIS_MODULE,
3564 .release = radio_release,
3565 .ioctl = video_ioctl2,
3566 .llseek = no_llseek,
3570 static struct video_device radio_template =
3572 .name = "bt848/878 radio",
3573 .type = VID_TYPE_TUNER,
3574 .fops = &radio_fops,
3576 .vidioc_querycap = radio_querycap,
3577 .vidioc_g_tuner = radio_g_tuner,
3578 .vidioc_enum_input = radio_enum_input,
3579 .vidioc_g_audio = radio_g_audio,
3580 .vidioc_s_tuner = radio_s_tuner,
3581 .vidioc_s_audio = radio_s_audio,
3582 .vidioc_s_input = radio_s_input,
3583 .vidioc_s_std = radio_s_std,
3584 .vidioc_queryctrl = radio_queryctrl,
3585 .vidioc_g_input = radio_g_input,
3586 .vidioc_g_ctrl = bttv_g_ctrl,
3587 .vidioc_s_ctrl = bttv_s_ctrl,
3588 .vidioc_g_frequency = bttv_g_frequency,
3589 .vidioc_s_frequency = bttv_s_frequency,
3592 /* ----------------------------------------------------------------------- */
3593 /* some debug code */
3595 static int bttv_risc_decode(u32 risc)
3597 static char *instr[16] = {
3598 [ BT848_RISC_WRITE >> 28 ] = "write",
3599 [ BT848_RISC_SKIP >> 28 ] = "skip",
3600 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3601 [ BT848_RISC_JUMP >> 28 ] = "jump",
3602 [ BT848_RISC_SYNC >> 28 ] = "sync",
3603 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3604 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3605 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3607 static int incr[16] = {
3608 [ BT848_RISC_WRITE >> 28 ] = 2,
3609 [ BT848_RISC_JUMP >> 28 ] = 2,
3610 [ BT848_RISC_SYNC >> 28 ] = 2,
3611 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3612 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3613 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3615 static char *bits[] = {
3616 "be0", "be1", "be2", "be3/resync",
3617 "set0", "set1", "set2", "set3",
3618 "clr0", "clr1", "clr2", "clr3",
3619 "irq", "res", "eol", "sol",
3623 printk("0x%08x [ %s", risc,
3624 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3625 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3626 if (risc & (1 << (i + 12)))
3627 printk(" %s",bits[i]);
3628 printk(" count=%d ]\n", risc & 0xfff);
3629 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3632 static void bttv_risc_disasm(struct bttv *btv,
3633 struct btcx_riscmem *risc)
3637 printk("%s: risc disasm: %p [dma=0x%08lx]\n",
3638 btv->c.name, risc->cpu, (unsigned long)risc->dma);
3639 for (i = 0; i < (risc->size >> 2); i += n) {
3640 printk("%s: 0x%lx: ", btv->c.name,
3641 (unsigned long)(risc->dma + (i<<2)));
3642 n = bttv_risc_decode(risc->cpu[i]);
3643 for (j = 1; j < n; j++)
3644 printk("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3645 btv->c.name, (unsigned long)(risc->dma + ((i+j)<<2)),
3647 if (0 == risc->cpu[i])
3652 static void bttv_print_riscaddr(struct bttv *btv)
3654 printk(" main: %08Lx\n",
3655 (unsigned long long)btv->main.dma);
3656 printk(" vbi : o=%08Lx e=%08Lx\n",
3657 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3658 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3659 printk(" cap : o=%08Lx e=%08Lx\n",
3660 btv->curr.top ? (unsigned long long)btv->curr.top->top.dma : 0,
3661 btv->curr.bottom ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3662 printk(" scr : o=%08Lx e=%08Lx\n",
3663 btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3664 btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3665 bttv_risc_disasm(btv, &btv->main);
3668 /* ----------------------------------------------------------------------- */
3671 static char *irq_name[] = {
3672 "FMTCHG", // format change detected (525 vs. 625)
3673 "VSYNC", // vertical sync (new field)
3674 "HSYNC", // horizontal sync
3675 "OFLOW", // chroma/luma AGC overflow
3676 "HLOCK", // horizontal lock changed
3677 "VPRES", // video presence changed
3679 "I2CDONE", // hw irc operation finished
3680 "GPINT", // gpio port triggered irq
3682 "RISCI", // risc instruction triggered irq
3683 "FBUS", // pixel data fifo dropped data (high pci bus latencies)
3684 "FTRGT", // pixel data fifo overrun
3685 "FDSR", // fifo data stream resyncronisation
3686 "PPERR", // parity error (data transfer)
3687 "RIPERR", // parity error (read risc instructions)
3688 "PABORT", // pci abort
3689 "OCERR", // risc instruction error
3690 "SCERR", // syncronisation error
3693 static void bttv_print_irqbits(u32 print, u32 mark)
3698 for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3699 if (print & (1 << i))
3700 printk(" %s",irq_name[i]);
3701 if (mark & (1 << i))
3706 static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3708 printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3710 (unsigned long)btv->main.dma,
3711 (unsigned long)btv->main.cpu[RISC_SLOT_O_VBI+1],
3712 (unsigned long)btv->main.cpu[RISC_SLOT_O_FIELD+1],
3715 if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3716 printk("bttv%d: Oh, there (temporarely?) is no input signal. "
3717 "Ok, then this is harmless, don't worry ;)\n",
3721 printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
3723 printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
3729 bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3731 struct bttv_buffer *item;
3733 memset(set,0,sizeof(*set));
3735 /* capture request ? */
3736 if (!list_empty(&btv->capture)) {
3738 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3739 if (V4L2_FIELD_HAS_TOP(item->vb.field))
3741 if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3744 /* capture request for other field ? */
3745 if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3746 (item->vb.queue.next != &btv->capture)) {
3747 item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3748 if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3749 if (NULL == set->top &&
3750 V4L2_FIELD_TOP == item->vb.field) {
3753 if (NULL == set->bottom &&
3754 V4L2_FIELD_BOTTOM == item->vb.field) {
3757 if (NULL != set->top && NULL != set->bottom)
3763 /* screen overlay ? */
3764 if (NULL != btv->screen) {
3765 if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3766 if (NULL == set->top && NULL == set->bottom) {
3767 set->top = btv->screen;
3768 set->bottom = btv->screen;
3771 if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3773 set->top = btv->screen;
3775 if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3776 NULL == set->bottom) {
3777 set->bottom = btv->screen;
3782 dprintk("bttv%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3783 btv->c.nr,set->top, set->bottom,
3784 btv->screen,set->frame_irq,set->top_irq);
3789 bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3790 struct bttv_buffer_set *curr, unsigned int state)
3794 do_gettimeofday(&ts);
3796 if (wakeup->top == wakeup->bottom) {
3797 if (NULL != wakeup->top && curr->top != wakeup->top) {
3799 printk("bttv%d: wakeup: both=%p\n",btv->c.nr,wakeup->top);
3800 wakeup->top->vb.ts = ts;
3801 wakeup->top->vb.field_count = btv->field_count;
3802 wakeup->top->vb.state = state;
3803 wake_up(&wakeup->top->vb.done);
3806 if (NULL != wakeup->top && curr->top != wakeup->top) {
3808 printk("bttv%d: wakeup: top=%p\n",btv->c.nr,wakeup->top);
3809 wakeup->top->vb.ts = ts;
3810 wakeup->top->vb.field_count = btv->field_count;
3811 wakeup->top->vb.state = state;
3812 wake_up(&wakeup->top->vb.done);
3814 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3816 printk("bttv%d: wakeup: bottom=%p\n",btv->c.nr,wakeup->bottom);
3817 wakeup->bottom->vb.ts = ts;
3818 wakeup->bottom->vb.field_count = btv->field_count;
3819 wakeup->bottom->vb.state = state;
3820 wake_up(&wakeup->bottom->vb.done);
3826 bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3834 do_gettimeofday(&ts);
3836 wakeup->vb.field_count = btv->field_count;
3837 wakeup->vb.state = state;
3838 wake_up(&wakeup->vb.done);
3841 static void bttv_irq_timeout(unsigned long data)
3843 struct bttv *btv = (struct bttv *)data;
3844 struct bttv_buffer_set old,new;
3845 struct bttv_buffer *ovbi;
3846 struct bttv_buffer *item;
3847 unsigned long flags;
3850 printk(KERN_INFO "bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3851 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3852 btread(BT848_RISC_COUNT));
3853 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3857 spin_lock_irqsave(&btv->s_lock,flags);
3859 /* deactivate stuff */
3860 memset(&new,0,sizeof(new));
3866 bttv_buffer_activate_video(btv, &new);
3867 bttv_buffer_activate_vbi(btv, NULL);
3868 bttv_set_dma(btv, 0);
3871 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_ERROR);
3872 bttv_irq_wakeup_vbi(btv, ovbi, VIDEOBUF_ERROR);
3874 /* cancel all outstanding capture / vbi requests */
3875 while (!list_empty(&btv->capture)) {
3876 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3877 list_del(&item->vb.queue);
3878 item->vb.state = VIDEOBUF_ERROR;
3879 wake_up(&item->vb.done);
3881 while (!list_empty(&btv->vcapture)) {
3882 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3883 list_del(&item->vb.queue);
3884 item->vb.state = VIDEOBUF_ERROR;
3885 wake_up(&item->vb.done);
3889 spin_unlock_irqrestore(&btv->s_lock,flags);
3893 bttv_irq_wakeup_top(struct bttv *btv)
3895 struct bttv_buffer *wakeup = btv->curr.top;
3900 spin_lock(&btv->s_lock);
3901 btv->curr.top_irq = 0;
3902 btv->curr.top = NULL;
3903 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3905 do_gettimeofday(&wakeup->vb.ts);
3906 wakeup->vb.field_count = btv->field_count;
3907 wakeup->vb.state = VIDEOBUF_DONE;
3908 wake_up(&wakeup->vb.done);
3909 spin_unlock(&btv->s_lock);
3912 static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3916 if (rc > risc->dma + risc->size)
3922 bttv_irq_switch_video(struct bttv *btv)
3924 struct bttv_buffer_set new;
3925 struct bttv_buffer_set old;
3928 spin_lock(&btv->s_lock);
3930 /* new buffer set */
3931 bttv_irq_next_video(btv, &new);
3932 rc = btread(BT848_RISC_COUNT);
3933 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3934 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3937 bttv_irq_debug_low_latency(btv, rc);
3938 spin_unlock(&btv->s_lock);
3945 btv->loop_irq &= ~1;
3946 bttv_buffer_activate_video(btv, &new);
3947 bttv_set_dma(btv, 0);
3950 if (UNSET != btv->new_input) {
3951 video_mux(btv,btv->new_input);
3952 btv->new_input = UNSET;
3955 /* wake up finished buffers */
3956 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_DONE);
3957 spin_unlock(&btv->s_lock);
3961 bttv_irq_switch_vbi(struct bttv *btv)
3963 struct bttv_buffer *new = NULL;
3964 struct bttv_buffer *old;
3967 spin_lock(&btv->s_lock);
3969 if (!list_empty(&btv->vcapture))
3970 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3973 rc = btread(BT848_RISC_COUNT);
3974 if (NULL != old && (is_active(&old->top, rc) ||
3975 is_active(&old->bottom, rc))) {
3978 bttv_irq_debug_low_latency(btv, rc);
3979 spin_unlock(&btv->s_lock);
3985 btv->loop_irq &= ~4;
3986 bttv_buffer_activate_vbi(btv, new);
3987 bttv_set_dma(btv, 0);
3989 bttv_irq_wakeup_vbi(btv, old, VIDEOBUF_DONE);
3990 spin_unlock(&btv->s_lock);
3993 static irqreturn_t bttv_irq(int irq, void *dev_id)
4001 btv=(struct bttv *)dev_id;
4003 if (btv->custom_irq)
4004 handled = btv->custom_irq(btv);
4008 /* get/clear interrupt status bits */
4009 stat=btread(BT848_INT_STAT);
4010 astat=stat&btread(BT848_INT_MASK);
4014 btwrite(stat,BT848_INT_STAT);
4016 /* get device status bits */
4017 dstat=btread(BT848_DSTATUS);
4020 printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d "
4021 "riscs=%x, riscc=%08x, ",
4022 btv->c.nr, count, btv->field_count,
4023 stat>>28, btread(BT848_RISC_COUNT));
4024 bttv_print_irqbits(stat,astat);
4025 if (stat & BT848_INT_HLOCK)
4026 printk(" HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
4028 if (stat & BT848_INT_VPRES)
4029 printk(" PRES => %s", (dstat & BT848_DSTATUS_PRES)
4031 if (stat & BT848_INT_FMTCHG)
4032 printk(" NUML => %s", (dstat & BT848_DSTATUS_NUML)
4037 if (astat&BT848_INT_VSYNC)
4040 if ((astat & BT848_INT_GPINT) && btv->remote) {
4041 wake_up(&btv->gpioq);
4042 bttv_input_irq(btv);
4045 if (astat & BT848_INT_I2CDONE) {
4046 btv->i2c_done = stat;
4047 wake_up(&btv->i2c_queue);
4050 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
4051 bttv_irq_switch_vbi(btv);
4053 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
4054 bttv_irq_wakeup_top(btv);
4056 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
4057 bttv_irq_switch_video(btv);
4059 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
4060 audio_mute(btv, btv->mute); /* trigger automute */
4062 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
4063 printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->c.nr,
4064 (astat & BT848_INT_SCERR) ? "SCERR" : "",
4065 (astat & BT848_INT_OCERR) ? "OCERR" : "",
4066 btread(BT848_RISC_COUNT));
4067 bttv_print_irqbits(stat,astat);
4070 bttv_print_riscaddr(btv);
4072 if (fdsr && astat & BT848_INT_FDSR) {
4073 printk(KERN_INFO "bttv%d: FDSR @ %08x\n",
4074 btv->c.nr,btread(BT848_RISC_COUNT));
4076 bttv_print_riscaddr(btv);
4082 if (count > 8 || !(astat & BT848_INT_GPINT)) {
4083 btwrite(0, BT848_INT_MASK);
4086 "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr);
4089 "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv->c.nr);
4091 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
4095 bttv_print_irqbits(stat,astat);
4103 return IRQ_RETVAL(handled);
4107 /* ----------------------------------------------------------------------- */
4108 /* initialitation */
4110 static struct video_device *vdev_init(struct bttv *btv,
4111 struct video_device *template,
4114 struct video_device *vfd;
4116 vfd = video_device_alloc();
4121 vfd->dev = &btv->c.pci->dev;
4122 vfd->release = video_device_release;
4123 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
4124 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
4125 type, bttv_tvcards[btv->c.type].name);
4129 static void bttv_unregister_video(struct bttv *btv)
4131 if (btv->video_dev) {
4132 if (-1 != btv->video_dev->minor)
4133 video_unregister_device(btv->video_dev);
4135 video_device_release(btv->video_dev);
4136 btv->video_dev = NULL;
4139 if (-1 != btv->vbi_dev->minor)
4140 video_unregister_device(btv->vbi_dev);
4142 video_device_release(btv->vbi_dev);
4143 btv->vbi_dev = NULL;
4145 if (btv->radio_dev) {
4146 if (-1 != btv->radio_dev->minor)
4147 video_unregister_device(btv->radio_dev);
4149 video_device_release(btv->radio_dev);
4150 btv->radio_dev = NULL;
4154 /* register video4linux devices */
4155 static int __devinit bttv_register_video(struct bttv *btv)
4157 if (no_overlay <= 0) {
4158 bttv_video_template.type |= VID_TYPE_OVERLAY;
4160 printk("bttv: Overlay support disabled.\n");
4164 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
4165 if (NULL == btv->video_dev)
4167 if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0)
4169 printk(KERN_INFO "bttv%d: registered device video%d\n",
4170 btv->c.nr,btv->video_dev->minor & 0x1f);
4171 if (device_create_file(&btv->video_dev->class_dev,
4172 &dev_attr_card)<0) {
4173 printk(KERN_ERR "bttv%d: device_create_file 'card' "
4174 "failed\n", btv->c.nr);
4179 btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
4180 if (NULL == btv->vbi_dev)
4182 if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0)
4184 printk(KERN_INFO "bttv%d: registered device vbi%d\n",
4185 btv->c.nr,btv->vbi_dev->minor & 0x1f);
4187 if (!btv->has_radio)
4190 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
4191 if (NULL == btv->radio_dev)
4193 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0)
4195 printk(KERN_INFO "bttv%d: registered device radio%d\n",
4196 btv->c.nr,btv->radio_dev->minor & 0x1f);
4202 bttv_unregister_video(btv);
4207 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
4208 /* response on cards with no firmware is not enabled by OF */
4209 static void pci_set_command(struct pci_dev *dev)
4211 #if defined(__powerpc__)
4214 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
4215 cmd = (cmd | PCI_COMMAND_MEMORY );
4216 pci_write_config_dword(dev, PCI_COMMAND, cmd);
4220 static int __devinit bttv_probe(struct pci_dev *dev,
4221 const struct pci_device_id *pci_id)
4227 if (bttv_num == BTTV_MAX)
4229 printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
4230 btv=&bttvs[bttv_num];
4231 memset(btv,0,sizeof(*btv));
4232 btv->c.nr = bttv_num;
4233 sprintf(btv->c.name,"bttv%d",btv->c.nr);
4235 /* initialize structs / fill in defaults */
4236 mutex_init(&btv->lock);
4237 spin_lock_init(&btv->s_lock);
4238 spin_lock_init(&btv->gpio_lock);
4239 init_waitqueue_head(&btv->gpioq);
4240 init_waitqueue_head(&btv->i2c_queue);
4241 INIT_LIST_HEAD(&btv->c.subs);
4242 INIT_LIST_HEAD(&btv->capture);
4243 INIT_LIST_HEAD(&btv->vcapture);
4244 v4l2_prio_init(&btv->prio);
4246 init_timer(&btv->timeout);
4247 btv->timeout.function = bttv_irq_timeout;
4248 btv->timeout.data = (unsigned long)btv;
4251 btv->tuner_type = UNSET;
4252 btv->new_input = UNSET;
4253 btv->has_radio=radio[btv->c.nr];
4255 /* pci stuff (init, get irq/mmio, ... */
4257 btv->id = dev->device;
4258 if (pci_enable_device(dev)) {
4259 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4263 if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
4264 printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
4268 if (!request_mem_region(pci_resource_start(dev,0),
4269 pci_resource_len(dev,0),
4271 printk(KERN_WARNING "bttv%d: can't request iomem (0x%llx).\n",
4273 (unsigned long long)pci_resource_start(dev,0));
4276 pci_set_master(dev);
4277 pci_set_command(dev);
4278 pci_set_drvdata(dev,btv);
4280 pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
4281 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
4282 printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ",
4283 bttv_num,btv->id, btv->revision, pci_name(dev));
4284 printk("irq: %d, latency: %d, mmio: 0x%llx\n",
4285 btv->c.pci->irq, lat,
4286 (unsigned long long)pci_resource_start(dev,0));
4289 btv->bt848_mmio = ioremap(pci_resource_start(dev, 0), 0x1000);
4290 if (NULL == btv->bt848_mmio) {
4291 printk("bttv%d: ioremap() failed\n", btv->c.nr);
4299 /* disable irqs, register irq handler */
4300 btwrite(0, BT848_INT_MASK);
4301 result = request_irq(btv->c.pci->irq, bttv_irq,
4302 IRQF_SHARED | IRQF_DISABLED,btv->c.name,(void *)btv);
4304 printk(KERN_ERR "bttv%d: can't get IRQ %d\n",
4305 bttv_num,btv->c.pci->irq);
4309 if (0 != bttv_handle_chipset(btv)) {
4314 /* init options from insmod args */
4315 btv->opt_combfilter = combfilter;
4316 btv->opt_lumafilter = lumafilter;
4317 btv->opt_automute = automute;
4318 btv->opt_chroma_agc = chroma_agc;
4319 btv->opt_adc_crush = adc_crush;
4320 btv->opt_vcr_hack = vcr_hack;
4321 btv->opt_whitecrush_upper = whitecrush_upper;
4322 btv->opt_whitecrush_lower = whitecrush_lower;
4323 btv->opt_uv_ratio = uv_ratio;
4324 btv->opt_full_luma_range = full_luma_range;
4325 btv->opt_coring = coring;
4327 /* fill struct bttv with some useful defaults */
4328 btv->init.btv = btv;
4329 btv->init.ov.w.width = 320;
4330 btv->init.ov.w.height = 240;
4331 btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
4332 btv->init.width = 320;
4333 btv->init.height = 240;
4336 /* initialize hardware */
4338 bttv_gpio_tracking(btv,"pre-init");
4340 bttv_risc_init_main(btv);
4344 btwrite(0x00, BT848_GPIO_REG_INP);
4345 btwrite(0x00, BT848_GPIO_OUT_EN);
4347 bttv_gpio_tracking(btv,"init");
4349 /* needs to be done before i2c is registered */
4350 bttv_init_card1(btv);
4352 /* register i2c + gpio */
4355 /* some card-specific stuff (needs working i2c) */
4356 bttv_init_card2(btv);
4359 /* register video4linux + input */
4360 if (!bttv_tvcards[btv->c.type].no_video) {
4361 bttv_register_video(btv);
4362 bt848_bright(btv,32768);
4363 bt848_contrast(btv,32768);
4364 bt848_hue(btv,32768);
4365 bt848_sat(btv,32768);
4367 set_input(btv, 0, btv->tvnorm);
4368 bttv_crop_reset(&btv->crop[0], btv->tvnorm);
4369 btv->crop[1] = btv->crop[0]; /* current = default */
4370 disclaim_vbi_lines(btv);
4371 disclaim_video_lines(btv);
4374 /* add subdevices and autoload dvb-bt8xx if needed */
4375 if (bttv_tvcards[btv->c.type].has_dvb) {
4376 bttv_sub_add_device(&btv->c, "dvb");
4377 request_modules(btv);
4380 bttv_input_init(btv);
4382 /* everything is fine */
4387 free_irq(btv->c.pci->irq,btv);
4390 if (btv->bt848_mmio)
4391 iounmap(btv->bt848_mmio);
4392 release_mem_region(pci_resource_start(btv->c.pci,0),
4393 pci_resource_len(btv->c.pci,0));
4394 pci_set_drvdata(dev,NULL);
4398 static void __devexit bttv_remove(struct pci_dev *pci_dev)
4400 struct bttv *btv = pci_get_drvdata(pci_dev);
4403 printk("bttv%d: unloading\n",btv->c.nr);
4405 /* shutdown everything (DMA+IRQs) */
4406 btand(~15, BT848_GPIO_DMA_CTL);
4407 btwrite(0, BT848_INT_MASK);
4408 btwrite(~0x0, BT848_INT_STAT);
4409 btwrite(0x0, BT848_GPIO_OUT_EN);
4411 bttv_gpio_tracking(btv,"cleanup");
4413 /* tell gpio modules we are leaving ... */
4415 wake_up(&btv->gpioq);
4416 bttv_input_fini(btv);
4417 bttv_sub_del_devices(&btv->c);
4419 /* unregister i2c_bus + input */
4422 /* unregister video4linux */
4423 bttv_unregister_video(btv);
4425 /* free allocated memory */
4426 btcx_riscmem_free(btv->c.pci,&btv->main);
4428 /* free ressources */
4429 free_irq(btv->c.pci->irq,btv);
4430 iounmap(btv->bt848_mmio);
4431 release_mem_region(pci_resource_start(btv->c.pci,0),
4432 pci_resource_len(btv->c.pci,0));
4434 pci_set_drvdata(pci_dev, NULL);
4439 static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4441 struct bttv *btv = pci_get_drvdata(pci_dev);
4442 struct bttv_buffer_set idle;
4443 unsigned long flags;
4445 dprintk("bttv%d: suspend %d\n", btv->c.nr, state.event);
4447 /* stop dma + irqs */
4448 spin_lock_irqsave(&btv->s_lock,flags);
4449 memset(&idle, 0, sizeof(idle));
4450 btv->state.video = btv->curr;
4451 btv->state.vbi = btv->cvbi;
4452 btv->state.loop_irq = btv->loop_irq;
4455 bttv_buffer_activate_video(btv, &idle);
4456 bttv_buffer_activate_vbi(btv, NULL);
4457 bttv_set_dma(btv, 0);
4458 btwrite(0, BT848_INT_MASK);
4459 spin_unlock_irqrestore(&btv->s_lock,flags);
4461 /* save bt878 state */
4462 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4463 btv->state.gpio_data = gpio_read();
4465 /* save pci state */
4466 pci_save_state(pci_dev);
4467 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4468 pci_disable_device(pci_dev);
4469 btv->state.disabled = 1;
4474 static int bttv_resume(struct pci_dev *pci_dev)
4476 struct bttv *btv = pci_get_drvdata(pci_dev);
4477 unsigned long flags;
4480 dprintk("bttv%d: resume\n", btv->c.nr);
4482 /* restore pci state */
4483 if (btv->state.disabled) {
4484 err=pci_enable_device(pci_dev);
4486 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4490 btv->state.disabled = 0;
4492 err=pci_set_power_state(pci_dev, PCI_D0);
4494 pci_disable_device(pci_dev);
4495 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4497 btv->state.disabled = 1;
4501 pci_restore_state(pci_dev);
4503 /* restore bt878 state */
4504 bttv_reinit_bt848(btv);
4505 gpio_inout(0xffffff, btv->state.gpio_enable);
4506 gpio_write(btv->state.gpio_data);
4509 spin_lock_irqsave(&btv->s_lock,flags);
4510 btv->curr = btv->state.video;
4511 btv->cvbi = btv->state.vbi;
4512 btv->loop_irq = btv->state.loop_irq;
4513 bttv_buffer_activate_video(btv, &btv->curr);
4514 bttv_buffer_activate_vbi(btv, btv->cvbi);
4515 bttv_set_dma(btv, 0);
4516 spin_unlock_irqrestore(&btv->s_lock,flags);
4521 static struct pci_device_id bttv_pci_tbl[] = {
4522 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848,
4523 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4524 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849,
4525 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4526 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878,
4527 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4528 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879,
4529 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4533 MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4535 static struct pci_driver bttv_pci_driver = {
4537 .id_table = bttv_pci_tbl,
4538 .probe = bttv_probe,
4539 .remove = __devexit_p(bttv_remove),
4541 .suspend = bttv_suspend,
4542 .resume = bttv_resume,
4546 static int __init bttv_init_module(void)
4552 printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
4553 (BTTV_VERSION_CODE >> 16) & 0xff,
4554 (BTTV_VERSION_CODE >> 8) & 0xff,
4555 BTTV_VERSION_CODE & 0xff);
4557 printk(KERN_INFO "bttv: snapshot date %04d-%02d-%02d\n",
4558 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
4560 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4562 if (gbufsize < 0 || gbufsize > BTTV_MAX_FBUF)
4563 gbufsize = BTTV_MAX_FBUF;
4564 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4566 printk(KERN_INFO "bttv: using %d buffers with %dk (%d pages) each for capture\n",
4567 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4569 bttv_check_chipset();
4571 ret = bus_register(&bttv_sub_bus_type);
4573 printk(KERN_WARNING "bttv: bus_register error: %d\n", ret);
4576 ret = pci_register_driver(&bttv_pci_driver);
4578 bus_unregister(&bttv_sub_bus_type);
4583 static void __exit bttv_cleanup_module(void)
4585 pci_unregister_driver(&bttv_pci_driver);
4586 bus_unregister(&bttv_sub_bus_type);
4589 module_init(bttv_init_module);
4590 module_exit(bttv_cleanup_module);