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/slab.h>
41 #include <linux/errno.h>
43 #include <linux/kernel.h>
44 #include <linux/sched.h>
45 #include <linux/smp_lock.h>
46 #include <linux/interrupt.h>
47 #include <linux/kdev_t.h>
49 #include <media/v4l2-common.h>
50 #include <media/v4l2-ioctl.h>
51 #include <media/tvaudio.h>
52 #include <media/msp3400.h>
54 #include <linux/dma-mapping.h>
57 #include <asm/byteorder.h>
59 #include <media/rds.h>
62 unsigned int bttv_num; /* number of Bt848s in use */
63 struct bttv *bttvs[BTTV_MAX];
65 unsigned int bttv_debug;
66 unsigned int bttv_verbose = 1;
67 unsigned int bttv_gpio;
69 /* config variables */
71 static unsigned int bigendian=1;
73 static unsigned int bigendian;
75 static unsigned int radio[BTTV_MAX];
76 static unsigned int irq_debug;
77 static unsigned int gbuffers = 8;
78 static unsigned int gbufsize = 0x208000;
79 static unsigned int reset_crop = 1;
81 static int video_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
82 static int radio_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
83 static int vbi_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
84 static int debug_latency;
85 static int disable_ir;
87 static unsigned int fdsr;
90 static unsigned int combfilter;
91 static unsigned int lumafilter;
92 static unsigned int automute = 1;
93 static unsigned int chroma_agc;
94 static unsigned int adc_crush = 1;
95 static unsigned int whitecrush_upper = 0xCF;
96 static unsigned int whitecrush_lower = 0x7F;
97 static unsigned int vcr_hack;
98 static unsigned int irq_iswitch;
99 static unsigned int uv_ratio = 50;
100 static unsigned int full_luma_range;
101 static unsigned int coring;
103 /* API features (turn on/off stuff for testing) */
104 static unsigned int v4l2 = 1;
107 module_param(bttv_verbose, int, 0644);
108 module_param(bttv_gpio, int, 0644);
109 module_param(bttv_debug, int, 0644);
110 module_param(irq_debug, int, 0644);
111 module_param(debug_latency, int, 0644);
112 module_param(disable_ir, int, 0444);
114 module_param(fdsr, int, 0444);
115 module_param(gbuffers, int, 0444);
116 module_param(gbufsize, int, 0444);
117 module_param(reset_crop, int, 0444);
119 module_param(v4l2, int, 0644);
120 module_param(bigendian, int, 0644);
121 module_param(irq_iswitch, int, 0644);
122 module_param(combfilter, int, 0444);
123 module_param(lumafilter, int, 0444);
124 module_param(automute, int, 0444);
125 module_param(chroma_agc, int, 0444);
126 module_param(adc_crush, int, 0444);
127 module_param(whitecrush_upper, int, 0444);
128 module_param(whitecrush_lower, int, 0444);
129 module_param(vcr_hack, int, 0444);
130 module_param(uv_ratio, int, 0444);
131 module_param(full_luma_range, int, 0444);
132 module_param(coring, int, 0444);
134 module_param_array(radio, int, NULL, 0444);
135 module_param_array(video_nr, int, NULL, 0444);
136 module_param_array(radio_nr, int, NULL, 0444);
137 module_param_array(vbi_nr, int, NULL, 0444);
139 MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
140 MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
141 MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
142 MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
143 MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
144 MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
145 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
146 MODULE_PARM_DESC(gbuffers,"number of capture buffers. range 2-32, default 8");
147 MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
148 MODULE_PARM_DESC(reset_crop,"reset cropping parameters at open(), default "
149 "is 1 (yes) for compatibility with older applications");
150 MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
151 MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
152 MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
153 MODULE_PARM_DESC(whitecrush_upper,"sets the white crush upper value, default is 207");
154 MODULE_PARM_DESC(whitecrush_lower,"sets the white crush lower value, default is 127");
155 MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
156 MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler");
157 MODULE_PARM_DESC(uv_ratio,"ratio between u and v gains, default is 50");
158 MODULE_PARM_DESC(full_luma_range,"use the full luma range, default is 0 (no)");
159 MODULE_PARM_DESC(coring,"set the luma coring level, default is 0 (no)");
160 MODULE_PARM_DESC(video_nr, "video device numbers");
161 MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
162 MODULE_PARM_DESC(radio_nr, "radio device numbers");
164 MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
165 MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
166 MODULE_LICENSE("GPL");
168 /* ----------------------------------------------------------------------- */
171 static ssize_t show_card(struct device *cd,
172 struct device_attribute *attr, char *buf)
174 struct video_device *vfd = container_of(cd, struct video_device, dev);
175 struct bttv *btv = video_get_drvdata(vfd);
176 return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
178 static DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
180 /* ----------------------------------------------------------------------- */
181 /* dvb auto-load setup */
182 #if defined(CONFIG_MODULES) && defined(MODULE)
183 static void request_module_async(struct work_struct *work)
185 request_module("dvb-bt8xx");
188 static void request_modules(struct bttv *dev)
190 INIT_WORK(&dev->request_module_wk, request_module_async);
191 schedule_work(&dev->request_module_wk);
194 #define request_modules(dev)
195 #endif /* CONFIG_MODULES */
198 /* ----------------------------------------------------------------------- */
201 /* special timing tables from conexant... */
202 static u8 SRAM_Table[][60] =
204 /* PAL digital input over GPIO[7:0] */
206 45, // 45 bytes following
207 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
208 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
209 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
210 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
211 0x37,0x00,0xAF,0x21,0x00
213 /* NTSC digital input over GPIO[7:0] */
215 51, // 51 bytes following
216 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
217 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
218 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
219 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
220 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
223 // TGB_NTSC392 // quartzsight
224 // This table has been modified to be used for Fusion Rev D
226 0x2A, // size of table = 42
227 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
228 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
229 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
230 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
235 /* minhdelayx1 first video pixel we can capture on a line and
236 hdelayx1 start of active video, both relative to rising edge of
237 /HRESET pulse (0H) in 1 / fCLKx1.
238 swidth width of active video and
239 totalwidth total line width, both in 1 / fCLKx1.
240 sqwidth total line width in square pixels.
241 vdelay start of active video in 2 * field lines relative to
242 trailing edge of /VRESET pulse (VDELAY register).
243 sheight height of active video in 2 * field lines.
244 videostart0 ITU-R frame line number of the line corresponding
245 to vdelay in the first field. */
246 #define CROPCAP(minhdelayx1, hdelayx1, swidth, totalwidth, sqwidth, \
247 vdelay, sheight, videostart0) \
248 .cropcap.bounds.left = minhdelayx1, \
249 /* * 2 because vertically we count field lines times two, */ \
250 /* e.g. 23 * 2 to 23 * 2 + 576 in PAL-BGHI defrect. */ \
251 .cropcap.bounds.top = (videostart0) * 2 - (vdelay) + MIN_VDELAY, \
252 /* 4 is a safety margin at the end of the line. */ \
253 .cropcap.bounds.width = (totalwidth) - (minhdelayx1) - 4, \
254 .cropcap.bounds.height = (sheight) + (vdelay) - MIN_VDELAY, \
255 .cropcap.defrect.left = hdelayx1, \
256 .cropcap.defrect.top = (videostart0) * 2, \
257 .cropcap.defrect.width = swidth, \
258 .cropcap.defrect.height = sheight, \
259 .cropcap.pixelaspect.numerator = totalwidth, \
260 .cropcap.pixelaspect.denominator = sqwidth,
262 const struct bttv_tvnorm bttv_tvnorms[] = {
264 /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
265 /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
267 .v4l2_id = V4L2_STD_PAL,
275 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
276 .scaledtwidth = 1135,
280 .vbipack = 255, /* min (2048 / 4, 0x1ff) & 0xff */
282 /* ITU-R frame line number of the first VBI line
283 we can capture, of the first and second field.
284 The last line is determined by cropcap.bounds. */
285 .vbistart = { 7, 320 },
286 CROPCAP(/* minhdelayx1 */ 68,
288 /* Should be (768 * 1135 + 944 / 2) / 944.
289 cropcap.defrect is used for image width
290 checks, so we keep the old value 924. */
292 /* totalwidth */ 1135,
296 /* videostart0 */ 23)
297 /* bt878 (and bt848?) can capture another
298 line below active video. */
299 .cropcap.bounds.height = (576 + 2) + 0x20 - 2,
301 .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
309 .iform = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
314 .vbipack = 144, /* min (1600 / 4, 0x1ff) & 0xff */
316 .vbistart = { 10, 273 },
317 CROPCAP(/* minhdelayx1 */ 68,
319 /* Should be (640 * 910 + 780 / 2) / 780? */
321 /* totalwidth */ 910,
325 /* videostart0 */ 23)
327 .v4l2_id = V4L2_STD_SECAM,
335 .iform = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
336 .scaledtwidth = 1135,
341 .sram = 0, /* like PAL, correct? */
342 .vbistart = { 7, 320 },
343 CROPCAP(/* minhdelayx1 */ 68,
346 /* totalwidth */ 1135,
350 /* videostart0 */ 23)
352 .v4l2_id = V4L2_STD_PAL_Nc,
360 .iform = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
367 .vbistart = { 7, 320 },
368 CROPCAP(/* minhdelayx1 */ 68,
370 /* swidth */ (640 * 910 + 780 / 2) / 780,
371 /* totalwidth */ 910,
375 /* videostart0 */ 23)
377 .v4l2_id = V4L2_STD_PAL_M,
385 .iform = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
392 .vbistart = { 10, 273 },
393 CROPCAP(/* minhdelayx1 */ 68,
395 /* swidth */ (640 * 910 + 780 / 2) / 780,
396 /* totalwidth */ 910,
400 /* videostart0 */ 23)
402 .v4l2_id = V4L2_STD_PAL_N,
410 .iform = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
417 .vbistart = { 7, 320 },
418 CROPCAP(/* minhdelayx1 */ 68,
420 /* swidth */ (768 * 1135 + 944 / 2) / 944,
421 /* totalwidth */ 1135,
425 /* videostart0 */ 23)
427 .v4l2_id = V4L2_STD_NTSC_M_JP,
435 .iform = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
442 .vbistart = { 10, 273 },
443 CROPCAP(/* minhdelayx1 */ 68,
445 /* swidth */ (640 * 910 + 780 / 2) / 780,
446 /* totalwidth */ 910,
450 /* videostart0 */ 23)
452 /* that one hopefully works with the strange timing
453 * which video recorders produce when playing a NTSC
454 * tape on a PAL TV ... */
455 .v4l2_id = V4L2_STD_PAL_60,
463 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
464 .scaledtwidth = 1135,
471 .vbistart = { 10, 273 },
472 CROPCAP(/* minhdelayx1 */ 68,
475 /* totalwidth */ 1135,
479 /* videostart0 */ 23)
482 static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
484 /* ----------------------------------------------------------------------- */
486 packed pixel formats must come first */
487 static const struct bttv_format formats[] = {
489 .name = "8 bpp, gray",
490 .fourcc = V4L2_PIX_FMT_GREY,
491 .btformat = BT848_COLOR_FMT_Y8,
493 .flags = FORMAT_FLAGS_PACKED,
495 .name = "8 bpp, dithered color",
496 .fourcc = V4L2_PIX_FMT_HI240,
497 .btformat = BT848_COLOR_FMT_RGB8,
499 .flags = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
501 .name = "15 bpp RGB, le",
502 .fourcc = V4L2_PIX_FMT_RGB555,
503 .btformat = BT848_COLOR_FMT_RGB15,
505 .flags = FORMAT_FLAGS_PACKED,
507 .name = "15 bpp RGB, be",
508 .fourcc = V4L2_PIX_FMT_RGB555X,
509 .btformat = BT848_COLOR_FMT_RGB15,
510 .btswap = 0x03, /* byteswap */
512 .flags = FORMAT_FLAGS_PACKED,
514 .name = "16 bpp RGB, le",
515 .fourcc = V4L2_PIX_FMT_RGB565,
516 .btformat = BT848_COLOR_FMT_RGB16,
518 .flags = FORMAT_FLAGS_PACKED,
520 .name = "16 bpp RGB, be",
521 .fourcc = V4L2_PIX_FMT_RGB565X,
522 .btformat = BT848_COLOR_FMT_RGB16,
523 .btswap = 0x03, /* byteswap */
525 .flags = FORMAT_FLAGS_PACKED,
527 .name = "24 bpp RGB, le",
528 .fourcc = V4L2_PIX_FMT_BGR24,
529 .btformat = BT848_COLOR_FMT_RGB24,
531 .flags = FORMAT_FLAGS_PACKED,
533 .name = "32 bpp RGB, le",
534 .fourcc = V4L2_PIX_FMT_BGR32,
535 .btformat = BT848_COLOR_FMT_RGB32,
537 .flags = FORMAT_FLAGS_PACKED,
539 .name = "32 bpp RGB, be",
540 .fourcc = V4L2_PIX_FMT_RGB32,
541 .btformat = BT848_COLOR_FMT_RGB32,
542 .btswap = 0x0f, /* byte+word swap */
544 .flags = FORMAT_FLAGS_PACKED,
546 .name = "4:2:2, packed, YUYV",
547 .fourcc = V4L2_PIX_FMT_YUYV,
548 .btformat = BT848_COLOR_FMT_YUY2,
550 .flags = FORMAT_FLAGS_PACKED,
552 .name = "4:2:2, packed, YUYV",
553 .fourcc = V4L2_PIX_FMT_YUYV,
554 .btformat = BT848_COLOR_FMT_YUY2,
556 .flags = FORMAT_FLAGS_PACKED,
558 .name = "4:2:2, packed, UYVY",
559 .fourcc = V4L2_PIX_FMT_UYVY,
560 .btformat = BT848_COLOR_FMT_YUY2,
561 .btswap = 0x03, /* byteswap */
563 .flags = FORMAT_FLAGS_PACKED,
565 .name = "4:2:2, planar, Y-Cb-Cr",
566 .fourcc = V4L2_PIX_FMT_YUV422P,
567 .btformat = BT848_COLOR_FMT_YCrCb422,
569 .flags = FORMAT_FLAGS_PLANAR,
573 .name = "4:2:0, planar, Y-Cb-Cr",
574 .fourcc = V4L2_PIX_FMT_YUV420,
575 .btformat = BT848_COLOR_FMT_YCrCb422,
577 .flags = FORMAT_FLAGS_PLANAR,
581 .name = "4:2:0, planar, Y-Cr-Cb",
582 .fourcc = V4L2_PIX_FMT_YVU420,
583 .btformat = BT848_COLOR_FMT_YCrCb422,
585 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
589 .name = "4:1:1, planar, Y-Cb-Cr",
590 .fourcc = V4L2_PIX_FMT_YUV411P,
591 .btformat = BT848_COLOR_FMT_YCrCb411,
593 .flags = FORMAT_FLAGS_PLANAR,
597 .name = "4:1:0, planar, Y-Cb-Cr",
598 .fourcc = V4L2_PIX_FMT_YUV410,
599 .btformat = BT848_COLOR_FMT_YCrCb411,
601 .flags = FORMAT_FLAGS_PLANAR,
605 .name = "4:1:0, planar, Y-Cr-Cb",
606 .fourcc = V4L2_PIX_FMT_YVU410,
607 .btformat = BT848_COLOR_FMT_YCrCb411,
609 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
613 .name = "raw scanlines",
615 .btformat = BT848_COLOR_FMT_RAW,
617 .flags = FORMAT_FLAGS_RAW,
620 static const unsigned int FORMATS = ARRAY_SIZE(formats);
622 /* ----------------------------------------------------------------------- */
624 #define V4L2_CID_PRIVATE_CHROMA_AGC (V4L2_CID_PRIVATE_BASE + 0)
625 #define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_PRIVATE_BASE + 1)
626 #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2)
627 #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3)
628 #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4)
629 #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5)
630 #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6)
631 #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7)
632 #define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8)
633 #define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9)
634 #define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10)
635 #define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11)
637 static const struct v4l2_queryctrl no_ctl = {
639 .flags = V4L2_CTRL_FLAG_DISABLED,
641 static const struct v4l2_queryctrl bttv_ctls[] = {
644 .id = V4L2_CID_BRIGHTNESS,
645 .name = "Brightness",
649 .default_value = 32768,
650 .type = V4L2_CTRL_TYPE_INTEGER,
652 .id = V4L2_CID_CONTRAST,
657 .default_value = 32768,
658 .type = V4L2_CTRL_TYPE_INTEGER,
660 .id = V4L2_CID_SATURATION,
661 .name = "Saturation",
665 .default_value = 32768,
666 .type = V4L2_CTRL_TYPE_INTEGER,
673 .default_value = 32768,
674 .type = V4L2_CTRL_TYPE_INTEGER,
678 .id = V4L2_CID_AUDIO_MUTE,
682 .type = V4L2_CTRL_TYPE_BOOLEAN,
684 .id = V4L2_CID_AUDIO_VOLUME,
689 .default_value = 65535,
690 .type = V4L2_CTRL_TYPE_INTEGER,
692 .id = V4L2_CID_AUDIO_BALANCE,
697 .default_value = 32768,
698 .type = V4L2_CTRL_TYPE_INTEGER,
700 .id = V4L2_CID_AUDIO_BASS,
705 .default_value = 32768,
706 .type = V4L2_CTRL_TYPE_INTEGER,
708 .id = V4L2_CID_AUDIO_TREBLE,
713 .default_value = 32768,
714 .type = V4L2_CTRL_TYPE_INTEGER,
716 /* --- private --- */
718 .id = V4L2_CID_PRIVATE_CHROMA_AGC,
719 .name = "chroma agc",
722 .type = V4L2_CTRL_TYPE_BOOLEAN,
724 .id = V4L2_CID_PRIVATE_COMBFILTER,
725 .name = "combfilter",
728 .type = V4L2_CTRL_TYPE_BOOLEAN,
730 .id = V4L2_CID_PRIVATE_AUTOMUTE,
734 .type = V4L2_CTRL_TYPE_BOOLEAN,
736 .id = V4L2_CID_PRIVATE_LUMAFILTER,
737 .name = "luma decimation filter",
740 .type = V4L2_CTRL_TYPE_BOOLEAN,
742 .id = V4L2_CID_PRIVATE_AGC_CRUSH,
746 .type = V4L2_CTRL_TYPE_BOOLEAN,
748 .id = V4L2_CID_PRIVATE_VCR_HACK,
752 .type = V4L2_CTRL_TYPE_BOOLEAN,
754 .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
755 .name = "whitecrush upper",
759 .default_value = 0xCF,
760 .type = V4L2_CTRL_TYPE_INTEGER,
762 .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
763 .name = "whitecrush lower",
767 .default_value = 0x7F,
768 .type = V4L2_CTRL_TYPE_INTEGER,
770 .id = V4L2_CID_PRIVATE_UV_RATIO,
776 .type = V4L2_CTRL_TYPE_INTEGER,
778 .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
779 .name = "full luma range",
782 .type = V4L2_CTRL_TYPE_BOOLEAN,
784 .id = V4L2_CID_PRIVATE_CORING,
790 .type = V4L2_CTRL_TYPE_INTEGER,
797 static const struct v4l2_queryctrl *ctrl_by_id(int id)
801 for (i = 0; i < ARRAY_SIZE(bttv_ctls); i++)
802 if (bttv_ctls[i].id == id)
808 /* ----------------------------------------------------------------------- */
809 /* resource management */
812 RESOURCE_ allocated by freed by
814 VIDEO_READ bttv_read 1) bttv_read 2)
816 VIDEO_STREAM VIDIOC_STREAMON VIDIOC_STREAMOFF
817 VIDIOC_QBUF 1) bttv_release
820 OVERLAY VIDIOCCAPTURE on VIDIOCCAPTURE off
821 VIDIOC_OVERLAY on VIDIOC_OVERLAY off
824 VBI VIDIOC_STREAMON VIDIOC_STREAMOFF
825 VIDIOC_QBUF 1) bttv_release
826 bttv_read, bttv_poll 1) 4)
828 1) The resource must be allocated when we enter buffer prepare functions
829 and remain allocated while buffers are in the DMA queue.
830 2) This is a single frame read.
831 3) VIDIOC_S_FBUF and VIDIOC_S_FMT (OVERLAY) still work when
832 RESOURCE_OVERLAY is allocated.
833 4) This is a continuous read, implies VIDIOC_STREAMON.
835 Note this driver permits video input and standard changes regardless if
836 resources are allocated.
839 #define VBI_RESOURCES (RESOURCE_VBI)
840 #define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
841 RESOURCE_VIDEO_STREAM | \
845 int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit)
847 int xbits; /* mutual exclusive resources */
849 if (fh->resources & bit)
850 /* have it already allocated */
854 if (bit & (RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM))
855 xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
858 if (btv->resources & xbits) {
859 /* no, someone else uses it */
863 if ((bit & VIDEO_RESOURCES)
864 && 0 == (btv->resources & VIDEO_RESOURCES)) {
865 /* Do crop - use current, don't - use default parameters. */
866 __s32 top = btv->crop[!!fh->do_crop].rect.top;
868 if (btv->vbi_end > top)
871 /* We cannot capture the same line as video and VBI data.
872 Claim scan lines crop[].rect.top to bottom. */
873 btv->crop_start = top;
874 } else if (bit & VBI_RESOURCES) {
875 __s32 end = fh->vbi_fmt.end;
877 if (end > btv->crop_start)
880 /* Claim scan lines above fh->vbi_fmt.end. */
884 /* it's free, grab it */
885 fh->resources |= bit;
886 btv->resources |= bit;
894 int check_btres(struct bttv_fh *fh, int bit)
896 return (fh->resources & bit);
900 int locked_btres(struct bttv *btv, int bit)
902 return (btv->resources & bit);
905 /* Call with btv->lock down. */
907 disclaim_vbi_lines(struct bttv *btv)
912 /* Call with btv->lock down. */
914 disclaim_video_lines(struct bttv *btv)
916 const struct bttv_tvnorm *tvnorm;
919 tvnorm = &bttv_tvnorms[btv->tvnorm];
920 btv->crop_start = tvnorm->cropcap.bounds.top
921 + tvnorm->cropcap.bounds.height;
923 /* VBI capturing ends at VDELAY, start of video capturing, no
924 matter how many lines the VBI RISC program expects. When video
925 capturing is off, it shall no longer "preempt" VBI capturing,
926 so we set VDELAY to maximum. */
927 crop = btread(BT848_E_CROP) | 0xc0;
928 btwrite(crop, BT848_E_CROP);
929 btwrite(0xfe, BT848_E_VDELAY_LO);
930 btwrite(crop, BT848_O_CROP);
931 btwrite(0xfe, BT848_O_VDELAY_LO);
935 void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits)
937 if ((fh->resources & bits) != bits) {
938 /* trying to free ressources not allocated by us ... */
939 printk("bttv: BUG! (btres)\n");
941 fh->resources &= ~bits;
942 btv->resources &= ~bits;
944 bits = btv->resources;
946 if (0 == (bits & VIDEO_RESOURCES))
947 disclaim_video_lines(btv);
949 if (0 == (bits & VBI_RESOURCES))
950 disclaim_vbi_lines(btv);
953 /* ----------------------------------------------------------------------- */
954 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
956 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
957 PLL_X = Reference pre-divider (0=1, 1=2)
958 PLL_C = Post divider (0=6, 1=4)
959 PLL_I = Integer input
960 PLL_F = Fractional input
962 F_input = 28.636363 MHz:
963 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
966 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
968 unsigned char fl, fh, fi;
970 /* prevent overflows */
983 btwrite(fl, BT848_PLL_F_LO);
984 btwrite(fh, BT848_PLL_F_HI);
985 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
988 static void set_pll(struct bttv *btv)
992 if (!btv->pll.pll_crystal)
995 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
996 dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
1000 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
1002 if (btv->pll.pll_current == 0)
1004 bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
1005 btv->c.nr,btv->pll.pll_ifreq);
1006 btwrite(0x00,BT848_TGCTRL);
1007 btwrite(0x00,BT848_PLL_XCI);
1008 btv->pll.pll_current = 0;
1012 bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
1013 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1014 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1016 for (i=0; i<10; i++) {
1017 /* Let other people run while the PLL stabilizes */
1021 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
1022 btwrite(0,BT848_DSTATUS);
1024 btwrite(0x08,BT848_TGCTRL);
1025 btv->pll.pll_current = btv->pll.pll_ofreq;
1026 bttv_printk(" ok\n");
1030 btv->pll.pll_current = -1;
1031 bttv_printk("failed\n");
1035 /* used to switch between the bt848's analog/digital video capture modes */
1036 static void bt848A_set_timing(struct bttv *btv)
1039 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
1040 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
1042 if (btv->input == btv->dig) {
1043 dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
1044 btv->c.nr,table_idx);
1046 /* timing change...reset timing generator address */
1047 btwrite(0x00, BT848_TGCTRL);
1048 btwrite(0x02, BT848_TGCTRL);
1049 btwrite(0x00, BT848_TGCTRL);
1051 len=SRAM_Table[table_idx][0];
1052 for(i = 1; i <= len; i++)
1053 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
1054 btv->pll.pll_ofreq = 27000000;
1057 btwrite(0x11, BT848_TGCTRL);
1058 btwrite(0x41, BT848_DVSIF);
1060 btv->pll.pll_ofreq = fsc;
1062 btwrite(0x0, BT848_DVSIF);
1066 /* ----------------------------------------------------------------------- */
1068 static void bt848_bright(struct bttv *btv, int bright)
1072 // printk("bttv: set bright: %d\n",bright); // DEBUG
1073 btv->bright = bright;
1075 /* We want -128 to 127 we get 0-65535 */
1076 value = (bright >> 8) - 128;
1077 btwrite(value & 0xff, BT848_BRIGHT);
1080 static void bt848_hue(struct bttv *btv, int hue)
1087 value = (hue >> 8) - 128;
1088 btwrite(value & 0xff, BT848_HUE);
1091 static void bt848_contrast(struct bttv *btv, int cont)
1095 btv->contrast = cont;
1098 value = (cont >> 7);
1099 hibit = (value >> 6) & 4;
1100 btwrite(value & 0xff, BT848_CONTRAST_LO);
1101 btaor(hibit, ~4, BT848_E_CONTROL);
1102 btaor(hibit, ~4, BT848_O_CONTROL);
1105 static void bt848_sat(struct bttv *btv, int color)
1107 int val_u,val_v,hibits;
1109 btv->saturation = color;
1111 /* 0-511 for the color */
1112 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
1113 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
1114 hibits = (val_u >> 7) & 2;
1115 hibits |= (val_v >> 8) & 1;
1116 btwrite(val_u & 0xff, BT848_SAT_U_LO);
1117 btwrite(val_v & 0xff, BT848_SAT_V_LO);
1118 btaor(hibits, ~3, BT848_E_CONTROL);
1119 btaor(hibits, ~3, BT848_O_CONTROL);
1122 /* ----------------------------------------------------------------------- */
1125 video_mux(struct bttv *btv, unsigned int input)
1129 if (input >= bttv_tvcards[btv->c.type].video_inputs)
1132 /* needed by RemoteVideo MX */
1133 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
1135 gpio_inout(mask2,mask2);
1137 if (input == btv->svhs) {
1138 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
1139 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
1141 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
1142 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
1144 mux = bttv_muxsel(btv, input);
1145 btaor(mux<<5, ~(3<<5), BT848_IFORM);
1146 dprintk(KERN_DEBUG "bttv%d: video mux: input=%d mux=%d\n",
1147 btv->c.nr,input,mux);
1149 /* card specific hook */
1150 if(bttv_tvcards[btv->c.type].muxsel_hook)
1151 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
1155 static char *audio_modes[] = {
1156 "audio: tuner", "audio: radio", "audio: extern",
1157 "audio: intern", "audio: mute"
1161 audio_mux(struct bttv *btv, int input, int mute)
1163 int gpio_val, signal;
1164 struct v4l2_control ctrl;
1166 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
1167 bttv_tvcards[btv->c.type].gpiomask);
1168 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
1174 mute = mute || (btv->opt_automute && !signal && !btv->radio_user);
1177 gpio_val = bttv_tvcards[btv->c.type].gpiomute;
1179 gpio_val = bttv_tvcards[btv->c.type].gpiomux[input];
1181 switch (btv->c.type) {
1182 case BTTV_BOARD_VOODOOTV_FM:
1183 case BTTV_BOARD_VOODOOTV_200:
1184 gpio_val = bttv_tda9880_setnorm(btv, gpio_val);
1188 gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpio_val);
1192 bttv_gpio_tracking(btv, audio_modes[mute ? 4 : input]);
1196 ctrl.id = V4L2_CID_AUDIO_MUTE;
1197 ctrl.value = btv->mute;
1198 bttv_call_all(btv, core, s_ctrl, &ctrl);
1199 if (btv->sd_msp34xx) {
1202 /* Note: the inputs tuner/radio/extern/intern are translated
1203 to msp routings. This assumes common behavior for all msp3400
1204 based TV cards. When this assumption fails, then the
1205 specific MSP routing must be added to the card table.
1206 For now this is sufficient. */
1208 case TVAUDIO_INPUT_RADIO:
1209 in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1210 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1212 case TVAUDIO_INPUT_EXTERN:
1213 in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
1214 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1216 case TVAUDIO_INPUT_INTERN:
1217 /* Yes, this is the same input as for RADIO. I doubt
1218 if this is ever used. The only board with an INTERN
1219 input is the BTTV_BOARD_AVERMEDIA98. I wonder how
1220 that was tested. My guess is that the whole INTERN
1221 input does not work. */
1222 in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1223 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1225 case TVAUDIO_INPUT_TUNER:
1227 /* This is the only card that uses TUNER2, and afaik,
1228 is the only difference between the VOODOOTV_FM
1230 if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
1231 in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
1232 MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
1234 in = MSP_INPUT_DEFAULT;
1237 v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing,
1238 in, MSP_OUTPUT_DEFAULT, 0);
1240 if (btv->sd_tvaudio) {
1241 v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing,
1248 audio_mute(struct bttv *btv, int mute)
1250 return audio_mux(btv, btv->audio, mute);
1254 audio_input(struct bttv *btv, int input)
1256 return audio_mux(btv, input, btv->mute);
1260 bttv_crop_calc_limits(struct bttv_crop *c)
1262 /* Scale factor min. 1:1, max. 16:1. Min. image size
1263 48 x 32. Scaled width must be a multiple of 4. */
1266 /* For bug compatibility with VIDIOCGCAP and image
1267 size checks in earlier driver versions. */
1268 c->min_scaled_width = 48;
1269 c->min_scaled_height = 32;
1271 c->min_scaled_width =
1272 (max(48, c->rect.width >> 4) + 3) & ~3;
1273 c->min_scaled_height =
1274 max(32, c->rect.height >> 4);
1277 c->max_scaled_width = c->rect.width & ~3;
1278 c->max_scaled_height = c->rect.height;
1282 bttv_crop_reset(struct bttv_crop *c, unsigned int norm)
1284 c->rect = bttv_tvnorms[norm].cropcap.defrect;
1285 bttv_crop_calc_limits(c);
1288 /* Call with btv->lock down. */
1290 set_tvnorm(struct bttv *btv, unsigned int norm)
1292 const struct bttv_tvnorm *tvnorm;
1295 BUG_ON(norm >= BTTV_TVNORMS);
1296 BUG_ON(btv->tvnorm >= BTTV_TVNORMS);
1298 tvnorm = &bttv_tvnorms[norm];
1300 if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
1301 sizeof (tvnorm->cropcap))) {
1302 bttv_crop_reset(&btv->crop[0], norm);
1303 btv->crop[1] = btv->crop[0]; /* current = default */
1305 if (0 == (btv->resources & VIDEO_RESOURCES)) {
1306 btv->crop_start = tvnorm->cropcap.bounds.top
1307 + tvnorm->cropcap.bounds.height;
1313 btwrite(tvnorm->adelay, BT848_ADELAY);
1314 btwrite(tvnorm->bdelay, BT848_BDELAY);
1315 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
1317 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
1318 btwrite(1, BT848_VBI_PACK_DEL);
1319 bt848A_set_timing(btv);
1321 switch (btv->c.type) {
1322 case BTTV_BOARD_VOODOOTV_FM:
1323 case BTTV_BOARD_VOODOOTV_200:
1324 bttv_tda9880_setnorm(btv, gpio_read());
1327 id = tvnorm->v4l2_id;
1328 bttv_call_all(btv, core, s_std, id);
1333 /* Call with btv->lock down. */
1335 set_input(struct bttv *btv, unsigned int input, unsigned int norm)
1337 unsigned long flags;
1341 spin_lock_irqsave(&btv->s_lock,flags);
1342 if (btv->curr.frame_irq) {
1343 /* active capture -> delayed input switch */
1344 btv->new_input = input;
1346 video_mux(btv,input);
1348 spin_unlock_irqrestore(&btv->s_lock,flags);
1350 video_mux(btv,input);
1352 audio_input(btv, (btv->tuner_type != TUNER_ABSENT && input == 0) ?
1353 TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN);
1354 set_tvnorm(btv, norm);
1357 static void init_irqreg(struct bttv *btv)
1360 btwrite(0xfffffUL, BT848_INT_STAT);
1362 if (bttv_tvcards[btv->c.type].no_video) {
1364 btwrite(BT848_INT_I2CDONE,
1368 btwrite((btv->triton1) |
1369 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1371 (fdsr ? BT848_INT_FDSR : 0) |
1372 BT848_INT_RISCI | BT848_INT_OCERR |
1373 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1379 static void init_bt848(struct bttv *btv)
1383 if (bttv_tvcards[btv->c.type].no_video) {
1384 /* very basic init only */
1389 btwrite(0x00, BT848_CAP_CTL);
1390 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1391 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1393 /* set planar and packed mode trigger points and */
1394 /* set rising edge of inverted GPINTR pin as irq trigger */
1395 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1396 BT848_GPIO_DMA_CTL_PLTP1_16|
1397 BT848_GPIO_DMA_CTL_PLTP23_16|
1398 BT848_GPIO_DMA_CTL_GPINTC|
1399 BT848_GPIO_DMA_CTL_GPINTI,
1400 BT848_GPIO_DMA_CTL);
1402 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1403 btwrite(val, BT848_E_SCLOOP);
1404 btwrite(val, BT848_O_SCLOOP);
1406 btwrite(0x20, BT848_E_VSCALE_HI);
1407 btwrite(0x20, BT848_O_VSCALE_HI);
1408 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1411 btwrite(whitecrush_upper, BT848_WC_UP);
1412 btwrite(whitecrush_lower, BT848_WC_DOWN);
1414 if (btv->opt_lumafilter) {
1415 btwrite(0, BT848_E_CONTROL);
1416 btwrite(0, BT848_O_CONTROL);
1418 btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1419 btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1422 bt848_bright(btv, btv->bright);
1423 bt848_hue(btv, btv->hue);
1424 bt848_contrast(btv, btv->contrast);
1425 bt848_sat(btv, btv->saturation);
1431 static void bttv_reinit_bt848(struct bttv *btv)
1433 unsigned long flags;
1436 printk(KERN_INFO "bttv%d: reset, reinitialize\n",btv->c.nr);
1437 spin_lock_irqsave(&btv->s_lock,flags);
1439 bttv_set_dma(btv,0);
1440 spin_unlock_irqrestore(&btv->s_lock,flags);
1443 btv->pll.pll_current = -1;
1444 set_input(btv, btv->input, btv->tvnorm);
1447 static int bttv_g_ctrl(struct file *file, void *priv,
1448 struct v4l2_control *c)
1450 struct bttv_fh *fh = priv;
1451 struct bttv *btv = fh->btv;
1454 case V4L2_CID_BRIGHTNESS:
1455 c->value = btv->bright;
1458 c->value = btv->hue;
1460 case V4L2_CID_CONTRAST:
1461 c->value = btv->contrast;
1463 case V4L2_CID_SATURATION:
1464 c->value = btv->saturation;
1467 case V4L2_CID_AUDIO_MUTE:
1468 case V4L2_CID_AUDIO_VOLUME:
1469 case V4L2_CID_AUDIO_BALANCE:
1470 case V4L2_CID_AUDIO_BASS:
1471 case V4L2_CID_AUDIO_TREBLE:
1472 bttv_call_all(btv, core, g_ctrl, c);
1475 case V4L2_CID_PRIVATE_CHROMA_AGC:
1476 c->value = btv->opt_chroma_agc;
1478 case V4L2_CID_PRIVATE_COMBFILTER:
1479 c->value = btv->opt_combfilter;
1481 case V4L2_CID_PRIVATE_LUMAFILTER:
1482 c->value = btv->opt_lumafilter;
1484 case V4L2_CID_PRIVATE_AUTOMUTE:
1485 c->value = btv->opt_automute;
1487 case V4L2_CID_PRIVATE_AGC_CRUSH:
1488 c->value = btv->opt_adc_crush;
1490 case V4L2_CID_PRIVATE_VCR_HACK:
1491 c->value = btv->opt_vcr_hack;
1493 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1494 c->value = btv->opt_whitecrush_upper;
1496 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1497 c->value = btv->opt_whitecrush_lower;
1499 case V4L2_CID_PRIVATE_UV_RATIO:
1500 c->value = btv->opt_uv_ratio;
1502 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1503 c->value = btv->opt_full_luma_range;
1505 case V4L2_CID_PRIVATE_CORING:
1506 c->value = btv->opt_coring;
1514 static int bttv_s_ctrl(struct file *file, void *f,
1515 struct v4l2_control *c)
1519 struct bttv_fh *fh = f;
1520 struct bttv *btv = fh->btv;
1522 err = v4l2_prio_check(&btv->prio, fh->prio);
1527 case V4L2_CID_BRIGHTNESS:
1528 bt848_bright(btv, c->value);
1531 bt848_hue(btv, c->value);
1533 case V4L2_CID_CONTRAST:
1534 bt848_contrast(btv, c->value);
1536 case V4L2_CID_SATURATION:
1537 bt848_sat(btv, c->value);
1539 case V4L2_CID_AUDIO_MUTE:
1540 audio_mute(btv, c->value);
1542 case V4L2_CID_AUDIO_VOLUME:
1543 if (btv->volume_gpio)
1544 btv->volume_gpio(btv, c->value);
1546 bttv_call_all(btv, core, s_ctrl, c);
1548 case V4L2_CID_AUDIO_BALANCE:
1549 case V4L2_CID_AUDIO_BASS:
1550 case V4L2_CID_AUDIO_TREBLE:
1551 bttv_call_all(btv, core, s_ctrl, c);
1554 case V4L2_CID_PRIVATE_CHROMA_AGC:
1555 btv->opt_chroma_agc = c->value;
1556 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1557 btwrite(val, BT848_E_SCLOOP);
1558 btwrite(val, BT848_O_SCLOOP);
1560 case V4L2_CID_PRIVATE_COMBFILTER:
1561 btv->opt_combfilter = c->value;
1563 case V4L2_CID_PRIVATE_LUMAFILTER:
1564 btv->opt_lumafilter = c->value;
1565 if (btv->opt_lumafilter) {
1566 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1567 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1569 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1570 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1573 case V4L2_CID_PRIVATE_AUTOMUTE:
1574 btv->opt_automute = c->value;
1576 case V4L2_CID_PRIVATE_AGC_CRUSH:
1577 btv->opt_adc_crush = c->value;
1578 btwrite(BT848_ADC_RESERVED |
1579 (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1582 case V4L2_CID_PRIVATE_VCR_HACK:
1583 btv->opt_vcr_hack = c->value;
1585 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1586 btv->opt_whitecrush_upper = c->value;
1587 btwrite(c->value, BT848_WC_UP);
1589 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1590 btv->opt_whitecrush_lower = c->value;
1591 btwrite(c->value, BT848_WC_DOWN);
1593 case V4L2_CID_PRIVATE_UV_RATIO:
1594 btv->opt_uv_ratio = c->value;
1595 bt848_sat(btv, btv->saturation);
1597 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1598 btv->opt_full_luma_range = c->value;
1599 btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM);
1601 case V4L2_CID_PRIVATE_CORING:
1602 btv->opt_coring = c->value;
1603 btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM);
1611 /* ----------------------------------------------------------------------- */
1613 void bttv_gpio_tracking(struct bttv *btv, char *comment)
1615 unsigned int outbits, data;
1616 outbits = btread(BT848_GPIO_OUT_EN);
1617 data = btread(BT848_GPIO_DATA);
1618 printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1619 btv->c.nr,outbits,data & outbits, data & ~outbits, comment);
1622 static void bttv_field_count(struct bttv *btv)
1630 /* start field counter */
1631 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1633 /* stop field counter */
1634 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1635 btv->field_count = 0;
1639 static const struct bttv_format*
1640 format_by_fourcc(int fourcc)
1644 for (i = 0; i < FORMATS; i++) {
1645 if (-1 == formats[i].fourcc)
1647 if (formats[i].fourcc == fourcc)
1653 /* ----------------------------------------------------------------------- */
1657 bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1658 struct bttv_buffer *new)
1660 struct bttv_buffer *old;
1661 unsigned long flags;
1664 dprintk("switch_overlay: enter [new=%p]\n",new);
1666 new->vb.state = VIDEOBUF_DONE;
1667 spin_lock_irqsave(&btv->s_lock,flags);
1671 bttv_set_dma(btv, 0x03);
1672 spin_unlock_irqrestore(&btv->s_lock,flags);
1674 dprintk("switch_overlay: old=%p state is %d\n",old,old->vb.state);
1675 bttv_dma_free(&fh->cap,btv, old);
1679 free_btres_lock(btv,fh,RESOURCE_OVERLAY);
1680 dprintk("switch_overlay: done\n");
1684 /* ----------------------------------------------------------------------- */
1685 /* video4linux (1) interface */
1687 static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
1688 struct bttv_buffer *buf,
1689 const struct bttv_format *fmt,
1690 unsigned int width, unsigned int height,
1691 enum v4l2_field field)
1693 struct bttv_fh *fh = q->priv_data;
1694 int redo_dma_risc = 0;
1699 /* check settings */
1702 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1704 height = RAW_LINES*2;
1705 if (width*height > buf->vb.bsize)
1707 buf->vb.size = buf->vb.bsize;
1709 /* Make sure tvnorm and vbi_end remain consistent
1710 until we're done. */
1714 /* In this mode capturing always starts at defrect.top
1715 (default VDELAY), ignoring cropping parameters. */
1716 if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
1720 c.rect = bttv_tvnorms[norm].cropcap.defrect;
1723 c = btv->crop[!!fh->do_crop];
1725 if (width < c.min_scaled_width ||
1726 width > c.max_scaled_width ||
1727 height < c.min_scaled_height)
1731 case V4L2_FIELD_TOP:
1732 case V4L2_FIELD_BOTTOM:
1733 case V4L2_FIELD_ALTERNATE:
1734 /* btv->crop counts frame lines. Max. scale
1735 factor is 16:1 for frames, 8:1 for fields. */
1736 if (height * 2 > c.max_scaled_height)
1741 if (height > c.max_scaled_height)
1746 buf->vb.size = (width * height * fmt->depth) >> 3;
1747 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1751 /* alloc + fill struct bttv_buffer (if changed) */
1752 if (buf->vb.width != width || buf->vb.height != height ||
1753 buf->vb.field != field ||
1754 buf->tvnorm != norm || buf->fmt != fmt ||
1755 buf->crop.top != c.rect.top ||
1756 buf->crop.left != c.rect.left ||
1757 buf->crop.width != c.rect.width ||
1758 buf->crop.height != c.rect.height) {
1759 buf->vb.width = width;
1760 buf->vb.height = height;
1761 buf->vb.field = field;
1768 /* alloc risc memory */
1769 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1771 if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
1776 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1779 buf->vb.state = VIDEOBUF_PREPARED;
1783 bttv_dma_free(q,btv,buf);
1788 buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1790 struct bttv_fh *fh = q->priv_data;
1792 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1795 if (*size * *count > gbuffers * gbufsize)
1796 *count = (gbuffers * gbufsize) / *size;
1801 buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1802 enum v4l2_field field)
1804 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1805 struct bttv_fh *fh = q->priv_data;
1807 return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
1808 fh->width, fh->height, field);
1812 buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1814 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1815 struct bttv_fh *fh = q->priv_data;
1816 struct bttv *btv = fh->btv;
1818 buf->vb.state = VIDEOBUF_QUEUED;
1819 list_add_tail(&buf->vb.queue,&btv->capture);
1820 if (!btv->curr.frame_irq) {
1822 bttv_set_dma(btv, 0x03);
1826 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1828 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1829 struct bttv_fh *fh = q->priv_data;
1831 bttv_dma_free(q,fh->btv,buf);
1834 static struct videobuf_queue_ops bttv_video_qops = {
1835 .buf_setup = buffer_setup,
1836 .buf_prepare = buffer_prepare,
1837 .buf_queue = buffer_queue,
1838 .buf_release = buffer_release,
1841 static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id)
1843 struct bttv_fh *fh = priv;
1844 struct bttv *btv = fh->btv;
1848 err = v4l2_prio_check(&btv->prio, fh->prio);
1852 for (i = 0; i < BTTV_TVNORMS; i++)
1853 if (*id & bttv_tvnorms[i].v4l2_id)
1855 if (i == BTTV_TVNORMS) {
1867 static int bttv_querystd(struct file *file, void *f, v4l2_std_id *id)
1869 struct bttv_fh *fh = f;
1870 struct bttv *btv = fh->btv;
1872 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1873 *id = V4L2_STD_625_50;
1875 *id = V4L2_STD_525_60;
1879 static int bttv_enum_input(struct file *file, void *priv,
1880 struct v4l2_input *i)
1882 struct bttv_fh *fh = priv;
1883 struct bttv *btv = fh->btv;
1886 if (i->index >= bttv_tvcards[btv->c.type].video_inputs) {
1891 i->type = V4L2_INPUT_TYPE_CAMERA;
1894 if (btv->tuner_type != TUNER_ABSENT && i->index == 0) {
1895 sprintf(i->name, "Television");
1896 i->type = V4L2_INPUT_TYPE_TUNER;
1898 } else if (i->index == btv->svhs) {
1899 sprintf(i->name, "S-Video");
1901 sprintf(i->name, "Composite%d", i->index);
1904 if (i->index == btv->input) {
1905 __u32 dstatus = btread(BT848_DSTATUS);
1906 if (0 == (dstatus & BT848_DSTATUS_PRES))
1907 i->status |= V4L2_IN_ST_NO_SIGNAL;
1908 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1909 i->status |= V4L2_IN_ST_NO_H_LOCK;
1912 i->std = BTTV_NORMS;
1919 static int bttv_g_input(struct file *file, void *priv, unsigned int *i)
1921 struct bttv_fh *fh = priv;
1922 struct bttv *btv = fh->btv;
1929 static int bttv_s_input(struct file *file, void *priv, unsigned int i)
1931 struct bttv_fh *fh = priv;
1932 struct bttv *btv = fh->btv;
1936 err = v4l2_prio_check(&btv->prio, fh->prio);
1940 if (i > bttv_tvcards[btv->c.type].video_inputs) {
1945 set_input(btv, i, btv->tvnorm);
1951 static int bttv_s_tuner(struct file *file, void *priv,
1952 struct v4l2_tuner *t)
1954 struct bttv_fh *fh = priv;
1955 struct bttv *btv = fh->btv;
1958 if (unlikely(0 != t->index))
1961 if (unlikely(btv->tuner_type == TUNER_ABSENT)) {
1966 err = v4l2_prio_check(&btv->prio, fh->prio);
1970 bttv_call_all(btv, tuner, s_tuner, t);
1972 if (btv->audio_mode_gpio)
1973 btv->audio_mode_gpio(btv, t, 1);
1980 static int bttv_g_frequency(struct file *file, void *priv,
1981 struct v4l2_frequency *f)
1983 struct bttv_fh *fh = priv;
1984 struct bttv *btv = fh->btv;
1986 f->type = btv->radio_user ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
1987 f->frequency = btv->freq;
1992 static int bttv_s_frequency(struct file *file, void *priv,
1993 struct v4l2_frequency *f)
1995 struct bttv_fh *fh = priv;
1996 struct bttv *btv = fh->btv;
1999 if (unlikely(f->tuner != 0))
2002 err = v4l2_prio_check(&btv->prio, fh->prio);
2006 if (unlikely(f->type != (btv->radio_user
2007 ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV))) {
2011 btv->freq = f->frequency;
2012 bttv_call_all(btv, tuner, s_frequency, f);
2013 if (btv->has_matchbox && btv->radio_user)
2014 tea5757_set_freq(btv, btv->freq);
2020 static int bttv_log_status(struct file *file, void *f)
2022 struct bttv_fh *fh = f;
2023 struct bttv *btv = fh->btv;
2025 printk(KERN_INFO "bttv%d: ======== START STATUS CARD #%d ========\n",
2026 btv->c.nr, btv->c.nr);
2027 bttv_call_all(btv, core, log_status);
2028 printk(KERN_INFO "bttv%d: ======== END STATUS CARD #%d ========\n",
2029 btv->c.nr, btv->c.nr);
2033 #ifdef CONFIG_VIDEO_ADV_DEBUG
2034 static int bttv_g_register(struct file *file, void *f,
2035 struct v4l2_dbg_register *reg)
2037 struct bttv_fh *fh = f;
2038 struct bttv *btv = fh->btv;
2040 if (!capable(CAP_SYS_ADMIN))
2043 if (!v4l2_chip_match_host(®->match))
2046 /* bt848 has a 12-bit register space */
2048 reg->val = btread(reg->reg);
2054 static int bttv_s_register(struct file *file, void *f,
2055 struct v4l2_dbg_register *reg)
2057 struct bttv_fh *fh = f;
2058 struct bttv *btv = fh->btv;
2060 if (!capable(CAP_SYS_ADMIN))
2063 if (!v4l2_chip_match_host(®->match))
2066 /* bt848 has a 12-bit register space */
2068 btwrite(reg->val, reg->reg);
2074 /* Given cropping boundaries b and the scaled width and height of a
2075 single field or frame, which must not exceed hardware limits, this
2076 function adjusts the cropping parameters c. */
2078 bttv_crop_adjust (struct bttv_crop * c,
2079 const struct v4l2_rect * b,
2082 enum v4l2_field field)
2084 __s32 frame_height = height << !V4L2_FIELD_HAS_BOTH(field);
2088 if (width < c->min_scaled_width) {
2089 /* Max. hor. scale factor 16:1. */
2090 c->rect.width = width * 16;
2091 } else if (width > c->max_scaled_width) {
2092 /* Min. hor. scale factor 1:1. */
2093 c->rect.width = width;
2095 max_left = b->left + b->width - width;
2096 max_left = min(max_left, (__s32) MAX_HDELAY);
2097 if (c->rect.left > max_left)
2098 c->rect.left = max_left;
2101 if (height < c->min_scaled_height) {
2102 /* Max. vert. scale factor 16:1, single fields 8:1. */
2103 c->rect.height = height * 16;
2104 } else if (frame_height > c->max_scaled_height) {
2105 /* Min. vert. scale factor 1:1.
2106 Top and height count field lines times two. */
2107 c->rect.height = (frame_height + 1) & ~1;
2109 max_top = b->top + b->height - c->rect.height;
2110 if (c->rect.top > max_top)
2111 c->rect.top = max_top;
2114 bttv_crop_calc_limits(c);
2117 /* Returns an error if scaling to a frame or single field with the given
2118 width and height is not possible with the current cropping parameters
2119 and width aligned according to width_mask. If adjust_size is TRUE the
2120 function may adjust the width and/or height instead, rounding width
2121 to (width + width_bias) & width_mask. If adjust_crop is TRUE it may
2122 also adjust the current cropping parameters to get closer to the
2123 desired image size. */
2125 limit_scaled_size_lock (struct bttv_fh * fh,
2128 enum v4l2_field field,
2129 unsigned int width_mask,
2130 unsigned int width_bias,
2134 struct bttv *btv = fh->btv;
2135 const struct v4l2_rect *b;
2136 struct bttv_crop *c;
2143 BUG_ON((int) width_mask >= 0 ||
2144 width_bias >= (unsigned int) -width_mask);
2146 /* Make sure tvnorm, vbi_end and the current cropping parameters
2147 remain consistent until we're done. */
2149 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2151 /* Do crop - use current, don't - use default parameters. */
2152 c = &btv->crop[!!fh->do_crop];
2157 && !locked_btres(btv, VIDEO_RESOURCES)) {
2161 /* We cannot scale up. When the scaled image is larger
2162 than crop.rect we adjust the crop.rect as required
2163 by the V4L2 spec, hence cropcap.bounds are our limit. */
2164 max_width = min(b->width, (__s32) MAX_HACTIVE);
2165 max_height = b->height;
2167 /* We cannot capture the same line as video and VBI data.
2168 Note btv->vbi_end is really a minimum, see
2169 bttv_vbi_try_fmt(). */
2170 if (btv->vbi_end > b->top) {
2171 max_height -= btv->vbi_end - b->top;
2173 if (min_height > max_height)
2178 if (btv->vbi_end > c->rect.top)
2181 min_width = c->min_scaled_width;
2182 min_height = c->min_scaled_height;
2183 max_width = c->max_scaled_width;
2184 max_height = c->max_scaled_height;
2189 min_width = (min_width - width_mask - 1) & width_mask;
2190 max_width = max_width & width_mask;
2192 /* Max. scale factor is 16:1 for frames, 8:1 for fields. */
2193 min_height = min_height;
2194 /* Min. scale factor is 1:1. */
2195 max_height >>= !V4L2_FIELD_HAS_BOTH(field);
2198 *width = clamp(*width, min_width, max_width);
2199 *height = clamp(*height, min_height, max_height);
2201 /* Round after clamping to avoid overflow. */
2202 *width = (*width + width_bias) & width_mask;
2205 bttv_crop_adjust(c, b, *width, *height, field);
2207 if (btv->vbi_end > c->rect.top) {
2208 /* Move the crop window out of the way. */
2209 c->rect.top = btv->vbi_end;
2214 if (*width < min_width ||
2215 *height < min_height ||
2216 *width > max_width ||
2217 *height > max_height ||
2218 0 != (*width & ~width_mask))
2222 rc = 0; /* success */
2229 /* Returns an error if the given overlay window dimensions are not
2230 possible with the current cropping parameters. If adjust_size is
2231 TRUE the function may adjust the window width and/or height
2232 instead, however it always rounds the horizontal position and
2233 width as btcx_align() does. If adjust_crop is TRUE the function
2234 may also adjust the current cropping parameters to get closer
2235 to the desired window size. */
2237 verify_window_lock (struct bttv_fh * fh,
2238 struct v4l2_window * win,
2242 enum v4l2_field field;
2243 unsigned int width_mask;
2246 if (win->w.width < 48 || win->w.height < 32)
2248 if (win->clipcount > 2048)
2253 if (V4L2_FIELD_ANY == field) {
2256 height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
2257 field = (win->w.height > height2)
2258 ? V4L2_FIELD_INTERLACED
2262 case V4L2_FIELD_TOP:
2263 case V4L2_FIELD_BOTTOM:
2264 case V4L2_FIELD_INTERLACED:
2270 /* 4-byte alignment. */
2271 if (NULL == fh->ovfmt)
2274 switch (fh->ovfmt->depth) {
2288 win->w.width -= win->w.left & ~width_mask;
2289 win->w.left = (win->w.left - width_mask - 1) & width_mask;
2291 rc = limit_scaled_size_lock(fh, &win->w.width, &win->w.height,
2293 /* width_bias: round down */ 0,
2294 adjust_size, adjust_crop);
2302 static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
2303 struct v4l2_window *win, int fixup)
2305 struct v4l2_clip *clips = NULL;
2306 int n,size,retval = 0;
2308 if (NULL == fh->ovfmt)
2310 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
2312 retval = verify_window_lock(fh, win,
2313 /* adjust_size */ fixup,
2314 /* adjust_crop */ fixup);
2318 /* copy clips -- luckily v4l1 + v4l2 are binary
2319 compatible here ...*/
2321 size = sizeof(*clips)*(n+4);
2322 clips = kmalloc(size,GFP_KERNEL);
2326 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
2332 /* clip against screen */
2333 if (NULL != btv->fbuf.base)
2334 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
2336 btcx_sort_clips(clips,n);
2338 /* 4-byte alignments */
2339 switch (fh->ovfmt->depth) {
2342 btcx_align(&win->w, clips, n, 3);
2345 btcx_align(&win->w, clips, n, 1);
2348 /* no alignment fixups needed */
2354 kfree(fh->ov.clips);
2355 fh->ov.clips = clips;
2359 fh->ov.field = win->field;
2360 fh->ov.setup_ok = 1;
2362 btv->init.ov.w.width = win->w.width;
2363 btv->init.ov.w.height = win->w.height;
2364 btv->init.ov.field = win->field;
2366 /* update overlay if needed */
2368 if (check_btres(fh, RESOURCE_OVERLAY)) {
2369 struct bttv_buffer *new;
2371 new = videobuf_sg_alloc(sizeof(*new));
2372 new->crop = btv->crop[!!fh->do_crop].rect;
2373 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2374 retval = bttv_switch_overlay(btv,fh,new);
2379 /* ----------------------------------------------------------------------- */
2381 static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
2383 struct videobuf_queue* q = NULL;
2386 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2389 case V4L2_BUF_TYPE_VBI_CAPTURE:
2398 static int bttv_resource(struct bttv_fh *fh)
2403 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2404 res = RESOURCE_VIDEO_STREAM;
2406 case V4L2_BUF_TYPE_VBI_CAPTURE:
2415 static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2417 struct videobuf_queue *q = bttv_queue(fh);
2418 int res = bttv_resource(fh);
2420 if (check_btres(fh,res))
2422 if (videobuf_queue_is_busy(q))
2429 pix_format_set_size (struct v4l2_pix_format * f,
2430 const struct bttv_format * fmt,
2432 unsigned int height)
2437 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2438 f->bytesperline = width; /* Y plane */
2439 f->sizeimage = (width * height * fmt->depth) >> 3;
2441 f->bytesperline = (width * fmt->depth) >> 3;
2442 f->sizeimage = height * f->bytesperline;
2446 static int bttv_g_fmt_vid_cap(struct file *file, void *priv,
2447 struct v4l2_format *f)
2449 struct bttv_fh *fh = priv;
2451 pix_format_set_size(&f->fmt.pix, fh->fmt,
2452 fh->width, fh->height);
2453 f->fmt.pix.field = fh->cap.field;
2454 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2459 static int bttv_g_fmt_vid_overlay(struct file *file, void *priv,
2460 struct v4l2_format *f)
2462 struct bttv_fh *fh = priv;
2464 f->fmt.win.w = fh->ov.w;
2465 f->fmt.win.field = fh->ov.field;
2470 static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
2471 struct v4l2_format *f)
2473 const struct bttv_format *fmt;
2474 struct bttv_fh *fh = priv;
2475 struct bttv *btv = fh->btv;
2476 enum v4l2_field field;
2477 __s32 width, height;
2480 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2484 field = f->fmt.pix.field;
2486 if (V4L2_FIELD_ANY == field) {
2489 height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
2490 field = (f->fmt.pix.height > height2)
2491 ? V4L2_FIELD_INTERLACED
2492 : V4L2_FIELD_BOTTOM;
2495 if (V4L2_FIELD_SEQ_BT == field)
2496 field = V4L2_FIELD_SEQ_TB;
2499 case V4L2_FIELD_TOP:
2500 case V4L2_FIELD_BOTTOM:
2501 case V4L2_FIELD_ALTERNATE:
2502 case V4L2_FIELD_INTERLACED:
2504 case V4L2_FIELD_SEQ_TB:
2505 if (fmt->flags & FORMAT_FLAGS_PLANAR)
2512 width = f->fmt.pix.width;
2513 height = f->fmt.pix.height;
2515 rc = limit_scaled_size_lock(fh, &width, &height, field,
2516 /* width_mask: 4 pixels */ ~3,
2517 /* width_bias: nearest */ 2,
2518 /* adjust_size */ 1,
2519 /* adjust_crop */ 0);
2523 /* update data for the application */
2524 f->fmt.pix.field = field;
2525 pix_format_set_size(&f->fmt.pix, fmt, width, height);
2530 static int bttv_try_fmt_vid_overlay(struct file *file, void *priv,
2531 struct v4l2_format *f)
2533 struct bttv_fh *fh = priv;
2535 return verify_window_lock(fh, &f->fmt.win,
2536 /* adjust_size */ 1,
2537 /* adjust_crop */ 0);
2540 static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
2541 struct v4l2_format *f)
2544 const struct bttv_format *fmt;
2545 struct bttv_fh *fh = priv;
2546 struct bttv *btv = fh->btv;
2547 __s32 width, height;
2548 enum v4l2_field field;
2550 retval = bttv_switch_type(fh, f->type);
2554 retval = bttv_try_fmt_vid_cap(file, priv, f);
2558 width = f->fmt.pix.width;
2559 height = f->fmt.pix.height;
2560 field = f->fmt.pix.field;
2562 retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field,
2563 /* width_mask: 4 pixels */ ~3,
2564 /* width_bias: nearest */ 2,
2565 /* adjust_size */ 1,
2566 /* adjust_crop */ 1);
2570 f->fmt.pix.field = field;
2572 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2574 /* update our state informations */
2576 fh->cap.field = f->fmt.pix.field;
2577 fh->cap.last = V4L2_FIELD_NONE;
2578 fh->width = f->fmt.pix.width;
2579 fh->height = f->fmt.pix.height;
2580 btv->init.fmt = fmt;
2581 btv->init.width = f->fmt.pix.width;
2582 btv->init.height = f->fmt.pix.height;
2587 static int bttv_s_fmt_vid_overlay(struct file *file, void *priv,
2588 struct v4l2_format *f)
2590 struct bttv_fh *fh = priv;
2591 struct bttv *btv = fh->btv;
2593 if (no_overlay > 0) {
2594 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2598 return setup_window_lock(fh, btv, &f->fmt.win, 1);
2601 #ifdef CONFIG_VIDEO_V4L1_COMPAT
2602 static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
2606 struct bttv_fh *fh = priv;
2608 retval = __videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
2615 memset(mbuf, 0, sizeof(*mbuf));
2616 mbuf->frames = gbuffers;
2617 mbuf->size = gbuffers * gbufsize;
2619 for (i = 0; i < gbuffers; i++)
2620 mbuf->offsets[i] = i * gbufsize;
2626 static int bttv_querycap(struct file *file, void *priv,
2627 struct v4l2_capability *cap)
2629 struct bttv_fh *fh = priv;
2630 struct bttv *btv = fh->btv;
2635 strlcpy(cap->driver, "bttv", sizeof(cap->driver));
2636 strlcpy(cap->card, btv->video_dev->name, sizeof(cap->card));
2637 snprintf(cap->bus_info, sizeof(cap->bus_info),
2638 "PCI:%s", pci_name(btv->c.pci));
2639 cap->version = BTTV_VERSION_CODE;
2641 V4L2_CAP_VIDEO_CAPTURE |
2642 V4L2_CAP_VBI_CAPTURE |
2643 V4L2_CAP_READWRITE |
2645 if (no_overlay <= 0)
2646 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2649 * No need to lock here: those vars are initialized during board
2650 * probe and remains untouched during the rest of the driver lifecycle
2652 if (btv->has_saa6588)
2653 cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
2654 if (btv->tuner_type != TUNER_ABSENT)
2655 cap->capabilities |= V4L2_CAP_TUNER;
2659 static int bttv_enum_fmt_cap_ovr(struct v4l2_fmtdesc *f)
2663 for (i = 0; i < FORMATS; i++) {
2664 if (formats[i].fourcc != -1)
2666 if ((unsigned int)index == f->index)
2672 f->pixelformat = formats[i].fourcc;
2673 strlcpy(f->description, formats[i].name, sizeof(f->description));
2678 static int bttv_enum_fmt_vid_cap(struct file *file, void *priv,
2679 struct v4l2_fmtdesc *f)
2681 int rc = bttv_enum_fmt_cap_ovr(f);
2689 static int bttv_enum_fmt_vid_overlay(struct file *file, void *priv,
2690 struct v4l2_fmtdesc *f)
2694 if (no_overlay > 0) {
2695 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2699 rc = bttv_enum_fmt_cap_ovr(f);
2704 if (!(formats[rc].flags & FORMAT_FLAGS_PACKED))
2710 static int bttv_g_fbuf(struct file *file, void *f,
2711 struct v4l2_framebuffer *fb)
2713 struct bttv_fh *fh = f;
2714 struct bttv *btv = fh->btv;
2717 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2719 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2723 static int bttv_overlay(struct file *file, void *f, unsigned int on)
2725 struct bttv_fh *fh = f;
2726 struct bttv *btv = fh->btv;
2727 struct bttv_buffer *new;
2732 if (unlikely(!btv->fbuf.base)) {
2735 if (unlikely(!fh->ov.setup_ok)) {
2736 dprintk("bttv%d: overlay: !setup_ok\n", btv->c.nr);
2743 if (!check_alloc_btres_lock(btv, fh, RESOURCE_OVERLAY))
2747 fh->ov.tvnorm = btv->tvnorm;
2748 new = videobuf_sg_alloc(sizeof(*new));
2749 new->crop = btv->crop[!!fh->do_crop].rect;
2750 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2756 retval = bttv_switch_overlay(btv, fh, new);
2760 static int bttv_s_fbuf(struct file *file, void *f,
2761 struct v4l2_framebuffer *fb)
2763 struct bttv_fh *fh = f;
2764 struct bttv *btv = fh->btv;
2765 const struct bttv_format *fmt;
2768 if (!capable(CAP_SYS_ADMIN) &&
2769 !capable(CAP_SYS_RAWIO))
2773 fmt = format_by_fourcc(fb->fmt.pixelformat);
2776 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2780 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2781 __s32 width = fb->fmt.width;
2782 __s32 height = fb->fmt.height;
2784 retval = limit_scaled_size_lock(fh, &width, &height,
2785 V4L2_FIELD_INTERLACED,
2786 /* width_mask */ ~3,
2788 /* adjust_size */ 0,
2789 /* adjust_crop */ 0);
2795 btv->fbuf.base = fb->base;
2796 btv->fbuf.fmt.width = fb->fmt.width;
2797 btv->fbuf.fmt.height = fb->fmt.height;
2798 if (0 != fb->fmt.bytesperline)
2799 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2801 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2805 btv->init.ovfmt = fmt;
2806 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2809 fh->ov.w.width = fb->fmt.width;
2810 fh->ov.w.height = fb->fmt.height;
2811 btv->init.ov.w.width = fb->fmt.width;
2812 btv->init.ov.w.height = fb->fmt.height;
2813 kfree(fh->ov.clips);
2814 fh->ov.clips = NULL;
2817 if (check_btres(fh, RESOURCE_OVERLAY)) {
2818 struct bttv_buffer *new;
2820 new = videobuf_sg_alloc(sizeof(*new));
2821 new->crop = btv->crop[!!fh->do_crop].rect;
2822 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2823 retval = bttv_switch_overlay(btv, fh, new);
2829 static int bttv_reqbufs(struct file *file, void *priv,
2830 struct v4l2_requestbuffers *p)
2832 struct bttv_fh *fh = priv;
2833 return videobuf_reqbufs(bttv_queue(fh), p);
2836 static int bttv_querybuf(struct file *file, void *priv,
2837 struct v4l2_buffer *b)
2839 struct bttv_fh *fh = priv;
2840 return videobuf_querybuf(bttv_queue(fh), b);
2843 static int bttv_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2845 struct bttv_fh *fh = priv;
2846 struct bttv *btv = fh->btv;
2847 int res = bttv_resource(fh);
2849 if (!check_alloc_btres_lock(btv, fh, res))
2852 return videobuf_qbuf(bttv_queue(fh), b);
2855 static int bttv_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2857 struct bttv_fh *fh = priv;
2858 return videobuf_dqbuf(bttv_queue(fh), b,
2859 file->f_flags & O_NONBLOCK);
2862 static int bttv_streamon(struct file *file, void *priv,
2863 enum v4l2_buf_type type)
2865 struct bttv_fh *fh = priv;
2866 struct bttv *btv = fh->btv;
2867 int res = bttv_resource(fh);
2869 if (!check_alloc_btres_lock(btv, fh, res))
2871 return videobuf_streamon(bttv_queue(fh));
2875 static int bttv_streamoff(struct file *file, void *priv,
2876 enum v4l2_buf_type type)
2878 struct bttv_fh *fh = priv;
2879 struct bttv *btv = fh->btv;
2881 int res = bttv_resource(fh);
2884 retval = videobuf_streamoff(bttv_queue(fh));
2887 free_btres_lock(btv, fh, res);
2891 static int bttv_queryctrl(struct file *file, void *priv,
2892 struct v4l2_queryctrl *c)
2894 struct bttv_fh *fh = priv;
2895 struct bttv *btv = fh->btv;
2896 const struct v4l2_queryctrl *ctrl;
2898 if ((c->id < V4L2_CID_BASE ||
2899 c->id >= V4L2_CID_LASTP1) &&
2900 (c->id < V4L2_CID_PRIVATE_BASE ||
2901 c->id >= V4L2_CID_PRIVATE_LASTP1))
2904 if (!btv->volume_gpio && (c->id == V4L2_CID_AUDIO_VOLUME))
2907 ctrl = ctrl_by_id(c->id);
2909 *c = (NULL != ctrl) ? *ctrl : no_ctl;
2915 static int bttv_g_parm(struct file *file, void *f,
2916 struct v4l2_streamparm *parm)
2918 struct bttv_fh *fh = f;
2919 struct bttv *btv = fh->btv;
2921 v4l2_video_std_frame_period(bttv_tvnorms[btv->tvnorm].v4l2_id,
2922 &parm->parm.capture.timeperframe);
2927 static int bttv_g_tuner(struct file *file, void *priv,
2928 struct v4l2_tuner *t)
2930 struct bttv_fh *fh = priv;
2931 struct bttv *btv = fh->btv;
2933 if (btv->tuner_type == TUNER_ABSENT)
2938 t->rxsubchans = V4L2_TUNER_SUB_MONO;
2939 bttv_call_all(btv, tuner, g_tuner, t);
2940 strcpy(t->name, "Television");
2941 t->capability = V4L2_TUNER_CAP_NORM;
2942 t->type = V4L2_TUNER_ANALOG_TV;
2943 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
2946 if (btv->audio_mode_gpio)
2947 btv->audio_mode_gpio(btv, t, 0);
2952 static int bttv_g_priority(struct file *file, void *f, enum v4l2_priority *p)
2954 struct bttv_fh *fh = f;
2955 struct bttv *btv = fh->btv;
2957 *p = v4l2_prio_max(&btv->prio);
2962 static int bttv_s_priority(struct file *file, void *f,
2963 enum v4l2_priority prio)
2965 struct bttv_fh *fh = f;
2966 struct bttv *btv = fh->btv;
2969 rc = v4l2_prio_change(&btv->prio, &fh->prio, prio);
2974 static int bttv_cropcap(struct file *file, void *priv,
2975 struct v4l2_cropcap *cap)
2977 struct bttv_fh *fh = priv;
2978 struct bttv *btv = fh->btv;
2980 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2981 cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2984 *cap = bttv_tvnorms[btv->tvnorm].cropcap;
2989 static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
2991 struct bttv_fh *fh = f;
2992 struct bttv *btv = fh->btv;
2994 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2995 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2998 /* No fh->do_crop = 1; because btv->crop[1] may be
2999 inconsistent with fh->width or fh->height and apps
3000 do not expect a change here. */
3002 crop->c = btv->crop[!!fh->do_crop].rect;
3007 static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
3009 struct bttv_fh *fh = f;
3010 struct bttv *btv = fh->btv;
3011 const struct v4l2_rect *b;
3019 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
3020 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
3023 /* Make sure tvnorm, vbi_end and the current cropping
3024 parameters remain consistent until we're done. Note
3025 read() may change vbi_end in check_alloc_btres_lock(). */
3026 retval = v4l2_prio_check(&btv->prio, fh->prio);
3033 if (locked_btres(fh->btv, VIDEO_RESOURCES)) {
3037 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
3040 b_right = b_left + b->width;
3041 b_bottom = b->top + b->height;
3043 b_top = max(b->top, btv->vbi_end);
3044 if (b_top + 32 >= b_bottom) {
3048 /* Min. scaled size 48 x 32. */
3049 c.rect.left = clamp(crop->c.left, b_left, b_right - 48);
3050 c.rect.left = min(c.rect.left, (__s32) MAX_HDELAY);
3052 c.rect.width = clamp(crop->c.width,
3053 48, b_right - c.rect.left);
3055 c.rect.top = clamp(crop->c.top, b_top, b_bottom - 32);
3056 /* Top and height must be a multiple of two. */
3057 c.rect.top = (c.rect.top + 1) & ~1;
3059 c.rect.height = clamp(crop->c.height,
3060 32, b_bottom - c.rect.top);
3061 c.rect.height = (c.rect.height + 1) & ~1;
3063 bttv_crop_calc_limits(&c);
3069 if (fh->width < c.min_scaled_width) {
3070 fh->width = c.min_scaled_width;
3071 btv->init.width = c.min_scaled_width;
3072 } else if (fh->width > c.max_scaled_width) {
3073 fh->width = c.max_scaled_width;
3074 btv->init.width = c.max_scaled_width;
3077 if (fh->height < c.min_scaled_height) {
3078 fh->height = c.min_scaled_height;
3079 btv->init.height = c.min_scaled_height;
3080 } else if (fh->height > c.max_scaled_height) {
3081 fh->height = c.max_scaled_height;
3082 btv->init.height = c.max_scaled_height;
3088 static int bttv_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
3090 if (unlikely(a->index))
3093 strcpy(a->name, "audio");
3097 static int bttv_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
3099 if (unlikely(a->index))
3105 static ssize_t bttv_read(struct file *file, char __user *data,
3106 size_t count, loff_t *ppos)
3108 struct bttv_fh *fh = file->private_data;
3111 if (fh->btv->errors)
3112 bttv_reinit_bt848(fh->btv);
3113 dprintk("bttv%d: read count=%d type=%s\n",
3114 fh->btv->c.nr,(int)count,v4l2_type_names[fh->type]);
3117 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3118 if (!check_alloc_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ)) {
3119 /* VIDEO_READ in use by another fh,
3120 or VIDEO_STREAM by any fh. */
3123 retval = videobuf_read_one(&fh->cap, data, count, ppos,
3124 file->f_flags & O_NONBLOCK);
3125 free_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ);
3127 case V4L2_BUF_TYPE_VBI_CAPTURE:
3128 if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
3130 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
3131 file->f_flags & O_NONBLOCK);
3139 static unsigned int bttv_poll(struct file *file, poll_table *wait)
3141 struct bttv_fh *fh = file->private_data;
3142 struct bttv_buffer *buf;
3143 enum v4l2_field field;
3144 unsigned int rc = POLLERR;
3146 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
3147 if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
3149 return videobuf_poll_stream(file, &fh->vbi, wait);
3152 if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
3153 /* streaming capture */
3154 if (list_empty(&fh->cap.stream))
3156 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
3158 /* read() capture */
3159 if (NULL == fh->cap.read_buf) {
3160 /* need to capture a new frame */
3161 if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM))
3163 fh->cap.read_buf = videobuf_sg_alloc(fh->cap.msize);
3164 if (NULL == fh->cap.read_buf)
3166 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
3167 field = videobuf_next_field(&fh->cap);
3168 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
3169 kfree (fh->cap.read_buf);
3170 fh->cap.read_buf = NULL;
3173 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
3174 fh->cap.read_off = 0;
3176 buf = (struct bttv_buffer*)fh->cap.read_buf;
3179 poll_wait(file, &buf->vb.done, wait);
3180 if (buf->vb.state == VIDEOBUF_DONE ||
3181 buf->vb.state == VIDEOBUF_ERROR)
3182 rc = POLLIN|POLLRDNORM;
3189 static int bttv_open(struct file *file)
3191 struct video_device *vdev = video_devdata(file);
3192 struct bttv *btv = video_drvdata(file);
3194 enum v4l2_buf_type type = 0;
3196 dprintk(KERN_DEBUG "bttv: open dev=%s\n", video_device_node_name(vdev));
3198 if (vdev->vfl_type == VFL_TYPE_GRABBER) {
3199 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3200 } else if (vdev->vfl_type == VFL_TYPE_VBI) {
3201 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3207 dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
3208 btv->c.nr,v4l2_type_names[type]);
3210 /* allocate per filehandle data */
3211 fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3214 file->private_data = fh;
3219 fh->ov.setup_ok = 0;
3221 v4l2_prio_open(&btv->prio, &fh->prio);
3223 videobuf_queue_sg_init(&fh->cap, &bttv_video_qops,
3224 &btv->c.pci->dev, &btv->s_lock,
3225 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3226 V4L2_FIELD_INTERLACED,
3227 sizeof(struct bttv_buffer),
3229 videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops,
3230 &btv->c.pci->dev, &btv->s_lock,
3231 V4L2_BUF_TYPE_VBI_CAPTURE,
3233 sizeof(struct bttv_buffer),
3235 set_tvnorm(btv,btv->tvnorm);
3236 set_input(btv, btv->input, btv->tvnorm);
3240 /* The V4L2 spec requires one global set of cropping parameters
3241 which only change on request. These are stored in btv->crop[1].
3242 However for compatibility with V4L apps and cropping unaware
3243 V4L2 apps we now reset the cropping parameters as seen through
3244 this fh, which is to say VIDIOC_G_CROP and scaling limit checks
3245 will use btv->crop[0], the default cropping parameters for the
3246 current video standard, and VIDIOC_S_FMT will not implicitely
3247 change the cropping parameters until VIDIOC_S_CROP has been
3249 fh->do_crop = !reset_crop; /* module parameter */
3251 /* Likewise there should be one global set of VBI capture
3252 parameters, but for compatibility with V4L apps and earlier
3253 driver versions each fh has its own parameters. */
3254 bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
3256 bttv_field_count(btv);
3260 static int bttv_release(struct file *file)
3262 struct bttv_fh *fh = file->private_data;
3263 struct bttv *btv = fh->btv;
3265 /* turn off overlay */
3266 if (check_btres(fh, RESOURCE_OVERLAY))
3267 bttv_switch_overlay(btv,fh,NULL);
3269 /* stop video capture */
3270 if (check_btres(fh, RESOURCE_VIDEO_STREAM)) {
3271 videobuf_streamoff(&fh->cap);
3272 free_btres_lock(btv,fh,RESOURCE_VIDEO_STREAM);
3274 if (fh->cap.read_buf) {
3275 buffer_release(&fh->cap,fh->cap.read_buf);
3276 kfree(fh->cap.read_buf);
3278 if (check_btres(fh, RESOURCE_VIDEO_READ)) {
3279 free_btres_lock(btv, fh, RESOURCE_VIDEO_READ);
3282 /* stop vbi capture */
3283 if (check_btres(fh, RESOURCE_VBI)) {
3284 videobuf_stop(&fh->vbi);
3285 free_btres_lock(btv,fh,RESOURCE_VBI);
3290 videobuf_mmap_free(&fh->cap);
3291 videobuf_mmap_free(&fh->vbi);
3292 v4l2_prio_close(&btv->prio, fh->prio);
3293 file->private_data = NULL;
3297 bttv_field_count(btv);
3306 bttv_mmap(struct file *file, struct vm_area_struct *vma)
3308 struct bttv_fh *fh = file->private_data;
3310 dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
3311 fh->btv->c.nr, v4l2_type_names[fh->type],
3312 vma->vm_start, vma->vm_end - vma->vm_start);
3313 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3316 static const struct v4l2_file_operations bttv_fops =
3318 .owner = THIS_MODULE,
3320 .release = bttv_release,
3321 .unlocked_ioctl = video_ioctl2,
3327 static const struct v4l2_ioctl_ops bttv_ioctl_ops = {
3328 .vidioc_querycap = bttv_querycap,
3329 .vidioc_enum_fmt_vid_cap = bttv_enum_fmt_vid_cap,
3330 .vidioc_g_fmt_vid_cap = bttv_g_fmt_vid_cap,
3331 .vidioc_try_fmt_vid_cap = bttv_try_fmt_vid_cap,
3332 .vidioc_s_fmt_vid_cap = bttv_s_fmt_vid_cap,
3333 .vidioc_enum_fmt_vid_overlay = bttv_enum_fmt_vid_overlay,
3334 .vidioc_g_fmt_vid_overlay = bttv_g_fmt_vid_overlay,
3335 .vidioc_try_fmt_vid_overlay = bttv_try_fmt_vid_overlay,
3336 .vidioc_s_fmt_vid_overlay = bttv_s_fmt_vid_overlay,
3337 .vidioc_g_fmt_vbi_cap = bttv_g_fmt_vbi_cap,
3338 .vidioc_try_fmt_vbi_cap = bttv_try_fmt_vbi_cap,
3339 .vidioc_s_fmt_vbi_cap = bttv_s_fmt_vbi_cap,
3340 .vidioc_g_audio = bttv_g_audio,
3341 .vidioc_s_audio = bttv_s_audio,
3342 .vidioc_cropcap = bttv_cropcap,
3343 .vidioc_reqbufs = bttv_reqbufs,
3344 .vidioc_querybuf = bttv_querybuf,
3345 .vidioc_qbuf = bttv_qbuf,
3346 .vidioc_dqbuf = bttv_dqbuf,
3347 .vidioc_s_std = bttv_s_std,
3348 .vidioc_enum_input = bttv_enum_input,
3349 .vidioc_g_input = bttv_g_input,
3350 .vidioc_s_input = bttv_s_input,
3351 .vidioc_queryctrl = bttv_queryctrl,
3352 .vidioc_g_ctrl = bttv_g_ctrl,
3353 .vidioc_s_ctrl = bttv_s_ctrl,
3354 .vidioc_streamon = bttv_streamon,
3355 .vidioc_streamoff = bttv_streamoff,
3356 .vidioc_g_tuner = bttv_g_tuner,
3357 .vidioc_s_tuner = bttv_s_tuner,
3358 #ifdef CONFIG_VIDEO_V4L1_COMPAT
3359 .vidiocgmbuf = vidiocgmbuf,
3361 .vidioc_g_crop = bttv_g_crop,
3362 .vidioc_s_crop = bttv_s_crop,
3363 .vidioc_g_fbuf = bttv_g_fbuf,
3364 .vidioc_s_fbuf = bttv_s_fbuf,
3365 .vidioc_overlay = bttv_overlay,
3366 .vidioc_g_priority = bttv_g_priority,
3367 .vidioc_s_priority = bttv_s_priority,
3368 .vidioc_g_parm = bttv_g_parm,
3369 .vidioc_g_frequency = bttv_g_frequency,
3370 .vidioc_s_frequency = bttv_s_frequency,
3371 .vidioc_log_status = bttv_log_status,
3372 .vidioc_querystd = bttv_querystd,
3373 #ifdef CONFIG_VIDEO_ADV_DEBUG
3374 .vidioc_g_register = bttv_g_register,
3375 .vidioc_s_register = bttv_s_register,
3379 static struct video_device bttv_video_template = {
3381 .ioctl_ops = &bttv_ioctl_ops,
3382 .tvnorms = BTTV_NORMS,
3383 .current_norm = V4L2_STD_PAL,
3386 /* ----------------------------------------------------------------------- */
3387 /* radio interface */
3389 static int radio_open(struct file *file)
3391 struct video_device *vdev = video_devdata(file);
3392 struct bttv *btv = video_drvdata(file);
3395 dprintk("bttv: open dev=%s\n", video_device_node_name(vdev));
3397 dprintk("bttv%d: open called (radio)\n",btv->c.nr);
3399 /* allocate per filehandle data */
3400 fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3403 file->private_data = fh;
3406 v4l2_prio_open(&btv->prio, &fh->prio);
3410 bttv_call_all(btv, tuner, s_radio);
3411 audio_input(btv,TVAUDIO_INPUT_RADIO);
3416 static int radio_release(struct file *file)
3418 struct bttv_fh *fh = file->private_data;
3419 struct bttv *btv = fh->btv;
3420 struct rds_command cmd;
3422 v4l2_prio_close(&btv->prio, fh->prio);
3423 file->private_data = NULL;
3428 bttv_call_all(btv, core, ioctl, RDS_CMD_CLOSE, &cmd);
3433 static int radio_querycap(struct file *file, void *priv,
3434 struct v4l2_capability *cap)
3436 struct bttv_fh *fh = priv;
3437 struct bttv *btv = fh->btv;
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;
3448 static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
3450 struct bttv_fh *fh = priv;
3451 struct bttv *btv = fh->btv;
3453 if (btv->tuner_type == TUNER_ABSENT)
3457 strcpy(t->name, "Radio");
3458 t->type = V4L2_TUNER_RADIO;
3460 bttv_call_all(btv, tuner, g_tuner, t);
3462 if (btv->audio_mode_gpio)
3463 btv->audio_mode_gpio(btv, t, 0);
3468 static int radio_enum_input(struct file *file, void *priv,
3469 struct v4l2_input *i)
3474 strcpy(i->name, "Radio");
3475 i->type = V4L2_INPUT_TYPE_TUNER;
3480 static int radio_g_audio(struct file *file, void *priv,
3481 struct v4l2_audio *a)
3483 if (unlikely(a->index))
3486 strcpy(a->name, "Radio");
3491 static int radio_s_tuner(struct file *file, void *priv,
3492 struct v4l2_tuner *t)
3494 struct bttv_fh *fh = priv;
3495 struct bttv *btv = fh->btv;
3500 bttv_call_all(btv, tuner, g_tuner, t);
3504 static int radio_s_audio(struct file *file, void *priv,
3505 struct v4l2_audio *a)
3507 if (unlikely(a->index))
3513 static int radio_s_input(struct file *filp, void *priv, unsigned int i)
3521 static int radio_s_std(struct file *file, void *fh, v4l2_std_id *norm)
3526 static int radio_queryctrl(struct file *file, void *priv,
3527 struct v4l2_queryctrl *c)
3529 const struct v4l2_queryctrl *ctrl;
3531 if (c->id < V4L2_CID_BASE ||
3532 c->id >= V4L2_CID_LASTP1)
3535 if (c->id == V4L2_CID_AUDIO_MUTE) {
3536 ctrl = ctrl_by_id(c->id);
3544 static int radio_g_input(struct file *filp, void *priv, unsigned int *i)
3550 static ssize_t radio_read(struct file *file, char __user *data,
3551 size_t count, loff_t *ppos)
3553 struct bttv_fh *fh = file->private_data;
3554 struct bttv *btv = fh->btv;
3555 struct rds_command cmd;
3556 cmd.block_count = count/3;
3558 cmd.instance = file;
3559 cmd.result = -ENODEV;
3561 bttv_call_all(btv, core, ioctl, RDS_CMD_READ, &cmd);
3566 static unsigned int radio_poll(struct file *file, poll_table *wait)
3568 struct bttv_fh *fh = file->private_data;
3569 struct bttv *btv = fh->btv;
3570 struct rds_command cmd;
3571 cmd.instance = file;
3572 cmd.event_list = wait;
3573 cmd.result = -ENODEV;
3574 bttv_call_all(btv, core, ioctl, RDS_CMD_POLL, &cmd);
3579 static const struct v4l2_file_operations radio_fops =
3581 .owner = THIS_MODULE,
3584 .release = radio_release,
3585 .unlocked_ioctl = video_ioctl2,
3589 static const struct v4l2_ioctl_ops radio_ioctl_ops = {
3590 .vidioc_querycap = radio_querycap,
3591 .vidioc_g_tuner = radio_g_tuner,
3592 .vidioc_enum_input = radio_enum_input,
3593 .vidioc_g_audio = radio_g_audio,
3594 .vidioc_s_tuner = radio_s_tuner,
3595 .vidioc_s_audio = radio_s_audio,
3596 .vidioc_s_input = radio_s_input,
3597 .vidioc_s_std = radio_s_std,
3598 .vidioc_queryctrl = radio_queryctrl,
3599 .vidioc_g_input = radio_g_input,
3600 .vidioc_g_ctrl = bttv_g_ctrl,
3601 .vidioc_s_ctrl = bttv_s_ctrl,
3602 .vidioc_g_frequency = bttv_g_frequency,
3603 .vidioc_s_frequency = bttv_s_frequency,
3606 static struct video_device radio_template = {
3607 .fops = &radio_fops,
3608 .ioctl_ops = &radio_ioctl_ops,
3611 /* ----------------------------------------------------------------------- */
3612 /* some debug code */
3614 static int bttv_risc_decode(u32 risc)
3616 static char *instr[16] = {
3617 [ BT848_RISC_WRITE >> 28 ] = "write",
3618 [ BT848_RISC_SKIP >> 28 ] = "skip",
3619 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3620 [ BT848_RISC_JUMP >> 28 ] = "jump",
3621 [ BT848_RISC_SYNC >> 28 ] = "sync",
3622 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3623 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3624 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3626 static int incr[16] = {
3627 [ BT848_RISC_WRITE >> 28 ] = 2,
3628 [ BT848_RISC_JUMP >> 28 ] = 2,
3629 [ BT848_RISC_SYNC >> 28 ] = 2,
3630 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3631 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3632 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3634 static char *bits[] = {
3635 "be0", "be1", "be2", "be3/resync",
3636 "set0", "set1", "set2", "set3",
3637 "clr0", "clr1", "clr2", "clr3",
3638 "irq", "res", "eol", "sol",
3642 printk("0x%08x [ %s", risc,
3643 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3644 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3645 if (risc & (1 << (i + 12)))
3646 printk(" %s",bits[i]);
3647 printk(" count=%d ]\n", risc & 0xfff);
3648 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3651 static void bttv_risc_disasm(struct bttv *btv,
3652 struct btcx_riscmem *risc)
3656 printk("%s: risc disasm: %p [dma=0x%08lx]\n",
3657 btv->c.v4l2_dev.name, risc->cpu, (unsigned long)risc->dma);
3658 for (i = 0; i < (risc->size >> 2); i += n) {
3659 printk("%s: 0x%lx: ", btv->c.v4l2_dev.name,
3660 (unsigned long)(risc->dma + (i<<2)));
3661 n = bttv_risc_decode(le32_to_cpu(risc->cpu[i]));
3662 for (j = 1; j < n; j++)
3663 printk("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3664 btv->c.v4l2_dev.name, (unsigned long)(risc->dma + ((i+j)<<2)),
3666 if (0 == risc->cpu[i])
3671 static void bttv_print_riscaddr(struct bttv *btv)
3673 printk(" main: %08Lx\n",
3674 (unsigned long long)btv->main.dma);
3675 printk(" vbi : o=%08Lx e=%08Lx\n",
3676 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3677 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3678 printk(" cap : o=%08Lx e=%08Lx\n",
3679 btv->curr.top ? (unsigned long long)btv->curr.top->top.dma : 0,
3680 btv->curr.bottom ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3681 printk(" scr : o=%08Lx e=%08Lx\n",
3682 btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3683 btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3684 bttv_risc_disasm(btv, &btv->main);
3687 /* ----------------------------------------------------------------------- */
3690 static char *irq_name[] = {
3691 "FMTCHG", // format change detected (525 vs. 625)
3692 "VSYNC", // vertical sync (new field)
3693 "HSYNC", // horizontal sync
3694 "OFLOW", // chroma/luma AGC overflow
3695 "HLOCK", // horizontal lock changed
3696 "VPRES", // video presence changed
3698 "I2CDONE", // hw irc operation finished
3699 "GPINT", // gpio port triggered irq
3701 "RISCI", // risc instruction triggered irq
3702 "FBUS", // pixel data fifo dropped data (high pci bus latencies)
3703 "FTRGT", // pixel data fifo overrun
3704 "FDSR", // fifo data stream resyncronisation
3705 "PPERR", // parity error (data transfer)
3706 "RIPERR", // parity error (read risc instructions)
3707 "PABORT", // pci abort
3708 "OCERR", // risc instruction error
3709 "SCERR", // syncronisation error
3712 static void bttv_print_irqbits(u32 print, u32 mark)
3717 for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3718 if (print & (1 << i))
3719 printk(" %s",irq_name[i]);
3720 if (mark & (1 << i))
3725 static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3727 printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3729 (unsigned long)btv->main.dma,
3730 (unsigned long)le32_to_cpu(btv->main.cpu[RISC_SLOT_O_VBI+1]),
3731 (unsigned long)le32_to_cpu(btv->main.cpu[RISC_SLOT_O_FIELD+1]),
3734 if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3735 printk("bttv%d: Oh, there (temporarely?) is no input signal. "
3736 "Ok, then this is harmless, don't worry ;)\n",
3740 printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
3742 printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
3748 bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3750 struct bttv_buffer *item;
3752 memset(set,0,sizeof(*set));
3754 /* capture request ? */
3755 if (!list_empty(&btv->capture)) {
3757 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3758 if (V4L2_FIELD_HAS_TOP(item->vb.field))
3760 if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3763 /* capture request for other field ? */
3764 if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3765 (item->vb.queue.next != &btv->capture)) {
3766 item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3767 /* Mike Isely <isely@pobox.com> - Only check
3768 * and set up the bottom field in the logic
3769 * below. Don't ever do the top field. This
3770 * of course means that if we set up the
3771 * bottom field in the above code that we'll
3772 * actually skip a field. But that's OK.
3773 * Having processed only a single buffer this
3774 * time, then the next time around the first
3775 * available buffer should be for a top field.
3776 * That will then cause us here to set up a
3777 * top then a bottom field in the normal way.
3778 * The alternative to this understanding is
3779 * that we set up the second available buffer
3780 * as a top field, but that's out of order
3781 * since this driver always processes the top
3782 * field first - the effect will be the two
3783 * buffers being returned in the wrong order,
3784 * with the second buffer also being delayed
3785 * by one field time (owing to the fifo nature
3786 * of videobuf). Worse still, we'll be stuck
3787 * doing fields out of order now every time
3788 * until something else causes a field to be
3789 * dropped. By effectively forcing a field to
3790 * drop this way then we always get back into
3791 * sync within a single frame time. (Out of
3792 * order fields can screw up deinterlacing
3794 if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3795 if (NULL == set->bottom &&
3796 V4L2_FIELD_BOTTOM == item->vb.field) {
3799 if (NULL != set->top && NULL != set->bottom)
3805 /* screen overlay ? */
3806 if (NULL != btv->screen) {
3807 if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3808 if (NULL == set->top && NULL == set->bottom) {
3809 set->top = btv->screen;
3810 set->bottom = btv->screen;
3813 if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3815 set->top = btv->screen;
3817 if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3818 NULL == set->bottom) {
3819 set->bottom = btv->screen;
3824 dprintk("bttv%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3825 btv->c.nr,set->top, set->bottom,
3826 btv->screen,set->frame_irq,set->top_irq);
3831 bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3832 struct bttv_buffer_set *curr, unsigned int state)
3836 do_gettimeofday(&ts);
3838 if (wakeup->top == wakeup->bottom) {
3839 if (NULL != wakeup->top && curr->top != wakeup->top) {
3841 printk("bttv%d: wakeup: both=%p\n",btv->c.nr,wakeup->top);
3842 wakeup->top->vb.ts = ts;
3843 wakeup->top->vb.field_count = btv->field_count;
3844 wakeup->top->vb.state = state;
3845 wake_up(&wakeup->top->vb.done);
3848 if (NULL != wakeup->top && curr->top != wakeup->top) {
3850 printk("bttv%d: wakeup: top=%p\n",btv->c.nr,wakeup->top);
3851 wakeup->top->vb.ts = ts;
3852 wakeup->top->vb.field_count = btv->field_count;
3853 wakeup->top->vb.state = state;
3854 wake_up(&wakeup->top->vb.done);
3856 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3858 printk("bttv%d: wakeup: bottom=%p\n",btv->c.nr,wakeup->bottom);
3859 wakeup->bottom->vb.ts = ts;
3860 wakeup->bottom->vb.field_count = btv->field_count;
3861 wakeup->bottom->vb.state = state;
3862 wake_up(&wakeup->bottom->vb.done);
3868 bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3876 do_gettimeofday(&ts);
3878 wakeup->vb.field_count = btv->field_count;
3879 wakeup->vb.state = state;
3880 wake_up(&wakeup->vb.done);
3883 static void bttv_irq_timeout(unsigned long data)
3885 struct bttv *btv = (struct bttv *)data;
3886 struct bttv_buffer_set old,new;
3887 struct bttv_buffer *ovbi;
3888 struct bttv_buffer *item;
3889 unsigned long flags;
3892 printk(KERN_INFO "bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3893 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3894 btread(BT848_RISC_COUNT));
3895 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3899 spin_lock_irqsave(&btv->s_lock,flags);
3901 /* deactivate stuff */
3902 memset(&new,0,sizeof(new));
3908 bttv_buffer_activate_video(btv, &new);
3909 bttv_buffer_activate_vbi(btv, NULL);
3910 bttv_set_dma(btv, 0);
3913 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_ERROR);
3914 bttv_irq_wakeup_vbi(btv, ovbi, VIDEOBUF_ERROR);
3916 /* cancel all outstanding capture / vbi requests */
3917 while (!list_empty(&btv->capture)) {
3918 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3919 list_del(&item->vb.queue);
3920 item->vb.state = VIDEOBUF_ERROR;
3921 wake_up(&item->vb.done);
3923 while (!list_empty(&btv->vcapture)) {
3924 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3925 list_del(&item->vb.queue);
3926 item->vb.state = VIDEOBUF_ERROR;
3927 wake_up(&item->vb.done);
3931 spin_unlock_irqrestore(&btv->s_lock,flags);
3935 bttv_irq_wakeup_top(struct bttv *btv)
3937 struct bttv_buffer *wakeup = btv->curr.top;
3942 spin_lock(&btv->s_lock);
3943 btv->curr.top_irq = 0;
3944 btv->curr.top = NULL;
3945 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3947 do_gettimeofday(&wakeup->vb.ts);
3948 wakeup->vb.field_count = btv->field_count;
3949 wakeup->vb.state = VIDEOBUF_DONE;
3950 wake_up(&wakeup->vb.done);
3951 spin_unlock(&btv->s_lock);
3954 static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3958 if (rc > risc->dma + risc->size)
3964 bttv_irq_switch_video(struct bttv *btv)
3966 struct bttv_buffer_set new;
3967 struct bttv_buffer_set old;
3970 spin_lock(&btv->s_lock);
3972 /* new buffer set */
3973 bttv_irq_next_video(btv, &new);
3974 rc = btread(BT848_RISC_COUNT);
3975 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3976 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3979 bttv_irq_debug_low_latency(btv, rc);
3980 spin_unlock(&btv->s_lock);
3987 btv->loop_irq &= ~1;
3988 bttv_buffer_activate_video(btv, &new);
3989 bttv_set_dma(btv, 0);
3992 if (UNSET != btv->new_input) {
3993 video_mux(btv,btv->new_input);
3994 btv->new_input = UNSET;
3997 /* wake up finished buffers */
3998 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_DONE);
3999 spin_unlock(&btv->s_lock);
4003 bttv_irq_switch_vbi(struct bttv *btv)
4005 struct bttv_buffer *new = NULL;
4006 struct bttv_buffer *old;
4009 spin_lock(&btv->s_lock);
4011 if (!list_empty(&btv->vcapture))
4012 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
4015 rc = btread(BT848_RISC_COUNT);
4016 if (NULL != old && (is_active(&old->top, rc) ||
4017 is_active(&old->bottom, rc))) {
4020 bttv_irq_debug_low_latency(btv, rc);
4021 spin_unlock(&btv->s_lock);
4027 btv->loop_irq &= ~4;
4028 bttv_buffer_activate_vbi(btv, new);
4029 bttv_set_dma(btv, 0);
4031 bttv_irq_wakeup_vbi(btv, old, VIDEOBUF_DONE);
4032 spin_unlock(&btv->s_lock);
4035 static irqreturn_t bttv_irq(int irq, void *dev_id)
4043 btv=(struct bttv *)dev_id;
4045 if (btv->custom_irq)
4046 handled = btv->custom_irq(btv);
4050 /* get/clear interrupt status bits */
4051 stat=btread(BT848_INT_STAT);
4052 astat=stat&btread(BT848_INT_MASK);
4056 btwrite(stat,BT848_INT_STAT);
4058 /* get device status bits */
4059 dstat=btread(BT848_DSTATUS);
4062 printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d "
4063 "riscs=%x, riscc=%08x, ",
4064 btv->c.nr, count, btv->field_count,
4065 stat>>28, btread(BT848_RISC_COUNT));
4066 bttv_print_irqbits(stat,astat);
4067 if (stat & BT848_INT_HLOCK)
4068 printk(" HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
4070 if (stat & BT848_INT_VPRES)
4071 printk(" PRES => %s", (dstat & BT848_DSTATUS_PRES)
4073 if (stat & BT848_INT_FMTCHG)
4074 printk(" NUML => %s", (dstat & BT848_DSTATUS_NUML)
4079 if (astat&BT848_INT_VSYNC)
4082 if ((astat & BT848_INT_GPINT) && btv->remote) {
4083 wake_up(&btv->gpioq);
4084 bttv_input_irq(btv);
4087 if (astat & BT848_INT_I2CDONE) {
4088 btv->i2c_done = stat;
4089 wake_up(&btv->i2c_queue);
4092 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
4093 bttv_irq_switch_vbi(btv);
4095 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
4096 bttv_irq_wakeup_top(btv);
4098 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
4099 bttv_irq_switch_video(btv);
4101 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
4102 audio_mute(btv, btv->mute); /* trigger automute */
4104 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
4105 printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->c.nr,
4106 (astat & BT848_INT_SCERR) ? "SCERR" : "",
4107 (astat & BT848_INT_OCERR) ? "OCERR" : "",
4108 btread(BT848_RISC_COUNT));
4109 bttv_print_irqbits(stat,astat);
4112 bttv_print_riscaddr(btv);
4114 if (fdsr && astat & BT848_INT_FDSR) {
4115 printk(KERN_INFO "bttv%d: FDSR @ %08x\n",
4116 btv->c.nr,btread(BT848_RISC_COUNT));
4118 bttv_print_riscaddr(btv);
4124 if (count > 8 || !(astat & BT848_INT_GPINT)) {
4125 btwrite(0, BT848_INT_MASK);
4128 "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr);
4131 "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv->c.nr);
4133 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
4137 bttv_print_irqbits(stat,astat);
4145 return IRQ_RETVAL(handled);
4149 /* ----------------------------------------------------------------------- */
4150 /* initialitation */
4152 static struct video_device *vdev_init(struct bttv *btv,
4153 const struct video_device *template,
4154 const char *type_name)
4156 struct video_device *vfd;
4158 vfd = video_device_alloc();
4162 vfd->v4l2_dev = &btv->c.v4l2_dev;
4163 vfd->release = video_device_release;
4164 vfd->debug = bttv_debug;
4165 video_set_drvdata(vfd, btv);
4166 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
4167 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
4168 type_name, bttv_tvcards[btv->c.type].name);
4172 static void bttv_unregister_video(struct bttv *btv)
4174 if (btv->video_dev) {
4175 if (video_is_registered(btv->video_dev))
4176 video_unregister_device(btv->video_dev);
4178 video_device_release(btv->video_dev);
4179 btv->video_dev = NULL;
4182 if (video_is_registered(btv->vbi_dev))
4183 video_unregister_device(btv->vbi_dev);
4185 video_device_release(btv->vbi_dev);
4186 btv->vbi_dev = NULL;
4188 if (btv->radio_dev) {
4189 if (video_is_registered(btv->radio_dev))
4190 video_unregister_device(btv->radio_dev);
4192 video_device_release(btv->radio_dev);
4193 btv->radio_dev = NULL;
4197 /* register video4linux devices */
4198 static int __devinit bttv_register_video(struct bttv *btv)
4201 printk("bttv: Overlay support disabled.\n");
4204 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
4206 if (NULL == btv->video_dev)
4208 if (video_register_device(btv->video_dev, VFL_TYPE_GRABBER,
4209 video_nr[btv->c.nr]) < 0)
4211 printk(KERN_INFO "bttv%d: registered device %s\n",
4212 btv->c.nr, video_device_node_name(btv->video_dev));
4213 if (device_create_file(&btv->video_dev->dev,
4214 &dev_attr_card)<0) {
4215 printk(KERN_ERR "bttv%d: device_create_file 'card' "
4216 "failed\n", btv->c.nr);
4221 btv->vbi_dev = vdev_init(btv, &bttv_video_template, "vbi");
4223 if (NULL == btv->vbi_dev)
4225 if (video_register_device(btv->vbi_dev, VFL_TYPE_VBI,
4226 vbi_nr[btv->c.nr]) < 0)
4228 printk(KERN_INFO "bttv%d: registered device %s\n",
4229 btv->c.nr, video_device_node_name(btv->vbi_dev));
4231 if (!btv->has_radio)
4234 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
4235 if (NULL == btv->radio_dev)
4237 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,
4238 radio_nr[btv->c.nr]) < 0)
4240 printk(KERN_INFO "bttv%d: registered device %s\n",
4241 btv->c.nr, video_device_node_name(btv->radio_dev));
4247 bttv_unregister_video(btv);
4252 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
4253 /* response on cards with no firmware is not enabled by OF */
4254 static void pci_set_command(struct pci_dev *dev)
4256 #if defined(__powerpc__)
4259 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
4260 cmd = (cmd | PCI_COMMAND_MEMORY );
4261 pci_write_config_dword(dev, PCI_COMMAND, cmd);
4265 static int __devinit bttv_probe(struct pci_dev *dev,
4266 const struct pci_device_id *pci_id)
4272 if (bttv_num == BTTV_MAX)
4274 printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
4275 bttvs[bttv_num] = btv = kzalloc(sizeof(*btv), GFP_KERNEL);
4277 printk(KERN_ERR "bttv: out of memory.\n");
4280 btv->c.nr = bttv_num;
4281 snprintf(btv->c.v4l2_dev.name, sizeof(btv->c.v4l2_dev.name),
4282 "bttv%d", btv->c.nr);
4284 /* initialize structs / fill in defaults */
4285 mutex_init(&btv->lock);
4286 spin_lock_init(&btv->s_lock);
4287 spin_lock_init(&btv->gpio_lock);
4288 init_waitqueue_head(&btv->gpioq);
4289 init_waitqueue_head(&btv->i2c_queue);
4290 INIT_LIST_HEAD(&btv->c.subs);
4291 INIT_LIST_HEAD(&btv->capture);
4292 INIT_LIST_HEAD(&btv->vcapture);
4293 v4l2_prio_init(&btv->prio);
4295 init_timer(&btv->timeout);
4296 btv->timeout.function = bttv_irq_timeout;
4297 btv->timeout.data = (unsigned long)btv;
4300 btv->tuner_type = UNSET;
4301 btv->new_input = UNSET;
4302 btv->has_radio=radio[btv->c.nr];
4304 /* pci stuff (init, get irq/mmio, ... */
4306 btv->id = dev->device;
4307 if (pci_enable_device(dev)) {
4308 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4312 if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
4313 printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
4317 if (!request_mem_region(pci_resource_start(dev,0),
4318 pci_resource_len(dev,0),
4319 btv->c.v4l2_dev.name)) {
4320 printk(KERN_WARNING "bttv%d: can't request iomem (0x%llx).\n",
4322 (unsigned long long)pci_resource_start(dev,0));
4325 pci_set_master(dev);
4326 pci_set_command(dev);
4328 result = v4l2_device_register(&dev->dev, &btv->c.v4l2_dev);
4330 printk(KERN_WARNING "bttv%d: v4l2_device_register() failed\n", btv->c.nr);
4334 pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
4335 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
4336 printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ",
4337 bttv_num,btv->id, btv->revision, pci_name(dev));
4338 printk("irq: %d, latency: %d, mmio: 0x%llx\n",
4339 btv->c.pci->irq, lat,
4340 (unsigned long long)pci_resource_start(dev,0));
4343 btv->bt848_mmio = ioremap(pci_resource_start(dev, 0), 0x1000);
4344 if (NULL == btv->bt848_mmio) {
4345 printk("bttv%d: ioremap() failed\n", btv->c.nr);
4353 /* disable irqs, register irq handler */
4354 btwrite(0, BT848_INT_MASK);
4355 result = request_irq(btv->c.pci->irq, bttv_irq,
4356 IRQF_SHARED | IRQF_DISABLED, btv->c.v4l2_dev.name, (void *)btv);
4358 printk(KERN_ERR "bttv%d: can't get IRQ %d\n",
4359 bttv_num,btv->c.pci->irq);
4363 if (0 != bttv_handle_chipset(btv)) {
4368 /* init options from insmod args */
4369 btv->opt_combfilter = combfilter;
4370 btv->opt_lumafilter = lumafilter;
4371 btv->opt_automute = automute;
4372 btv->opt_chroma_agc = chroma_agc;
4373 btv->opt_adc_crush = adc_crush;
4374 btv->opt_vcr_hack = vcr_hack;
4375 btv->opt_whitecrush_upper = whitecrush_upper;
4376 btv->opt_whitecrush_lower = whitecrush_lower;
4377 btv->opt_uv_ratio = uv_ratio;
4378 btv->opt_full_luma_range = full_luma_range;
4379 btv->opt_coring = coring;
4381 /* fill struct bttv with some useful defaults */
4382 btv->init.btv = btv;
4383 btv->init.ov.w.width = 320;
4384 btv->init.ov.w.height = 240;
4385 btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
4386 btv->init.width = 320;
4387 btv->init.height = 240;
4390 /* initialize hardware */
4392 bttv_gpio_tracking(btv,"pre-init");
4394 bttv_risc_init_main(btv);
4398 btwrite(0x00, BT848_GPIO_REG_INP);
4399 btwrite(0x00, BT848_GPIO_OUT_EN);
4401 bttv_gpio_tracking(btv,"init");
4403 /* needs to be done before i2c is registered */
4404 bttv_init_card1(btv);
4406 /* register i2c + gpio */
4409 /* some card-specific stuff (needs working i2c) */
4410 bttv_init_card2(btv);
4411 bttv_init_tuner(btv);
4414 /* register video4linux + input */
4415 if (!bttv_tvcards[btv->c.type].no_video) {
4416 bttv_register_video(btv);
4417 bt848_bright(btv,32768);
4418 bt848_contrast(btv,32768);
4419 bt848_hue(btv,32768);
4420 bt848_sat(btv,32768);
4422 set_input(btv, 0, btv->tvnorm);
4423 bttv_crop_reset(&btv->crop[0], btv->tvnorm);
4424 btv->crop[1] = btv->crop[0]; /* current = default */
4425 disclaim_vbi_lines(btv);
4426 disclaim_video_lines(btv);
4429 /* add subdevices and autoload dvb-bt8xx if needed */
4430 if (bttv_tvcards[btv->c.type].has_dvb) {
4431 bttv_sub_add_device(&btv->c, "dvb");
4432 request_modules(btv);
4436 init_bttv_i2c_ir(btv);
4437 bttv_input_init(btv);
4440 /* everything is fine */
4445 free_irq(btv->c.pci->irq,btv);
4448 v4l2_device_unregister(&btv->c.v4l2_dev);
4451 if (btv->bt848_mmio)
4452 iounmap(btv->bt848_mmio);
4453 release_mem_region(pci_resource_start(btv->c.pci,0),
4454 pci_resource_len(btv->c.pci,0));
4458 static void __devexit bttv_remove(struct pci_dev *pci_dev)
4460 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4461 struct bttv *btv = to_bttv(v4l2_dev);
4464 printk("bttv%d: unloading\n",btv->c.nr);
4466 /* shutdown everything (DMA+IRQs) */
4467 btand(~15, BT848_GPIO_DMA_CTL);
4468 btwrite(0, BT848_INT_MASK);
4469 btwrite(~0x0, BT848_INT_STAT);
4470 btwrite(0x0, BT848_GPIO_OUT_EN);
4472 bttv_gpio_tracking(btv,"cleanup");
4474 /* tell gpio modules we are leaving ... */
4476 wake_up(&btv->gpioq);
4477 bttv_input_fini(btv);
4478 bttv_sub_del_devices(&btv->c);
4480 /* unregister i2c_bus + input */
4483 /* unregister video4linux */
4484 bttv_unregister_video(btv);
4486 /* free allocated memory */
4487 btcx_riscmem_free(btv->c.pci,&btv->main);
4489 /* free ressources */
4490 free_irq(btv->c.pci->irq,btv);
4491 iounmap(btv->bt848_mmio);
4492 release_mem_region(pci_resource_start(btv->c.pci,0),
4493 pci_resource_len(btv->c.pci,0));
4495 v4l2_device_unregister(&btv->c.v4l2_dev);
4496 bttvs[btv->c.nr] = NULL;
4503 static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4505 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4506 struct bttv *btv = to_bttv(v4l2_dev);
4507 struct bttv_buffer_set idle;
4508 unsigned long flags;
4510 dprintk("bttv%d: suspend %d\n", btv->c.nr, state.event);
4512 /* stop dma + irqs */
4513 spin_lock_irqsave(&btv->s_lock,flags);
4514 memset(&idle, 0, sizeof(idle));
4515 btv->state.video = btv->curr;
4516 btv->state.vbi = btv->cvbi;
4517 btv->state.loop_irq = btv->loop_irq;
4520 bttv_buffer_activate_video(btv, &idle);
4521 bttv_buffer_activate_vbi(btv, NULL);
4522 bttv_set_dma(btv, 0);
4523 btwrite(0, BT848_INT_MASK);
4524 spin_unlock_irqrestore(&btv->s_lock,flags);
4526 /* save bt878 state */
4527 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4528 btv->state.gpio_data = gpio_read();
4530 /* save pci state */
4531 pci_save_state(pci_dev);
4532 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4533 pci_disable_device(pci_dev);
4534 btv->state.disabled = 1;
4539 static int bttv_resume(struct pci_dev *pci_dev)
4541 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4542 struct bttv *btv = to_bttv(v4l2_dev);
4543 unsigned long flags;
4546 dprintk("bttv%d: resume\n", btv->c.nr);
4548 /* restore pci state */
4549 if (btv->state.disabled) {
4550 err=pci_enable_device(pci_dev);
4552 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4556 btv->state.disabled = 0;
4558 err=pci_set_power_state(pci_dev, PCI_D0);
4560 pci_disable_device(pci_dev);
4561 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4563 btv->state.disabled = 1;
4567 pci_restore_state(pci_dev);
4569 /* restore bt878 state */
4570 bttv_reinit_bt848(btv);
4571 gpio_inout(0xffffff, btv->state.gpio_enable);
4572 gpio_write(btv->state.gpio_data);
4575 spin_lock_irqsave(&btv->s_lock,flags);
4576 btv->curr = btv->state.video;
4577 btv->cvbi = btv->state.vbi;
4578 btv->loop_irq = btv->state.loop_irq;
4579 bttv_buffer_activate_video(btv, &btv->curr);
4580 bttv_buffer_activate_vbi(btv, btv->cvbi);
4581 bttv_set_dma(btv, 0);
4582 spin_unlock_irqrestore(&btv->s_lock,flags);
4587 static struct pci_device_id bttv_pci_tbl[] = {
4588 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT848), 0},
4589 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT849), 0},
4590 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT878), 0},
4591 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT879), 0},
4595 MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4597 static struct pci_driver bttv_pci_driver = {
4599 .id_table = bttv_pci_tbl,
4600 .probe = bttv_probe,
4601 .remove = __devexit_p(bttv_remove),
4603 .suspend = bttv_suspend,
4604 .resume = bttv_resume,
4608 static int __init bttv_init_module(void)
4614 printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
4615 (BTTV_VERSION_CODE >> 16) & 0xff,
4616 (BTTV_VERSION_CODE >> 8) & 0xff,
4617 BTTV_VERSION_CODE & 0xff);
4619 printk(KERN_INFO "bttv: snapshot date %04d-%02d-%02d\n",
4620 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
4622 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4624 if (gbufsize > BTTV_MAX_FBUF)
4625 gbufsize = BTTV_MAX_FBUF;
4626 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4628 printk(KERN_INFO "bttv: using %d buffers with %dk (%d pages) each for capture\n",
4629 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4631 bttv_check_chipset();
4633 ret = bus_register(&bttv_sub_bus_type);
4635 printk(KERN_WARNING "bttv: bus_register error: %d\n", ret);
4638 ret = pci_register_driver(&bttv_pci_driver);
4640 bus_unregister(&bttv_sub_bus_type);
4645 static void __exit bttv_cleanup_module(void)
4647 pci_unregister_driver(&bttv_pci_driver);
4648 bus_unregister(&bttv_sub_bus_type);
4651 module_init(bttv_init_module);
4652 module_exit(bttv_cleanup_module);