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>
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <linux/init.h>
28 #include <linux/module.h>
29 #include <linux/moduleparam.h>
30 #include <linux/delay.h>
31 #include <linux/errno.h>
33 #include <linux/kernel.h>
34 #include <linux/sched.h>
35 #include <linux/interrupt.h>
36 #include <linux/kdev_t.h>
38 #include <media/v4l2-common.h>
40 #include <linux/dma-mapping.h>
43 #include <asm/byteorder.h>
48 unsigned int bttv_num; /* number of Bt848s in use */
49 struct bttv bttvs[BTTV_MAX];
51 unsigned int bttv_debug;
52 unsigned int bttv_verbose = 1;
53 unsigned int bttv_gpio;
55 /* config variables */
57 static unsigned int bigendian=1;
59 static unsigned int bigendian;
61 static unsigned int radio[BTTV_MAX];
62 static unsigned int irq_debug;
63 static unsigned int gbuffers = 8;
64 static unsigned int gbufsize = 0x208000;
66 static int video_nr = -1;
67 static int radio_nr = -1;
68 static int vbi_nr = -1;
69 static int debug_latency;
71 static unsigned int fdsr;
74 static unsigned int combfilter;
75 static unsigned int lumafilter;
76 static unsigned int automute = 1;
77 static unsigned int chroma_agc;
78 static unsigned int adc_crush = 1;
79 static unsigned int whitecrush_upper = 0xCF;
80 static unsigned int whitecrush_lower = 0x7F;
81 static unsigned int vcr_hack;
82 static unsigned int irq_iswitch;
83 static unsigned int uv_ratio = 50;
84 static unsigned int full_luma_range;
85 static unsigned int coring;
86 extern int no_overlay;
88 /* API features (turn on/off stuff for testing) */
89 static unsigned int v4l2 = 1;
92 module_param(bttv_verbose, int, 0644);
93 module_param(bttv_gpio, int, 0644);
94 module_param(bttv_debug, int, 0644);
95 module_param(irq_debug, int, 0644);
96 module_param(debug_latency, int, 0644);
98 module_param(fdsr, int, 0444);
99 module_param(video_nr, int, 0444);
100 module_param(radio_nr, int, 0444);
101 module_param(vbi_nr, int, 0444);
102 module_param(gbuffers, int, 0444);
103 module_param(gbufsize, int, 0444);
105 module_param(v4l2, int, 0644);
106 module_param(bigendian, int, 0644);
107 module_param(irq_iswitch, int, 0644);
108 module_param(combfilter, int, 0444);
109 module_param(lumafilter, int, 0444);
110 module_param(automute, int, 0444);
111 module_param(chroma_agc, int, 0444);
112 module_param(adc_crush, int, 0444);
113 module_param(whitecrush_upper, int, 0444);
114 module_param(whitecrush_lower, int, 0444);
115 module_param(vcr_hack, int, 0444);
116 module_param(uv_ratio, int, 0444);
117 module_param(full_luma_range, int, 0444);
118 module_param(coring, int, 0444);
120 module_param_array(radio, int, NULL, 0444);
122 MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
123 MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
124 MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
125 MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
126 MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
127 MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
128 MODULE_PARM_DESC(gbuffers,"number of capture buffers. range 2-32, default 8");
129 MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
130 MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
131 MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
132 MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
133 MODULE_PARM_DESC(whitecrush_upper,"sets the white crush upper value, default is 207");
134 MODULE_PARM_DESC(whitecrush_lower,"sets the white crush lower value, default is 127");
135 MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
136 MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler");
137 MODULE_PARM_DESC(uv_ratio,"ratio between u and v gains, default is 50");
138 MODULE_PARM_DESC(full_luma_range,"use the full luma range, default is 0 (no)");
139 MODULE_PARM_DESC(coring,"set the luma coring level, default is 0 (no)");
141 MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
142 MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
143 MODULE_LICENSE("GPL");
145 /* ----------------------------------------------------------------------- */
148 static ssize_t show_card(struct class_device *cd, char *buf)
150 struct video_device *vfd = to_video_device(cd);
151 struct bttv *btv = dev_get_drvdata(vfd->dev);
152 return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
154 static CLASS_DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
156 /* ----------------------------------------------------------------------- */
159 /* special timing tables from conexant... */
160 static u8 SRAM_Table[][60] =
162 /* PAL digital input over GPIO[7:0] */
164 45, // 45 bytes following
165 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
166 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
167 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
168 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
169 0x37,0x00,0xAF,0x21,0x00
171 /* NTSC digital input over GPIO[7:0] */
173 51, // 51 bytes following
174 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
175 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
176 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
177 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
178 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
181 // TGB_NTSC392 // quartzsight
182 // This table has been modified to be used for Fusion Rev D
184 0x2A, // size of table = 42
185 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
186 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
187 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
188 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
193 const struct bttv_tvnorm bttv_tvnorms[] = {
195 /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
196 /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
198 .v4l2_id = V4L2_STD_PAL,
206 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
207 .scaledtwidth = 1135,
213 /* ITU-R frame line number of the first VBI line
214 we can capture, of the first and second field. */
215 .vbistart = { 7,320 },
217 .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
225 .iform = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
232 .vbistart = { 10, 273 },
234 .v4l2_id = V4L2_STD_SECAM,
242 .iform = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
243 .scaledtwidth = 1135,
248 .sram = 0, /* like PAL, correct? */
249 .vbistart = { 7, 320 },
251 .v4l2_id = V4L2_STD_PAL_Nc,
259 .iform = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
266 .vbistart = { 7, 320 },
268 .v4l2_id = V4L2_STD_PAL_M,
276 .iform = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
283 .vbistart = { 10, 273 },
285 .v4l2_id = V4L2_STD_PAL_N,
293 .iform = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
300 .vbistart = { 7, 320},
302 .v4l2_id = V4L2_STD_NTSC_M_JP,
310 .iform = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
317 .vbistart = {10, 273},
319 /* that one hopefully works with the strange timing
320 * which video recorders produce when playing a NTSC
321 * tape on a PAL TV ... */
322 .v4l2_id = V4L2_STD_PAL_60,
330 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
331 .scaledtwidth = 1135,
338 .vbistart = { 10, 273 },
341 static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
343 /* ----------------------------------------------------------------------- */
345 packed pixel formats must come first */
346 static const struct bttv_format bttv_formats[] = {
348 .name = "8 bpp, gray",
349 .palette = VIDEO_PALETTE_GREY,
350 .fourcc = V4L2_PIX_FMT_GREY,
351 .btformat = BT848_COLOR_FMT_Y8,
353 .flags = FORMAT_FLAGS_PACKED,
355 .name = "8 bpp, dithered color",
356 .palette = VIDEO_PALETTE_HI240,
357 .fourcc = V4L2_PIX_FMT_HI240,
358 .btformat = BT848_COLOR_FMT_RGB8,
360 .flags = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
362 .name = "15 bpp RGB, le",
363 .palette = VIDEO_PALETTE_RGB555,
364 .fourcc = V4L2_PIX_FMT_RGB555,
365 .btformat = BT848_COLOR_FMT_RGB15,
367 .flags = FORMAT_FLAGS_PACKED,
369 .name = "15 bpp RGB, be",
371 .fourcc = V4L2_PIX_FMT_RGB555X,
372 .btformat = BT848_COLOR_FMT_RGB15,
373 .btswap = 0x03, /* byteswap */
375 .flags = FORMAT_FLAGS_PACKED,
377 .name = "16 bpp RGB, le",
378 .palette = VIDEO_PALETTE_RGB565,
379 .fourcc = V4L2_PIX_FMT_RGB565,
380 .btformat = BT848_COLOR_FMT_RGB16,
382 .flags = FORMAT_FLAGS_PACKED,
384 .name = "16 bpp RGB, be",
386 .fourcc = V4L2_PIX_FMT_RGB565X,
387 .btformat = BT848_COLOR_FMT_RGB16,
388 .btswap = 0x03, /* byteswap */
390 .flags = FORMAT_FLAGS_PACKED,
392 .name = "24 bpp RGB, le",
393 .palette = VIDEO_PALETTE_RGB24,
394 .fourcc = V4L2_PIX_FMT_BGR24,
395 .btformat = BT848_COLOR_FMT_RGB24,
397 .flags = FORMAT_FLAGS_PACKED,
399 .name = "32 bpp RGB, le",
400 .palette = VIDEO_PALETTE_RGB32,
401 .fourcc = V4L2_PIX_FMT_BGR32,
402 .btformat = BT848_COLOR_FMT_RGB32,
404 .flags = FORMAT_FLAGS_PACKED,
406 .name = "32 bpp RGB, be",
408 .fourcc = V4L2_PIX_FMT_RGB32,
409 .btformat = BT848_COLOR_FMT_RGB32,
410 .btswap = 0x0f, /* byte+word swap */
412 .flags = FORMAT_FLAGS_PACKED,
414 .name = "4:2:2, packed, YUYV",
415 .palette = VIDEO_PALETTE_YUV422,
416 .fourcc = V4L2_PIX_FMT_YUYV,
417 .btformat = BT848_COLOR_FMT_YUY2,
419 .flags = FORMAT_FLAGS_PACKED,
421 .name = "4:2:2, packed, YUYV",
422 .palette = VIDEO_PALETTE_YUYV,
423 .fourcc = V4L2_PIX_FMT_YUYV,
424 .btformat = BT848_COLOR_FMT_YUY2,
426 .flags = FORMAT_FLAGS_PACKED,
428 .name = "4:2:2, packed, UYVY",
429 .palette = VIDEO_PALETTE_UYVY,
430 .fourcc = V4L2_PIX_FMT_UYVY,
431 .btformat = BT848_COLOR_FMT_YUY2,
432 .btswap = 0x03, /* byteswap */
434 .flags = FORMAT_FLAGS_PACKED,
436 .name = "4:2:2, planar, Y-Cb-Cr",
437 .palette = VIDEO_PALETTE_YUV422P,
438 .fourcc = V4L2_PIX_FMT_YUV422P,
439 .btformat = BT848_COLOR_FMT_YCrCb422,
441 .flags = FORMAT_FLAGS_PLANAR,
445 .name = "4:2:0, planar, Y-Cb-Cr",
446 .palette = VIDEO_PALETTE_YUV420P,
447 .fourcc = V4L2_PIX_FMT_YUV420,
448 .btformat = BT848_COLOR_FMT_YCrCb422,
450 .flags = FORMAT_FLAGS_PLANAR,
454 .name = "4:2:0, planar, Y-Cr-Cb",
456 .fourcc = V4L2_PIX_FMT_YVU420,
457 .btformat = BT848_COLOR_FMT_YCrCb422,
459 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
463 .name = "4:1:1, planar, Y-Cb-Cr",
464 .palette = VIDEO_PALETTE_YUV411P,
465 .fourcc = V4L2_PIX_FMT_YUV411P,
466 .btformat = BT848_COLOR_FMT_YCrCb411,
468 .flags = FORMAT_FLAGS_PLANAR,
472 .name = "4:1:0, planar, Y-Cb-Cr",
473 .palette = VIDEO_PALETTE_YUV410P,
474 .fourcc = V4L2_PIX_FMT_YUV410,
475 .btformat = BT848_COLOR_FMT_YCrCb411,
477 .flags = FORMAT_FLAGS_PLANAR,
481 .name = "4:1:0, planar, Y-Cr-Cb",
483 .fourcc = V4L2_PIX_FMT_YVU410,
484 .btformat = BT848_COLOR_FMT_YCrCb411,
486 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
490 .name = "raw scanlines",
491 .palette = VIDEO_PALETTE_RAW,
493 .btformat = BT848_COLOR_FMT_RAW,
495 .flags = FORMAT_FLAGS_RAW,
498 static const unsigned int BTTV_FORMATS = ARRAY_SIZE(bttv_formats);
500 /* ----------------------------------------------------------------------- */
502 #define V4L2_CID_PRIVATE_CHROMA_AGC (V4L2_CID_PRIVATE_BASE + 0)
503 #define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_PRIVATE_BASE + 1)
504 #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2)
505 #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3)
506 #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4)
507 #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5)
508 #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6)
509 #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7)
510 #define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8)
511 #define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9)
512 #define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10)
513 #define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11)
515 static const struct v4l2_queryctrl no_ctl = {
517 .flags = V4L2_CTRL_FLAG_DISABLED,
519 static const struct v4l2_queryctrl bttv_ctls[] = {
522 .id = V4L2_CID_BRIGHTNESS,
523 .name = "Brightness",
527 .default_value = 32768,
528 .type = V4L2_CTRL_TYPE_INTEGER,
530 .id = V4L2_CID_CONTRAST,
535 .default_value = 32768,
536 .type = V4L2_CTRL_TYPE_INTEGER,
538 .id = V4L2_CID_SATURATION,
539 .name = "Saturation",
543 .default_value = 32768,
544 .type = V4L2_CTRL_TYPE_INTEGER,
551 .default_value = 32768,
552 .type = V4L2_CTRL_TYPE_INTEGER,
556 .id = V4L2_CID_AUDIO_MUTE,
560 .type = V4L2_CTRL_TYPE_BOOLEAN,
562 .id = V4L2_CID_AUDIO_VOLUME,
567 .default_value = 65535,
568 .type = V4L2_CTRL_TYPE_INTEGER,
570 .id = V4L2_CID_AUDIO_BALANCE,
575 .default_value = 32768,
576 .type = V4L2_CTRL_TYPE_INTEGER,
578 .id = V4L2_CID_AUDIO_BASS,
583 .default_value = 32768,
584 .type = V4L2_CTRL_TYPE_INTEGER,
586 .id = V4L2_CID_AUDIO_TREBLE,
591 .default_value = 32768,
592 .type = V4L2_CTRL_TYPE_INTEGER,
594 /* --- private --- */
596 .id = V4L2_CID_PRIVATE_CHROMA_AGC,
597 .name = "chroma agc",
600 .type = V4L2_CTRL_TYPE_BOOLEAN,
602 .id = V4L2_CID_PRIVATE_COMBFILTER,
603 .name = "combfilter",
606 .type = V4L2_CTRL_TYPE_BOOLEAN,
608 .id = V4L2_CID_PRIVATE_AUTOMUTE,
612 .type = V4L2_CTRL_TYPE_BOOLEAN,
614 .id = V4L2_CID_PRIVATE_LUMAFILTER,
615 .name = "luma decimation filter",
618 .type = V4L2_CTRL_TYPE_BOOLEAN,
620 .id = V4L2_CID_PRIVATE_AGC_CRUSH,
624 .type = V4L2_CTRL_TYPE_BOOLEAN,
626 .id = V4L2_CID_PRIVATE_VCR_HACK,
630 .type = V4L2_CTRL_TYPE_BOOLEAN,
632 .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
633 .name = "whitecrush upper",
637 .default_value = 0xCF,
638 .type = V4L2_CTRL_TYPE_INTEGER,
640 .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
641 .name = "whitecrush lower",
645 .default_value = 0x7F,
646 .type = V4L2_CTRL_TYPE_INTEGER,
648 .id = V4L2_CID_PRIVATE_UV_RATIO,
654 .type = V4L2_CTRL_TYPE_INTEGER,
656 .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
657 .name = "full luma range",
660 .type = V4L2_CTRL_TYPE_BOOLEAN,
662 .id = V4L2_CID_PRIVATE_CORING,
668 .type = V4L2_CTRL_TYPE_INTEGER,
674 static const int BTTV_CTLS = ARRAY_SIZE(bttv_ctls);
676 /* ----------------------------------------------------------------------- */
677 /* resource management */
680 int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit)
682 if (fh->resources & bit)
683 /* have it already allocated */
687 mutex_lock(&btv->reslock);
688 if (btv->resources & bit) {
689 /* no, someone else uses it */
690 mutex_unlock(&btv->reslock);
693 /* it's free, grab it */
694 fh->resources |= bit;
695 btv->resources |= bit;
696 mutex_unlock(&btv->reslock);
701 int check_btres(struct bttv_fh *fh, int bit)
703 return (fh->resources & bit);
707 int locked_btres(struct bttv *btv, int bit)
709 return (btv->resources & bit);
713 void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
715 if ((fh->resources & bits) != bits) {
716 /* trying to free ressources not allocated by us ... */
717 printk("bttv: BUG! (btres)\n");
719 mutex_lock(&btv->reslock);
720 fh->resources &= ~bits;
721 btv->resources &= ~bits;
722 mutex_unlock(&btv->reslock);
725 /* ----------------------------------------------------------------------- */
726 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
728 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
729 PLL_X = Reference pre-divider (0=1, 1=2)
730 PLL_C = Post divider (0=6, 1=4)
731 PLL_I = Integer input
732 PLL_F = Fractional input
734 F_input = 28.636363 MHz:
735 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
738 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
740 unsigned char fl, fh, fi;
742 /* prevent overflows */
755 btwrite(fl, BT848_PLL_F_LO);
756 btwrite(fh, BT848_PLL_F_HI);
757 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
760 static void set_pll(struct bttv *btv)
764 if (!btv->pll.pll_crystal)
767 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
768 dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
772 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
774 if (btv->pll.pll_current == 0)
776 bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
777 btv->c.nr,btv->pll.pll_ifreq);
778 btwrite(0x00,BT848_TGCTRL);
779 btwrite(0x00,BT848_PLL_XCI);
780 btv->pll.pll_current = 0;
784 bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
785 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
786 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
788 for (i=0; i<10; i++) {
789 /* Let other people run while the PLL stabilizes */
793 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
794 btwrite(0,BT848_DSTATUS);
796 btwrite(0x08,BT848_TGCTRL);
797 btv->pll.pll_current = btv->pll.pll_ofreq;
798 bttv_printk(" ok\n");
802 btv->pll.pll_current = -1;
803 bttv_printk("failed\n");
807 /* used to switch between the bt848's analog/digital video capture modes */
808 static void bt848A_set_timing(struct bttv *btv)
811 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
812 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
814 if (UNSET == bttv_tvcards[btv->c.type].muxsel[btv->input]) {
815 dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
816 btv->c.nr,table_idx);
818 /* timing change...reset timing generator address */
819 btwrite(0x00, BT848_TGCTRL);
820 btwrite(0x02, BT848_TGCTRL);
821 btwrite(0x00, BT848_TGCTRL);
823 len=SRAM_Table[table_idx][0];
824 for(i = 1; i <= len; i++)
825 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
826 btv->pll.pll_ofreq = 27000000;
829 btwrite(0x11, BT848_TGCTRL);
830 btwrite(0x41, BT848_DVSIF);
832 btv->pll.pll_ofreq = fsc;
834 btwrite(0x0, BT848_DVSIF);
838 /* ----------------------------------------------------------------------- */
840 static void bt848_bright(struct bttv *btv, int bright)
844 // printk("bttv: set bright: %d\n",bright); // DEBUG
845 btv->bright = bright;
847 /* We want -128 to 127 we get 0-65535 */
848 value = (bright >> 8) - 128;
849 btwrite(value & 0xff, BT848_BRIGHT);
852 static void bt848_hue(struct bttv *btv, int hue)
859 value = (hue >> 8) - 128;
860 btwrite(value & 0xff, BT848_HUE);
863 static void bt848_contrast(struct bttv *btv, int cont)
867 btv->contrast = cont;
871 hibit = (value >> 6) & 4;
872 btwrite(value & 0xff, BT848_CONTRAST_LO);
873 btaor(hibit, ~4, BT848_E_CONTROL);
874 btaor(hibit, ~4, BT848_O_CONTROL);
877 static void bt848_sat(struct bttv *btv, int color)
879 int val_u,val_v,hibits;
881 btv->saturation = color;
883 /* 0-511 for the color */
884 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
885 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
886 hibits = (val_u >> 7) & 2;
887 hibits |= (val_v >> 8) & 1;
888 btwrite(val_u & 0xff, BT848_SAT_U_LO);
889 btwrite(val_v & 0xff, BT848_SAT_V_LO);
890 btaor(hibits, ~3, BT848_E_CONTROL);
891 btaor(hibits, ~3, BT848_O_CONTROL);
894 /* ----------------------------------------------------------------------- */
897 video_mux(struct bttv *btv, unsigned int input)
901 if (input >= bttv_tvcards[btv->c.type].video_inputs)
904 /* needed by RemoteVideo MX */
905 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
907 gpio_inout(mask2,mask2);
909 if (input == btv->svhs) {
910 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
911 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
913 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
914 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
916 mux = bttv_tvcards[btv->c.type].muxsel[input] & 3;
917 btaor(mux<<5, ~(3<<5), BT848_IFORM);
918 dprintk(KERN_DEBUG "bttv%d: video mux: input=%d mux=%d\n",
919 btv->c.nr,input,mux);
921 /* card specific hook */
922 if(bttv_tvcards[btv->c.type].muxsel_hook)
923 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
927 static char *audio_modes[] = {
928 "audio: tuner", "audio: radio", "audio: extern",
929 "audio: intern", "audio: off"
933 audio_mux(struct bttv *btv, int mode)
935 int val,mux,i2c_mux,signal;
937 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
938 bttv_tvcards[btv->c.type].gpiomask);
939 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
943 btv->audio |= AUDIO_MUTE;
946 btv->audio &= ~AUDIO_MUTE;
952 btv->audio &= AUDIO_MUTE;
955 i2c_mux = mux = (btv->audio & AUDIO_MUTE) ? AUDIO_OFF : btv->audio;
956 if (btv->opt_automute && !signal && !btv->radio_user)
959 val = bttv_tvcards[btv->c.type].audiomux[mux];
960 gpio_bits(bttv_tvcards[btv->c.type].gpiomask,val);
962 bttv_gpio_tracking(btv,audio_modes[mux]);
964 bttv_call_i2c_clients(btv,AUDC_SET_INPUT,&(i2c_mux));
969 i2c_vidiocschan(struct bttv *btv)
971 struct video_channel c;
973 memset(&c,0,sizeof(c));
974 c.norm = btv->tvnorm;
975 c.channel = btv->input;
976 bttv_call_i2c_clients(btv,VIDIOCSCHAN,&c);
977 if (btv->c.type == BTTV_BOARD_VOODOOTV_FM)
978 bttv_tda9880_setnorm(btv,c.norm);
982 set_tvnorm(struct bttv *btv, unsigned int norm)
984 const struct bttv_tvnorm *tvnorm;
986 if (norm < 0 || norm >= BTTV_TVNORMS)
990 tvnorm = &bttv_tvnorms[norm];
992 btwrite(tvnorm->adelay, BT848_ADELAY);
993 btwrite(tvnorm->bdelay, BT848_BDELAY);
994 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
996 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
997 btwrite(1, BT848_VBI_PACK_DEL);
998 bt848A_set_timing(btv);
1000 switch (btv->c.type) {
1001 case BTTV_BOARD_VOODOOTV_FM:
1002 bttv_tda9880_setnorm(btv,norm);
1009 set_input(struct bttv *btv, unsigned int input)
1011 unsigned long flags;
1015 spin_lock_irqsave(&btv->s_lock,flags);
1016 if (btv->curr.frame_irq) {
1017 /* active capture -> delayed input switch */
1018 btv->new_input = input;
1020 video_mux(btv,input);
1022 spin_unlock_irqrestore(&btv->s_lock,flags);
1024 video_mux(btv,input);
1026 audio_mux(btv,(input == bttv_tvcards[btv->c.type].tuner ?
1027 AUDIO_TUNER : AUDIO_EXTERN));
1028 set_tvnorm(btv,btv->tvnorm);
1029 i2c_vidiocschan(btv);
1032 static void init_irqreg(struct bttv *btv)
1035 btwrite(0xfffffUL, BT848_INT_STAT);
1037 if (bttv_tvcards[btv->c.type].no_video) {
1039 btwrite(BT848_INT_I2CDONE,
1043 btwrite((btv->triton1) |
1044 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1046 (fdsr ? BT848_INT_FDSR : 0) |
1047 BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
1048 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1054 static void init_bt848(struct bttv *btv)
1058 if (bttv_tvcards[btv->c.type].no_video) {
1059 /* very basic init only */
1064 btwrite(0x00, BT848_CAP_CTL);
1065 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1066 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1068 /* set planar and packed mode trigger points and */
1069 /* set rising edge of inverted GPINTR pin as irq trigger */
1070 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1071 BT848_GPIO_DMA_CTL_PLTP1_16|
1072 BT848_GPIO_DMA_CTL_PLTP23_16|
1073 BT848_GPIO_DMA_CTL_GPINTC|
1074 BT848_GPIO_DMA_CTL_GPINTI,
1075 BT848_GPIO_DMA_CTL);
1077 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1078 btwrite(val, BT848_E_SCLOOP);
1079 btwrite(val, BT848_O_SCLOOP);
1081 btwrite(0x20, BT848_E_VSCALE_HI);
1082 btwrite(0x20, BT848_O_VSCALE_HI);
1083 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1086 btwrite(whitecrush_upper, BT848_WC_UP);
1087 btwrite(whitecrush_lower, BT848_WC_DOWN);
1089 if (btv->opt_lumafilter) {
1090 btwrite(0, BT848_E_CONTROL);
1091 btwrite(0, BT848_O_CONTROL);
1093 btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1094 btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1097 bt848_bright(btv, btv->bright);
1098 bt848_hue(btv, btv->hue);
1099 bt848_contrast(btv, btv->contrast);
1100 bt848_sat(btv, btv->saturation);
1106 static void bttv_reinit_bt848(struct bttv *btv)
1108 unsigned long flags;
1111 printk(KERN_INFO "bttv%d: reset, reinitialize\n",btv->c.nr);
1112 spin_lock_irqsave(&btv->s_lock,flags);
1114 bttv_set_dma(btv,0);
1115 spin_unlock_irqrestore(&btv->s_lock,flags);
1118 btv->pll.pll_current = -1;
1119 set_input(btv,btv->input);
1122 static int get_control(struct bttv *btv, struct v4l2_control *c)
1124 struct video_audio va;
1127 for (i = 0; i < BTTV_CTLS; i++)
1128 if (bttv_ctls[i].id == c->id)
1132 if (i >= 4 && i <= 8) {
1133 memset(&va,0,sizeof(va));
1134 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1135 if (btv->audio_hook)
1136 btv->audio_hook(btv,&va,0);
1139 case V4L2_CID_BRIGHTNESS:
1140 c->value = btv->bright;
1143 c->value = btv->hue;
1145 case V4L2_CID_CONTRAST:
1146 c->value = btv->contrast;
1148 case V4L2_CID_SATURATION:
1149 c->value = btv->saturation;
1152 case V4L2_CID_AUDIO_MUTE:
1153 c->value = (VIDEO_AUDIO_MUTE & va.flags) ? 1 : 0;
1155 case V4L2_CID_AUDIO_VOLUME:
1156 c->value = va.volume;
1158 case V4L2_CID_AUDIO_BALANCE:
1159 c->value = va.balance;
1161 case V4L2_CID_AUDIO_BASS:
1164 case V4L2_CID_AUDIO_TREBLE:
1165 c->value = va.treble;
1168 case V4L2_CID_PRIVATE_CHROMA_AGC:
1169 c->value = btv->opt_chroma_agc;
1171 case V4L2_CID_PRIVATE_COMBFILTER:
1172 c->value = btv->opt_combfilter;
1174 case V4L2_CID_PRIVATE_LUMAFILTER:
1175 c->value = btv->opt_lumafilter;
1177 case V4L2_CID_PRIVATE_AUTOMUTE:
1178 c->value = btv->opt_automute;
1180 case V4L2_CID_PRIVATE_AGC_CRUSH:
1181 c->value = btv->opt_adc_crush;
1183 case V4L2_CID_PRIVATE_VCR_HACK:
1184 c->value = btv->opt_vcr_hack;
1186 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1187 c->value = btv->opt_whitecrush_upper;
1189 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1190 c->value = btv->opt_whitecrush_lower;
1192 case V4L2_CID_PRIVATE_UV_RATIO:
1193 c->value = btv->opt_uv_ratio;
1195 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1196 c->value = btv->opt_full_luma_range;
1198 case V4L2_CID_PRIVATE_CORING:
1199 c->value = btv->opt_coring;
1207 static int set_control(struct bttv *btv, struct v4l2_control *c)
1209 struct video_audio va;
1212 for (i = 0; i < BTTV_CTLS; i++)
1213 if (bttv_ctls[i].id == c->id)
1217 if (i >= 4 && i <= 8) {
1218 memset(&va,0,sizeof(va));
1219 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1220 if (btv->audio_hook)
1221 btv->audio_hook(btv,&va,0);
1224 case V4L2_CID_BRIGHTNESS:
1225 bt848_bright(btv,c->value);
1228 bt848_hue(btv,c->value);
1230 case V4L2_CID_CONTRAST:
1231 bt848_contrast(btv,c->value);
1233 case V4L2_CID_SATURATION:
1234 bt848_sat(btv,c->value);
1236 case V4L2_CID_AUDIO_MUTE:
1238 va.flags |= VIDEO_AUDIO_MUTE;
1239 audio_mux(btv, AUDIO_MUTE);
1241 va.flags &= ~VIDEO_AUDIO_MUTE;
1242 audio_mux(btv, AUDIO_UNMUTE);
1246 case V4L2_CID_AUDIO_VOLUME:
1247 va.volume = c->value;
1249 case V4L2_CID_AUDIO_BALANCE:
1250 va.balance = c->value;
1252 case V4L2_CID_AUDIO_BASS:
1255 case V4L2_CID_AUDIO_TREBLE:
1256 va.treble = c->value;
1259 case V4L2_CID_PRIVATE_CHROMA_AGC:
1260 btv->opt_chroma_agc = c->value;
1261 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1262 btwrite(val, BT848_E_SCLOOP);
1263 btwrite(val, BT848_O_SCLOOP);
1265 case V4L2_CID_PRIVATE_COMBFILTER:
1266 btv->opt_combfilter = c->value;
1268 case V4L2_CID_PRIVATE_LUMAFILTER:
1269 btv->opt_lumafilter = c->value;
1270 if (btv->opt_lumafilter) {
1271 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1272 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1274 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1275 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1278 case V4L2_CID_PRIVATE_AUTOMUTE:
1279 btv->opt_automute = c->value;
1281 case V4L2_CID_PRIVATE_AGC_CRUSH:
1282 btv->opt_adc_crush = c->value;
1283 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1286 case V4L2_CID_PRIVATE_VCR_HACK:
1287 btv->opt_vcr_hack = c->value;
1289 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1290 btv->opt_whitecrush_upper = c->value;
1291 btwrite(c->value, BT848_WC_UP);
1293 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1294 btv->opt_whitecrush_lower = c->value;
1295 btwrite(c->value, BT848_WC_DOWN);
1297 case V4L2_CID_PRIVATE_UV_RATIO:
1298 btv->opt_uv_ratio = c->value;
1299 bt848_sat(btv, btv->saturation);
1301 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1302 btv->opt_full_luma_range = c->value;
1303 btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM);
1305 case V4L2_CID_PRIVATE_CORING:
1306 btv->opt_coring = c->value;
1307 btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM);
1312 if (i >= 4 && i <= 8) {
1313 bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
1314 if (btv->audio_hook)
1315 btv->audio_hook(btv,&va,1);
1320 /* ----------------------------------------------------------------------- */
1322 void bttv_gpio_tracking(struct bttv *btv, char *comment)
1324 unsigned int outbits, data;
1325 outbits = btread(BT848_GPIO_OUT_EN);
1326 data = btread(BT848_GPIO_DATA);
1327 printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1328 btv->c.nr,outbits,data & outbits, data & ~outbits, comment);
1331 static void bttv_field_count(struct bttv *btv)
1339 /* start field counter */
1340 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1342 /* stop field counter */
1343 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1344 btv->field_count = 0;
1348 static const struct bttv_format*
1349 format_by_palette(int palette)
1353 for (i = 0; i < BTTV_FORMATS; i++) {
1354 if (-1 == bttv_formats[i].palette)
1356 if (bttv_formats[i].palette == palette)
1357 return bttv_formats+i;
1362 static const struct bttv_format*
1363 format_by_fourcc(int fourcc)
1367 for (i = 0; i < BTTV_FORMATS; i++) {
1368 if (-1 == bttv_formats[i].fourcc)
1370 if (bttv_formats[i].fourcc == fourcc)
1371 return bttv_formats+i;
1376 /* ----------------------------------------------------------------------- */
1380 bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1381 struct bttv_buffer *new)
1383 struct bttv_buffer *old;
1384 unsigned long flags;
1387 dprintk("switch_overlay: enter [new=%p]\n",new);
1389 new->vb.state = STATE_DONE;
1390 spin_lock_irqsave(&btv->s_lock,flags);
1394 bttv_set_dma(btv, 0x03);
1395 spin_unlock_irqrestore(&btv->s_lock,flags);
1397 free_btres(btv,fh,RESOURCE_OVERLAY);
1399 dprintk("switch_overlay: old=%p state is %d\n",old,old->vb.state);
1400 bttv_dma_free(btv, old);
1403 dprintk("switch_overlay: done\n");
1407 /* ----------------------------------------------------------------------- */
1408 /* video4linux (1) interface */
1410 static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf,
1411 const struct bttv_format *fmt,
1412 unsigned int width, unsigned int height,
1413 enum v4l2_field field)
1415 int redo_dma_risc = 0;
1418 /* check settings */
1421 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1423 height = RAW_LINES*2;
1424 if (width*height > buf->vb.bsize)
1426 buf->vb.size = buf->vb.bsize;
1430 width > bttv_tvnorms[btv->tvnorm].swidth ||
1431 height > bttv_tvnorms[btv->tvnorm].sheight)
1433 buf->vb.size = (width * height * fmt->depth) >> 3;
1434 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1438 /* alloc + fill struct bttv_buffer (if changed) */
1439 if (buf->vb.width != width || buf->vb.height != height ||
1440 buf->vb.field != field ||
1441 buf->tvnorm != btv->tvnorm || buf->fmt != fmt) {
1442 buf->vb.width = width;
1443 buf->vb.height = height;
1444 buf->vb.field = field;
1445 buf->tvnorm = btv->tvnorm;
1450 /* alloc risc memory */
1451 if (STATE_NEEDS_INIT == buf->vb.state) {
1453 if (0 != (rc = videobuf_iolock(btv->c.pci,&buf->vb,&btv->fbuf)))
1458 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1461 buf->vb.state = STATE_PREPARED;
1465 bttv_dma_free(btv,buf);
1470 buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1472 struct bttv_fh *fh = q->priv_data;
1474 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1477 while (*size * *count > gbuffers * gbufsize)
1483 buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1484 enum v4l2_field field)
1486 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1487 struct bttv_fh *fh = q->priv_data;
1489 return bttv_prepare_buffer(fh->btv, buf, fh->fmt,
1490 fh->width, fh->height, field);
1494 buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1496 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1497 struct bttv_fh *fh = q->priv_data;
1498 struct bttv *btv = fh->btv;
1500 buf->vb.state = STATE_QUEUED;
1501 list_add_tail(&buf->vb.queue,&btv->capture);
1502 if (!btv->curr.frame_irq) {
1504 bttv_set_dma(btv, 0x03);
1508 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1510 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1511 struct bttv_fh *fh = q->priv_data;
1513 bttv_dma_free(fh->btv,buf);
1516 static struct videobuf_queue_ops bttv_video_qops = {
1517 .buf_setup = buffer_setup,
1518 .buf_prepare = buffer_prepare,
1519 .buf_queue = buffer_queue,
1520 .buf_release = buffer_release,
1523 static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
1527 return BTTV_VERSION_CODE;
1529 /* *** v4l1 *** ************************************************ */
1532 unsigned long *freq = arg;
1538 unsigned long *freq = arg;
1539 mutex_lock(&btv->lock);
1541 bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq);
1542 if (btv->has_matchbox && btv->radio_user)
1543 tea5757_set_freq(btv,*freq);
1544 mutex_unlock(&btv->lock);
1550 struct video_tuner *v = arg;
1552 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1554 if (v->tuner) /* Only tuner 0 */
1556 strcpy(v->name, "Television");
1558 v->rangehigh = 0x7FFFFFFF;
1559 v->flags = VIDEO_TUNER_PAL|VIDEO_TUNER_NTSC|VIDEO_TUNER_SECAM;
1560 v->mode = btv->tvnorm;
1561 v->signal = (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) ? 0xFFFF : 0;
1562 bttv_call_i2c_clients(btv,cmd,v);
1567 struct video_tuner *v = arg;
1569 if (v->tuner) /* Only tuner 0 */
1571 if (v->mode >= BTTV_TVNORMS)
1574 mutex_lock(&btv->lock);
1575 set_tvnorm(btv,v->mode);
1576 bttv_call_i2c_clients(btv,cmd,v);
1577 mutex_unlock(&btv->lock);
1583 struct video_channel *v = arg;
1584 unsigned int channel = v->channel;
1586 if (channel >= bttv_tvcards[btv->c.type].video_inputs)
1589 v->flags = VIDEO_VC_AUDIO;
1590 v->type = VIDEO_TYPE_CAMERA;
1591 v->norm = btv->tvnorm;
1592 if (channel == bttv_tvcards[btv->c.type].tuner) {
1593 strcpy(v->name,"Television");
1594 v->flags|=VIDEO_VC_TUNER;
1595 v->type=VIDEO_TYPE_TV;
1597 } else if (channel == btv->svhs) {
1598 strcpy(v->name,"S-Video");
1600 sprintf(v->name,"Composite%d",channel);
1606 struct video_channel *v = arg;
1607 unsigned int channel = v->channel;
1609 if (channel >= bttv_tvcards[btv->c.type].video_inputs)
1611 if (v->norm >= BTTV_TVNORMS)
1614 mutex_lock(&btv->lock);
1615 if (channel == btv->input &&
1616 v->norm == btv->tvnorm) {
1618 mutex_unlock(&btv->lock);
1622 btv->tvnorm = v->norm;
1623 set_input(btv,v->channel);
1624 mutex_unlock(&btv->lock);
1630 struct video_audio *v = arg;
1632 memset(v,0,sizeof(*v));
1633 strcpy(v->name,"Television");
1634 v->flags |= VIDEO_AUDIO_MUTABLE;
1635 v->mode = VIDEO_SOUND_MONO;
1637 mutex_lock(&btv->lock);
1638 bttv_call_i2c_clients(btv,cmd,v);
1640 /* card specific hooks */
1641 if (btv->audio_hook)
1642 btv->audio_hook(btv,v,0);
1644 mutex_unlock(&btv->lock);
1649 struct video_audio *v = arg;
1650 unsigned int audio = v->audio;
1652 if (audio >= bttv_tvcards[btv->c.type].audio_inputs)
1655 mutex_lock(&btv->lock);
1656 audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : AUDIO_UNMUTE);
1657 bttv_call_i2c_clients(btv,cmd,v);
1659 /* card specific hooks */
1660 if (btv->audio_hook)
1661 btv->audio_hook(btv,v,1);
1663 mutex_unlock(&btv->lock);
1667 /* *** v4l2 *** ************************************************ */
1668 case VIDIOC_ENUMSTD:
1670 struct v4l2_standard *e = arg;
1671 unsigned int index = e->index;
1673 if (index >= BTTV_TVNORMS)
1675 v4l2_video_std_construct(e, bttv_tvnorms[e->index].v4l2_id,
1676 bttv_tvnorms[e->index].name);
1682 v4l2_std_id *id = arg;
1683 *id = bttv_tvnorms[btv->tvnorm].v4l2_id;
1688 v4l2_std_id *id = arg;
1691 for (i = 0; i < BTTV_TVNORMS; i++)
1692 if (*id & bttv_tvnorms[i].v4l2_id)
1694 if (i == BTTV_TVNORMS)
1697 mutex_lock(&btv->lock);
1699 i2c_vidiocschan(btv);
1700 mutex_unlock(&btv->lock);
1703 case VIDIOC_QUERYSTD:
1705 v4l2_std_id *id = arg;
1707 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1708 *id = V4L2_STD_625_50;
1710 *id = V4L2_STD_525_60;
1714 case VIDIOC_ENUMINPUT:
1716 struct v4l2_input *i = arg;
1720 if (n >= bttv_tvcards[btv->c.type].video_inputs)
1722 memset(i,0,sizeof(*i));
1724 i->type = V4L2_INPUT_TYPE_CAMERA;
1726 if (i->index == bttv_tvcards[btv->c.type].tuner) {
1727 sprintf(i->name, "Television");
1728 i->type = V4L2_INPUT_TYPE_TUNER;
1730 } else if (i->index == btv->svhs) {
1731 sprintf(i->name, "S-Video");
1733 sprintf(i->name,"Composite%d",i->index);
1735 if (i->index == btv->input) {
1736 __u32 dstatus = btread(BT848_DSTATUS);
1737 if (0 == (dstatus & BT848_DSTATUS_PRES))
1738 i->status |= V4L2_IN_ST_NO_SIGNAL;
1739 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1740 i->status |= V4L2_IN_ST_NO_H_LOCK;
1742 for (n = 0; n < BTTV_TVNORMS; n++)
1743 i->std |= bttv_tvnorms[n].v4l2_id;
1746 case VIDIOC_G_INPUT:
1752 case VIDIOC_S_INPUT:
1754 unsigned int *i = arg;
1756 if (*i > bttv_tvcards[btv->c.type].video_inputs)
1758 mutex_lock(&btv->lock);
1760 mutex_unlock(&btv->lock);
1764 case VIDIOC_G_TUNER:
1766 struct v4l2_tuner *t = arg;
1768 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1772 mutex_lock(&btv->lock);
1773 memset(t,0,sizeof(*t));
1774 strcpy(t->name, "Television");
1775 t->type = V4L2_TUNER_ANALOG_TV;
1776 t->capability = V4L2_TUNER_CAP_NORM;
1777 t->rxsubchans = V4L2_TUNER_SUB_MONO;
1778 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
1781 struct video_tuner tuner;
1783 memset(&tuner, 0, sizeof (tuner));
1784 tuner.rangehigh = 0xffffffffUL;
1785 bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner);
1786 t->rangelow = tuner.rangelow;
1787 t->rangehigh = tuner.rangehigh;
1791 struct video_audio va;
1792 memset(&va, 0, sizeof(struct video_audio));
1793 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1794 if (btv->audio_hook)
1795 btv->audio_hook(btv,&va,0);
1796 if(va.mode & VIDEO_SOUND_STEREO) {
1797 t->audmode = V4L2_TUNER_MODE_STEREO;
1798 t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
1800 if(va.mode & VIDEO_SOUND_LANG1) {
1801 t->audmode = V4L2_TUNER_MODE_LANG1;
1802 t->rxsubchans = V4L2_TUNER_SUB_LANG1
1803 | V4L2_TUNER_SUB_LANG2;
1806 /* FIXME: fill capability+audmode */
1807 mutex_unlock(&btv->lock);
1810 case VIDIOC_S_TUNER:
1812 struct v4l2_tuner *t = arg;
1814 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1818 mutex_lock(&btv->lock);
1820 struct video_audio va;
1821 memset(&va, 0, sizeof(struct video_audio));
1822 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1823 if (t->audmode == V4L2_TUNER_MODE_MONO)
1824 va.mode = VIDEO_SOUND_MONO;
1825 else if (t->audmode == V4L2_TUNER_MODE_STEREO)
1826 va.mode = VIDEO_SOUND_STEREO;
1827 else if (t->audmode == V4L2_TUNER_MODE_LANG1)
1828 va.mode = VIDEO_SOUND_LANG1;
1829 else if (t->audmode == V4L2_TUNER_MODE_LANG2)
1830 va.mode = VIDEO_SOUND_LANG2;
1831 bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
1832 if (btv->audio_hook)
1833 btv->audio_hook(btv,&va,1);
1835 mutex_unlock(&btv->lock);
1839 case VIDIOC_G_FREQUENCY:
1841 struct v4l2_frequency *f = arg;
1843 memset(f,0,sizeof(*f));
1844 f->type = V4L2_TUNER_ANALOG_TV;
1845 f->frequency = btv->freq;
1848 case VIDIOC_S_FREQUENCY:
1850 struct v4l2_frequency *f = arg;
1852 if (unlikely(f->tuner != 0))
1854 if (unlikely (f->type != V4L2_TUNER_ANALOG_TV))
1856 mutex_lock(&btv->lock);
1857 btv->freq = f->frequency;
1858 bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq);
1859 if (btv->has_matchbox && btv->radio_user)
1860 tea5757_set_freq(btv,btv->freq);
1861 mutex_unlock(&btv->lock);
1864 case VIDIOC_LOG_STATUS:
1866 bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
1871 return -ENOIOCTLCMD;
1877 static int verify_window(const struct bttv_tvnorm *tvn,
1878 struct v4l2_window *win, int fixup)
1880 enum v4l2_field field;
1883 if (win->w.width < 48 || win->w.height < 32)
1885 if (win->clipcount > 2048)
1890 maxh = tvn->sheight;
1892 if (V4L2_FIELD_ANY == field) {
1893 field = (win->w.height > maxh/2)
1894 ? V4L2_FIELD_INTERLACED
1898 case V4L2_FIELD_TOP:
1899 case V4L2_FIELD_BOTTOM:
1902 case V4L2_FIELD_INTERLACED:
1908 if (!fixup && (win->w.width > maxw || win->w.height > maxh))
1911 if (win->w.width > maxw)
1912 win->w.width = maxw;
1913 if (win->w.height > maxh)
1914 win->w.height = maxh;
1919 static int setup_window(struct bttv_fh *fh, struct bttv *btv,
1920 struct v4l2_window *win, int fixup)
1922 struct v4l2_clip *clips = NULL;
1923 int n,size,retval = 0;
1925 if (NULL == fh->ovfmt)
1927 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
1929 retval = verify_window(&bttv_tvnorms[btv->tvnorm],win,fixup);
1933 /* copy clips -- luckily v4l1 + v4l2 are binary
1934 compatible here ...*/
1936 size = sizeof(*clips)*(n+4);
1937 clips = kmalloc(size,GFP_KERNEL);
1941 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
1946 /* clip against screen */
1947 if (NULL != btv->fbuf.base)
1948 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
1950 btcx_sort_clips(clips,n);
1952 /* 4-byte alignments */
1953 switch (fh->ovfmt->depth) {
1956 btcx_align(&win->w, clips, n, 3);
1959 btcx_align(&win->w, clips, n, 1);
1962 /* no alignment fixups needed */
1968 mutex_lock(&fh->cap.lock);
1969 kfree(fh->ov.clips);
1970 fh->ov.clips = clips;
1974 fh->ov.field = win->field;
1975 fh->ov.setup_ok = 1;
1976 btv->init.ov.w.width = win->w.width;
1977 btv->init.ov.w.height = win->w.height;
1978 btv->init.ov.field = win->field;
1980 /* update overlay if needed */
1982 if (check_btres(fh, RESOURCE_OVERLAY)) {
1983 struct bttv_buffer *new;
1985 new = videobuf_alloc(sizeof(*new));
1986 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
1987 retval = bttv_switch_overlay(btv,fh,new);
1989 mutex_unlock(&fh->cap.lock);
1993 /* ----------------------------------------------------------------------- */
1995 static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
1997 struct videobuf_queue* q = NULL;
2000 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2003 case V4L2_BUF_TYPE_VBI_CAPTURE:
2012 static int bttv_resource(struct bttv_fh *fh)
2017 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2018 res = RESOURCE_VIDEO;
2020 case V4L2_BUF_TYPE_VBI_CAPTURE:
2029 static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2031 struct videobuf_queue *q = bttv_queue(fh);
2032 int res = bttv_resource(fh);
2034 if (check_btres(fh,res))
2036 if (videobuf_queue_is_busy(q))
2043 pix_format_set_size (struct v4l2_pix_format * f,
2044 const struct bttv_format * fmt,
2046 unsigned int height)
2051 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2052 f->bytesperline = width; /* Y plane */
2053 f->sizeimage = (width * height * fmt->depth) >> 3;
2055 f->bytesperline = (width * fmt->depth) >> 3;
2056 f->sizeimage = height * f->bytesperline;
2060 static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f)
2063 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2064 memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format));
2065 pix_format_set_size (&f->fmt.pix, fh->fmt,
2066 fh->width, fh->height);
2067 f->fmt.pix.field = fh->cap.field;
2068 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2070 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2071 memset(&f->fmt.win,0,sizeof(struct v4l2_window));
2072 f->fmt.win.w = fh->ov.w;
2073 f->fmt.win.field = fh->ov.field;
2075 case V4L2_BUF_TYPE_VBI_CAPTURE:
2076 bttv_vbi_get_fmt(fh,f);
2083 static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv,
2084 struct v4l2_format *f)
2087 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2089 const struct bttv_format *fmt;
2090 enum v4l2_field field;
2091 unsigned int maxw,maxh;
2093 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2098 maxw = bttv_tvnorms[btv->tvnorm].swidth;
2099 maxh = bttv_tvnorms[btv->tvnorm].sheight;
2100 field = f->fmt.pix.field;
2101 if (V4L2_FIELD_ANY == field)
2102 field = (f->fmt.pix.height > maxh/2)
2103 ? V4L2_FIELD_INTERLACED
2104 : V4L2_FIELD_BOTTOM;
2105 if (V4L2_FIELD_SEQ_BT == field)
2106 field = V4L2_FIELD_SEQ_TB;
2108 case V4L2_FIELD_TOP:
2109 case V4L2_FIELD_BOTTOM:
2110 case V4L2_FIELD_ALTERNATE:
2113 case V4L2_FIELD_INTERLACED:
2115 case V4L2_FIELD_SEQ_TB:
2116 if (fmt->flags & FORMAT_FLAGS_PLANAR)
2123 /* update data for the application */
2124 f->fmt.pix.field = field;
2125 if (f->fmt.pix.width < 48)
2126 f->fmt.pix.width = 48;
2127 if (f->fmt.pix.height < 32)
2128 f->fmt.pix.height = 32;
2129 if (f->fmt.pix.width > maxw)
2130 f->fmt.pix.width = maxw;
2131 if (f->fmt.pix.height > maxh)
2132 f->fmt.pix.height = maxh;
2133 pix_format_set_size (&f->fmt.pix, fmt,
2134 f->fmt.pix.width & ~3,
2139 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2140 return verify_window(&bttv_tvnorms[btv->tvnorm],
2142 case V4L2_BUF_TYPE_VBI_CAPTURE:
2143 bttv_vbi_try_fmt(fh,f);
2150 static int bttv_s_fmt(struct bttv_fh *fh, struct bttv *btv,
2151 struct v4l2_format *f)
2156 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2158 const struct bttv_format *fmt;
2160 retval = bttv_switch_type(fh,f->type);
2163 retval = bttv_try_fmt(fh,btv,f);
2166 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2168 /* update our state informations */
2169 mutex_lock(&fh->cap.lock);
2171 fh->cap.field = f->fmt.pix.field;
2172 fh->cap.last = V4L2_FIELD_NONE;
2173 fh->width = f->fmt.pix.width;
2174 fh->height = f->fmt.pix.height;
2175 btv->init.fmt = fmt;
2176 btv->init.width = f->fmt.pix.width;
2177 btv->init.height = f->fmt.pix.height;
2178 mutex_unlock(&fh->cap.lock);
2182 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2183 if (no_overlay > 0) {
2184 printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2187 return setup_window(fh, btv, &f->fmt.win, 1);
2188 case V4L2_BUF_TYPE_VBI_CAPTURE:
2189 retval = bttv_switch_type(fh,f->type);
2192 if (locked_btres(fh->btv, RESOURCE_VBI))
2194 bttv_vbi_try_fmt(fh,f);
2195 bttv_vbi_setlines(fh,btv,f->fmt.vbi.count[0]);
2196 bttv_vbi_get_fmt(fh,f);
2203 static int bttv_do_ioctl(struct inode *inode, struct file *file,
2204 unsigned int cmd, void *arg)
2206 struct bttv_fh *fh = file->private_data;
2207 struct bttv *btv = fh->btv;
2208 unsigned long flags;
2212 v4l_print_ioctl(btv->c.name, cmd);
2215 bttv_reinit_bt848(btv);
2223 case VIDIOC_S_INPUT:
2224 case VIDIOC_S_TUNER:
2225 case VIDIOC_S_FREQUENCY:
2226 retval = v4l2_prio_check(&btv->prio,&fh->prio);
2233 /* *** v4l1 *** ************************************************ */
2236 struct video_capability *cap = arg;
2238 memset(cap,0,sizeof(*cap));
2239 strcpy(cap->name,btv->video_dev->name);
2240 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2242 cap->type = VID_TYPE_TUNER|VID_TYPE_TELETEXT;
2245 cap->type = VID_TYPE_CAPTURE|
2249 if (no_overlay <= 0)
2250 cap->type |= VID_TYPE_OVERLAY;
2252 cap->maxwidth = bttv_tvnorms[btv->tvnorm].swidth;
2253 cap->maxheight = bttv_tvnorms[btv->tvnorm].sheight;
2255 cap->minheight = 32;
2257 cap->channels = bttv_tvcards[btv->c.type].video_inputs;
2258 cap->audios = bttv_tvcards[btv->c.type].audio_inputs;
2264 struct video_picture *pic = arg;
2266 memset(pic,0,sizeof(*pic));
2267 pic->brightness = btv->bright;
2268 pic->contrast = btv->contrast;
2269 pic->hue = btv->hue;
2270 pic->colour = btv->saturation;
2272 pic->depth = fh->fmt->depth;
2273 pic->palette = fh->fmt->palette;
2279 struct video_picture *pic = arg;
2280 const struct bttv_format *fmt;
2282 fmt = format_by_palette(pic->palette);
2285 mutex_lock(&fh->cap.lock);
2286 if (fmt->depth != pic->depth) {
2288 goto fh_unlock_and_return;
2290 if (fmt->flags & FORMAT_FLAGS_RAW) {
2291 /* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL *
2292 RAW_LINES * 2. F1 is stored at offset 0, F2
2293 at buffer size / 2. */
2294 fh->width = RAW_BPL;
2295 fh->height = gbufsize / RAW_BPL;
2296 btv->init.width = RAW_BPL;
2297 btv->init.height = gbufsize / RAW_BPL;
2301 btv->init.ovfmt = fmt;
2302 btv->init.fmt = fmt;
2304 /* dirty hack time: swap bytes for overlay if the
2305 display adaptor is big endian (insmod option) */
2306 if (fmt->palette == VIDEO_PALETTE_RGB555 ||
2307 fmt->palette == VIDEO_PALETTE_RGB565 ||
2308 fmt->palette == VIDEO_PALETTE_RGB32) {
2312 bt848_bright(btv,pic->brightness);
2313 bt848_contrast(btv,pic->contrast);
2314 bt848_hue(btv,pic->hue);
2315 bt848_sat(btv,pic->colour);
2316 mutex_unlock(&fh->cap.lock);
2322 struct video_window *win = arg;
2324 memset(win,0,sizeof(*win));
2325 win->x = fh->ov.w.left;
2326 win->y = fh->ov.w.top;
2327 win->width = fh->ov.w.width;
2328 win->height = fh->ov.w.height;
2333 struct video_window *win = arg;
2334 struct v4l2_window w2;
2336 if (no_overlay > 0) {
2337 printk ("VIDIOCSWIN: no_overlay\n");
2341 w2.field = V4L2_FIELD_ANY;
2344 w2.w.width = win->width;
2345 w2.w.height = win->height;
2346 w2.clipcount = win->clipcount;
2347 w2.clips = (struct v4l2_clip __user *)win->clips;
2348 retval = setup_window(fh, btv, &w2, 0);
2350 /* on v4l1 this ioctl affects the read() size too */
2351 fh->width = fh->ov.w.width;
2352 fh->height = fh->ov.w.height;
2353 btv->init.width = fh->ov.w.width;
2354 btv->init.height = fh->ov.w.height;
2361 struct video_buffer *fbuf = arg;
2363 fbuf->base = btv->fbuf.base;
2364 fbuf->width = btv->fbuf.fmt.width;
2365 fbuf->height = btv->fbuf.fmt.height;
2366 fbuf->bytesperline = btv->fbuf.fmt.bytesperline;
2368 fbuf->depth = fh->ovfmt->depth;
2373 struct video_buffer *fbuf = arg;
2374 const struct bttv_format *fmt;
2377 if(!capable(CAP_SYS_ADMIN) &&
2378 !capable(CAP_SYS_RAWIO))
2380 end = (unsigned long)fbuf->base +
2381 fbuf->height * fbuf->bytesperline;
2382 mutex_lock(&fh->cap.lock);
2385 switch (fbuf->depth) {
2387 fmt = format_by_palette(VIDEO_PALETTE_HI240);
2390 fmt = format_by_palette(VIDEO_PALETTE_RGB565);
2393 fmt = format_by_palette(VIDEO_PALETTE_RGB24);
2396 fmt = format_by_palette(VIDEO_PALETTE_RGB32);
2400 fmt = format_by_palette(VIDEO_PALETTE_RGB555);
2407 goto fh_unlock_and_return;
2411 btv->init.ovfmt = fmt;
2412 btv->init.fmt = fmt;
2413 btv->fbuf.base = fbuf->base;
2414 btv->fbuf.fmt.width = fbuf->width;
2415 btv->fbuf.fmt.height = fbuf->height;
2416 if (fbuf->bytesperline)
2417 btv->fbuf.fmt.bytesperline = fbuf->bytesperline;
2419 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fbuf->depth/8;
2420 mutex_unlock(&fh->cap.lock);
2425 case VIDIOC_OVERLAY:
2427 struct bttv_buffer *new;
2432 if (NULL == btv->fbuf.base)
2434 if (!fh->ov.setup_ok) {
2435 dprintk("bttv%d: overlay: !setup_ok\n",btv->c.nr);
2440 if (!check_alloc_btres(btv,fh,RESOURCE_OVERLAY))
2443 mutex_lock(&fh->cap.lock);
2445 fh->ov.tvnorm = btv->tvnorm;
2446 new = videobuf_alloc(sizeof(*new));
2447 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2453 retval = bttv_switch_overlay(btv,fh,new);
2454 mutex_unlock(&fh->cap.lock);
2460 struct video_mbuf *mbuf = arg;
2463 mutex_lock(&fh->cap.lock);
2464 retval = videobuf_mmap_setup(&fh->cap,gbuffers,gbufsize,
2467 goto fh_unlock_and_return;
2468 memset(mbuf,0,sizeof(*mbuf));
2469 mbuf->frames = gbuffers;
2470 mbuf->size = gbuffers * gbufsize;
2471 for (i = 0; i < gbuffers; i++)
2472 mbuf->offsets[i] = i * gbufsize;
2473 mutex_unlock(&fh->cap.lock);
2476 case VIDIOCMCAPTURE:
2478 struct video_mmap *vm = arg;
2479 struct bttv_buffer *buf;
2480 enum v4l2_field field;
2482 if (vm->frame >= VIDEO_MAX_FRAME)
2485 mutex_lock(&fh->cap.lock);
2487 buf = (struct bttv_buffer *)fh->cap.bufs[vm->frame];
2489 goto fh_unlock_and_return;
2490 if (0 == buf->vb.baddr)
2491 goto fh_unlock_and_return;
2492 if (buf->vb.state == STATE_QUEUED ||
2493 buf->vb.state == STATE_ACTIVE)
2494 goto fh_unlock_and_return;
2496 field = (vm->height > bttv_tvnorms[btv->tvnorm].sheight/2)
2497 ? V4L2_FIELD_INTERLACED
2498 : V4L2_FIELD_BOTTOM;
2499 retval = bttv_prepare_buffer(btv,buf,
2500 format_by_palette(vm->format),
2501 vm->width,vm->height,field);
2503 goto fh_unlock_and_return;
2504 spin_lock_irqsave(&btv->s_lock,flags);
2505 buffer_queue(&fh->cap,&buf->vb);
2506 spin_unlock_irqrestore(&btv->s_lock,flags);
2507 mutex_unlock(&fh->cap.lock);
2513 struct bttv_buffer *buf;
2515 if (*frame >= VIDEO_MAX_FRAME)
2518 mutex_lock(&fh->cap.lock);
2520 buf = (struct bttv_buffer *)fh->cap.bufs[*frame];
2522 goto fh_unlock_and_return;
2523 retval = videobuf_waiton(&buf->vb,0,1);
2525 goto fh_unlock_and_return;
2526 switch (buf->vb.state) {
2531 videobuf_dma_pci_sync(btv->c.pci,&buf->vb.dma);
2532 bttv_dma_free(btv,buf);
2538 mutex_unlock(&fh->cap.lock);
2544 struct vbi_format *fmt = (void *) arg;
2545 struct v4l2_format fmt2;
2547 if (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE) {
2548 retval = bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2552 bttv_vbi_get_fmt(fh, &fmt2);
2554 memset(fmt,0,sizeof(*fmt));
2555 fmt->sampling_rate = fmt2.fmt.vbi.sampling_rate;
2556 fmt->samples_per_line = fmt2.fmt.vbi.samples_per_line;
2557 fmt->sample_format = VIDEO_PALETTE_RAW;
2558 fmt->start[0] = fmt2.fmt.vbi.start[0];
2559 fmt->count[0] = fmt2.fmt.vbi.count[0];
2560 fmt->start[1] = fmt2.fmt.vbi.start[1];
2561 fmt->count[1] = fmt2.fmt.vbi.count[1];
2562 if (fmt2.fmt.vbi.flags & V4L2_VBI_UNSYNC)
2563 fmt->flags |= VBI_UNSYNC;
2564 if (fmt2.fmt.vbi.flags & V4L2_VBI_INTERLACED)
2565 fmt->flags |= VBI_INTERLACED;
2570 struct vbi_format *fmt = (void *) arg;
2571 struct v4l2_format fmt2;
2573 retval = bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2576 bttv_vbi_get_fmt(fh, &fmt2);
2578 if (fmt->sampling_rate != fmt2.fmt.vbi.sampling_rate ||
2579 fmt->samples_per_line != fmt2.fmt.vbi.samples_per_line ||
2580 fmt->sample_format != VIDEO_PALETTE_RAW ||
2581 fmt->start[0] != fmt2.fmt.vbi.start[0] ||
2582 fmt->start[1] != fmt2.fmt.vbi.start[1] ||
2583 fmt->count[0] != fmt->count[1] ||
2584 fmt->count[0] < 1 ||
2585 fmt->count[0] > 32 /* VBI_MAXLINES */)
2588 bttv_vbi_setlines(fh,btv,fmt->count[0]);
2601 return bttv_common_ioctls(btv,cmd,arg);
2603 /* *** v4l2 *** ************************************************ */
2604 case VIDIOC_QUERYCAP:
2606 struct v4l2_capability *cap = arg;
2610 memset(cap, 0, sizeof (*cap));
2611 strlcpy(cap->driver, "bttv", sizeof (cap->driver));
2612 strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card));
2613 snprintf(cap->bus_info, sizeof (cap->bus_info),
2614 "PCI:%s", pci_name(btv->c.pci));
2615 cap->version = BTTV_VERSION_CODE;
2617 V4L2_CAP_VIDEO_CAPTURE |
2618 V4L2_CAP_VBI_CAPTURE |
2619 V4L2_CAP_READWRITE |
2621 if (no_overlay <= 0)
2622 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2624 if (bttv_tvcards[btv->c.type].tuner != UNSET &&
2625 bttv_tvcards[btv->c.type].tuner != TUNER_ABSENT)
2626 cap->capabilities |= V4L2_CAP_TUNER;
2630 case VIDIOC_ENUM_FMT:
2632 struct v4l2_fmtdesc *f = arg;
2633 enum v4l2_buf_type type;
2638 if (V4L2_BUF_TYPE_VBI_CAPTURE == type) {
2643 memset(f,0,sizeof(*f));
2646 f->pixelformat = V4L2_PIX_FMT_GREY;
2647 strcpy(f->description,"vbi data");
2651 /* video capture + overlay */
2653 for (i = 0; i < BTTV_FORMATS; i++) {
2654 if (bttv_formats[i].fourcc != -1)
2656 if ((unsigned int)index == f->index)
2659 if (BTTV_FORMATS == i)
2663 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2665 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2666 if (!(bttv_formats[i].flags & FORMAT_FLAGS_PACKED))
2672 memset(f,0,sizeof(*f));
2675 f->pixelformat = bttv_formats[i].fourcc;
2676 strlcpy(f->description,bttv_formats[i].name,sizeof(f->description));
2680 case VIDIOC_TRY_FMT:
2682 struct v4l2_format *f = arg;
2683 return bttv_try_fmt(fh,btv,f);
2687 struct v4l2_format *f = arg;
2688 return bttv_g_fmt(fh,f);
2692 struct v4l2_format *f = arg;
2693 return bttv_s_fmt(fh,btv,f);
2698 struct v4l2_framebuffer *fb = arg;
2701 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2703 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2708 struct v4l2_framebuffer *fb = arg;
2709 const struct bttv_format *fmt;
2711 if(!capable(CAP_SYS_ADMIN) &&
2712 !capable(CAP_SYS_RAWIO))
2716 fmt = format_by_fourcc(fb->fmt.pixelformat);
2719 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2722 mutex_lock(&fh->cap.lock);
2724 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2725 if (fb->fmt.width > bttv_tvnorms[btv->tvnorm].swidth)
2726 goto fh_unlock_and_return;
2727 if (fb->fmt.height > bttv_tvnorms[btv->tvnorm].sheight)
2728 goto fh_unlock_and_return;
2732 btv->fbuf.base = fb->base;
2733 btv->fbuf.fmt.width = fb->fmt.width;
2734 btv->fbuf.fmt.height = fb->fmt.height;
2735 if (0 != fb->fmt.bytesperline)
2736 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2738 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2742 btv->init.ovfmt = fmt;
2743 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2746 fh->ov.w.width = fb->fmt.width;
2747 fh->ov.w.height = fb->fmt.height;
2748 btv->init.ov.w.width = fb->fmt.width;
2749 btv->init.ov.w.height = fb->fmt.height;
2750 kfree(fh->ov.clips);
2751 fh->ov.clips = NULL;
2754 if (check_btres(fh, RESOURCE_OVERLAY)) {
2755 struct bttv_buffer *new;
2757 new = videobuf_alloc(sizeof(*new));
2758 bttv_overlay_risc(btv,&fh->ov,fh->ovfmt,new);
2759 retval = bttv_switch_overlay(btv,fh,new);
2762 mutex_unlock(&fh->cap.lock);
2766 case VIDIOC_REQBUFS:
2767 return videobuf_reqbufs(bttv_queue(fh),arg);
2769 case VIDIOC_QUERYBUF:
2770 return videobuf_querybuf(bttv_queue(fh),arg);
2773 return videobuf_qbuf(bttv_queue(fh),arg);
2776 return videobuf_dqbuf(bttv_queue(fh),arg,
2777 file->f_flags & O_NONBLOCK);
2779 case VIDIOC_STREAMON:
2781 int res = bttv_resource(fh);
2783 if (!check_alloc_btres(btv,fh,res))
2785 return videobuf_streamon(bttv_queue(fh));
2787 case VIDIOC_STREAMOFF:
2789 int res = bttv_resource(fh);
2791 retval = videobuf_streamoff(bttv_queue(fh));
2794 free_btres(btv,fh,res);
2798 case VIDIOC_QUERYCTRL:
2800 struct v4l2_queryctrl *c = arg;
2803 if ((c->id < V4L2_CID_BASE ||
2804 c->id >= V4L2_CID_LASTP1) &&
2805 (c->id < V4L2_CID_PRIVATE_BASE ||
2806 c->id >= V4L2_CID_PRIVATE_LASTP1))
2808 for (i = 0; i < BTTV_CTLS; i++)
2809 if (bttv_ctls[i].id == c->id)
2811 if (i == BTTV_CTLS) {
2816 if (i >= 4 && i <= 8) {
2817 struct video_audio va;
2818 memset(&va,0,sizeof(va));
2819 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
2820 if (btv->audio_hook)
2821 btv->audio_hook(btv,&va,0);
2822 switch (bttv_ctls[i].id) {
2823 case V4L2_CID_AUDIO_VOLUME:
2824 if (!(va.flags & VIDEO_AUDIO_VOLUME))
2827 case V4L2_CID_AUDIO_BALANCE:
2828 if (!(va.flags & VIDEO_AUDIO_BALANCE))
2831 case V4L2_CID_AUDIO_BASS:
2832 if (!(va.flags & VIDEO_AUDIO_BASS))
2835 case V4L2_CID_AUDIO_TREBLE:
2836 if (!(va.flags & VIDEO_AUDIO_TREBLE))
2844 return get_control(btv,arg);
2846 return set_control(btv,arg);
2849 struct v4l2_streamparm *parm = arg;
2850 struct v4l2_standard s;
2851 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2853 memset(parm,0,sizeof(*parm));
2854 v4l2_video_std_construct(&s, bttv_tvnorms[btv->tvnorm].v4l2_id,
2855 bttv_tvnorms[btv->tvnorm].name);
2856 parm->parm.capture.timeperframe = s.frameperiod;
2860 case VIDIOC_G_PRIORITY:
2862 enum v4l2_priority *p = arg;
2864 *p = v4l2_prio_max(&btv->prio);
2867 case VIDIOC_S_PRIORITY:
2869 enum v4l2_priority *prio = arg;
2871 return v4l2_prio_change(&btv->prio, &fh->prio, *prio);
2874 case VIDIOC_ENUMSTD:
2877 case VIDIOC_ENUMINPUT:
2878 case VIDIOC_G_INPUT:
2879 case VIDIOC_S_INPUT:
2880 case VIDIOC_G_TUNER:
2881 case VIDIOC_S_TUNER:
2882 case VIDIOC_G_FREQUENCY:
2883 case VIDIOC_S_FREQUENCY:
2884 case VIDIOC_LOG_STATUS:
2885 return bttv_common_ioctls(btv,cmd,arg);
2888 return -ENOIOCTLCMD;
2892 fh_unlock_and_return:
2893 mutex_unlock(&fh->cap.lock);
2897 static int bttv_ioctl(struct inode *inode, struct file *file,
2898 unsigned int cmd, unsigned long arg)
2900 struct bttv_fh *fh = file->private_data;
2904 bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2905 return fh->lines * 2 * 2048;
2907 return video_usercopy(inode, file, cmd, arg, bttv_do_ioctl);
2911 static ssize_t bttv_read(struct file *file, char __user *data,
2912 size_t count, loff_t *ppos)
2914 struct bttv_fh *fh = file->private_data;
2917 if (fh->btv->errors)
2918 bttv_reinit_bt848(fh->btv);
2919 dprintk("bttv%d: read count=%d type=%s\n",
2920 fh->btv->c.nr,(int)count,v4l2_type_names[fh->type]);
2923 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2924 if (locked_btres(fh->btv,RESOURCE_VIDEO))
2926 retval = videobuf_read_one(&fh->cap, data, count, ppos,
2927 file->f_flags & O_NONBLOCK);
2929 case V4L2_BUF_TYPE_VBI_CAPTURE:
2930 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
2932 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
2933 file->f_flags & O_NONBLOCK);
2941 static unsigned int bttv_poll(struct file *file, poll_table *wait)
2943 struct bttv_fh *fh = file->private_data;
2944 struct bttv_buffer *buf;
2945 enum v4l2_field field;
2947 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2948 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
2950 return videobuf_poll_stream(file, &fh->vbi, wait);
2953 if (check_btres(fh,RESOURCE_VIDEO)) {
2954 /* streaming capture */
2955 if (list_empty(&fh->cap.stream))
2957 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
2959 /* read() capture */
2960 mutex_lock(&fh->cap.lock);
2961 if (NULL == fh->cap.read_buf) {
2962 /* need to capture a new frame */
2963 if (locked_btres(fh->btv,RESOURCE_VIDEO)) {
2964 mutex_unlock(&fh->cap.lock);
2967 fh->cap.read_buf = videobuf_alloc(fh->cap.msize);
2968 if (NULL == fh->cap.read_buf) {
2969 mutex_unlock(&fh->cap.lock);
2972 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
2973 field = videobuf_next_field(&fh->cap);
2974 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
2975 kfree (fh->cap.read_buf);
2976 fh->cap.read_buf = NULL;
2977 mutex_unlock(&fh->cap.lock);
2980 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
2981 fh->cap.read_off = 0;
2983 mutex_unlock(&fh->cap.lock);
2984 buf = (struct bttv_buffer*)fh->cap.read_buf;
2987 poll_wait(file, &buf->vb.done, wait);
2988 if (buf->vb.state == STATE_DONE ||
2989 buf->vb.state == STATE_ERROR)
2990 return POLLIN|POLLRDNORM;
2994 static int bttv_open(struct inode *inode, struct file *file)
2996 int minor = iminor(inode);
2997 struct bttv *btv = NULL;
2999 enum v4l2_buf_type type = 0;
3002 dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
3004 for (i = 0; i < bttv_num; i++) {
3005 if (bttvs[i].video_dev &&
3006 bttvs[i].video_dev->minor == minor) {
3008 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3011 if (bttvs[i].vbi_dev &&
3012 bttvs[i].vbi_dev->minor == minor) {
3014 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3021 dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
3022 btv->c.nr,v4l2_type_names[type]);
3024 /* allocate per filehandle data */
3025 fh = kmalloc(sizeof(*fh),GFP_KERNEL);
3028 file->private_data = fh;
3031 fh->ov.setup_ok = 0;
3032 v4l2_prio_open(&btv->prio,&fh->prio);
3034 videobuf_queue_init(&fh->cap, &bttv_video_qops,
3035 btv->c.pci, &btv->s_lock,
3036 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3037 V4L2_FIELD_INTERLACED,
3038 sizeof(struct bttv_buffer),
3040 videobuf_queue_init(&fh->vbi, &bttv_vbi_qops,
3041 btv->c.pci, &btv->s_lock,
3042 V4L2_BUF_TYPE_VBI_CAPTURE,
3044 sizeof(struct bttv_buffer),
3046 i2c_vidiocschan(btv);
3049 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)
3050 bttv_vbi_setlines(fh,btv,16);
3051 bttv_field_count(btv);
3055 static int bttv_release(struct inode *inode, struct file *file)
3057 struct bttv_fh *fh = file->private_data;
3058 struct bttv *btv = fh->btv;
3060 /* turn off overlay */
3061 if (check_btres(fh, RESOURCE_OVERLAY))
3062 bttv_switch_overlay(btv,fh,NULL);
3064 /* stop video capture */
3065 if (check_btres(fh, RESOURCE_VIDEO)) {
3066 videobuf_streamoff(&fh->cap);
3067 free_btres(btv,fh,RESOURCE_VIDEO);
3069 if (fh->cap.read_buf) {
3070 buffer_release(&fh->cap,fh->cap.read_buf);
3071 kfree(fh->cap.read_buf);
3074 /* stop vbi capture */
3075 if (check_btres(fh, RESOURCE_VBI)) {
3076 if (fh->vbi.streaming)
3077 videobuf_streamoff(&fh->vbi);
3078 if (fh->vbi.reading)
3079 videobuf_read_stop(&fh->vbi);
3080 free_btres(btv,fh,RESOURCE_VBI);
3084 videobuf_mmap_free(&fh->cap);
3085 videobuf_mmap_free(&fh->vbi);
3086 v4l2_prio_close(&btv->prio,&fh->prio);
3087 file->private_data = NULL;
3091 bttv_field_count(btv);
3096 bttv_mmap(struct file *file, struct vm_area_struct *vma)
3098 struct bttv_fh *fh = file->private_data;
3100 dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
3101 fh->btv->c.nr, v4l2_type_names[fh->type],
3102 vma->vm_start, vma->vm_end - vma->vm_start);
3103 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3106 static struct file_operations bttv_fops =
3108 .owner = THIS_MODULE,
3110 .release = bttv_release,
3111 .ioctl = bttv_ioctl,
3112 .compat_ioctl = v4l_compat_ioctl32,
3113 .llseek = no_llseek,
3119 static struct video_device bttv_video_template =
3122 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|
3123 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
3124 .hardware = VID_HARDWARE_BT848,
3129 static struct video_device bttv_vbi_template =
3131 .name = "bt848/878 vbi",
3132 .type = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
3133 .hardware = VID_HARDWARE_BT848,
3138 /* ----------------------------------------------------------------------- */
3139 /* radio interface */
3141 static int radio_open(struct inode *inode, struct file *file)
3143 int minor = iminor(inode);
3144 struct bttv *btv = NULL;
3147 dprintk("bttv: open minor=%d\n",minor);
3149 for (i = 0; i < bttv_num; i++) {
3150 if (bttvs[i].radio_dev->minor == minor) {
3158 dprintk("bttv%d: open called (radio)\n",btv->c.nr);
3159 mutex_lock(&btv->lock);
3163 file->private_data = btv;
3165 bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
3166 audio_mux(btv,AUDIO_RADIO);
3168 mutex_unlock(&btv->lock);
3172 static int radio_release(struct inode *inode, struct file *file)
3174 struct bttv *btv = file->private_data;
3175 struct rds_command cmd;
3179 bttv_call_i2c_clients(btv, RDS_CMD_CLOSE, &cmd);
3184 static int radio_do_ioctl(struct inode *inode, struct file *file,
3185 unsigned int cmd, void *arg)
3187 struct bttv *btv = file->private_data;
3192 struct video_capability *cap = arg;
3194 memset(cap,0,sizeof(*cap));
3195 strcpy(cap->name,btv->radio_dev->name);
3196 cap->type = VID_TYPE_TUNER;
3204 struct video_tuner *v = arg;
3208 memset(v,0,sizeof(*v));
3209 strcpy(v->name, "Radio");
3210 bttv_call_i2c_clients(btv,cmd,v);
3222 case VIDIOC_LOG_STATUS:
3223 return bttv_common_ioctls(btv,cmd,arg);
3226 return -ENOIOCTLCMD;
3231 static int radio_ioctl(struct inode *inode, struct file *file,
3232 unsigned int cmd, unsigned long arg)
3234 return video_usercopy(inode, file, cmd, arg, radio_do_ioctl);
3237 static ssize_t radio_read(struct file *file, char __user *data,
3238 size_t count, loff_t *ppos)
3240 struct bttv *btv = file->private_data;
3241 struct rds_command cmd;
3242 cmd.block_count = count/3;
3244 cmd.instance = file;
3245 cmd.result = -ENODEV;
3247 bttv_call_i2c_clients(btv, RDS_CMD_READ, &cmd);
3252 static unsigned int radio_poll(struct file *file, poll_table *wait)
3254 struct bttv *btv = file->private_data;
3255 struct rds_command cmd;
3256 cmd.instance = file;
3257 cmd.event_list = wait;
3258 cmd.result = -ENODEV;
3259 bttv_call_i2c_clients(btv, RDS_CMD_POLL, &cmd);
3264 static struct file_operations radio_fops =
3266 .owner = THIS_MODULE,
3269 .release = radio_release,
3270 .ioctl = radio_ioctl,
3271 .llseek = no_llseek,
3275 static struct video_device radio_template =
3277 .name = "bt848/878 radio",
3278 .type = VID_TYPE_TUNER,
3279 .hardware = VID_HARDWARE_BT848,
3280 .fops = &radio_fops,
3284 /* ----------------------------------------------------------------------- */
3285 /* some debug code */
3287 static int bttv_risc_decode(u32 risc)
3289 static char *instr[16] = {
3290 [ BT848_RISC_WRITE >> 28 ] = "write",
3291 [ BT848_RISC_SKIP >> 28 ] = "skip",
3292 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3293 [ BT848_RISC_JUMP >> 28 ] = "jump",
3294 [ BT848_RISC_SYNC >> 28 ] = "sync",
3295 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3296 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3297 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3299 static int incr[16] = {
3300 [ BT848_RISC_WRITE >> 28 ] = 2,
3301 [ BT848_RISC_JUMP >> 28 ] = 2,
3302 [ BT848_RISC_SYNC >> 28 ] = 2,
3303 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3304 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3305 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3307 static char *bits[] = {
3308 "be0", "be1", "be2", "be3/resync",
3309 "set0", "set1", "set2", "set3",
3310 "clr0", "clr1", "clr2", "clr3",
3311 "irq", "res", "eol", "sol",
3315 printk("0x%08x [ %s", risc,
3316 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3317 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3318 if (risc & (1 << (i + 12)))
3319 printk(" %s",bits[i]);
3320 printk(" count=%d ]\n", risc & 0xfff);
3321 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3324 static void bttv_risc_disasm(struct bttv *btv,
3325 struct btcx_riscmem *risc)
3329 printk("%s: risc disasm: %p [dma=0x%08lx]\n",
3330 btv->c.name, risc->cpu, (unsigned long)risc->dma);
3331 for (i = 0; i < (risc->size >> 2); i += n) {
3332 printk("%s: 0x%lx: ", btv->c.name,
3333 (unsigned long)(risc->dma + (i<<2)));
3334 n = bttv_risc_decode(risc->cpu[i]);
3335 for (j = 1; j < n; j++)
3336 printk("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3337 btv->c.name, (unsigned long)(risc->dma + ((i+j)<<2)),
3339 if (0 == risc->cpu[i])
3344 static void bttv_print_riscaddr(struct bttv *btv)
3346 printk(" main: %08Lx\n",
3347 (unsigned long long)btv->main.dma);
3348 printk(" vbi : o=%08Lx e=%08Lx\n",
3349 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3350 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3351 printk(" cap : o=%08Lx e=%08Lx\n",
3352 btv->curr.top ? (unsigned long long)btv->curr.top->top.dma : 0,
3353 btv->curr.bottom ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3354 printk(" scr : o=%08Lx e=%08Lx\n",
3355 btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3356 btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3357 bttv_risc_disasm(btv, &btv->main);
3360 /* ----------------------------------------------------------------------- */
3363 static char *irq_name[] = {
3364 "FMTCHG", // format change detected (525 vs. 625)
3365 "VSYNC", // vertical sync (new field)
3366 "HSYNC", // horizontal sync
3367 "OFLOW", // chroma/luma AGC overflow
3368 "HLOCK", // horizontal lock changed
3369 "VPRES", // video presence changed
3371 "I2CDONE", // hw irc operation finished
3372 "GPINT", // gpio port triggered irq
3374 "RISCI", // risc instruction triggered irq
3375 "FBUS", // pixel data fifo dropped data (high pci bus latencies)
3376 "FTRGT", // pixel data fifo overrun
3377 "FDSR", // fifo data stream resyncronisation
3378 "PPERR", // parity error (data transfer)
3379 "RIPERR", // parity error (read risc instructions)
3380 "PABORT", // pci abort
3381 "OCERR", // risc instruction error
3382 "SCERR", // syncronisation error
3385 static void bttv_print_irqbits(u32 print, u32 mark)
3390 for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3391 if (print & (1 << i))
3392 printk(" %s",irq_name[i]);
3393 if (mark & (1 << i))
3398 static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3400 printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3402 (unsigned long)btv->main.dma,
3403 (unsigned long)btv->main.cpu[RISC_SLOT_O_VBI+1],
3404 (unsigned long)btv->main.cpu[RISC_SLOT_O_FIELD+1],
3407 if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3408 printk("bttv%d: Oh, there (temporarely?) is no input signal. "
3409 "Ok, then this is harmless, don't worry ;)\n",
3413 printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
3415 printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
3421 bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3423 struct bttv_buffer *item;
3425 memset(set,0,sizeof(*set));
3427 /* capture request ? */
3428 if (!list_empty(&btv->capture)) {
3430 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3431 if (V4L2_FIELD_HAS_TOP(item->vb.field))
3433 if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3436 /* capture request for other field ? */
3437 if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3438 (item->vb.queue.next != &btv->capture)) {
3439 item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3440 if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3441 if (NULL == set->top &&
3442 V4L2_FIELD_TOP == item->vb.field) {
3445 if (NULL == set->bottom &&
3446 V4L2_FIELD_BOTTOM == item->vb.field) {
3449 if (NULL != set->top && NULL != set->bottom)
3455 /* screen overlay ? */
3456 if (NULL != btv->screen) {
3457 if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3458 if (NULL == set->top && NULL == set->bottom) {
3459 set->top = btv->screen;
3460 set->bottom = btv->screen;
3463 if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3465 set->top = btv->screen;
3467 if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3468 NULL == set->bottom) {
3469 set->bottom = btv->screen;
3474 dprintk("bttv%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3475 btv->c.nr,set->top, set->bottom,
3476 btv->screen,set->frame_irq,set->top_irq);
3481 bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3482 struct bttv_buffer_set *curr, unsigned int state)
3486 do_gettimeofday(&ts);
3488 if (wakeup->top == wakeup->bottom) {
3489 if (NULL != wakeup->top && curr->top != wakeup->top) {
3491 printk("bttv%d: wakeup: both=%p\n",btv->c.nr,wakeup->top);
3492 wakeup->top->vb.ts = ts;
3493 wakeup->top->vb.field_count = btv->field_count;
3494 wakeup->top->vb.state = state;
3495 wake_up(&wakeup->top->vb.done);
3498 if (NULL != wakeup->top && curr->top != wakeup->top) {
3500 printk("bttv%d: wakeup: top=%p\n",btv->c.nr,wakeup->top);
3501 wakeup->top->vb.ts = ts;
3502 wakeup->top->vb.field_count = btv->field_count;
3503 wakeup->top->vb.state = state;
3504 wake_up(&wakeup->top->vb.done);
3506 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3508 printk("bttv%d: wakeup: bottom=%p\n",btv->c.nr,wakeup->bottom);
3509 wakeup->bottom->vb.ts = ts;
3510 wakeup->bottom->vb.field_count = btv->field_count;
3511 wakeup->bottom->vb.state = state;
3512 wake_up(&wakeup->bottom->vb.done);
3518 bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3526 do_gettimeofday(&ts);
3528 wakeup->vb.field_count = btv->field_count;
3529 wakeup->vb.state = state;
3530 wake_up(&wakeup->vb.done);
3533 static void bttv_irq_timeout(unsigned long data)
3535 struct bttv *btv = (struct bttv *)data;
3536 struct bttv_buffer_set old,new;
3537 struct bttv_buffer *ovbi;
3538 struct bttv_buffer *item;
3539 unsigned long flags;
3542 printk(KERN_INFO "bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3543 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3544 btread(BT848_RISC_COUNT));
3545 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3549 spin_lock_irqsave(&btv->s_lock,flags);
3551 /* deactivate stuff */
3552 memset(&new,0,sizeof(new));
3558 bttv_buffer_activate_video(btv, &new);
3559 bttv_buffer_activate_vbi(btv, NULL);
3560 bttv_set_dma(btv, 0);
3563 bttv_irq_wakeup_video(btv, &old, &new, STATE_ERROR);
3564 bttv_irq_wakeup_vbi(btv, ovbi, STATE_ERROR);
3566 /* cancel all outstanding capture / vbi requests */
3567 while (!list_empty(&btv->capture)) {
3568 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3569 list_del(&item->vb.queue);
3570 item->vb.state = STATE_ERROR;
3571 wake_up(&item->vb.done);
3573 while (!list_empty(&btv->vcapture)) {
3574 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3575 list_del(&item->vb.queue);
3576 item->vb.state = STATE_ERROR;
3577 wake_up(&item->vb.done);
3581 spin_unlock_irqrestore(&btv->s_lock,flags);
3585 bttv_irq_wakeup_top(struct bttv *btv)
3587 struct bttv_buffer *wakeup = btv->curr.top;
3592 spin_lock(&btv->s_lock);
3593 btv->curr.top_irq = 0;
3594 btv->curr.top = NULL;
3595 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3597 do_gettimeofday(&wakeup->vb.ts);
3598 wakeup->vb.field_count = btv->field_count;
3599 wakeup->vb.state = STATE_DONE;
3600 wake_up(&wakeup->vb.done);
3601 spin_unlock(&btv->s_lock);
3604 static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3608 if (rc > risc->dma + risc->size)
3614 bttv_irq_switch_video(struct bttv *btv)
3616 struct bttv_buffer_set new;
3617 struct bttv_buffer_set old;
3620 spin_lock(&btv->s_lock);
3622 /* new buffer set */
3623 bttv_irq_next_video(btv, &new);
3624 rc = btread(BT848_RISC_COUNT);
3625 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3626 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3629 bttv_irq_debug_low_latency(btv, rc);
3630 spin_unlock(&btv->s_lock);
3637 btv->loop_irq &= ~1;
3638 bttv_buffer_activate_video(btv, &new);
3639 bttv_set_dma(btv, 0);
3642 if (UNSET != btv->new_input) {
3643 video_mux(btv,btv->new_input);
3644 btv->new_input = UNSET;
3647 /* wake up finished buffers */
3648 bttv_irq_wakeup_video(btv, &old, &new, STATE_DONE);
3649 spin_unlock(&btv->s_lock);
3653 bttv_irq_switch_vbi(struct bttv *btv)
3655 struct bttv_buffer *new = NULL;
3656 struct bttv_buffer *old;
3659 spin_lock(&btv->s_lock);
3661 if (!list_empty(&btv->vcapture))
3662 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3665 rc = btread(BT848_RISC_COUNT);
3666 if (NULL != old && (is_active(&old->top, rc) ||
3667 is_active(&old->bottom, rc))) {
3670 bttv_irq_debug_low_latency(btv, rc);
3671 spin_unlock(&btv->s_lock);
3677 btv->loop_irq &= ~4;
3678 bttv_buffer_activate_vbi(btv, new);
3679 bttv_set_dma(btv, 0);
3681 bttv_irq_wakeup_vbi(btv, old, STATE_DONE);
3682 spin_unlock(&btv->s_lock);
3685 static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs)
3693 btv=(struct bttv *)dev_id;
3695 if (btv->custom_irq)
3696 handled = btv->custom_irq(btv);
3700 /* get/clear interrupt status bits */
3701 stat=btread(BT848_INT_STAT);
3702 astat=stat&btread(BT848_INT_MASK);
3706 btwrite(stat,BT848_INT_STAT);
3708 /* get device status bits */
3709 dstat=btread(BT848_DSTATUS);
3712 printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d "
3713 "riscs=%x, riscc=%08x, ",
3714 btv->c.nr, count, btv->field_count,
3715 stat>>28, btread(BT848_RISC_COUNT));
3716 bttv_print_irqbits(stat,astat);
3717 if (stat & BT848_INT_HLOCK)
3718 printk(" HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
3720 if (stat & BT848_INT_VPRES)
3721 printk(" PRES => %s", (dstat & BT848_DSTATUS_PRES)
3723 if (stat & BT848_INT_FMTCHG)
3724 printk(" NUML => %s", (dstat & BT848_DSTATUS_NUML)
3729 if (astat&BT848_INT_VSYNC)
3732 if ((astat & BT848_INT_GPINT) && btv->remote) {
3733 wake_up(&btv->gpioq);
3734 bttv_input_irq(btv);
3737 if (astat & BT848_INT_I2CDONE) {
3738 btv->i2c_done = stat;
3739 wake_up(&btv->i2c_queue);
3742 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
3743 bttv_irq_switch_vbi(btv);
3745 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
3746 bttv_irq_wakeup_top(btv);
3748 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
3749 bttv_irq_switch_video(btv);
3751 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
3754 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
3755 printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->c.nr,
3756 (astat & BT848_INT_SCERR) ? "SCERR" : "",
3757 (astat & BT848_INT_OCERR) ? "OCERR" : "",
3758 btread(BT848_RISC_COUNT));
3759 bttv_print_irqbits(stat,astat);
3762 bttv_print_riscaddr(btv);
3764 if (fdsr && astat & BT848_INT_FDSR) {
3765 printk(KERN_INFO "bttv%d: FDSR @ %08x\n",
3766 btv->c.nr,btread(BT848_RISC_COUNT));
3768 bttv_print_riscaddr(btv);
3774 if (count > 8 || !(astat & BT848_INT_GPINT)) {
3775 btwrite(0, BT848_INT_MASK);
3778 "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr);
3781 "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv->c.nr);
3783 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
3787 bttv_print_irqbits(stat,astat);
3795 return IRQ_RETVAL(handled);
3799 /* ----------------------------------------------------------------------- */
3800 /* initialitation */
3802 static struct video_device *vdev_init(struct bttv *btv,
3803 struct video_device *template,
3806 struct video_device *vfd;
3808 vfd = video_device_alloc();
3813 vfd->dev = &btv->c.pci->dev;
3814 vfd->release = video_device_release;
3815 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
3816 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
3817 type, bttv_tvcards[btv->c.type].name);
3821 static void bttv_unregister_video(struct bttv *btv)
3823 if (btv->video_dev) {
3824 if (-1 != btv->video_dev->minor)
3825 video_unregister_device(btv->video_dev);
3827 video_device_release(btv->video_dev);
3828 btv->video_dev = NULL;
3831 if (-1 != btv->vbi_dev->minor)
3832 video_unregister_device(btv->vbi_dev);
3834 video_device_release(btv->vbi_dev);
3835 btv->vbi_dev = NULL;
3837 if (btv->radio_dev) {
3838 if (-1 != btv->radio_dev->minor)
3839 video_unregister_device(btv->radio_dev);
3841 video_device_release(btv->radio_dev);
3842 btv->radio_dev = NULL;
3846 /* register video4linux devices */
3847 static int __devinit bttv_register_video(struct bttv *btv)
3849 if (no_overlay <= 0) {
3850 bttv_video_template.type |= VID_TYPE_OVERLAY;
3852 printk("bttv: Overlay support disabled.\n");
3856 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
3857 if (NULL == btv->video_dev)
3859 if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0)
3861 printk(KERN_INFO "bttv%d: registered device video%d\n",
3862 btv->c.nr,btv->video_dev->minor & 0x1f);
3863 video_device_create_file(btv->video_dev, &class_device_attr_card);
3866 btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
3867 if (NULL == btv->vbi_dev)
3869 if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0)
3871 printk(KERN_INFO "bttv%d: registered device vbi%d\n",
3872 btv->c.nr,btv->vbi_dev->minor & 0x1f);
3874 if (!btv->has_radio)
3877 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
3878 if (NULL == btv->radio_dev)
3880 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0)
3882 printk(KERN_INFO "bttv%d: registered device radio%d\n",
3883 btv->c.nr,btv->radio_dev->minor & 0x1f);
3889 bttv_unregister_video(btv);
3894 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
3895 /* response on cards with no firmware is not enabled by OF */
3896 static void pci_set_command(struct pci_dev *dev)
3898 #if defined(__powerpc__)
3901 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
3902 cmd = (cmd | PCI_COMMAND_MEMORY );
3903 pci_write_config_dword(dev, PCI_COMMAND, cmd);
3907 static int __devinit bttv_probe(struct pci_dev *dev,
3908 const struct pci_device_id *pci_id)
3914 if (bttv_num == BTTV_MAX)
3916 printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
3917 btv=&bttvs[bttv_num];
3918 memset(btv,0,sizeof(*btv));
3919 btv->c.nr = bttv_num;
3920 sprintf(btv->c.name,"bttv%d",btv->c.nr);
3922 /* initialize structs / fill in defaults */
3923 mutex_init(&btv->lock);
3924 mutex_init(&btv->reslock);
3925 spin_lock_init(&btv->s_lock);
3926 spin_lock_init(&btv->gpio_lock);
3927 init_waitqueue_head(&btv->gpioq);
3928 init_waitqueue_head(&btv->i2c_queue);
3929 INIT_LIST_HEAD(&btv->c.subs);
3930 INIT_LIST_HEAD(&btv->capture);
3931 INIT_LIST_HEAD(&btv->vcapture);
3932 v4l2_prio_init(&btv->prio);
3934 init_timer(&btv->timeout);
3935 btv->timeout.function = bttv_irq_timeout;
3936 btv->timeout.data = (unsigned long)btv;
3939 btv->tuner_type = UNSET;
3940 btv->new_input = UNSET;
3941 btv->has_radio=radio[btv->c.nr];
3943 /* pci stuff (init, get irq/mmio, ... */
3945 btv->id = dev->device;
3946 if (pci_enable_device(dev)) {
3947 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
3951 if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
3952 printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
3956 if (!request_mem_region(pci_resource_start(dev,0),
3957 pci_resource_len(dev,0),
3959 printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n",
3960 btv->c.nr, pci_resource_start(dev,0));
3963 pci_set_master(dev);
3964 pci_set_command(dev);
3965 pci_set_drvdata(dev,btv);
3967 pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
3968 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
3969 printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ",
3970 bttv_num,btv->id, btv->revision, pci_name(dev));
3971 printk("irq: %d, latency: %d, mmio: 0x%lx\n",
3972 btv->c.pci->irq, lat, pci_resource_start(dev,0));
3975 btv->bt848_mmio=ioremap(pci_resource_start(dev,0), 0x1000);
3976 if (NULL == ioremap(pci_resource_start(dev,0), 0x1000)) {
3977 printk("bttv%d: ioremap() failed\n", btv->c.nr);
3985 /* disable irqs, register irq handler */
3986 btwrite(0, BT848_INT_MASK);
3987 result = request_irq(btv->c.pci->irq, bttv_irq,
3988 SA_SHIRQ | SA_INTERRUPT,btv->c.name,(void *)btv);
3990 printk(KERN_ERR "bttv%d: can't get IRQ %d\n",
3991 bttv_num,btv->c.pci->irq);
3995 if (0 != bttv_handle_chipset(btv)) {
4000 /* init options from insmod args */
4001 btv->opt_combfilter = combfilter;
4002 btv->opt_lumafilter = lumafilter;
4003 btv->opt_automute = automute;
4004 btv->opt_chroma_agc = chroma_agc;
4005 btv->opt_adc_crush = adc_crush;
4006 btv->opt_vcr_hack = vcr_hack;
4007 btv->opt_whitecrush_upper = whitecrush_upper;
4008 btv->opt_whitecrush_lower = whitecrush_lower;
4009 btv->opt_uv_ratio = uv_ratio;
4010 btv->opt_full_luma_range = full_luma_range;
4011 btv->opt_coring = coring;
4013 /* fill struct bttv with some useful defaults */
4014 btv->init.btv = btv;
4015 btv->init.ov.w.width = 320;
4016 btv->init.ov.w.height = 240;
4017 btv->init.fmt = format_by_palette(VIDEO_PALETTE_RGB24);
4018 btv->init.width = 320;
4019 btv->init.height = 240;
4020 btv->init.lines = 16;
4023 /* initialize hardware */
4025 bttv_gpio_tracking(btv,"pre-init");
4027 bttv_risc_init_main(btv);
4031 btwrite(0x00, BT848_GPIO_REG_INP);
4032 btwrite(0x00, BT848_GPIO_OUT_EN);
4034 bttv_gpio_tracking(btv,"init");
4036 /* needs to be done before i2c is registered */
4037 bttv_init_card1(btv);
4039 /* register i2c + gpio */
4042 /* some card-specific stuff (needs working i2c) */
4043 bttv_init_card2(btv);
4046 /* register video4linux + input */
4047 if (!bttv_tvcards[btv->c.type].no_video) {
4048 bttv_register_video(btv);
4049 bt848_bright(btv,32768);
4050 bt848_contrast(btv,32768);
4051 bt848_hue(btv,32768);
4052 bt848_sat(btv,32768);
4053 audio_mux(btv,AUDIO_MUTE);
4057 /* add subdevices */
4058 if (bttv_tvcards[btv->c.type].has_dvb)
4059 bttv_sub_add_device(&btv->c, "dvb");
4061 bttv_input_init(btv);
4063 /* everything is fine */
4068 free_irq(btv->c.pci->irq,btv);
4071 if (btv->bt848_mmio)
4072 iounmap(btv->bt848_mmio);
4073 release_mem_region(pci_resource_start(btv->c.pci,0),
4074 pci_resource_len(btv->c.pci,0));
4075 pci_set_drvdata(dev,NULL);
4079 static void __devexit bttv_remove(struct pci_dev *pci_dev)
4081 struct bttv *btv = pci_get_drvdata(pci_dev);
4084 printk("bttv%d: unloading\n",btv->c.nr);
4086 /* shutdown everything (DMA+IRQs) */
4087 btand(~15, BT848_GPIO_DMA_CTL);
4088 btwrite(0, BT848_INT_MASK);
4089 btwrite(~0x0, BT848_INT_STAT);
4090 btwrite(0x0, BT848_GPIO_OUT_EN);
4092 bttv_gpio_tracking(btv,"cleanup");
4094 /* tell gpio modules we are leaving ... */
4096 wake_up(&btv->gpioq);
4097 bttv_input_fini(btv);
4098 bttv_sub_del_devices(&btv->c);
4100 /* unregister i2c_bus + input */
4103 /* unregister video4linux */
4104 bttv_unregister_video(btv);
4106 /* free allocated memory */
4107 btcx_riscmem_free(btv->c.pci,&btv->main);
4109 /* free ressources */
4110 free_irq(btv->c.pci->irq,btv);
4111 iounmap(btv->bt848_mmio);
4112 release_mem_region(pci_resource_start(btv->c.pci,0),
4113 pci_resource_len(btv->c.pci,0));
4115 pci_set_drvdata(pci_dev, NULL);
4119 static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4121 struct bttv *btv = pci_get_drvdata(pci_dev);
4122 struct bttv_buffer_set idle;
4123 unsigned long flags;
4125 dprintk("bttv%d: suspend %d\n", btv->c.nr, state.event);
4127 /* stop dma + irqs */
4128 spin_lock_irqsave(&btv->s_lock,flags);
4129 memset(&idle, 0, sizeof(idle));
4130 btv->state.video = btv->curr;
4131 btv->state.vbi = btv->cvbi;
4132 btv->state.loop_irq = btv->loop_irq;
4135 bttv_buffer_activate_video(btv, &idle);
4136 bttv_buffer_activate_vbi(btv, NULL);
4137 bttv_set_dma(btv, 0);
4138 btwrite(0, BT848_INT_MASK);
4139 spin_unlock_irqrestore(&btv->s_lock,flags);
4141 /* save bt878 state */
4142 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4143 btv->state.gpio_data = gpio_read();
4145 /* save pci state */
4146 pci_save_state(pci_dev);
4147 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4148 pci_disable_device(pci_dev);
4149 btv->state.disabled = 1;
4154 static int bttv_resume(struct pci_dev *pci_dev)
4156 struct bttv *btv = pci_get_drvdata(pci_dev);
4157 unsigned long flags;
4160 dprintk("bttv%d: resume\n", btv->c.nr);
4162 /* restore pci state */
4163 if (btv->state.disabled) {
4164 err=pci_enable_device(pci_dev);
4166 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4170 btv->state.disabled = 0;
4172 err=pci_set_power_state(pci_dev, PCI_D0);
4174 pci_disable_device(pci_dev);
4175 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4177 btv->state.disabled = 1;
4181 pci_restore_state(pci_dev);
4183 /* restore bt878 state */
4184 bttv_reinit_bt848(btv);
4185 gpio_inout(0xffffff, btv->state.gpio_enable);
4186 gpio_write(btv->state.gpio_data);
4189 spin_lock_irqsave(&btv->s_lock,flags);
4190 btv->curr = btv->state.video;
4191 btv->cvbi = btv->state.vbi;
4192 btv->loop_irq = btv->state.loop_irq;
4193 bttv_buffer_activate_video(btv, &btv->curr);
4194 bttv_buffer_activate_vbi(btv, btv->cvbi);
4195 bttv_set_dma(btv, 0);
4196 spin_unlock_irqrestore(&btv->s_lock,flags);
4200 static struct pci_device_id bttv_pci_tbl[] = {
4201 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848,
4202 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4203 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849,
4204 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4205 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878,
4206 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4207 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879,
4208 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4212 MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4214 static struct pci_driver bttv_pci_driver = {
4216 .id_table = bttv_pci_tbl,
4217 .probe = bttv_probe,
4218 .remove = __devexit_p(bttv_remove),
4219 .suspend = bttv_suspend,
4220 .resume = bttv_resume,
4223 static int bttv_init_module(void)
4227 printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
4228 (BTTV_VERSION_CODE >> 16) & 0xff,
4229 (BTTV_VERSION_CODE >> 8) & 0xff,
4230 BTTV_VERSION_CODE & 0xff);
4232 printk(KERN_INFO "bttv: snapshot date %04d-%02d-%02d\n",
4233 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
4235 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4237 if (gbufsize < 0 || gbufsize > BTTV_MAX_FBUF)
4238 gbufsize = BTTV_MAX_FBUF;
4239 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4241 printk(KERN_INFO "bttv: using %d buffers with %dk (%d pages) each for capture\n",
4242 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4244 bttv_check_chipset();
4246 bus_register(&bttv_sub_bus_type);
4247 return pci_register_driver(&bttv_pci_driver);
4250 static void bttv_cleanup_module(void)
4252 pci_unregister_driver(&bttv_pci_driver);
4253 bus_unregister(&bttv_sub_bus_type);
4257 module_init(bttv_init_module);
4258 module_exit(bttv_cleanup_module);