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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
39 #include <linux/init.h>
40 #include <linux/module.h>
41 #include <linux/delay.h>
42 #include <linux/slab.h>
43 #include <linux/errno.h>
45 #include <linux/kernel.h>
46 #include <linux/sched.h>
47 #include <linux/interrupt.h>
48 #include <linux/kdev_t.h>
50 #include <media/v4l2-common.h>
51 #include <media/v4l2-ioctl.h>
52 #include <media/tvaudio.h>
53 #include <media/msp3400.h>
55 #include <linux/dma-mapping.h>
58 #include <asm/byteorder.h>
60 #include <media/saa6588.h>
62 #define BTTV_VERSION "0.9.19"
64 unsigned int bttv_num; /* number of Bt848s in use */
65 struct bttv *bttvs[BTTV_MAX];
67 unsigned int bttv_debug;
68 unsigned int bttv_verbose = 1;
69 unsigned int bttv_gpio;
71 /* config variables */
73 static unsigned int bigendian=1;
75 static unsigned int bigendian;
77 static unsigned int radio[BTTV_MAX];
78 static unsigned int irq_debug;
79 static unsigned int gbuffers = 8;
80 static unsigned int gbufsize = 0x208000;
81 static unsigned int reset_crop = 1;
83 static int video_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
84 static int radio_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
85 static int vbi_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
86 static int debug_latency;
87 static int disable_ir;
89 static unsigned int fdsr;
92 static unsigned int combfilter;
93 static unsigned int lumafilter;
94 static unsigned int automute = 1;
95 static unsigned int chroma_agc;
96 static unsigned int adc_crush = 1;
97 static unsigned int whitecrush_upper = 0xCF;
98 static unsigned int whitecrush_lower = 0x7F;
99 static unsigned int vcr_hack;
100 static unsigned int irq_iswitch;
101 static unsigned int uv_ratio = 50;
102 static unsigned int full_luma_range;
103 static unsigned int coring;
105 /* API features (turn on/off stuff for testing) */
106 static unsigned int v4l2 = 1;
109 module_param(bttv_verbose, int, 0644);
110 module_param(bttv_gpio, int, 0644);
111 module_param(bttv_debug, int, 0644);
112 module_param(irq_debug, int, 0644);
113 module_param(debug_latency, int, 0644);
114 module_param(disable_ir, int, 0444);
116 module_param(fdsr, int, 0444);
117 module_param(gbuffers, int, 0444);
118 module_param(gbufsize, int, 0444);
119 module_param(reset_crop, int, 0444);
121 module_param(v4l2, int, 0644);
122 module_param(bigendian, int, 0644);
123 module_param(irq_iswitch, int, 0644);
124 module_param(combfilter, int, 0444);
125 module_param(lumafilter, int, 0444);
126 module_param(automute, int, 0444);
127 module_param(chroma_agc, int, 0444);
128 module_param(adc_crush, int, 0444);
129 module_param(whitecrush_upper, int, 0444);
130 module_param(whitecrush_lower, int, 0444);
131 module_param(vcr_hack, int, 0444);
132 module_param(uv_ratio, int, 0444);
133 module_param(full_luma_range, int, 0444);
134 module_param(coring, int, 0444);
136 module_param_array(radio, int, NULL, 0444);
137 module_param_array(video_nr, int, NULL, 0444);
138 module_param_array(radio_nr, int, NULL, 0444);
139 module_param_array(vbi_nr, int, NULL, 0444);
141 MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
142 MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
143 MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
144 MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
145 MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
146 MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
147 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
148 MODULE_PARM_DESC(gbuffers,"number of capture buffers. range 2-32, default 8");
149 MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
150 MODULE_PARM_DESC(reset_crop,"reset cropping parameters at open(), default "
151 "is 1 (yes) for compatibility with older applications");
152 MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
153 MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
154 MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
155 MODULE_PARM_DESC(whitecrush_upper,"sets the white crush upper value, default is 207");
156 MODULE_PARM_DESC(whitecrush_lower,"sets the white crush lower value, default is 127");
157 MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
158 MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler");
159 MODULE_PARM_DESC(uv_ratio,"ratio between u and v gains, default is 50");
160 MODULE_PARM_DESC(full_luma_range,"use the full luma range, default is 0 (no)");
161 MODULE_PARM_DESC(coring,"set the luma coring level, default is 0 (no)");
162 MODULE_PARM_DESC(video_nr, "video device numbers");
163 MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
164 MODULE_PARM_DESC(radio_nr, "radio device numbers");
166 MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
167 MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
168 MODULE_LICENSE("GPL");
169 MODULE_VERSION(BTTV_VERSION);
171 /* ----------------------------------------------------------------------- */
174 static ssize_t show_card(struct device *cd,
175 struct device_attribute *attr, char *buf)
177 struct video_device *vfd = container_of(cd, struct video_device, dev);
178 struct bttv *btv = video_get_drvdata(vfd);
179 return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
181 static DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
183 /* ----------------------------------------------------------------------- */
184 /* dvb auto-load setup */
185 #if defined(CONFIG_MODULES) && defined(MODULE)
186 static void request_module_async(struct work_struct *work)
188 request_module("dvb-bt8xx");
191 static void request_modules(struct bttv *dev)
193 INIT_WORK(&dev->request_module_wk, request_module_async);
194 schedule_work(&dev->request_module_wk);
197 static void flush_request_modules(struct bttv *dev)
199 flush_work_sync(&dev->request_module_wk);
202 #define request_modules(dev)
203 #define flush_request_modules(dev)
204 #endif /* CONFIG_MODULES */
207 /* ----------------------------------------------------------------------- */
210 /* special timing tables from conexant... */
211 static u8 SRAM_Table[][60] =
213 /* PAL digital input over GPIO[7:0] */
215 45, // 45 bytes following
216 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
217 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
218 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
219 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
220 0x37,0x00,0xAF,0x21,0x00
222 /* NTSC digital input over GPIO[7:0] */
224 51, // 51 bytes following
225 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
226 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
227 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
228 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
229 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
232 // TGB_NTSC392 // quartzsight
233 // This table has been modified to be used for Fusion Rev D
235 0x2A, // size of table = 42
236 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
237 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
238 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
239 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
244 /* minhdelayx1 first video pixel we can capture on a line and
245 hdelayx1 start of active video, both relative to rising edge of
246 /HRESET pulse (0H) in 1 / fCLKx1.
247 swidth width of active video and
248 totalwidth total line width, both in 1 / fCLKx1.
249 sqwidth total line width in square pixels.
250 vdelay start of active video in 2 * field lines relative to
251 trailing edge of /VRESET pulse (VDELAY register).
252 sheight height of active video in 2 * field lines.
253 videostart0 ITU-R frame line number of the line corresponding
254 to vdelay in the first field. */
255 #define CROPCAP(minhdelayx1, hdelayx1, swidth, totalwidth, sqwidth, \
256 vdelay, sheight, videostart0) \
257 .cropcap.bounds.left = minhdelayx1, \
258 /* * 2 because vertically we count field lines times two, */ \
259 /* e.g. 23 * 2 to 23 * 2 + 576 in PAL-BGHI defrect. */ \
260 .cropcap.bounds.top = (videostart0) * 2 - (vdelay) + MIN_VDELAY, \
261 /* 4 is a safety margin at the end of the line. */ \
262 .cropcap.bounds.width = (totalwidth) - (minhdelayx1) - 4, \
263 .cropcap.bounds.height = (sheight) + (vdelay) - MIN_VDELAY, \
264 .cropcap.defrect.left = hdelayx1, \
265 .cropcap.defrect.top = (videostart0) * 2, \
266 .cropcap.defrect.width = swidth, \
267 .cropcap.defrect.height = sheight, \
268 .cropcap.pixelaspect.numerator = totalwidth, \
269 .cropcap.pixelaspect.denominator = sqwidth,
271 const struct bttv_tvnorm bttv_tvnorms[] = {
273 /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
274 /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
276 .v4l2_id = V4L2_STD_PAL,
284 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
285 .scaledtwidth = 1135,
289 .vbipack = 255, /* min (2048 / 4, 0x1ff) & 0xff */
291 /* ITU-R frame line number of the first VBI line
292 we can capture, of the first and second field.
293 The last line is determined by cropcap.bounds. */
294 .vbistart = { 7, 320 },
295 CROPCAP(/* minhdelayx1 */ 68,
297 /* Should be (768 * 1135 + 944 / 2) / 944.
298 cropcap.defrect is used for image width
299 checks, so we keep the old value 924. */
301 /* totalwidth */ 1135,
305 /* videostart0 */ 23)
306 /* bt878 (and bt848?) can capture another
307 line below active video. */
308 .cropcap.bounds.height = (576 + 2) + 0x20 - 2,
310 .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
318 .iform = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
323 .vbipack = 144, /* min (1600 / 4, 0x1ff) & 0xff */
325 .vbistart = { 10, 273 },
326 CROPCAP(/* minhdelayx1 */ 68,
328 /* Should be (640 * 910 + 780 / 2) / 780? */
330 /* totalwidth */ 910,
334 /* videostart0 */ 23)
336 .v4l2_id = V4L2_STD_SECAM,
344 .iform = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
345 .scaledtwidth = 1135,
350 .sram = 0, /* like PAL, correct? */
351 .vbistart = { 7, 320 },
352 CROPCAP(/* minhdelayx1 */ 68,
355 /* totalwidth */ 1135,
359 /* videostart0 */ 23)
361 .v4l2_id = V4L2_STD_PAL_Nc,
369 .iform = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
376 .vbistart = { 7, 320 },
377 CROPCAP(/* minhdelayx1 */ 68,
379 /* swidth */ (640 * 910 + 780 / 2) / 780,
380 /* totalwidth */ 910,
384 /* videostart0 */ 23)
386 .v4l2_id = V4L2_STD_PAL_M,
394 .iform = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
401 .vbistart = { 10, 273 },
402 CROPCAP(/* minhdelayx1 */ 68,
404 /* swidth */ (640 * 910 + 780 / 2) / 780,
405 /* totalwidth */ 910,
409 /* videostart0 */ 23)
411 .v4l2_id = V4L2_STD_PAL_N,
419 .iform = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
426 .vbistart = { 7, 320 },
427 CROPCAP(/* minhdelayx1 */ 68,
429 /* swidth */ (768 * 1135 + 944 / 2) / 944,
430 /* totalwidth */ 1135,
434 /* videostart0 */ 23)
436 .v4l2_id = V4L2_STD_NTSC_M_JP,
444 .iform = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
451 .vbistart = { 10, 273 },
452 CROPCAP(/* minhdelayx1 */ 68,
454 /* swidth */ (640 * 910 + 780 / 2) / 780,
455 /* totalwidth */ 910,
459 /* videostart0 */ 23)
461 /* that one hopefully works with the strange timing
462 * which video recorders produce when playing a NTSC
463 * tape on a PAL TV ... */
464 .v4l2_id = V4L2_STD_PAL_60,
472 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
473 .scaledtwidth = 1135,
480 .vbistart = { 10, 273 },
481 CROPCAP(/* minhdelayx1 */ 68,
484 /* totalwidth */ 1135,
488 /* videostart0 */ 23)
491 static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
493 /* ----------------------------------------------------------------------- */
495 packed pixel formats must come first */
496 static const struct bttv_format formats[] = {
498 .name = "8 bpp, gray",
499 .fourcc = V4L2_PIX_FMT_GREY,
500 .btformat = BT848_COLOR_FMT_Y8,
502 .flags = FORMAT_FLAGS_PACKED,
504 .name = "8 bpp, dithered color",
505 .fourcc = V4L2_PIX_FMT_HI240,
506 .btformat = BT848_COLOR_FMT_RGB8,
508 .flags = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
510 .name = "15 bpp RGB, le",
511 .fourcc = V4L2_PIX_FMT_RGB555,
512 .btformat = BT848_COLOR_FMT_RGB15,
514 .flags = FORMAT_FLAGS_PACKED,
516 .name = "15 bpp RGB, be",
517 .fourcc = V4L2_PIX_FMT_RGB555X,
518 .btformat = BT848_COLOR_FMT_RGB15,
519 .btswap = 0x03, /* byteswap */
521 .flags = FORMAT_FLAGS_PACKED,
523 .name = "16 bpp RGB, le",
524 .fourcc = V4L2_PIX_FMT_RGB565,
525 .btformat = BT848_COLOR_FMT_RGB16,
527 .flags = FORMAT_FLAGS_PACKED,
529 .name = "16 bpp RGB, be",
530 .fourcc = V4L2_PIX_FMT_RGB565X,
531 .btformat = BT848_COLOR_FMT_RGB16,
532 .btswap = 0x03, /* byteswap */
534 .flags = FORMAT_FLAGS_PACKED,
536 .name = "24 bpp RGB, le",
537 .fourcc = V4L2_PIX_FMT_BGR24,
538 .btformat = BT848_COLOR_FMT_RGB24,
540 .flags = FORMAT_FLAGS_PACKED,
542 .name = "32 bpp RGB, le",
543 .fourcc = V4L2_PIX_FMT_BGR32,
544 .btformat = BT848_COLOR_FMT_RGB32,
546 .flags = FORMAT_FLAGS_PACKED,
548 .name = "32 bpp RGB, be",
549 .fourcc = V4L2_PIX_FMT_RGB32,
550 .btformat = BT848_COLOR_FMT_RGB32,
551 .btswap = 0x0f, /* byte+word swap */
553 .flags = FORMAT_FLAGS_PACKED,
555 .name = "4:2:2, packed, YUYV",
556 .fourcc = V4L2_PIX_FMT_YUYV,
557 .btformat = BT848_COLOR_FMT_YUY2,
559 .flags = FORMAT_FLAGS_PACKED,
561 .name = "4:2:2, packed, YUYV",
562 .fourcc = V4L2_PIX_FMT_YUYV,
563 .btformat = BT848_COLOR_FMT_YUY2,
565 .flags = FORMAT_FLAGS_PACKED,
567 .name = "4:2:2, packed, UYVY",
568 .fourcc = V4L2_PIX_FMT_UYVY,
569 .btformat = BT848_COLOR_FMT_YUY2,
570 .btswap = 0x03, /* byteswap */
572 .flags = FORMAT_FLAGS_PACKED,
574 .name = "4:2:2, planar, Y-Cb-Cr",
575 .fourcc = V4L2_PIX_FMT_YUV422P,
576 .btformat = BT848_COLOR_FMT_YCrCb422,
578 .flags = FORMAT_FLAGS_PLANAR,
582 .name = "4:2:0, planar, Y-Cb-Cr",
583 .fourcc = V4L2_PIX_FMT_YUV420,
584 .btformat = BT848_COLOR_FMT_YCrCb422,
586 .flags = FORMAT_FLAGS_PLANAR,
590 .name = "4:2:0, planar, Y-Cr-Cb",
591 .fourcc = V4L2_PIX_FMT_YVU420,
592 .btformat = BT848_COLOR_FMT_YCrCb422,
594 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
598 .name = "4:1:1, planar, Y-Cb-Cr",
599 .fourcc = V4L2_PIX_FMT_YUV411P,
600 .btformat = BT848_COLOR_FMT_YCrCb411,
602 .flags = FORMAT_FLAGS_PLANAR,
606 .name = "4:1:0, planar, Y-Cb-Cr",
607 .fourcc = V4L2_PIX_FMT_YUV410,
608 .btformat = BT848_COLOR_FMT_YCrCb411,
610 .flags = FORMAT_FLAGS_PLANAR,
614 .name = "4:1:0, planar, Y-Cr-Cb",
615 .fourcc = V4L2_PIX_FMT_YVU410,
616 .btformat = BT848_COLOR_FMT_YCrCb411,
618 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
622 .name = "raw scanlines",
624 .btformat = BT848_COLOR_FMT_RAW,
626 .flags = FORMAT_FLAGS_RAW,
629 static const unsigned int FORMATS = ARRAY_SIZE(formats);
631 /* ----------------------------------------------------------------------- */
633 #define V4L2_CID_PRIVATE_CHROMA_AGC (V4L2_CID_PRIVATE_BASE + 0)
634 #define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_PRIVATE_BASE + 1)
635 #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2)
636 #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3)
637 #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4)
638 #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5)
639 #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6)
640 #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7)
641 #define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8)
642 #define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9)
643 #define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10)
644 #define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11)
646 static const struct v4l2_queryctrl no_ctl = {
648 .flags = V4L2_CTRL_FLAG_DISABLED,
650 static const struct v4l2_queryctrl bttv_ctls[] = {
653 .id = V4L2_CID_BRIGHTNESS,
654 .name = "Brightness",
658 .default_value = 32768,
659 .type = V4L2_CTRL_TYPE_INTEGER,
661 .id = V4L2_CID_CONTRAST,
666 .default_value = 32768,
667 .type = V4L2_CTRL_TYPE_INTEGER,
669 .id = V4L2_CID_SATURATION,
670 .name = "Saturation",
674 .default_value = 32768,
675 .type = V4L2_CTRL_TYPE_INTEGER,
682 .default_value = 32768,
683 .type = V4L2_CTRL_TYPE_INTEGER,
687 .id = V4L2_CID_AUDIO_MUTE,
691 .type = V4L2_CTRL_TYPE_BOOLEAN,
693 .id = V4L2_CID_AUDIO_VOLUME,
698 .default_value = 65535,
699 .type = V4L2_CTRL_TYPE_INTEGER,
701 .id = V4L2_CID_AUDIO_BALANCE,
706 .default_value = 32768,
707 .type = V4L2_CTRL_TYPE_INTEGER,
709 .id = V4L2_CID_AUDIO_BASS,
714 .default_value = 32768,
715 .type = V4L2_CTRL_TYPE_INTEGER,
717 .id = V4L2_CID_AUDIO_TREBLE,
722 .default_value = 32768,
723 .type = V4L2_CTRL_TYPE_INTEGER,
725 /* --- private --- */
727 .id = V4L2_CID_PRIVATE_CHROMA_AGC,
728 .name = "chroma agc",
731 .type = V4L2_CTRL_TYPE_BOOLEAN,
733 .id = V4L2_CID_PRIVATE_COMBFILTER,
734 .name = "combfilter",
737 .type = V4L2_CTRL_TYPE_BOOLEAN,
739 .id = V4L2_CID_PRIVATE_AUTOMUTE,
743 .type = V4L2_CTRL_TYPE_BOOLEAN,
745 .id = V4L2_CID_PRIVATE_LUMAFILTER,
746 .name = "luma decimation filter",
749 .type = V4L2_CTRL_TYPE_BOOLEAN,
751 .id = V4L2_CID_PRIVATE_AGC_CRUSH,
755 .type = V4L2_CTRL_TYPE_BOOLEAN,
757 .id = V4L2_CID_PRIVATE_VCR_HACK,
761 .type = V4L2_CTRL_TYPE_BOOLEAN,
763 .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
764 .name = "whitecrush upper",
768 .default_value = 0xCF,
769 .type = V4L2_CTRL_TYPE_INTEGER,
771 .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
772 .name = "whitecrush lower",
776 .default_value = 0x7F,
777 .type = V4L2_CTRL_TYPE_INTEGER,
779 .id = V4L2_CID_PRIVATE_UV_RATIO,
785 .type = V4L2_CTRL_TYPE_INTEGER,
787 .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
788 .name = "full luma range",
791 .type = V4L2_CTRL_TYPE_BOOLEAN,
793 .id = V4L2_CID_PRIVATE_CORING,
799 .type = V4L2_CTRL_TYPE_INTEGER,
806 static const struct v4l2_queryctrl *ctrl_by_id(int id)
810 for (i = 0; i < ARRAY_SIZE(bttv_ctls); i++)
811 if (bttv_ctls[i].id == id)
817 /* ----------------------------------------------------------------------- */
818 /* resource management */
821 RESOURCE_ allocated by freed by
823 VIDEO_READ bttv_read 1) bttv_read 2)
825 VIDEO_STREAM VIDIOC_STREAMON VIDIOC_STREAMOFF
826 VIDIOC_QBUF 1) bttv_release
829 OVERLAY VIDIOCCAPTURE on VIDIOCCAPTURE off
830 VIDIOC_OVERLAY on VIDIOC_OVERLAY off
833 VBI VIDIOC_STREAMON VIDIOC_STREAMOFF
834 VIDIOC_QBUF 1) bttv_release
835 bttv_read, bttv_poll 1) 4)
837 1) The resource must be allocated when we enter buffer prepare functions
838 and remain allocated while buffers are in the DMA queue.
839 2) This is a single frame read.
840 3) VIDIOC_S_FBUF and VIDIOC_S_FMT (OVERLAY) still work when
841 RESOURCE_OVERLAY is allocated.
842 4) This is a continuous read, implies VIDIOC_STREAMON.
844 Note this driver permits video input and standard changes regardless if
845 resources are allocated.
848 #define VBI_RESOURCES (RESOURCE_VBI)
849 #define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
850 RESOURCE_VIDEO_STREAM | \
854 int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit)
856 int xbits; /* mutual exclusive resources */
858 if (fh->resources & bit)
859 /* have it already allocated */
863 if (bit & (RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM))
864 xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
867 if (btv->resources & xbits) {
868 /* no, someone else uses it */
872 if ((bit & VIDEO_RESOURCES)
873 && 0 == (btv->resources & VIDEO_RESOURCES)) {
874 /* Do crop - use current, don't - use default parameters. */
875 __s32 top = btv->crop[!!fh->do_crop].rect.top;
877 if (btv->vbi_end > top)
880 /* We cannot capture the same line as video and VBI data.
881 Claim scan lines crop[].rect.top to bottom. */
882 btv->crop_start = top;
883 } else if (bit & VBI_RESOURCES) {
884 __s32 end = fh->vbi_fmt.end;
886 if (end > btv->crop_start)
889 /* Claim scan lines above fh->vbi_fmt.end. */
893 /* it's free, grab it */
894 fh->resources |= bit;
895 btv->resources |= bit;
903 int check_btres(struct bttv_fh *fh, int bit)
905 return (fh->resources & bit);
909 int locked_btres(struct bttv *btv, int bit)
911 return (btv->resources & bit);
914 /* Call with btv->lock down. */
916 disclaim_vbi_lines(struct bttv *btv)
921 /* Call with btv->lock down. */
923 disclaim_video_lines(struct bttv *btv)
925 const struct bttv_tvnorm *tvnorm;
928 tvnorm = &bttv_tvnorms[btv->tvnorm];
929 btv->crop_start = tvnorm->cropcap.bounds.top
930 + tvnorm->cropcap.bounds.height;
932 /* VBI capturing ends at VDELAY, start of video capturing, no
933 matter how many lines the VBI RISC program expects. When video
934 capturing is off, it shall no longer "preempt" VBI capturing,
935 so we set VDELAY to maximum. */
936 crop = btread(BT848_E_CROP) | 0xc0;
937 btwrite(crop, BT848_E_CROP);
938 btwrite(0xfe, BT848_E_VDELAY_LO);
939 btwrite(crop, BT848_O_CROP);
940 btwrite(0xfe, BT848_O_VDELAY_LO);
944 void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits)
946 if ((fh->resources & bits) != bits) {
947 /* trying to free resources not allocated by us ... */
948 pr_err("BUG! (btres)\n");
950 fh->resources &= ~bits;
951 btv->resources &= ~bits;
953 bits = btv->resources;
955 if (0 == (bits & VIDEO_RESOURCES))
956 disclaim_video_lines(btv);
958 if (0 == (bits & VBI_RESOURCES))
959 disclaim_vbi_lines(btv);
962 /* ----------------------------------------------------------------------- */
963 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
965 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
966 PLL_X = Reference pre-divider (0=1, 1=2)
967 PLL_C = Post divider (0=6, 1=4)
968 PLL_I = Integer input
969 PLL_F = Fractional input
971 F_input = 28.636363 MHz:
972 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
975 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
977 unsigned char fl, fh, fi;
979 /* prevent overflows */
992 btwrite(fl, BT848_PLL_F_LO);
993 btwrite(fh, BT848_PLL_F_HI);
994 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
997 static void set_pll(struct bttv *btv)
1001 if (!btv->pll.pll_crystal)
1004 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
1005 dprintk("%d: PLL: no change required\n", btv->c.nr);
1009 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
1011 if (btv->pll.pll_current == 0)
1014 pr_info("%d: PLL can sleep, using XTAL (%d)\n",
1015 btv->c.nr, btv->pll.pll_ifreq);
1016 btwrite(0x00,BT848_TGCTRL);
1017 btwrite(0x00,BT848_PLL_XCI);
1018 btv->pll.pll_current = 0;
1023 pr_info("%d: Setting PLL: %d => %d (needs up to 100ms)\n",
1025 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1026 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
1028 for (i=0; i<10; i++) {
1029 /* Let other people run while the PLL stabilizes */
1032 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
1033 btwrite(0,BT848_DSTATUS);
1035 btwrite(0x08,BT848_TGCTRL);
1036 btv->pll.pll_current = btv->pll.pll_ofreq;
1038 pr_info("PLL set ok\n");
1042 btv->pll.pll_current = -1;
1044 pr_info("Setting PLL failed\n");
1048 /* used to switch between the bt848's analog/digital video capture modes */
1049 static void bt848A_set_timing(struct bttv *btv)
1052 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
1053 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
1055 if (btv->input == btv->dig) {
1056 dprintk("%d: load digital timing table (table_idx=%d)\n",
1057 btv->c.nr,table_idx);
1059 /* timing change...reset timing generator address */
1060 btwrite(0x00, BT848_TGCTRL);
1061 btwrite(0x02, BT848_TGCTRL);
1062 btwrite(0x00, BT848_TGCTRL);
1064 len=SRAM_Table[table_idx][0];
1065 for(i = 1; i <= len; i++)
1066 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
1067 btv->pll.pll_ofreq = 27000000;
1070 btwrite(0x11, BT848_TGCTRL);
1071 btwrite(0x41, BT848_DVSIF);
1073 btv->pll.pll_ofreq = fsc;
1075 btwrite(0x0, BT848_DVSIF);
1079 /* ----------------------------------------------------------------------- */
1081 static void bt848_bright(struct bttv *btv, int bright)
1085 // printk("set bright: %d\n", bright); // DEBUG
1086 btv->bright = bright;
1088 /* We want -128 to 127 we get 0-65535 */
1089 value = (bright >> 8) - 128;
1090 btwrite(value & 0xff, BT848_BRIGHT);
1093 static void bt848_hue(struct bttv *btv, int hue)
1100 value = (hue >> 8) - 128;
1101 btwrite(value & 0xff, BT848_HUE);
1104 static void bt848_contrast(struct bttv *btv, int cont)
1108 btv->contrast = cont;
1111 value = (cont >> 7);
1112 hibit = (value >> 6) & 4;
1113 btwrite(value & 0xff, BT848_CONTRAST_LO);
1114 btaor(hibit, ~4, BT848_E_CONTROL);
1115 btaor(hibit, ~4, BT848_O_CONTROL);
1118 static void bt848_sat(struct bttv *btv, int color)
1120 int val_u,val_v,hibits;
1122 btv->saturation = color;
1124 /* 0-511 for the color */
1125 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
1126 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
1127 hibits = (val_u >> 7) & 2;
1128 hibits |= (val_v >> 8) & 1;
1129 btwrite(val_u & 0xff, BT848_SAT_U_LO);
1130 btwrite(val_v & 0xff, BT848_SAT_V_LO);
1131 btaor(hibits, ~3, BT848_E_CONTROL);
1132 btaor(hibits, ~3, BT848_O_CONTROL);
1135 /* ----------------------------------------------------------------------- */
1138 video_mux(struct bttv *btv, unsigned int input)
1142 if (input >= bttv_tvcards[btv->c.type].video_inputs)
1145 /* needed by RemoteVideo MX */
1146 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
1148 gpio_inout(mask2,mask2);
1150 if (input == btv->svhs) {
1151 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
1152 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
1154 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
1155 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
1157 mux = bttv_muxsel(btv, input);
1158 btaor(mux<<5, ~(3<<5), BT848_IFORM);
1159 dprintk("%d: video mux: input=%d mux=%d\n", btv->c.nr, input, mux);
1161 /* card specific hook */
1162 if(bttv_tvcards[btv->c.type].muxsel_hook)
1163 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
1167 static char *audio_modes[] = {
1168 "audio: tuner", "audio: radio", "audio: extern",
1169 "audio: intern", "audio: mute"
1173 audio_mux(struct bttv *btv, int input, int mute)
1175 int gpio_val, signal;
1176 struct v4l2_control ctrl;
1178 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
1179 bttv_tvcards[btv->c.type].gpiomask);
1180 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
1186 mute = mute || (btv->opt_automute && !signal && !btv->radio_user);
1189 gpio_val = bttv_tvcards[btv->c.type].gpiomute;
1191 gpio_val = bttv_tvcards[btv->c.type].gpiomux[input];
1193 switch (btv->c.type) {
1194 case BTTV_BOARD_VOODOOTV_FM:
1195 case BTTV_BOARD_VOODOOTV_200:
1196 gpio_val = bttv_tda9880_setnorm(btv, gpio_val);
1200 gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpio_val);
1204 bttv_gpio_tracking(btv, audio_modes[mute ? 4 : input]);
1208 ctrl.id = V4L2_CID_AUDIO_MUTE;
1209 ctrl.value = btv->mute;
1210 bttv_call_all(btv, core, s_ctrl, &ctrl);
1211 if (btv->sd_msp34xx) {
1214 /* Note: the inputs tuner/radio/extern/intern are translated
1215 to msp routings. This assumes common behavior for all msp3400
1216 based TV cards. When this assumption fails, then the
1217 specific MSP routing must be added to the card table.
1218 For now this is sufficient. */
1220 case TVAUDIO_INPUT_RADIO:
1221 in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1222 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1224 case TVAUDIO_INPUT_EXTERN:
1225 in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
1226 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1228 case TVAUDIO_INPUT_INTERN:
1229 /* Yes, this is the same input as for RADIO. I doubt
1230 if this is ever used. The only board with an INTERN
1231 input is the BTTV_BOARD_AVERMEDIA98. I wonder how
1232 that was tested. My guess is that the whole INTERN
1233 input does not work. */
1234 in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1235 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1237 case TVAUDIO_INPUT_TUNER:
1239 /* This is the only card that uses TUNER2, and afaik,
1240 is the only difference between the VOODOOTV_FM
1242 if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
1243 in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
1244 MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
1246 in = MSP_INPUT_DEFAULT;
1249 v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing,
1250 in, MSP_OUTPUT_DEFAULT, 0);
1252 if (btv->sd_tvaudio) {
1253 v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing,
1260 audio_mute(struct bttv *btv, int mute)
1262 return audio_mux(btv, btv->audio, mute);
1266 audio_input(struct bttv *btv, int input)
1268 return audio_mux(btv, input, btv->mute);
1272 bttv_crop_calc_limits(struct bttv_crop *c)
1274 /* Scale factor min. 1:1, max. 16:1. Min. image size
1275 48 x 32. Scaled width must be a multiple of 4. */
1278 /* For bug compatibility with VIDIOCGCAP and image
1279 size checks in earlier driver versions. */
1280 c->min_scaled_width = 48;
1281 c->min_scaled_height = 32;
1283 c->min_scaled_width =
1284 (max(48, c->rect.width >> 4) + 3) & ~3;
1285 c->min_scaled_height =
1286 max(32, c->rect.height >> 4);
1289 c->max_scaled_width = c->rect.width & ~3;
1290 c->max_scaled_height = c->rect.height;
1294 bttv_crop_reset(struct bttv_crop *c, unsigned int norm)
1296 c->rect = bttv_tvnorms[norm].cropcap.defrect;
1297 bttv_crop_calc_limits(c);
1300 /* Call with btv->lock down. */
1302 set_tvnorm(struct bttv *btv, unsigned int norm)
1304 const struct bttv_tvnorm *tvnorm;
1307 BUG_ON(norm >= BTTV_TVNORMS);
1308 BUG_ON(btv->tvnorm >= BTTV_TVNORMS);
1310 tvnorm = &bttv_tvnorms[norm];
1312 if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
1313 sizeof (tvnorm->cropcap))) {
1314 bttv_crop_reset(&btv->crop[0], norm);
1315 btv->crop[1] = btv->crop[0]; /* current = default */
1317 if (0 == (btv->resources & VIDEO_RESOURCES)) {
1318 btv->crop_start = tvnorm->cropcap.bounds.top
1319 + tvnorm->cropcap.bounds.height;
1325 btwrite(tvnorm->adelay, BT848_ADELAY);
1326 btwrite(tvnorm->bdelay, BT848_BDELAY);
1327 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
1329 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
1330 btwrite(1, BT848_VBI_PACK_DEL);
1331 bt848A_set_timing(btv);
1333 switch (btv->c.type) {
1334 case BTTV_BOARD_VOODOOTV_FM:
1335 case BTTV_BOARD_VOODOOTV_200:
1336 bttv_tda9880_setnorm(btv, gpio_read());
1339 id = tvnorm->v4l2_id;
1340 bttv_call_all(btv, core, s_std, id);
1345 /* Call with btv->lock down. */
1347 set_input(struct bttv *btv, unsigned int input, unsigned int norm)
1349 unsigned long flags;
1353 spin_lock_irqsave(&btv->s_lock,flags);
1354 if (btv->curr.frame_irq) {
1355 /* active capture -> delayed input switch */
1356 btv->new_input = input;
1358 video_mux(btv,input);
1360 spin_unlock_irqrestore(&btv->s_lock,flags);
1362 video_mux(btv,input);
1364 audio_input(btv, (btv->tuner_type != TUNER_ABSENT && input == 0) ?
1365 TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN);
1366 set_tvnorm(btv, norm);
1369 static void init_irqreg(struct bttv *btv)
1372 btwrite(0xfffffUL, BT848_INT_STAT);
1374 if (bttv_tvcards[btv->c.type].no_video) {
1376 btwrite(BT848_INT_I2CDONE,
1380 btwrite((btv->triton1) |
1381 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1383 (fdsr ? BT848_INT_FDSR : 0) |
1384 BT848_INT_RISCI | BT848_INT_OCERR |
1385 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1391 static void init_bt848(struct bttv *btv)
1395 if (bttv_tvcards[btv->c.type].no_video) {
1396 /* very basic init only */
1401 btwrite(0x00, BT848_CAP_CTL);
1402 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1403 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1405 /* set planar and packed mode trigger points and */
1406 /* set rising edge of inverted GPINTR pin as irq trigger */
1407 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1408 BT848_GPIO_DMA_CTL_PLTP1_16|
1409 BT848_GPIO_DMA_CTL_PLTP23_16|
1410 BT848_GPIO_DMA_CTL_GPINTC|
1411 BT848_GPIO_DMA_CTL_GPINTI,
1412 BT848_GPIO_DMA_CTL);
1414 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1415 btwrite(val, BT848_E_SCLOOP);
1416 btwrite(val, BT848_O_SCLOOP);
1418 btwrite(0x20, BT848_E_VSCALE_HI);
1419 btwrite(0x20, BT848_O_VSCALE_HI);
1420 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1423 btwrite(whitecrush_upper, BT848_WC_UP);
1424 btwrite(whitecrush_lower, BT848_WC_DOWN);
1426 if (btv->opt_lumafilter) {
1427 btwrite(0, BT848_E_CONTROL);
1428 btwrite(0, BT848_O_CONTROL);
1430 btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1431 btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1434 bt848_bright(btv, btv->bright);
1435 bt848_hue(btv, btv->hue);
1436 bt848_contrast(btv, btv->contrast);
1437 bt848_sat(btv, btv->saturation);
1443 static void bttv_reinit_bt848(struct bttv *btv)
1445 unsigned long flags;
1448 pr_info("%d: reset, reinitialize\n", btv->c.nr);
1449 spin_lock_irqsave(&btv->s_lock,flags);
1451 bttv_set_dma(btv,0);
1452 spin_unlock_irqrestore(&btv->s_lock,flags);
1455 btv->pll.pll_current = -1;
1456 set_input(btv, btv->input, btv->tvnorm);
1459 static int bttv_g_ctrl(struct file *file, void *priv,
1460 struct v4l2_control *c)
1462 struct bttv_fh *fh = priv;
1463 struct bttv *btv = fh->btv;
1466 case V4L2_CID_BRIGHTNESS:
1467 c->value = btv->bright;
1470 c->value = btv->hue;
1472 case V4L2_CID_CONTRAST:
1473 c->value = btv->contrast;
1475 case V4L2_CID_SATURATION:
1476 c->value = btv->saturation;
1479 case V4L2_CID_AUDIO_MUTE:
1480 case V4L2_CID_AUDIO_VOLUME:
1481 case V4L2_CID_AUDIO_BALANCE:
1482 case V4L2_CID_AUDIO_BASS:
1483 case V4L2_CID_AUDIO_TREBLE:
1484 bttv_call_all(btv, core, g_ctrl, c);
1487 case V4L2_CID_PRIVATE_CHROMA_AGC:
1488 c->value = btv->opt_chroma_agc;
1490 case V4L2_CID_PRIVATE_COMBFILTER:
1491 c->value = btv->opt_combfilter;
1493 case V4L2_CID_PRIVATE_LUMAFILTER:
1494 c->value = btv->opt_lumafilter;
1496 case V4L2_CID_PRIVATE_AUTOMUTE:
1497 c->value = btv->opt_automute;
1499 case V4L2_CID_PRIVATE_AGC_CRUSH:
1500 c->value = btv->opt_adc_crush;
1502 case V4L2_CID_PRIVATE_VCR_HACK:
1503 c->value = btv->opt_vcr_hack;
1505 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1506 c->value = btv->opt_whitecrush_upper;
1508 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1509 c->value = btv->opt_whitecrush_lower;
1511 case V4L2_CID_PRIVATE_UV_RATIO:
1512 c->value = btv->opt_uv_ratio;
1514 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1515 c->value = btv->opt_full_luma_range;
1517 case V4L2_CID_PRIVATE_CORING:
1518 c->value = btv->opt_coring;
1526 static int bttv_s_ctrl(struct file *file, void *f,
1527 struct v4l2_control *c)
1531 struct bttv_fh *fh = f;
1532 struct bttv *btv = fh->btv;
1534 err = v4l2_prio_check(&btv->prio, fh->prio);
1539 case V4L2_CID_BRIGHTNESS:
1540 bt848_bright(btv, c->value);
1543 bt848_hue(btv, c->value);
1545 case V4L2_CID_CONTRAST:
1546 bt848_contrast(btv, c->value);
1548 case V4L2_CID_SATURATION:
1549 bt848_sat(btv, c->value);
1551 case V4L2_CID_AUDIO_MUTE:
1552 audio_mute(btv, c->value);
1554 case V4L2_CID_AUDIO_VOLUME:
1555 if (btv->volume_gpio)
1556 btv->volume_gpio(btv, c->value);
1558 bttv_call_all(btv, core, s_ctrl, c);
1560 case V4L2_CID_AUDIO_BALANCE:
1561 case V4L2_CID_AUDIO_BASS:
1562 case V4L2_CID_AUDIO_TREBLE:
1563 bttv_call_all(btv, core, s_ctrl, c);
1566 case V4L2_CID_PRIVATE_CHROMA_AGC:
1567 btv->opt_chroma_agc = c->value;
1568 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1569 btwrite(val, BT848_E_SCLOOP);
1570 btwrite(val, BT848_O_SCLOOP);
1572 case V4L2_CID_PRIVATE_COMBFILTER:
1573 btv->opt_combfilter = c->value;
1575 case V4L2_CID_PRIVATE_LUMAFILTER:
1576 btv->opt_lumafilter = c->value;
1577 if (btv->opt_lumafilter) {
1578 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1579 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1581 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1582 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1585 case V4L2_CID_PRIVATE_AUTOMUTE:
1586 btv->opt_automute = c->value;
1588 case V4L2_CID_PRIVATE_AGC_CRUSH:
1589 btv->opt_adc_crush = c->value;
1590 btwrite(BT848_ADC_RESERVED |
1591 (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1594 case V4L2_CID_PRIVATE_VCR_HACK:
1595 btv->opt_vcr_hack = c->value;
1597 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1598 btv->opt_whitecrush_upper = c->value;
1599 btwrite(c->value, BT848_WC_UP);
1601 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1602 btv->opt_whitecrush_lower = c->value;
1603 btwrite(c->value, BT848_WC_DOWN);
1605 case V4L2_CID_PRIVATE_UV_RATIO:
1606 btv->opt_uv_ratio = c->value;
1607 bt848_sat(btv, btv->saturation);
1609 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1610 btv->opt_full_luma_range = c->value;
1611 btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM);
1613 case V4L2_CID_PRIVATE_CORING:
1614 btv->opt_coring = c->value;
1615 btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM);
1623 /* ----------------------------------------------------------------------- */
1625 void bttv_gpio_tracking(struct bttv *btv, char *comment)
1627 unsigned int outbits, data;
1628 outbits = btread(BT848_GPIO_OUT_EN);
1629 data = btread(BT848_GPIO_DATA);
1630 pr_debug("%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1631 btv->c.nr, outbits, data & outbits, data & ~outbits, comment);
1634 static void bttv_field_count(struct bttv *btv)
1642 /* start field counter */
1643 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1645 /* stop field counter */
1646 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1647 btv->field_count = 0;
1651 static const struct bttv_format*
1652 format_by_fourcc(int fourcc)
1656 for (i = 0; i < FORMATS; i++) {
1657 if (-1 == formats[i].fourcc)
1659 if (formats[i].fourcc == fourcc)
1665 /* ----------------------------------------------------------------------- */
1669 bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1670 struct bttv_buffer *new)
1672 struct bttv_buffer *old;
1673 unsigned long flags;
1676 dprintk("switch_overlay: enter [new=%p]\n", new);
1678 new->vb.state = VIDEOBUF_DONE;
1679 spin_lock_irqsave(&btv->s_lock,flags);
1683 bttv_set_dma(btv, 0x03);
1684 spin_unlock_irqrestore(&btv->s_lock,flags);
1686 dprintk("switch_overlay: old=%p state is %d\n",
1687 old, old->vb.state);
1688 bttv_dma_free(&fh->cap,btv, old);
1692 free_btres_lock(btv,fh,RESOURCE_OVERLAY);
1693 dprintk("switch_overlay: done\n");
1697 /* ----------------------------------------------------------------------- */
1698 /* video4linux (1) interface */
1700 static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
1701 struct bttv_buffer *buf,
1702 const struct bttv_format *fmt,
1703 unsigned int width, unsigned int height,
1704 enum v4l2_field field)
1706 struct bttv_fh *fh = q->priv_data;
1707 int redo_dma_risc = 0;
1712 /* check settings */
1715 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1717 height = RAW_LINES*2;
1718 if (width*height > buf->vb.bsize)
1720 buf->vb.size = buf->vb.bsize;
1722 /* Make sure tvnorm and vbi_end remain consistent
1723 until we're done. */
1727 /* In this mode capturing always starts at defrect.top
1728 (default VDELAY), ignoring cropping parameters. */
1729 if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
1733 c.rect = bttv_tvnorms[norm].cropcap.defrect;
1736 c = btv->crop[!!fh->do_crop];
1738 if (width < c.min_scaled_width ||
1739 width > c.max_scaled_width ||
1740 height < c.min_scaled_height)
1744 case V4L2_FIELD_TOP:
1745 case V4L2_FIELD_BOTTOM:
1746 case V4L2_FIELD_ALTERNATE:
1747 /* btv->crop counts frame lines. Max. scale
1748 factor is 16:1 for frames, 8:1 for fields. */
1749 if (height * 2 > c.max_scaled_height)
1754 if (height > c.max_scaled_height)
1759 buf->vb.size = (width * height * fmt->depth) >> 3;
1760 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1764 /* alloc + fill struct bttv_buffer (if changed) */
1765 if (buf->vb.width != width || buf->vb.height != height ||
1766 buf->vb.field != field ||
1767 buf->tvnorm != norm || buf->fmt != fmt ||
1768 buf->crop.top != c.rect.top ||
1769 buf->crop.left != c.rect.left ||
1770 buf->crop.width != c.rect.width ||
1771 buf->crop.height != c.rect.height) {
1772 buf->vb.width = width;
1773 buf->vb.height = height;
1774 buf->vb.field = field;
1781 /* alloc risc memory */
1782 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1784 if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
1789 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1792 buf->vb.state = VIDEOBUF_PREPARED;
1796 bttv_dma_free(q,btv,buf);
1801 buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1803 struct bttv_fh *fh = q->priv_data;
1805 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1808 if (*size * *count > gbuffers * gbufsize)
1809 *count = (gbuffers * gbufsize) / *size;
1814 buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1815 enum v4l2_field field)
1817 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1818 struct bttv_fh *fh = q->priv_data;
1820 return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
1821 fh->width, fh->height, field);
1825 buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1827 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1828 struct bttv_fh *fh = q->priv_data;
1829 struct bttv *btv = fh->btv;
1831 buf->vb.state = VIDEOBUF_QUEUED;
1832 list_add_tail(&buf->vb.queue,&btv->capture);
1833 if (!btv->curr.frame_irq) {
1835 bttv_set_dma(btv, 0x03);
1839 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1841 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1842 struct bttv_fh *fh = q->priv_data;
1844 bttv_dma_free(q,fh->btv,buf);
1847 static struct videobuf_queue_ops bttv_video_qops = {
1848 .buf_setup = buffer_setup,
1849 .buf_prepare = buffer_prepare,
1850 .buf_queue = buffer_queue,
1851 .buf_release = buffer_release,
1854 static int bttv_s_std(struct file *file, void *priv, v4l2_std_id *id)
1856 struct bttv_fh *fh = priv;
1857 struct bttv *btv = fh->btv;
1861 err = v4l2_prio_check(&btv->prio, fh->prio);
1865 for (i = 0; i < BTTV_TVNORMS; i++)
1866 if (*id & bttv_tvnorms[i].v4l2_id)
1868 if (i == BTTV_TVNORMS) {
1880 static int bttv_querystd(struct file *file, void *f, v4l2_std_id *id)
1882 struct bttv_fh *fh = f;
1883 struct bttv *btv = fh->btv;
1885 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1886 *id = V4L2_STD_625_50;
1888 *id = V4L2_STD_525_60;
1892 static int bttv_enum_input(struct file *file, void *priv,
1893 struct v4l2_input *i)
1895 struct bttv_fh *fh = priv;
1896 struct bttv *btv = fh->btv;
1899 if (i->index >= bttv_tvcards[btv->c.type].video_inputs) {
1904 i->type = V4L2_INPUT_TYPE_CAMERA;
1907 if (btv->tuner_type != TUNER_ABSENT && i->index == 0) {
1908 sprintf(i->name, "Television");
1909 i->type = V4L2_INPUT_TYPE_TUNER;
1911 } else if (i->index == btv->svhs) {
1912 sprintf(i->name, "S-Video");
1914 sprintf(i->name, "Composite%d", i->index);
1917 if (i->index == btv->input) {
1918 __u32 dstatus = btread(BT848_DSTATUS);
1919 if (0 == (dstatus & BT848_DSTATUS_PRES))
1920 i->status |= V4L2_IN_ST_NO_SIGNAL;
1921 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1922 i->status |= V4L2_IN_ST_NO_H_LOCK;
1925 i->std = BTTV_NORMS;
1932 static int bttv_g_input(struct file *file, void *priv, unsigned int *i)
1934 struct bttv_fh *fh = priv;
1935 struct bttv *btv = fh->btv;
1942 static int bttv_s_input(struct file *file, void *priv, unsigned int i)
1944 struct bttv_fh *fh = priv;
1945 struct bttv *btv = fh->btv;
1949 err = v4l2_prio_check(&btv->prio, fh->prio);
1953 if (i > bttv_tvcards[btv->c.type].video_inputs) {
1958 set_input(btv, i, btv->tvnorm);
1964 static int bttv_s_tuner(struct file *file, void *priv,
1965 struct v4l2_tuner *t)
1967 struct bttv_fh *fh = priv;
1968 struct bttv *btv = fh->btv;
1971 if (unlikely(0 != t->index))
1974 if (unlikely(btv->tuner_type == TUNER_ABSENT)) {
1979 err = v4l2_prio_check(&btv->prio, fh->prio);
1983 bttv_call_all(btv, tuner, s_tuner, t);
1985 if (btv->audio_mode_gpio)
1986 btv->audio_mode_gpio(btv, t, 1);
1993 static int bttv_g_frequency(struct file *file, void *priv,
1994 struct v4l2_frequency *f)
1996 struct bttv_fh *fh = priv;
1997 struct bttv *btv = fh->btv;
1999 f->type = btv->radio_user ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
2000 f->frequency = btv->freq;
2005 static int bttv_s_frequency(struct file *file, void *priv,
2006 struct v4l2_frequency *f)
2008 struct bttv_fh *fh = priv;
2009 struct bttv *btv = fh->btv;
2012 if (unlikely(f->tuner != 0))
2015 err = v4l2_prio_check(&btv->prio, fh->prio);
2019 if (unlikely(f->type != (btv->radio_user
2020 ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV))) {
2024 btv->freq = f->frequency;
2025 bttv_call_all(btv, tuner, s_frequency, f);
2026 if (btv->has_matchbox && btv->radio_user)
2027 tea5757_set_freq(btv, btv->freq);
2033 static int bttv_log_status(struct file *file, void *f)
2035 struct bttv_fh *fh = f;
2036 struct bttv *btv = fh->btv;
2038 pr_info("%d: ======== START STATUS CARD #%d ========\n",
2039 btv->c.nr, btv->c.nr);
2040 bttv_call_all(btv, core, log_status);
2041 pr_info("%d: ======== END STATUS CARD #%d ========\n",
2042 btv->c.nr, btv->c.nr);
2046 #ifdef CONFIG_VIDEO_ADV_DEBUG
2047 static int bttv_g_register(struct file *file, void *f,
2048 struct v4l2_dbg_register *reg)
2050 struct bttv_fh *fh = f;
2051 struct bttv *btv = fh->btv;
2053 if (!capable(CAP_SYS_ADMIN))
2056 if (!v4l2_chip_match_host(®->match))
2059 /* bt848 has a 12-bit register space */
2061 reg->val = btread(reg->reg);
2067 static int bttv_s_register(struct file *file, void *f,
2068 struct v4l2_dbg_register *reg)
2070 struct bttv_fh *fh = f;
2071 struct bttv *btv = fh->btv;
2073 if (!capable(CAP_SYS_ADMIN))
2076 if (!v4l2_chip_match_host(®->match))
2079 /* bt848 has a 12-bit register space */
2081 btwrite(reg->val, reg->reg);
2087 /* Given cropping boundaries b and the scaled width and height of a
2088 single field or frame, which must not exceed hardware limits, this
2089 function adjusts the cropping parameters c. */
2091 bttv_crop_adjust (struct bttv_crop * c,
2092 const struct v4l2_rect * b,
2095 enum v4l2_field field)
2097 __s32 frame_height = height << !V4L2_FIELD_HAS_BOTH(field);
2101 if (width < c->min_scaled_width) {
2102 /* Max. hor. scale factor 16:1. */
2103 c->rect.width = width * 16;
2104 } else if (width > c->max_scaled_width) {
2105 /* Min. hor. scale factor 1:1. */
2106 c->rect.width = width;
2108 max_left = b->left + b->width - width;
2109 max_left = min(max_left, (__s32) MAX_HDELAY);
2110 if (c->rect.left > max_left)
2111 c->rect.left = max_left;
2114 if (height < c->min_scaled_height) {
2115 /* Max. vert. scale factor 16:1, single fields 8:1. */
2116 c->rect.height = height * 16;
2117 } else if (frame_height > c->max_scaled_height) {
2118 /* Min. vert. scale factor 1:1.
2119 Top and height count field lines times two. */
2120 c->rect.height = (frame_height + 1) & ~1;
2122 max_top = b->top + b->height - c->rect.height;
2123 if (c->rect.top > max_top)
2124 c->rect.top = max_top;
2127 bttv_crop_calc_limits(c);
2130 /* Returns an error if scaling to a frame or single field with the given
2131 width and height is not possible with the current cropping parameters
2132 and width aligned according to width_mask. If adjust_size is TRUE the
2133 function may adjust the width and/or height instead, rounding width
2134 to (width + width_bias) & width_mask. If adjust_crop is TRUE it may
2135 also adjust the current cropping parameters to get closer to the
2136 desired image size. */
2138 limit_scaled_size_lock (struct bttv_fh * fh,
2141 enum v4l2_field field,
2142 unsigned int width_mask,
2143 unsigned int width_bias,
2147 struct bttv *btv = fh->btv;
2148 const struct v4l2_rect *b;
2149 struct bttv_crop *c;
2156 BUG_ON((int) width_mask >= 0 ||
2157 width_bias >= (unsigned int) -width_mask);
2159 /* Make sure tvnorm, vbi_end and the current cropping parameters
2160 remain consistent until we're done. */
2162 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2164 /* Do crop - use current, don't - use default parameters. */
2165 c = &btv->crop[!!fh->do_crop];
2170 && !locked_btres(btv, VIDEO_RESOURCES)) {
2174 /* We cannot scale up. When the scaled image is larger
2175 than crop.rect we adjust the crop.rect as required
2176 by the V4L2 spec, hence cropcap.bounds are our limit. */
2177 max_width = min(b->width, (__s32) MAX_HACTIVE);
2178 max_height = b->height;
2180 /* We cannot capture the same line as video and VBI data.
2181 Note btv->vbi_end is really a minimum, see
2182 bttv_vbi_try_fmt(). */
2183 if (btv->vbi_end > b->top) {
2184 max_height -= btv->vbi_end - b->top;
2186 if (min_height > max_height)
2191 if (btv->vbi_end > c->rect.top)
2194 min_width = c->min_scaled_width;
2195 min_height = c->min_scaled_height;
2196 max_width = c->max_scaled_width;
2197 max_height = c->max_scaled_height;
2202 min_width = (min_width - width_mask - 1) & width_mask;
2203 max_width = max_width & width_mask;
2205 /* Max. scale factor is 16:1 for frames, 8:1 for fields. */
2206 min_height = min_height;
2207 /* Min. scale factor is 1:1. */
2208 max_height >>= !V4L2_FIELD_HAS_BOTH(field);
2211 *width = clamp(*width, min_width, max_width);
2212 *height = clamp(*height, min_height, max_height);
2214 /* Round after clamping to avoid overflow. */
2215 *width = (*width + width_bias) & width_mask;
2218 bttv_crop_adjust(c, b, *width, *height, field);
2220 if (btv->vbi_end > c->rect.top) {
2221 /* Move the crop window out of the way. */
2222 c->rect.top = btv->vbi_end;
2227 if (*width < min_width ||
2228 *height < min_height ||
2229 *width > max_width ||
2230 *height > max_height ||
2231 0 != (*width & ~width_mask))
2235 rc = 0; /* success */
2242 /* Returns an error if the given overlay window dimensions are not
2243 possible with the current cropping parameters. If adjust_size is
2244 TRUE the function may adjust the window width and/or height
2245 instead, however it always rounds the horizontal position and
2246 width as btcx_align() does. If adjust_crop is TRUE the function
2247 may also adjust the current cropping parameters to get closer
2248 to the desired window size. */
2250 verify_window_lock (struct bttv_fh * fh,
2251 struct v4l2_window * win,
2255 enum v4l2_field field;
2256 unsigned int width_mask;
2259 if (win->w.width < 48 || win->w.height < 32)
2261 if (win->clipcount > 2048)
2266 if (V4L2_FIELD_ANY == field) {
2269 height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
2270 field = (win->w.height > height2)
2271 ? V4L2_FIELD_INTERLACED
2275 case V4L2_FIELD_TOP:
2276 case V4L2_FIELD_BOTTOM:
2277 case V4L2_FIELD_INTERLACED:
2283 /* 4-byte alignment. */
2284 if (NULL == fh->ovfmt)
2287 switch (fh->ovfmt->depth) {
2301 win->w.width -= win->w.left & ~width_mask;
2302 win->w.left = (win->w.left - width_mask - 1) & width_mask;
2304 rc = limit_scaled_size_lock(fh, &win->w.width, &win->w.height,
2306 /* width_bias: round down */ 0,
2307 adjust_size, adjust_crop);
2315 static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
2316 struct v4l2_window *win, int fixup)
2318 struct v4l2_clip *clips = NULL;
2319 int n,size,retval = 0;
2321 if (NULL == fh->ovfmt)
2323 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
2325 retval = verify_window_lock(fh, win,
2326 /* adjust_size */ fixup,
2327 /* adjust_crop */ fixup);
2331 /* copy clips -- luckily v4l1 + v4l2 are binary
2332 compatible here ...*/
2334 size = sizeof(*clips)*(n+4);
2335 clips = kmalloc(size,GFP_KERNEL);
2339 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
2345 /* clip against screen */
2346 if (NULL != btv->fbuf.base)
2347 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
2349 btcx_sort_clips(clips,n);
2351 /* 4-byte alignments */
2352 switch (fh->ovfmt->depth) {
2355 btcx_align(&win->w, clips, n, 3);
2358 btcx_align(&win->w, clips, n, 1);
2361 /* no alignment fixups needed */
2367 kfree(fh->ov.clips);
2368 fh->ov.clips = clips;
2372 fh->ov.field = win->field;
2373 fh->ov.setup_ok = 1;
2375 btv->init.ov.w.width = win->w.width;
2376 btv->init.ov.w.height = win->w.height;
2377 btv->init.ov.field = win->field;
2379 /* update overlay if needed */
2381 if (check_btres(fh, RESOURCE_OVERLAY)) {
2382 struct bttv_buffer *new;
2384 new = videobuf_sg_alloc(sizeof(*new));
2385 new->crop = btv->crop[!!fh->do_crop].rect;
2386 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2387 retval = bttv_switch_overlay(btv,fh,new);
2392 /* ----------------------------------------------------------------------- */
2394 static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
2396 struct videobuf_queue* q = NULL;
2399 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2402 case V4L2_BUF_TYPE_VBI_CAPTURE:
2411 static int bttv_resource(struct bttv_fh *fh)
2416 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2417 res = RESOURCE_VIDEO_STREAM;
2419 case V4L2_BUF_TYPE_VBI_CAPTURE:
2428 static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2430 struct videobuf_queue *q = bttv_queue(fh);
2431 int res = bttv_resource(fh);
2433 if (check_btres(fh,res))
2435 if (videobuf_queue_is_busy(q))
2442 pix_format_set_size (struct v4l2_pix_format * f,
2443 const struct bttv_format * fmt,
2445 unsigned int height)
2450 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2451 f->bytesperline = width; /* Y plane */
2452 f->sizeimage = (width * height * fmt->depth) >> 3;
2454 f->bytesperline = (width * fmt->depth) >> 3;
2455 f->sizeimage = height * f->bytesperline;
2459 static int bttv_g_fmt_vid_cap(struct file *file, void *priv,
2460 struct v4l2_format *f)
2462 struct bttv_fh *fh = priv;
2464 pix_format_set_size(&f->fmt.pix, fh->fmt,
2465 fh->width, fh->height);
2466 f->fmt.pix.field = fh->cap.field;
2467 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2472 static int bttv_g_fmt_vid_overlay(struct file *file, void *priv,
2473 struct v4l2_format *f)
2475 struct bttv_fh *fh = priv;
2477 f->fmt.win.w = fh->ov.w;
2478 f->fmt.win.field = fh->ov.field;
2483 static void bttv_get_width_mask_vid_cap(const struct bttv_format *fmt,
2484 unsigned int *width_mask,
2485 unsigned int *width_bias)
2487 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2488 *width_mask = ~15; /* width must be a multiple of 16 pixels */
2489 *width_bias = 8; /* nearest */
2491 *width_mask = ~3; /* width must be a multiple of 4 pixels */
2492 *width_bias = 2; /* nearest */
2496 static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
2497 struct v4l2_format *f)
2499 const struct bttv_format *fmt;
2500 struct bttv_fh *fh = priv;
2501 struct bttv *btv = fh->btv;
2502 enum v4l2_field field;
2503 __s32 width, height;
2504 unsigned int width_mask, width_bias;
2507 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2511 field = f->fmt.pix.field;
2513 if (V4L2_FIELD_ANY == field) {
2516 height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
2517 field = (f->fmt.pix.height > height2)
2518 ? V4L2_FIELD_INTERLACED
2519 : V4L2_FIELD_BOTTOM;
2522 if (V4L2_FIELD_SEQ_BT == field)
2523 field = V4L2_FIELD_SEQ_TB;
2526 case V4L2_FIELD_TOP:
2527 case V4L2_FIELD_BOTTOM:
2528 case V4L2_FIELD_ALTERNATE:
2529 case V4L2_FIELD_INTERLACED:
2531 case V4L2_FIELD_SEQ_TB:
2532 if (fmt->flags & FORMAT_FLAGS_PLANAR)
2539 width = f->fmt.pix.width;
2540 height = f->fmt.pix.height;
2542 bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias);
2543 rc = limit_scaled_size_lock(fh, &width, &height, field,
2544 width_mask, width_bias,
2545 /* adjust_size */ 1,
2546 /* adjust_crop */ 0);
2550 /* update data for the application */
2551 f->fmt.pix.field = field;
2552 pix_format_set_size(&f->fmt.pix, fmt, width, height);
2557 static int bttv_try_fmt_vid_overlay(struct file *file, void *priv,
2558 struct v4l2_format *f)
2560 struct bttv_fh *fh = priv;
2562 return verify_window_lock(fh, &f->fmt.win,
2563 /* adjust_size */ 1,
2564 /* adjust_crop */ 0);
2567 static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
2568 struct v4l2_format *f)
2571 const struct bttv_format *fmt;
2572 struct bttv_fh *fh = priv;
2573 struct bttv *btv = fh->btv;
2574 __s32 width, height;
2575 unsigned int width_mask, width_bias;
2576 enum v4l2_field field;
2578 retval = bttv_switch_type(fh, f->type);
2582 retval = bttv_try_fmt_vid_cap(file, priv, f);
2586 width = f->fmt.pix.width;
2587 height = f->fmt.pix.height;
2588 field = f->fmt.pix.field;
2590 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2591 bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias);
2592 retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field,
2593 width_mask, width_bias,
2594 /* adjust_size */ 1,
2595 /* adjust_crop */ 1);
2599 f->fmt.pix.field = field;
2601 /* update our state informations */
2603 fh->cap.field = f->fmt.pix.field;
2604 fh->cap.last = V4L2_FIELD_NONE;
2605 fh->width = f->fmt.pix.width;
2606 fh->height = f->fmt.pix.height;
2607 btv->init.fmt = fmt;
2608 btv->init.width = f->fmt.pix.width;
2609 btv->init.height = f->fmt.pix.height;
2614 static int bttv_s_fmt_vid_overlay(struct file *file, void *priv,
2615 struct v4l2_format *f)
2617 struct bttv_fh *fh = priv;
2618 struct bttv *btv = fh->btv;
2620 if (no_overlay > 0) {
2621 pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2625 return setup_window_lock(fh, btv, &f->fmt.win, 1);
2628 static int bttv_querycap(struct file *file, void *priv,
2629 struct v4l2_capability *cap)
2631 struct bttv_fh *fh = priv;
2632 struct bttv *btv = fh->btv;
2637 strlcpy(cap->driver, "bttv", sizeof(cap->driver));
2638 strlcpy(cap->card, btv->video_dev->name, sizeof(cap->card));
2639 snprintf(cap->bus_info, sizeof(cap->bus_info),
2640 "PCI:%s", pci_name(btv->c.pci));
2642 V4L2_CAP_VIDEO_CAPTURE |
2643 V4L2_CAP_VBI_CAPTURE |
2644 V4L2_CAP_READWRITE |
2646 if (no_overlay <= 0)
2647 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2650 * No need to lock here: those vars are initialized during board
2651 * probe and remains untouched during the rest of the driver lifecycle
2653 if (btv->has_saa6588)
2654 cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
2655 if (btv->tuner_type != TUNER_ABSENT)
2656 cap->capabilities |= V4L2_CAP_TUNER;
2660 static int bttv_enum_fmt_cap_ovr(struct v4l2_fmtdesc *f)
2664 for (i = 0; i < FORMATS; i++) {
2665 if (formats[i].fourcc != -1)
2667 if ((unsigned int)index == f->index)
2673 f->pixelformat = formats[i].fourcc;
2674 strlcpy(f->description, formats[i].name, sizeof(f->description));
2679 static int bttv_enum_fmt_vid_cap(struct file *file, void *priv,
2680 struct v4l2_fmtdesc *f)
2682 int rc = bttv_enum_fmt_cap_ovr(f);
2690 static int bttv_enum_fmt_vid_overlay(struct file *file, void *priv,
2691 struct v4l2_fmtdesc *f)
2695 if (no_overlay > 0) {
2696 pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2700 rc = bttv_enum_fmt_cap_ovr(f);
2705 if (!(formats[rc].flags & FORMAT_FLAGS_PACKED))
2711 static int bttv_g_fbuf(struct file *file, void *f,
2712 struct v4l2_framebuffer *fb)
2714 struct bttv_fh *fh = f;
2715 struct bttv *btv = fh->btv;
2718 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2720 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2724 static int bttv_overlay(struct file *file, void *f, unsigned int on)
2726 struct bttv_fh *fh = f;
2727 struct bttv *btv = fh->btv;
2728 struct bttv_buffer *new;
2733 if (unlikely(!btv->fbuf.base)) {
2736 if (unlikely(!fh->ov.setup_ok)) {
2737 dprintk("%d: overlay: !setup_ok\n", btv->c.nr);
2744 if (!check_alloc_btres_lock(btv, fh, RESOURCE_OVERLAY))
2748 fh->ov.tvnorm = btv->tvnorm;
2749 new = videobuf_sg_alloc(sizeof(*new));
2750 new->crop = btv->crop[!!fh->do_crop].rect;
2751 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2757 retval = bttv_switch_overlay(btv, fh, new);
2761 static int bttv_s_fbuf(struct file *file, void *f,
2762 struct v4l2_framebuffer *fb)
2764 struct bttv_fh *fh = f;
2765 struct bttv *btv = fh->btv;
2766 const struct bttv_format *fmt;
2769 if (!capable(CAP_SYS_ADMIN) &&
2770 !capable(CAP_SYS_RAWIO))
2774 fmt = format_by_fourcc(fb->fmt.pixelformat);
2777 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2781 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2782 __s32 width = fb->fmt.width;
2783 __s32 height = fb->fmt.height;
2785 retval = limit_scaled_size_lock(fh, &width, &height,
2786 V4L2_FIELD_INTERLACED,
2787 /* width_mask */ ~3,
2789 /* adjust_size */ 0,
2790 /* adjust_crop */ 0);
2796 btv->fbuf.base = fb->base;
2797 btv->fbuf.fmt.width = fb->fmt.width;
2798 btv->fbuf.fmt.height = fb->fmt.height;
2799 if (0 != fb->fmt.bytesperline)
2800 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2802 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2806 btv->init.ovfmt = fmt;
2807 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2810 fh->ov.w.width = fb->fmt.width;
2811 fh->ov.w.height = fb->fmt.height;
2812 btv->init.ov.w.width = fb->fmt.width;
2813 btv->init.ov.w.height = fb->fmt.height;
2814 kfree(fh->ov.clips);
2815 fh->ov.clips = NULL;
2818 if (check_btres(fh, RESOURCE_OVERLAY)) {
2819 struct bttv_buffer *new;
2821 new = videobuf_sg_alloc(sizeof(*new));
2822 new->crop = btv->crop[!!fh->do_crop].rect;
2823 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2824 retval = bttv_switch_overlay(btv, fh, new);
2830 static int bttv_reqbufs(struct file *file, void *priv,
2831 struct v4l2_requestbuffers *p)
2833 struct bttv_fh *fh = priv;
2834 return videobuf_reqbufs(bttv_queue(fh), p);
2837 static int bttv_querybuf(struct file *file, void *priv,
2838 struct v4l2_buffer *b)
2840 struct bttv_fh *fh = priv;
2841 return videobuf_querybuf(bttv_queue(fh), b);
2844 static int bttv_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2846 struct bttv_fh *fh = priv;
2847 struct bttv *btv = fh->btv;
2848 int res = bttv_resource(fh);
2850 if (!check_alloc_btres_lock(btv, fh, res))
2853 return videobuf_qbuf(bttv_queue(fh), b);
2856 static int bttv_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2858 struct bttv_fh *fh = priv;
2859 return videobuf_dqbuf(bttv_queue(fh), b,
2860 file->f_flags & O_NONBLOCK);
2863 static int bttv_streamon(struct file *file, void *priv,
2864 enum v4l2_buf_type type)
2866 struct bttv_fh *fh = priv;
2867 struct bttv *btv = fh->btv;
2868 int res = bttv_resource(fh);
2870 if (!check_alloc_btres_lock(btv, fh, res))
2872 return videobuf_streamon(bttv_queue(fh));
2876 static int bttv_streamoff(struct file *file, void *priv,
2877 enum v4l2_buf_type type)
2879 struct bttv_fh *fh = priv;
2880 struct bttv *btv = fh->btv;
2882 int res = bttv_resource(fh);
2885 retval = videobuf_streamoff(bttv_queue(fh));
2888 free_btres_lock(btv, fh, res);
2892 static int bttv_queryctrl(struct file *file, void *priv,
2893 struct v4l2_queryctrl *c)
2895 struct bttv_fh *fh = priv;
2896 struct bttv *btv = fh->btv;
2897 const struct v4l2_queryctrl *ctrl;
2899 if ((c->id < V4L2_CID_BASE ||
2900 c->id >= V4L2_CID_LASTP1) &&
2901 (c->id < V4L2_CID_PRIVATE_BASE ||
2902 c->id >= V4L2_CID_PRIVATE_LASTP1))
2905 if (!btv->volume_gpio && (c->id == V4L2_CID_AUDIO_VOLUME))
2908 ctrl = ctrl_by_id(c->id);
2910 *c = (NULL != ctrl) ? *ctrl : no_ctl;
2916 static int bttv_g_parm(struct file *file, void *f,
2917 struct v4l2_streamparm *parm)
2919 struct bttv_fh *fh = f;
2920 struct bttv *btv = fh->btv;
2922 v4l2_video_std_frame_period(bttv_tvnorms[btv->tvnorm].v4l2_id,
2923 &parm->parm.capture.timeperframe);
2928 static int bttv_g_tuner(struct file *file, void *priv,
2929 struct v4l2_tuner *t)
2931 struct bttv_fh *fh = priv;
2932 struct bttv *btv = fh->btv;
2934 if (btv->tuner_type == TUNER_ABSENT)
2939 t->rxsubchans = V4L2_TUNER_SUB_MONO;
2940 bttv_call_all(btv, tuner, g_tuner, t);
2941 strcpy(t->name, "Television");
2942 t->capability = V4L2_TUNER_CAP_NORM;
2943 t->type = V4L2_TUNER_ANALOG_TV;
2944 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
2947 if (btv->audio_mode_gpio)
2948 btv->audio_mode_gpio(btv, t, 0);
2953 static int bttv_g_priority(struct file *file, void *f, enum v4l2_priority *p)
2955 struct bttv_fh *fh = f;
2956 struct bttv *btv = fh->btv;
2958 *p = v4l2_prio_max(&btv->prio);
2963 static int bttv_s_priority(struct file *file, void *f,
2964 enum v4l2_priority prio)
2966 struct bttv_fh *fh = f;
2967 struct bttv *btv = fh->btv;
2970 rc = v4l2_prio_change(&btv->prio, &fh->prio, prio);
2975 static int bttv_cropcap(struct file *file, void *priv,
2976 struct v4l2_cropcap *cap)
2978 struct bttv_fh *fh = priv;
2979 struct bttv *btv = fh->btv;
2981 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2982 cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2985 *cap = bttv_tvnorms[btv->tvnorm].cropcap;
2990 static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
2992 struct bttv_fh *fh = f;
2993 struct bttv *btv = fh->btv;
2995 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2996 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2999 /* No fh->do_crop = 1; because btv->crop[1] may be
3000 inconsistent with fh->width or fh->height and apps
3001 do not expect a change here. */
3003 crop->c = btv->crop[!!fh->do_crop].rect;
3008 static int bttv_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
3010 struct bttv_fh *fh = f;
3011 struct bttv *btv = fh->btv;
3012 const struct v4l2_rect *b;
3020 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
3021 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
3024 /* Make sure tvnorm, vbi_end and the current cropping
3025 parameters remain consistent until we're done. Note
3026 read() may change vbi_end in check_alloc_btres_lock(). */
3027 retval = v4l2_prio_check(&btv->prio, fh->prio);
3034 if (locked_btres(fh->btv, VIDEO_RESOURCES)) {
3038 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
3041 b_right = b_left + b->width;
3042 b_bottom = b->top + b->height;
3044 b_top = max(b->top, btv->vbi_end);
3045 if (b_top + 32 >= b_bottom) {
3049 /* Min. scaled size 48 x 32. */
3050 c.rect.left = clamp(crop->c.left, b_left, b_right - 48);
3051 c.rect.left = min(c.rect.left, (__s32) MAX_HDELAY);
3053 c.rect.width = clamp(crop->c.width,
3054 48, b_right - c.rect.left);
3056 c.rect.top = clamp(crop->c.top, b_top, b_bottom - 32);
3057 /* Top and height must be a multiple of two. */
3058 c.rect.top = (c.rect.top + 1) & ~1;
3060 c.rect.height = clamp(crop->c.height,
3061 32, b_bottom - c.rect.top);
3062 c.rect.height = (c.rect.height + 1) & ~1;
3064 bttv_crop_calc_limits(&c);
3070 if (fh->width < c.min_scaled_width) {
3071 fh->width = c.min_scaled_width;
3072 btv->init.width = c.min_scaled_width;
3073 } else if (fh->width > c.max_scaled_width) {
3074 fh->width = c.max_scaled_width;
3075 btv->init.width = c.max_scaled_width;
3078 if (fh->height < c.min_scaled_height) {
3079 fh->height = c.min_scaled_height;
3080 btv->init.height = c.min_scaled_height;
3081 } else if (fh->height > c.max_scaled_height) {
3082 fh->height = c.max_scaled_height;
3083 btv->init.height = c.max_scaled_height;
3089 static int bttv_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
3091 if (unlikely(a->index))
3094 strcpy(a->name, "audio");
3098 static int bttv_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
3100 if (unlikely(a->index))
3106 static ssize_t bttv_read(struct file *file, char __user *data,
3107 size_t count, loff_t *ppos)
3109 struct bttv_fh *fh = file->private_data;
3112 if (fh->btv->errors)
3113 bttv_reinit_bt848(fh->btv);
3114 dprintk("%d: read count=%d type=%s\n",
3115 fh->btv->c.nr, (int)count, v4l2_type_names[fh->type]);
3118 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3119 if (!check_alloc_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ)) {
3120 /* VIDEO_READ in use by another fh,
3121 or VIDEO_STREAM by any fh. */
3124 retval = videobuf_read_one(&fh->cap, data, count, ppos,
3125 file->f_flags & O_NONBLOCK);
3126 free_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ);
3128 case V4L2_BUF_TYPE_VBI_CAPTURE:
3129 if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
3131 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
3132 file->f_flags & O_NONBLOCK);
3140 static unsigned int bttv_poll(struct file *file, poll_table *wait)
3142 struct bttv_fh *fh = file->private_data;
3143 struct bttv_buffer *buf;
3144 enum v4l2_field field;
3145 unsigned int rc = POLLERR;
3147 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
3148 if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
3150 return videobuf_poll_stream(file, &fh->vbi, wait);
3153 if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
3154 /* streaming capture */
3155 if (list_empty(&fh->cap.stream))
3157 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
3159 /* read() capture */
3160 if (NULL == fh->cap.read_buf) {
3161 /* need to capture a new frame */
3162 if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM))
3164 fh->cap.read_buf = videobuf_sg_alloc(fh->cap.msize);
3165 if (NULL == fh->cap.read_buf)
3167 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
3168 field = videobuf_next_field(&fh->cap);
3169 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
3170 kfree (fh->cap.read_buf);
3171 fh->cap.read_buf = NULL;
3174 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
3175 fh->cap.read_off = 0;
3177 buf = (struct bttv_buffer*)fh->cap.read_buf;
3180 poll_wait(file, &buf->vb.done, wait);
3181 if (buf->vb.state == VIDEOBUF_DONE ||
3182 buf->vb.state == VIDEOBUF_ERROR)
3183 rc = POLLIN|POLLRDNORM;
3190 static int bttv_open(struct file *file)
3192 struct video_device *vdev = video_devdata(file);
3193 struct bttv *btv = video_drvdata(file);
3195 enum v4l2_buf_type type = 0;
3197 dprintk("open dev=%s\n", video_device_node_name(vdev));
3199 if (vdev->vfl_type == VFL_TYPE_GRABBER) {
3200 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3201 } else if (vdev->vfl_type == VFL_TYPE_VBI) {
3202 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3208 dprintk("%d: open called (type=%s)\n",
3209 btv->c.nr, v4l2_type_names[type]);
3211 /* allocate per filehandle data */
3212 fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3215 file->private_data = fh;
3220 fh->ov.setup_ok = 0;
3222 v4l2_prio_open(&btv->prio, &fh->prio);
3224 videobuf_queue_sg_init(&fh->cap, &bttv_video_qops,
3225 &btv->c.pci->dev, &btv->s_lock,
3226 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3227 V4L2_FIELD_INTERLACED,
3228 sizeof(struct bttv_buffer),
3230 videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops,
3231 &btv->c.pci->dev, &btv->s_lock,
3232 V4L2_BUF_TYPE_VBI_CAPTURE,
3234 sizeof(struct bttv_buffer),
3236 set_tvnorm(btv,btv->tvnorm);
3237 set_input(btv, btv->input, btv->tvnorm);
3241 /* The V4L2 spec requires one global set of cropping parameters
3242 which only change on request. These are stored in btv->crop[1].
3243 However for compatibility with V4L apps and cropping unaware
3244 V4L2 apps we now reset the cropping parameters as seen through
3245 this fh, which is to say VIDIOC_G_CROP and scaling limit checks
3246 will use btv->crop[0], the default cropping parameters for the
3247 current video standard, and VIDIOC_S_FMT will not implicitely
3248 change the cropping parameters until VIDIOC_S_CROP has been
3250 fh->do_crop = !reset_crop; /* module parameter */
3252 /* Likewise there should be one global set of VBI capture
3253 parameters, but for compatibility with V4L apps and earlier
3254 driver versions each fh has its own parameters. */
3255 bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
3257 bttv_field_count(btv);
3261 static int bttv_release(struct file *file)
3263 struct bttv_fh *fh = file->private_data;
3264 struct bttv *btv = fh->btv;
3266 /* turn off overlay */
3267 if (check_btres(fh, RESOURCE_OVERLAY))
3268 bttv_switch_overlay(btv,fh,NULL);
3270 /* stop video capture */
3271 if (check_btres(fh, RESOURCE_VIDEO_STREAM)) {
3272 videobuf_streamoff(&fh->cap);
3273 free_btres_lock(btv,fh,RESOURCE_VIDEO_STREAM);
3275 if (fh->cap.read_buf) {
3276 buffer_release(&fh->cap,fh->cap.read_buf);
3277 kfree(fh->cap.read_buf);
3279 if (check_btres(fh, RESOURCE_VIDEO_READ)) {
3280 free_btres_lock(btv, fh, RESOURCE_VIDEO_READ);
3283 /* stop vbi capture */
3284 if (check_btres(fh, RESOURCE_VBI)) {
3285 videobuf_stop(&fh->vbi);
3286 free_btres_lock(btv,fh,RESOURCE_VBI);
3291 videobuf_mmap_free(&fh->cap);
3292 videobuf_mmap_free(&fh->vbi);
3293 v4l2_prio_close(&btv->prio, fh->prio);
3294 file->private_data = NULL;
3298 bttv_field_count(btv);
3307 bttv_mmap(struct file *file, struct vm_area_struct *vma)
3309 struct bttv_fh *fh = file->private_data;
3311 dprintk("%d: mmap type=%s 0x%lx+%ld\n",
3312 fh->btv->c.nr, v4l2_type_names[fh->type],
3313 vma->vm_start, vma->vm_end - vma->vm_start);
3314 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3317 static const struct v4l2_file_operations bttv_fops =
3319 .owner = THIS_MODULE,
3321 .release = bttv_release,
3322 .unlocked_ioctl = video_ioctl2,
3328 static const struct v4l2_ioctl_ops bttv_ioctl_ops = {
3329 .vidioc_querycap = bttv_querycap,
3330 .vidioc_enum_fmt_vid_cap = bttv_enum_fmt_vid_cap,
3331 .vidioc_g_fmt_vid_cap = bttv_g_fmt_vid_cap,
3332 .vidioc_try_fmt_vid_cap = bttv_try_fmt_vid_cap,
3333 .vidioc_s_fmt_vid_cap = bttv_s_fmt_vid_cap,
3334 .vidioc_enum_fmt_vid_overlay = bttv_enum_fmt_vid_overlay,
3335 .vidioc_g_fmt_vid_overlay = bttv_g_fmt_vid_overlay,
3336 .vidioc_try_fmt_vid_overlay = bttv_try_fmt_vid_overlay,
3337 .vidioc_s_fmt_vid_overlay = bttv_s_fmt_vid_overlay,
3338 .vidioc_g_fmt_vbi_cap = bttv_g_fmt_vbi_cap,
3339 .vidioc_try_fmt_vbi_cap = bttv_try_fmt_vbi_cap,
3340 .vidioc_s_fmt_vbi_cap = bttv_s_fmt_vbi_cap,
3341 .vidioc_g_audio = bttv_g_audio,
3342 .vidioc_s_audio = bttv_s_audio,
3343 .vidioc_cropcap = bttv_cropcap,
3344 .vidioc_reqbufs = bttv_reqbufs,
3345 .vidioc_querybuf = bttv_querybuf,
3346 .vidioc_qbuf = bttv_qbuf,
3347 .vidioc_dqbuf = bttv_dqbuf,
3348 .vidioc_s_std = bttv_s_std,
3349 .vidioc_enum_input = bttv_enum_input,
3350 .vidioc_g_input = bttv_g_input,
3351 .vidioc_s_input = bttv_s_input,
3352 .vidioc_queryctrl = bttv_queryctrl,
3353 .vidioc_g_ctrl = bttv_g_ctrl,
3354 .vidioc_s_ctrl = bttv_s_ctrl,
3355 .vidioc_streamon = bttv_streamon,
3356 .vidioc_streamoff = bttv_streamoff,
3357 .vidioc_g_tuner = bttv_g_tuner,
3358 .vidioc_s_tuner = bttv_s_tuner,
3359 .vidioc_g_crop = bttv_g_crop,
3360 .vidioc_s_crop = bttv_s_crop,
3361 .vidioc_g_fbuf = bttv_g_fbuf,
3362 .vidioc_s_fbuf = bttv_s_fbuf,
3363 .vidioc_overlay = bttv_overlay,
3364 .vidioc_g_priority = bttv_g_priority,
3365 .vidioc_s_priority = bttv_s_priority,
3366 .vidioc_g_parm = bttv_g_parm,
3367 .vidioc_g_frequency = bttv_g_frequency,
3368 .vidioc_s_frequency = bttv_s_frequency,
3369 .vidioc_log_status = bttv_log_status,
3370 .vidioc_querystd = bttv_querystd,
3371 #ifdef CONFIG_VIDEO_ADV_DEBUG
3372 .vidioc_g_register = bttv_g_register,
3373 .vidioc_s_register = bttv_s_register,
3377 static struct video_device bttv_video_template = {
3379 .ioctl_ops = &bttv_ioctl_ops,
3380 .tvnorms = BTTV_NORMS,
3381 .current_norm = V4L2_STD_PAL,
3384 /* ----------------------------------------------------------------------- */
3385 /* radio interface */
3387 static int radio_open(struct file *file)
3389 struct video_device *vdev = video_devdata(file);
3390 struct bttv *btv = video_drvdata(file);
3393 dprintk("open dev=%s\n", video_device_node_name(vdev));
3395 dprintk("%d: open called (radio)\n", btv->c.nr);
3397 /* allocate per filehandle data */
3398 fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3401 file->private_data = fh;
3404 v4l2_prio_open(&btv->prio, &fh->prio);
3408 bttv_call_all(btv, tuner, s_radio);
3409 audio_input(btv,TVAUDIO_INPUT_RADIO);
3414 static int radio_release(struct file *file)
3416 struct bttv_fh *fh = file->private_data;
3417 struct bttv *btv = fh->btv;
3418 struct saa6588_command cmd;
3420 v4l2_prio_close(&btv->prio, fh->prio);
3421 file->private_data = NULL;
3426 bttv_call_all(btv, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
3431 static int radio_querycap(struct file *file, void *priv,
3432 struct v4l2_capability *cap)
3434 struct bttv_fh *fh = priv;
3435 struct bttv *btv = fh->btv;
3437 strcpy(cap->driver, "bttv");
3438 strlcpy(cap->card, btv->radio_dev->name, sizeof(cap->card));
3439 sprintf(cap->bus_info, "PCI:%s", pci_name(btv->c.pci));
3440 cap->capabilities = V4L2_CAP_TUNER;
3445 static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
3447 struct bttv_fh *fh = priv;
3448 struct bttv *btv = fh->btv;
3450 if (btv->tuner_type == TUNER_ABSENT)
3454 strcpy(t->name, "Radio");
3455 t->type = V4L2_TUNER_RADIO;
3457 bttv_call_all(btv, tuner, g_tuner, t);
3459 if (btv->audio_mode_gpio)
3460 btv->audio_mode_gpio(btv, t, 0);
3465 static int radio_enum_input(struct file *file, void *priv,
3466 struct v4l2_input *i)
3471 strcpy(i->name, "Radio");
3472 i->type = V4L2_INPUT_TYPE_TUNER;
3477 static int radio_g_audio(struct file *file, void *priv,
3478 struct v4l2_audio *a)
3480 if (unlikely(a->index))
3483 strcpy(a->name, "Radio");
3488 static int radio_s_tuner(struct file *file, void *priv,
3489 struct v4l2_tuner *t)
3491 struct bttv_fh *fh = priv;
3492 struct bttv *btv = fh->btv;
3497 bttv_call_all(btv, tuner, s_tuner, t);
3501 static int radio_s_audio(struct file *file, void *priv,
3502 struct v4l2_audio *a)
3504 if (unlikely(a->index))
3510 static int radio_s_input(struct file *filp, void *priv, unsigned int i)
3518 static int radio_s_std(struct file *file, void *fh, v4l2_std_id *norm)
3523 static int radio_queryctrl(struct file *file, void *priv,
3524 struct v4l2_queryctrl *c)
3526 const struct v4l2_queryctrl *ctrl;
3528 if (c->id < V4L2_CID_BASE ||
3529 c->id >= V4L2_CID_LASTP1)
3532 if (c->id == V4L2_CID_AUDIO_MUTE) {
3533 ctrl = ctrl_by_id(c->id);
3541 static int radio_g_input(struct file *filp, void *priv, unsigned int *i)
3547 static ssize_t radio_read(struct file *file, char __user *data,
3548 size_t count, loff_t *ppos)
3550 struct bttv_fh *fh = file->private_data;
3551 struct bttv *btv = fh->btv;
3552 struct saa6588_command cmd;
3553 cmd.block_count = count/3;
3555 cmd.instance = file;
3556 cmd.result = -ENODEV;
3558 bttv_call_all(btv, core, ioctl, SAA6588_CMD_READ, &cmd);
3563 static unsigned int radio_poll(struct file *file, poll_table *wait)
3565 struct bttv_fh *fh = file->private_data;
3566 struct bttv *btv = fh->btv;
3567 struct saa6588_command cmd;
3568 cmd.instance = file;
3569 cmd.event_list = wait;
3570 cmd.result = -ENODEV;
3571 bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd);
3576 static const struct v4l2_file_operations radio_fops =
3578 .owner = THIS_MODULE,
3581 .release = radio_release,
3582 .unlocked_ioctl = video_ioctl2,
3586 static const struct v4l2_ioctl_ops radio_ioctl_ops = {
3587 .vidioc_querycap = radio_querycap,
3588 .vidioc_g_tuner = radio_g_tuner,
3589 .vidioc_enum_input = radio_enum_input,
3590 .vidioc_g_audio = radio_g_audio,
3591 .vidioc_s_tuner = radio_s_tuner,
3592 .vidioc_s_audio = radio_s_audio,
3593 .vidioc_s_input = radio_s_input,
3594 .vidioc_s_std = radio_s_std,
3595 .vidioc_queryctrl = radio_queryctrl,
3596 .vidioc_g_input = radio_g_input,
3597 .vidioc_g_ctrl = bttv_g_ctrl,
3598 .vidioc_s_ctrl = bttv_s_ctrl,
3599 .vidioc_g_frequency = bttv_g_frequency,
3600 .vidioc_s_frequency = bttv_s_frequency,
3603 static struct video_device radio_template = {
3604 .fops = &radio_fops,
3605 .ioctl_ops = &radio_ioctl_ops,
3608 /* ----------------------------------------------------------------------- */
3609 /* some debug code */
3611 static int bttv_risc_decode(u32 risc)
3613 static char *instr[16] = {
3614 [ BT848_RISC_WRITE >> 28 ] = "write",
3615 [ BT848_RISC_SKIP >> 28 ] = "skip",
3616 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3617 [ BT848_RISC_JUMP >> 28 ] = "jump",
3618 [ BT848_RISC_SYNC >> 28 ] = "sync",
3619 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3620 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3621 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3623 static int incr[16] = {
3624 [ BT848_RISC_WRITE >> 28 ] = 2,
3625 [ BT848_RISC_JUMP >> 28 ] = 2,
3626 [ BT848_RISC_SYNC >> 28 ] = 2,
3627 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3628 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3629 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3631 static char *bits[] = {
3632 "be0", "be1", "be2", "be3/resync",
3633 "set0", "set1", "set2", "set3",
3634 "clr0", "clr1", "clr2", "clr3",
3635 "irq", "res", "eol", "sol",
3639 pr_cont("0x%08x [ %s", risc,
3640 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3641 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3642 if (risc & (1 << (i + 12)))
3643 pr_cont(" %s", bits[i]);
3644 pr_cont(" count=%d ]\n", risc & 0xfff);
3645 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3648 static void bttv_risc_disasm(struct bttv *btv,
3649 struct btcx_riscmem *risc)
3653 pr_info("%s: risc disasm: %p [dma=0x%08lx]\n",
3654 btv->c.v4l2_dev.name, risc->cpu, (unsigned long)risc->dma);
3655 for (i = 0; i < (risc->size >> 2); i += n) {
3656 pr_info("%s: 0x%lx: ",
3657 btv->c.v4l2_dev.name,
3658 (unsigned long)(risc->dma + (i<<2)));
3659 n = bttv_risc_decode(le32_to_cpu(risc->cpu[i]));
3660 for (j = 1; j < n; j++)
3661 pr_info("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3662 btv->c.v4l2_dev.name,
3663 (unsigned long)(risc->dma + ((i+j)<<2)),
3665 if (0 == risc->cpu[i])
3670 static void bttv_print_riscaddr(struct bttv *btv)
3672 pr_info(" main: %08llx\n", (unsigned long long)btv->main.dma);
3673 pr_info(" vbi : o=%08llx e=%08llx\n",
3674 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3675 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3676 pr_info(" cap : o=%08llx e=%08llx\n",
3678 ? (unsigned long long)btv->curr.top->top.dma : 0,
3680 ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3681 pr_info(" scr : o=%08llx e=%08llx\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 pr_cont(" %s", irq_name[i]);
3720 if (mark & (1 << i))
3725 static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3727 pr_warn("%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 pr_notice("%d: Oh, there (temporarily?) is no input signal. "
3736 "Ok, then this is harmless, don't worry ;)\n",
3740 pr_notice("%d: Uhm. Looks like we have unusual high IRQ latencies\n",
3742 pr_notice("%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("%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 pr_debug("%d: wakeup: both=%p\n",
3842 btv->c.nr, wakeup->top);
3843 wakeup->top->vb.ts = ts;
3844 wakeup->top->vb.field_count = btv->field_count;
3845 wakeup->top->vb.state = state;
3846 wake_up(&wakeup->top->vb.done);
3849 if (NULL != wakeup->top && curr->top != wakeup->top) {
3851 pr_debug("%d: wakeup: top=%p\n",
3852 btv->c.nr, wakeup->top);
3853 wakeup->top->vb.ts = ts;
3854 wakeup->top->vb.field_count = btv->field_count;
3855 wakeup->top->vb.state = state;
3856 wake_up(&wakeup->top->vb.done);
3858 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3860 pr_debug("%d: wakeup: bottom=%p\n",
3861 btv->c.nr, wakeup->bottom);
3862 wakeup->bottom->vb.ts = ts;
3863 wakeup->bottom->vb.field_count = btv->field_count;
3864 wakeup->bottom->vb.state = state;
3865 wake_up(&wakeup->bottom->vb.done);
3871 bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3879 do_gettimeofday(&ts);
3881 wakeup->vb.field_count = btv->field_count;
3882 wakeup->vb.state = state;
3883 wake_up(&wakeup->vb.done);
3886 static void bttv_irq_timeout(unsigned long data)
3888 struct bttv *btv = (struct bttv *)data;
3889 struct bttv_buffer_set old,new;
3890 struct bttv_buffer *ovbi;
3891 struct bttv_buffer *item;
3892 unsigned long flags;
3895 pr_info("%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3896 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3897 btread(BT848_RISC_COUNT));
3898 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3902 spin_lock_irqsave(&btv->s_lock,flags);
3904 /* deactivate stuff */
3905 memset(&new,0,sizeof(new));
3911 bttv_buffer_activate_video(btv, &new);
3912 bttv_buffer_activate_vbi(btv, NULL);
3913 bttv_set_dma(btv, 0);
3916 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_ERROR);
3917 bttv_irq_wakeup_vbi(btv, ovbi, VIDEOBUF_ERROR);
3919 /* cancel all outstanding capture / vbi requests */
3920 while (!list_empty(&btv->capture)) {
3921 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3922 list_del(&item->vb.queue);
3923 item->vb.state = VIDEOBUF_ERROR;
3924 wake_up(&item->vb.done);
3926 while (!list_empty(&btv->vcapture)) {
3927 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3928 list_del(&item->vb.queue);
3929 item->vb.state = VIDEOBUF_ERROR;
3930 wake_up(&item->vb.done);
3934 spin_unlock_irqrestore(&btv->s_lock,flags);
3938 bttv_irq_wakeup_top(struct bttv *btv)
3940 struct bttv_buffer *wakeup = btv->curr.top;
3945 spin_lock(&btv->s_lock);
3946 btv->curr.top_irq = 0;
3947 btv->curr.top = NULL;
3948 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3950 do_gettimeofday(&wakeup->vb.ts);
3951 wakeup->vb.field_count = btv->field_count;
3952 wakeup->vb.state = VIDEOBUF_DONE;
3953 wake_up(&wakeup->vb.done);
3954 spin_unlock(&btv->s_lock);
3957 static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3961 if (rc > risc->dma + risc->size)
3967 bttv_irq_switch_video(struct bttv *btv)
3969 struct bttv_buffer_set new;
3970 struct bttv_buffer_set old;
3973 spin_lock(&btv->s_lock);
3975 /* new buffer set */
3976 bttv_irq_next_video(btv, &new);
3977 rc = btread(BT848_RISC_COUNT);
3978 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3979 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3982 bttv_irq_debug_low_latency(btv, rc);
3983 spin_unlock(&btv->s_lock);
3990 btv->loop_irq &= ~1;
3991 bttv_buffer_activate_video(btv, &new);
3992 bttv_set_dma(btv, 0);
3995 if (UNSET != btv->new_input) {
3996 video_mux(btv,btv->new_input);
3997 btv->new_input = UNSET;
4000 /* wake up finished buffers */
4001 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_DONE);
4002 spin_unlock(&btv->s_lock);
4006 bttv_irq_switch_vbi(struct bttv *btv)
4008 struct bttv_buffer *new = NULL;
4009 struct bttv_buffer *old;
4012 spin_lock(&btv->s_lock);
4014 if (!list_empty(&btv->vcapture))
4015 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
4018 rc = btread(BT848_RISC_COUNT);
4019 if (NULL != old && (is_active(&old->top, rc) ||
4020 is_active(&old->bottom, rc))) {
4023 bttv_irq_debug_low_latency(btv, rc);
4024 spin_unlock(&btv->s_lock);
4030 btv->loop_irq &= ~4;
4031 bttv_buffer_activate_vbi(btv, new);
4032 bttv_set_dma(btv, 0);
4034 bttv_irq_wakeup_vbi(btv, old, VIDEOBUF_DONE);
4035 spin_unlock(&btv->s_lock);
4038 static irqreturn_t bttv_irq(int irq, void *dev_id)
4046 btv=(struct bttv *)dev_id;
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 pr_debug("%d: irq loop=%d fc=%d riscs=%x, riscc=%08x, ",
4063 btv->c.nr, count, btv->field_count,
4064 stat>>28, btread(BT848_RISC_COUNT));
4065 bttv_print_irqbits(stat,astat);
4066 if (stat & BT848_INT_HLOCK)
4067 pr_cont(" HLOC => %s",
4068 dstat & BT848_DSTATUS_HLOC
4070 if (stat & BT848_INT_VPRES)
4071 pr_cont(" PRES => %s",
4072 dstat & BT848_DSTATUS_PRES
4074 if (stat & BT848_INT_FMTCHG)
4075 pr_cont(" NUML => %s",
4076 dstat & BT848_DSTATUS_NUML
4081 if (astat&BT848_INT_VSYNC)
4084 if ((astat & BT848_INT_GPINT) && btv->remote) {
4085 bttv_input_irq(btv);
4088 if (astat & BT848_INT_I2CDONE) {
4089 btv->i2c_done = stat;
4090 wake_up(&btv->i2c_queue);
4093 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
4094 bttv_irq_switch_vbi(btv);
4096 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
4097 bttv_irq_wakeup_top(btv);
4099 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
4100 bttv_irq_switch_video(btv);
4102 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
4103 audio_mute(btv, btv->mute); /* trigger automute */
4105 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
4106 pr_info("%d: %s%s @ %08x,",
4108 (astat & BT848_INT_SCERR) ? "SCERR" : "",
4109 (astat & BT848_INT_OCERR) ? "OCERR" : "",
4110 btread(BT848_RISC_COUNT));
4111 bttv_print_irqbits(stat,astat);
4114 bttv_print_riscaddr(btv);
4116 if (fdsr && astat & BT848_INT_FDSR) {
4117 pr_info("%d: FDSR @ %08x\n",
4118 btv->c.nr, btread(BT848_RISC_COUNT));
4120 bttv_print_riscaddr(btv);
4126 if (count > 8 || !(astat & BT848_INT_GPINT)) {
4127 btwrite(0, BT848_INT_MASK);
4129 pr_err("%d: IRQ lockup, cleared int mask [",
4132 pr_err("%d: IRQ lockup, clearing GPINT from int mask [",
4135 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
4139 bttv_print_irqbits(stat,astat);
4147 return IRQ_RETVAL(handled);
4151 /* ----------------------------------------------------------------------- */
4152 /* initialitation */
4154 static struct video_device *vdev_init(struct bttv *btv,
4155 const struct video_device *template,
4156 const char *type_name)
4158 struct video_device *vfd;
4160 vfd = video_device_alloc();
4164 vfd->v4l2_dev = &btv->c.v4l2_dev;
4165 vfd->release = video_device_release;
4166 vfd->debug = bttv_debug;
4167 video_set_drvdata(vfd, btv);
4168 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
4169 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
4170 type_name, bttv_tvcards[btv->c.type].name);
4174 static void bttv_unregister_video(struct bttv *btv)
4176 if (btv->video_dev) {
4177 if (video_is_registered(btv->video_dev))
4178 video_unregister_device(btv->video_dev);
4180 video_device_release(btv->video_dev);
4181 btv->video_dev = NULL;
4184 if (video_is_registered(btv->vbi_dev))
4185 video_unregister_device(btv->vbi_dev);
4187 video_device_release(btv->vbi_dev);
4188 btv->vbi_dev = NULL;
4190 if (btv->radio_dev) {
4191 if (video_is_registered(btv->radio_dev))
4192 video_unregister_device(btv->radio_dev);
4194 video_device_release(btv->radio_dev);
4195 btv->radio_dev = NULL;
4199 /* register video4linux devices */
4200 static int __devinit bttv_register_video(struct bttv *btv)
4203 pr_notice("Overlay support disabled\n");
4206 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
4208 if (NULL == btv->video_dev)
4210 if (video_register_device(btv->video_dev, VFL_TYPE_GRABBER,
4211 video_nr[btv->c.nr]) < 0)
4213 pr_info("%d: registered device %s\n",
4214 btv->c.nr, video_device_node_name(btv->video_dev));
4215 if (device_create_file(&btv->video_dev->dev,
4216 &dev_attr_card)<0) {
4217 pr_err("%d: device_create_file 'card' failed\n", btv->c.nr);
4222 btv->vbi_dev = vdev_init(btv, &bttv_video_template, "vbi");
4224 if (NULL == btv->vbi_dev)
4226 if (video_register_device(btv->vbi_dev, VFL_TYPE_VBI,
4227 vbi_nr[btv->c.nr]) < 0)
4229 pr_info("%d: registered device %s\n",
4230 btv->c.nr, video_device_node_name(btv->vbi_dev));
4232 if (!btv->has_radio)
4235 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
4236 if (NULL == btv->radio_dev)
4238 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,
4239 radio_nr[btv->c.nr]) < 0)
4241 pr_info("%d: registered device %s\n",
4242 btv->c.nr, video_device_node_name(btv->radio_dev));
4248 bttv_unregister_video(btv);
4253 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
4254 /* response on cards with no firmware is not enabled by OF */
4255 static void pci_set_command(struct pci_dev *dev)
4257 #if defined(__powerpc__)
4260 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
4261 cmd = (cmd | PCI_COMMAND_MEMORY );
4262 pci_write_config_dword(dev, PCI_COMMAND, cmd);
4266 static int __devinit bttv_probe(struct pci_dev *dev,
4267 const struct pci_device_id *pci_id)
4273 if (bttv_num == BTTV_MAX)
4275 pr_info("Bt8xx card found (%d)\n", bttv_num);
4276 bttvs[bttv_num] = btv = kzalloc(sizeof(*btv), GFP_KERNEL);
4278 pr_err("out of memory\n");
4281 btv->c.nr = bttv_num;
4282 snprintf(btv->c.v4l2_dev.name, sizeof(btv->c.v4l2_dev.name),
4283 "bttv%d", btv->c.nr);
4285 /* initialize structs / fill in defaults */
4286 mutex_init(&btv->lock);
4287 spin_lock_init(&btv->s_lock);
4288 spin_lock_init(&btv->gpio_lock);
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 pr_warn("%d: Can't enable device\n", btv->c.nr);
4311 if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
4312 pr_warn("%d: No suitable DMA available\n", btv->c.nr);
4315 if (!request_mem_region(pci_resource_start(dev,0),
4316 pci_resource_len(dev,0),
4317 btv->c.v4l2_dev.name)) {
4318 pr_warn("%d: can't request iomem (0x%llx)\n",
4320 (unsigned long long)pci_resource_start(dev, 0));
4323 pci_set_master(dev);
4324 pci_set_command(dev);
4326 result = v4l2_device_register(&dev->dev, &btv->c.v4l2_dev);
4328 pr_warn("%d: v4l2_device_register() failed\n", btv->c.nr);
4332 btv->revision = dev->revision;
4333 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
4334 pr_info("%d: Bt%d (rev %d) at %s, irq: %d, latency: %d, mmio: 0x%llx\n",
4335 bttv_num, btv->id, btv->revision, pci_name(dev),
4336 btv->c.pci->irq, lat,
4337 (unsigned long long)pci_resource_start(dev, 0));
4340 btv->bt848_mmio = ioremap(pci_resource_start(dev, 0), 0x1000);
4341 if (NULL == btv->bt848_mmio) {
4342 pr_err("%d: ioremap() failed\n", btv->c.nr);
4350 /* disable irqs, register irq handler */
4351 btwrite(0, BT848_INT_MASK);
4352 result = request_irq(btv->c.pci->irq, bttv_irq,
4353 IRQF_SHARED | IRQF_DISABLED, btv->c.v4l2_dev.name, (void *)btv);
4355 pr_err("%d: can't get IRQ %d\n",
4356 bttv_num, btv->c.pci->irq);
4360 if (0 != bttv_handle_chipset(btv)) {
4365 /* init options from insmod args */
4366 btv->opt_combfilter = combfilter;
4367 btv->opt_lumafilter = lumafilter;
4368 btv->opt_automute = automute;
4369 btv->opt_chroma_agc = chroma_agc;
4370 btv->opt_adc_crush = adc_crush;
4371 btv->opt_vcr_hack = vcr_hack;
4372 btv->opt_whitecrush_upper = whitecrush_upper;
4373 btv->opt_whitecrush_lower = whitecrush_lower;
4374 btv->opt_uv_ratio = uv_ratio;
4375 btv->opt_full_luma_range = full_luma_range;
4376 btv->opt_coring = coring;
4378 /* fill struct bttv with some useful defaults */
4379 btv->init.btv = btv;
4380 btv->init.ov.w.width = 320;
4381 btv->init.ov.w.height = 240;
4382 btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
4383 btv->init.width = 320;
4384 btv->init.height = 240;
4387 /* initialize hardware */
4389 bttv_gpio_tracking(btv,"pre-init");
4391 bttv_risc_init_main(btv);
4395 btwrite(0x00, BT848_GPIO_REG_INP);
4396 btwrite(0x00, BT848_GPIO_OUT_EN);
4398 bttv_gpio_tracking(btv,"init");
4400 /* needs to be done before i2c is registered */
4401 bttv_init_card1(btv);
4403 /* register i2c + gpio */
4406 /* some card-specific stuff (needs working i2c) */
4407 bttv_init_card2(btv);
4408 bttv_init_tuner(btv);
4411 /* register video4linux + input */
4412 if (!bttv_tvcards[btv->c.type].no_video) {
4413 bttv_register_video(btv);
4414 bt848_bright(btv,32768);
4415 bt848_contrast(btv,32768);
4416 bt848_hue(btv,32768);
4417 bt848_sat(btv,32768);
4419 set_input(btv, 0, btv->tvnorm);
4420 bttv_crop_reset(&btv->crop[0], btv->tvnorm);
4421 btv->crop[1] = btv->crop[0]; /* current = default */
4422 disclaim_vbi_lines(btv);
4423 disclaim_video_lines(btv);
4426 /* add subdevices and autoload dvb-bt8xx if needed */
4427 if (bttv_tvcards[btv->c.type].has_dvb) {
4428 bttv_sub_add_device(&btv->c, "dvb");
4429 request_modules(btv);
4433 init_bttv_i2c_ir(btv);
4434 bttv_input_init(btv);
4437 /* everything is fine */
4442 free_irq(btv->c.pci->irq,btv);
4445 v4l2_device_unregister(&btv->c.v4l2_dev);
4448 if (btv->bt848_mmio)
4449 iounmap(btv->bt848_mmio);
4450 release_mem_region(pci_resource_start(btv->c.pci,0),
4451 pci_resource_len(btv->c.pci,0));
4455 static void __devexit bttv_remove(struct pci_dev *pci_dev)
4457 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4458 struct bttv *btv = to_bttv(v4l2_dev);
4461 pr_info("%d: unloading\n", btv->c.nr);
4463 if (bttv_tvcards[btv->c.type].has_dvb)
4464 flush_request_modules(btv);
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 bttv_input_fini(btv);
4477 bttv_sub_del_devices(&btv->c);
4479 /* unregister i2c_bus + input */
4482 /* unregister video4linux */
4483 bttv_unregister_video(btv);
4485 /* free allocated memory */
4486 btcx_riscmem_free(btv->c.pci,&btv->main);
4488 /* free ressources */
4489 free_irq(btv->c.pci->irq,btv);
4490 iounmap(btv->bt848_mmio);
4491 release_mem_region(pci_resource_start(btv->c.pci,0),
4492 pci_resource_len(btv->c.pci,0));
4494 v4l2_device_unregister(&btv->c.v4l2_dev);
4495 bttvs[btv->c.nr] = NULL;
4502 static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4504 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4505 struct bttv *btv = to_bttv(v4l2_dev);
4506 struct bttv_buffer_set idle;
4507 unsigned long flags;
4509 dprintk("%d: suspend %d\n", btv->c.nr, state.event);
4511 /* stop dma + irqs */
4512 spin_lock_irqsave(&btv->s_lock,flags);
4513 memset(&idle, 0, sizeof(idle));
4514 btv->state.video = btv->curr;
4515 btv->state.vbi = btv->cvbi;
4516 btv->state.loop_irq = btv->loop_irq;
4519 bttv_buffer_activate_video(btv, &idle);
4520 bttv_buffer_activate_vbi(btv, NULL);
4521 bttv_set_dma(btv, 0);
4522 btwrite(0, BT848_INT_MASK);
4523 spin_unlock_irqrestore(&btv->s_lock,flags);
4525 /* save bt878 state */
4526 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4527 btv->state.gpio_data = gpio_read();
4529 /* save pci state */
4530 pci_save_state(pci_dev);
4531 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4532 pci_disable_device(pci_dev);
4533 btv->state.disabled = 1;
4538 static int bttv_resume(struct pci_dev *pci_dev)
4540 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4541 struct bttv *btv = to_bttv(v4l2_dev);
4542 unsigned long flags;
4545 dprintk("%d: resume\n", btv->c.nr);
4547 /* restore pci state */
4548 if (btv->state.disabled) {
4549 err=pci_enable_device(pci_dev);
4551 pr_warn("%d: Can't enable device\n", btv->c.nr);
4554 btv->state.disabled = 0;
4556 err=pci_set_power_state(pci_dev, PCI_D0);
4558 pci_disable_device(pci_dev);
4559 pr_warn("%d: Can't enable device\n", btv->c.nr);
4560 btv->state.disabled = 1;
4564 pci_restore_state(pci_dev);
4566 /* restore bt878 state */
4567 bttv_reinit_bt848(btv);
4568 gpio_inout(0xffffff, btv->state.gpio_enable);
4569 gpio_write(btv->state.gpio_data);
4572 spin_lock_irqsave(&btv->s_lock,flags);
4573 btv->curr = btv->state.video;
4574 btv->cvbi = btv->state.vbi;
4575 btv->loop_irq = btv->state.loop_irq;
4576 bttv_buffer_activate_video(btv, &btv->curr);
4577 bttv_buffer_activate_vbi(btv, btv->cvbi);
4578 bttv_set_dma(btv, 0);
4579 spin_unlock_irqrestore(&btv->s_lock,flags);
4584 static struct pci_device_id bttv_pci_tbl[] = {
4585 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT848), 0},
4586 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT849), 0},
4587 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT878), 0},
4588 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT879), 0},
4592 MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4594 static struct pci_driver bttv_pci_driver = {
4596 .id_table = bttv_pci_tbl,
4597 .probe = bttv_probe,
4598 .remove = __devexit_p(bttv_remove),
4600 .suspend = bttv_suspend,
4601 .resume = bttv_resume,
4605 static int __init bttv_init_module(void)
4611 pr_info("driver version %s loaded\n", BTTV_VERSION);
4612 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4614 if (gbufsize > BTTV_MAX_FBUF)
4615 gbufsize = BTTV_MAX_FBUF;
4616 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4618 pr_info("using %d buffers with %dk (%d pages) each for capture\n",
4619 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4621 bttv_check_chipset();
4623 ret = bus_register(&bttv_sub_bus_type);
4625 pr_warn("bus_register error: %d\n", ret);
4628 ret = pci_register_driver(&bttv_pci_driver);
4630 bus_unregister(&bttv_sub_bus_type);
4635 static void __exit bttv_cleanup_module(void)
4637 pci_unregister_driver(&bttv_pci_driver);
4638 bus_unregister(&bttv_sub_bus_type);
4641 module_init(bttv_init_module);
4642 module_exit(bttv_cleanup_module);