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 bttv_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 BTTV_FORMATS = ARRAY_SIZE(bttv_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 /* ----------------------------------------------------------------------- */
791 /* resource management */
794 RESOURCE_ allocated by freed by
796 VIDEO_READ bttv_read 1) bttv_read 2)
798 VIDEO_STREAM VIDIOC_STREAMON VIDIOC_STREAMOFF
799 VIDIOC_QBUF 1) bttv_release
802 OVERLAY VIDIOCCAPTURE on VIDIOCCAPTURE off
803 VIDIOC_OVERLAY on VIDIOC_OVERLAY off
806 VBI VIDIOC_STREAMON VIDIOC_STREAMOFF
807 VIDIOC_QBUF 1) bttv_release
808 bttv_read, bttv_poll 1) 4)
810 1) The resource must be allocated when we enter buffer prepare functions
811 and remain allocated while buffers are in the DMA queue.
812 2) This is a single frame read.
813 3) VIDIOC_S_FBUF and VIDIOC_S_FMT (OVERLAY) still work when
814 RESOURCE_OVERLAY is allocated.
815 4) This is a continuous read, implies VIDIOC_STREAMON.
817 Note this driver permits video input and standard changes regardless if
818 resources are allocated.
821 #define VBI_RESOURCES (RESOURCE_VBI)
822 #define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
823 RESOURCE_VIDEO_STREAM | \
827 int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit)
829 int xbits; /* mutual exclusive resources */
831 if (fh->resources & bit)
832 /* have it already allocated */
836 if (bit & (RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM))
837 xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
840 mutex_lock(&btv->lock);
841 if (btv->resources & xbits) {
842 /* no, someone else uses it */
846 if ((bit & VIDEO_RESOURCES)
847 && 0 == (btv->resources & VIDEO_RESOURCES)) {
848 /* Do crop - use current, don't - use default parameters. */
849 __s32 top = btv->crop[!!fh->do_crop].rect.top;
851 if (btv->vbi_end > top)
854 /* We cannot capture the same line as video and VBI data.
855 Claim scan lines crop[].rect.top to bottom. */
856 btv->crop_start = top;
857 } else if (bit & VBI_RESOURCES) {
858 __s32 end = fh->vbi_fmt.end;
860 if (end > btv->crop_start)
863 /* Claim scan lines above fh->vbi_fmt.end. */
867 /* it's free, grab it */
868 fh->resources |= bit;
869 btv->resources |= bit;
870 mutex_unlock(&btv->lock);
874 mutex_unlock(&btv->lock);
879 int check_btres(struct bttv_fh *fh, int bit)
881 return (fh->resources & bit);
885 int locked_btres(struct bttv *btv, int bit)
887 return (btv->resources & bit);
890 /* Call with btv->lock down. */
892 disclaim_vbi_lines(struct bttv *btv)
897 /* Call with btv->lock down. */
899 disclaim_video_lines(struct bttv *btv)
901 const struct bttv_tvnorm *tvnorm;
904 tvnorm = &bttv_tvnorms[btv->tvnorm];
905 btv->crop_start = tvnorm->cropcap.bounds.top
906 + tvnorm->cropcap.bounds.height;
908 /* VBI capturing ends at VDELAY, start of video capturing, no
909 matter how many lines the VBI RISC program expects. When video
910 capturing is off, it shall no longer "preempt" VBI capturing,
911 so we set VDELAY to maximum. */
912 crop = btread(BT848_E_CROP) | 0xc0;
913 btwrite(crop, BT848_E_CROP);
914 btwrite(0xfe, BT848_E_VDELAY_LO);
915 btwrite(crop, BT848_O_CROP);
916 btwrite(0xfe, BT848_O_VDELAY_LO);
920 void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
922 if ((fh->resources & bits) != bits) {
923 /* trying to free ressources not allocated by us ... */
924 printk("bttv: BUG! (btres)\n");
926 mutex_lock(&btv->lock);
927 fh->resources &= ~bits;
928 btv->resources &= ~bits;
930 bits = btv->resources;
932 if (0 == (bits & VIDEO_RESOURCES))
933 disclaim_video_lines(btv);
935 if (0 == (bits & VBI_RESOURCES))
936 disclaim_vbi_lines(btv);
938 mutex_unlock(&btv->lock);
941 /* ----------------------------------------------------------------------- */
942 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
944 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
945 PLL_X = Reference pre-divider (0=1, 1=2)
946 PLL_C = Post divider (0=6, 1=4)
947 PLL_I = Integer input
948 PLL_F = Fractional input
950 F_input = 28.636363 MHz:
951 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
954 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
956 unsigned char fl, fh, fi;
958 /* prevent overflows */
971 btwrite(fl, BT848_PLL_F_LO);
972 btwrite(fh, BT848_PLL_F_HI);
973 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
976 static void set_pll(struct bttv *btv)
980 if (!btv->pll.pll_crystal)
983 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
984 dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
988 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
990 if (btv->pll.pll_current == 0)
992 bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
993 btv->c.nr,btv->pll.pll_ifreq);
994 btwrite(0x00,BT848_TGCTRL);
995 btwrite(0x00,BT848_PLL_XCI);
996 btv->pll.pll_current = 0;
1000 bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
1001 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1002 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1004 for (i=0; i<10; i++) {
1005 /* Let other people run while the PLL stabilizes */
1009 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
1010 btwrite(0,BT848_DSTATUS);
1012 btwrite(0x08,BT848_TGCTRL);
1013 btv->pll.pll_current = btv->pll.pll_ofreq;
1014 bttv_printk(" ok\n");
1018 btv->pll.pll_current = -1;
1019 bttv_printk("failed\n");
1023 /* used to switch between the bt848's analog/digital video capture modes */
1024 static void bt848A_set_timing(struct bttv *btv)
1027 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
1028 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
1030 if (UNSET == bttv_tvcards[btv->c.type].muxsel[btv->input]) {
1031 dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
1032 btv->c.nr,table_idx);
1034 /* timing change...reset timing generator address */
1035 btwrite(0x00, BT848_TGCTRL);
1036 btwrite(0x02, BT848_TGCTRL);
1037 btwrite(0x00, BT848_TGCTRL);
1039 len=SRAM_Table[table_idx][0];
1040 for(i = 1; i <= len; i++)
1041 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
1042 btv->pll.pll_ofreq = 27000000;
1045 btwrite(0x11, BT848_TGCTRL);
1046 btwrite(0x41, BT848_DVSIF);
1048 btv->pll.pll_ofreq = fsc;
1050 btwrite(0x0, BT848_DVSIF);
1054 /* ----------------------------------------------------------------------- */
1056 static void bt848_bright(struct bttv *btv, int bright)
1060 // printk("bttv: set bright: %d\n",bright); // DEBUG
1061 btv->bright = bright;
1063 /* We want -128 to 127 we get 0-65535 */
1064 value = (bright >> 8) - 128;
1065 btwrite(value & 0xff, BT848_BRIGHT);
1068 static void bt848_hue(struct bttv *btv, int hue)
1075 value = (hue >> 8) - 128;
1076 btwrite(value & 0xff, BT848_HUE);
1079 static void bt848_contrast(struct bttv *btv, int cont)
1083 btv->contrast = cont;
1086 value = (cont >> 7);
1087 hibit = (value >> 6) & 4;
1088 btwrite(value & 0xff, BT848_CONTRAST_LO);
1089 btaor(hibit, ~4, BT848_E_CONTROL);
1090 btaor(hibit, ~4, BT848_O_CONTROL);
1093 static void bt848_sat(struct bttv *btv, int color)
1095 int val_u,val_v,hibits;
1097 btv->saturation = color;
1099 /* 0-511 for the color */
1100 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
1101 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
1102 hibits = (val_u >> 7) & 2;
1103 hibits |= (val_v >> 8) & 1;
1104 btwrite(val_u & 0xff, BT848_SAT_U_LO);
1105 btwrite(val_v & 0xff, BT848_SAT_V_LO);
1106 btaor(hibits, ~3, BT848_E_CONTROL);
1107 btaor(hibits, ~3, BT848_O_CONTROL);
1110 /* ----------------------------------------------------------------------- */
1113 video_mux(struct bttv *btv, unsigned int input)
1117 if (input >= bttv_tvcards[btv->c.type].video_inputs)
1120 /* needed by RemoteVideo MX */
1121 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
1123 gpio_inout(mask2,mask2);
1125 if (input == btv->svhs) {
1126 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
1127 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
1129 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
1130 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
1132 mux = bttv_tvcards[btv->c.type].muxsel[input] & 3;
1133 btaor(mux<<5, ~(3<<5), BT848_IFORM);
1134 dprintk(KERN_DEBUG "bttv%d: video mux: input=%d mux=%d\n",
1135 btv->c.nr,input,mux);
1137 /* card specific hook */
1138 if(bttv_tvcards[btv->c.type].muxsel_hook)
1139 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
1143 static char *audio_modes[] = {
1144 "audio: tuner", "audio: radio", "audio: extern",
1145 "audio: intern", "audio: mute"
1149 audio_mux(struct bttv *btv, int input, int mute)
1151 int gpio_val, signal;
1152 struct v4l2_control ctrl;
1153 struct i2c_client *c;
1155 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
1156 bttv_tvcards[btv->c.type].gpiomask);
1157 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
1163 mute = mute || (btv->opt_automute && !signal && !btv->radio_user);
1166 gpio_val = bttv_tvcards[btv->c.type].gpiomute;
1168 gpio_val = bttv_tvcards[btv->c.type].gpiomux[input];
1170 gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpio_val);
1172 bttv_gpio_tracking(btv, audio_modes[mute ? 4 : input]);
1176 ctrl.id = V4L2_CID_AUDIO_MUTE;
1177 ctrl.value = btv->mute;
1178 bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, &ctrl);
1179 c = btv->i2c_msp34xx_client;
1181 struct v4l2_routing route;
1183 /* Note: the inputs tuner/radio/extern/intern are translated
1184 to msp routings. This assumes common behavior for all msp3400
1185 based TV cards. When this assumption fails, then the
1186 specific MSP routing must be added to the card table.
1187 For now this is sufficient. */
1189 case TVAUDIO_INPUT_RADIO:
1190 route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1191 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1193 case TVAUDIO_INPUT_EXTERN:
1194 route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
1195 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1197 case TVAUDIO_INPUT_INTERN:
1198 /* Yes, this is the same input as for RADIO. I doubt
1199 if this is ever used. The only board with an INTERN
1200 input is the BTTV_BOARD_AVERMEDIA98. I wonder how
1201 that was tested. My guess is that the whole INTERN
1202 input does not work. */
1203 route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1204 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1206 case TVAUDIO_INPUT_TUNER:
1208 /* This is the only card that uses TUNER2, and afaik,
1209 is the only difference between the VOODOOTV_FM
1211 if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
1212 route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
1213 MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
1215 route.input = MSP_INPUT_DEFAULT;
1218 route.output = MSP_OUTPUT_DEFAULT;
1219 c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
1221 c = btv->i2c_tvaudio_client;
1223 struct v4l2_routing route;
1225 route.input = input;
1227 c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
1233 audio_mute(struct bttv *btv, int mute)
1235 return audio_mux(btv, btv->audio, mute);
1239 audio_input(struct bttv *btv, int input)
1241 return audio_mux(btv, input, btv->mute);
1245 bttv_crop_calc_limits(struct bttv_crop *c)
1247 /* Scale factor min. 1:1, max. 16:1. Min. image size
1248 48 x 32. Scaled width must be a multiple of 4. */
1251 /* For bug compatibility with VIDIOCGCAP and image
1252 size checks in earlier driver versions. */
1253 c->min_scaled_width = 48;
1254 c->min_scaled_height = 32;
1256 c->min_scaled_width =
1257 (max(48, c->rect.width >> 4) + 3) & ~3;
1258 c->min_scaled_height =
1259 max(32, c->rect.height >> 4);
1262 c->max_scaled_width = c->rect.width & ~3;
1263 c->max_scaled_height = c->rect.height;
1267 bttv_crop_reset(struct bttv_crop *c, int norm)
1269 c->rect = bttv_tvnorms[norm].cropcap.defrect;
1270 bttv_crop_calc_limits(c);
1273 /* Call with btv->lock down. */
1275 set_tvnorm(struct bttv *btv, unsigned int norm)
1277 const struct bttv_tvnorm *tvnorm;
1280 if (norm < 0 || norm >= BTTV_TVNORMS)
1283 tvnorm = &bttv_tvnorms[norm];
1285 if (btv->tvnorm < 0 ||
1286 btv->tvnorm >= BTTV_TVNORMS ||
1287 0 != memcmp(&bttv_tvnorms[btv->tvnorm].cropcap,
1289 sizeof (tvnorm->cropcap))) {
1290 bttv_crop_reset(&btv->crop[0], norm);
1291 btv->crop[1] = btv->crop[0]; /* current = default */
1293 if (0 == (btv->resources & VIDEO_RESOURCES)) {
1294 btv->crop_start = tvnorm->cropcap.bounds.top
1295 + tvnorm->cropcap.bounds.height;
1301 btwrite(tvnorm->adelay, BT848_ADELAY);
1302 btwrite(tvnorm->bdelay, BT848_BDELAY);
1303 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
1305 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
1306 btwrite(1, BT848_VBI_PACK_DEL);
1307 bt848A_set_timing(btv);
1309 switch (btv->c.type) {
1310 case BTTV_BOARD_VOODOOTV_FM:
1311 case BTTV_BOARD_VOODOOTV_200:
1312 bttv_tda9880_setnorm(btv,norm);
1315 id = tvnorm->v4l2_id;
1316 bttv_call_i2c_clients(btv, VIDIOC_S_STD, &id);
1321 /* Call with btv->lock down. */
1323 set_input(struct bttv *btv, unsigned int input, unsigned int norm)
1325 unsigned long flags;
1329 spin_lock_irqsave(&btv->s_lock,flags);
1330 if (btv->curr.frame_irq) {
1331 /* active capture -> delayed input switch */
1332 btv->new_input = input;
1334 video_mux(btv,input);
1336 spin_unlock_irqrestore(&btv->s_lock,flags);
1338 video_mux(btv,input);
1340 audio_input(btv,(input == bttv_tvcards[btv->c.type].tuner ?
1341 TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN));
1342 set_tvnorm(btv, norm);
1345 static void init_irqreg(struct bttv *btv)
1348 btwrite(0xfffffUL, BT848_INT_STAT);
1350 if (bttv_tvcards[btv->c.type].no_video) {
1352 btwrite(BT848_INT_I2CDONE,
1356 btwrite((btv->triton1) |
1357 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1359 (fdsr ? BT848_INT_FDSR : 0) |
1360 BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
1361 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1367 static void init_bt848(struct bttv *btv)
1371 if (bttv_tvcards[btv->c.type].no_video) {
1372 /* very basic init only */
1377 btwrite(0x00, BT848_CAP_CTL);
1378 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1379 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1381 /* set planar and packed mode trigger points and */
1382 /* set rising edge of inverted GPINTR pin as irq trigger */
1383 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1384 BT848_GPIO_DMA_CTL_PLTP1_16|
1385 BT848_GPIO_DMA_CTL_PLTP23_16|
1386 BT848_GPIO_DMA_CTL_GPINTC|
1387 BT848_GPIO_DMA_CTL_GPINTI,
1388 BT848_GPIO_DMA_CTL);
1390 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1391 btwrite(val, BT848_E_SCLOOP);
1392 btwrite(val, BT848_O_SCLOOP);
1394 btwrite(0x20, BT848_E_VSCALE_HI);
1395 btwrite(0x20, BT848_O_VSCALE_HI);
1396 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1399 btwrite(whitecrush_upper, BT848_WC_UP);
1400 btwrite(whitecrush_lower, BT848_WC_DOWN);
1402 if (btv->opt_lumafilter) {
1403 btwrite(0, BT848_E_CONTROL);
1404 btwrite(0, BT848_O_CONTROL);
1406 btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1407 btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1410 bt848_bright(btv, btv->bright);
1411 bt848_hue(btv, btv->hue);
1412 bt848_contrast(btv, btv->contrast);
1413 bt848_sat(btv, btv->saturation);
1419 static void bttv_reinit_bt848(struct bttv *btv)
1421 unsigned long flags;
1424 printk(KERN_INFO "bttv%d: reset, reinitialize\n",btv->c.nr);
1425 spin_lock_irqsave(&btv->s_lock,flags);
1427 bttv_set_dma(btv,0);
1428 spin_unlock_irqrestore(&btv->s_lock,flags);
1431 btv->pll.pll_current = -1;
1432 set_input(btv, btv->input, btv->tvnorm);
1435 static int get_control(struct bttv *btv, struct v4l2_control *c)
1439 for (i = 0; i < BTTV_CTLS; i++)
1440 if (bttv_ctls[i].id == c->id)
1444 #ifdef CONFIG_VIDEO_V4L1
1445 if (btv->audio_hook && i >= 4 && i <= 8) {
1446 struct video_audio va;
1448 memset(&va,0,sizeof(va));
1449 btv->audio_hook(btv,&va,0);
1451 case V4L2_CID_AUDIO_MUTE:
1452 c->value = (VIDEO_AUDIO_MUTE & va.flags) ? 1 : 0;
1454 case V4L2_CID_AUDIO_VOLUME:
1455 c->value = va.volume;
1457 case V4L2_CID_AUDIO_BALANCE:
1458 c->value = va.balance;
1460 case V4L2_CID_AUDIO_BASS:
1463 case V4L2_CID_AUDIO_TREBLE:
1464 c->value = va.treble;
1471 case V4L2_CID_BRIGHTNESS:
1472 c->value = btv->bright;
1475 c->value = btv->hue;
1477 case V4L2_CID_CONTRAST:
1478 c->value = btv->contrast;
1480 case V4L2_CID_SATURATION:
1481 c->value = btv->saturation;
1484 case V4L2_CID_AUDIO_MUTE:
1485 case V4L2_CID_AUDIO_VOLUME:
1486 case V4L2_CID_AUDIO_BALANCE:
1487 case V4L2_CID_AUDIO_BASS:
1488 case V4L2_CID_AUDIO_TREBLE:
1489 bttv_call_i2c_clients(btv,VIDIOC_G_CTRL,c);
1492 case V4L2_CID_PRIVATE_CHROMA_AGC:
1493 c->value = btv->opt_chroma_agc;
1495 case V4L2_CID_PRIVATE_COMBFILTER:
1496 c->value = btv->opt_combfilter;
1498 case V4L2_CID_PRIVATE_LUMAFILTER:
1499 c->value = btv->opt_lumafilter;
1501 case V4L2_CID_PRIVATE_AUTOMUTE:
1502 c->value = btv->opt_automute;
1504 case V4L2_CID_PRIVATE_AGC_CRUSH:
1505 c->value = btv->opt_adc_crush;
1507 case V4L2_CID_PRIVATE_VCR_HACK:
1508 c->value = btv->opt_vcr_hack;
1510 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1511 c->value = btv->opt_whitecrush_upper;
1513 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1514 c->value = btv->opt_whitecrush_lower;
1516 case V4L2_CID_PRIVATE_UV_RATIO:
1517 c->value = btv->opt_uv_ratio;
1519 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1520 c->value = btv->opt_full_luma_range;
1522 case V4L2_CID_PRIVATE_CORING:
1523 c->value = btv->opt_coring;
1531 static int set_control(struct bttv *btv, struct v4l2_control *c)
1535 for (i = 0; i < BTTV_CTLS; i++)
1536 if (bttv_ctls[i].id == c->id)
1540 #ifdef CONFIG_VIDEO_V4L1
1541 if (btv->audio_hook && i >= 4 && i <= 8) {
1542 struct video_audio va;
1544 memset(&va,0,sizeof(va));
1545 btv->audio_hook(btv,&va,0);
1547 case V4L2_CID_AUDIO_MUTE:
1549 va.flags |= VIDEO_AUDIO_MUTE;
1552 va.flags &= ~VIDEO_AUDIO_MUTE;
1557 case V4L2_CID_AUDIO_VOLUME:
1558 va.volume = c->value;
1560 case V4L2_CID_AUDIO_BALANCE:
1561 va.balance = c->value;
1563 case V4L2_CID_AUDIO_BASS:
1566 case V4L2_CID_AUDIO_TREBLE:
1567 va.treble = c->value;
1570 btv->audio_hook(btv,&va,1);
1575 case V4L2_CID_BRIGHTNESS:
1576 bt848_bright(btv,c->value);
1579 bt848_hue(btv,c->value);
1581 case V4L2_CID_CONTRAST:
1582 bt848_contrast(btv,c->value);
1584 case V4L2_CID_SATURATION:
1585 bt848_sat(btv,c->value);
1587 case V4L2_CID_AUDIO_MUTE:
1588 audio_mute(btv, c->value);
1590 case V4L2_CID_AUDIO_VOLUME:
1591 case V4L2_CID_AUDIO_BALANCE:
1592 case V4L2_CID_AUDIO_BASS:
1593 case V4L2_CID_AUDIO_TREBLE:
1594 bttv_call_i2c_clients(btv,VIDIOC_S_CTRL,c);
1597 case V4L2_CID_PRIVATE_CHROMA_AGC:
1598 btv->opt_chroma_agc = c->value;
1599 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1600 btwrite(val, BT848_E_SCLOOP);
1601 btwrite(val, BT848_O_SCLOOP);
1603 case V4L2_CID_PRIVATE_COMBFILTER:
1604 btv->opt_combfilter = c->value;
1606 case V4L2_CID_PRIVATE_LUMAFILTER:
1607 btv->opt_lumafilter = c->value;
1608 if (btv->opt_lumafilter) {
1609 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1610 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1612 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1613 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1616 case V4L2_CID_PRIVATE_AUTOMUTE:
1617 btv->opt_automute = c->value;
1619 case V4L2_CID_PRIVATE_AGC_CRUSH:
1620 btv->opt_adc_crush = c->value;
1621 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1624 case V4L2_CID_PRIVATE_VCR_HACK:
1625 btv->opt_vcr_hack = c->value;
1627 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1628 btv->opt_whitecrush_upper = c->value;
1629 btwrite(c->value, BT848_WC_UP);
1631 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1632 btv->opt_whitecrush_lower = c->value;
1633 btwrite(c->value, BT848_WC_DOWN);
1635 case V4L2_CID_PRIVATE_UV_RATIO:
1636 btv->opt_uv_ratio = c->value;
1637 bt848_sat(btv, btv->saturation);
1639 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1640 btv->opt_full_luma_range = c->value;
1641 btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM);
1643 case V4L2_CID_PRIVATE_CORING:
1644 btv->opt_coring = c->value;
1645 btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM);
1653 /* ----------------------------------------------------------------------- */
1655 void bttv_gpio_tracking(struct bttv *btv, char *comment)
1657 unsigned int outbits, data;
1658 outbits = btread(BT848_GPIO_OUT_EN);
1659 data = btread(BT848_GPIO_DATA);
1660 printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1661 btv->c.nr,outbits,data & outbits, data & ~outbits, comment);
1664 static void bttv_field_count(struct bttv *btv)
1672 /* start field counter */
1673 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1675 /* stop field counter */
1676 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1677 btv->field_count = 0;
1681 static const struct bttv_format*
1682 format_by_fourcc(int fourcc)
1686 for (i = 0; i < BTTV_FORMATS; i++) {
1687 if (-1 == bttv_formats[i].fourcc)
1689 if (bttv_formats[i].fourcc == fourcc)
1690 return bttv_formats+i;
1695 /* ----------------------------------------------------------------------- */
1699 bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1700 struct bttv_buffer *new)
1702 struct bttv_buffer *old;
1703 unsigned long flags;
1706 dprintk("switch_overlay: enter [new=%p]\n",new);
1708 new->vb.state = STATE_DONE;
1709 spin_lock_irqsave(&btv->s_lock,flags);
1713 bttv_set_dma(btv, 0x03);
1714 spin_unlock_irqrestore(&btv->s_lock,flags);
1716 dprintk("switch_overlay: old=%p state is %d\n",old,old->vb.state);
1717 bttv_dma_free(&fh->cap,btv, old);
1721 free_btres(btv,fh,RESOURCE_OVERLAY);
1722 dprintk("switch_overlay: done\n");
1726 /* ----------------------------------------------------------------------- */
1727 /* video4linux (1) interface */
1729 static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
1730 struct bttv_buffer *buf,
1731 const struct bttv_format *fmt,
1732 unsigned int width, unsigned int height,
1733 enum v4l2_field field)
1735 struct bttv_fh *fh = q->priv_data;
1736 int redo_dma_risc = 0;
1741 /* check settings */
1744 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1746 height = RAW_LINES*2;
1747 if (width*height > buf->vb.bsize)
1749 buf->vb.size = buf->vb.bsize;
1751 /* Make sure tvnorm and vbi_end remain consistent
1752 until we're done. */
1753 mutex_lock(&btv->lock);
1757 /* In this mode capturing always starts at defrect.top
1758 (default VDELAY), ignoring cropping parameters. */
1759 if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
1760 mutex_unlock(&btv->lock);
1764 mutex_unlock(&btv->lock);
1766 c.rect = bttv_tvnorms[norm].cropcap.defrect;
1768 mutex_lock(&btv->lock);
1771 c = btv->crop[!!fh->do_crop];
1773 mutex_unlock(&btv->lock);
1775 if (width < c.min_scaled_width ||
1776 width > c.max_scaled_width ||
1777 height < c.min_scaled_height)
1781 case V4L2_FIELD_TOP:
1782 case V4L2_FIELD_BOTTOM:
1783 case V4L2_FIELD_ALTERNATE:
1784 /* btv->crop counts frame lines. Max. scale
1785 factor is 16:1 for frames, 8:1 for fields. */
1786 if (height * 2 > c.max_scaled_height)
1791 if (height > c.max_scaled_height)
1796 buf->vb.size = (width * height * fmt->depth) >> 3;
1797 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1801 /* alloc + fill struct bttv_buffer (if changed) */
1802 if (buf->vb.width != width || buf->vb.height != height ||
1803 buf->vb.field != field ||
1804 buf->tvnorm != norm || buf->fmt != fmt ||
1805 buf->crop.top != c.rect.top ||
1806 buf->crop.left != c.rect.left ||
1807 buf->crop.width != c.rect.width ||
1808 buf->crop.height != c.rect.height) {
1809 buf->vb.width = width;
1810 buf->vb.height = height;
1811 buf->vb.field = field;
1818 /* alloc risc memory */
1819 if (STATE_NEEDS_INIT == buf->vb.state) {
1821 if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
1826 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1829 buf->vb.state = STATE_PREPARED;
1833 bttv_dma_free(q,btv,buf);
1838 buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1840 struct bttv_fh *fh = q->priv_data;
1842 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1845 while (*size * *count > gbuffers * gbufsize)
1851 buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1852 enum v4l2_field field)
1854 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1855 struct bttv_fh *fh = q->priv_data;
1857 return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
1858 fh->width, fh->height, field);
1862 buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1864 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1865 struct bttv_fh *fh = q->priv_data;
1866 struct bttv *btv = fh->btv;
1868 buf->vb.state = STATE_QUEUED;
1869 list_add_tail(&buf->vb.queue,&btv->capture);
1870 if (!btv->curr.frame_irq) {
1872 bttv_set_dma(btv, 0x03);
1876 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1878 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1879 struct bttv_fh *fh = q->priv_data;
1881 bttv_dma_free(q,fh->btv,buf);
1884 static struct videobuf_queue_ops bttv_video_qops = {
1885 .buf_setup = buffer_setup,
1886 .buf_prepare = buffer_prepare,
1887 .buf_queue = buffer_queue,
1888 .buf_release = buffer_release,
1891 static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
1894 case VIDIOC_ENUMSTD:
1896 struct v4l2_standard *e = arg;
1897 unsigned int index = e->index;
1899 if (index >= BTTV_TVNORMS)
1901 v4l2_video_std_construct(e, bttv_tvnorms[e->index].v4l2_id,
1902 bttv_tvnorms[e->index].name);
1908 v4l2_std_id *id = arg;
1909 *id = bttv_tvnorms[btv->tvnorm].v4l2_id;
1914 v4l2_std_id *id = arg;
1917 for (i = 0; i < BTTV_TVNORMS; i++)
1918 if (*id & bttv_tvnorms[i].v4l2_id)
1920 if (i == BTTV_TVNORMS)
1923 mutex_lock(&btv->lock);
1925 mutex_unlock(&btv->lock);
1928 case VIDIOC_QUERYSTD:
1930 v4l2_std_id *id = arg;
1932 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1933 *id = V4L2_STD_625_50;
1935 *id = V4L2_STD_525_60;
1939 case VIDIOC_ENUMINPUT:
1941 struct v4l2_input *i = arg;
1945 if (n >= bttv_tvcards[btv->c.type].video_inputs)
1947 memset(i,0,sizeof(*i));
1949 i->type = V4L2_INPUT_TYPE_CAMERA;
1951 if (i->index == bttv_tvcards[btv->c.type].tuner) {
1952 sprintf(i->name, "Television");
1953 i->type = V4L2_INPUT_TYPE_TUNER;
1955 } else if (i->index == btv->svhs) {
1956 sprintf(i->name, "S-Video");
1958 sprintf(i->name,"Composite%d",i->index);
1960 if (i->index == btv->input) {
1961 __u32 dstatus = btread(BT848_DSTATUS);
1962 if (0 == (dstatus & BT848_DSTATUS_PRES))
1963 i->status |= V4L2_IN_ST_NO_SIGNAL;
1964 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1965 i->status |= V4L2_IN_ST_NO_H_LOCK;
1967 for (n = 0; n < BTTV_TVNORMS; n++)
1968 i->std |= bttv_tvnorms[n].v4l2_id;
1971 case VIDIOC_G_INPUT:
1977 case VIDIOC_S_INPUT:
1979 unsigned int *i = arg;
1981 if (*i > bttv_tvcards[btv->c.type].video_inputs)
1983 mutex_lock(&btv->lock);
1984 set_input(btv, *i, btv->tvnorm);
1985 mutex_unlock(&btv->lock);
1989 case VIDIOC_S_TUNER:
1991 struct v4l2_tuner *t = arg;
1993 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1997 mutex_lock(&btv->lock);
1998 bttv_call_i2c_clients(btv, VIDIOC_S_TUNER, t);
1999 #ifdef CONFIG_VIDEO_V4L1
2000 if (btv->audio_hook) {
2001 struct video_audio va;
2002 memset(&va, 0, sizeof(struct video_audio));
2003 if (t->audmode == V4L2_TUNER_MODE_MONO)
2004 va.mode = VIDEO_SOUND_MONO;
2005 else if (t->audmode == V4L2_TUNER_MODE_STEREO ||
2006 t->audmode == V4L2_TUNER_MODE_LANG1_LANG2)
2007 va.mode = VIDEO_SOUND_STEREO;
2008 else if (t->audmode == V4L2_TUNER_MODE_LANG1)
2009 va.mode = VIDEO_SOUND_LANG1;
2010 else if (t->audmode == V4L2_TUNER_MODE_LANG2)
2011 va.mode = VIDEO_SOUND_LANG2;
2012 btv->audio_hook(btv,&va,1);
2015 mutex_unlock(&btv->lock);
2019 case VIDIOC_G_FREQUENCY:
2021 struct v4l2_frequency *f = arg;
2023 memset(f,0,sizeof(*f));
2024 f->type = V4L2_TUNER_ANALOG_TV;
2025 f->frequency = btv->freq;
2028 case VIDIOC_S_FREQUENCY:
2030 struct v4l2_frequency *f = arg;
2032 if (unlikely(f->tuner != 0))
2034 if (unlikely (f->type != V4L2_TUNER_ANALOG_TV))
2036 mutex_lock(&btv->lock);
2037 btv->freq = f->frequency;
2038 bttv_call_i2c_clients(btv,VIDIOC_S_FREQUENCY,f);
2039 if (btv->has_matchbox && btv->radio_user)
2040 tea5757_set_freq(btv,btv->freq);
2041 mutex_unlock(&btv->lock);
2044 case VIDIOC_LOG_STATUS:
2046 printk(KERN_INFO "bttv%d: ================= START STATUS CARD #%d =================\n", btv->c.nr, btv->c.nr);
2047 bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
2048 printk(KERN_INFO "bttv%d: ================== END STATUS CARD #%d ==================\n", btv->c.nr, btv->c.nr);
2052 return get_control(btv,arg);
2054 return set_control(btv,arg);
2055 #ifdef CONFIG_VIDEO_ADV_DEBUG
2056 case VIDIOC_DBG_G_REGISTER:
2057 case VIDIOC_DBG_S_REGISTER:
2059 struct v4l2_register *reg = arg;
2060 if (!capable(CAP_SYS_ADMIN))
2062 if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
2064 /* bt848 has a 12-bit register space */
2066 if (cmd == VIDIOC_DBG_G_REGISTER)
2067 reg->val = btread(reg->reg);
2069 btwrite(reg->val, reg->reg);
2075 return -ENOIOCTLCMD;
2081 /* Given cropping boundaries b and the scaled width and height of a
2082 single field or frame, which must not exceed hardware limits, this
2083 function adjusts the cropping parameters c. */
2085 bttv_crop_adjust (struct bttv_crop * c,
2086 const struct v4l2_rect * b,
2089 enum v4l2_field field)
2091 __s32 frame_height = height << !V4L2_FIELD_HAS_BOTH(field);
2095 if (width < c->min_scaled_width) {
2096 /* Max. hor. scale factor 16:1. */
2097 c->rect.width = width * 16;
2098 } else if (width > c->max_scaled_width) {
2099 /* Min. hor. scale factor 1:1. */
2100 c->rect.width = width;
2102 max_left = b->left + b->width - width;
2103 max_left = min(max_left, (__s32) MAX_HDELAY);
2104 if (c->rect.left > max_left)
2105 c->rect.left = max_left;
2108 if (height < c->min_scaled_height) {
2109 /* Max. vert. scale factor 16:1, single fields 8:1. */
2110 c->rect.height = height * 16;
2111 } else if (frame_height > c->max_scaled_height) {
2112 /* Min. vert. scale factor 1:1.
2113 Top and height count field lines times two. */
2114 c->rect.height = (frame_height + 1) & ~1;
2116 max_top = b->top + b->height - c->rect.height;
2117 if (c->rect.top > max_top)
2118 c->rect.top = max_top;
2121 bttv_crop_calc_limits(c);
2124 /* Returns an error if scaling to a frame or single field with the given
2125 width and height is not possible with the current cropping parameters
2126 and width aligned according to width_mask. If adjust_size is TRUE the
2127 function may adjust the width and/or height instead, rounding width
2128 to (width + width_bias) & width_mask. If adjust_crop is TRUE it may
2129 also adjust the current cropping parameters to get closer to the
2130 desired image size. */
2132 limit_scaled_size (struct bttv_fh * fh,
2135 enum v4l2_field field,
2136 unsigned int width_mask,
2137 unsigned int width_bias,
2141 struct bttv *btv = fh->btv;
2142 const struct v4l2_rect *b;
2143 struct bttv_crop *c;
2150 BUG_ON((int) width_mask >= 0 ||
2151 width_bias >= (unsigned int) -width_mask);
2153 /* Make sure tvnorm, vbi_end and the current cropping parameters
2154 remain consistent until we're done. */
2155 mutex_lock(&btv->lock);
2157 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2159 /* Do crop - use current, don't - use default parameters. */
2160 c = &btv->crop[!!fh->do_crop];
2165 && !locked_btres(btv, VIDEO_RESOURCES)) {
2169 /* We cannot scale up. When the scaled image is larger
2170 than crop.rect we adjust the crop.rect as required
2171 by the V4L2 spec, hence cropcap.bounds are our limit. */
2172 max_width = min(b->width, (__s32) MAX_HACTIVE);
2173 max_height = b->height;
2175 /* We cannot capture the same line as video and VBI data.
2176 Note btv->vbi_end is really a minimum, see
2177 bttv_vbi_try_fmt(). */
2178 if (btv->vbi_end > b->top) {
2179 max_height -= btv->vbi_end - b->top;
2181 if (min_height > max_height)
2186 if (btv->vbi_end > c->rect.top)
2189 min_width = c->min_scaled_width;
2190 min_height = c->min_scaled_height;
2191 max_width = c->max_scaled_width;
2192 max_height = c->max_scaled_height;
2197 min_width = (min_width - width_mask - 1) & width_mask;
2198 max_width = max_width & width_mask;
2200 /* Max. scale factor is 16:1 for frames, 8:1 for fields. */
2201 min_height = min_height;
2202 /* Min. scale factor is 1:1. */
2203 max_height >>= !V4L2_FIELD_HAS_BOTH(field);
2206 *width = clamp(*width, min_width, max_width);
2207 *height = clamp(*height, min_height, max_height);
2209 /* Round after clamping to avoid overflow. */
2210 *width = (*width + width_bias) & width_mask;
2213 bttv_crop_adjust(c, b, *width, *height, field);
2215 if (btv->vbi_end > c->rect.top) {
2216 /* Move the crop window out of the way. */
2217 c->rect.top = btv->vbi_end;
2222 if (*width < min_width ||
2223 *height < min_height ||
2224 *width > max_width ||
2225 *height > max_height ||
2226 0 != (*width & ~width_mask))
2230 rc = 0; /* success */
2233 mutex_unlock(&btv->lock);
2238 /* Returns an error if the given overlay window dimensions are not
2239 possible with the current cropping parameters. If adjust_size is
2240 TRUE the function may adjust the window width and/or height
2241 instead, however it always rounds the horizontal position and
2242 width as btcx_align() does. If adjust_crop is TRUE the function
2243 may also adjust the current cropping parameters to get closer
2244 to the desired window size. */
2246 verify_window (struct bttv_fh * fh,
2247 struct v4l2_window * win,
2251 enum v4l2_field field;
2252 unsigned int width_mask;
2255 if (win->w.width < 48 || win->w.height < 32)
2257 if (win->clipcount > 2048)
2262 if (V4L2_FIELD_ANY == field) {
2265 height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
2266 field = (win->w.height > height2)
2267 ? V4L2_FIELD_INTERLACED
2271 case V4L2_FIELD_TOP:
2272 case V4L2_FIELD_BOTTOM:
2273 case V4L2_FIELD_INTERLACED:
2279 /* 4-byte alignment. */
2280 if (NULL == fh->ovfmt)
2283 switch (fh->ovfmt->depth) {
2297 win->w.width -= win->w.left & ~width_mask;
2298 win->w.left = (win->w.left - width_mask - 1) & width_mask;
2300 rc = limit_scaled_size(fh, &win->w.width, &win->w.height,
2302 /* width_bias: round down */ 0,
2303 adjust_size, adjust_crop);
2311 static int setup_window(struct bttv_fh *fh, struct bttv *btv,
2312 struct v4l2_window *win, int fixup)
2314 struct v4l2_clip *clips = NULL;
2315 int n,size,retval = 0;
2317 if (NULL == fh->ovfmt)
2319 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
2321 retval = verify_window(fh, win,
2322 /* adjust_size */ fixup,
2323 /* adjust_crop */ fixup);
2327 /* copy clips -- luckily v4l1 + v4l2 are binary
2328 compatible here ...*/
2330 size = sizeof(*clips)*(n+4);
2331 clips = kmalloc(size,GFP_KERNEL);
2335 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
2340 /* clip against screen */
2341 if (NULL != btv->fbuf.base)
2342 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
2344 btcx_sort_clips(clips,n);
2346 /* 4-byte alignments */
2347 switch (fh->ovfmt->depth) {
2350 btcx_align(&win->w, clips, n, 3);
2353 btcx_align(&win->w, clips, n, 1);
2356 /* no alignment fixups needed */
2362 mutex_lock(&fh->cap.lock);
2363 kfree(fh->ov.clips);
2364 fh->ov.clips = clips;
2368 fh->ov.field = win->field;
2369 fh->ov.setup_ok = 1;
2370 btv->init.ov.w.width = win->w.width;
2371 btv->init.ov.w.height = win->w.height;
2372 btv->init.ov.field = win->field;
2374 /* update overlay if needed */
2376 if (check_btres(fh, RESOURCE_OVERLAY)) {
2377 struct bttv_buffer *new;
2379 new = videobuf_pci_alloc(sizeof(*new));
2380 new->crop = btv->crop[!!fh->do_crop].rect;
2381 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2382 retval = bttv_switch_overlay(btv,fh,new);
2384 mutex_unlock(&fh->cap.lock);
2388 /* ----------------------------------------------------------------------- */
2390 static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
2392 struct videobuf_queue* q = NULL;
2395 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2398 case V4L2_BUF_TYPE_VBI_CAPTURE:
2407 static int bttv_resource(struct bttv_fh *fh)
2412 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2413 res = RESOURCE_VIDEO_STREAM;
2415 case V4L2_BUF_TYPE_VBI_CAPTURE:
2424 static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2426 struct videobuf_queue *q = bttv_queue(fh);
2427 int res = bttv_resource(fh);
2429 if (check_btres(fh,res))
2431 if (videobuf_queue_is_busy(q))
2438 pix_format_set_size (struct v4l2_pix_format * f,
2439 const struct bttv_format * fmt,
2441 unsigned int height)
2446 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2447 f->bytesperline = width; /* Y plane */
2448 f->sizeimage = (width * height * fmt->depth) >> 3;
2450 f->bytesperline = (width * fmt->depth) >> 3;
2451 f->sizeimage = height * f->bytesperline;
2455 static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f)
2458 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2459 memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format));
2460 pix_format_set_size (&f->fmt.pix, fh->fmt,
2461 fh->width, fh->height);
2462 f->fmt.pix.field = fh->cap.field;
2463 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2465 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2466 memset(&f->fmt.win,0,sizeof(struct v4l2_window));
2467 f->fmt.win.w = fh->ov.w;
2468 f->fmt.win.field = fh->ov.field;
2470 case V4L2_BUF_TYPE_VBI_CAPTURE:
2471 bttv_vbi_get_fmt(fh, &f->fmt.vbi);
2478 static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv,
2479 struct v4l2_format *f, int adjust_crop)
2482 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2484 const struct bttv_format *fmt;
2485 enum v4l2_field field;
2486 __s32 width, height;
2489 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2493 field = f->fmt.pix.field;
2494 if (V4L2_FIELD_ANY == field) {
2497 height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
2498 field = (f->fmt.pix.height > height2)
2499 ? V4L2_FIELD_INTERLACED
2500 : V4L2_FIELD_BOTTOM;
2502 if (V4L2_FIELD_SEQ_BT == field)
2503 field = V4L2_FIELD_SEQ_TB;
2505 case V4L2_FIELD_TOP:
2506 case V4L2_FIELD_BOTTOM:
2507 case V4L2_FIELD_ALTERNATE:
2508 case V4L2_FIELD_INTERLACED:
2510 case V4L2_FIELD_SEQ_TB:
2511 if (fmt->flags & FORMAT_FLAGS_PLANAR)
2518 width = f->fmt.pix.width;
2519 height = f->fmt.pix.height;
2521 rc = limit_scaled_size(fh, &width, &height, field,
2522 /* width_mask: 4 pixels */ ~3,
2523 /* width_bias: nearest */ 2,
2524 /* adjust_size */ 1,
2529 /* update data for the application */
2530 f->fmt.pix.field = field;
2531 pix_format_set_size(&f->fmt.pix, fmt, width, height);
2535 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2536 return verify_window(fh, &f->fmt.win,
2537 /* adjust_size */ 1,
2538 /* adjust_crop */ 0);
2539 case V4L2_BUF_TYPE_VBI_CAPTURE:
2540 return bttv_vbi_try_fmt(fh, &f->fmt.vbi);
2546 static int bttv_s_fmt(struct bttv_fh *fh, struct bttv *btv,
2547 struct v4l2_format *f)
2552 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2554 const struct bttv_format *fmt;
2556 retval = bttv_switch_type(fh,f->type);
2559 retval = bttv_try_fmt(fh,btv,f, /* adjust_crop */ 1);
2562 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2564 /* update our state informations */
2565 mutex_lock(&fh->cap.lock);
2567 fh->cap.field = f->fmt.pix.field;
2568 fh->cap.last = V4L2_FIELD_NONE;
2569 fh->width = f->fmt.pix.width;
2570 fh->height = f->fmt.pix.height;
2571 btv->init.fmt = fmt;
2572 btv->init.width = f->fmt.pix.width;
2573 btv->init.height = f->fmt.pix.height;
2574 mutex_unlock(&fh->cap.lock);
2578 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2579 if (no_overlay > 0) {
2580 printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2583 return setup_window(fh, btv, &f->fmt.win, 1);
2584 case V4L2_BUF_TYPE_VBI_CAPTURE:
2585 retval = bttv_switch_type(fh,f->type);
2588 return bttv_vbi_set_fmt(fh, &f->fmt.vbi);
2594 static int bttv_do_ioctl(struct inode *inode, struct file *file,
2595 unsigned int cmd, void *arg)
2597 struct bttv_fh *fh = file->private_data;
2598 struct bttv *btv = fh->btv;
2602 v4l_print_ioctl(btv->c.name, cmd);
2605 bttv_reinit_bt848(btv);
2610 case VIDIOC_S_INPUT:
2611 case VIDIOC_S_TUNER:
2612 case VIDIOC_S_FREQUENCY:
2613 retval = v4l2_prio_check(&btv->prio,&fh->prio);
2619 #ifdef CONFIG_VIDEO_V4L1_COMPAT
2622 struct video_mbuf *mbuf = arg;
2625 retval = videobuf_mmap_setup(&fh->cap,gbuffers,gbufsize,
2631 memset(mbuf,0,sizeof(*mbuf));
2632 mbuf->frames = gbuffers;
2633 mbuf->size = gbuffers * gbufsize;
2634 for (i = 0; i < gbuffers; i++)
2635 mbuf->offsets[i] = i * gbufsize;
2640 /* *** v4l2 *** ************************************************ */
2641 case VIDIOC_QUERYCAP:
2643 struct v4l2_capability *cap = arg;
2647 memset(cap, 0, sizeof (*cap));
2648 strlcpy(cap->driver, "bttv", sizeof (cap->driver));
2649 strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card));
2650 snprintf(cap->bus_info, sizeof (cap->bus_info),
2651 "PCI:%s", pci_name(btv->c.pci));
2652 cap->version = BTTV_VERSION_CODE;
2654 V4L2_CAP_VIDEO_CAPTURE |
2655 V4L2_CAP_VBI_CAPTURE |
2656 V4L2_CAP_READWRITE |
2658 if (no_overlay <= 0)
2659 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2661 if (bttv_tvcards[btv->c.type].tuner != UNSET &&
2662 bttv_tvcards[btv->c.type].tuner != TUNER_ABSENT)
2663 cap->capabilities |= V4L2_CAP_TUNER;
2666 case VIDIOC_ENUM_FMT:
2668 struct v4l2_fmtdesc *f = arg;
2669 enum v4l2_buf_type type;
2674 if (V4L2_BUF_TYPE_VBI_CAPTURE == type) {
2679 memset(f,0,sizeof(*f));
2682 f->pixelformat = V4L2_PIX_FMT_GREY;
2683 strcpy(f->description,"vbi data");
2687 /* video capture + overlay */
2689 for (i = 0; i < BTTV_FORMATS; i++) {
2690 if (bttv_formats[i].fourcc != -1)
2692 if ((unsigned int)index == f->index)
2695 if (BTTV_FORMATS == i)
2699 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2701 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2702 if (!(bttv_formats[i].flags & FORMAT_FLAGS_PACKED))
2708 memset(f,0,sizeof(*f));
2711 f->pixelformat = bttv_formats[i].fourcc;
2712 strlcpy(f->description,bttv_formats[i].name,sizeof(f->description));
2715 case VIDIOC_TRY_FMT:
2717 struct v4l2_format *f = arg;
2718 return bttv_try_fmt(fh,btv,f, /* adjust_crop */ 0);
2722 struct v4l2_format *f = arg;
2723 return bttv_g_fmt(fh,f);
2727 struct v4l2_format *f = arg;
2728 return bttv_s_fmt(fh,btv,f);
2733 struct v4l2_framebuffer *fb = arg;
2736 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2738 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2741 case VIDIOC_OVERLAY:
2743 struct bttv_buffer *new;
2748 if (NULL == btv->fbuf.base)
2750 if (!fh->ov.setup_ok) {
2751 dprintk("bttv%d: overlay: !setup_ok\n",btv->c.nr);
2756 if (!check_alloc_btres(btv,fh,RESOURCE_OVERLAY))
2759 mutex_lock(&fh->cap.lock);
2761 fh->ov.tvnorm = btv->tvnorm;
2762 new = videobuf_pci_alloc(sizeof(*new));
2763 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2769 retval = bttv_switch_overlay(btv,fh,new);
2770 mutex_unlock(&fh->cap.lock);
2775 struct v4l2_framebuffer *fb = arg;
2776 const struct bttv_format *fmt;
2778 if(!capable(CAP_SYS_ADMIN) &&
2779 !capable(CAP_SYS_RAWIO))
2783 fmt = format_by_fourcc(fb->fmt.pixelformat);
2786 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2790 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2791 __s32 width = fb->fmt.width;
2792 __s32 height = fb->fmt.height;
2794 retval = limit_scaled_size(fh, &width, &height,
2795 V4L2_FIELD_INTERLACED,
2796 /* width_mask */ ~3,
2798 /* adjust_size */ 0,
2799 /* adjust_crop */ 0);
2805 mutex_lock(&fh->cap.lock);
2806 btv->fbuf.base = fb->base;
2807 btv->fbuf.fmt.width = fb->fmt.width;
2808 btv->fbuf.fmt.height = fb->fmt.height;
2809 if (0 != fb->fmt.bytesperline)
2810 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2812 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2816 btv->init.ovfmt = fmt;
2817 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2820 fh->ov.w.width = fb->fmt.width;
2821 fh->ov.w.height = fb->fmt.height;
2822 btv->init.ov.w.width = fb->fmt.width;
2823 btv->init.ov.w.height = fb->fmt.height;
2824 kfree(fh->ov.clips);
2825 fh->ov.clips = NULL;
2828 if (check_btres(fh, RESOURCE_OVERLAY)) {
2829 struct bttv_buffer *new;
2831 new = videobuf_pci_alloc(sizeof(*new));
2832 new->crop = btv->crop[!!fh->do_crop].rect;
2833 bttv_overlay_risc(btv,&fh->ov,fh->ovfmt,new);
2834 retval = bttv_switch_overlay(btv,fh,new);
2837 mutex_unlock(&fh->cap.lock);
2840 case VIDIOC_REQBUFS:
2841 return videobuf_reqbufs(bttv_queue(fh),arg);
2842 case VIDIOC_QUERYBUF:
2843 return videobuf_querybuf(bttv_queue(fh),arg);
2846 int res = bttv_resource(fh);
2848 if (!check_alloc_btres(btv, fh, res))
2850 return videobuf_qbuf(bttv_queue(fh),arg);
2853 return videobuf_dqbuf(bttv_queue(fh),arg,
2854 file->f_flags & O_NONBLOCK);
2855 case VIDIOC_STREAMON:
2857 int res = bttv_resource(fh);
2859 if (!check_alloc_btres(btv,fh,res))
2861 return videobuf_streamon(bttv_queue(fh));
2863 case VIDIOC_STREAMOFF:
2865 int res = bttv_resource(fh);
2867 retval = videobuf_streamoff(bttv_queue(fh));
2870 free_btres(btv,fh,res);
2874 case VIDIOC_QUERYCTRL:
2876 struct v4l2_queryctrl *c = arg;
2879 if ((c->id < V4L2_CID_BASE ||
2880 c->id >= V4L2_CID_LASTP1) &&
2881 (c->id < V4L2_CID_PRIVATE_BASE ||
2882 c->id >= V4L2_CID_PRIVATE_LASTP1))
2884 for (i = 0; i < BTTV_CTLS; i++)
2885 if (bttv_ctls[i].id == c->id)
2887 if (i == BTTV_CTLS) {
2892 #ifdef CONFIG_VIDEO_V4L1
2893 if (btv->audio_hook && i >= 4 && i <= 8) {
2894 struct video_audio va;
2895 memset(&va,0,sizeof(va));
2896 btv->audio_hook(btv,&va,0);
2897 switch (bttv_ctls[i].id) {
2898 case V4L2_CID_AUDIO_VOLUME:
2899 if (!(va.flags & VIDEO_AUDIO_VOLUME))
2902 case V4L2_CID_AUDIO_BALANCE:
2903 if (!(va.flags & VIDEO_AUDIO_BALANCE))
2906 case V4L2_CID_AUDIO_BASS:
2907 if (!(va.flags & VIDEO_AUDIO_BASS))
2910 case V4L2_CID_AUDIO_TREBLE:
2911 if (!(va.flags & VIDEO_AUDIO_TREBLE))
2921 struct v4l2_streamparm *parm = arg;
2922 struct v4l2_standard s;
2923 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2925 memset(parm,0,sizeof(*parm));
2926 v4l2_video_std_construct(&s, bttv_tvnorms[btv->tvnorm].v4l2_id,
2927 bttv_tvnorms[btv->tvnorm].name);
2928 parm->parm.capture.timeperframe = s.frameperiod;
2931 case VIDIOC_G_TUNER:
2933 struct v4l2_tuner *t = arg;
2935 if (UNSET == bttv_tvcards[btv->c.type].tuner)
2939 mutex_lock(&btv->lock);
2940 memset(t,0,sizeof(*t));
2941 t->rxsubchans = V4L2_TUNER_SUB_MONO;
2942 bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
2943 strcpy(t->name, "Television");
2944 t->capability = V4L2_TUNER_CAP_NORM;
2945 t->type = V4L2_TUNER_ANALOG_TV;
2946 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
2948 #ifdef CONFIG_VIDEO_V4L1
2949 if (btv->audio_hook) {
2951 struct video_audio va;
2952 memset(&va, 0, sizeof(struct video_audio));
2953 btv->audio_hook(btv,&va,0);
2954 t->audmode = V4L2_TUNER_MODE_MONO;
2955 t->rxsubchans = V4L2_TUNER_SUB_MONO;
2956 if(va.mode & VIDEO_SOUND_STEREO) {
2957 t->audmode = V4L2_TUNER_MODE_STEREO;
2958 t->rxsubchans = V4L2_TUNER_SUB_STEREO;
2960 if(va.mode & VIDEO_SOUND_LANG2) {
2961 t->audmode = V4L2_TUNER_MODE_LANG1;
2962 t->rxsubchans = V4L2_TUNER_SUB_LANG1
2963 | V4L2_TUNER_SUB_LANG2;
2967 /* FIXME: fill capability+audmode */
2968 mutex_unlock(&btv->lock);
2972 case VIDIOC_G_PRIORITY:
2974 enum v4l2_priority *p = arg;
2976 *p = v4l2_prio_max(&btv->prio);
2979 case VIDIOC_S_PRIORITY:
2981 enum v4l2_priority *prio = arg;
2983 return v4l2_prio_change(&btv->prio, &fh->prio, *prio);
2986 case VIDIOC_CROPCAP:
2988 struct v4l2_cropcap *cap = arg;
2989 enum v4l2_buf_type type;
2993 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2994 type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2997 *cap = bttv_tvnorms[btv->tvnorm].cropcap;
3004 struct v4l2_crop * crop = arg;
3006 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
3007 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
3010 /* No fh->do_crop = 1; because btv->crop[1] may be
3011 inconsistent with fh->width or fh->height and apps
3012 do not expect a change here. */
3014 crop->c = btv->crop[!!fh->do_crop].rect;
3020 struct v4l2_crop *crop = arg;
3021 const struct v4l2_rect *b;
3028 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
3029 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
3032 retval = v4l2_prio_check(&btv->prio,&fh->prio);
3036 /* Make sure tvnorm, vbi_end and the current cropping
3037 parameters remain consistent until we're done. Note
3038 read() may change vbi_end in check_alloc_btres(). */
3039 mutex_lock(&btv->lock);
3043 if (locked_btres(fh->btv, VIDEO_RESOURCES))
3044 goto btv_unlock_and_return;
3046 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
3049 b_right = b_left + b->width;
3050 b_bottom = b->top + b->height;
3052 b_top = max(b->top, btv->vbi_end);
3053 if (b_top + 32 >= b_bottom)
3054 goto btv_unlock_and_return;
3056 /* Min. scaled size 48 x 32. */
3057 c.rect.left = clamp(crop->c.left, b_left, b_right - 48);
3058 c.rect.left = min(c.rect.left, (__s32) MAX_HDELAY);
3060 c.rect.width = clamp(crop->c.width,
3061 48, b_right - c.rect.left);
3063 c.rect.top = clamp(crop->c.top, b_top, b_bottom - 32);
3064 /* Top and height must be a multiple of two. */
3065 c.rect.top = (c.rect.top + 1) & ~1;
3067 c.rect.height = clamp(crop->c.height,
3068 32, b_bottom - c.rect.top);
3069 c.rect.height = (c.rect.height + 1) & ~1;
3071 bttv_crop_calc_limits(&c);
3075 mutex_unlock(&btv->lock);
3079 mutex_lock(&fh->cap.lock);
3081 if (fh->width < c.min_scaled_width) {
3082 fh->width = c.min_scaled_width;
3083 btv->init.width = c.min_scaled_width;
3084 } else if (fh->width > c.max_scaled_width) {
3085 fh->width = c.max_scaled_width;
3086 btv->init.width = c.max_scaled_width;
3089 if (fh->height < c.min_scaled_height) {
3090 fh->height = c.min_scaled_height;
3091 btv->init.height = c.min_scaled_height;
3092 } else if (fh->height > c.max_scaled_height) {
3093 fh->height = c.max_scaled_height;
3094 btv->init.height = c.max_scaled_height;
3097 mutex_unlock(&fh->cap.lock);
3102 case VIDIOC_ENUMSTD:
3105 case VIDIOC_ENUMINPUT:
3106 case VIDIOC_G_INPUT:
3107 case VIDIOC_S_INPUT:
3108 case VIDIOC_S_TUNER:
3109 case VIDIOC_G_FREQUENCY:
3110 case VIDIOC_S_FREQUENCY:
3111 case VIDIOC_LOG_STATUS:
3114 case VIDIOC_DBG_G_REGISTER:
3115 case VIDIOC_DBG_S_REGISTER:
3116 return bttv_common_ioctls(btv,cmd,arg);
3118 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
3123 fh_unlock_and_return:
3124 mutex_unlock(&fh->cap.lock);
3127 btv_unlock_and_return:
3128 mutex_unlock(&btv->lock);
3132 static int bttv_ioctl(struct inode *inode, struct file *file,
3133 unsigned int cmd, unsigned long arg)
3135 return video_usercopy(inode, file, cmd, arg, bttv_do_ioctl);
3138 static ssize_t bttv_read(struct file *file, char __user *data,
3139 size_t count, loff_t *ppos)
3141 struct bttv_fh *fh = file->private_data;
3144 if (fh->btv->errors)
3145 bttv_reinit_bt848(fh->btv);
3146 dprintk("bttv%d: read count=%d type=%s\n",
3147 fh->btv->c.nr,(int)count,v4l2_type_names[fh->type]);
3150 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3151 if (!check_alloc_btres(fh->btv, fh, RESOURCE_VIDEO_READ)) {
3152 /* VIDEO_READ in use by another fh,
3153 or VIDEO_STREAM by any fh. */
3156 retval = videobuf_read_one(&fh->cap, data, count, ppos,
3157 file->f_flags & O_NONBLOCK);
3158 free_btres(fh->btv, fh, RESOURCE_VIDEO_READ);
3160 case V4L2_BUF_TYPE_VBI_CAPTURE:
3161 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
3163 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
3164 file->f_flags & O_NONBLOCK);
3172 static unsigned int bttv_poll(struct file *file, poll_table *wait)
3174 struct bttv_fh *fh = file->private_data;
3175 struct bttv_buffer *buf;
3176 enum v4l2_field field;
3178 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
3179 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
3181 return videobuf_poll_stream(file, &fh->vbi, wait);
3184 if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
3185 /* streaming capture */
3186 if (list_empty(&fh->cap.stream))
3188 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
3190 /* read() capture */
3191 mutex_lock(&fh->cap.lock);
3192 if (NULL == fh->cap.read_buf) {
3193 /* need to capture a new frame */
3194 if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM)) {
3195 mutex_unlock(&fh->cap.lock);
3198 fh->cap.read_buf = videobuf_pci_alloc(fh->cap.msize);
3199 if (NULL == fh->cap.read_buf) {
3200 mutex_unlock(&fh->cap.lock);
3203 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
3204 field = videobuf_next_field(&fh->cap);
3205 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
3206 kfree (fh->cap.read_buf);
3207 fh->cap.read_buf = NULL;
3208 mutex_unlock(&fh->cap.lock);
3211 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
3212 fh->cap.read_off = 0;
3214 mutex_unlock(&fh->cap.lock);
3215 buf = (struct bttv_buffer*)fh->cap.read_buf;
3218 poll_wait(file, &buf->vb.done, wait);
3219 if (buf->vb.state == STATE_DONE ||
3220 buf->vb.state == STATE_ERROR)
3221 return POLLIN|POLLRDNORM;
3225 static int bttv_open(struct inode *inode, struct file *file)
3227 int minor = iminor(inode);
3228 struct bttv *btv = NULL;
3230 enum v4l2_buf_type type = 0;
3233 dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
3235 for (i = 0; i < bttv_num; i++) {
3236 if (bttvs[i].video_dev &&
3237 bttvs[i].video_dev->minor == minor) {
3239 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3242 if (bttvs[i].vbi_dev &&
3243 bttvs[i].vbi_dev->minor == minor) {
3245 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3252 dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
3253 btv->c.nr,v4l2_type_names[type]);
3255 /* allocate per filehandle data */
3256 fh = kmalloc(sizeof(*fh),GFP_KERNEL);
3259 file->private_data = fh;
3262 fh->ov.setup_ok = 0;
3263 v4l2_prio_open(&btv->prio,&fh->prio);
3265 videobuf_queue_pci_init(&fh->cap, &bttv_video_qops,
3266 btv->c.pci, &btv->s_lock,
3267 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3268 V4L2_FIELD_INTERLACED,
3269 sizeof(struct bttv_buffer),
3271 videobuf_queue_pci_init(&fh->vbi, &bttv_vbi_qops,
3272 btv->c.pci, &btv->s_lock,
3273 V4L2_BUF_TYPE_VBI_CAPTURE,
3275 sizeof(struct bttv_buffer),
3277 set_tvnorm(btv,btv->tvnorm);
3281 /* The V4L2 spec requires one global set of cropping parameters
3282 which only change on request. These are stored in btv->crop[1].
3283 However for compatibility with V4L apps and cropping unaware
3284 V4L2 apps we now reset the cropping parameters as seen through
3285 this fh, which is to say VIDIOC_G_CROP and scaling limit checks
3286 will use btv->crop[0], the default cropping parameters for the
3287 current video standard, and VIDIOC_S_FMT will not implicitely
3288 change the cropping parameters until VIDIOC_S_CROP has been
3290 fh->do_crop = !reset_crop; /* module parameter */
3292 /* Likewise there should be one global set of VBI capture
3293 parameters, but for compatibility with V4L apps and earlier
3294 driver versions each fh has its own parameters. */
3295 bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
3297 bttv_field_count(btv);
3301 static int bttv_release(struct inode *inode, struct file *file)
3303 struct bttv_fh *fh = file->private_data;
3304 struct bttv *btv = fh->btv;
3306 /* turn off overlay */
3307 if (check_btres(fh, RESOURCE_OVERLAY))
3308 bttv_switch_overlay(btv,fh,NULL);
3310 /* stop video capture */
3311 if (check_btres(fh, RESOURCE_VIDEO_STREAM)) {
3312 videobuf_streamoff(&fh->cap);
3313 free_btres(btv,fh,RESOURCE_VIDEO_STREAM);
3315 if (fh->cap.read_buf) {
3316 buffer_release(&fh->cap,fh->cap.read_buf);
3317 kfree(fh->cap.read_buf);
3319 if (check_btres(fh, RESOURCE_VIDEO_READ)) {
3320 free_btres(btv, fh, RESOURCE_VIDEO_READ);
3323 /* stop vbi capture */
3324 if (check_btres(fh, RESOURCE_VBI)) {
3325 videobuf_stop(&fh->vbi);
3326 free_btres(btv,fh,RESOURCE_VBI);
3330 videobuf_mmap_free(&fh->cap);
3331 videobuf_mmap_free(&fh->vbi);
3332 v4l2_prio_close(&btv->prio,&fh->prio);
3333 file->private_data = NULL;
3337 bttv_field_count(btv);
3342 bttv_mmap(struct file *file, struct vm_area_struct *vma)
3344 struct bttv_fh *fh = file->private_data;
3346 dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
3347 fh->btv->c.nr, v4l2_type_names[fh->type],
3348 vma->vm_start, vma->vm_end - vma->vm_start);
3349 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3352 static const struct file_operations bttv_fops =
3354 .owner = THIS_MODULE,
3356 .release = bttv_release,
3357 .ioctl = bttv_ioctl,
3358 .compat_ioctl = v4l_compat_ioctl32,
3359 .llseek = no_llseek,
3365 static struct video_device bttv_video_template =
3368 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|
3369 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
3374 static struct video_device bttv_vbi_template =
3376 .name = "bt848/878 vbi",
3377 .type = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
3382 /* ----------------------------------------------------------------------- */
3383 /* radio interface */
3385 static int radio_open(struct inode *inode, struct file *file)
3387 int minor = iminor(inode);
3388 struct bttv *btv = NULL;
3391 dprintk("bttv: open minor=%d\n",minor);
3393 for (i = 0; i < bttv_num; i++) {
3394 if (bttvs[i].radio_dev->minor == minor) {
3402 dprintk("bttv%d: open called (radio)\n",btv->c.nr);
3403 mutex_lock(&btv->lock);
3407 file->private_data = btv;
3409 bttv_call_i2c_clients(btv,AUDC_SET_RADIO,NULL);
3410 audio_input(btv,TVAUDIO_INPUT_RADIO);
3412 mutex_unlock(&btv->lock);
3416 static int radio_release(struct inode *inode, struct file *file)
3418 struct bttv *btv = file->private_data;
3419 struct rds_command cmd;
3423 bttv_call_i2c_clients(btv, RDS_CMD_CLOSE, &cmd);
3428 static int radio_do_ioctl(struct inode *inode, struct file *file,
3429 unsigned int cmd, void *arg)
3431 struct bttv *btv = file->private_data;
3434 case VIDIOC_QUERYCAP:
3436 struct v4l2_capability *cap = arg;
3438 memset(cap,0,sizeof(*cap));
3439 strcpy(cap->driver, "bttv");
3440 strlcpy(cap->card, btv->radio_dev->name,sizeof(cap->card));
3441 sprintf(cap->bus_info,"PCI:%s",pci_name(btv->c.pci));
3442 cap->version = BTTV_VERSION_CODE;
3443 cap->capabilities = V4L2_CAP_TUNER;
3446 case VIDIOC_G_TUNER:
3448 struct v4l2_tuner *t = arg;
3450 if (UNSET == bttv_tvcards[btv->c.type].tuner)
3454 mutex_lock(&btv->lock);
3455 memset(t,0,sizeof(*t));
3456 strcpy(t->name, "Radio");
3457 t->type = V4L2_TUNER_RADIO;
3459 bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
3461 mutex_unlock(&btv->lock);
3465 case VIDIOC_S_TUNER:
3466 case VIDIOC_G_FREQUENCY:
3467 case VIDIOC_S_FREQUENCY:
3470 case VIDIOC_LOG_STATUS:
3471 case VIDIOC_DBG_G_REGISTER:
3472 case VIDIOC_DBG_S_REGISTER:
3473 return bttv_common_ioctls(btv,cmd,arg);
3475 return v4l_compat_translate_ioctl(inode,file,cmd,arg,
3481 static int radio_ioctl(struct inode *inode, struct file *file,
3482 unsigned int cmd, unsigned long arg)
3484 return video_usercopy(inode, file, cmd, arg, radio_do_ioctl);
3487 static ssize_t radio_read(struct file *file, char __user *data,
3488 size_t count, loff_t *ppos)
3490 struct bttv *btv = file->private_data;
3491 struct rds_command cmd;
3492 cmd.block_count = count/3;
3494 cmd.instance = file;
3495 cmd.result = -ENODEV;
3497 bttv_call_i2c_clients(btv, RDS_CMD_READ, &cmd);
3502 static unsigned int radio_poll(struct file *file, poll_table *wait)
3504 struct bttv *btv = file->private_data;
3505 struct rds_command cmd;
3506 cmd.instance = file;
3507 cmd.event_list = wait;
3508 cmd.result = -ENODEV;
3509 bttv_call_i2c_clients(btv, RDS_CMD_POLL, &cmd);
3514 static const struct file_operations radio_fops =
3516 .owner = THIS_MODULE,
3519 .release = radio_release,
3520 .ioctl = radio_ioctl,
3521 .llseek = no_llseek,
3525 static struct video_device radio_template =
3527 .name = "bt848/878 radio",
3528 .type = VID_TYPE_TUNER,
3529 .fops = &radio_fops,
3533 /* ----------------------------------------------------------------------- */
3534 /* some debug code */
3536 static int bttv_risc_decode(u32 risc)
3538 static char *instr[16] = {
3539 [ BT848_RISC_WRITE >> 28 ] = "write",
3540 [ BT848_RISC_SKIP >> 28 ] = "skip",
3541 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3542 [ BT848_RISC_JUMP >> 28 ] = "jump",
3543 [ BT848_RISC_SYNC >> 28 ] = "sync",
3544 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3545 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3546 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3548 static int incr[16] = {
3549 [ BT848_RISC_WRITE >> 28 ] = 2,
3550 [ BT848_RISC_JUMP >> 28 ] = 2,
3551 [ BT848_RISC_SYNC >> 28 ] = 2,
3552 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3553 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3554 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3556 static char *bits[] = {
3557 "be0", "be1", "be2", "be3/resync",
3558 "set0", "set1", "set2", "set3",
3559 "clr0", "clr1", "clr2", "clr3",
3560 "irq", "res", "eol", "sol",
3564 printk("0x%08x [ %s", risc,
3565 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3566 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3567 if (risc & (1 << (i + 12)))
3568 printk(" %s",bits[i]);
3569 printk(" count=%d ]\n", risc & 0xfff);
3570 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3573 static void bttv_risc_disasm(struct bttv *btv,
3574 struct btcx_riscmem *risc)
3578 printk("%s: risc disasm: %p [dma=0x%08lx]\n",
3579 btv->c.name, risc->cpu, (unsigned long)risc->dma);
3580 for (i = 0; i < (risc->size >> 2); i += n) {
3581 printk("%s: 0x%lx: ", btv->c.name,
3582 (unsigned long)(risc->dma + (i<<2)));
3583 n = bttv_risc_decode(risc->cpu[i]);
3584 for (j = 1; j < n; j++)
3585 printk("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3586 btv->c.name, (unsigned long)(risc->dma + ((i+j)<<2)),
3588 if (0 == risc->cpu[i])
3593 static void bttv_print_riscaddr(struct bttv *btv)
3595 printk(" main: %08Lx\n",
3596 (unsigned long long)btv->main.dma);
3597 printk(" vbi : o=%08Lx e=%08Lx\n",
3598 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3599 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3600 printk(" cap : o=%08Lx e=%08Lx\n",
3601 btv->curr.top ? (unsigned long long)btv->curr.top->top.dma : 0,
3602 btv->curr.bottom ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3603 printk(" scr : o=%08Lx e=%08Lx\n",
3604 btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3605 btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3606 bttv_risc_disasm(btv, &btv->main);
3609 /* ----------------------------------------------------------------------- */
3612 static char *irq_name[] = {
3613 "FMTCHG", // format change detected (525 vs. 625)
3614 "VSYNC", // vertical sync (new field)
3615 "HSYNC", // horizontal sync
3616 "OFLOW", // chroma/luma AGC overflow
3617 "HLOCK", // horizontal lock changed
3618 "VPRES", // video presence changed
3620 "I2CDONE", // hw irc operation finished
3621 "GPINT", // gpio port triggered irq
3623 "RISCI", // risc instruction triggered irq
3624 "FBUS", // pixel data fifo dropped data (high pci bus latencies)
3625 "FTRGT", // pixel data fifo overrun
3626 "FDSR", // fifo data stream resyncronisation
3627 "PPERR", // parity error (data transfer)
3628 "RIPERR", // parity error (read risc instructions)
3629 "PABORT", // pci abort
3630 "OCERR", // risc instruction error
3631 "SCERR", // syncronisation error
3634 static void bttv_print_irqbits(u32 print, u32 mark)
3639 for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3640 if (print & (1 << i))
3641 printk(" %s",irq_name[i]);
3642 if (mark & (1 << i))
3647 static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3649 printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3651 (unsigned long)btv->main.dma,
3652 (unsigned long)btv->main.cpu[RISC_SLOT_O_VBI+1],
3653 (unsigned long)btv->main.cpu[RISC_SLOT_O_FIELD+1],
3656 if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3657 printk("bttv%d: Oh, there (temporarely?) is no input signal. "
3658 "Ok, then this is harmless, don't worry ;)\n",
3662 printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
3664 printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
3670 bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3672 struct bttv_buffer *item;
3674 memset(set,0,sizeof(*set));
3676 /* capture request ? */
3677 if (!list_empty(&btv->capture)) {
3679 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3680 if (V4L2_FIELD_HAS_TOP(item->vb.field))
3682 if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3685 /* capture request for other field ? */
3686 if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3687 (item->vb.queue.next != &btv->capture)) {
3688 item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3689 if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3690 if (NULL == set->top &&
3691 V4L2_FIELD_TOP == item->vb.field) {
3694 if (NULL == set->bottom &&
3695 V4L2_FIELD_BOTTOM == item->vb.field) {
3698 if (NULL != set->top && NULL != set->bottom)
3704 /* screen overlay ? */
3705 if (NULL != btv->screen) {
3706 if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3707 if (NULL == set->top && NULL == set->bottom) {
3708 set->top = btv->screen;
3709 set->bottom = btv->screen;
3712 if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3714 set->top = btv->screen;
3716 if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3717 NULL == set->bottom) {
3718 set->bottom = btv->screen;
3723 dprintk("bttv%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3724 btv->c.nr,set->top, set->bottom,
3725 btv->screen,set->frame_irq,set->top_irq);
3730 bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3731 struct bttv_buffer_set *curr, unsigned int state)
3735 do_gettimeofday(&ts);
3737 if (wakeup->top == wakeup->bottom) {
3738 if (NULL != wakeup->top && curr->top != wakeup->top) {
3740 printk("bttv%d: wakeup: both=%p\n",btv->c.nr,wakeup->top);
3741 wakeup->top->vb.ts = ts;
3742 wakeup->top->vb.field_count = btv->field_count;
3743 wakeup->top->vb.state = state;
3744 wake_up(&wakeup->top->vb.done);
3747 if (NULL != wakeup->top && curr->top != wakeup->top) {
3749 printk("bttv%d: wakeup: top=%p\n",btv->c.nr,wakeup->top);
3750 wakeup->top->vb.ts = ts;
3751 wakeup->top->vb.field_count = btv->field_count;
3752 wakeup->top->vb.state = state;
3753 wake_up(&wakeup->top->vb.done);
3755 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3757 printk("bttv%d: wakeup: bottom=%p\n",btv->c.nr,wakeup->bottom);
3758 wakeup->bottom->vb.ts = ts;
3759 wakeup->bottom->vb.field_count = btv->field_count;
3760 wakeup->bottom->vb.state = state;
3761 wake_up(&wakeup->bottom->vb.done);
3767 bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3775 do_gettimeofday(&ts);
3777 wakeup->vb.field_count = btv->field_count;
3778 wakeup->vb.state = state;
3779 wake_up(&wakeup->vb.done);
3782 static void bttv_irq_timeout(unsigned long data)
3784 struct bttv *btv = (struct bttv *)data;
3785 struct bttv_buffer_set old,new;
3786 struct bttv_buffer *ovbi;
3787 struct bttv_buffer *item;
3788 unsigned long flags;
3791 printk(KERN_INFO "bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3792 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3793 btread(BT848_RISC_COUNT));
3794 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3798 spin_lock_irqsave(&btv->s_lock,flags);
3800 /* deactivate stuff */
3801 memset(&new,0,sizeof(new));
3807 bttv_buffer_activate_video(btv, &new);
3808 bttv_buffer_activate_vbi(btv, NULL);
3809 bttv_set_dma(btv, 0);
3812 bttv_irq_wakeup_video(btv, &old, &new, STATE_ERROR);
3813 bttv_irq_wakeup_vbi(btv, ovbi, STATE_ERROR);
3815 /* cancel all outstanding capture / vbi requests */
3816 while (!list_empty(&btv->capture)) {
3817 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3818 list_del(&item->vb.queue);
3819 item->vb.state = STATE_ERROR;
3820 wake_up(&item->vb.done);
3822 while (!list_empty(&btv->vcapture)) {
3823 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3824 list_del(&item->vb.queue);
3825 item->vb.state = STATE_ERROR;
3826 wake_up(&item->vb.done);
3830 spin_unlock_irqrestore(&btv->s_lock,flags);
3834 bttv_irq_wakeup_top(struct bttv *btv)
3836 struct bttv_buffer *wakeup = btv->curr.top;
3841 spin_lock(&btv->s_lock);
3842 btv->curr.top_irq = 0;
3843 btv->curr.top = NULL;
3844 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3846 do_gettimeofday(&wakeup->vb.ts);
3847 wakeup->vb.field_count = btv->field_count;
3848 wakeup->vb.state = STATE_DONE;
3849 wake_up(&wakeup->vb.done);
3850 spin_unlock(&btv->s_lock);
3853 static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3857 if (rc > risc->dma + risc->size)
3863 bttv_irq_switch_video(struct bttv *btv)
3865 struct bttv_buffer_set new;
3866 struct bttv_buffer_set old;
3869 spin_lock(&btv->s_lock);
3871 /* new buffer set */
3872 bttv_irq_next_video(btv, &new);
3873 rc = btread(BT848_RISC_COUNT);
3874 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3875 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3878 bttv_irq_debug_low_latency(btv, rc);
3879 spin_unlock(&btv->s_lock);
3886 btv->loop_irq &= ~1;
3887 bttv_buffer_activate_video(btv, &new);
3888 bttv_set_dma(btv, 0);
3891 if (UNSET != btv->new_input) {
3892 video_mux(btv,btv->new_input);
3893 btv->new_input = UNSET;
3896 /* wake up finished buffers */
3897 bttv_irq_wakeup_video(btv, &old, &new, STATE_DONE);
3898 spin_unlock(&btv->s_lock);
3902 bttv_irq_switch_vbi(struct bttv *btv)
3904 struct bttv_buffer *new = NULL;
3905 struct bttv_buffer *old;
3908 spin_lock(&btv->s_lock);
3910 if (!list_empty(&btv->vcapture))
3911 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3914 rc = btread(BT848_RISC_COUNT);
3915 if (NULL != old && (is_active(&old->top, rc) ||
3916 is_active(&old->bottom, rc))) {
3919 bttv_irq_debug_low_latency(btv, rc);
3920 spin_unlock(&btv->s_lock);
3926 btv->loop_irq &= ~4;
3927 bttv_buffer_activate_vbi(btv, new);
3928 bttv_set_dma(btv, 0);
3930 bttv_irq_wakeup_vbi(btv, old, STATE_DONE);
3931 spin_unlock(&btv->s_lock);
3934 static irqreturn_t bttv_irq(int irq, void *dev_id)
3942 btv=(struct bttv *)dev_id;
3944 if (btv->custom_irq)
3945 handled = btv->custom_irq(btv);
3949 /* get/clear interrupt status bits */
3950 stat=btread(BT848_INT_STAT);
3951 astat=stat&btread(BT848_INT_MASK);
3955 btwrite(stat,BT848_INT_STAT);
3957 /* get device status bits */
3958 dstat=btread(BT848_DSTATUS);
3961 printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d "
3962 "riscs=%x, riscc=%08x, ",
3963 btv->c.nr, count, btv->field_count,
3964 stat>>28, btread(BT848_RISC_COUNT));
3965 bttv_print_irqbits(stat,astat);
3966 if (stat & BT848_INT_HLOCK)
3967 printk(" HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
3969 if (stat & BT848_INT_VPRES)
3970 printk(" PRES => %s", (dstat & BT848_DSTATUS_PRES)
3972 if (stat & BT848_INT_FMTCHG)
3973 printk(" NUML => %s", (dstat & BT848_DSTATUS_NUML)
3978 if (astat&BT848_INT_VSYNC)
3981 if ((astat & BT848_INT_GPINT) && btv->remote) {
3982 wake_up(&btv->gpioq);
3983 bttv_input_irq(btv);
3986 if (astat & BT848_INT_I2CDONE) {
3987 btv->i2c_done = stat;
3988 wake_up(&btv->i2c_queue);
3991 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
3992 bttv_irq_switch_vbi(btv);
3994 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
3995 bttv_irq_wakeup_top(btv);
3997 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
3998 bttv_irq_switch_video(btv);
4000 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
4001 audio_mute(btv, btv->mute); /* trigger automute */
4003 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
4004 printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->c.nr,
4005 (astat & BT848_INT_SCERR) ? "SCERR" : "",
4006 (astat & BT848_INT_OCERR) ? "OCERR" : "",
4007 btread(BT848_RISC_COUNT));
4008 bttv_print_irqbits(stat,astat);
4011 bttv_print_riscaddr(btv);
4013 if (fdsr && astat & BT848_INT_FDSR) {
4014 printk(KERN_INFO "bttv%d: FDSR @ %08x\n",
4015 btv->c.nr,btread(BT848_RISC_COUNT));
4017 bttv_print_riscaddr(btv);
4023 if (count > 8 || !(astat & BT848_INT_GPINT)) {
4024 btwrite(0, BT848_INT_MASK);
4027 "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr);
4030 "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv->c.nr);
4032 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
4036 bttv_print_irqbits(stat,astat);
4044 return IRQ_RETVAL(handled);
4048 /* ----------------------------------------------------------------------- */
4049 /* initialitation */
4051 static struct video_device *vdev_init(struct bttv *btv,
4052 struct video_device *template,
4055 struct video_device *vfd;
4057 vfd = video_device_alloc();
4062 vfd->dev = &btv->c.pci->dev;
4063 vfd->release = video_device_release;
4064 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
4065 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
4066 type, bttv_tvcards[btv->c.type].name);
4070 static void bttv_unregister_video(struct bttv *btv)
4072 if (btv->video_dev) {
4073 if (-1 != btv->video_dev->minor)
4074 video_unregister_device(btv->video_dev);
4076 video_device_release(btv->video_dev);
4077 btv->video_dev = NULL;
4080 if (-1 != btv->vbi_dev->minor)
4081 video_unregister_device(btv->vbi_dev);
4083 video_device_release(btv->vbi_dev);
4084 btv->vbi_dev = NULL;
4086 if (btv->radio_dev) {
4087 if (-1 != btv->radio_dev->minor)
4088 video_unregister_device(btv->radio_dev);
4090 video_device_release(btv->radio_dev);
4091 btv->radio_dev = NULL;
4095 /* register video4linux devices */
4096 static int __devinit bttv_register_video(struct bttv *btv)
4098 if (no_overlay <= 0) {
4099 bttv_video_template.type |= VID_TYPE_OVERLAY;
4101 printk("bttv: Overlay support disabled.\n");
4105 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
4106 if (NULL == btv->video_dev)
4108 if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0)
4110 printk(KERN_INFO "bttv%d: registered device video%d\n",
4111 btv->c.nr,btv->video_dev->minor & 0x1f);
4112 if (device_create_file(&btv->video_dev->class_dev,
4113 &dev_attr_card)<0) {
4114 printk(KERN_ERR "bttv%d: device_create_file 'card' "
4115 "failed\n", btv->c.nr);
4120 btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
4121 if (NULL == btv->vbi_dev)
4123 if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0)
4125 printk(KERN_INFO "bttv%d: registered device vbi%d\n",
4126 btv->c.nr,btv->vbi_dev->minor & 0x1f);
4128 if (!btv->has_radio)
4131 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
4132 if (NULL == btv->radio_dev)
4134 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0)
4136 printk(KERN_INFO "bttv%d: registered device radio%d\n",
4137 btv->c.nr,btv->radio_dev->minor & 0x1f);
4143 bttv_unregister_video(btv);
4148 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
4149 /* response on cards with no firmware is not enabled by OF */
4150 static void pci_set_command(struct pci_dev *dev)
4152 #if defined(__powerpc__)
4155 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
4156 cmd = (cmd | PCI_COMMAND_MEMORY );
4157 pci_write_config_dword(dev, PCI_COMMAND, cmd);
4161 static int __devinit bttv_probe(struct pci_dev *dev,
4162 const struct pci_device_id *pci_id)
4168 if (bttv_num == BTTV_MAX)
4170 printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
4171 btv=&bttvs[bttv_num];
4172 memset(btv,0,sizeof(*btv));
4173 btv->c.nr = bttv_num;
4174 sprintf(btv->c.name,"bttv%d",btv->c.nr);
4176 /* initialize structs / fill in defaults */
4177 mutex_init(&btv->lock);
4178 spin_lock_init(&btv->s_lock);
4179 spin_lock_init(&btv->gpio_lock);
4180 init_waitqueue_head(&btv->gpioq);
4181 init_waitqueue_head(&btv->i2c_queue);
4182 INIT_LIST_HEAD(&btv->c.subs);
4183 INIT_LIST_HEAD(&btv->capture);
4184 INIT_LIST_HEAD(&btv->vcapture);
4185 v4l2_prio_init(&btv->prio);
4187 init_timer(&btv->timeout);
4188 btv->timeout.function = bttv_irq_timeout;
4189 btv->timeout.data = (unsigned long)btv;
4192 btv->tuner_type = UNSET;
4193 btv->new_input = UNSET;
4194 btv->has_radio=radio[btv->c.nr];
4196 /* pci stuff (init, get irq/mmio, ... */
4198 btv->id = dev->device;
4199 if (pci_enable_device(dev)) {
4200 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4204 if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
4205 printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
4209 if (!request_mem_region(pci_resource_start(dev,0),
4210 pci_resource_len(dev,0),
4212 printk(KERN_WARNING "bttv%d: can't request iomem (0x%llx).\n",
4214 (unsigned long long)pci_resource_start(dev,0));
4217 pci_set_master(dev);
4218 pci_set_command(dev);
4219 pci_set_drvdata(dev,btv);
4221 pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
4222 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
4223 printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ",
4224 bttv_num,btv->id, btv->revision, pci_name(dev));
4225 printk("irq: %d, latency: %d, mmio: 0x%llx\n",
4226 btv->c.pci->irq, lat,
4227 (unsigned long long)pci_resource_start(dev,0));
4230 btv->bt848_mmio = ioremap(pci_resource_start(dev, 0), 0x1000);
4231 if (NULL == btv->bt848_mmio) {
4232 printk("bttv%d: ioremap() failed\n", btv->c.nr);
4240 /* disable irqs, register irq handler */
4241 btwrite(0, BT848_INT_MASK);
4242 result = request_irq(btv->c.pci->irq, bttv_irq,
4243 IRQF_SHARED | IRQF_DISABLED,btv->c.name,(void *)btv);
4245 printk(KERN_ERR "bttv%d: can't get IRQ %d\n",
4246 bttv_num,btv->c.pci->irq);
4250 if (0 != bttv_handle_chipset(btv)) {
4255 /* init options from insmod args */
4256 btv->opt_combfilter = combfilter;
4257 btv->opt_lumafilter = lumafilter;
4258 btv->opt_automute = automute;
4259 btv->opt_chroma_agc = chroma_agc;
4260 btv->opt_adc_crush = adc_crush;
4261 btv->opt_vcr_hack = vcr_hack;
4262 btv->opt_whitecrush_upper = whitecrush_upper;
4263 btv->opt_whitecrush_lower = whitecrush_lower;
4264 btv->opt_uv_ratio = uv_ratio;
4265 btv->opt_full_luma_range = full_luma_range;
4266 btv->opt_coring = coring;
4268 /* fill struct bttv with some useful defaults */
4269 btv->init.btv = btv;
4270 btv->init.ov.w.width = 320;
4271 btv->init.ov.w.height = 240;
4272 btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
4273 btv->init.width = 320;
4274 btv->init.height = 240;
4277 /* initialize hardware */
4279 bttv_gpio_tracking(btv,"pre-init");
4281 bttv_risc_init_main(btv);
4285 btwrite(0x00, BT848_GPIO_REG_INP);
4286 btwrite(0x00, BT848_GPIO_OUT_EN);
4288 bttv_gpio_tracking(btv,"init");
4290 /* needs to be done before i2c is registered */
4291 bttv_init_card1(btv);
4293 /* register i2c + gpio */
4296 /* some card-specific stuff (needs working i2c) */
4297 bttv_init_card2(btv);
4300 /* register video4linux + input */
4301 if (!bttv_tvcards[btv->c.type].no_video) {
4302 bttv_register_video(btv);
4303 bt848_bright(btv,32768);
4304 bt848_contrast(btv,32768);
4305 bt848_hue(btv,32768);
4306 bt848_sat(btv,32768);
4308 set_input(btv, 0, btv->tvnorm);
4309 bttv_crop_reset(&btv->crop[0], btv->tvnorm);
4310 btv->crop[1] = btv->crop[0]; /* current = default */
4311 disclaim_vbi_lines(btv);
4312 disclaim_video_lines(btv);
4315 /* add subdevices and autoload dvb-bt8xx if needed */
4316 if (bttv_tvcards[btv->c.type].has_dvb) {
4317 bttv_sub_add_device(&btv->c, "dvb");
4318 request_modules(btv);
4321 bttv_input_init(btv);
4323 /* everything is fine */
4328 free_irq(btv->c.pci->irq,btv);
4331 if (btv->bt848_mmio)
4332 iounmap(btv->bt848_mmio);
4333 release_mem_region(pci_resource_start(btv->c.pci,0),
4334 pci_resource_len(btv->c.pci,0));
4335 pci_set_drvdata(dev,NULL);
4339 static void __devexit bttv_remove(struct pci_dev *pci_dev)
4341 struct bttv *btv = pci_get_drvdata(pci_dev);
4344 printk("bttv%d: unloading\n",btv->c.nr);
4346 /* shutdown everything (DMA+IRQs) */
4347 btand(~15, BT848_GPIO_DMA_CTL);
4348 btwrite(0, BT848_INT_MASK);
4349 btwrite(~0x0, BT848_INT_STAT);
4350 btwrite(0x0, BT848_GPIO_OUT_EN);
4352 bttv_gpio_tracking(btv,"cleanup");
4354 /* tell gpio modules we are leaving ... */
4356 wake_up(&btv->gpioq);
4357 bttv_input_fini(btv);
4358 bttv_sub_del_devices(&btv->c);
4360 /* unregister i2c_bus + input */
4363 /* unregister video4linux */
4364 bttv_unregister_video(btv);
4366 /* free allocated memory */
4367 btcx_riscmem_free(btv->c.pci,&btv->main);
4369 /* free ressources */
4370 free_irq(btv->c.pci->irq,btv);
4371 iounmap(btv->bt848_mmio);
4372 release_mem_region(pci_resource_start(btv->c.pci,0),
4373 pci_resource_len(btv->c.pci,0));
4375 pci_set_drvdata(pci_dev, NULL);
4380 static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4382 struct bttv *btv = pci_get_drvdata(pci_dev);
4383 struct bttv_buffer_set idle;
4384 unsigned long flags;
4386 dprintk("bttv%d: suspend %d\n", btv->c.nr, state.event);
4388 /* stop dma + irqs */
4389 spin_lock_irqsave(&btv->s_lock,flags);
4390 memset(&idle, 0, sizeof(idle));
4391 btv->state.video = btv->curr;
4392 btv->state.vbi = btv->cvbi;
4393 btv->state.loop_irq = btv->loop_irq;
4396 bttv_buffer_activate_video(btv, &idle);
4397 bttv_buffer_activate_vbi(btv, NULL);
4398 bttv_set_dma(btv, 0);
4399 btwrite(0, BT848_INT_MASK);
4400 spin_unlock_irqrestore(&btv->s_lock,flags);
4402 /* save bt878 state */
4403 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4404 btv->state.gpio_data = gpio_read();
4406 /* save pci state */
4407 pci_save_state(pci_dev);
4408 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4409 pci_disable_device(pci_dev);
4410 btv->state.disabled = 1;
4415 static int bttv_resume(struct pci_dev *pci_dev)
4417 struct bttv *btv = pci_get_drvdata(pci_dev);
4418 unsigned long flags;
4421 dprintk("bttv%d: resume\n", btv->c.nr);
4423 /* restore pci state */
4424 if (btv->state.disabled) {
4425 err=pci_enable_device(pci_dev);
4427 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4431 btv->state.disabled = 0;
4433 err=pci_set_power_state(pci_dev, PCI_D0);
4435 pci_disable_device(pci_dev);
4436 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4438 btv->state.disabled = 1;
4442 pci_restore_state(pci_dev);
4444 /* restore bt878 state */
4445 bttv_reinit_bt848(btv);
4446 gpio_inout(0xffffff, btv->state.gpio_enable);
4447 gpio_write(btv->state.gpio_data);
4450 spin_lock_irqsave(&btv->s_lock,flags);
4451 btv->curr = btv->state.video;
4452 btv->cvbi = btv->state.vbi;
4453 btv->loop_irq = btv->state.loop_irq;
4454 bttv_buffer_activate_video(btv, &btv->curr);
4455 bttv_buffer_activate_vbi(btv, btv->cvbi);
4456 bttv_set_dma(btv, 0);
4457 spin_unlock_irqrestore(&btv->s_lock,flags);
4462 static struct pci_device_id bttv_pci_tbl[] = {
4463 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848,
4464 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4465 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849,
4466 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4467 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878,
4468 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4469 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879,
4470 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4474 MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4476 static struct pci_driver bttv_pci_driver = {
4478 .id_table = bttv_pci_tbl,
4479 .probe = bttv_probe,
4480 .remove = __devexit_p(bttv_remove),
4482 .suspend = bttv_suspend,
4483 .resume = bttv_resume,
4487 static int __init bttv_init_module(void)
4493 printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
4494 (BTTV_VERSION_CODE >> 16) & 0xff,
4495 (BTTV_VERSION_CODE >> 8) & 0xff,
4496 BTTV_VERSION_CODE & 0xff);
4498 printk(KERN_INFO "bttv: snapshot date %04d-%02d-%02d\n",
4499 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
4501 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4503 if (gbufsize < 0 || gbufsize > BTTV_MAX_FBUF)
4504 gbufsize = BTTV_MAX_FBUF;
4505 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4507 printk(KERN_INFO "bttv: using %d buffers with %dk (%d pages) each for capture\n",
4508 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4510 bttv_check_chipset();
4512 ret = bus_register(&bttv_sub_bus_type);
4514 printk(KERN_WARNING "bttv: bus_register error: %d\n", ret);
4517 return pci_register_driver(&bttv_pci_driver);
4520 static void __exit bttv_cleanup_module(void)
4522 pci_unregister_driver(&bttv_pci_driver);
4523 bus_unregister(&bttv_sub_bus_type);
4527 module_init(bttv_init_module);
4528 module_exit(bttv_cleanup_module);