3 bttv - Bt848 frame grabber driver
5 Copyright (C) 1996,97,98 Ralph Metzler <rjkm@thp.uni-koeln.de>
6 & Marcus Metzler <mocm@thp.uni-koeln.de>
7 (c) 1999-2002 Gerd Knorr <kraxel@bytesex.org>
9 some v4l2 code lines are taken from Justin's bttv2 driver which is
10 (c) 2000 Justin Schoeman <justin@suntiger.ee.up.ac.za>
13 (c) 2005-2006 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
15 Fixes to be fully V4L2 compliant by
16 (c) 2006 Mauro Carvalho Chehab <mchehab@infradead.org>
18 Cropping and overscan support
19 Copyright (C) 2005, 2006 Michael H. Schimek <mschimek@gmx.at>
20 Sponsored by OPQ Systems AB
22 This program is free software; you can redistribute it and/or modify
23 it under the terms of the GNU General Public License as published by
24 the Free Software Foundation; either version 2 of the License, or
25 (at your option) any later version.
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
32 You should have received a copy of the GNU General Public License
33 along with this program; if not, write to the Free Software
34 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
37 #include <linux/init.h>
38 #include <linux/module.h>
39 #include <linux/delay.h>
40 #include <linux/slab.h>
41 #include <linux/errno.h>
43 #include <linux/kernel.h>
44 #include <linux/sched.h>
45 #include <linux/interrupt.h>
46 #include <linux/kdev_t.h>
48 #include <media/v4l2-common.h>
49 #include <media/v4l2-ioctl.h>
50 #include <media/tvaudio.h>
51 #include <media/msp3400.h>
53 #include <linux/dma-mapping.h>
56 #include <asm/byteorder.h>
58 #include <media/saa6588.h>
60 #define BTTV_VERSION "0.9.19"
62 unsigned int bttv_num
; /* number of Bt848s in use */
63 struct bttv
*bttvs
[BTTV_MAX
];
65 unsigned int bttv_debug
;
66 unsigned int bttv_verbose
= 1;
67 unsigned int bttv_gpio
;
69 /* config variables */
71 static unsigned int bigendian
=1;
73 static unsigned int bigendian
;
75 static unsigned int radio
[BTTV_MAX
];
76 static unsigned int irq_debug
;
77 static unsigned int gbuffers
= 8;
78 static unsigned int gbufsize
= 0x208000;
79 static unsigned int reset_crop
= 1;
81 static int video_nr
[BTTV_MAX
] = { [0 ... (BTTV_MAX
-1)] = -1 };
82 static int radio_nr
[BTTV_MAX
] = { [0 ... (BTTV_MAX
-1)] = -1 };
83 static int vbi_nr
[BTTV_MAX
] = { [0 ... (BTTV_MAX
-1)] = -1 };
84 static int debug_latency
;
85 static int disable_ir
;
87 static unsigned int fdsr
;
90 static unsigned int combfilter
;
91 static unsigned int lumafilter
;
92 static unsigned int automute
= 1;
93 static unsigned int chroma_agc
;
94 static unsigned int adc_crush
= 1;
95 static unsigned int whitecrush_upper
= 0xCF;
96 static unsigned int whitecrush_lower
= 0x7F;
97 static unsigned int vcr_hack
;
98 static unsigned int irq_iswitch
;
99 static unsigned int uv_ratio
= 50;
100 static unsigned int full_luma_range
;
101 static unsigned int coring
;
103 /* API features (turn on/off stuff for testing) */
104 static unsigned int v4l2
= 1;
107 module_param(bttv_verbose
, int, 0644);
108 module_param(bttv_gpio
, int, 0644);
109 module_param(bttv_debug
, int, 0644);
110 module_param(irq_debug
, int, 0644);
111 module_param(debug_latency
, int, 0644);
112 module_param(disable_ir
, int, 0444);
114 module_param(fdsr
, int, 0444);
115 module_param(gbuffers
, int, 0444);
116 module_param(gbufsize
, int, 0444);
117 module_param(reset_crop
, int, 0444);
119 module_param(v4l2
, int, 0644);
120 module_param(bigendian
, int, 0644);
121 module_param(irq_iswitch
, int, 0644);
122 module_param(combfilter
, int, 0444);
123 module_param(lumafilter
, int, 0444);
124 module_param(automute
, int, 0444);
125 module_param(chroma_agc
, int, 0444);
126 module_param(adc_crush
, int, 0444);
127 module_param(whitecrush_upper
, int, 0444);
128 module_param(whitecrush_lower
, int, 0444);
129 module_param(vcr_hack
, int, 0444);
130 module_param(uv_ratio
, int, 0444);
131 module_param(full_luma_range
, int, 0444);
132 module_param(coring
, int, 0444);
134 module_param_array(radio
, int, NULL
, 0444);
135 module_param_array(video_nr
, int, NULL
, 0444);
136 module_param_array(radio_nr
, int, NULL
, 0444);
137 module_param_array(vbi_nr
, int, NULL
, 0444);
139 MODULE_PARM_DESC(radio
,"The TV card supports radio, default is 0 (no)");
140 MODULE_PARM_DESC(bigendian
,"byte order of the framebuffer, default is native endian");
141 MODULE_PARM_DESC(bttv_verbose
,"verbose startup messages, default is 1 (yes)");
142 MODULE_PARM_DESC(bttv_gpio
,"log gpio changes, default is 0 (no)");
143 MODULE_PARM_DESC(bttv_debug
,"debug messages, default is 0 (no)");
144 MODULE_PARM_DESC(irq_debug
,"irq handler debug messages, default is 0 (no)");
145 MODULE_PARM_DESC(disable_ir
, "disable infrared remote support");
146 MODULE_PARM_DESC(gbuffers
,"number of capture buffers. range 2-32, default 8");
147 MODULE_PARM_DESC(gbufsize
,"size of the capture buffers, default is 0x208000");
148 MODULE_PARM_DESC(reset_crop
,"reset cropping parameters at open(), default "
149 "is 1 (yes) for compatibility with older applications");
150 MODULE_PARM_DESC(automute
,"mute audio on bad/missing video signal, default is 1 (yes)");
151 MODULE_PARM_DESC(chroma_agc
,"enables the AGC of chroma signal, default is 0 (no)");
152 MODULE_PARM_DESC(adc_crush
,"enables the luminance ADC crush, default is 1 (yes)");
153 MODULE_PARM_DESC(whitecrush_upper
,"sets the white crush upper value, default is 207");
154 MODULE_PARM_DESC(whitecrush_lower
,"sets the white crush lower value, default is 127");
155 MODULE_PARM_DESC(vcr_hack
,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
156 MODULE_PARM_DESC(irq_iswitch
,"switch inputs in irq handler");
157 MODULE_PARM_DESC(uv_ratio
,"ratio between u and v gains, default is 50");
158 MODULE_PARM_DESC(full_luma_range
,"use the full luma range, default is 0 (no)");
159 MODULE_PARM_DESC(coring
,"set the luma coring level, default is 0 (no)");
160 MODULE_PARM_DESC(video_nr
, "video device numbers");
161 MODULE_PARM_DESC(vbi_nr
, "vbi device numbers");
162 MODULE_PARM_DESC(radio_nr
, "radio device numbers");
164 MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
165 MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
166 MODULE_LICENSE("GPL");
167 MODULE_VERSION(BTTV_VERSION
);
169 /* ----------------------------------------------------------------------- */
172 static ssize_t
show_card(struct device
*cd
,
173 struct device_attribute
*attr
, char *buf
)
175 struct video_device
*vfd
= container_of(cd
, struct video_device
, dev
);
176 struct bttv
*btv
= video_get_drvdata(vfd
);
177 return sprintf(buf
, "%d\n", btv
? btv
->c
.type
: UNSET
);
179 static DEVICE_ATTR(card
, S_IRUGO
, show_card
, NULL
);
181 /* ----------------------------------------------------------------------- */
182 /* dvb auto-load setup */
183 #if defined(CONFIG_MODULES) && defined(MODULE)
184 static void request_module_async(struct work_struct
*work
)
186 request_module("dvb-bt8xx");
189 static void request_modules(struct bttv
*dev
)
191 INIT_WORK(&dev
->request_module_wk
, request_module_async
);
192 schedule_work(&dev
->request_module_wk
);
195 static void flush_request_modules(struct bttv
*dev
)
197 flush_work_sync(&dev
->request_module_wk
);
200 #define request_modules(dev)
201 #define flush_request_modules(dev)
202 #endif /* CONFIG_MODULES */
205 /* ----------------------------------------------------------------------- */
208 /* special timing tables from conexant... */
209 static u8 SRAM_Table
[][60] =
211 /* PAL digital input over GPIO[7:0] */
213 45, // 45 bytes following
214 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
215 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
216 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
217 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
218 0x37,0x00,0xAF,0x21,0x00
220 /* NTSC digital input over GPIO[7:0] */
222 51, // 51 bytes following
223 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
224 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
225 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
226 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
227 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
230 // TGB_NTSC392 // quartzsight
231 // This table has been modified to be used for Fusion Rev D
233 0x2A, // size of table = 42
234 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
235 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
236 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
237 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
242 /* minhdelayx1 first video pixel we can capture on a line and
243 hdelayx1 start of active video, both relative to rising edge of
244 /HRESET pulse (0H) in 1 / fCLKx1.
245 swidth width of active video and
246 totalwidth total line width, both in 1 / fCLKx1.
247 sqwidth total line width in square pixels.
248 vdelay start of active video in 2 * field lines relative to
249 trailing edge of /VRESET pulse (VDELAY register).
250 sheight height of active video in 2 * field lines.
251 videostart0 ITU-R frame line number of the line corresponding
252 to vdelay in the first field. */
253 #define CROPCAP(minhdelayx1, hdelayx1, swidth, totalwidth, sqwidth, \
254 vdelay, sheight, videostart0) \
255 .cropcap.bounds.left = minhdelayx1, \
256 /* * 2 because vertically we count field lines times two, */ \
257 /* e.g. 23 * 2 to 23 * 2 + 576 in PAL-BGHI defrect. */ \
258 .cropcap.bounds.top = (videostart0) * 2 - (vdelay) + MIN_VDELAY, \
259 /* 4 is a safety margin at the end of the line. */ \
260 .cropcap.bounds.width = (totalwidth) - (minhdelayx1) - 4, \
261 .cropcap.bounds.height = (sheight) + (vdelay) - MIN_VDELAY, \
262 .cropcap.defrect.left = hdelayx1, \
263 .cropcap.defrect.top = (videostart0) * 2, \
264 .cropcap.defrect.width = swidth, \
265 .cropcap.defrect.height = sheight, \
266 .cropcap.pixelaspect.numerator = totalwidth, \
267 .cropcap.pixelaspect.denominator = sqwidth,
269 const struct bttv_tvnorm bttv_tvnorms
[] = {
271 /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
272 /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
274 .v4l2_id
= V4L2_STD_PAL
,
282 .iform
= (BT848_IFORM_PAL_BDGHI
|BT848_IFORM_XT1
),
283 .scaledtwidth
= 1135,
287 .vbipack
= 255, /* min (2048 / 4, 0x1ff) & 0xff */
289 /* ITU-R frame line number of the first VBI line
290 we can capture, of the first and second field.
291 The last line is determined by cropcap.bounds. */
292 .vbistart
= { 7, 320 },
293 CROPCAP(/* minhdelayx1 */ 68,
295 /* Should be (768 * 1135 + 944 / 2) / 944.
296 cropcap.defrect is used for image width
297 checks, so we keep the old value 924. */
299 /* totalwidth */ 1135,
303 /* videostart0 */ 23)
304 /* bt878 (and bt848?) can capture another
305 line below active video. */
306 .cropcap
.bounds
.height
= (576 + 2) + 0x20 - 2,
308 .v4l2_id
= V4L2_STD_NTSC_M
| V4L2_STD_NTSC_M_KR
,
316 .iform
= (BT848_IFORM_NTSC
|BT848_IFORM_XT0
),
321 .vbipack
= 144, /* min (1600 / 4, 0x1ff) & 0xff */
323 .vbistart
= { 10, 273 },
324 CROPCAP(/* minhdelayx1 */ 68,
326 /* Should be (640 * 910 + 780 / 2) / 780? */
328 /* totalwidth */ 910,
332 /* videostart0 */ 23)
334 .v4l2_id
= V4L2_STD_SECAM
,
342 .iform
= (BT848_IFORM_SECAM
|BT848_IFORM_XT1
),
343 .scaledtwidth
= 1135,
348 .sram
= 0, /* like PAL, correct? */
349 .vbistart
= { 7, 320 },
350 CROPCAP(/* minhdelayx1 */ 68,
353 /* totalwidth */ 1135,
357 /* videostart0 */ 23)
359 .v4l2_id
= V4L2_STD_PAL_Nc
,
367 .iform
= (BT848_IFORM_PAL_NC
|BT848_IFORM_XT0
),
374 .vbistart
= { 7, 320 },
375 CROPCAP(/* minhdelayx1 */ 68,
377 /* swidth */ (640 * 910 + 780 / 2) / 780,
378 /* totalwidth */ 910,
382 /* videostart0 */ 23)
384 .v4l2_id
= V4L2_STD_PAL_M
,
392 .iform
= (BT848_IFORM_PAL_M
|BT848_IFORM_XT0
),
399 .vbistart
= { 10, 273 },
400 CROPCAP(/* minhdelayx1 */ 68,
402 /* swidth */ (640 * 910 + 780 / 2) / 780,
403 /* totalwidth */ 910,
407 /* videostart0 */ 23)
409 .v4l2_id
= V4L2_STD_PAL_N
,
417 .iform
= (BT848_IFORM_PAL_N
|BT848_IFORM_XT1
),
424 .vbistart
= { 7, 320 },
425 CROPCAP(/* minhdelayx1 */ 68,
427 /* swidth */ (768 * 1135 + 944 / 2) / 944,
428 /* totalwidth */ 1135,
432 /* videostart0 */ 23)
434 .v4l2_id
= V4L2_STD_NTSC_M_JP
,
442 .iform
= (BT848_IFORM_NTSC_J
|BT848_IFORM_XT0
),
449 .vbistart
= { 10, 273 },
450 CROPCAP(/* minhdelayx1 */ 68,
452 /* swidth */ (640 * 910 + 780 / 2) / 780,
453 /* totalwidth */ 910,
457 /* videostart0 */ 23)
459 /* that one hopefully works with the strange timing
460 * which video recorders produce when playing a NTSC
461 * tape on a PAL TV ... */
462 .v4l2_id
= V4L2_STD_PAL_60
,
470 .iform
= (BT848_IFORM_PAL_BDGHI
|BT848_IFORM_XT1
),
471 .scaledtwidth
= 1135,
478 .vbistart
= { 10, 273 },
479 CROPCAP(/* minhdelayx1 */ 68,
482 /* totalwidth */ 1135,
486 /* videostart0 */ 23)
489 static const unsigned int BTTV_TVNORMS
= ARRAY_SIZE(bttv_tvnorms
);
491 /* ----------------------------------------------------------------------- */
493 packed pixel formats must come first */
494 static const struct bttv_format formats
[] = {
496 .name
= "8 bpp, gray",
497 .fourcc
= V4L2_PIX_FMT_GREY
,
498 .btformat
= BT848_COLOR_FMT_Y8
,
500 .flags
= FORMAT_FLAGS_PACKED
,
502 .name
= "8 bpp, dithered color",
503 .fourcc
= V4L2_PIX_FMT_HI240
,
504 .btformat
= BT848_COLOR_FMT_RGB8
,
506 .flags
= FORMAT_FLAGS_PACKED
| FORMAT_FLAGS_DITHER
,
508 .name
= "15 bpp RGB, le",
509 .fourcc
= V4L2_PIX_FMT_RGB555
,
510 .btformat
= BT848_COLOR_FMT_RGB15
,
512 .flags
= FORMAT_FLAGS_PACKED
,
514 .name
= "15 bpp RGB, be",
515 .fourcc
= V4L2_PIX_FMT_RGB555X
,
516 .btformat
= BT848_COLOR_FMT_RGB15
,
517 .btswap
= 0x03, /* byteswap */
519 .flags
= FORMAT_FLAGS_PACKED
,
521 .name
= "16 bpp RGB, le",
522 .fourcc
= V4L2_PIX_FMT_RGB565
,
523 .btformat
= BT848_COLOR_FMT_RGB16
,
525 .flags
= FORMAT_FLAGS_PACKED
,
527 .name
= "16 bpp RGB, be",
528 .fourcc
= V4L2_PIX_FMT_RGB565X
,
529 .btformat
= BT848_COLOR_FMT_RGB16
,
530 .btswap
= 0x03, /* byteswap */
532 .flags
= FORMAT_FLAGS_PACKED
,
534 .name
= "24 bpp RGB, le",
535 .fourcc
= V4L2_PIX_FMT_BGR24
,
536 .btformat
= BT848_COLOR_FMT_RGB24
,
538 .flags
= FORMAT_FLAGS_PACKED
,
540 .name
= "32 bpp RGB, le",
541 .fourcc
= V4L2_PIX_FMT_BGR32
,
542 .btformat
= BT848_COLOR_FMT_RGB32
,
544 .flags
= FORMAT_FLAGS_PACKED
,
546 .name
= "32 bpp RGB, be",
547 .fourcc
= V4L2_PIX_FMT_RGB32
,
548 .btformat
= BT848_COLOR_FMT_RGB32
,
549 .btswap
= 0x0f, /* byte+word swap */
551 .flags
= FORMAT_FLAGS_PACKED
,
553 .name
= "4:2:2, packed, YUYV",
554 .fourcc
= V4L2_PIX_FMT_YUYV
,
555 .btformat
= BT848_COLOR_FMT_YUY2
,
557 .flags
= FORMAT_FLAGS_PACKED
,
559 .name
= "4:2:2, packed, YUYV",
560 .fourcc
= V4L2_PIX_FMT_YUYV
,
561 .btformat
= BT848_COLOR_FMT_YUY2
,
563 .flags
= FORMAT_FLAGS_PACKED
,
565 .name
= "4:2:2, packed, UYVY",
566 .fourcc
= V4L2_PIX_FMT_UYVY
,
567 .btformat
= BT848_COLOR_FMT_YUY2
,
568 .btswap
= 0x03, /* byteswap */
570 .flags
= FORMAT_FLAGS_PACKED
,
572 .name
= "4:2:2, planar, Y-Cb-Cr",
573 .fourcc
= V4L2_PIX_FMT_YUV422P
,
574 .btformat
= BT848_COLOR_FMT_YCrCb422
,
576 .flags
= FORMAT_FLAGS_PLANAR
,
580 .name
= "4:2:0, planar, Y-Cb-Cr",
581 .fourcc
= V4L2_PIX_FMT_YUV420
,
582 .btformat
= BT848_COLOR_FMT_YCrCb422
,
584 .flags
= FORMAT_FLAGS_PLANAR
,
588 .name
= "4:2:0, planar, Y-Cr-Cb",
589 .fourcc
= V4L2_PIX_FMT_YVU420
,
590 .btformat
= BT848_COLOR_FMT_YCrCb422
,
592 .flags
= FORMAT_FLAGS_PLANAR
| FORMAT_FLAGS_CrCb
,
596 .name
= "4:1:1, planar, Y-Cb-Cr",
597 .fourcc
= V4L2_PIX_FMT_YUV411P
,
598 .btformat
= BT848_COLOR_FMT_YCrCb411
,
600 .flags
= FORMAT_FLAGS_PLANAR
,
604 .name
= "4:1:0, planar, Y-Cb-Cr",
605 .fourcc
= V4L2_PIX_FMT_YUV410
,
606 .btformat
= BT848_COLOR_FMT_YCrCb411
,
608 .flags
= FORMAT_FLAGS_PLANAR
,
612 .name
= "4:1:0, planar, Y-Cr-Cb",
613 .fourcc
= V4L2_PIX_FMT_YVU410
,
614 .btformat
= BT848_COLOR_FMT_YCrCb411
,
616 .flags
= FORMAT_FLAGS_PLANAR
| FORMAT_FLAGS_CrCb
,
620 .name
= "raw scanlines",
622 .btformat
= BT848_COLOR_FMT_RAW
,
624 .flags
= FORMAT_FLAGS_RAW
,
627 static const unsigned int FORMATS
= ARRAY_SIZE(formats
);
629 /* ----------------------------------------------------------------------- */
631 #define V4L2_CID_PRIVATE_CHROMA_AGC (V4L2_CID_PRIVATE_BASE + 0)
632 #define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_PRIVATE_BASE + 1)
633 #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2)
634 #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3)
635 #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4)
636 #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5)
637 #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6)
638 #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7)
639 #define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8)
640 #define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9)
641 #define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10)
642 #define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11)
644 static const struct v4l2_queryctrl no_ctl
= {
646 .flags
= V4L2_CTRL_FLAG_DISABLED
,
648 static const struct v4l2_queryctrl bttv_ctls
[] = {
651 .id
= V4L2_CID_BRIGHTNESS
,
652 .name
= "Brightness",
656 .default_value
= 32768,
657 .type
= V4L2_CTRL_TYPE_INTEGER
,
659 .id
= V4L2_CID_CONTRAST
,
664 .default_value
= 32768,
665 .type
= V4L2_CTRL_TYPE_INTEGER
,
667 .id
= V4L2_CID_SATURATION
,
668 .name
= "Saturation",
672 .default_value
= 32768,
673 .type
= V4L2_CTRL_TYPE_INTEGER
,
680 .default_value
= 32768,
681 .type
= V4L2_CTRL_TYPE_INTEGER
,
685 .id
= V4L2_CID_AUDIO_MUTE
,
689 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
691 .id
= V4L2_CID_AUDIO_VOLUME
,
696 .default_value
= 65535,
697 .type
= V4L2_CTRL_TYPE_INTEGER
,
699 .id
= V4L2_CID_AUDIO_BALANCE
,
704 .default_value
= 32768,
705 .type
= V4L2_CTRL_TYPE_INTEGER
,
707 .id
= V4L2_CID_AUDIO_BASS
,
712 .default_value
= 32768,
713 .type
= V4L2_CTRL_TYPE_INTEGER
,
715 .id
= V4L2_CID_AUDIO_TREBLE
,
720 .default_value
= 32768,
721 .type
= V4L2_CTRL_TYPE_INTEGER
,
723 /* --- private --- */
725 .id
= V4L2_CID_PRIVATE_CHROMA_AGC
,
726 .name
= "chroma agc",
729 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
731 .id
= V4L2_CID_PRIVATE_COMBFILTER
,
732 .name
= "combfilter",
735 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
737 .id
= V4L2_CID_PRIVATE_AUTOMUTE
,
741 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
743 .id
= V4L2_CID_PRIVATE_LUMAFILTER
,
744 .name
= "luma decimation filter",
747 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
749 .id
= V4L2_CID_PRIVATE_AGC_CRUSH
,
753 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
755 .id
= V4L2_CID_PRIVATE_VCR_HACK
,
759 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
761 .id
= V4L2_CID_PRIVATE_WHITECRUSH_UPPER
,
762 .name
= "whitecrush upper",
766 .default_value
= 0xCF,
767 .type
= V4L2_CTRL_TYPE_INTEGER
,
769 .id
= V4L2_CID_PRIVATE_WHITECRUSH_LOWER
,
770 .name
= "whitecrush lower",
774 .default_value
= 0x7F,
775 .type
= V4L2_CTRL_TYPE_INTEGER
,
777 .id
= V4L2_CID_PRIVATE_UV_RATIO
,
783 .type
= V4L2_CTRL_TYPE_INTEGER
,
785 .id
= V4L2_CID_PRIVATE_FULL_LUMA_RANGE
,
786 .name
= "full luma range",
789 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
791 .id
= V4L2_CID_PRIVATE_CORING
,
797 .type
= V4L2_CTRL_TYPE_INTEGER
,
804 static const struct v4l2_queryctrl
*ctrl_by_id(int id
)
808 for (i
= 0; i
< ARRAY_SIZE(bttv_ctls
); i
++)
809 if (bttv_ctls
[i
].id
== id
)
815 /* ----------------------------------------------------------------------- */
816 /* resource management */
819 RESOURCE_ allocated by freed by
821 VIDEO_READ bttv_read 1) bttv_read 2)
823 VIDEO_STREAM VIDIOC_STREAMON VIDIOC_STREAMOFF
824 VIDIOC_QBUF 1) bttv_release
827 OVERLAY VIDIOCCAPTURE on VIDIOCCAPTURE off
828 VIDIOC_OVERLAY on VIDIOC_OVERLAY off
831 VBI VIDIOC_STREAMON VIDIOC_STREAMOFF
832 VIDIOC_QBUF 1) bttv_release
833 bttv_read, bttv_poll 1) 4)
835 1) The resource must be allocated when we enter buffer prepare functions
836 and remain allocated while buffers are in the DMA queue.
837 2) This is a single frame read.
838 3) VIDIOC_S_FBUF and VIDIOC_S_FMT (OVERLAY) still work when
839 RESOURCE_OVERLAY is allocated.
840 4) This is a continuous read, implies VIDIOC_STREAMON.
842 Note this driver permits video input and standard changes regardless if
843 resources are allocated.
846 #define VBI_RESOURCES (RESOURCE_VBI)
847 #define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
848 RESOURCE_VIDEO_STREAM | \
852 int check_alloc_btres_lock(struct bttv
*btv
, struct bttv_fh
*fh
, int bit
)
854 int xbits
; /* mutual exclusive resources */
856 if (fh
->resources
& bit
)
857 /* have it already allocated */
861 if (bit
& (RESOURCE_VIDEO_READ
| RESOURCE_VIDEO_STREAM
))
862 xbits
|= RESOURCE_VIDEO_READ
| RESOURCE_VIDEO_STREAM
;
865 if (btv
->resources
& xbits
) {
866 /* no, someone else uses it */
870 if ((bit
& VIDEO_RESOURCES
)
871 && 0 == (btv
->resources
& VIDEO_RESOURCES
)) {
872 /* Do crop - use current, don't - use default parameters. */
873 __s32 top
= btv
->crop
[!!fh
->do_crop
].rect
.top
;
875 if (btv
->vbi_end
> top
)
878 /* We cannot capture the same line as video and VBI data.
879 Claim scan lines crop[].rect.top to bottom. */
880 btv
->crop_start
= top
;
881 } else if (bit
& VBI_RESOURCES
) {
882 __s32 end
= fh
->vbi_fmt
.end
;
884 if (end
> btv
->crop_start
)
887 /* Claim scan lines above fh->vbi_fmt.end. */
891 /* it's free, grab it */
892 fh
->resources
|= bit
;
893 btv
->resources
|= bit
;
901 int check_btres(struct bttv_fh
*fh
, int bit
)
903 return (fh
->resources
& bit
);
907 int locked_btres(struct bttv
*btv
, int bit
)
909 return (btv
->resources
& bit
);
912 /* Call with btv->lock down. */
914 disclaim_vbi_lines(struct bttv
*btv
)
919 /* Call with btv->lock down. */
921 disclaim_video_lines(struct bttv
*btv
)
923 const struct bttv_tvnorm
*tvnorm
;
926 tvnorm
= &bttv_tvnorms
[btv
->tvnorm
];
927 btv
->crop_start
= tvnorm
->cropcap
.bounds
.top
928 + tvnorm
->cropcap
.bounds
.height
;
930 /* VBI capturing ends at VDELAY, start of video capturing, no
931 matter how many lines the VBI RISC program expects. When video
932 capturing is off, it shall no longer "preempt" VBI capturing,
933 so we set VDELAY to maximum. */
934 crop
= btread(BT848_E_CROP
) | 0xc0;
935 btwrite(crop
, BT848_E_CROP
);
936 btwrite(0xfe, BT848_E_VDELAY_LO
);
937 btwrite(crop
, BT848_O_CROP
);
938 btwrite(0xfe, BT848_O_VDELAY_LO
);
942 void free_btres_lock(struct bttv
*btv
, struct bttv_fh
*fh
, int bits
)
944 if ((fh
->resources
& bits
) != bits
) {
945 /* trying to free ressources not allocated by us ... */
946 printk("bttv: BUG! (btres)\n");
948 fh
->resources
&= ~bits
;
949 btv
->resources
&= ~bits
;
951 bits
= btv
->resources
;
953 if (0 == (bits
& VIDEO_RESOURCES
))
954 disclaim_video_lines(btv
);
956 if (0 == (bits
& VBI_RESOURCES
))
957 disclaim_vbi_lines(btv
);
960 /* ----------------------------------------------------------------------- */
961 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
963 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
964 PLL_X = Reference pre-divider (0=1, 1=2)
965 PLL_C = Post divider (0=6, 1=4)
966 PLL_I = Integer input
967 PLL_F = Fractional input
969 F_input = 28.636363 MHz:
970 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
973 static void set_pll_freq(struct bttv
*btv
, unsigned int fin
, unsigned int fout
)
975 unsigned char fl
, fh
, fi
;
977 /* prevent overflows */
990 btwrite(fl
, BT848_PLL_F_LO
);
991 btwrite(fh
, BT848_PLL_F_HI
);
992 btwrite(fi
|BT848_PLL_X
, BT848_PLL_XCI
);
995 static void set_pll(struct bttv
*btv
)
999 if (!btv
->pll
.pll_crystal
)
1002 if (btv
->pll
.pll_ofreq
== btv
->pll
.pll_current
) {
1003 dprintk("bttv%d: PLL: no change required\n",btv
->c
.nr
);
1007 if (btv
->pll
.pll_ifreq
== btv
->pll
.pll_ofreq
) {
1009 if (btv
->pll
.pll_current
== 0)
1011 bttv_printk(KERN_INFO
"bttv%d: PLL can sleep, using XTAL (%d).\n",
1012 btv
->c
.nr
,btv
->pll
.pll_ifreq
);
1013 btwrite(0x00,BT848_TGCTRL
);
1014 btwrite(0x00,BT848_PLL_XCI
);
1015 btv
->pll
.pll_current
= 0;
1019 bttv_printk(KERN_INFO
"bttv%d: PLL: %d => %d ",btv
->c
.nr
,
1020 btv
->pll
.pll_ifreq
, btv
->pll
.pll_ofreq
);
1021 set_pll_freq(btv
, btv
->pll
.pll_ifreq
, btv
->pll
.pll_ofreq
);
1023 for (i
=0; i
<10; i
++) {
1024 /* Let other people run while the PLL stabilizes */
1028 if (btread(BT848_DSTATUS
) & BT848_DSTATUS_PLOCK
) {
1029 btwrite(0,BT848_DSTATUS
);
1031 btwrite(0x08,BT848_TGCTRL
);
1032 btv
->pll
.pll_current
= btv
->pll
.pll_ofreq
;
1033 bttv_printk(" ok\n");
1037 btv
->pll
.pll_current
= -1;
1038 bttv_printk("failed\n");
1042 /* used to switch between the bt848's analog/digital video capture modes */
1043 static void bt848A_set_timing(struct bttv
*btv
)
1046 int table_idx
= bttv_tvnorms
[btv
->tvnorm
].sram
;
1047 int fsc
= bttv_tvnorms
[btv
->tvnorm
].Fsc
;
1049 if (btv
->input
== btv
->dig
) {
1050 dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
1051 btv
->c
.nr
,table_idx
);
1053 /* timing change...reset timing generator address */
1054 btwrite(0x00, BT848_TGCTRL
);
1055 btwrite(0x02, BT848_TGCTRL
);
1056 btwrite(0x00, BT848_TGCTRL
);
1058 len
=SRAM_Table
[table_idx
][0];
1059 for(i
= 1; i
<= len
; i
++)
1060 btwrite(SRAM_Table
[table_idx
][i
],BT848_TGLB
);
1061 btv
->pll
.pll_ofreq
= 27000000;
1064 btwrite(0x11, BT848_TGCTRL
);
1065 btwrite(0x41, BT848_DVSIF
);
1067 btv
->pll
.pll_ofreq
= fsc
;
1069 btwrite(0x0, BT848_DVSIF
);
1073 /* ----------------------------------------------------------------------- */
1075 static void bt848_bright(struct bttv
*btv
, int bright
)
1079 // printk("bttv: set bright: %d\n",bright); // DEBUG
1080 btv
->bright
= bright
;
1082 /* We want -128 to 127 we get 0-65535 */
1083 value
= (bright
>> 8) - 128;
1084 btwrite(value
& 0xff, BT848_BRIGHT
);
1087 static void bt848_hue(struct bttv
*btv
, int hue
)
1094 value
= (hue
>> 8) - 128;
1095 btwrite(value
& 0xff, BT848_HUE
);
1098 static void bt848_contrast(struct bttv
*btv
, int cont
)
1102 btv
->contrast
= cont
;
1105 value
= (cont
>> 7);
1106 hibit
= (value
>> 6) & 4;
1107 btwrite(value
& 0xff, BT848_CONTRAST_LO
);
1108 btaor(hibit
, ~4, BT848_E_CONTROL
);
1109 btaor(hibit
, ~4, BT848_O_CONTROL
);
1112 static void bt848_sat(struct bttv
*btv
, int color
)
1114 int val_u
,val_v
,hibits
;
1116 btv
->saturation
= color
;
1118 /* 0-511 for the color */
1119 val_u
= ((color
* btv
->opt_uv_ratio
) / 50) >> 7;
1120 val_v
= (((color
* (100 - btv
->opt_uv_ratio
) / 50) >>7)*180L)/254;
1121 hibits
= (val_u
>> 7) & 2;
1122 hibits
|= (val_v
>> 8) & 1;
1123 btwrite(val_u
& 0xff, BT848_SAT_U_LO
);
1124 btwrite(val_v
& 0xff, BT848_SAT_V_LO
);
1125 btaor(hibits
, ~3, BT848_E_CONTROL
);
1126 btaor(hibits
, ~3, BT848_O_CONTROL
);
1129 /* ----------------------------------------------------------------------- */
1132 video_mux(struct bttv
*btv
, unsigned int input
)
1136 if (input
>= bttv_tvcards
[btv
->c
.type
].video_inputs
)
1139 /* needed by RemoteVideo MX */
1140 mask2
= bttv_tvcards
[btv
->c
.type
].gpiomask2
;
1142 gpio_inout(mask2
,mask2
);
1144 if (input
== btv
->svhs
) {
1145 btor(BT848_CONTROL_COMP
, BT848_E_CONTROL
);
1146 btor(BT848_CONTROL_COMP
, BT848_O_CONTROL
);
1148 btand(~BT848_CONTROL_COMP
, BT848_E_CONTROL
);
1149 btand(~BT848_CONTROL_COMP
, BT848_O_CONTROL
);
1151 mux
= bttv_muxsel(btv
, input
);
1152 btaor(mux
<<5, ~(3<<5), BT848_IFORM
);
1153 dprintk(KERN_DEBUG
"bttv%d: video mux: input=%d mux=%d\n",
1154 btv
->c
.nr
,input
,mux
);
1156 /* card specific hook */
1157 if(bttv_tvcards
[btv
->c
.type
].muxsel_hook
)
1158 bttv_tvcards
[btv
->c
.type
].muxsel_hook (btv
, input
);
1162 static char *audio_modes
[] = {
1163 "audio: tuner", "audio: radio", "audio: extern",
1164 "audio: intern", "audio: mute"
1168 audio_mux(struct bttv
*btv
, int input
, int mute
)
1170 int gpio_val
, signal
;
1171 struct v4l2_control ctrl
;
1173 gpio_inout(bttv_tvcards
[btv
->c
.type
].gpiomask
,
1174 bttv_tvcards
[btv
->c
.type
].gpiomask
);
1175 signal
= btread(BT848_DSTATUS
) & BT848_DSTATUS_HLOC
;
1181 mute
= mute
|| (btv
->opt_automute
&& !signal
&& !btv
->radio_user
);
1184 gpio_val
= bttv_tvcards
[btv
->c
.type
].gpiomute
;
1186 gpio_val
= bttv_tvcards
[btv
->c
.type
].gpiomux
[input
];
1188 switch (btv
->c
.type
) {
1189 case BTTV_BOARD_VOODOOTV_FM
:
1190 case BTTV_BOARD_VOODOOTV_200
:
1191 gpio_val
= bttv_tda9880_setnorm(btv
, gpio_val
);
1195 gpio_bits(bttv_tvcards
[btv
->c
.type
].gpiomask
, gpio_val
);
1199 bttv_gpio_tracking(btv
, audio_modes
[mute
? 4 : input
]);
1203 ctrl
.id
= V4L2_CID_AUDIO_MUTE
;
1204 ctrl
.value
= btv
->mute
;
1205 bttv_call_all(btv
, core
, s_ctrl
, &ctrl
);
1206 if (btv
->sd_msp34xx
) {
1209 /* Note: the inputs tuner/radio/extern/intern are translated
1210 to msp routings. This assumes common behavior for all msp3400
1211 based TV cards. When this assumption fails, then the
1212 specific MSP routing must be added to the card table.
1213 For now this is sufficient. */
1215 case TVAUDIO_INPUT_RADIO
:
1216 in
= MSP_INPUT(MSP_IN_SCART2
, MSP_IN_TUNER1
,
1217 MSP_DSP_IN_SCART
, MSP_DSP_IN_SCART
);
1219 case TVAUDIO_INPUT_EXTERN
:
1220 in
= MSP_INPUT(MSP_IN_SCART1
, MSP_IN_TUNER1
,
1221 MSP_DSP_IN_SCART
, MSP_DSP_IN_SCART
);
1223 case TVAUDIO_INPUT_INTERN
:
1224 /* Yes, this is the same input as for RADIO. I doubt
1225 if this is ever used. The only board with an INTERN
1226 input is the BTTV_BOARD_AVERMEDIA98. I wonder how
1227 that was tested. My guess is that the whole INTERN
1228 input does not work. */
1229 in
= MSP_INPUT(MSP_IN_SCART2
, MSP_IN_TUNER1
,
1230 MSP_DSP_IN_SCART
, MSP_DSP_IN_SCART
);
1232 case TVAUDIO_INPUT_TUNER
:
1234 /* This is the only card that uses TUNER2, and afaik,
1235 is the only difference between the VOODOOTV_FM
1237 if (btv
->c
.type
== BTTV_BOARD_VOODOOTV_200
)
1238 in
= MSP_INPUT(MSP_IN_SCART1
, MSP_IN_TUNER2
, \
1239 MSP_DSP_IN_TUNER
, MSP_DSP_IN_TUNER
);
1241 in
= MSP_INPUT_DEFAULT
;
1244 v4l2_subdev_call(btv
->sd_msp34xx
, audio
, s_routing
,
1245 in
, MSP_OUTPUT_DEFAULT
, 0);
1247 if (btv
->sd_tvaudio
) {
1248 v4l2_subdev_call(btv
->sd_tvaudio
, audio
, s_routing
,
1255 audio_mute(struct bttv
*btv
, int mute
)
1257 return audio_mux(btv
, btv
->audio
, mute
);
1261 audio_input(struct bttv
*btv
, int input
)
1263 return audio_mux(btv
, input
, btv
->mute
);
1267 bttv_crop_calc_limits(struct bttv_crop
*c
)
1269 /* Scale factor min. 1:1, max. 16:1. Min. image size
1270 48 x 32. Scaled width must be a multiple of 4. */
1273 /* For bug compatibility with VIDIOCGCAP and image
1274 size checks in earlier driver versions. */
1275 c
->min_scaled_width
= 48;
1276 c
->min_scaled_height
= 32;
1278 c
->min_scaled_width
=
1279 (max(48, c
->rect
.width
>> 4) + 3) & ~3;
1280 c
->min_scaled_height
=
1281 max(32, c
->rect
.height
>> 4);
1284 c
->max_scaled_width
= c
->rect
.width
& ~3;
1285 c
->max_scaled_height
= c
->rect
.height
;
1289 bttv_crop_reset(struct bttv_crop
*c
, unsigned int norm
)
1291 c
->rect
= bttv_tvnorms
[norm
].cropcap
.defrect
;
1292 bttv_crop_calc_limits(c
);
1295 /* Call with btv->lock down. */
1297 set_tvnorm(struct bttv
*btv
, unsigned int norm
)
1299 const struct bttv_tvnorm
*tvnorm
;
1302 BUG_ON(norm
>= BTTV_TVNORMS
);
1303 BUG_ON(btv
->tvnorm
>= BTTV_TVNORMS
);
1305 tvnorm
= &bttv_tvnorms
[norm
];
1307 if (memcmp(&bttv_tvnorms
[btv
->tvnorm
].cropcap
, &tvnorm
->cropcap
,
1308 sizeof (tvnorm
->cropcap
))) {
1309 bttv_crop_reset(&btv
->crop
[0], norm
);
1310 btv
->crop
[1] = btv
->crop
[0]; /* current = default */
1312 if (0 == (btv
->resources
& VIDEO_RESOURCES
)) {
1313 btv
->crop_start
= tvnorm
->cropcap
.bounds
.top
1314 + tvnorm
->cropcap
.bounds
.height
;
1320 btwrite(tvnorm
->adelay
, BT848_ADELAY
);
1321 btwrite(tvnorm
->bdelay
, BT848_BDELAY
);
1322 btaor(tvnorm
->iform
,~(BT848_IFORM_NORM
|BT848_IFORM_XTBOTH
),
1324 btwrite(tvnorm
->vbipack
, BT848_VBI_PACK_SIZE
);
1325 btwrite(1, BT848_VBI_PACK_DEL
);
1326 bt848A_set_timing(btv
);
1328 switch (btv
->c
.type
) {
1329 case BTTV_BOARD_VOODOOTV_FM
:
1330 case BTTV_BOARD_VOODOOTV_200
:
1331 bttv_tda9880_setnorm(btv
, gpio_read());
1334 id
= tvnorm
->v4l2_id
;
1335 bttv_call_all(btv
, core
, s_std
, id
);
1340 /* Call with btv->lock down. */
1342 set_input(struct bttv
*btv
, unsigned int input
, unsigned int norm
)
1344 unsigned long flags
;
1348 spin_lock_irqsave(&btv
->s_lock
,flags
);
1349 if (btv
->curr
.frame_irq
) {
1350 /* active capture -> delayed input switch */
1351 btv
->new_input
= input
;
1353 video_mux(btv
,input
);
1355 spin_unlock_irqrestore(&btv
->s_lock
,flags
);
1357 video_mux(btv
,input
);
1359 audio_input(btv
, (btv
->tuner_type
!= TUNER_ABSENT
&& input
== 0) ?
1360 TVAUDIO_INPUT_TUNER
: TVAUDIO_INPUT_EXTERN
);
1361 set_tvnorm(btv
, norm
);
1364 static void init_irqreg(struct bttv
*btv
)
1367 btwrite(0xfffffUL
, BT848_INT_STAT
);
1369 if (bttv_tvcards
[btv
->c
.type
].no_video
) {
1371 btwrite(BT848_INT_I2CDONE
,
1375 btwrite((btv
->triton1
) |
1376 (btv
->gpioirq
? BT848_INT_GPINT
: 0) |
1378 (fdsr
? BT848_INT_FDSR
: 0) |
1379 BT848_INT_RISCI
| BT848_INT_OCERR
|
1380 BT848_INT_FMTCHG
|BT848_INT_HLOCK
|
1386 static void init_bt848(struct bttv
*btv
)
1390 if (bttv_tvcards
[btv
->c
.type
].no_video
) {
1391 /* very basic init only */
1396 btwrite(0x00, BT848_CAP_CTL
);
1397 btwrite(BT848_COLOR_CTL_GAMMA
, BT848_COLOR_CTL
);
1398 btwrite(BT848_IFORM_XTAUTO
| BT848_IFORM_AUTO
, BT848_IFORM
);
1400 /* set planar and packed mode trigger points and */
1401 /* set rising edge of inverted GPINTR pin as irq trigger */
1402 btwrite(BT848_GPIO_DMA_CTL_PKTP_32
|
1403 BT848_GPIO_DMA_CTL_PLTP1_16
|
1404 BT848_GPIO_DMA_CTL_PLTP23_16
|
1405 BT848_GPIO_DMA_CTL_GPINTC
|
1406 BT848_GPIO_DMA_CTL_GPINTI
,
1407 BT848_GPIO_DMA_CTL
);
1409 val
= btv
->opt_chroma_agc
? BT848_SCLOOP_CAGC
: 0;
1410 btwrite(val
, BT848_E_SCLOOP
);
1411 btwrite(val
, BT848_O_SCLOOP
);
1413 btwrite(0x20, BT848_E_VSCALE_HI
);
1414 btwrite(0x20, BT848_O_VSCALE_HI
);
1415 btwrite(BT848_ADC_RESERVED
| (btv
->opt_adc_crush
? BT848_ADC_CRUSH
: 0),
1418 btwrite(whitecrush_upper
, BT848_WC_UP
);
1419 btwrite(whitecrush_lower
, BT848_WC_DOWN
);
1421 if (btv
->opt_lumafilter
) {
1422 btwrite(0, BT848_E_CONTROL
);
1423 btwrite(0, BT848_O_CONTROL
);
1425 btwrite(BT848_CONTROL_LDEC
, BT848_E_CONTROL
);
1426 btwrite(BT848_CONTROL_LDEC
, BT848_O_CONTROL
);
1429 bt848_bright(btv
, btv
->bright
);
1430 bt848_hue(btv
, btv
->hue
);
1431 bt848_contrast(btv
, btv
->contrast
);
1432 bt848_sat(btv
, btv
->saturation
);
1438 static void bttv_reinit_bt848(struct bttv
*btv
)
1440 unsigned long flags
;
1443 printk(KERN_INFO
"bttv%d: reset, reinitialize\n",btv
->c
.nr
);
1444 spin_lock_irqsave(&btv
->s_lock
,flags
);
1446 bttv_set_dma(btv
,0);
1447 spin_unlock_irqrestore(&btv
->s_lock
,flags
);
1450 btv
->pll
.pll_current
= -1;
1451 set_input(btv
, btv
->input
, btv
->tvnorm
);
1454 static int bttv_g_ctrl(struct file
*file
, void *priv
,
1455 struct v4l2_control
*c
)
1457 struct bttv_fh
*fh
= priv
;
1458 struct bttv
*btv
= fh
->btv
;
1461 case V4L2_CID_BRIGHTNESS
:
1462 c
->value
= btv
->bright
;
1465 c
->value
= btv
->hue
;
1467 case V4L2_CID_CONTRAST
:
1468 c
->value
= btv
->contrast
;
1470 case V4L2_CID_SATURATION
:
1471 c
->value
= btv
->saturation
;
1474 case V4L2_CID_AUDIO_MUTE
:
1475 case V4L2_CID_AUDIO_VOLUME
:
1476 case V4L2_CID_AUDIO_BALANCE
:
1477 case V4L2_CID_AUDIO_BASS
:
1478 case V4L2_CID_AUDIO_TREBLE
:
1479 bttv_call_all(btv
, core
, g_ctrl
, c
);
1482 case V4L2_CID_PRIVATE_CHROMA_AGC
:
1483 c
->value
= btv
->opt_chroma_agc
;
1485 case V4L2_CID_PRIVATE_COMBFILTER
:
1486 c
->value
= btv
->opt_combfilter
;
1488 case V4L2_CID_PRIVATE_LUMAFILTER
:
1489 c
->value
= btv
->opt_lumafilter
;
1491 case V4L2_CID_PRIVATE_AUTOMUTE
:
1492 c
->value
= btv
->opt_automute
;
1494 case V4L2_CID_PRIVATE_AGC_CRUSH
:
1495 c
->value
= btv
->opt_adc_crush
;
1497 case V4L2_CID_PRIVATE_VCR_HACK
:
1498 c
->value
= btv
->opt_vcr_hack
;
1500 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER
:
1501 c
->value
= btv
->opt_whitecrush_upper
;
1503 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER
:
1504 c
->value
= btv
->opt_whitecrush_lower
;
1506 case V4L2_CID_PRIVATE_UV_RATIO
:
1507 c
->value
= btv
->opt_uv_ratio
;
1509 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE
:
1510 c
->value
= btv
->opt_full_luma_range
;
1512 case V4L2_CID_PRIVATE_CORING
:
1513 c
->value
= btv
->opt_coring
;
1521 static int bttv_s_ctrl(struct file
*file
, void *f
,
1522 struct v4l2_control
*c
)
1526 struct bttv_fh
*fh
= f
;
1527 struct bttv
*btv
= fh
->btv
;
1529 err
= v4l2_prio_check(&btv
->prio
, fh
->prio
);
1534 case V4L2_CID_BRIGHTNESS
:
1535 bt848_bright(btv
, c
->value
);
1538 bt848_hue(btv
, c
->value
);
1540 case V4L2_CID_CONTRAST
:
1541 bt848_contrast(btv
, c
->value
);
1543 case V4L2_CID_SATURATION
:
1544 bt848_sat(btv
, c
->value
);
1546 case V4L2_CID_AUDIO_MUTE
:
1547 audio_mute(btv
, c
->value
);
1549 case V4L2_CID_AUDIO_VOLUME
:
1550 if (btv
->volume_gpio
)
1551 btv
->volume_gpio(btv
, c
->value
);
1553 bttv_call_all(btv
, core
, s_ctrl
, c
);
1555 case V4L2_CID_AUDIO_BALANCE
:
1556 case V4L2_CID_AUDIO_BASS
:
1557 case V4L2_CID_AUDIO_TREBLE
:
1558 bttv_call_all(btv
, core
, s_ctrl
, c
);
1561 case V4L2_CID_PRIVATE_CHROMA_AGC
:
1562 btv
->opt_chroma_agc
= c
->value
;
1563 val
= btv
->opt_chroma_agc
? BT848_SCLOOP_CAGC
: 0;
1564 btwrite(val
, BT848_E_SCLOOP
);
1565 btwrite(val
, BT848_O_SCLOOP
);
1567 case V4L2_CID_PRIVATE_COMBFILTER
:
1568 btv
->opt_combfilter
= c
->value
;
1570 case V4L2_CID_PRIVATE_LUMAFILTER
:
1571 btv
->opt_lumafilter
= c
->value
;
1572 if (btv
->opt_lumafilter
) {
1573 btand(~BT848_CONTROL_LDEC
, BT848_E_CONTROL
);
1574 btand(~BT848_CONTROL_LDEC
, BT848_O_CONTROL
);
1576 btor(BT848_CONTROL_LDEC
, BT848_E_CONTROL
);
1577 btor(BT848_CONTROL_LDEC
, BT848_O_CONTROL
);
1580 case V4L2_CID_PRIVATE_AUTOMUTE
:
1581 btv
->opt_automute
= c
->value
;
1583 case V4L2_CID_PRIVATE_AGC_CRUSH
:
1584 btv
->opt_adc_crush
= c
->value
;
1585 btwrite(BT848_ADC_RESERVED
|
1586 (btv
->opt_adc_crush
? BT848_ADC_CRUSH
: 0),
1589 case V4L2_CID_PRIVATE_VCR_HACK
:
1590 btv
->opt_vcr_hack
= c
->value
;
1592 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER
:
1593 btv
->opt_whitecrush_upper
= c
->value
;
1594 btwrite(c
->value
, BT848_WC_UP
);
1596 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER
:
1597 btv
->opt_whitecrush_lower
= c
->value
;
1598 btwrite(c
->value
, BT848_WC_DOWN
);
1600 case V4L2_CID_PRIVATE_UV_RATIO
:
1601 btv
->opt_uv_ratio
= c
->value
;
1602 bt848_sat(btv
, btv
->saturation
);
1604 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE
:
1605 btv
->opt_full_luma_range
= c
->value
;
1606 btaor((c
->value
<<7), ~BT848_OFORM_RANGE
, BT848_OFORM
);
1608 case V4L2_CID_PRIVATE_CORING
:
1609 btv
->opt_coring
= c
->value
;
1610 btaor((c
->value
<<5), ~BT848_OFORM_CORE32
, BT848_OFORM
);
1618 /* ----------------------------------------------------------------------- */
1620 void bttv_gpio_tracking(struct bttv
*btv
, char *comment
)
1622 unsigned int outbits
, data
;
1623 outbits
= btread(BT848_GPIO_OUT_EN
);
1624 data
= btread(BT848_GPIO_DATA
);
1625 printk(KERN_DEBUG
"bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1626 btv
->c
.nr
,outbits
,data
& outbits
, data
& ~outbits
, comment
);
1629 static void bttv_field_count(struct bttv
*btv
)
1637 /* start field counter */
1638 btor(BT848_INT_VSYNC
,BT848_INT_MASK
);
1640 /* stop field counter */
1641 btand(~BT848_INT_VSYNC
,BT848_INT_MASK
);
1642 btv
->field_count
= 0;
1646 static const struct bttv_format
*
1647 format_by_fourcc(int fourcc
)
1651 for (i
= 0; i
< FORMATS
; i
++) {
1652 if (-1 == formats
[i
].fourcc
)
1654 if (formats
[i
].fourcc
== fourcc
)
1660 /* ----------------------------------------------------------------------- */
1664 bttv_switch_overlay(struct bttv
*btv
, struct bttv_fh
*fh
,
1665 struct bttv_buffer
*new)
1667 struct bttv_buffer
*old
;
1668 unsigned long flags
;
1671 dprintk("switch_overlay: enter [new=%p]\n",new);
1673 new->vb
.state
= VIDEOBUF_DONE
;
1674 spin_lock_irqsave(&btv
->s_lock
,flags
);
1678 bttv_set_dma(btv
, 0x03);
1679 spin_unlock_irqrestore(&btv
->s_lock
,flags
);
1681 dprintk("switch_overlay: old=%p state is %d\n",old
,old
->vb
.state
);
1682 bttv_dma_free(&fh
->cap
,btv
, old
);
1686 free_btres_lock(btv
,fh
,RESOURCE_OVERLAY
);
1687 dprintk("switch_overlay: done\n");
1691 /* ----------------------------------------------------------------------- */
1692 /* video4linux (1) interface */
1694 static int bttv_prepare_buffer(struct videobuf_queue
*q
,struct bttv
*btv
,
1695 struct bttv_buffer
*buf
,
1696 const struct bttv_format
*fmt
,
1697 unsigned int width
, unsigned int height
,
1698 enum v4l2_field field
)
1700 struct bttv_fh
*fh
= q
->priv_data
;
1701 int redo_dma_risc
= 0;
1706 /* check settings */
1709 if (fmt
->btformat
== BT848_COLOR_FMT_RAW
) {
1711 height
= RAW_LINES
*2;
1712 if (width
*height
> buf
->vb
.bsize
)
1714 buf
->vb
.size
= buf
->vb
.bsize
;
1716 /* Make sure tvnorm and vbi_end remain consistent
1717 until we're done. */
1721 /* In this mode capturing always starts at defrect.top
1722 (default VDELAY), ignoring cropping parameters. */
1723 if (btv
->vbi_end
> bttv_tvnorms
[norm
].cropcap
.defrect
.top
) {
1727 c
.rect
= bttv_tvnorms
[norm
].cropcap
.defrect
;
1730 c
= btv
->crop
[!!fh
->do_crop
];
1732 if (width
< c
.min_scaled_width
||
1733 width
> c
.max_scaled_width
||
1734 height
< c
.min_scaled_height
)
1738 case V4L2_FIELD_TOP
:
1739 case V4L2_FIELD_BOTTOM
:
1740 case V4L2_FIELD_ALTERNATE
:
1741 /* btv->crop counts frame lines. Max. scale
1742 factor is 16:1 for frames, 8:1 for fields. */
1743 if (height
* 2 > c
.max_scaled_height
)
1748 if (height
> c
.max_scaled_height
)
1753 buf
->vb
.size
= (width
* height
* fmt
->depth
) >> 3;
1754 if (0 != buf
->vb
.baddr
&& buf
->vb
.bsize
< buf
->vb
.size
)
1758 /* alloc + fill struct bttv_buffer (if changed) */
1759 if (buf
->vb
.width
!= width
|| buf
->vb
.height
!= height
||
1760 buf
->vb
.field
!= field
||
1761 buf
->tvnorm
!= norm
|| buf
->fmt
!= fmt
||
1762 buf
->crop
.top
!= c
.rect
.top
||
1763 buf
->crop
.left
!= c
.rect
.left
||
1764 buf
->crop
.width
!= c
.rect
.width
||
1765 buf
->crop
.height
!= c
.rect
.height
) {
1766 buf
->vb
.width
= width
;
1767 buf
->vb
.height
= height
;
1768 buf
->vb
.field
= field
;
1775 /* alloc risc memory */
1776 if (VIDEOBUF_NEEDS_INIT
== buf
->vb
.state
) {
1778 if (0 != (rc
= videobuf_iolock(q
,&buf
->vb
,&btv
->fbuf
)))
1783 if (0 != (rc
= bttv_buffer_risc(btv
,buf
)))
1786 buf
->vb
.state
= VIDEOBUF_PREPARED
;
1790 bttv_dma_free(q
,btv
,buf
);
1795 buffer_setup(struct videobuf_queue
*q
, unsigned int *count
, unsigned int *size
)
1797 struct bttv_fh
*fh
= q
->priv_data
;
1799 *size
= fh
->fmt
->depth
*fh
->width
*fh
->height
>> 3;
1802 if (*size
* *count
> gbuffers
* gbufsize
)
1803 *count
= (gbuffers
* gbufsize
) / *size
;
1808 buffer_prepare(struct videobuf_queue
*q
, struct videobuf_buffer
*vb
,
1809 enum v4l2_field field
)
1811 struct bttv_buffer
*buf
= container_of(vb
,struct bttv_buffer
,vb
);
1812 struct bttv_fh
*fh
= q
->priv_data
;
1814 return bttv_prepare_buffer(q
,fh
->btv
, buf
, fh
->fmt
,
1815 fh
->width
, fh
->height
, field
);
1819 buffer_queue(struct videobuf_queue
*q
, struct videobuf_buffer
*vb
)
1821 struct bttv_buffer
*buf
= container_of(vb
,struct bttv_buffer
,vb
);
1822 struct bttv_fh
*fh
= q
->priv_data
;
1823 struct bttv
*btv
= fh
->btv
;
1825 buf
->vb
.state
= VIDEOBUF_QUEUED
;
1826 list_add_tail(&buf
->vb
.queue
,&btv
->capture
);
1827 if (!btv
->curr
.frame_irq
) {
1829 bttv_set_dma(btv
, 0x03);
1833 static void buffer_release(struct videobuf_queue
*q
, struct videobuf_buffer
*vb
)
1835 struct bttv_buffer
*buf
= container_of(vb
,struct bttv_buffer
,vb
);
1836 struct bttv_fh
*fh
= q
->priv_data
;
1838 bttv_dma_free(q
,fh
->btv
,buf
);
1841 static struct videobuf_queue_ops bttv_video_qops
= {
1842 .buf_setup
= buffer_setup
,
1843 .buf_prepare
= buffer_prepare
,
1844 .buf_queue
= buffer_queue
,
1845 .buf_release
= buffer_release
,
1848 static int bttv_s_std(struct file
*file
, void *priv
, v4l2_std_id
*id
)
1850 struct bttv_fh
*fh
= priv
;
1851 struct bttv
*btv
= fh
->btv
;
1855 err
= v4l2_prio_check(&btv
->prio
, fh
->prio
);
1859 for (i
= 0; i
< BTTV_TVNORMS
; i
++)
1860 if (*id
& bttv_tvnorms
[i
].v4l2_id
)
1862 if (i
== BTTV_TVNORMS
) {
1874 static int bttv_querystd(struct file
*file
, void *f
, v4l2_std_id
*id
)
1876 struct bttv_fh
*fh
= f
;
1877 struct bttv
*btv
= fh
->btv
;
1879 if (btread(BT848_DSTATUS
) & BT848_DSTATUS_NUML
)
1880 *id
= V4L2_STD_625_50
;
1882 *id
= V4L2_STD_525_60
;
1886 static int bttv_enum_input(struct file
*file
, void *priv
,
1887 struct v4l2_input
*i
)
1889 struct bttv_fh
*fh
= priv
;
1890 struct bttv
*btv
= fh
->btv
;
1893 if (i
->index
>= bttv_tvcards
[btv
->c
.type
].video_inputs
) {
1898 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
1901 if (btv
->tuner_type
!= TUNER_ABSENT
&& i
->index
== 0) {
1902 sprintf(i
->name
, "Television");
1903 i
->type
= V4L2_INPUT_TYPE_TUNER
;
1905 } else if (i
->index
== btv
->svhs
) {
1906 sprintf(i
->name
, "S-Video");
1908 sprintf(i
->name
, "Composite%d", i
->index
);
1911 if (i
->index
== btv
->input
) {
1912 __u32 dstatus
= btread(BT848_DSTATUS
);
1913 if (0 == (dstatus
& BT848_DSTATUS_PRES
))
1914 i
->status
|= V4L2_IN_ST_NO_SIGNAL
;
1915 if (0 == (dstatus
& BT848_DSTATUS_HLOC
))
1916 i
->status
|= V4L2_IN_ST_NO_H_LOCK
;
1919 i
->std
= BTTV_NORMS
;
1926 static int bttv_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1928 struct bttv_fh
*fh
= priv
;
1929 struct bttv
*btv
= fh
->btv
;
1936 static int bttv_s_input(struct file
*file
, void *priv
, unsigned int i
)
1938 struct bttv_fh
*fh
= priv
;
1939 struct bttv
*btv
= fh
->btv
;
1943 err
= v4l2_prio_check(&btv
->prio
, fh
->prio
);
1947 if (i
> bttv_tvcards
[btv
->c
.type
].video_inputs
) {
1952 set_input(btv
, i
, btv
->tvnorm
);
1958 static int bttv_s_tuner(struct file
*file
, void *priv
,
1959 struct v4l2_tuner
*t
)
1961 struct bttv_fh
*fh
= priv
;
1962 struct bttv
*btv
= fh
->btv
;
1965 if (unlikely(0 != t
->index
))
1968 if (unlikely(btv
->tuner_type
== TUNER_ABSENT
)) {
1973 err
= v4l2_prio_check(&btv
->prio
, fh
->prio
);
1977 bttv_call_all(btv
, tuner
, s_tuner
, t
);
1979 if (btv
->audio_mode_gpio
)
1980 btv
->audio_mode_gpio(btv
, t
, 1);
1987 static int bttv_g_frequency(struct file
*file
, void *priv
,
1988 struct v4l2_frequency
*f
)
1990 struct bttv_fh
*fh
= priv
;
1991 struct bttv
*btv
= fh
->btv
;
1993 f
->type
= btv
->radio_user
? V4L2_TUNER_RADIO
: V4L2_TUNER_ANALOG_TV
;
1994 f
->frequency
= btv
->freq
;
1999 static int bttv_s_frequency(struct file
*file
, void *priv
,
2000 struct v4l2_frequency
*f
)
2002 struct bttv_fh
*fh
= priv
;
2003 struct bttv
*btv
= fh
->btv
;
2006 if (unlikely(f
->tuner
!= 0))
2009 err
= v4l2_prio_check(&btv
->prio
, fh
->prio
);
2013 if (unlikely(f
->type
!= (btv
->radio_user
2014 ? V4L2_TUNER_RADIO
: V4L2_TUNER_ANALOG_TV
))) {
2018 btv
->freq
= f
->frequency
;
2019 bttv_call_all(btv
, tuner
, s_frequency
, f
);
2020 if (btv
->has_matchbox
&& btv
->radio_user
)
2021 tea5757_set_freq(btv
, btv
->freq
);
2027 static int bttv_log_status(struct file
*file
, void *f
)
2029 struct bttv_fh
*fh
= f
;
2030 struct bttv
*btv
= fh
->btv
;
2032 printk(KERN_INFO
"bttv%d: ======== START STATUS CARD #%d ========\n",
2033 btv
->c
.nr
, btv
->c
.nr
);
2034 bttv_call_all(btv
, core
, log_status
);
2035 printk(KERN_INFO
"bttv%d: ======== END STATUS CARD #%d ========\n",
2036 btv
->c
.nr
, btv
->c
.nr
);
2040 #ifdef CONFIG_VIDEO_ADV_DEBUG
2041 static int bttv_g_register(struct file
*file
, void *f
,
2042 struct v4l2_dbg_register
*reg
)
2044 struct bttv_fh
*fh
= f
;
2045 struct bttv
*btv
= fh
->btv
;
2047 if (!capable(CAP_SYS_ADMIN
))
2050 if (!v4l2_chip_match_host(®
->match
))
2053 /* bt848 has a 12-bit register space */
2055 reg
->val
= btread(reg
->reg
);
2061 static int bttv_s_register(struct file
*file
, void *f
,
2062 struct v4l2_dbg_register
*reg
)
2064 struct bttv_fh
*fh
= f
;
2065 struct bttv
*btv
= fh
->btv
;
2067 if (!capable(CAP_SYS_ADMIN
))
2070 if (!v4l2_chip_match_host(®
->match
))
2073 /* bt848 has a 12-bit register space */
2075 btwrite(reg
->val
, reg
->reg
);
2081 /* Given cropping boundaries b and the scaled width and height of a
2082 single field or frame, which must not exceed hardware limits, this
2083 function adjusts the cropping parameters c. */
2085 bttv_crop_adjust (struct bttv_crop
* c
,
2086 const struct v4l2_rect
* b
,
2089 enum v4l2_field field
)
2091 __s32 frame_height
= height
<< !V4L2_FIELD_HAS_BOTH(field
);
2095 if (width
< c
->min_scaled_width
) {
2096 /* Max. hor. scale factor 16:1. */
2097 c
->rect
.width
= width
* 16;
2098 } else if (width
> c
->max_scaled_width
) {
2099 /* Min. hor. scale factor 1:1. */
2100 c
->rect
.width
= width
;
2102 max_left
= b
->left
+ b
->width
- width
;
2103 max_left
= min(max_left
, (__s32
) MAX_HDELAY
);
2104 if (c
->rect
.left
> max_left
)
2105 c
->rect
.left
= max_left
;
2108 if (height
< c
->min_scaled_height
) {
2109 /* Max. vert. scale factor 16:1, single fields 8:1. */
2110 c
->rect
.height
= height
* 16;
2111 } else if (frame_height
> c
->max_scaled_height
) {
2112 /* Min. vert. scale factor 1:1.
2113 Top and height count field lines times two. */
2114 c
->rect
.height
= (frame_height
+ 1) & ~1;
2116 max_top
= b
->top
+ b
->height
- c
->rect
.height
;
2117 if (c
->rect
.top
> max_top
)
2118 c
->rect
.top
= max_top
;
2121 bttv_crop_calc_limits(c
);
2124 /* Returns an error if scaling to a frame or single field with the given
2125 width and height is not possible with the current cropping parameters
2126 and width aligned according to width_mask. If adjust_size is TRUE the
2127 function may adjust the width and/or height instead, rounding width
2128 to (width + width_bias) & width_mask. If adjust_crop is TRUE it may
2129 also adjust the current cropping parameters to get closer to the
2130 desired image size. */
2132 limit_scaled_size_lock (struct bttv_fh
* fh
,
2135 enum v4l2_field field
,
2136 unsigned int width_mask
,
2137 unsigned int width_bias
,
2141 struct bttv
*btv
= fh
->btv
;
2142 const struct v4l2_rect
*b
;
2143 struct bttv_crop
*c
;
2150 BUG_ON((int) width_mask
>= 0 ||
2151 width_bias
>= (unsigned int) -width_mask
);
2153 /* Make sure tvnorm, vbi_end and the current cropping parameters
2154 remain consistent until we're done. */
2156 b
= &bttv_tvnorms
[btv
->tvnorm
].cropcap
.bounds
;
2158 /* Do crop - use current, don't - use default parameters. */
2159 c
= &btv
->crop
[!!fh
->do_crop
];
2164 && !locked_btres(btv
, VIDEO_RESOURCES
)) {
2168 /* We cannot scale up. When the scaled image is larger
2169 than crop.rect we adjust the crop.rect as required
2170 by the V4L2 spec, hence cropcap.bounds are our limit. */
2171 max_width
= min(b
->width
, (__s32
) MAX_HACTIVE
);
2172 max_height
= b
->height
;
2174 /* We cannot capture the same line as video and VBI data.
2175 Note btv->vbi_end is really a minimum, see
2176 bttv_vbi_try_fmt(). */
2177 if (btv
->vbi_end
> b
->top
) {
2178 max_height
-= btv
->vbi_end
- b
->top
;
2180 if (min_height
> max_height
)
2185 if (btv
->vbi_end
> c
->rect
.top
)
2188 min_width
= c
->min_scaled_width
;
2189 min_height
= c
->min_scaled_height
;
2190 max_width
= c
->max_scaled_width
;
2191 max_height
= c
->max_scaled_height
;
2196 min_width
= (min_width
- width_mask
- 1) & width_mask
;
2197 max_width
= max_width
& width_mask
;
2199 /* Max. scale factor is 16:1 for frames, 8:1 for fields. */
2200 min_height
= min_height
;
2201 /* Min. scale factor is 1:1. */
2202 max_height
>>= !V4L2_FIELD_HAS_BOTH(field
);
2205 *width
= clamp(*width
, min_width
, max_width
);
2206 *height
= clamp(*height
, min_height
, max_height
);
2208 /* Round after clamping to avoid overflow. */
2209 *width
= (*width
+ width_bias
) & width_mask
;
2212 bttv_crop_adjust(c
, b
, *width
, *height
, field
);
2214 if (btv
->vbi_end
> c
->rect
.top
) {
2215 /* Move the crop window out of the way. */
2216 c
->rect
.top
= btv
->vbi_end
;
2221 if (*width
< min_width
||
2222 *height
< min_height
||
2223 *width
> max_width
||
2224 *height
> max_height
||
2225 0 != (*width
& ~width_mask
))
2229 rc
= 0; /* success */
2236 /* Returns an error if the given overlay window dimensions are not
2237 possible with the current cropping parameters. If adjust_size is
2238 TRUE the function may adjust the window width and/or height
2239 instead, however it always rounds the horizontal position and
2240 width as btcx_align() does. If adjust_crop is TRUE the function
2241 may also adjust the current cropping parameters to get closer
2242 to the desired window size. */
2244 verify_window_lock (struct bttv_fh
* fh
,
2245 struct v4l2_window
* win
,
2249 enum v4l2_field field
;
2250 unsigned int width_mask
;
2253 if (win
->w
.width
< 48 || win
->w
.height
< 32)
2255 if (win
->clipcount
> 2048)
2260 if (V4L2_FIELD_ANY
== field
) {
2263 height2
= fh
->btv
->crop
[!!fh
->do_crop
].rect
.height
>> 1;
2264 field
= (win
->w
.height
> height2
)
2265 ? V4L2_FIELD_INTERLACED
2269 case V4L2_FIELD_TOP
:
2270 case V4L2_FIELD_BOTTOM
:
2271 case V4L2_FIELD_INTERLACED
:
2277 /* 4-byte alignment. */
2278 if (NULL
== fh
->ovfmt
)
2281 switch (fh
->ovfmt
->depth
) {
2295 win
->w
.width
-= win
->w
.left
& ~width_mask
;
2296 win
->w
.left
= (win
->w
.left
- width_mask
- 1) & width_mask
;
2298 rc
= limit_scaled_size_lock(fh
, &win
->w
.width
, &win
->w
.height
,
2300 /* width_bias: round down */ 0,
2301 adjust_size
, adjust_crop
);
2309 static int setup_window_lock(struct bttv_fh
*fh
, struct bttv
*btv
,
2310 struct v4l2_window
*win
, int fixup
)
2312 struct v4l2_clip
*clips
= NULL
;
2313 int n
,size
,retval
= 0;
2315 if (NULL
== fh
->ovfmt
)
2317 if (!(fh
->ovfmt
->flags
& FORMAT_FLAGS_PACKED
))
2319 retval
= verify_window_lock(fh
, win
,
2320 /* adjust_size */ fixup
,
2321 /* adjust_crop */ fixup
);
2325 /* copy clips -- luckily v4l1 + v4l2 are binary
2326 compatible here ...*/
2328 size
= sizeof(*clips
)*(n
+4);
2329 clips
= kmalloc(size
,GFP_KERNEL
);
2333 if (copy_from_user(clips
,win
->clips
,sizeof(struct v4l2_clip
)*n
)) {
2339 /* clip against screen */
2340 if (NULL
!= btv
->fbuf
.base
)
2341 n
= btcx_screen_clips(btv
->fbuf
.fmt
.width
, btv
->fbuf
.fmt
.height
,
2343 btcx_sort_clips(clips
,n
);
2345 /* 4-byte alignments */
2346 switch (fh
->ovfmt
->depth
) {
2349 btcx_align(&win
->w
, clips
, n
, 3);
2352 btcx_align(&win
->w
, clips
, n
, 1);
2355 /* no alignment fixups needed */
2361 kfree(fh
->ov
.clips
);
2362 fh
->ov
.clips
= clips
;
2366 fh
->ov
.field
= win
->field
;
2367 fh
->ov
.setup_ok
= 1;
2369 btv
->init
.ov
.w
.width
= win
->w
.width
;
2370 btv
->init
.ov
.w
.height
= win
->w
.height
;
2371 btv
->init
.ov
.field
= win
->field
;
2373 /* update overlay if needed */
2375 if (check_btres(fh
, RESOURCE_OVERLAY
)) {
2376 struct bttv_buffer
*new;
2378 new = videobuf_sg_alloc(sizeof(*new));
2379 new->crop
= btv
->crop
[!!fh
->do_crop
].rect
;
2380 bttv_overlay_risc(btv
, &fh
->ov
, fh
->ovfmt
, new);
2381 retval
= bttv_switch_overlay(btv
,fh
,new);
2386 /* ----------------------------------------------------------------------- */
2388 static struct videobuf_queue
* bttv_queue(struct bttv_fh
*fh
)
2390 struct videobuf_queue
* q
= NULL
;
2393 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
2396 case V4L2_BUF_TYPE_VBI_CAPTURE
:
2405 static int bttv_resource(struct bttv_fh
*fh
)
2410 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
2411 res
= RESOURCE_VIDEO_STREAM
;
2413 case V4L2_BUF_TYPE_VBI_CAPTURE
:
2422 static int bttv_switch_type(struct bttv_fh
*fh
, enum v4l2_buf_type type
)
2424 struct videobuf_queue
*q
= bttv_queue(fh
);
2425 int res
= bttv_resource(fh
);
2427 if (check_btres(fh
,res
))
2429 if (videobuf_queue_is_busy(q
))
2436 pix_format_set_size (struct v4l2_pix_format
* f
,
2437 const struct bttv_format
* fmt
,
2439 unsigned int height
)
2444 if (fmt
->flags
& FORMAT_FLAGS_PLANAR
) {
2445 f
->bytesperline
= width
; /* Y plane */
2446 f
->sizeimage
= (width
* height
* fmt
->depth
) >> 3;
2448 f
->bytesperline
= (width
* fmt
->depth
) >> 3;
2449 f
->sizeimage
= height
* f
->bytesperline
;
2453 static int bttv_g_fmt_vid_cap(struct file
*file
, void *priv
,
2454 struct v4l2_format
*f
)
2456 struct bttv_fh
*fh
= priv
;
2458 pix_format_set_size(&f
->fmt
.pix
, fh
->fmt
,
2459 fh
->width
, fh
->height
);
2460 f
->fmt
.pix
.field
= fh
->cap
.field
;
2461 f
->fmt
.pix
.pixelformat
= fh
->fmt
->fourcc
;
2466 static int bttv_g_fmt_vid_overlay(struct file
*file
, void *priv
,
2467 struct v4l2_format
*f
)
2469 struct bttv_fh
*fh
= priv
;
2471 f
->fmt
.win
.w
= fh
->ov
.w
;
2472 f
->fmt
.win
.field
= fh
->ov
.field
;
2477 static int bttv_try_fmt_vid_cap(struct file
*file
, void *priv
,
2478 struct v4l2_format
*f
)
2480 const struct bttv_format
*fmt
;
2481 struct bttv_fh
*fh
= priv
;
2482 struct bttv
*btv
= fh
->btv
;
2483 enum v4l2_field field
;
2484 __s32 width
, height
;
2487 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
2491 field
= f
->fmt
.pix
.field
;
2493 if (V4L2_FIELD_ANY
== field
) {
2496 height2
= btv
->crop
[!!fh
->do_crop
].rect
.height
>> 1;
2497 field
= (f
->fmt
.pix
.height
> height2
)
2498 ? V4L2_FIELD_INTERLACED
2499 : V4L2_FIELD_BOTTOM
;
2502 if (V4L2_FIELD_SEQ_BT
== field
)
2503 field
= V4L2_FIELD_SEQ_TB
;
2506 case V4L2_FIELD_TOP
:
2507 case V4L2_FIELD_BOTTOM
:
2508 case V4L2_FIELD_ALTERNATE
:
2509 case V4L2_FIELD_INTERLACED
:
2511 case V4L2_FIELD_SEQ_TB
:
2512 if (fmt
->flags
& FORMAT_FLAGS_PLANAR
)
2519 width
= f
->fmt
.pix
.width
;
2520 height
= f
->fmt
.pix
.height
;
2522 rc
= limit_scaled_size_lock(fh
, &width
, &height
, field
,
2523 /* width_mask: 4 pixels */ ~3,
2524 /* width_bias: nearest */ 2,
2525 /* adjust_size */ 1,
2526 /* adjust_crop */ 0);
2530 /* update data for the application */
2531 f
->fmt
.pix
.field
= field
;
2532 pix_format_set_size(&f
->fmt
.pix
, fmt
, width
, height
);
2537 static int bttv_try_fmt_vid_overlay(struct file
*file
, void *priv
,
2538 struct v4l2_format
*f
)
2540 struct bttv_fh
*fh
= priv
;
2542 return verify_window_lock(fh
, &f
->fmt
.win
,
2543 /* adjust_size */ 1,
2544 /* adjust_crop */ 0);
2547 static int bttv_s_fmt_vid_cap(struct file
*file
, void *priv
,
2548 struct v4l2_format
*f
)
2551 const struct bttv_format
*fmt
;
2552 struct bttv_fh
*fh
= priv
;
2553 struct bttv
*btv
= fh
->btv
;
2554 __s32 width
, height
;
2555 enum v4l2_field field
;
2557 retval
= bttv_switch_type(fh
, f
->type
);
2561 retval
= bttv_try_fmt_vid_cap(file
, priv
, f
);
2565 width
= f
->fmt
.pix
.width
;
2566 height
= f
->fmt
.pix
.height
;
2567 field
= f
->fmt
.pix
.field
;
2569 retval
= limit_scaled_size_lock(fh
, &width
, &height
, f
->fmt
.pix
.field
,
2570 /* width_mask: 4 pixels */ ~3,
2571 /* width_bias: nearest */ 2,
2572 /* adjust_size */ 1,
2573 /* adjust_crop */ 1);
2577 f
->fmt
.pix
.field
= field
;
2579 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
2581 /* update our state informations */
2583 fh
->cap
.field
= f
->fmt
.pix
.field
;
2584 fh
->cap
.last
= V4L2_FIELD_NONE
;
2585 fh
->width
= f
->fmt
.pix
.width
;
2586 fh
->height
= f
->fmt
.pix
.height
;
2587 btv
->init
.fmt
= fmt
;
2588 btv
->init
.width
= f
->fmt
.pix
.width
;
2589 btv
->init
.height
= f
->fmt
.pix
.height
;
2594 static int bttv_s_fmt_vid_overlay(struct file
*file
, void *priv
,
2595 struct v4l2_format
*f
)
2597 struct bttv_fh
*fh
= priv
;
2598 struct bttv
*btv
= fh
->btv
;
2600 if (no_overlay
> 0) {
2601 printk(KERN_ERR
"V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2605 return setup_window_lock(fh
, btv
, &f
->fmt
.win
, 1);
2608 static int bttv_querycap(struct file
*file
, void *priv
,
2609 struct v4l2_capability
*cap
)
2611 struct bttv_fh
*fh
= priv
;
2612 struct bttv
*btv
= fh
->btv
;
2617 strlcpy(cap
->driver
, "bttv", sizeof(cap
->driver
));
2618 strlcpy(cap
->card
, btv
->video_dev
->name
, sizeof(cap
->card
));
2619 snprintf(cap
->bus_info
, sizeof(cap
->bus_info
),
2620 "PCI:%s", pci_name(btv
->c
.pci
));
2622 V4L2_CAP_VIDEO_CAPTURE
|
2623 V4L2_CAP_VBI_CAPTURE
|
2624 V4L2_CAP_READWRITE
|
2626 if (no_overlay
<= 0)
2627 cap
->capabilities
|= V4L2_CAP_VIDEO_OVERLAY
;
2630 * No need to lock here: those vars are initialized during board
2631 * probe and remains untouched during the rest of the driver lifecycle
2633 if (btv
->has_saa6588
)
2634 cap
->capabilities
|= V4L2_CAP_RDS_CAPTURE
;
2635 if (btv
->tuner_type
!= TUNER_ABSENT
)
2636 cap
->capabilities
|= V4L2_CAP_TUNER
;
2640 static int bttv_enum_fmt_cap_ovr(struct v4l2_fmtdesc
*f
)
2644 for (i
= 0; i
< FORMATS
; i
++) {
2645 if (formats
[i
].fourcc
!= -1)
2647 if ((unsigned int)index
== f
->index
)
2653 f
->pixelformat
= formats
[i
].fourcc
;
2654 strlcpy(f
->description
, formats
[i
].name
, sizeof(f
->description
));
2659 static int bttv_enum_fmt_vid_cap(struct file
*file
, void *priv
,
2660 struct v4l2_fmtdesc
*f
)
2662 int rc
= bttv_enum_fmt_cap_ovr(f
);
2670 static int bttv_enum_fmt_vid_overlay(struct file
*file
, void *priv
,
2671 struct v4l2_fmtdesc
*f
)
2675 if (no_overlay
> 0) {
2676 printk(KERN_ERR
"V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2680 rc
= bttv_enum_fmt_cap_ovr(f
);
2685 if (!(formats
[rc
].flags
& FORMAT_FLAGS_PACKED
))
2691 static int bttv_g_fbuf(struct file
*file
, void *f
,
2692 struct v4l2_framebuffer
*fb
)
2694 struct bttv_fh
*fh
= f
;
2695 struct bttv
*btv
= fh
->btv
;
2698 fb
->capability
= V4L2_FBUF_CAP_LIST_CLIPPING
;
2700 fb
->fmt
.pixelformat
= fh
->ovfmt
->fourcc
;
2704 static int bttv_overlay(struct file
*file
, void *f
, unsigned int on
)
2706 struct bttv_fh
*fh
= f
;
2707 struct bttv
*btv
= fh
->btv
;
2708 struct bttv_buffer
*new;
2713 if (unlikely(!btv
->fbuf
.base
)) {
2716 if (unlikely(!fh
->ov
.setup_ok
)) {
2717 dprintk("bttv%d: overlay: !setup_ok\n", btv
->c
.nr
);
2724 if (!check_alloc_btres_lock(btv
, fh
, RESOURCE_OVERLAY
))
2728 fh
->ov
.tvnorm
= btv
->tvnorm
;
2729 new = videobuf_sg_alloc(sizeof(*new));
2730 new->crop
= btv
->crop
[!!fh
->do_crop
].rect
;
2731 bttv_overlay_risc(btv
, &fh
->ov
, fh
->ovfmt
, new);
2737 retval
= bttv_switch_overlay(btv
, fh
, new);
2741 static int bttv_s_fbuf(struct file
*file
, void *f
,
2742 struct v4l2_framebuffer
*fb
)
2744 struct bttv_fh
*fh
= f
;
2745 struct bttv
*btv
= fh
->btv
;
2746 const struct bttv_format
*fmt
;
2749 if (!capable(CAP_SYS_ADMIN
) &&
2750 !capable(CAP_SYS_RAWIO
))
2754 fmt
= format_by_fourcc(fb
->fmt
.pixelformat
);
2757 if (0 == (fmt
->flags
& FORMAT_FLAGS_PACKED
))
2761 if (fb
->flags
& V4L2_FBUF_FLAG_OVERLAY
) {
2762 __s32 width
= fb
->fmt
.width
;
2763 __s32 height
= fb
->fmt
.height
;
2765 retval
= limit_scaled_size_lock(fh
, &width
, &height
,
2766 V4L2_FIELD_INTERLACED
,
2767 /* width_mask */ ~3,
2769 /* adjust_size */ 0,
2770 /* adjust_crop */ 0);
2776 btv
->fbuf
.base
= fb
->base
;
2777 btv
->fbuf
.fmt
.width
= fb
->fmt
.width
;
2778 btv
->fbuf
.fmt
.height
= fb
->fmt
.height
;
2779 if (0 != fb
->fmt
.bytesperline
)
2780 btv
->fbuf
.fmt
.bytesperline
= fb
->fmt
.bytesperline
;
2782 btv
->fbuf
.fmt
.bytesperline
= btv
->fbuf
.fmt
.width
*fmt
->depth
/8;
2786 btv
->init
.ovfmt
= fmt
;
2787 if (fb
->flags
& V4L2_FBUF_FLAG_OVERLAY
) {
2790 fh
->ov
.w
.width
= fb
->fmt
.width
;
2791 fh
->ov
.w
.height
= fb
->fmt
.height
;
2792 btv
->init
.ov
.w
.width
= fb
->fmt
.width
;
2793 btv
->init
.ov
.w
.height
= fb
->fmt
.height
;
2794 kfree(fh
->ov
.clips
);
2795 fh
->ov
.clips
= NULL
;
2798 if (check_btres(fh
, RESOURCE_OVERLAY
)) {
2799 struct bttv_buffer
*new;
2801 new = videobuf_sg_alloc(sizeof(*new));
2802 new->crop
= btv
->crop
[!!fh
->do_crop
].rect
;
2803 bttv_overlay_risc(btv
, &fh
->ov
, fh
->ovfmt
, new);
2804 retval
= bttv_switch_overlay(btv
, fh
, new);
2810 static int bttv_reqbufs(struct file
*file
, void *priv
,
2811 struct v4l2_requestbuffers
*p
)
2813 struct bttv_fh
*fh
= priv
;
2814 return videobuf_reqbufs(bttv_queue(fh
), p
);
2817 static int bttv_querybuf(struct file
*file
, void *priv
,
2818 struct v4l2_buffer
*b
)
2820 struct bttv_fh
*fh
= priv
;
2821 return videobuf_querybuf(bttv_queue(fh
), b
);
2824 static int bttv_qbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*b
)
2826 struct bttv_fh
*fh
= priv
;
2827 struct bttv
*btv
= fh
->btv
;
2828 int res
= bttv_resource(fh
);
2830 if (!check_alloc_btres_lock(btv
, fh
, res
))
2833 return videobuf_qbuf(bttv_queue(fh
), b
);
2836 static int bttv_dqbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*b
)
2838 struct bttv_fh
*fh
= priv
;
2839 return videobuf_dqbuf(bttv_queue(fh
), b
,
2840 file
->f_flags
& O_NONBLOCK
);
2843 static int bttv_streamon(struct file
*file
, void *priv
,
2844 enum v4l2_buf_type type
)
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
))
2852 return videobuf_streamon(bttv_queue(fh
));
2856 static int bttv_streamoff(struct file
*file
, void *priv
,
2857 enum v4l2_buf_type type
)
2859 struct bttv_fh
*fh
= priv
;
2860 struct bttv
*btv
= fh
->btv
;
2862 int res
= bttv_resource(fh
);
2865 retval
= videobuf_streamoff(bttv_queue(fh
));
2868 free_btres_lock(btv
, fh
, res
);
2872 static int bttv_queryctrl(struct file
*file
, void *priv
,
2873 struct v4l2_queryctrl
*c
)
2875 struct bttv_fh
*fh
= priv
;
2876 struct bttv
*btv
= fh
->btv
;
2877 const struct v4l2_queryctrl
*ctrl
;
2879 if ((c
->id
< V4L2_CID_BASE
||
2880 c
->id
>= V4L2_CID_LASTP1
) &&
2881 (c
->id
< V4L2_CID_PRIVATE_BASE
||
2882 c
->id
>= V4L2_CID_PRIVATE_LASTP1
))
2885 if (!btv
->volume_gpio
&& (c
->id
== V4L2_CID_AUDIO_VOLUME
))
2888 ctrl
= ctrl_by_id(c
->id
);
2890 *c
= (NULL
!= ctrl
) ? *ctrl
: no_ctl
;
2896 static int bttv_g_parm(struct file
*file
, void *f
,
2897 struct v4l2_streamparm
*parm
)
2899 struct bttv_fh
*fh
= f
;
2900 struct bttv
*btv
= fh
->btv
;
2902 v4l2_video_std_frame_period(bttv_tvnorms
[btv
->tvnorm
].v4l2_id
,
2903 &parm
->parm
.capture
.timeperframe
);
2908 static int bttv_g_tuner(struct file
*file
, void *priv
,
2909 struct v4l2_tuner
*t
)
2911 struct bttv_fh
*fh
= priv
;
2912 struct bttv
*btv
= fh
->btv
;
2914 if (btv
->tuner_type
== TUNER_ABSENT
)
2919 t
->rxsubchans
= V4L2_TUNER_SUB_MONO
;
2920 bttv_call_all(btv
, tuner
, g_tuner
, t
);
2921 strcpy(t
->name
, "Television");
2922 t
->capability
= V4L2_TUNER_CAP_NORM
;
2923 t
->type
= V4L2_TUNER_ANALOG_TV
;
2924 if (btread(BT848_DSTATUS
)&BT848_DSTATUS_HLOC
)
2927 if (btv
->audio_mode_gpio
)
2928 btv
->audio_mode_gpio(btv
, t
, 0);
2933 static int bttv_g_priority(struct file
*file
, void *f
, enum v4l2_priority
*p
)
2935 struct bttv_fh
*fh
= f
;
2936 struct bttv
*btv
= fh
->btv
;
2938 *p
= v4l2_prio_max(&btv
->prio
);
2943 static int bttv_s_priority(struct file
*file
, void *f
,
2944 enum v4l2_priority prio
)
2946 struct bttv_fh
*fh
= f
;
2947 struct bttv
*btv
= fh
->btv
;
2950 rc
= v4l2_prio_change(&btv
->prio
, &fh
->prio
, prio
);
2955 static int bttv_cropcap(struct file
*file
, void *priv
,
2956 struct v4l2_cropcap
*cap
)
2958 struct bttv_fh
*fh
= priv
;
2959 struct bttv
*btv
= fh
->btv
;
2961 if (cap
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
&&
2962 cap
->type
!= V4L2_BUF_TYPE_VIDEO_OVERLAY
)
2965 *cap
= bttv_tvnorms
[btv
->tvnorm
].cropcap
;
2970 static int bttv_g_crop(struct file
*file
, void *f
, struct v4l2_crop
*crop
)
2972 struct bttv_fh
*fh
= f
;
2973 struct bttv
*btv
= fh
->btv
;
2975 if (crop
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
&&
2976 crop
->type
!= V4L2_BUF_TYPE_VIDEO_OVERLAY
)
2979 /* No fh->do_crop = 1; because btv->crop[1] may be
2980 inconsistent with fh->width or fh->height and apps
2981 do not expect a change here. */
2983 crop
->c
= btv
->crop
[!!fh
->do_crop
].rect
;
2988 static int bttv_s_crop(struct file
*file
, void *f
, struct v4l2_crop
*crop
)
2990 struct bttv_fh
*fh
= f
;
2991 struct bttv
*btv
= fh
->btv
;
2992 const struct v4l2_rect
*b
;
3000 if (crop
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
&&
3001 crop
->type
!= V4L2_BUF_TYPE_VIDEO_OVERLAY
)
3004 /* Make sure tvnorm, vbi_end and the current cropping
3005 parameters remain consistent until we're done. Note
3006 read() may change vbi_end in check_alloc_btres_lock(). */
3007 retval
= v4l2_prio_check(&btv
->prio
, fh
->prio
);
3014 if (locked_btres(fh
->btv
, VIDEO_RESOURCES
)) {
3018 b
= &bttv_tvnorms
[btv
->tvnorm
].cropcap
.bounds
;
3021 b_right
= b_left
+ b
->width
;
3022 b_bottom
= b
->top
+ b
->height
;
3024 b_top
= max(b
->top
, btv
->vbi_end
);
3025 if (b_top
+ 32 >= b_bottom
) {
3029 /* Min. scaled size 48 x 32. */
3030 c
.rect
.left
= clamp(crop
->c
.left
, b_left
, b_right
- 48);
3031 c
.rect
.left
= min(c
.rect
.left
, (__s32
) MAX_HDELAY
);
3033 c
.rect
.width
= clamp(crop
->c
.width
,
3034 48, b_right
- c
.rect
.left
);
3036 c
.rect
.top
= clamp(crop
->c
.top
, b_top
, b_bottom
- 32);
3037 /* Top and height must be a multiple of two. */
3038 c
.rect
.top
= (c
.rect
.top
+ 1) & ~1;
3040 c
.rect
.height
= clamp(crop
->c
.height
,
3041 32, b_bottom
- c
.rect
.top
);
3042 c
.rect
.height
= (c
.rect
.height
+ 1) & ~1;
3044 bttv_crop_calc_limits(&c
);
3050 if (fh
->width
< c
.min_scaled_width
) {
3051 fh
->width
= c
.min_scaled_width
;
3052 btv
->init
.width
= c
.min_scaled_width
;
3053 } else if (fh
->width
> c
.max_scaled_width
) {
3054 fh
->width
= c
.max_scaled_width
;
3055 btv
->init
.width
= c
.max_scaled_width
;
3058 if (fh
->height
< c
.min_scaled_height
) {
3059 fh
->height
= c
.min_scaled_height
;
3060 btv
->init
.height
= c
.min_scaled_height
;
3061 } else if (fh
->height
> c
.max_scaled_height
) {
3062 fh
->height
= c
.max_scaled_height
;
3063 btv
->init
.height
= c
.max_scaled_height
;
3069 static int bttv_g_audio(struct file
*file
, void *priv
, struct v4l2_audio
*a
)
3071 if (unlikely(a
->index
))
3074 strcpy(a
->name
, "audio");
3078 static int bttv_s_audio(struct file
*file
, void *priv
, struct v4l2_audio
*a
)
3080 if (unlikely(a
->index
))
3086 static ssize_t
bttv_read(struct file
*file
, char __user
*data
,
3087 size_t count
, loff_t
*ppos
)
3089 struct bttv_fh
*fh
= file
->private_data
;
3092 if (fh
->btv
->errors
)
3093 bttv_reinit_bt848(fh
->btv
);
3094 dprintk("bttv%d: read count=%d type=%s\n",
3095 fh
->btv
->c
.nr
,(int)count
,v4l2_type_names
[fh
->type
]);
3098 case V4L2_BUF_TYPE_VIDEO_CAPTURE
:
3099 if (!check_alloc_btres_lock(fh
->btv
, fh
, RESOURCE_VIDEO_READ
)) {
3100 /* VIDEO_READ in use by another fh,
3101 or VIDEO_STREAM by any fh. */
3104 retval
= videobuf_read_one(&fh
->cap
, data
, count
, ppos
,
3105 file
->f_flags
& O_NONBLOCK
);
3106 free_btres_lock(fh
->btv
, fh
, RESOURCE_VIDEO_READ
);
3108 case V4L2_BUF_TYPE_VBI_CAPTURE
:
3109 if (!check_alloc_btres_lock(fh
->btv
,fh
,RESOURCE_VBI
))
3111 retval
= videobuf_read_stream(&fh
->vbi
, data
, count
, ppos
, 1,
3112 file
->f_flags
& O_NONBLOCK
);
3120 static unsigned int bttv_poll(struct file
*file
, poll_table
*wait
)
3122 struct bttv_fh
*fh
= file
->private_data
;
3123 struct bttv_buffer
*buf
;
3124 enum v4l2_field field
;
3125 unsigned int rc
= POLLERR
;
3127 if (V4L2_BUF_TYPE_VBI_CAPTURE
== fh
->type
) {
3128 if (!check_alloc_btres_lock(fh
->btv
,fh
,RESOURCE_VBI
))
3130 return videobuf_poll_stream(file
, &fh
->vbi
, wait
);
3133 if (check_btres(fh
,RESOURCE_VIDEO_STREAM
)) {
3134 /* streaming capture */
3135 if (list_empty(&fh
->cap
.stream
))
3137 buf
= list_entry(fh
->cap
.stream
.next
,struct bttv_buffer
,vb
.stream
);
3139 /* read() capture */
3140 if (NULL
== fh
->cap
.read_buf
) {
3141 /* need to capture a new frame */
3142 if (locked_btres(fh
->btv
,RESOURCE_VIDEO_STREAM
))
3144 fh
->cap
.read_buf
= videobuf_sg_alloc(fh
->cap
.msize
);
3145 if (NULL
== fh
->cap
.read_buf
)
3147 fh
->cap
.read_buf
->memory
= V4L2_MEMORY_USERPTR
;
3148 field
= videobuf_next_field(&fh
->cap
);
3149 if (0 != fh
->cap
.ops
->buf_prepare(&fh
->cap
,fh
->cap
.read_buf
,field
)) {
3150 kfree (fh
->cap
.read_buf
);
3151 fh
->cap
.read_buf
= NULL
;
3154 fh
->cap
.ops
->buf_queue(&fh
->cap
,fh
->cap
.read_buf
);
3155 fh
->cap
.read_off
= 0;
3157 buf
= (struct bttv_buffer
*)fh
->cap
.read_buf
;
3160 poll_wait(file
, &buf
->vb
.done
, wait
);
3161 if (buf
->vb
.state
== VIDEOBUF_DONE
||
3162 buf
->vb
.state
== VIDEOBUF_ERROR
)
3163 rc
= POLLIN
|POLLRDNORM
;
3170 static int bttv_open(struct file
*file
)
3172 struct video_device
*vdev
= video_devdata(file
);
3173 struct bttv
*btv
= video_drvdata(file
);
3175 enum v4l2_buf_type type
= 0;
3177 dprintk(KERN_DEBUG
"bttv: open dev=%s\n", video_device_node_name(vdev
));
3179 if (vdev
->vfl_type
== VFL_TYPE_GRABBER
) {
3180 type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
3181 } else if (vdev
->vfl_type
== VFL_TYPE_VBI
) {
3182 type
= V4L2_BUF_TYPE_VBI_CAPTURE
;
3188 dprintk(KERN_DEBUG
"bttv%d: open called (type=%s)\n",
3189 btv
->c
.nr
,v4l2_type_names
[type
]);
3191 /* allocate per filehandle data */
3192 fh
= kmalloc(sizeof(*fh
), GFP_KERNEL
);
3195 file
->private_data
= fh
;
3200 fh
->ov
.setup_ok
= 0;
3202 v4l2_prio_open(&btv
->prio
, &fh
->prio
);
3204 videobuf_queue_sg_init(&fh
->cap
, &bttv_video_qops
,
3205 &btv
->c
.pci
->dev
, &btv
->s_lock
,
3206 V4L2_BUF_TYPE_VIDEO_CAPTURE
,
3207 V4L2_FIELD_INTERLACED
,
3208 sizeof(struct bttv_buffer
),
3210 videobuf_queue_sg_init(&fh
->vbi
, &bttv_vbi_qops
,
3211 &btv
->c
.pci
->dev
, &btv
->s_lock
,
3212 V4L2_BUF_TYPE_VBI_CAPTURE
,
3214 sizeof(struct bttv_buffer
),
3216 set_tvnorm(btv
,btv
->tvnorm
);
3217 set_input(btv
, btv
->input
, btv
->tvnorm
);
3221 /* The V4L2 spec requires one global set of cropping parameters
3222 which only change on request. These are stored in btv->crop[1].
3223 However for compatibility with V4L apps and cropping unaware
3224 V4L2 apps we now reset the cropping parameters as seen through
3225 this fh, which is to say VIDIOC_G_CROP and scaling limit checks
3226 will use btv->crop[0], the default cropping parameters for the
3227 current video standard, and VIDIOC_S_FMT will not implicitely
3228 change the cropping parameters until VIDIOC_S_CROP has been
3230 fh
->do_crop
= !reset_crop
; /* module parameter */
3232 /* Likewise there should be one global set of VBI capture
3233 parameters, but for compatibility with V4L apps and earlier
3234 driver versions each fh has its own parameters. */
3235 bttv_vbi_fmt_reset(&fh
->vbi_fmt
, btv
->tvnorm
);
3237 bttv_field_count(btv
);
3241 static int bttv_release(struct file
*file
)
3243 struct bttv_fh
*fh
= file
->private_data
;
3244 struct bttv
*btv
= fh
->btv
;
3246 /* turn off overlay */
3247 if (check_btres(fh
, RESOURCE_OVERLAY
))
3248 bttv_switch_overlay(btv
,fh
,NULL
);
3250 /* stop video capture */
3251 if (check_btres(fh
, RESOURCE_VIDEO_STREAM
)) {
3252 videobuf_streamoff(&fh
->cap
);
3253 free_btres_lock(btv
,fh
,RESOURCE_VIDEO_STREAM
);
3255 if (fh
->cap
.read_buf
) {
3256 buffer_release(&fh
->cap
,fh
->cap
.read_buf
);
3257 kfree(fh
->cap
.read_buf
);
3259 if (check_btres(fh
, RESOURCE_VIDEO_READ
)) {
3260 free_btres_lock(btv
, fh
, RESOURCE_VIDEO_READ
);
3263 /* stop vbi capture */
3264 if (check_btres(fh
, RESOURCE_VBI
)) {
3265 videobuf_stop(&fh
->vbi
);
3266 free_btres_lock(btv
,fh
,RESOURCE_VBI
);
3271 videobuf_mmap_free(&fh
->cap
);
3272 videobuf_mmap_free(&fh
->vbi
);
3273 v4l2_prio_close(&btv
->prio
, fh
->prio
);
3274 file
->private_data
= NULL
;
3278 bttv_field_count(btv
);
3287 bttv_mmap(struct file
*file
, struct vm_area_struct
*vma
)
3289 struct bttv_fh
*fh
= file
->private_data
;
3291 dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
3292 fh
->btv
->c
.nr
, v4l2_type_names
[fh
->type
],
3293 vma
->vm_start
, vma
->vm_end
- vma
->vm_start
);
3294 return videobuf_mmap_mapper(bttv_queue(fh
),vma
);
3297 static const struct v4l2_file_operations bttv_fops
=
3299 .owner
= THIS_MODULE
,
3301 .release
= bttv_release
,
3302 .unlocked_ioctl
= video_ioctl2
,
3308 static const struct v4l2_ioctl_ops bttv_ioctl_ops
= {
3309 .vidioc_querycap
= bttv_querycap
,
3310 .vidioc_enum_fmt_vid_cap
= bttv_enum_fmt_vid_cap
,
3311 .vidioc_g_fmt_vid_cap
= bttv_g_fmt_vid_cap
,
3312 .vidioc_try_fmt_vid_cap
= bttv_try_fmt_vid_cap
,
3313 .vidioc_s_fmt_vid_cap
= bttv_s_fmt_vid_cap
,
3314 .vidioc_enum_fmt_vid_overlay
= bttv_enum_fmt_vid_overlay
,
3315 .vidioc_g_fmt_vid_overlay
= bttv_g_fmt_vid_overlay
,
3316 .vidioc_try_fmt_vid_overlay
= bttv_try_fmt_vid_overlay
,
3317 .vidioc_s_fmt_vid_overlay
= bttv_s_fmt_vid_overlay
,
3318 .vidioc_g_fmt_vbi_cap
= bttv_g_fmt_vbi_cap
,
3319 .vidioc_try_fmt_vbi_cap
= bttv_try_fmt_vbi_cap
,
3320 .vidioc_s_fmt_vbi_cap
= bttv_s_fmt_vbi_cap
,
3321 .vidioc_g_audio
= bttv_g_audio
,
3322 .vidioc_s_audio
= bttv_s_audio
,
3323 .vidioc_cropcap
= bttv_cropcap
,
3324 .vidioc_reqbufs
= bttv_reqbufs
,
3325 .vidioc_querybuf
= bttv_querybuf
,
3326 .vidioc_qbuf
= bttv_qbuf
,
3327 .vidioc_dqbuf
= bttv_dqbuf
,
3328 .vidioc_s_std
= bttv_s_std
,
3329 .vidioc_enum_input
= bttv_enum_input
,
3330 .vidioc_g_input
= bttv_g_input
,
3331 .vidioc_s_input
= bttv_s_input
,
3332 .vidioc_queryctrl
= bttv_queryctrl
,
3333 .vidioc_g_ctrl
= bttv_g_ctrl
,
3334 .vidioc_s_ctrl
= bttv_s_ctrl
,
3335 .vidioc_streamon
= bttv_streamon
,
3336 .vidioc_streamoff
= bttv_streamoff
,
3337 .vidioc_g_tuner
= bttv_g_tuner
,
3338 .vidioc_s_tuner
= bttv_s_tuner
,
3339 .vidioc_g_crop
= bttv_g_crop
,
3340 .vidioc_s_crop
= bttv_s_crop
,
3341 .vidioc_g_fbuf
= bttv_g_fbuf
,
3342 .vidioc_s_fbuf
= bttv_s_fbuf
,
3343 .vidioc_overlay
= bttv_overlay
,
3344 .vidioc_g_priority
= bttv_g_priority
,
3345 .vidioc_s_priority
= bttv_s_priority
,
3346 .vidioc_g_parm
= bttv_g_parm
,
3347 .vidioc_g_frequency
= bttv_g_frequency
,
3348 .vidioc_s_frequency
= bttv_s_frequency
,
3349 .vidioc_log_status
= bttv_log_status
,
3350 .vidioc_querystd
= bttv_querystd
,
3351 #ifdef CONFIG_VIDEO_ADV_DEBUG
3352 .vidioc_g_register
= bttv_g_register
,
3353 .vidioc_s_register
= bttv_s_register
,
3357 static struct video_device bttv_video_template
= {
3359 .ioctl_ops
= &bttv_ioctl_ops
,
3360 .tvnorms
= BTTV_NORMS
,
3361 .current_norm
= V4L2_STD_PAL
,
3364 /* ----------------------------------------------------------------------- */
3365 /* radio interface */
3367 static int radio_open(struct file
*file
)
3369 struct video_device
*vdev
= video_devdata(file
);
3370 struct bttv
*btv
= video_drvdata(file
);
3373 dprintk("bttv: open dev=%s\n", video_device_node_name(vdev
));
3375 dprintk("bttv%d: open called (radio)\n",btv
->c
.nr
);
3377 /* allocate per filehandle data */
3378 fh
= kmalloc(sizeof(*fh
), GFP_KERNEL
);
3381 file
->private_data
= fh
;
3384 v4l2_prio_open(&btv
->prio
, &fh
->prio
);
3388 bttv_call_all(btv
, tuner
, s_radio
);
3389 audio_input(btv
,TVAUDIO_INPUT_RADIO
);
3394 static int radio_release(struct file
*file
)
3396 struct bttv_fh
*fh
= file
->private_data
;
3397 struct bttv
*btv
= fh
->btv
;
3398 struct saa6588_command cmd
;
3400 v4l2_prio_close(&btv
->prio
, fh
->prio
);
3401 file
->private_data
= NULL
;
3406 bttv_call_all(btv
, core
, ioctl
, SAA6588_CMD_CLOSE
, &cmd
);
3411 static int radio_querycap(struct file
*file
, void *priv
,
3412 struct v4l2_capability
*cap
)
3414 struct bttv_fh
*fh
= priv
;
3415 struct bttv
*btv
= fh
->btv
;
3417 strcpy(cap
->driver
, "bttv");
3418 strlcpy(cap
->card
, btv
->radio_dev
->name
, sizeof(cap
->card
));
3419 sprintf(cap
->bus_info
, "PCI:%s", pci_name(btv
->c
.pci
));
3420 cap
->capabilities
= V4L2_CAP_TUNER
;
3425 static int radio_g_tuner(struct file
*file
, void *priv
, struct v4l2_tuner
*t
)
3427 struct bttv_fh
*fh
= priv
;
3428 struct bttv
*btv
= fh
->btv
;
3430 if (btv
->tuner_type
== TUNER_ABSENT
)
3434 strcpy(t
->name
, "Radio");
3435 t
->type
= V4L2_TUNER_RADIO
;
3437 bttv_call_all(btv
, tuner
, g_tuner
, t
);
3439 if (btv
->audio_mode_gpio
)
3440 btv
->audio_mode_gpio(btv
, t
, 0);
3445 static int radio_enum_input(struct file
*file
, void *priv
,
3446 struct v4l2_input
*i
)
3451 strcpy(i
->name
, "Radio");
3452 i
->type
= V4L2_INPUT_TYPE_TUNER
;
3457 static int radio_g_audio(struct file
*file
, void *priv
,
3458 struct v4l2_audio
*a
)
3460 if (unlikely(a
->index
))
3463 strcpy(a
->name
, "Radio");
3468 static int radio_s_tuner(struct file
*file
, void *priv
,
3469 struct v4l2_tuner
*t
)
3471 struct bttv_fh
*fh
= priv
;
3472 struct bttv
*btv
= fh
->btv
;
3477 bttv_call_all(btv
, tuner
, s_tuner
, t
);
3481 static int radio_s_audio(struct file
*file
, void *priv
,
3482 struct v4l2_audio
*a
)
3484 if (unlikely(a
->index
))
3490 static int radio_s_input(struct file
*filp
, void *priv
, unsigned int i
)
3498 static int radio_s_std(struct file
*file
, void *fh
, v4l2_std_id
*norm
)
3503 static int radio_queryctrl(struct file
*file
, void *priv
,
3504 struct v4l2_queryctrl
*c
)
3506 const struct v4l2_queryctrl
*ctrl
;
3508 if (c
->id
< V4L2_CID_BASE
||
3509 c
->id
>= V4L2_CID_LASTP1
)
3512 if (c
->id
== V4L2_CID_AUDIO_MUTE
) {
3513 ctrl
= ctrl_by_id(c
->id
);
3521 static int radio_g_input(struct file
*filp
, void *priv
, unsigned int *i
)
3527 static ssize_t
radio_read(struct file
*file
, char __user
*data
,
3528 size_t count
, loff_t
*ppos
)
3530 struct bttv_fh
*fh
= file
->private_data
;
3531 struct bttv
*btv
= fh
->btv
;
3532 struct saa6588_command cmd
;
3533 cmd
.block_count
= count
/3;
3535 cmd
.instance
= file
;
3536 cmd
.result
= -ENODEV
;
3538 bttv_call_all(btv
, core
, ioctl
, SAA6588_CMD_READ
, &cmd
);
3543 static unsigned int radio_poll(struct file
*file
, poll_table
*wait
)
3545 struct bttv_fh
*fh
= file
->private_data
;
3546 struct bttv
*btv
= fh
->btv
;
3547 struct saa6588_command cmd
;
3548 cmd
.instance
= file
;
3549 cmd
.event_list
= wait
;
3550 cmd
.result
= -ENODEV
;
3551 bttv_call_all(btv
, core
, ioctl
, SAA6588_CMD_POLL
, &cmd
);
3556 static const struct v4l2_file_operations radio_fops
=
3558 .owner
= THIS_MODULE
,
3561 .release
= radio_release
,
3562 .unlocked_ioctl
= video_ioctl2
,
3566 static const struct v4l2_ioctl_ops radio_ioctl_ops
= {
3567 .vidioc_querycap
= radio_querycap
,
3568 .vidioc_g_tuner
= radio_g_tuner
,
3569 .vidioc_enum_input
= radio_enum_input
,
3570 .vidioc_g_audio
= radio_g_audio
,
3571 .vidioc_s_tuner
= radio_s_tuner
,
3572 .vidioc_s_audio
= radio_s_audio
,
3573 .vidioc_s_input
= radio_s_input
,
3574 .vidioc_s_std
= radio_s_std
,
3575 .vidioc_queryctrl
= radio_queryctrl
,
3576 .vidioc_g_input
= radio_g_input
,
3577 .vidioc_g_ctrl
= bttv_g_ctrl
,
3578 .vidioc_s_ctrl
= bttv_s_ctrl
,
3579 .vidioc_g_frequency
= bttv_g_frequency
,
3580 .vidioc_s_frequency
= bttv_s_frequency
,
3583 static struct video_device radio_template
= {
3584 .fops
= &radio_fops
,
3585 .ioctl_ops
= &radio_ioctl_ops
,
3588 /* ----------------------------------------------------------------------- */
3589 /* some debug code */
3591 static int bttv_risc_decode(u32 risc
)
3593 static char *instr
[16] = {
3594 [ BT848_RISC_WRITE
>> 28 ] = "write",
3595 [ BT848_RISC_SKIP
>> 28 ] = "skip",
3596 [ BT848_RISC_WRITEC
>> 28 ] = "writec",
3597 [ BT848_RISC_JUMP
>> 28 ] = "jump",
3598 [ BT848_RISC_SYNC
>> 28 ] = "sync",
3599 [ BT848_RISC_WRITE123
>> 28 ] = "write123",
3600 [ BT848_RISC_SKIP123
>> 28 ] = "skip123",
3601 [ BT848_RISC_WRITE1S23
>> 28 ] = "write1s23",
3603 static int incr
[16] = {
3604 [ BT848_RISC_WRITE
>> 28 ] = 2,
3605 [ BT848_RISC_JUMP
>> 28 ] = 2,
3606 [ BT848_RISC_SYNC
>> 28 ] = 2,
3607 [ BT848_RISC_WRITE123
>> 28 ] = 5,
3608 [ BT848_RISC_SKIP123
>> 28 ] = 2,
3609 [ BT848_RISC_WRITE1S23
>> 28 ] = 3,
3611 static char *bits
[] = {
3612 "be0", "be1", "be2", "be3/resync",
3613 "set0", "set1", "set2", "set3",
3614 "clr0", "clr1", "clr2", "clr3",
3615 "irq", "res", "eol", "sol",
3619 printk("0x%08x [ %s", risc
,
3620 instr
[risc
>> 28] ? instr
[risc
>> 28] : "INVALID");
3621 for (i
= ARRAY_SIZE(bits
)-1; i
>= 0; i
--)
3622 if (risc
& (1 << (i
+ 12)))
3623 printk(" %s",bits
[i
]);
3624 printk(" count=%d ]\n", risc
& 0xfff);
3625 return incr
[risc
>> 28] ? incr
[risc
>> 28] : 1;
3628 static void bttv_risc_disasm(struct bttv
*btv
,
3629 struct btcx_riscmem
*risc
)
3633 printk("%s: risc disasm: %p [dma=0x%08lx]\n",
3634 btv
->c
.v4l2_dev
.name
, risc
->cpu
, (unsigned long)risc
->dma
);
3635 for (i
= 0; i
< (risc
->size
>> 2); i
+= n
) {
3636 printk("%s: 0x%lx: ", btv
->c
.v4l2_dev
.name
,
3637 (unsigned long)(risc
->dma
+ (i
<<2)));
3638 n
= bttv_risc_decode(le32_to_cpu(risc
->cpu
[i
]));
3639 for (j
= 1; j
< n
; j
++)
3640 printk("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3641 btv
->c
.v4l2_dev
.name
, (unsigned long)(risc
->dma
+ ((i
+j
)<<2)),
3643 if (0 == risc
->cpu
[i
])
3648 static void bttv_print_riscaddr(struct bttv
*btv
)
3650 printk(" main: %08Lx\n",
3651 (unsigned long long)btv
->main
.dma
);
3652 printk(" vbi : o=%08Lx e=%08Lx\n",
3653 btv
->cvbi
? (unsigned long long)btv
->cvbi
->top
.dma
: 0,
3654 btv
->cvbi
? (unsigned long long)btv
->cvbi
->bottom
.dma
: 0);
3655 printk(" cap : o=%08Lx e=%08Lx\n",
3656 btv
->curr
.top
? (unsigned long long)btv
->curr
.top
->top
.dma
: 0,
3657 btv
->curr
.bottom
? (unsigned long long)btv
->curr
.bottom
->bottom
.dma
: 0);
3658 printk(" scr : o=%08Lx e=%08Lx\n",
3659 btv
->screen
? (unsigned long long)btv
->screen
->top
.dma
: 0,
3660 btv
->screen
? (unsigned long long)btv
->screen
->bottom
.dma
: 0);
3661 bttv_risc_disasm(btv
, &btv
->main
);
3664 /* ----------------------------------------------------------------------- */
3667 static char *irq_name
[] = {
3668 "FMTCHG", // format change detected (525 vs. 625)
3669 "VSYNC", // vertical sync (new field)
3670 "HSYNC", // horizontal sync
3671 "OFLOW", // chroma/luma AGC overflow
3672 "HLOCK", // horizontal lock changed
3673 "VPRES", // video presence changed
3675 "I2CDONE", // hw irc operation finished
3676 "GPINT", // gpio port triggered irq
3678 "RISCI", // risc instruction triggered irq
3679 "FBUS", // pixel data fifo dropped data (high pci bus latencies)
3680 "FTRGT", // pixel data fifo overrun
3681 "FDSR", // fifo data stream resyncronisation
3682 "PPERR", // parity error (data transfer)
3683 "RIPERR", // parity error (read risc instructions)
3684 "PABORT", // pci abort
3685 "OCERR", // risc instruction error
3686 "SCERR", // syncronisation error
3689 static void bttv_print_irqbits(u32 print
, u32 mark
)
3694 for (i
= 0; i
< ARRAY_SIZE(irq_name
); i
++) {
3695 if (print
& (1 << i
))
3696 printk(" %s",irq_name
[i
]);
3697 if (mark
& (1 << i
))
3702 static void bttv_irq_debug_low_latency(struct bttv
*btv
, u32 rc
)
3704 printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3706 (unsigned long)btv
->main
.dma
,
3707 (unsigned long)le32_to_cpu(btv
->main
.cpu
[RISC_SLOT_O_VBI
+1]),
3708 (unsigned long)le32_to_cpu(btv
->main
.cpu
[RISC_SLOT_O_FIELD
+1]),
3711 if (0 == (btread(BT848_DSTATUS
) & BT848_DSTATUS_HLOC
)) {
3712 printk("bttv%d: Oh, there (temporarely?) is no input signal. "
3713 "Ok, then this is harmless, don't worry ;)\n",
3717 printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
3719 printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
3725 bttv_irq_next_video(struct bttv
*btv
, struct bttv_buffer_set
*set
)
3727 struct bttv_buffer
*item
;
3729 memset(set
,0,sizeof(*set
));
3731 /* capture request ? */
3732 if (!list_empty(&btv
->capture
)) {
3734 item
= list_entry(btv
->capture
.next
, struct bttv_buffer
, vb
.queue
);
3735 if (V4L2_FIELD_HAS_TOP(item
->vb
.field
))
3737 if (V4L2_FIELD_HAS_BOTTOM(item
->vb
.field
))
3740 /* capture request for other field ? */
3741 if (!V4L2_FIELD_HAS_BOTH(item
->vb
.field
) &&
3742 (item
->vb
.queue
.next
!= &btv
->capture
)) {
3743 item
= list_entry(item
->vb
.queue
.next
, struct bttv_buffer
, vb
.queue
);
3744 /* Mike Isely <isely@pobox.com> - Only check
3745 * and set up the bottom field in the logic
3746 * below. Don't ever do the top field. This
3747 * of course means that if we set up the
3748 * bottom field in the above code that we'll
3749 * actually skip a field. But that's OK.
3750 * Having processed only a single buffer this
3751 * time, then the next time around the first
3752 * available buffer should be for a top field.
3753 * That will then cause us here to set up a
3754 * top then a bottom field in the normal way.
3755 * The alternative to this understanding is
3756 * that we set up the second available buffer
3757 * as a top field, but that's out of order
3758 * since this driver always processes the top
3759 * field first - the effect will be the two
3760 * buffers being returned in the wrong order,
3761 * with the second buffer also being delayed
3762 * by one field time (owing to the fifo nature
3763 * of videobuf). Worse still, we'll be stuck
3764 * doing fields out of order now every time
3765 * until something else causes a field to be
3766 * dropped. By effectively forcing a field to
3767 * drop this way then we always get back into
3768 * sync within a single frame time. (Out of
3769 * order fields can screw up deinterlacing
3771 if (!V4L2_FIELD_HAS_BOTH(item
->vb
.field
)) {
3772 if (NULL
== set
->bottom
&&
3773 V4L2_FIELD_BOTTOM
== item
->vb
.field
) {
3776 if (NULL
!= set
->top
&& NULL
!= set
->bottom
)
3782 /* screen overlay ? */
3783 if (NULL
!= btv
->screen
) {
3784 if (V4L2_FIELD_HAS_BOTH(btv
->screen
->vb
.field
)) {
3785 if (NULL
== set
->top
&& NULL
== set
->bottom
) {
3786 set
->top
= btv
->screen
;
3787 set
->bottom
= btv
->screen
;
3790 if (V4L2_FIELD_TOP
== btv
->screen
->vb
.field
&&
3792 set
->top
= btv
->screen
;
3794 if (V4L2_FIELD_BOTTOM
== btv
->screen
->vb
.field
&&
3795 NULL
== set
->bottom
) {
3796 set
->bottom
= btv
->screen
;
3801 dprintk("bttv%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3802 btv
->c
.nr
,set
->top
, set
->bottom
,
3803 btv
->screen
,set
->frame_irq
,set
->top_irq
);
3808 bttv_irq_wakeup_video(struct bttv
*btv
, struct bttv_buffer_set
*wakeup
,
3809 struct bttv_buffer_set
*curr
, unsigned int state
)
3813 do_gettimeofday(&ts
);
3815 if (wakeup
->top
== wakeup
->bottom
) {
3816 if (NULL
!= wakeup
->top
&& curr
->top
!= wakeup
->top
) {
3818 printk("bttv%d: wakeup: both=%p\n",btv
->c
.nr
,wakeup
->top
);
3819 wakeup
->top
->vb
.ts
= ts
;
3820 wakeup
->top
->vb
.field_count
= btv
->field_count
;
3821 wakeup
->top
->vb
.state
= state
;
3822 wake_up(&wakeup
->top
->vb
.done
);
3825 if (NULL
!= wakeup
->top
&& curr
->top
!= wakeup
->top
) {
3827 printk("bttv%d: wakeup: top=%p\n",btv
->c
.nr
,wakeup
->top
);
3828 wakeup
->top
->vb
.ts
= ts
;
3829 wakeup
->top
->vb
.field_count
= btv
->field_count
;
3830 wakeup
->top
->vb
.state
= state
;
3831 wake_up(&wakeup
->top
->vb
.done
);
3833 if (NULL
!= wakeup
->bottom
&& curr
->bottom
!= wakeup
->bottom
) {
3835 printk("bttv%d: wakeup: bottom=%p\n",btv
->c
.nr
,wakeup
->bottom
);
3836 wakeup
->bottom
->vb
.ts
= ts
;
3837 wakeup
->bottom
->vb
.field_count
= btv
->field_count
;
3838 wakeup
->bottom
->vb
.state
= state
;
3839 wake_up(&wakeup
->bottom
->vb
.done
);
3845 bttv_irq_wakeup_vbi(struct bttv
*btv
, struct bttv_buffer
*wakeup
,
3853 do_gettimeofday(&ts
);
3855 wakeup
->vb
.field_count
= btv
->field_count
;
3856 wakeup
->vb
.state
= state
;
3857 wake_up(&wakeup
->vb
.done
);
3860 static void bttv_irq_timeout(unsigned long data
)
3862 struct bttv
*btv
= (struct bttv
*)data
;
3863 struct bttv_buffer_set old
,new;
3864 struct bttv_buffer
*ovbi
;
3865 struct bttv_buffer
*item
;
3866 unsigned long flags
;
3869 printk(KERN_INFO
"bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3870 btv
->c
.nr
, btv
->framedrop
, btv
->irq_me
, btv
->irq_total
,
3871 btread(BT848_RISC_COUNT
));
3872 bttv_print_irqbits(btread(BT848_INT_STAT
),0);
3876 spin_lock_irqsave(&btv
->s_lock
,flags
);
3878 /* deactivate stuff */
3879 memset(&new,0,sizeof(new));
3885 bttv_buffer_activate_video(btv
, &new);
3886 bttv_buffer_activate_vbi(btv
, NULL
);
3887 bttv_set_dma(btv
, 0);
3890 bttv_irq_wakeup_video(btv
, &old
, &new, VIDEOBUF_ERROR
);
3891 bttv_irq_wakeup_vbi(btv
, ovbi
, VIDEOBUF_ERROR
);
3893 /* cancel all outstanding capture / vbi requests */
3894 while (!list_empty(&btv
->capture
)) {
3895 item
= list_entry(btv
->capture
.next
, struct bttv_buffer
, vb
.queue
);
3896 list_del(&item
->vb
.queue
);
3897 item
->vb
.state
= VIDEOBUF_ERROR
;
3898 wake_up(&item
->vb
.done
);
3900 while (!list_empty(&btv
->vcapture
)) {
3901 item
= list_entry(btv
->vcapture
.next
, struct bttv_buffer
, vb
.queue
);
3902 list_del(&item
->vb
.queue
);
3903 item
->vb
.state
= VIDEOBUF_ERROR
;
3904 wake_up(&item
->vb
.done
);
3908 spin_unlock_irqrestore(&btv
->s_lock
,flags
);
3912 bttv_irq_wakeup_top(struct bttv
*btv
)
3914 struct bttv_buffer
*wakeup
= btv
->curr
.top
;
3919 spin_lock(&btv
->s_lock
);
3920 btv
->curr
.top_irq
= 0;
3921 btv
->curr
.top
= NULL
;
3922 bttv_risc_hook(btv
, RISC_SLOT_O_FIELD
, NULL
, 0);
3924 do_gettimeofday(&wakeup
->vb
.ts
);
3925 wakeup
->vb
.field_count
= btv
->field_count
;
3926 wakeup
->vb
.state
= VIDEOBUF_DONE
;
3927 wake_up(&wakeup
->vb
.done
);
3928 spin_unlock(&btv
->s_lock
);
3931 static inline int is_active(struct btcx_riscmem
*risc
, u32 rc
)
3935 if (rc
> risc
->dma
+ risc
->size
)
3941 bttv_irq_switch_video(struct bttv
*btv
)
3943 struct bttv_buffer_set
new;
3944 struct bttv_buffer_set old
;
3947 spin_lock(&btv
->s_lock
);
3949 /* new buffer set */
3950 bttv_irq_next_video(btv
, &new);
3951 rc
= btread(BT848_RISC_COUNT
);
3952 if ((btv
->curr
.top
&& is_active(&btv
->curr
.top
->top
, rc
)) ||
3953 (btv
->curr
.bottom
&& is_active(&btv
->curr
.bottom
->bottom
, rc
))) {
3956 bttv_irq_debug_low_latency(btv
, rc
);
3957 spin_unlock(&btv
->s_lock
);
3964 btv
->loop_irq
&= ~1;
3965 bttv_buffer_activate_video(btv
, &new);
3966 bttv_set_dma(btv
, 0);
3969 if (UNSET
!= btv
->new_input
) {
3970 video_mux(btv
,btv
->new_input
);
3971 btv
->new_input
= UNSET
;
3974 /* wake up finished buffers */
3975 bttv_irq_wakeup_video(btv
, &old
, &new, VIDEOBUF_DONE
);
3976 spin_unlock(&btv
->s_lock
);
3980 bttv_irq_switch_vbi(struct bttv
*btv
)
3982 struct bttv_buffer
*new = NULL
;
3983 struct bttv_buffer
*old
;
3986 spin_lock(&btv
->s_lock
);
3988 if (!list_empty(&btv
->vcapture
))
3989 new = list_entry(btv
->vcapture
.next
, struct bttv_buffer
, vb
.queue
);
3992 rc
= btread(BT848_RISC_COUNT
);
3993 if (NULL
!= old
&& (is_active(&old
->top
, rc
) ||
3994 is_active(&old
->bottom
, rc
))) {
3997 bttv_irq_debug_low_latency(btv
, rc
);
3998 spin_unlock(&btv
->s_lock
);
4004 btv
->loop_irq
&= ~4;
4005 bttv_buffer_activate_vbi(btv
, new);
4006 bttv_set_dma(btv
, 0);
4008 bttv_irq_wakeup_vbi(btv
, old
, VIDEOBUF_DONE
);
4009 spin_unlock(&btv
->s_lock
);
4012 static irqreturn_t
bttv_irq(int irq
, void *dev_id
)
4020 btv
=(struct bttv
*)dev_id
;
4024 /* get/clear interrupt status bits */
4025 stat
=btread(BT848_INT_STAT
);
4026 astat
=stat
&btread(BT848_INT_MASK
);
4030 btwrite(stat
,BT848_INT_STAT
);
4032 /* get device status bits */
4033 dstat
=btread(BT848_DSTATUS
);
4036 printk(KERN_DEBUG
"bttv%d: irq loop=%d fc=%d "
4037 "riscs=%x, riscc=%08x, ",
4038 btv
->c
.nr
, count
, btv
->field_count
,
4039 stat
>>28, btread(BT848_RISC_COUNT
));
4040 bttv_print_irqbits(stat
,astat
);
4041 if (stat
& BT848_INT_HLOCK
)
4042 printk(" HLOC => %s", (dstat
& BT848_DSTATUS_HLOC
)
4044 if (stat
& BT848_INT_VPRES
)
4045 printk(" PRES => %s", (dstat
& BT848_DSTATUS_PRES
)
4047 if (stat
& BT848_INT_FMTCHG
)
4048 printk(" NUML => %s", (dstat
& BT848_DSTATUS_NUML
)
4053 if (astat
&BT848_INT_VSYNC
)
4056 if ((astat
& BT848_INT_GPINT
) && btv
->remote
) {
4057 bttv_input_irq(btv
);
4060 if (astat
& BT848_INT_I2CDONE
) {
4061 btv
->i2c_done
= stat
;
4062 wake_up(&btv
->i2c_queue
);
4065 if ((astat
& BT848_INT_RISCI
) && (stat
& (4<<28)))
4066 bttv_irq_switch_vbi(btv
);
4068 if ((astat
& BT848_INT_RISCI
) && (stat
& (2<<28)))
4069 bttv_irq_wakeup_top(btv
);
4071 if ((astat
& BT848_INT_RISCI
) && (stat
& (1<<28)))
4072 bttv_irq_switch_video(btv
);
4074 if ((astat
& BT848_INT_HLOCK
) && btv
->opt_automute
)
4075 audio_mute(btv
, btv
->mute
); /* trigger automute */
4077 if (astat
& (BT848_INT_SCERR
|BT848_INT_OCERR
)) {
4078 printk(KERN_INFO
"bttv%d: %s%s @ %08x,",btv
->c
.nr
,
4079 (astat
& BT848_INT_SCERR
) ? "SCERR" : "",
4080 (astat
& BT848_INT_OCERR
) ? "OCERR" : "",
4081 btread(BT848_RISC_COUNT
));
4082 bttv_print_irqbits(stat
,astat
);
4085 bttv_print_riscaddr(btv
);
4087 if (fdsr
&& astat
& BT848_INT_FDSR
) {
4088 printk(KERN_INFO
"bttv%d: FDSR @ %08x\n",
4089 btv
->c
.nr
,btread(BT848_RISC_COUNT
));
4091 bttv_print_riscaddr(btv
);
4097 if (count
> 8 || !(astat
& BT848_INT_GPINT
)) {
4098 btwrite(0, BT848_INT_MASK
);
4101 "bttv%d: IRQ lockup, cleared int mask [", btv
->c
.nr
);
4104 "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv
->c
.nr
);
4106 btwrite(btread(BT848_INT_MASK
) & (-1 ^ BT848_INT_GPINT
),
4110 bttv_print_irqbits(stat
,astat
);
4118 return IRQ_RETVAL(handled
);
4122 /* ----------------------------------------------------------------------- */
4123 /* initialitation */
4125 static struct video_device
*vdev_init(struct bttv
*btv
,
4126 const struct video_device
*template,
4127 const char *type_name
)
4129 struct video_device
*vfd
;
4131 vfd
= video_device_alloc();
4135 vfd
->v4l2_dev
= &btv
->c
.v4l2_dev
;
4136 vfd
->release
= video_device_release
;
4137 vfd
->debug
= bttv_debug
;
4138 video_set_drvdata(vfd
, btv
);
4139 snprintf(vfd
->name
, sizeof(vfd
->name
), "BT%d%s %s (%s)",
4140 btv
->id
, (btv
->id
==848 && btv
->revision
==0x12) ? "A" : "",
4141 type_name
, bttv_tvcards
[btv
->c
.type
].name
);
4145 static void bttv_unregister_video(struct bttv
*btv
)
4147 if (btv
->video_dev
) {
4148 if (video_is_registered(btv
->video_dev
))
4149 video_unregister_device(btv
->video_dev
);
4151 video_device_release(btv
->video_dev
);
4152 btv
->video_dev
= NULL
;
4155 if (video_is_registered(btv
->vbi_dev
))
4156 video_unregister_device(btv
->vbi_dev
);
4158 video_device_release(btv
->vbi_dev
);
4159 btv
->vbi_dev
= NULL
;
4161 if (btv
->radio_dev
) {
4162 if (video_is_registered(btv
->radio_dev
))
4163 video_unregister_device(btv
->radio_dev
);
4165 video_device_release(btv
->radio_dev
);
4166 btv
->radio_dev
= NULL
;
4170 /* register video4linux devices */
4171 static int __devinit
bttv_register_video(struct bttv
*btv
)
4174 printk("bttv: Overlay support disabled.\n");
4177 btv
->video_dev
= vdev_init(btv
, &bttv_video_template
, "video");
4179 if (NULL
== btv
->video_dev
)
4181 if (video_register_device(btv
->video_dev
, VFL_TYPE_GRABBER
,
4182 video_nr
[btv
->c
.nr
]) < 0)
4184 printk(KERN_INFO
"bttv%d: registered device %s\n",
4185 btv
->c
.nr
, video_device_node_name(btv
->video_dev
));
4186 if (device_create_file(&btv
->video_dev
->dev
,
4187 &dev_attr_card
)<0) {
4188 printk(KERN_ERR
"bttv%d: device_create_file 'card' "
4189 "failed\n", btv
->c
.nr
);
4194 btv
->vbi_dev
= vdev_init(btv
, &bttv_video_template
, "vbi");
4196 if (NULL
== btv
->vbi_dev
)
4198 if (video_register_device(btv
->vbi_dev
, VFL_TYPE_VBI
,
4199 vbi_nr
[btv
->c
.nr
]) < 0)
4201 printk(KERN_INFO
"bttv%d: registered device %s\n",
4202 btv
->c
.nr
, video_device_node_name(btv
->vbi_dev
));
4204 if (!btv
->has_radio
)
4207 btv
->radio_dev
= vdev_init(btv
, &radio_template
, "radio");
4208 if (NULL
== btv
->radio_dev
)
4210 if (video_register_device(btv
->radio_dev
, VFL_TYPE_RADIO
,
4211 radio_nr
[btv
->c
.nr
]) < 0)
4213 printk(KERN_INFO
"bttv%d: registered device %s\n",
4214 btv
->c
.nr
, video_device_node_name(btv
->radio_dev
));
4220 bttv_unregister_video(btv
);
4225 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
4226 /* response on cards with no firmware is not enabled by OF */
4227 static void pci_set_command(struct pci_dev
*dev
)
4229 #if defined(__powerpc__)
4232 pci_read_config_dword(dev
, PCI_COMMAND
, &cmd
);
4233 cmd
= (cmd
| PCI_COMMAND_MEMORY
);
4234 pci_write_config_dword(dev
, PCI_COMMAND
, cmd
);
4238 static int __devinit
bttv_probe(struct pci_dev
*dev
,
4239 const struct pci_device_id
*pci_id
)
4245 if (bttv_num
== BTTV_MAX
)
4247 printk(KERN_INFO
"bttv: Bt8xx card found (%d).\n", bttv_num
);
4248 bttvs
[bttv_num
] = btv
= kzalloc(sizeof(*btv
), GFP_KERNEL
);
4250 printk(KERN_ERR
"bttv: out of memory.\n");
4253 btv
->c
.nr
= bttv_num
;
4254 snprintf(btv
->c
.v4l2_dev
.name
, sizeof(btv
->c
.v4l2_dev
.name
),
4255 "bttv%d", btv
->c
.nr
);
4257 /* initialize structs / fill in defaults */
4258 mutex_init(&btv
->lock
);
4259 spin_lock_init(&btv
->s_lock
);
4260 spin_lock_init(&btv
->gpio_lock
);
4261 init_waitqueue_head(&btv
->i2c_queue
);
4262 INIT_LIST_HEAD(&btv
->c
.subs
);
4263 INIT_LIST_HEAD(&btv
->capture
);
4264 INIT_LIST_HEAD(&btv
->vcapture
);
4265 v4l2_prio_init(&btv
->prio
);
4267 init_timer(&btv
->timeout
);
4268 btv
->timeout
.function
= bttv_irq_timeout
;
4269 btv
->timeout
.data
= (unsigned long)btv
;
4272 btv
->tuner_type
= UNSET
;
4273 btv
->new_input
= UNSET
;
4274 btv
->has_radio
=radio
[btv
->c
.nr
];
4276 /* pci stuff (init, get irq/mmio, ... */
4278 btv
->id
= dev
->device
;
4279 if (pci_enable_device(dev
)) {
4280 printk(KERN_WARNING
"bttv%d: Can't enable device.\n",
4284 if (pci_set_dma_mask(dev
, DMA_BIT_MASK(32))) {
4285 printk(KERN_WARNING
"bttv%d: No suitable DMA available.\n",
4289 if (!request_mem_region(pci_resource_start(dev
,0),
4290 pci_resource_len(dev
,0),
4291 btv
->c
.v4l2_dev
.name
)) {
4292 printk(KERN_WARNING
"bttv%d: can't request iomem (0x%llx).\n",
4294 (unsigned long long)pci_resource_start(dev
,0));
4297 pci_set_master(dev
);
4298 pci_set_command(dev
);
4300 result
= v4l2_device_register(&dev
->dev
, &btv
->c
.v4l2_dev
);
4302 printk(KERN_WARNING
"bttv%d: v4l2_device_register() failed\n", btv
->c
.nr
);
4306 btv
->revision
= dev
->revision
;
4307 pci_read_config_byte(dev
, PCI_LATENCY_TIMER
, &lat
);
4308 printk(KERN_INFO
"bttv%d: Bt%d (rev %d) at %s, ",
4309 bttv_num
,btv
->id
, btv
->revision
, pci_name(dev
));
4310 printk("irq: %d, latency: %d, mmio: 0x%llx\n",
4311 btv
->c
.pci
->irq
, lat
,
4312 (unsigned long long)pci_resource_start(dev
,0));
4315 btv
->bt848_mmio
= ioremap(pci_resource_start(dev
, 0), 0x1000);
4316 if (NULL
== btv
->bt848_mmio
) {
4317 printk("bttv%d: ioremap() failed\n", btv
->c
.nr
);
4325 /* disable irqs, register irq handler */
4326 btwrite(0, BT848_INT_MASK
);
4327 result
= request_irq(btv
->c
.pci
->irq
, bttv_irq
,
4328 IRQF_SHARED
| IRQF_DISABLED
, btv
->c
.v4l2_dev
.name
, (void *)btv
);
4330 printk(KERN_ERR
"bttv%d: can't get IRQ %d\n",
4331 bttv_num
,btv
->c
.pci
->irq
);
4335 if (0 != bttv_handle_chipset(btv
)) {
4340 /* init options from insmod args */
4341 btv
->opt_combfilter
= combfilter
;
4342 btv
->opt_lumafilter
= lumafilter
;
4343 btv
->opt_automute
= automute
;
4344 btv
->opt_chroma_agc
= chroma_agc
;
4345 btv
->opt_adc_crush
= adc_crush
;
4346 btv
->opt_vcr_hack
= vcr_hack
;
4347 btv
->opt_whitecrush_upper
= whitecrush_upper
;
4348 btv
->opt_whitecrush_lower
= whitecrush_lower
;
4349 btv
->opt_uv_ratio
= uv_ratio
;
4350 btv
->opt_full_luma_range
= full_luma_range
;
4351 btv
->opt_coring
= coring
;
4353 /* fill struct bttv with some useful defaults */
4354 btv
->init
.btv
= btv
;
4355 btv
->init
.ov
.w
.width
= 320;
4356 btv
->init
.ov
.w
.height
= 240;
4357 btv
->init
.fmt
= format_by_fourcc(V4L2_PIX_FMT_BGR24
);
4358 btv
->init
.width
= 320;
4359 btv
->init
.height
= 240;
4362 /* initialize hardware */
4364 bttv_gpio_tracking(btv
,"pre-init");
4366 bttv_risc_init_main(btv
);
4370 btwrite(0x00, BT848_GPIO_REG_INP
);
4371 btwrite(0x00, BT848_GPIO_OUT_EN
);
4373 bttv_gpio_tracking(btv
,"init");
4375 /* needs to be done before i2c is registered */
4376 bttv_init_card1(btv
);
4378 /* register i2c + gpio */
4381 /* some card-specific stuff (needs working i2c) */
4382 bttv_init_card2(btv
);
4383 bttv_init_tuner(btv
);
4386 /* register video4linux + input */
4387 if (!bttv_tvcards
[btv
->c
.type
].no_video
) {
4388 bttv_register_video(btv
);
4389 bt848_bright(btv
,32768);
4390 bt848_contrast(btv
,32768);
4391 bt848_hue(btv
,32768);
4392 bt848_sat(btv
,32768);
4394 set_input(btv
, 0, btv
->tvnorm
);
4395 bttv_crop_reset(&btv
->crop
[0], btv
->tvnorm
);
4396 btv
->crop
[1] = btv
->crop
[0]; /* current = default */
4397 disclaim_vbi_lines(btv
);
4398 disclaim_video_lines(btv
);
4401 /* add subdevices and autoload dvb-bt8xx if needed */
4402 if (bttv_tvcards
[btv
->c
.type
].has_dvb
) {
4403 bttv_sub_add_device(&btv
->c
, "dvb");
4404 request_modules(btv
);
4408 init_bttv_i2c_ir(btv
);
4409 bttv_input_init(btv
);
4412 /* everything is fine */
4417 free_irq(btv
->c
.pci
->irq
,btv
);
4420 v4l2_device_unregister(&btv
->c
.v4l2_dev
);
4423 if (btv
->bt848_mmio
)
4424 iounmap(btv
->bt848_mmio
);
4425 release_mem_region(pci_resource_start(btv
->c
.pci
,0),
4426 pci_resource_len(btv
->c
.pci
,0));
4430 static void __devexit
bttv_remove(struct pci_dev
*pci_dev
)
4432 struct v4l2_device
*v4l2_dev
= pci_get_drvdata(pci_dev
);
4433 struct bttv
*btv
= to_bttv(v4l2_dev
);
4436 printk("bttv%d: unloading\n",btv
->c
.nr
);
4438 if (bttv_tvcards
[btv
->c
.type
].has_dvb
)
4439 flush_request_modules(btv
);
4441 /* shutdown everything (DMA+IRQs) */
4442 btand(~15, BT848_GPIO_DMA_CTL
);
4443 btwrite(0, BT848_INT_MASK
);
4444 btwrite(~0x0, BT848_INT_STAT
);
4445 btwrite(0x0, BT848_GPIO_OUT_EN
);
4447 bttv_gpio_tracking(btv
,"cleanup");
4449 /* tell gpio modules we are leaving ... */
4451 bttv_input_fini(btv
);
4452 bttv_sub_del_devices(&btv
->c
);
4454 /* unregister i2c_bus + input */
4457 /* unregister video4linux */
4458 bttv_unregister_video(btv
);
4460 /* free allocated memory */
4461 btcx_riscmem_free(btv
->c
.pci
,&btv
->main
);
4463 /* free ressources */
4464 free_irq(btv
->c
.pci
->irq
,btv
);
4465 iounmap(btv
->bt848_mmio
);
4466 release_mem_region(pci_resource_start(btv
->c
.pci
,0),
4467 pci_resource_len(btv
->c
.pci
,0));
4469 v4l2_device_unregister(&btv
->c
.v4l2_dev
);
4470 bttvs
[btv
->c
.nr
] = NULL
;
4477 static int bttv_suspend(struct pci_dev
*pci_dev
, pm_message_t state
)
4479 struct v4l2_device
*v4l2_dev
= pci_get_drvdata(pci_dev
);
4480 struct bttv
*btv
= to_bttv(v4l2_dev
);
4481 struct bttv_buffer_set idle
;
4482 unsigned long flags
;
4484 dprintk("bttv%d: suspend %d\n", btv
->c
.nr
, state
.event
);
4486 /* stop dma + irqs */
4487 spin_lock_irqsave(&btv
->s_lock
,flags
);
4488 memset(&idle
, 0, sizeof(idle
));
4489 btv
->state
.video
= btv
->curr
;
4490 btv
->state
.vbi
= btv
->cvbi
;
4491 btv
->state
.loop_irq
= btv
->loop_irq
;
4494 bttv_buffer_activate_video(btv
, &idle
);
4495 bttv_buffer_activate_vbi(btv
, NULL
);
4496 bttv_set_dma(btv
, 0);
4497 btwrite(0, BT848_INT_MASK
);
4498 spin_unlock_irqrestore(&btv
->s_lock
,flags
);
4500 /* save bt878 state */
4501 btv
->state
.gpio_enable
= btread(BT848_GPIO_OUT_EN
);
4502 btv
->state
.gpio_data
= gpio_read();
4504 /* save pci state */
4505 pci_save_state(pci_dev
);
4506 if (0 != pci_set_power_state(pci_dev
, pci_choose_state(pci_dev
, state
))) {
4507 pci_disable_device(pci_dev
);
4508 btv
->state
.disabled
= 1;
4513 static int bttv_resume(struct pci_dev
*pci_dev
)
4515 struct v4l2_device
*v4l2_dev
= pci_get_drvdata(pci_dev
);
4516 struct bttv
*btv
= to_bttv(v4l2_dev
);
4517 unsigned long flags
;
4520 dprintk("bttv%d: resume\n", btv
->c
.nr
);
4522 /* restore pci state */
4523 if (btv
->state
.disabled
) {
4524 err
=pci_enable_device(pci_dev
);
4526 printk(KERN_WARNING
"bttv%d: Can't enable device.\n",
4530 btv
->state
.disabled
= 0;
4532 err
=pci_set_power_state(pci_dev
, PCI_D0
);
4534 pci_disable_device(pci_dev
);
4535 printk(KERN_WARNING
"bttv%d: Can't enable device.\n",
4537 btv
->state
.disabled
= 1;
4541 pci_restore_state(pci_dev
);
4543 /* restore bt878 state */
4544 bttv_reinit_bt848(btv
);
4545 gpio_inout(0xffffff, btv
->state
.gpio_enable
);
4546 gpio_write(btv
->state
.gpio_data
);
4549 spin_lock_irqsave(&btv
->s_lock
,flags
);
4550 btv
->curr
= btv
->state
.video
;
4551 btv
->cvbi
= btv
->state
.vbi
;
4552 btv
->loop_irq
= btv
->state
.loop_irq
;
4553 bttv_buffer_activate_video(btv
, &btv
->curr
);
4554 bttv_buffer_activate_vbi(btv
, btv
->cvbi
);
4555 bttv_set_dma(btv
, 0);
4556 spin_unlock_irqrestore(&btv
->s_lock
,flags
);
4561 static struct pci_device_id bttv_pci_tbl
[] = {
4562 {PCI_VDEVICE(BROOKTREE
, PCI_DEVICE_ID_BT848
), 0},
4563 {PCI_VDEVICE(BROOKTREE
, PCI_DEVICE_ID_BT849
), 0},
4564 {PCI_VDEVICE(BROOKTREE
, PCI_DEVICE_ID_BT878
), 0},
4565 {PCI_VDEVICE(BROOKTREE
, PCI_DEVICE_ID_BT879
), 0},
4569 MODULE_DEVICE_TABLE(pci
, bttv_pci_tbl
);
4571 static struct pci_driver bttv_pci_driver
= {
4573 .id_table
= bttv_pci_tbl
,
4574 .probe
= bttv_probe
,
4575 .remove
= __devexit_p(bttv_remove
),
4577 .suspend
= bttv_suspend
,
4578 .resume
= bttv_resume
,
4582 static int __init
bttv_init_module(void)
4588 printk(KERN_INFO
"bttv: driver version %s loaded\n",
4590 if (gbuffers
< 2 || gbuffers
> VIDEO_MAX_FRAME
)
4592 if (gbufsize
> BTTV_MAX_FBUF
)
4593 gbufsize
= BTTV_MAX_FBUF
;
4594 gbufsize
= (gbufsize
+ PAGE_SIZE
- 1) & PAGE_MASK
;
4596 printk(KERN_INFO
"bttv: using %d buffers with %dk (%d pages) each for capture\n",
4597 gbuffers
, gbufsize
>> 10, gbufsize
>> PAGE_SHIFT
);
4599 bttv_check_chipset();
4601 ret
= bus_register(&bttv_sub_bus_type
);
4603 printk(KERN_WARNING
"bttv: bus_register error: %d\n", ret
);
4606 ret
= pci_register_driver(&bttv_pci_driver
);
4608 bus_unregister(&bttv_sub_bus_type
);
4613 static void __exit
bttv_cleanup_module(void)
4615 pci_unregister_driver(&bttv_pci_driver
);
4616 bus_unregister(&bttv_sub_bus_type
);
4619 module_init(bttv_init_module
);
4620 module_exit(bttv_cleanup_module
);