V4L/DVB (3300): Add standard for South Korean NTSC-M using A2 audio.
[linux-2.6/libata-dev.git] / drivers / media / video / bttv-driver.c
blob578b20085082a54df29077b2b517e946a30482f0
1 /*
3 bttv - Bt848 frame grabber driver
5 Copyright (C) 1996,97,98 Ralph Metzler <rjkm@thp.uni-koeln.de>
6 & Marcus Metzler <mocm@thp.uni-koeln.de>
7 (c) 1999-2002 Gerd Knorr <kraxel@bytesex.org>
9 some v4l2 code lines are taken from Justin's bttv2 driver which is
10 (c) 2000 Justin Schoeman <justin@suntiger.ee.up.ac.za>
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <linux/init.h>
28 #include <linux/module.h>
29 #include <linux/moduleparam.h>
30 #include <linux/delay.h>
31 #include <linux/errno.h>
32 #include <linux/fs.h>
33 #include <linux/kernel.h>
34 #include <linux/sched.h>
35 #include <linux/interrupt.h>
36 #include <linux/kdev_t.h>
37 #include "bttvp.h"
38 #include <media/v4l2-common.h>
40 #include <linux/dma-mapping.h>
42 #include <asm/io.h>
43 #include <asm/byteorder.h>
45 #include "rds.h"
48 unsigned int bttv_num; /* number of Bt848s in use */
49 struct bttv bttvs[BTTV_MAX];
51 unsigned int bttv_debug;
52 unsigned int bttv_verbose = 1;
53 unsigned int bttv_gpio;
55 /* config variables */
56 #ifdef __BIG_ENDIAN
57 static unsigned int bigendian=1;
58 #else
59 static unsigned int bigendian;
60 #endif
61 static unsigned int radio[BTTV_MAX];
62 static unsigned int irq_debug;
63 static unsigned int gbuffers = 8;
64 static unsigned int gbufsize = 0x208000;
66 static int video_nr = -1;
67 static int radio_nr = -1;
68 static int vbi_nr = -1;
69 static int debug_latency;
71 static unsigned int fdsr;
73 /* options */
74 static unsigned int combfilter;
75 static unsigned int lumafilter;
76 static unsigned int automute = 1;
77 static unsigned int chroma_agc;
78 static unsigned int adc_crush = 1;
79 static unsigned int whitecrush_upper = 0xCF;
80 static unsigned int whitecrush_lower = 0x7F;
81 static unsigned int vcr_hack;
82 static unsigned int irq_iswitch;
83 static unsigned int uv_ratio = 50;
84 static unsigned int full_luma_range;
85 static unsigned int coring;
86 extern int no_overlay;
88 /* API features (turn on/off stuff for testing) */
89 static unsigned int v4l2 = 1;
91 /* insmod args */
92 module_param(bttv_verbose, int, 0644);
93 module_param(bttv_gpio, int, 0644);
94 module_param(bttv_debug, int, 0644);
95 module_param(irq_debug, int, 0644);
96 module_param(debug_latency, int, 0644);
98 module_param(fdsr, int, 0444);
99 module_param(video_nr, int, 0444);
100 module_param(radio_nr, int, 0444);
101 module_param(vbi_nr, int, 0444);
102 module_param(gbuffers, int, 0444);
103 module_param(gbufsize, int, 0444);
105 module_param(v4l2, int, 0644);
106 module_param(bigendian, int, 0644);
107 module_param(irq_iswitch, int, 0644);
108 module_param(combfilter, int, 0444);
109 module_param(lumafilter, int, 0444);
110 module_param(automute, int, 0444);
111 module_param(chroma_agc, int, 0444);
112 module_param(adc_crush, int, 0444);
113 module_param(whitecrush_upper, int, 0444);
114 module_param(whitecrush_lower, int, 0444);
115 module_param(vcr_hack, int, 0444);
116 module_param(uv_ratio, int, 0444);
117 module_param(full_luma_range, int, 0444);
118 module_param(coring, int, 0444);
120 module_param_array(radio, int, NULL, 0444);
122 MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
123 MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
124 MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
125 MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
126 MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
127 MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
128 MODULE_PARM_DESC(gbuffers,"number of capture buffers. range 2-32, default 8");
129 MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
130 MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
131 MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
132 MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
133 MODULE_PARM_DESC(whitecrush_upper,"sets the white crush upper value, default is 207");
134 MODULE_PARM_DESC(whitecrush_lower,"sets the white crush lower value, default is 127");
135 MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
136 MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler");
137 MODULE_PARM_DESC(uv_ratio,"ratio between u and v gains, default is 50");
138 MODULE_PARM_DESC(full_luma_range,"use the full luma range, default is 0 (no)");
139 MODULE_PARM_DESC(coring,"set the luma coring level, default is 0 (no)");
141 MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
142 MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
143 MODULE_LICENSE("GPL");
145 /* ----------------------------------------------------------------------- */
146 /* sysfs */
148 static ssize_t show_card(struct class_device *cd, char *buf)
150 struct video_device *vfd = to_video_device(cd);
151 struct bttv *btv = dev_get_drvdata(vfd->dev);
152 return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
154 static CLASS_DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
156 /* ----------------------------------------------------------------------- */
157 /* static data */
159 /* special timing tables from conexant... */
160 static u8 SRAM_Table[][60] =
162 /* PAL digital input over GPIO[7:0] */
164 45, // 45 bytes following
165 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
166 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
167 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
168 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
169 0x37,0x00,0xAF,0x21,0x00
171 /* NTSC digital input over GPIO[7:0] */
173 51, // 51 bytes following
174 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
175 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
176 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
177 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
178 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
179 0x00,
181 // TGB_NTSC392 // quartzsight
182 // This table has been modified to be used for Fusion Rev D
184 0x2A, // size of table = 42
185 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
186 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
187 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
188 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
189 0x20, 0x00
193 const struct bttv_tvnorm bttv_tvnorms[] = {
194 /* PAL-BDGHI */
195 /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
196 /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
198 .v4l2_id = V4L2_STD_PAL,
199 .name = "PAL",
200 .Fsc = 35468950,
201 .swidth = 924,
202 .sheight = 576,
203 .totalwidth = 1135,
204 .adelay = 0x7f,
205 .bdelay = 0x72,
206 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
207 .scaledtwidth = 1135,
208 .hdelayx1 = 186,
209 .hactivex1 = 924,
210 .vdelay = 0x20,
211 .vbipack = 255,
212 .sram = 0,
213 /* ITU-R frame line number of the first VBI line
214 we can capture, of the first and second field. */
215 .vbistart = { 7,320 },
217 .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
218 .name = "NTSC",
219 .Fsc = 28636363,
220 .swidth = 768,
221 .sheight = 480,
222 .totalwidth = 910,
223 .adelay = 0x68,
224 .bdelay = 0x5d,
225 .iform = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
226 .scaledtwidth = 910,
227 .hdelayx1 = 128,
228 .hactivex1 = 910,
229 .vdelay = 0x1a,
230 .vbipack = 144,
231 .sram = 1,
232 .vbistart = { 10, 273 },
234 .v4l2_id = V4L2_STD_SECAM,
235 .name = "SECAM",
236 .Fsc = 35468950,
237 .swidth = 924,
238 .sheight = 576,
239 .totalwidth = 1135,
240 .adelay = 0x7f,
241 .bdelay = 0xb0,
242 .iform = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
243 .scaledtwidth = 1135,
244 .hdelayx1 = 186,
245 .hactivex1 = 922,
246 .vdelay = 0x20,
247 .vbipack = 255,
248 .sram = 0, /* like PAL, correct? */
249 .vbistart = { 7, 320 },
251 .v4l2_id = V4L2_STD_PAL_Nc,
252 .name = "PAL-Nc",
253 .Fsc = 28636363,
254 .swidth = 640,
255 .sheight = 576,
256 .totalwidth = 910,
257 .adelay = 0x68,
258 .bdelay = 0x5d,
259 .iform = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
260 .scaledtwidth = 780,
261 .hdelayx1 = 130,
262 .hactivex1 = 734,
263 .vdelay = 0x1a,
264 .vbipack = 144,
265 .sram = -1,
266 .vbistart = { 7, 320 },
268 .v4l2_id = V4L2_STD_PAL_M,
269 .name = "PAL-M",
270 .Fsc = 28636363,
271 .swidth = 640,
272 .sheight = 480,
273 .totalwidth = 910,
274 .adelay = 0x68,
275 .bdelay = 0x5d,
276 .iform = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
277 .scaledtwidth = 780,
278 .hdelayx1 = 135,
279 .hactivex1 = 754,
280 .vdelay = 0x1a,
281 .vbipack = 144,
282 .sram = -1,
283 .vbistart = { 10, 273 },
285 .v4l2_id = V4L2_STD_PAL_N,
286 .name = "PAL-N",
287 .Fsc = 35468950,
288 .swidth = 768,
289 .sheight = 576,
290 .totalwidth = 1135,
291 .adelay = 0x7f,
292 .bdelay = 0x72,
293 .iform = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
294 .scaledtwidth = 944,
295 .hdelayx1 = 186,
296 .hactivex1 = 922,
297 .vdelay = 0x20,
298 .vbipack = 144,
299 .sram = -1,
300 .vbistart = { 7, 320},
302 .v4l2_id = V4L2_STD_NTSC_M_JP,
303 .name = "NTSC-JP",
304 .Fsc = 28636363,
305 .swidth = 640,
306 .sheight = 480,
307 .totalwidth = 910,
308 .adelay = 0x68,
309 .bdelay = 0x5d,
310 .iform = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
311 .scaledtwidth = 780,
312 .hdelayx1 = 135,
313 .hactivex1 = 754,
314 .vdelay = 0x16,
315 .vbipack = 144,
316 .sram = -1,
317 .vbistart = {10, 273},
319 /* that one hopefully works with the strange timing
320 * which video recorders produce when playing a NTSC
321 * tape on a PAL TV ... */
322 .v4l2_id = V4L2_STD_PAL_60,
323 .name = "PAL-60",
324 .Fsc = 35468950,
325 .swidth = 924,
326 .sheight = 480,
327 .totalwidth = 1135,
328 .adelay = 0x7f,
329 .bdelay = 0x72,
330 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
331 .scaledtwidth = 1135,
332 .hdelayx1 = 186,
333 .hactivex1 = 924,
334 .vdelay = 0x1a,
335 .vbipack = 255,
336 .vtotal = 524,
337 .sram = -1,
338 .vbistart = { 10, 273 },
341 static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
343 /* ----------------------------------------------------------------------- */
344 /* bttv format list
345 packed pixel formats must come first */
346 static const struct bttv_format bttv_formats[] = {
348 .name = "8 bpp, gray",
349 .palette = VIDEO_PALETTE_GREY,
350 .fourcc = V4L2_PIX_FMT_GREY,
351 .btformat = BT848_COLOR_FMT_Y8,
352 .depth = 8,
353 .flags = FORMAT_FLAGS_PACKED,
355 .name = "8 bpp, dithered color",
356 .palette = VIDEO_PALETTE_HI240,
357 .fourcc = V4L2_PIX_FMT_HI240,
358 .btformat = BT848_COLOR_FMT_RGB8,
359 .depth = 8,
360 .flags = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
362 .name = "15 bpp RGB, le",
363 .palette = VIDEO_PALETTE_RGB555,
364 .fourcc = V4L2_PIX_FMT_RGB555,
365 .btformat = BT848_COLOR_FMT_RGB15,
366 .depth = 16,
367 .flags = FORMAT_FLAGS_PACKED,
369 .name = "15 bpp RGB, be",
370 .palette = -1,
371 .fourcc = V4L2_PIX_FMT_RGB555X,
372 .btformat = BT848_COLOR_FMT_RGB15,
373 .btswap = 0x03, /* byteswap */
374 .depth = 16,
375 .flags = FORMAT_FLAGS_PACKED,
377 .name = "16 bpp RGB, le",
378 .palette = VIDEO_PALETTE_RGB565,
379 .fourcc = V4L2_PIX_FMT_RGB565,
380 .btformat = BT848_COLOR_FMT_RGB16,
381 .depth = 16,
382 .flags = FORMAT_FLAGS_PACKED,
384 .name = "16 bpp RGB, be",
385 .palette = -1,
386 .fourcc = V4L2_PIX_FMT_RGB565X,
387 .btformat = BT848_COLOR_FMT_RGB16,
388 .btswap = 0x03, /* byteswap */
389 .depth = 16,
390 .flags = FORMAT_FLAGS_PACKED,
392 .name = "24 bpp RGB, le",
393 .palette = VIDEO_PALETTE_RGB24,
394 .fourcc = V4L2_PIX_FMT_BGR24,
395 .btformat = BT848_COLOR_FMT_RGB24,
396 .depth = 24,
397 .flags = FORMAT_FLAGS_PACKED,
399 .name = "32 bpp RGB, le",
400 .palette = VIDEO_PALETTE_RGB32,
401 .fourcc = V4L2_PIX_FMT_BGR32,
402 .btformat = BT848_COLOR_FMT_RGB32,
403 .depth = 32,
404 .flags = FORMAT_FLAGS_PACKED,
406 .name = "32 bpp RGB, be",
407 .palette = -1,
408 .fourcc = V4L2_PIX_FMT_RGB32,
409 .btformat = BT848_COLOR_FMT_RGB32,
410 .btswap = 0x0f, /* byte+word swap */
411 .depth = 32,
412 .flags = FORMAT_FLAGS_PACKED,
414 .name = "4:2:2, packed, YUYV",
415 .palette = VIDEO_PALETTE_YUV422,
416 .fourcc = V4L2_PIX_FMT_YUYV,
417 .btformat = BT848_COLOR_FMT_YUY2,
418 .depth = 16,
419 .flags = FORMAT_FLAGS_PACKED,
421 .name = "4:2:2, packed, YUYV",
422 .palette = VIDEO_PALETTE_YUYV,
423 .fourcc = V4L2_PIX_FMT_YUYV,
424 .btformat = BT848_COLOR_FMT_YUY2,
425 .depth = 16,
426 .flags = FORMAT_FLAGS_PACKED,
428 .name = "4:2:2, packed, UYVY",
429 .palette = VIDEO_PALETTE_UYVY,
430 .fourcc = V4L2_PIX_FMT_UYVY,
431 .btformat = BT848_COLOR_FMT_YUY2,
432 .btswap = 0x03, /* byteswap */
433 .depth = 16,
434 .flags = FORMAT_FLAGS_PACKED,
436 .name = "4:2:2, planar, Y-Cb-Cr",
437 .palette = VIDEO_PALETTE_YUV422P,
438 .fourcc = V4L2_PIX_FMT_YUV422P,
439 .btformat = BT848_COLOR_FMT_YCrCb422,
440 .depth = 16,
441 .flags = FORMAT_FLAGS_PLANAR,
442 .hshift = 1,
443 .vshift = 0,
445 .name = "4:2:0, planar, Y-Cb-Cr",
446 .palette = VIDEO_PALETTE_YUV420P,
447 .fourcc = V4L2_PIX_FMT_YUV420,
448 .btformat = BT848_COLOR_FMT_YCrCb422,
449 .depth = 12,
450 .flags = FORMAT_FLAGS_PLANAR,
451 .hshift = 1,
452 .vshift = 1,
454 .name = "4:2:0, planar, Y-Cr-Cb",
455 .palette = -1,
456 .fourcc = V4L2_PIX_FMT_YVU420,
457 .btformat = BT848_COLOR_FMT_YCrCb422,
458 .depth = 12,
459 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
460 .hshift = 1,
461 .vshift = 1,
463 .name = "4:1:1, planar, Y-Cb-Cr",
464 .palette = VIDEO_PALETTE_YUV411P,
465 .fourcc = V4L2_PIX_FMT_YUV411P,
466 .btformat = BT848_COLOR_FMT_YCrCb411,
467 .depth = 12,
468 .flags = FORMAT_FLAGS_PLANAR,
469 .hshift = 2,
470 .vshift = 0,
472 .name = "4:1:0, planar, Y-Cb-Cr",
473 .palette = VIDEO_PALETTE_YUV410P,
474 .fourcc = V4L2_PIX_FMT_YUV410,
475 .btformat = BT848_COLOR_FMT_YCrCb411,
476 .depth = 9,
477 .flags = FORMAT_FLAGS_PLANAR,
478 .hshift = 2,
479 .vshift = 2,
481 .name = "4:1:0, planar, Y-Cr-Cb",
482 .palette = -1,
483 .fourcc = V4L2_PIX_FMT_YVU410,
484 .btformat = BT848_COLOR_FMT_YCrCb411,
485 .depth = 9,
486 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
487 .hshift = 2,
488 .vshift = 2,
490 .name = "raw scanlines",
491 .palette = VIDEO_PALETTE_RAW,
492 .fourcc = -1,
493 .btformat = BT848_COLOR_FMT_RAW,
494 .depth = 8,
495 .flags = FORMAT_FLAGS_RAW,
498 static const unsigned int BTTV_FORMATS = ARRAY_SIZE(bttv_formats);
500 /* ----------------------------------------------------------------------- */
502 #define V4L2_CID_PRIVATE_CHROMA_AGC (V4L2_CID_PRIVATE_BASE + 0)
503 #define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_PRIVATE_BASE + 1)
504 #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2)
505 #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3)
506 #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4)
507 #define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5)
508 #define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_PRIVATE_BASE + 6)
509 #define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_PRIVATE_BASE + 7)
510 #define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_PRIVATE_BASE + 8)
511 #define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_PRIVATE_BASE + 9)
512 #define V4L2_CID_PRIVATE_CORING (V4L2_CID_PRIVATE_BASE + 10)
513 #define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 11)
515 static const struct v4l2_queryctrl no_ctl = {
516 .name = "42",
517 .flags = V4L2_CTRL_FLAG_DISABLED,
519 static const struct v4l2_queryctrl bttv_ctls[] = {
520 /* --- video --- */
522 .id = V4L2_CID_BRIGHTNESS,
523 .name = "Brightness",
524 .minimum = 0,
525 .maximum = 65535,
526 .step = 256,
527 .default_value = 32768,
528 .type = V4L2_CTRL_TYPE_INTEGER,
530 .id = V4L2_CID_CONTRAST,
531 .name = "Contrast",
532 .minimum = 0,
533 .maximum = 65535,
534 .step = 128,
535 .default_value = 32768,
536 .type = V4L2_CTRL_TYPE_INTEGER,
538 .id = V4L2_CID_SATURATION,
539 .name = "Saturation",
540 .minimum = 0,
541 .maximum = 65535,
542 .step = 128,
543 .default_value = 32768,
544 .type = V4L2_CTRL_TYPE_INTEGER,
546 .id = V4L2_CID_HUE,
547 .name = "Hue",
548 .minimum = 0,
549 .maximum = 65535,
550 .step = 256,
551 .default_value = 32768,
552 .type = V4L2_CTRL_TYPE_INTEGER,
554 /* --- audio --- */
556 .id = V4L2_CID_AUDIO_MUTE,
557 .name = "Mute",
558 .minimum = 0,
559 .maximum = 1,
560 .type = V4L2_CTRL_TYPE_BOOLEAN,
562 .id = V4L2_CID_AUDIO_VOLUME,
563 .name = "Volume",
564 .minimum = 0,
565 .maximum = 65535,
566 .step = 65535/100,
567 .default_value = 65535,
568 .type = V4L2_CTRL_TYPE_INTEGER,
570 .id = V4L2_CID_AUDIO_BALANCE,
571 .name = "Balance",
572 .minimum = 0,
573 .maximum = 65535,
574 .step = 65535/100,
575 .default_value = 32768,
576 .type = V4L2_CTRL_TYPE_INTEGER,
578 .id = V4L2_CID_AUDIO_BASS,
579 .name = "Bass",
580 .minimum = 0,
581 .maximum = 65535,
582 .step = 65535/100,
583 .default_value = 32768,
584 .type = V4L2_CTRL_TYPE_INTEGER,
586 .id = V4L2_CID_AUDIO_TREBLE,
587 .name = "Treble",
588 .minimum = 0,
589 .maximum = 65535,
590 .step = 65535/100,
591 .default_value = 32768,
592 .type = V4L2_CTRL_TYPE_INTEGER,
594 /* --- private --- */
596 .id = V4L2_CID_PRIVATE_CHROMA_AGC,
597 .name = "chroma agc",
598 .minimum = 0,
599 .maximum = 1,
600 .type = V4L2_CTRL_TYPE_BOOLEAN,
602 .id = V4L2_CID_PRIVATE_COMBFILTER,
603 .name = "combfilter",
604 .minimum = 0,
605 .maximum = 1,
606 .type = V4L2_CTRL_TYPE_BOOLEAN,
608 .id = V4L2_CID_PRIVATE_AUTOMUTE,
609 .name = "automute",
610 .minimum = 0,
611 .maximum = 1,
612 .type = V4L2_CTRL_TYPE_BOOLEAN,
614 .id = V4L2_CID_PRIVATE_LUMAFILTER,
615 .name = "luma decimation filter",
616 .minimum = 0,
617 .maximum = 1,
618 .type = V4L2_CTRL_TYPE_BOOLEAN,
620 .id = V4L2_CID_PRIVATE_AGC_CRUSH,
621 .name = "agc crush",
622 .minimum = 0,
623 .maximum = 1,
624 .type = V4L2_CTRL_TYPE_BOOLEAN,
626 .id = V4L2_CID_PRIVATE_VCR_HACK,
627 .name = "vcr hack",
628 .minimum = 0,
629 .maximum = 1,
630 .type = V4L2_CTRL_TYPE_BOOLEAN,
632 .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
633 .name = "whitecrush upper",
634 .minimum = 0,
635 .maximum = 255,
636 .step = 1,
637 .default_value = 0xCF,
638 .type = V4L2_CTRL_TYPE_INTEGER,
640 .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
641 .name = "whitecrush lower",
642 .minimum = 0,
643 .maximum = 255,
644 .step = 1,
645 .default_value = 0x7F,
646 .type = V4L2_CTRL_TYPE_INTEGER,
648 .id = V4L2_CID_PRIVATE_UV_RATIO,
649 .name = "uv ratio",
650 .minimum = 0,
651 .maximum = 100,
652 .step = 1,
653 .default_value = 50,
654 .type = V4L2_CTRL_TYPE_INTEGER,
656 .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
657 .name = "full luma range",
658 .minimum = 0,
659 .maximum = 1,
660 .type = V4L2_CTRL_TYPE_BOOLEAN,
662 .id = V4L2_CID_PRIVATE_CORING,
663 .name = "coring",
664 .minimum = 0,
665 .maximum = 3,
666 .step = 1,
667 .default_value = 0,
668 .type = V4L2_CTRL_TYPE_INTEGER,
674 static const int BTTV_CTLS = ARRAY_SIZE(bttv_ctls);
676 /* ----------------------------------------------------------------------- */
677 /* resource management */
679 static
680 int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit)
682 if (fh->resources & bit)
683 /* have it already allocated */
684 return 1;
686 /* is it free? */
687 mutex_lock(&btv->reslock);
688 if (btv->resources & bit) {
689 /* no, someone else uses it */
690 mutex_unlock(&btv->reslock);
691 return 0;
693 /* it's free, grab it */
694 fh->resources |= bit;
695 btv->resources |= bit;
696 mutex_unlock(&btv->reslock);
697 return 1;
700 static
701 int check_btres(struct bttv_fh *fh, int bit)
703 return (fh->resources & bit);
706 static
707 int locked_btres(struct bttv *btv, int bit)
709 return (btv->resources & bit);
712 static
713 void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
715 if ((fh->resources & bits) != bits) {
716 /* trying to free ressources not allocated by us ... */
717 printk("bttv: BUG! (btres)\n");
719 mutex_lock(&btv->reslock);
720 fh->resources &= ~bits;
721 btv->resources &= ~bits;
722 mutex_unlock(&btv->reslock);
725 /* ----------------------------------------------------------------------- */
726 /* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC */
728 /* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
729 PLL_X = Reference pre-divider (0=1, 1=2)
730 PLL_C = Post divider (0=6, 1=4)
731 PLL_I = Integer input
732 PLL_F = Fractional input
734 F_input = 28.636363 MHz:
735 PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
738 static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
740 unsigned char fl, fh, fi;
742 /* prevent overflows */
743 fin/=4;
744 fout/=4;
746 fout*=12;
747 fi=fout/fin;
749 fout=(fout%fin)*256;
750 fh=fout/fin;
752 fout=(fout%fin)*256;
753 fl=fout/fin;
755 btwrite(fl, BT848_PLL_F_LO);
756 btwrite(fh, BT848_PLL_F_HI);
757 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
760 static void set_pll(struct bttv *btv)
762 int i;
764 if (!btv->pll.pll_crystal)
765 return;
767 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
768 dprintk("bttv%d: PLL: no change required\n",btv->c.nr);
769 return;
772 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
773 /* no PLL needed */
774 if (btv->pll.pll_current == 0)
775 return;
776 bttv_printk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
777 btv->c.nr,btv->pll.pll_ifreq);
778 btwrite(0x00,BT848_TGCTRL);
779 btwrite(0x00,BT848_PLL_XCI);
780 btv->pll.pll_current = 0;
781 return;
784 bttv_printk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->c.nr,
785 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
786 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
788 for (i=0; i<10; i++) {
789 /* Let other people run while the PLL stabilizes */
790 bttv_printk(".");
791 msleep(10);
793 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
794 btwrite(0,BT848_DSTATUS);
795 } else {
796 btwrite(0x08,BT848_TGCTRL);
797 btv->pll.pll_current = btv->pll.pll_ofreq;
798 bttv_printk(" ok\n");
799 return;
802 btv->pll.pll_current = -1;
803 bttv_printk("failed\n");
804 return;
807 /* used to switch between the bt848's analog/digital video capture modes */
808 static void bt848A_set_timing(struct bttv *btv)
810 int i, len;
811 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
812 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
814 if (UNSET == bttv_tvcards[btv->c.type].muxsel[btv->input]) {
815 dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
816 btv->c.nr,table_idx);
818 /* timing change...reset timing generator address */
819 btwrite(0x00, BT848_TGCTRL);
820 btwrite(0x02, BT848_TGCTRL);
821 btwrite(0x00, BT848_TGCTRL);
823 len=SRAM_Table[table_idx][0];
824 for(i = 1; i <= len; i++)
825 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
826 btv->pll.pll_ofreq = 27000000;
828 set_pll(btv);
829 btwrite(0x11, BT848_TGCTRL);
830 btwrite(0x41, BT848_DVSIF);
831 } else {
832 btv->pll.pll_ofreq = fsc;
833 set_pll(btv);
834 btwrite(0x0, BT848_DVSIF);
838 /* ----------------------------------------------------------------------- */
840 static void bt848_bright(struct bttv *btv, int bright)
842 int value;
844 // printk("bttv: set bright: %d\n",bright); // DEBUG
845 btv->bright = bright;
847 /* We want -128 to 127 we get 0-65535 */
848 value = (bright >> 8) - 128;
849 btwrite(value & 0xff, BT848_BRIGHT);
852 static void bt848_hue(struct bttv *btv, int hue)
854 int value;
856 btv->hue = hue;
858 /* -128 to 127 */
859 value = (hue >> 8) - 128;
860 btwrite(value & 0xff, BT848_HUE);
863 static void bt848_contrast(struct bttv *btv, int cont)
865 int value,hibit;
867 btv->contrast = cont;
869 /* 0-511 */
870 value = (cont >> 7);
871 hibit = (value >> 6) & 4;
872 btwrite(value & 0xff, BT848_CONTRAST_LO);
873 btaor(hibit, ~4, BT848_E_CONTROL);
874 btaor(hibit, ~4, BT848_O_CONTROL);
877 static void bt848_sat(struct bttv *btv, int color)
879 int val_u,val_v,hibits;
881 btv->saturation = color;
883 /* 0-511 for the color */
884 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
885 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
886 hibits = (val_u >> 7) & 2;
887 hibits |= (val_v >> 8) & 1;
888 btwrite(val_u & 0xff, BT848_SAT_U_LO);
889 btwrite(val_v & 0xff, BT848_SAT_V_LO);
890 btaor(hibits, ~3, BT848_E_CONTROL);
891 btaor(hibits, ~3, BT848_O_CONTROL);
894 /* ----------------------------------------------------------------------- */
896 static int
897 video_mux(struct bttv *btv, unsigned int input)
899 int mux,mask2;
901 if (input >= bttv_tvcards[btv->c.type].video_inputs)
902 return -EINVAL;
904 /* needed by RemoteVideo MX */
905 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
906 if (mask2)
907 gpio_inout(mask2,mask2);
909 if (input == btv->svhs) {
910 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
911 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
912 } else {
913 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
914 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
916 mux = bttv_tvcards[btv->c.type].muxsel[input] & 3;
917 btaor(mux<<5, ~(3<<5), BT848_IFORM);
918 dprintk(KERN_DEBUG "bttv%d: video mux: input=%d mux=%d\n",
919 btv->c.nr,input,mux);
921 /* card specific hook */
922 if(bttv_tvcards[btv->c.type].muxsel_hook)
923 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
924 return 0;
927 static char *audio_modes[] = {
928 "audio: tuner", "audio: radio", "audio: extern",
929 "audio: intern", "audio: off"
932 static int
933 audio_mux(struct bttv *btv, int mode)
935 int val,mux,i2c_mux,signal;
937 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
938 bttv_tvcards[btv->c.type].gpiomask);
939 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
941 switch (mode) {
942 case AUDIO_MUTE:
943 btv->audio |= AUDIO_MUTE;
944 break;
945 case AUDIO_UNMUTE:
946 btv->audio &= ~AUDIO_MUTE;
947 break;
948 case AUDIO_TUNER:
949 case AUDIO_RADIO:
950 case AUDIO_EXTERN:
951 case AUDIO_INTERN:
952 btv->audio &= AUDIO_MUTE;
953 btv->audio |= mode;
955 i2c_mux = mux = (btv->audio & AUDIO_MUTE) ? AUDIO_OFF : btv->audio;
956 if (btv->opt_automute && !signal && !btv->radio_user)
957 mux = AUDIO_OFF;
959 val = bttv_tvcards[btv->c.type].audiomux[mux];
960 gpio_bits(bttv_tvcards[btv->c.type].gpiomask,val);
961 if (bttv_gpio)
962 bttv_gpio_tracking(btv,audio_modes[mux]);
963 if (!in_interrupt())
964 bttv_call_i2c_clients(btv,AUDC_SET_INPUT,&(i2c_mux));
965 return 0;
968 static void
969 i2c_vidiocschan(struct bttv *btv)
971 struct video_channel c;
973 memset(&c,0,sizeof(c));
974 c.norm = btv->tvnorm;
975 c.channel = btv->input;
976 bttv_call_i2c_clients(btv,VIDIOCSCHAN,&c);
977 if (btv->c.type == BTTV_BOARD_VOODOOTV_FM)
978 bttv_tda9880_setnorm(btv,c.norm);
981 static int
982 set_tvnorm(struct bttv *btv, unsigned int norm)
984 const struct bttv_tvnorm *tvnorm;
986 if (norm < 0 || norm >= BTTV_TVNORMS)
987 return -EINVAL;
989 btv->tvnorm = norm;
990 tvnorm = &bttv_tvnorms[norm];
992 btwrite(tvnorm->adelay, BT848_ADELAY);
993 btwrite(tvnorm->bdelay, BT848_BDELAY);
994 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
995 BT848_IFORM);
996 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
997 btwrite(1, BT848_VBI_PACK_DEL);
998 bt848A_set_timing(btv);
1000 switch (btv->c.type) {
1001 case BTTV_BOARD_VOODOOTV_FM:
1002 bttv_tda9880_setnorm(btv,norm);
1003 break;
1005 return 0;
1008 static void
1009 set_input(struct bttv *btv, unsigned int input)
1011 unsigned long flags;
1013 btv->input = input;
1014 if (irq_iswitch) {
1015 spin_lock_irqsave(&btv->s_lock,flags);
1016 if (btv->curr.frame_irq) {
1017 /* active capture -> delayed input switch */
1018 btv->new_input = input;
1019 } else {
1020 video_mux(btv,input);
1022 spin_unlock_irqrestore(&btv->s_lock,flags);
1023 } else {
1024 video_mux(btv,input);
1026 audio_mux(btv,(input == bttv_tvcards[btv->c.type].tuner ?
1027 AUDIO_TUNER : AUDIO_EXTERN));
1028 set_tvnorm(btv,btv->tvnorm);
1029 i2c_vidiocschan(btv);
1032 static void init_irqreg(struct bttv *btv)
1034 /* clear status */
1035 btwrite(0xfffffUL, BT848_INT_STAT);
1037 if (bttv_tvcards[btv->c.type].no_video) {
1038 /* i2c only */
1039 btwrite(BT848_INT_I2CDONE,
1040 BT848_INT_MASK);
1041 } else {
1042 /* full video */
1043 btwrite((btv->triton1) |
1044 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1045 BT848_INT_SCERR |
1046 (fdsr ? BT848_INT_FDSR : 0) |
1047 BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
1048 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1049 BT848_INT_I2CDONE,
1050 BT848_INT_MASK);
1054 static void init_bt848(struct bttv *btv)
1056 int val;
1058 if (bttv_tvcards[btv->c.type].no_video) {
1059 /* very basic init only */
1060 init_irqreg(btv);
1061 return;
1064 btwrite(0x00, BT848_CAP_CTL);
1065 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1066 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1068 /* set planar and packed mode trigger points and */
1069 /* set rising edge of inverted GPINTR pin as irq trigger */
1070 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1071 BT848_GPIO_DMA_CTL_PLTP1_16|
1072 BT848_GPIO_DMA_CTL_PLTP23_16|
1073 BT848_GPIO_DMA_CTL_GPINTC|
1074 BT848_GPIO_DMA_CTL_GPINTI,
1075 BT848_GPIO_DMA_CTL);
1077 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1078 btwrite(val, BT848_E_SCLOOP);
1079 btwrite(val, BT848_O_SCLOOP);
1081 btwrite(0x20, BT848_E_VSCALE_HI);
1082 btwrite(0x20, BT848_O_VSCALE_HI);
1083 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1084 BT848_ADC);
1086 btwrite(whitecrush_upper, BT848_WC_UP);
1087 btwrite(whitecrush_lower, BT848_WC_DOWN);
1089 if (btv->opt_lumafilter) {
1090 btwrite(0, BT848_E_CONTROL);
1091 btwrite(0, BT848_O_CONTROL);
1092 } else {
1093 btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1094 btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1097 bt848_bright(btv, btv->bright);
1098 bt848_hue(btv, btv->hue);
1099 bt848_contrast(btv, btv->contrast);
1100 bt848_sat(btv, btv->saturation);
1102 /* interrupt */
1103 init_irqreg(btv);
1106 static void bttv_reinit_bt848(struct bttv *btv)
1108 unsigned long flags;
1110 if (bttv_verbose)
1111 printk(KERN_INFO "bttv%d: reset, reinitialize\n",btv->c.nr);
1112 spin_lock_irqsave(&btv->s_lock,flags);
1113 btv->errors=0;
1114 bttv_set_dma(btv,0);
1115 spin_unlock_irqrestore(&btv->s_lock,flags);
1117 init_bt848(btv);
1118 btv->pll.pll_current = -1;
1119 set_input(btv,btv->input);
1122 static int get_control(struct bttv *btv, struct v4l2_control *c)
1124 struct video_audio va;
1125 int i;
1127 for (i = 0; i < BTTV_CTLS; i++)
1128 if (bttv_ctls[i].id == c->id)
1129 break;
1130 if (i == BTTV_CTLS)
1131 return -EINVAL;
1132 if (i >= 4 && i <= 8) {
1133 memset(&va,0,sizeof(va));
1134 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1135 if (btv->audio_hook)
1136 btv->audio_hook(btv,&va,0);
1138 switch (c->id) {
1139 case V4L2_CID_BRIGHTNESS:
1140 c->value = btv->bright;
1141 break;
1142 case V4L2_CID_HUE:
1143 c->value = btv->hue;
1144 break;
1145 case V4L2_CID_CONTRAST:
1146 c->value = btv->contrast;
1147 break;
1148 case V4L2_CID_SATURATION:
1149 c->value = btv->saturation;
1150 break;
1152 case V4L2_CID_AUDIO_MUTE:
1153 c->value = (VIDEO_AUDIO_MUTE & va.flags) ? 1 : 0;
1154 break;
1155 case V4L2_CID_AUDIO_VOLUME:
1156 c->value = va.volume;
1157 break;
1158 case V4L2_CID_AUDIO_BALANCE:
1159 c->value = va.balance;
1160 break;
1161 case V4L2_CID_AUDIO_BASS:
1162 c->value = va.bass;
1163 break;
1164 case V4L2_CID_AUDIO_TREBLE:
1165 c->value = va.treble;
1166 break;
1168 case V4L2_CID_PRIVATE_CHROMA_AGC:
1169 c->value = btv->opt_chroma_agc;
1170 break;
1171 case V4L2_CID_PRIVATE_COMBFILTER:
1172 c->value = btv->opt_combfilter;
1173 break;
1174 case V4L2_CID_PRIVATE_LUMAFILTER:
1175 c->value = btv->opt_lumafilter;
1176 break;
1177 case V4L2_CID_PRIVATE_AUTOMUTE:
1178 c->value = btv->opt_automute;
1179 break;
1180 case V4L2_CID_PRIVATE_AGC_CRUSH:
1181 c->value = btv->opt_adc_crush;
1182 break;
1183 case V4L2_CID_PRIVATE_VCR_HACK:
1184 c->value = btv->opt_vcr_hack;
1185 break;
1186 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1187 c->value = btv->opt_whitecrush_upper;
1188 break;
1189 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1190 c->value = btv->opt_whitecrush_lower;
1191 break;
1192 case V4L2_CID_PRIVATE_UV_RATIO:
1193 c->value = btv->opt_uv_ratio;
1194 break;
1195 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1196 c->value = btv->opt_full_luma_range;
1197 break;
1198 case V4L2_CID_PRIVATE_CORING:
1199 c->value = btv->opt_coring;
1200 break;
1201 default:
1202 return -EINVAL;
1204 return 0;
1207 static int set_control(struct bttv *btv, struct v4l2_control *c)
1209 struct video_audio va;
1210 int i,val;
1212 for (i = 0; i < BTTV_CTLS; i++)
1213 if (bttv_ctls[i].id == c->id)
1214 break;
1215 if (i == BTTV_CTLS)
1216 return -EINVAL;
1217 if (i >= 4 && i <= 8) {
1218 memset(&va,0,sizeof(va));
1219 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1220 if (btv->audio_hook)
1221 btv->audio_hook(btv,&va,0);
1223 switch (c->id) {
1224 case V4L2_CID_BRIGHTNESS:
1225 bt848_bright(btv,c->value);
1226 break;
1227 case V4L2_CID_HUE:
1228 bt848_hue(btv,c->value);
1229 break;
1230 case V4L2_CID_CONTRAST:
1231 bt848_contrast(btv,c->value);
1232 break;
1233 case V4L2_CID_SATURATION:
1234 bt848_sat(btv,c->value);
1235 break;
1236 case V4L2_CID_AUDIO_MUTE:
1237 if (c->value) {
1238 va.flags |= VIDEO_AUDIO_MUTE;
1239 audio_mux(btv, AUDIO_MUTE);
1240 } else {
1241 va.flags &= ~VIDEO_AUDIO_MUTE;
1242 audio_mux(btv, AUDIO_UNMUTE);
1244 break;
1246 case V4L2_CID_AUDIO_VOLUME:
1247 va.volume = c->value;
1248 break;
1249 case V4L2_CID_AUDIO_BALANCE:
1250 va.balance = c->value;
1251 break;
1252 case V4L2_CID_AUDIO_BASS:
1253 va.bass = c->value;
1254 break;
1255 case V4L2_CID_AUDIO_TREBLE:
1256 va.treble = c->value;
1257 break;
1259 case V4L2_CID_PRIVATE_CHROMA_AGC:
1260 btv->opt_chroma_agc = c->value;
1261 val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1262 btwrite(val, BT848_E_SCLOOP);
1263 btwrite(val, BT848_O_SCLOOP);
1264 break;
1265 case V4L2_CID_PRIVATE_COMBFILTER:
1266 btv->opt_combfilter = c->value;
1267 break;
1268 case V4L2_CID_PRIVATE_LUMAFILTER:
1269 btv->opt_lumafilter = c->value;
1270 if (btv->opt_lumafilter) {
1271 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1272 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1273 } else {
1274 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1275 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1277 break;
1278 case V4L2_CID_PRIVATE_AUTOMUTE:
1279 btv->opt_automute = c->value;
1280 break;
1281 case V4L2_CID_PRIVATE_AGC_CRUSH:
1282 btv->opt_adc_crush = c->value;
1283 btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1284 BT848_ADC);
1285 break;
1286 case V4L2_CID_PRIVATE_VCR_HACK:
1287 btv->opt_vcr_hack = c->value;
1288 break;
1289 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1290 btv->opt_whitecrush_upper = c->value;
1291 btwrite(c->value, BT848_WC_UP);
1292 break;
1293 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1294 btv->opt_whitecrush_lower = c->value;
1295 btwrite(c->value, BT848_WC_DOWN);
1296 break;
1297 case V4L2_CID_PRIVATE_UV_RATIO:
1298 btv->opt_uv_ratio = c->value;
1299 bt848_sat(btv, btv->saturation);
1300 break;
1301 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1302 btv->opt_full_luma_range = c->value;
1303 btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM);
1304 break;
1305 case V4L2_CID_PRIVATE_CORING:
1306 btv->opt_coring = c->value;
1307 btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM);
1308 break;
1309 default:
1310 return -EINVAL;
1312 if (i >= 4 && i <= 8) {
1313 bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
1314 if (btv->audio_hook)
1315 btv->audio_hook(btv,&va,1);
1317 return 0;
1320 /* ----------------------------------------------------------------------- */
1322 void bttv_gpio_tracking(struct bttv *btv, char *comment)
1324 unsigned int outbits, data;
1325 outbits = btread(BT848_GPIO_OUT_EN);
1326 data = btread(BT848_GPIO_DATA);
1327 printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1328 btv->c.nr,outbits,data & outbits, data & ~outbits, comment);
1331 static void bttv_field_count(struct bttv *btv)
1333 int need_count = 0;
1335 if (btv->users)
1336 need_count++;
1338 if (need_count) {
1339 /* start field counter */
1340 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1341 } else {
1342 /* stop field counter */
1343 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1344 btv->field_count = 0;
1348 static const struct bttv_format*
1349 format_by_palette(int palette)
1351 unsigned int i;
1353 for (i = 0; i < BTTV_FORMATS; i++) {
1354 if (-1 == bttv_formats[i].palette)
1355 continue;
1356 if (bttv_formats[i].palette == palette)
1357 return bttv_formats+i;
1359 return NULL;
1362 static const struct bttv_format*
1363 format_by_fourcc(int fourcc)
1365 unsigned int i;
1367 for (i = 0; i < BTTV_FORMATS; i++) {
1368 if (-1 == bttv_formats[i].fourcc)
1369 continue;
1370 if (bttv_formats[i].fourcc == fourcc)
1371 return bttv_formats+i;
1373 return NULL;
1376 /* ----------------------------------------------------------------------- */
1377 /* misc helpers */
1379 static int
1380 bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1381 struct bttv_buffer *new)
1383 struct bttv_buffer *old;
1384 unsigned long flags;
1385 int retval = 0;
1387 dprintk("switch_overlay: enter [new=%p]\n",new);
1388 if (new)
1389 new->vb.state = STATE_DONE;
1390 spin_lock_irqsave(&btv->s_lock,flags);
1391 old = btv->screen;
1392 btv->screen = new;
1393 btv->loop_irq |= 1;
1394 bttv_set_dma(btv, 0x03);
1395 spin_unlock_irqrestore(&btv->s_lock,flags);
1396 if (NULL == new)
1397 free_btres(btv,fh,RESOURCE_OVERLAY);
1398 if (NULL != old) {
1399 dprintk("switch_overlay: old=%p state is %d\n",old,old->vb.state);
1400 bttv_dma_free(btv, old);
1401 kfree(old);
1403 dprintk("switch_overlay: done\n");
1404 return retval;
1407 /* ----------------------------------------------------------------------- */
1408 /* video4linux (1) interface */
1410 static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf,
1411 const struct bttv_format *fmt,
1412 unsigned int width, unsigned int height,
1413 enum v4l2_field field)
1415 int redo_dma_risc = 0;
1416 int rc;
1418 /* check settings */
1419 if (NULL == fmt)
1420 return -EINVAL;
1421 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1422 width = RAW_BPL;
1423 height = RAW_LINES*2;
1424 if (width*height > buf->vb.bsize)
1425 return -EINVAL;
1426 buf->vb.size = buf->vb.bsize;
1427 } else {
1428 if (width < 48 ||
1429 height < 32 ||
1430 width > bttv_tvnorms[btv->tvnorm].swidth ||
1431 height > bttv_tvnorms[btv->tvnorm].sheight)
1432 return -EINVAL;
1433 buf->vb.size = (width * height * fmt->depth) >> 3;
1434 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1435 return -EINVAL;
1438 /* alloc + fill struct bttv_buffer (if changed) */
1439 if (buf->vb.width != width || buf->vb.height != height ||
1440 buf->vb.field != field ||
1441 buf->tvnorm != btv->tvnorm || buf->fmt != fmt) {
1442 buf->vb.width = width;
1443 buf->vb.height = height;
1444 buf->vb.field = field;
1445 buf->tvnorm = btv->tvnorm;
1446 buf->fmt = fmt;
1447 redo_dma_risc = 1;
1450 /* alloc risc memory */
1451 if (STATE_NEEDS_INIT == buf->vb.state) {
1452 redo_dma_risc = 1;
1453 if (0 != (rc = videobuf_iolock(btv->c.pci,&buf->vb,&btv->fbuf)))
1454 goto fail;
1457 if (redo_dma_risc)
1458 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1459 goto fail;
1461 buf->vb.state = STATE_PREPARED;
1462 return 0;
1464 fail:
1465 bttv_dma_free(btv,buf);
1466 return rc;
1469 static int
1470 buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1472 struct bttv_fh *fh = q->priv_data;
1474 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1475 if (0 == *count)
1476 *count = gbuffers;
1477 while (*size * *count > gbuffers * gbufsize)
1478 (*count)--;
1479 return 0;
1482 static int
1483 buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1484 enum v4l2_field field)
1486 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1487 struct bttv_fh *fh = q->priv_data;
1489 return bttv_prepare_buffer(fh->btv, buf, fh->fmt,
1490 fh->width, fh->height, field);
1493 static void
1494 buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1496 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1497 struct bttv_fh *fh = q->priv_data;
1498 struct bttv *btv = fh->btv;
1500 buf->vb.state = STATE_QUEUED;
1501 list_add_tail(&buf->vb.queue,&btv->capture);
1502 if (!btv->curr.frame_irq) {
1503 btv->loop_irq |= 1;
1504 bttv_set_dma(btv, 0x03);
1508 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1510 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1511 struct bttv_fh *fh = q->priv_data;
1513 bttv_dma_free(fh->btv,buf);
1516 static struct videobuf_queue_ops bttv_video_qops = {
1517 .buf_setup = buffer_setup,
1518 .buf_prepare = buffer_prepare,
1519 .buf_queue = buffer_queue,
1520 .buf_release = buffer_release,
1523 static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
1525 switch (cmd) {
1526 case BTTV_VERSION:
1527 return BTTV_VERSION_CODE;
1529 /* *** v4l1 *** ************************************************ */
1530 case VIDIOCGFREQ:
1532 unsigned long *freq = arg;
1533 *freq = btv->freq;
1534 return 0;
1536 case VIDIOCSFREQ:
1538 unsigned long *freq = arg;
1539 mutex_lock(&btv->lock);
1540 btv->freq=*freq;
1541 bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq);
1542 if (btv->has_matchbox && btv->radio_user)
1543 tea5757_set_freq(btv,*freq);
1544 mutex_unlock(&btv->lock);
1545 return 0;
1548 case VIDIOCGTUNER:
1550 struct video_tuner *v = arg;
1552 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1553 return -EINVAL;
1554 if (v->tuner) /* Only tuner 0 */
1555 return -EINVAL;
1556 strcpy(v->name, "Television");
1557 v->rangelow = 0;
1558 v->rangehigh = 0x7FFFFFFF;
1559 v->flags = VIDEO_TUNER_PAL|VIDEO_TUNER_NTSC|VIDEO_TUNER_SECAM;
1560 v->mode = btv->tvnorm;
1561 v->signal = (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) ? 0xFFFF : 0;
1562 bttv_call_i2c_clients(btv,cmd,v);
1563 return 0;
1565 case VIDIOCSTUNER:
1567 struct video_tuner *v = arg;
1569 if (v->tuner) /* Only tuner 0 */
1570 return -EINVAL;
1571 if (v->mode >= BTTV_TVNORMS)
1572 return -EINVAL;
1574 mutex_lock(&btv->lock);
1575 set_tvnorm(btv,v->mode);
1576 bttv_call_i2c_clients(btv,cmd,v);
1577 mutex_unlock(&btv->lock);
1578 return 0;
1581 case VIDIOCGCHAN:
1583 struct video_channel *v = arg;
1584 unsigned int channel = v->channel;
1586 if (channel >= bttv_tvcards[btv->c.type].video_inputs)
1587 return -EINVAL;
1588 v->tuners=0;
1589 v->flags = VIDEO_VC_AUDIO;
1590 v->type = VIDEO_TYPE_CAMERA;
1591 v->norm = btv->tvnorm;
1592 if (channel == bttv_tvcards[btv->c.type].tuner) {
1593 strcpy(v->name,"Television");
1594 v->flags|=VIDEO_VC_TUNER;
1595 v->type=VIDEO_TYPE_TV;
1596 v->tuners=1;
1597 } else if (channel == btv->svhs) {
1598 strcpy(v->name,"S-Video");
1599 } else {
1600 sprintf(v->name,"Composite%d",channel);
1602 return 0;
1604 case VIDIOCSCHAN:
1606 struct video_channel *v = arg;
1607 unsigned int channel = v->channel;
1609 if (channel >= bttv_tvcards[btv->c.type].video_inputs)
1610 return -EINVAL;
1611 if (v->norm >= BTTV_TVNORMS)
1612 return -EINVAL;
1614 mutex_lock(&btv->lock);
1615 if (channel == btv->input &&
1616 v->norm == btv->tvnorm) {
1617 /* nothing to do */
1618 mutex_unlock(&btv->lock);
1619 return 0;
1622 btv->tvnorm = v->norm;
1623 set_input(btv,v->channel);
1624 mutex_unlock(&btv->lock);
1625 return 0;
1628 case VIDIOCGAUDIO:
1630 struct video_audio *v = arg;
1632 memset(v,0,sizeof(*v));
1633 strcpy(v->name,"Television");
1634 v->flags |= VIDEO_AUDIO_MUTABLE;
1635 v->mode = VIDEO_SOUND_MONO;
1637 mutex_lock(&btv->lock);
1638 bttv_call_i2c_clients(btv,cmd,v);
1640 /* card specific hooks */
1641 if (btv->audio_hook)
1642 btv->audio_hook(btv,v,0);
1644 mutex_unlock(&btv->lock);
1645 return 0;
1647 case VIDIOCSAUDIO:
1649 struct video_audio *v = arg;
1650 unsigned int audio = v->audio;
1652 if (audio >= bttv_tvcards[btv->c.type].audio_inputs)
1653 return -EINVAL;
1655 mutex_lock(&btv->lock);
1656 audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : AUDIO_UNMUTE);
1657 bttv_call_i2c_clients(btv,cmd,v);
1659 /* card specific hooks */
1660 if (btv->audio_hook)
1661 btv->audio_hook(btv,v,1);
1663 mutex_unlock(&btv->lock);
1664 return 0;
1667 /* *** v4l2 *** ************************************************ */
1668 case VIDIOC_ENUMSTD:
1670 struct v4l2_standard *e = arg;
1671 unsigned int index = e->index;
1673 if (index >= BTTV_TVNORMS)
1674 return -EINVAL;
1675 v4l2_video_std_construct(e, bttv_tvnorms[e->index].v4l2_id,
1676 bttv_tvnorms[e->index].name);
1677 e->index = index;
1678 return 0;
1680 case VIDIOC_G_STD:
1682 v4l2_std_id *id = arg;
1683 *id = bttv_tvnorms[btv->tvnorm].v4l2_id;
1684 return 0;
1686 case VIDIOC_S_STD:
1688 v4l2_std_id *id = arg;
1689 unsigned int i;
1691 for (i = 0; i < BTTV_TVNORMS; i++)
1692 if (*id & bttv_tvnorms[i].v4l2_id)
1693 break;
1694 if (i == BTTV_TVNORMS)
1695 return -EINVAL;
1697 mutex_lock(&btv->lock);
1698 set_tvnorm(btv,i);
1699 i2c_vidiocschan(btv);
1700 mutex_unlock(&btv->lock);
1701 return 0;
1703 case VIDIOC_QUERYSTD:
1705 v4l2_std_id *id = arg;
1707 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1708 *id = V4L2_STD_625_50;
1709 else
1710 *id = V4L2_STD_525_60;
1711 return 0;
1714 case VIDIOC_ENUMINPUT:
1716 struct v4l2_input *i = arg;
1717 unsigned int n;
1719 n = i->index;
1720 if (n >= bttv_tvcards[btv->c.type].video_inputs)
1721 return -EINVAL;
1722 memset(i,0,sizeof(*i));
1723 i->index = n;
1724 i->type = V4L2_INPUT_TYPE_CAMERA;
1725 i->audioset = 0;
1726 if (i->index == bttv_tvcards[btv->c.type].tuner) {
1727 sprintf(i->name, "Television");
1728 i->type = V4L2_INPUT_TYPE_TUNER;
1729 i->tuner = 0;
1730 } else if (i->index == btv->svhs) {
1731 sprintf(i->name, "S-Video");
1732 } else {
1733 sprintf(i->name,"Composite%d",i->index);
1735 if (i->index == btv->input) {
1736 __u32 dstatus = btread(BT848_DSTATUS);
1737 if (0 == (dstatus & BT848_DSTATUS_PRES))
1738 i->status |= V4L2_IN_ST_NO_SIGNAL;
1739 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1740 i->status |= V4L2_IN_ST_NO_H_LOCK;
1742 for (n = 0; n < BTTV_TVNORMS; n++)
1743 i->std |= bttv_tvnorms[n].v4l2_id;
1744 return 0;
1746 case VIDIOC_G_INPUT:
1748 int *i = arg;
1749 *i = btv->input;
1750 return 0;
1752 case VIDIOC_S_INPUT:
1754 unsigned int *i = arg;
1756 if (*i > bttv_tvcards[btv->c.type].video_inputs)
1757 return -EINVAL;
1758 mutex_lock(&btv->lock);
1759 set_input(btv,*i);
1760 mutex_unlock(&btv->lock);
1761 return 0;
1764 case VIDIOC_G_TUNER:
1766 struct v4l2_tuner *t = arg;
1768 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1769 return -EINVAL;
1770 if (0 != t->index)
1771 return -EINVAL;
1772 mutex_lock(&btv->lock);
1773 memset(t,0,sizeof(*t));
1774 strcpy(t->name, "Television");
1775 t->type = V4L2_TUNER_ANALOG_TV;
1776 t->capability = V4L2_TUNER_CAP_NORM;
1777 t->rxsubchans = V4L2_TUNER_SUB_MONO;
1778 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
1779 t->signal = 0xffff;
1781 struct video_tuner tuner;
1783 memset(&tuner, 0, sizeof (tuner));
1784 tuner.rangehigh = 0xffffffffUL;
1785 bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner);
1786 t->rangelow = tuner.rangelow;
1787 t->rangehigh = tuner.rangehigh;
1790 /* Hmmm ... */
1791 struct video_audio va;
1792 memset(&va, 0, sizeof(struct video_audio));
1793 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1794 if (btv->audio_hook)
1795 btv->audio_hook(btv,&va,0);
1796 if(va.mode & VIDEO_SOUND_STEREO) {
1797 t->audmode = V4L2_TUNER_MODE_STEREO;
1798 t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
1800 if(va.mode & VIDEO_SOUND_LANG1) {
1801 t->audmode = V4L2_TUNER_MODE_LANG1;
1802 t->rxsubchans = V4L2_TUNER_SUB_LANG1
1803 | V4L2_TUNER_SUB_LANG2;
1806 /* FIXME: fill capability+audmode */
1807 mutex_unlock(&btv->lock);
1808 return 0;
1810 case VIDIOC_S_TUNER:
1812 struct v4l2_tuner *t = arg;
1814 if (UNSET == bttv_tvcards[btv->c.type].tuner)
1815 return -EINVAL;
1816 if (0 != t->index)
1817 return -EINVAL;
1818 mutex_lock(&btv->lock);
1820 struct video_audio va;
1821 memset(&va, 0, sizeof(struct video_audio));
1822 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1823 if (t->audmode == V4L2_TUNER_MODE_MONO)
1824 va.mode = VIDEO_SOUND_MONO;
1825 else if (t->audmode == V4L2_TUNER_MODE_STEREO)
1826 va.mode = VIDEO_SOUND_STEREO;
1827 else if (t->audmode == V4L2_TUNER_MODE_LANG1)
1828 va.mode = VIDEO_SOUND_LANG1;
1829 else if (t->audmode == V4L2_TUNER_MODE_LANG2)
1830 va.mode = VIDEO_SOUND_LANG2;
1831 bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
1832 if (btv->audio_hook)
1833 btv->audio_hook(btv,&va,1);
1835 mutex_unlock(&btv->lock);
1836 return 0;
1839 case VIDIOC_G_FREQUENCY:
1841 struct v4l2_frequency *f = arg;
1843 memset(f,0,sizeof(*f));
1844 f->type = V4L2_TUNER_ANALOG_TV;
1845 f->frequency = btv->freq;
1846 return 0;
1848 case VIDIOC_S_FREQUENCY:
1850 struct v4l2_frequency *f = arg;
1852 if (unlikely(f->tuner != 0))
1853 return -EINVAL;
1854 if (unlikely (f->type != V4L2_TUNER_ANALOG_TV))
1855 return -EINVAL;
1856 mutex_lock(&btv->lock);
1857 btv->freq = f->frequency;
1858 bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq);
1859 if (btv->has_matchbox && btv->radio_user)
1860 tea5757_set_freq(btv,btv->freq);
1861 mutex_unlock(&btv->lock);
1862 return 0;
1864 case VIDIOC_LOG_STATUS:
1866 bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
1867 return 0;
1870 default:
1871 return -ENOIOCTLCMD;
1874 return 0;
1877 static int verify_window(const struct bttv_tvnorm *tvn,
1878 struct v4l2_window *win, int fixup)
1880 enum v4l2_field field;
1881 int maxw, maxh;
1883 if (win->w.width < 48 || win->w.height < 32)
1884 return -EINVAL;
1885 if (win->clipcount > 2048)
1886 return -EINVAL;
1888 field = win->field;
1889 maxw = tvn->swidth;
1890 maxh = tvn->sheight;
1892 if (V4L2_FIELD_ANY == field) {
1893 field = (win->w.height > maxh/2)
1894 ? V4L2_FIELD_INTERLACED
1895 : V4L2_FIELD_TOP;
1897 switch (field) {
1898 case V4L2_FIELD_TOP:
1899 case V4L2_FIELD_BOTTOM:
1900 maxh = maxh / 2;
1901 break;
1902 case V4L2_FIELD_INTERLACED:
1903 break;
1904 default:
1905 return -EINVAL;
1908 if (!fixup && (win->w.width > maxw || win->w.height > maxh))
1909 return -EINVAL;
1911 if (win->w.width > maxw)
1912 win->w.width = maxw;
1913 if (win->w.height > maxh)
1914 win->w.height = maxh;
1915 win->field = field;
1916 return 0;
1919 static int setup_window(struct bttv_fh *fh, struct bttv *btv,
1920 struct v4l2_window *win, int fixup)
1922 struct v4l2_clip *clips = NULL;
1923 int n,size,retval = 0;
1925 if (NULL == fh->ovfmt)
1926 return -EINVAL;
1927 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
1928 return -EINVAL;
1929 retval = verify_window(&bttv_tvnorms[btv->tvnorm],win,fixup);
1930 if (0 != retval)
1931 return retval;
1933 /* copy clips -- luckily v4l1 + v4l2 are binary
1934 compatible here ...*/
1935 n = win->clipcount;
1936 size = sizeof(*clips)*(n+4);
1937 clips = kmalloc(size,GFP_KERNEL);
1938 if (NULL == clips)
1939 return -ENOMEM;
1940 if (n > 0) {
1941 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
1942 kfree(clips);
1943 return -EFAULT;
1946 /* clip against screen */
1947 if (NULL != btv->fbuf.base)
1948 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
1949 &win->w, clips, n);
1950 btcx_sort_clips(clips,n);
1952 /* 4-byte alignments */
1953 switch (fh->ovfmt->depth) {
1954 case 8:
1955 case 24:
1956 btcx_align(&win->w, clips, n, 3);
1957 break;
1958 case 16:
1959 btcx_align(&win->w, clips, n, 1);
1960 break;
1961 case 32:
1962 /* no alignment fixups needed */
1963 break;
1964 default:
1965 BUG();
1968 down(&fh->cap.lock);
1969 kfree(fh->ov.clips);
1970 fh->ov.clips = clips;
1971 fh->ov.nclips = n;
1973 fh->ov.w = win->w;
1974 fh->ov.field = win->field;
1975 fh->ov.setup_ok = 1;
1976 btv->init.ov.w.width = win->w.width;
1977 btv->init.ov.w.height = win->w.height;
1978 btv->init.ov.field = win->field;
1980 /* update overlay if needed */
1981 retval = 0;
1982 if (check_btres(fh, RESOURCE_OVERLAY)) {
1983 struct bttv_buffer *new;
1985 new = videobuf_alloc(sizeof(*new));
1986 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
1987 retval = bttv_switch_overlay(btv,fh,new);
1989 up(&fh->cap.lock);
1990 return retval;
1993 /* ----------------------------------------------------------------------- */
1995 static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
1997 struct videobuf_queue* q = NULL;
1999 switch (fh->type) {
2000 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2001 q = &fh->cap;
2002 break;
2003 case V4L2_BUF_TYPE_VBI_CAPTURE:
2004 q = &fh->vbi;
2005 break;
2006 default:
2007 BUG();
2009 return q;
2012 static int bttv_resource(struct bttv_fh *fh)
2014 int res = 0;
2016 switch (fh->type) {
2017 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2018 res = RESOURCE_VIDEO;
2019 break;
2020 case V4L2_BUF_TYPE_VBI_CAPTURE:
2021 res = RESOURCE_VBI;
2022 break;
2023 default:
2024 BUG();
2026 return res;
2029 static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2031 struct videobuf_queue *q = bttv_queue(fh);
2032 int res = bttv_resource(fh);
2034 if (check_btres(fh,res))
2035 return -EBUSY;
2036 if (videobuf_queue_is_busy(q))
2037 return -EBUSY;
2038 fh->type = type;
2039 return 0;
2042 static void
2043 pix_format_set_size (struct v4l2_pix_format * f,
2044 const struct bttv_format * fmt,
2045 unsigned int width,
2046 unsigned int height)
2048 f->width = width;
2049 f->height = height;
2051 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2052 f->bytesperline = width; /* Y plane */
2053 f->sizeimage = (width * height * fmt->depth) >> 3;
2054 } else {
2055 f->bytesperline = (width * fmt->depth) >> 3;
2056 f->sizeimage = height * f->bytesperline;
2060 static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f)
2062 switch (f->type) {
2063 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2064 memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format));
2065 pix_format_set_size (&f->fmt.pix, fh->fmt,
2066 fh->width, fh->height);
2067 f->fmt.pix.field = fh->cap.field;
2068 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2069 return 0;
2070 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2071 memset(&f->fmt.win,0,sizeof(struct v4l2_window));
2072 f->fmt.win.w = fh->ov.w;
2073 f->fmt.win.field = fh->ov.field;
2074 return 0;
2075 case V4L2_BUF_TYPE_VBI_CAPTURE:
2076 bttv_vbi_get_fmt(fh,f);
2077 return 0;
2078 default:
2079 return -EINVAL;
2083 static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv,
2084 struct v4l2_format *f)
2086 switch (f->type) {
2087 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2089 const struct bttv_format *fmt;
2090 enum v4l2_field field;
2091 unsigned int maxw,maxh;
2093 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2094 if (NULL == fmt)
2095 return -EINVAL;
2097 /* fixup format */
2098 maxw = bttv_tvnorms[btv->tvnorm].swidth;
2099 maxh = bttv_tvnorms[btv->tvnorm].sheight;
2100 field = f->fmt.pix.field;
2101 if (V4L2_FIELD_ANY == field)
2102 field = (f->fmt.pix.height > maxh/2)
2103 ? V4L2_FIELD_INTERLACED
2104 : V4L2_FIELD_BOTTOM;
2105 if (V4L2_FIELD_SEQ_BT == field)
2106 field = V4L2_FIELD_SEQ_TB;
2107 switch (field) {
2108 case V4L2_FIELD_TOP:
2109 case V4L2_FIELD_BOTTOM:
2110 case V4L2_FIELD_ALTERNATE:
2111 maxh = maxh/2;
2112 break;
2113 case V4L2_FIELD_INTERLACED:
2114 break;
2115 case V4L2_FIELD_SEQ_TB:
2116 if (fmt->flags & FORMAT_FLAGS_PLANAR)
2117 return -EINVAL;
2118 break;
2119 default:
2120 return -EINVAL;
2123 /* update data for the application */
2124 f->fmt.pix.field = field;
2125 if (f->fmt.pix.width < 48)
2126 f->fmt.pix.width = 48;
2127 if (f->fmt.pix.height < 32)
2128 f->fmt.pix.height = 32;
2129 if (f->fmt.pix.width > maxw)
2130 f->fmt.pix.width = maxw;
2131 if (f->fmt.pix.height > maxh)
2132 f->fmt.pix.height = maxh;
2133 pix_format_set_size (&f->fmt.pix, fmt,
2134 f->fmt.pix.width & ~3,
2135 f->fmt.pix.height);
2137 return 0;
2139 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2140 return verify_window(&bttv_tvnorms[btv->tvnorm],
2141 &f->fmt.win, 1);
2142 case V4L2_BUF_TYPE_VBI_CAPTURE:
2143 bttv_vbi_try_fmt(fh,f);
2144 return 0;
2145 default:
2146 return -EINVAL;
2150 static int bttv_s_fmt(struct bttv_fh *fh, struct bttv *btv,
2151 struct v4l2_format *f)
2153 int retval;
2155 switch (f->type) {
2156 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2158 const struct bttv_format *fmt;
2160 retval = bttv_switch_type(fh,f->type);
2161 if (0 != retval)
2162 return retval;
2163 retval = bttv_try_fmt(fh,btv,f);
2164 if (0 != retval)
2165 return retval;
2166 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2168 /* update our state informations */
2169 down(&fh->cap.lock);
2170 fh->fmt = fmt;
2171 fh->cap.field = f->fmt.pix.field;
2172 fh->cap.last = V4L2_FIELD_NONE;
2173 fh->width = f->fmt.pix.width;
2174 fh->height = f->fmt.pix.height;
2175 btv->init.fmt = fmt;
2176 btv->init.width = f->fmt.pix.width;
2177 btv->init.height = f->fmt.pix.height;
2178 up(&fh->cap.lock);
2180 return 0;
2182 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2183 if (no_overlay > 0) {
2184 printk ("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2185 return -EINVAL;
2187 return setup_window(fh, btv, &f->fmt.win, 1);
2188 case V4L2_BUF_TYPE_VBI_CAPTURE:
2189 retval = bttv_switch_type(fh,f->type);
2190 if (0 != retval)
2191 return retval;
2192 if (locked_btres(fh->btv, RESOURCE_VBI))
2193 return -EBUSY;
2194 bttv_vbi_try_fmt(fh,f);
2195 bttv_vbi_setlines(fh,btv,f->fmt.vbi.count[0]);
2196 bttv_vbi_get_fmt(fh,f);
2197 return 0;
2198 default:
2199 return -EINVAL;
2203 static int bttv_do_ioctl(struct inode *inode, struct file *file,
2204 unsigned int cmd, void *arg)
2206 struct bttv_fh *fh = file->private_data;
2207 struct bttv *btv = fh->btv;
2208 unsigned long flags;
2209 int retval = 0;
2211 if (bttv_debug > 1)
2212 v4l_print_ioctl(btv->c.name, cmd);
2214 if (btv->errors)
2215 bttv_reinit_bt848(btv);
2217 switch (cmd) {
2218 case VIDIOCSFREQ:
2219 case VIDIOCSTUNER:
2220 case VIDIOCSCHAN:
2221 case VIDIOC_S_CTRL:
2222 case VIDIOC_S_STD:
2223 case VIDIOC_S_INPUT:
2224 case VIDIOC_S_TUNER:
2225 case VIDIOC_S_FREQUENCY:
2226 retval = v4l2_prio_check(&btv->prio,&fh->prio);
2227 if (0 != retval)
2228 return retval;
2231 switch (cmd) {
2233 /* *** v4l1 *** ************************************************ */
2234 case VIDIOCGCAP:
2236 struct video_capability *cap = arg;
2238 memset(cap,0,sizeof(*cap));
2239 strcpy(cap->name,btv->video_dev->name);
2240 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2241 /* vbi */
2242 cap->type = VID_TYPE_TUNER|VID_TYPE_TELETEXT;
2243 } else {
2244 /* others */
2245 cap->type = VID_TYPE_CAPTURE|
2246 VID_TYPE_TUNER|
2247 VID_TYPE_CLIPPING|
2248 VID_TYPE_SCALES;
2249 if (no_overlay <= 0)
2250 cap->type |= VID_TYPE_OVERLAY;
2252 cap->maxwidth = bttv_tvnorms[btv->tvnorm].swidth;
2253 cap->maxheight = bttv_tvnorms[btv->tvnorm].sheight;
2254 cap->minwidth = 48;
2255 cap->minheight = 32;
2257 cap->channels = bttv_tvcards[btv->c.type].video_inputs;
2258 cap->audios = bttv_tvcards[btv->c.type].audio_inputs;
2259 return 0;
2262 case VIDIOCGPICT:
2264 struct video_picture *pic = arg;
2266 memset(pic,0,sizeof(*pic));
2267 pic->brightness = btv->bright;
2268 pic->contrast = btv->contrast;
2269 pic->hue = btv->hue;
2270 pic->colour = btv->saturation;
2271 if (fh->fmt) {
2272 pic->depth = fh->fmt->depth;
2273 pic->palette = fh->fmt->palette;
2275 return 0;
2277 case VIDIOCSPICT:
2279 struct video_picture *pic = arg;
2280 const struct bttv_format *fmt;
2282 fmt = format_by_palette(pic->palette);
2283 if (NULL == fmt)
2284 return -EINVAL;
2285 down(&fh->cap.lock);
2286 if (fmt->depth != pic->depth) {
2287 retval = -EINVAL;
2288 goto fh_unlock_and_return;
2290 if (fmt->flags & FORMAT_FLAGS_RAW) {
2291 /* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL *
2292 RAW_LINES * 2. F1 is stored at offset 0, F2
2293 at buffer size / 2. */
2294 fh->width = RAW_BPL;
2295 fh->height = gbufsize / RAW_BPL;
2296 btv->init.width = RAW_BPL;
2297 btv->init.height = gbufsize / RAW_BPL;
2299 fh->ovfmt = fmt;
2300 fh->fmt = fmt;
2301 btv->init.ovfmt = fmt;
2302 btv->init.fmt = fmt;
2303 if (bigendian) {
2304 /* dirty hack time: swap bytes for overlay if the
2305 display adaptor is big endian (insmod option) */
2306 if (fmt->palette == VIDEO_PALETTE_RGB555 ||
2307 fmt->palette == VIDEO_PALETTE_RGB565 ||
2308 fmt->palette == VIDEO_PALETTE_RGB32) {
2309 fh->ovfmt = fmt+1;
2312 bt848_bright(btv,pic->brightness);
2313 bt848_contrast(btv,pic->contrast);
2314 bt848_hue(btv,pic->hue);
2315 bt848_sat(btv,pic->colour);
2316 up(&fh->cap.lock);
2317 return 0;
2320 case VIDIOCGWIN:
2322 struct video_window *win = arg;
2324 memset(win,0,sizeof(*win));
2325 win->x = fh->ov.w.left;
2326 win->y = fh->ov.w.top;
2327 win->width = fh->ov.w.width;
2328 win->height = fh->ov.w.height;
2329 return 0;
2331 case VIDIOCSWIN:
2333 struct video_window *win = arg;
2334 struct v4l2_window w2;
2336 if (no_overlay > 0) {
2337 printk ("VIDIOCSWIN: no_overlay\n");
2338 return -EINVAL;
2341 w2.field = V4L2_FIELD_ANY;
2342 w2.w.left = win->x;
2343 w2.w.top = win->y;
2344 w2.w.width = win->width;
2345 w2.w.height = win->height;
2346 w2.clipcount = win->clipcount;
2347 w2.clips = (struct v4l2_clip __user *)win->clips;
2348 retval = setup_window(fh, btv, &w2, 0);
2349 if (0 == retval) {
2350 /* on v4l1 this ioctl affects the read() size too */
2351 fh->width = fh->ov.w.width;
2352 fh->height = fh->ov.w.height;
2353 btv->init.width = fh->ov.w.width;
2354 btv->init.height = fh->ov.w.height;
2356 return retval;
2359 case VIDIOCGFBUF:
2361 struct video_buffer *fbuf = arg;
2363 fbuf->base = btv->fbuf.base;
2364 fbuf->width = btv->fbuf.fmt.width;
2365 fbuf->height = btv->fbuf.fmt.height;
2366 fbuf->bytesperline = btv->fbuf.fmt.bytesperline;
2367 if (fh->ovfmt)
2368 fbuf->depth = fh->ovfmt->depth;
2369 return 0;
2371 case VIDIOCSFBUF:
2373 struct video_buffer *fbuf = arg;
2374 const struct bttv_format *fmt;
2375 unsigned long end;
2377 if(!capable(CAP_SYS_ADMIN) &&
2378 !capable(CAP_SYS_RAWIO))
2379 return -EPERM;
2380 end = (unsigned long)fbuf->base +
2381 fbuf->height * fbuf->bytesperline;
2382 down(&fh->cap.lock);
2383 retval = -EINVAL;
2385 switch (fbuf->depth) {
2386 case 8:
2387 fmt = format_by_palette(VIDEO_PALETTE_HI240);
2388 break;
2389 case 16:
2390 fmt = format_by_palette(VIDEO_PALETTE_RGB565);
2391 break;
2392 case 24:
2393 fmt = format_by_palette(VIDEO_PALETTE_RGB24);
2394 break;
2395 case 32:
2396 fmt = format_by_palette(VIDEO_PALETTE_RGB32);
2397 break;
2398 case 15:
2399 fbuf->depth = 16;
2400 fmt = format_by_palette(VIDEO_PALETTE_RGB555);
2401 break;
2402 default:
2403 fmt = NULL;
2404 break;
2406 if (NULL == fmt)
2407 goto fh_unlock_and_return;
2409 fh->ovfmt = fmt;
2410 fh->fmt = fmt;
2411 btv->init.ovfmt = fmt;
2412 btv->init.fmt = fmt;
2413 btv->fbuf.base = fbuf->base;
2414 btv->fbuf.fmt.width = fbuf->width;
2415 btv->fbuf.fmt.height = fbuf->height;
2416 if (fbuf->bytesperline)
2417 btv->fbuf.fmt.bytesperline = fbuf->bytesperline;
2418 else
2419 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fbuf->depth/8;
2420 up(&fh->cap.lock);
2421 return 0;
2424 case VIDIOCCAPTURE:
2425 case VIDIOC_OVERLAY:
2427 struct bttv_buffer *new;
2428 int *on = arg;
2430 if (*on) {
2431 /* verify args */
2432 if (NULL == btv->fbuf.base)
2433 return -EINVAL;
2434 if (!fh->ov.setup_ok) {
2435 dprintk("bttv%d: overlay: !setup_ok\n",btv->c.nr);
2436 return -EINVAL;
2440 if (!check_alloc_btres(btv,fh,RESOURCE_OVERLAY))
2441 return -EBUSY;
2443 down(&fh->cap.lock);
2444 if (*on) {
2445 fh->ov.tvnorm = btv->tvnorm;
2446 new = videobuf_alloc(sizeof(*new));
2447 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2448 } else {
2449 new = NULL;
2452 /* switch over */
2453 retval = bttv_switch_overlay(btv,fh,new);
2454 up(&fh->cap.lock);
2455 return retval;
2458 case VIDIOCGMBUF:
2460 struct video_mbuf *mbuf = arg;
2461 unsigned int i;
2463 down(&fh->cap.lock);
2464 retval = videobuf_mmap_setup(&fh->cap,gbuffers,gbufsize,
2465 V4L2_MEMORY_MMAP);
2466 if (retval < 0)
2467 goto fh_unlock_and_return;
2468 memset(mbuf,0,sizeof(*mbuf));
2469 mbuf->frames = gbuffers;
2470 mbuf->size = gbuffers * gbufsize;
2471 for (i = 0; i < gbuffers; i++)
2472 mbuf->offsets[i] = i * gbufsize;
2473 up(&fh->cap.lock);
2474 return 0;
2476 case VIDIOCMCAPTURE:
2478 struct video_mmap *vm = arg;
2479 struct bttv_buffer *buf;
2480 enum v4l2_field field;
2482 if (vm->frame >= VIDEO_MAX_FRAME)
2483 return -EINVAL;
2485 down(&fh->cap.lock);
2486 retval = -EINVAL;
2487 buf = (struct bttv_buffer *)fh->cap.bufs[vm->frame];
2488 if (NULL == buf)
2489 goto fh_unlock_and_return;
2490 if (0 == buf->vb.baddr)
2491 goto fh_unlock_and_return;
2492 if (buf->vb.state == STATE_QUEUED ||
2493 buf->vb.state == STATE_ACTIVE)
2494 goto fh_unlock_and_return;
2496 field = (vm->height > bttv_tvnorms[btv->tvnorm].sheight/2)
2497 ? V4L2_FIELD_INTERLACED
2498 : V4L2_FIELD_BOTTOM;
2499 retval = bttv_prepare_buffer(btv,buf,
2500 format_by_palette(vm->format),
2501 vm->width,vm->height,field);
2502 if (0 != retval)
2503 goto fh_unlock_and_return;
2504 spin_lock_irqsave(&btv->s_lock,flags);
2505 buffer_queue(&fh->cap,&buf->vb);
2506 spin_unlock_irqrestore(&btv->s_lock,flags);
2507 up(&fh->cap.lock);
2508 return 0;
2510 case VIDIOCSYNC:
2512 int *frame = arg;
2513 struct bttv_buffer *buf;
2515 if (*frame >= VIDEO_MAX_FRAME)
2516 return -EINVAL;
2518 down(&fh->cap.lock);
2519 retval = -EINVAL;
2520 buf = (struct bttv_buffer *)fh->cap.bufs[*frame];
2521 if (NULL == buf)
2522 goto fh_unlock_and_return;
2523 retval = videobuf_waiton(&buf->vb,0,1);
2524 if (0 != retval)
2525 goto fh_unlock_and_return;
2526 switch (buf->vb.state) {
2527 case STATE_ERROR:
2528 retval = -EIO;
2529 /* fall through */
2530 case STATE_DONE:
2531 videobuf_dma_pci_sync(btv->c.pci,&buf->vb.dma);
2532 bttv_dma_free(btv,buf);
2533 break;
2534 default:
2535 retval = -EINVAL;
2536 break;
2538 up(&fh->cap.lock);
2539 return retval;
2542 case VIDIOCGVBIFMT:
2544 struct vbi_format *fmt = (void *) arg;
2545 struct v4l2_format fmt2;
2547 if (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE) {
2548 retval = bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2549 if (0 != retval)
2550 return retval;
2552 bttv_vbi_get_fmt(fh, &fmt2);
2554 memset(fmt,0,sizeof(*fmt));
2555 fmt->sampling_rate = fmt2.fmt.vbi.sampling_rate;
2556 fmt->samples_per_line = fmt2.fmt.vbi.samples_per_line;
2557 fmt->sample_format = VIDEO_PALETTE_RAW;
2558 fmt->start[0] = fmt2.fmt.vbi.start[0];
2559 fmt->count[0] = fmt2.fmt.vbi.count[0];
2560 fmt->start[1] = fmt2.fmt.vbi.start[1];
2561 fmt->count[1] = fmt2.fmt.vbi.count[1];
2562 if (fmt2.fmt.vbi.flags & V4L2_VBI_UNSYNC)
2563 fmt->flags |= VBI_UNSYNC;
2564 if (fmt2.fmt.vbi.flags & V4L2_VBI_INTERLACED)
2565 fmt->flags |= VBI_INTERLACED;
2566 return 0;
2568 case VIDIOCSVBIFMT:
2570 struct vbi_format *fmt = (void *) arg;
2571 struct v4l2_format fmt2;
2573 retval = bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2574 if (0 != retval)
2575 return retval;
2576 bttv_vbi_get_fmt(fh, &fmt2);
2578 if (fmt->sampling_rate != fmt2.fmt.vbi.sampling_rate ||
2579 fmt->samples_per_line != fmt2.fmt.vbi.samples_per_line ||
2580 fmt->sample_format != VIDEO_PALETTE_RAW ||
2581 fmt->start[0] != fmt2.fmt.vbi.start[0] ||
2582 fmt->start[1] != fmt2.fmt.vbi.start[1] ||
2583 fmt->count[0] != fmt->count[1] ||
2584 fmt->count[0] < 1 ||
2585 fmt->count[0] > 32 /* VBI_MAXLINES */)
2586 return -EINVAL;
2588 bttv_vbi_setlines(fh,btv,fmt->count[0]);
2589 return 0;
2592 case BTTV_VERSION:
2593 case VIDIOCGFREQ:
2594 case VIDIOCSFREQ:
2595 case VIDIOCGTUNER:
2596 case VIDIOCSTUNER:
2597 case VIDIOCGCHAN:
2598 case VIDIOCSCHAN:
2599 case VIDIOCGAUDIO:
2600 case VIDIOCSAUDIO:
2601 return bttv_common_ioctls(btv,cmd,arg);
2603 /* *** v4l2 *** ************************************************ */
2604 case VIDIOC_QUERYCAP:
2606 struct v4l2_capability *cap = arg;
2608 if (0 == v4l2)
2609 return -EINVAL;
2610 memset(cap, 0, sizeof (*cap));
2611 strlcpy(cap->driver, "bttv", sizeof (cap->driver));
2612 strlcpy(cap->card, btv->video_dev->name, sizeof (cap->card));
2613 snprintf(cap->bus_info, sizeof (cap->bus_info),
2614 "PCI:%s", pci_name(btv->c.pci));
2615 cap->version = BTTV_VERSION_CODE;
2616 cap->capabilities =
2617 V4L2_CAP_VIDEO_CAPTURE |
2618 V4L2_CAP_VBI_CAPTURE |
2619 V4L2_CAP_READWRITE |
2620 V4L2_CAP_STREAMING;
2621 if (no_overlay <= 0)
2622 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2624 if (bttv_tvcards[btv->c.type].tuner != UNSET &&
2625 bttv_tvcards[btv->c.type].tuner != TUNER_ABSENT)
2626 cap->capabilities |= V4L2_CAP_TUNER;
2627 return 0;
2630 case VIDIOC_ENUM_FMT:
2632 struct v4l2_fmtdesc *f = arg;
2633 enum v4l2_buf_type type;
2634 unsigned int i;
2635 int index;
2637 type = f->type;
2638 if (V4L2_BUF_TYPE_VBI_CAPTURE == type) {
2639 /* vbi */
2640 index = f->index;
2641 if (0 != index)
2642 return -EINVAL;
2643 memset(f,0,sizeof(*f));
2644 f->index = index;
2645 f->type = type;
2646 f->pixelformat = V4L2_PIX_FMT_GREY;
2647 strcpy(f->description,"vbi data");
2648 return 0;
2651 /* video capture + overlay */
2652 index = -1;
2653 for (i = 0; i < BTTV_FORMATS; i++) {
2654 if (bttv_formats[i].fourcc != -1)
2655 index++;
2656 if ((unsigned int)index == f->index)
2657 break;
2659 if (BTTV_FORMATS == i)
2660 return -EINVAL;
2662 switch (f->type) {
2663 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2664 break;
2665 case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2666 if (!(bttv_formats[i].flags & FORMAT_FLAGS_PACKED))
2667 return -EINVAL;
2668 break;
2669 default:
2670 return -EINVAL;
2672 memset(f,0,sizeof(*f));
2673 f->index = index;
2674 f->type = type;
2675 f->pixelformat = bttv_formats[i].fourcc;
2676 strlcpy(f->description,bttv_formats[i].name,sizeof(f->description));
2677 return 0;
2680 case VIDIOC_TRY_FMT:
2682 struct v4l2_format *f = arg;
2683 return bttv_try_fmt(fh,btv,f);
2685 case VIDIOC_G_FMT:
2687 struct v4l2_format *f = arg;
2688 return bttv_g_fmt(fh,f);
2690 case VIDIOC_S_FMT:
2692 struct v4l2_format *f = arg;
2693 return bttv_s_fmt(fh,btv,f);
2696 case VIDIOC_G_FBUF:
2698 struct v4l2_framebuffer *fb = arg;
2700 *fb = btv->fbuf;
2701 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2702 if (fh->ovfmt)
2703 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2704 return 0;
2706 case VIDIOC_S_FBUF:
2708 struct v4l2_framebuffer *fb = arg;
2709 const struct bttv_format *fmt;
2711 if(!capable(CAP_SYS_ADMIN) &&
2712 !capable(CAP_SYS_RAWIO))
2713 return -EPERM;
2715 /* check args */
2716 fmt = format_by_fourcc(fb->fmt.pixelformat);
2717 if (NULL == fmt)
2718 return -EINVAL;
2719 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2720 return -EINVAL;
2722 down(&fh->cap.lock);
2723 retval = -EINVAL;
2724 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2725 if (fb->fmt.width > bttv_tvnorms[btv->tvnorm].swidth)
2726 goto fh_unlock_and_return;
2727 if (fb->fmt.height > bttv_tvnorms[btv->tvnorm].sheight)
2728 goto fh_unlock_and_return;
2731 /* ok, accept it */
2732 btv->fbuf.base = fb->base;
2733 btv->fbuf.fmt.width = fb->fmt.width;
2734 btv->fbuf.fmt.height = fb->fmt.height;
2735 if (0 != fb->fmt.bytesperline)
2736 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2737 else
2738 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2740 retval = 0;
2741 fh->ovfmt = fmt;
2742 btv->init.ovfmt = fmt;
2743 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2744 fh->ov.w.left = 0;
2745 fh->ov.w.top = 0;
2746 fh->ov.w.width = fb->fmt.width;
2747 fh->ov.w.height = fb->fmt.height;
2748 btv->init.ov.w.width = fb->fmt.width;
2749 btv->init.ov.w.height = fb->fmt.height;
2750 kfree(fh->ov.clips);
2751 fh->ov.clips = NULL;
2752 fh->ov.nclips = 0;
2754 if (check_btres(fh, RESOURCE_OVERLAY)) {
2755 struct bttv_buffer *new;
2757 new = videobuf_alloc(sizeof(*new));
2758 bttv_overlay_risc(btv,&fh->ov,fh->ovfmt,new);
2759 retval = bttv_switch_overlay(btv,fh,new);
2762 up(&fh->cap.lock);
2763 return retval;
2766 case VIDIOC_REQBUFS:
2767 return videobuf_reqbufs(bttv_queue(fh),arg);
2769 case VIDIOC_QUERYBUF:
2770 return videobuf_querybuf(bttv_queue(fh),arg);
2772 case VIDIOC_QBUF:
2773 return videobuf_qbuf(bttv_queue(fh),arg);
2775 case VIDIOC_DQBUF:
2776 return videobuf_dqbuf(bttv_queue(fh),arg,
2777 file->f_flags & O_NONBLOCK);
2779 case VIDIOC_STREAMON:
2781 int res = bttv_resource(fh);
2783 if (!check_alloc_btres(btv,fh,res))
2784 return -EBUSY;
2785 return videobuf_streamon(bttv_queue(fh));
2787 case VIDIOC_STREAMOFF:
2789 int res = bttv_resource(fh);
2791 retval = videobuf_streamoff(bttv_queue(fh));
2792 if (retval < 0)
2793 return retval;
2794 free_btres(btv,fh,res);
2795 return 0;
2798 case VIDIOC_QUERYCTRL:
2800 struct v4l2_queryctrl *c = arg;
2801 int i;
2803 if ((c->id < V4L2_CID_BASE ||
2804 c->id >= V4L2_CID_LASTP1) &&
2805 (c->id < V4L2_CID_PRIVATE_BASE ||
2806 c->id >= V4L2_CID_PRIVATE_LASTP1))
2807 return -EINVAL;
2808 for (i = 0; i < BTTV_CTLS; i++)
2809 if (bttv_ctls[i].id == c->id)
2810 break;
2811 if (i == BTTV_CTLS) {
2812 *c = no_ctl;
2813 return 0;
2815 *c = bttv_ctls[i];
2816 if (i >= 4 && i <= 8) {
2817 struct video_audio va;
2818 memset(&va,0,sizeof(va));
2819 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
2820 if (btv->audio_hook)
2821 btv->audio_hook(btv,&va,0);
2822 switch (bttv_ctls[i].id) {
2823 case V4L2_CID_AUDIO_VOLUME:
2824 if (!(va.flags & VIDEO_AUDIO_VOLUME))
2825 *c = no_ctl;
2826 break;
2827 case V4L2_CID_AUDIO_BALANCE:
2828 if (!(va.flags & VIDEO_AUDIO_BALANCE))
2829 *c = no_ctl;
2830 break;
2831 case V4L2_CID_AUDIO_BASS:
2832 if (!(va.flags & VIDEO_AUDIO_BASS))
2833 *c = no_ctl;
2834 break;
2835 case V4L2_CID_AUDIO_TREBLE:
2836 if (!(va.flags & VIDEO_AUDIO_TREBLE))
2837 *c = no_ctl;
2838 break;
2841 return 0;
2843 case VIDIOC_G_CTRL:
2844 return get_control(btv,arg);
2845 case VIDIOC_S_CTRL:
2846 return set_control(btv,arg);
2847 case VIDIOC_G_PARM:
2849 struct v4l2_streamparm *parm = arg;
2850 struct v4l2_standard s;
2851 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2852 return -EINVAL;
2853 memset(parm,0,sizeof(*parm));
2854 v4l2_video_std_construct(&s, bttv_tvnorms[btv->tvnorm].v4l2_id,
2855 bttv_tvnorms[btv->tvnorm].name);
2856 parm->parm.capture.timeperframe = s.frameperiod;
2857 return 0;
2860 case VIDIOC_G_PRIORITY:
2862 enum v4l2_priority *p = arg;
2864 *p = v4l2_prio_max(&btv->prio);
2865 return 0;
2867 case VIDIOC_S_PRIORITY:
2869 enum v4l2_priority *prio = arg;
2871 return v4l2_prio_change(&btv->prio, &fh->prio, *prio);
2874 case VIDIOC_ENUMSTD:
2875 case VIDIOC_G_STD:
2876 case VIDIOC_S_STD:
2877 case VIDIOC_ENUMINPUT:
2878 case VIDIOC_G_INPUT:
2879 case VIDIOC_S_INPUT:
2880 case VIDIOC_G_TUNER:
2881 case VIDIOC_S_TUNER:
2882 case VIDIOC_G_FREQUENCY:
2883 case VIDIOC_S_FREQUENCY:
2884 case VIDIOC_LOG_STATUS:
2885 return bttv_common_ioctls(btv,cmd,arg);
2887 default:
2888 return -ENOIOCTLCMD;
2890 return 0;
2892 fh_unlock_and_return:
2893 up(&fh->cap.lock);
2894 return retval;
2897 static int bttv_ioctl(struct inode *inode, struct file *file,
2898 unsigned int cmd, unsigned long arg)
2900 struct bttv_fh *fh = file->private_data;
2902 switch (cmd) {
2903 case BTTV_VBISIZE:
2904 bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2905 return fh->lines * 2 * 2048;
2906 default:
2907 return video_usercopy(inode, file, cmd, arg, bttv_do_ioctl);
2911 static ssize_t bttv_read(struct file *file, char __user *data,
2912 size_t count, loff_t *ppos)
2914 struct bttv_fh *fh = file->private_data;
2915 int retval = 0;
2917 if (fh->btv->errors)
2918 bttv_reinit_bt848(fh->btv);
2919 dprintk("bttv%d: read count=%d type=%s\n",
2920 fh->btv->c.nr,(int)count,v4l2_type_names[fh->type]);
2922 switch (fh->type) {
2923 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2924 if (locked_btres(fh->btv,RESOURCE_VIDEO))
2925 return -EBUSY;
2926 retval = videobuf_read_one(&fh->cap, data, count, ppos,
2927 file->f_flags & O_NONBLOCK);
2928 break;
2929 case V4L2_BUF_TYPE_VBI_CAPTURE:
2930 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
2931 return -EBUSY;
2932 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
2933 file->f_flags & O_NONBLOCK);
2934 break;
2935 default:
2936 BUG();
2938 return retval;
2941 static unsigned int bttv_poll(struct file *file, poll_table *wait)
2943 struct bttv_fh *fh = file->private_data;
2944 struct bttv_buffer *buf;
2945 enum v4l2_field field;
2947 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2948 if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
2949 return POLLERR;
2950 return videobuf_poll_stream(file, &fh->vbi, wait);
2953 if (check_btres(fh,RESOURCE_VIDEO)) {
2954 /* streaming capture */
2955 if (list_empty(&fh->cap.stream))
2956 return POLLERR;
2957 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
2958 } else {
2959 /* read() capture */
2960 down(&fh->cap.lock);
2961 if (NULL == fh->cap.read_buf) {
2962 /* need to capture a new frame */
2963 if (locked_btres(fh->btv,RESOURCE_VIDEO)) {
2964 up(&fh->cap.lock);
2965 return POLLERR;
2967 fh->cap.read_buf = videobuf_alloc(fh->cap.msize);
2968 if (NULL == fh->cap.read_buf) {
2969 up(&fh->cap.lock);
2970 return POLLERR;
2972 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
2973 field = videobuf_next_field(&fh->cap);
2974 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
2975 kfree (fh->cap.read_buf);
2976 fh->cap.read_buf = NULL;
2977 up(&fh->cap.lock);
2978 return POLLERR;
2980 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
2981 fh->cap.read_off = 0;
2983 up(&fh->cap.lock);
2984 buf = (struct bttv_buffer*)fh->cap.read_buf;
2987 poll_wait(file, &buf->vb.done, wait);
2988 if (buf->vb.state == STATE_DONE ||
2989 buf->vb.state == STATE_ERROR)
2990 return POLLIN|POLLRDNORM;
2991 return 0;
2994 static int bttv_open(struct inode *inode, struct file *file)
2996 int minor = iminor(inode);
2997 struct bttv *btv = NULL;
2998 struct bttv_fh *fh;
2999 enum v4l2_buf_type type = 0;
3000 unsigned int i;
3002 dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
3004 for (i = 0; i < bttv_num; i++) {
3005 if (bttvs[i].video_dev &&
3006 bttvs[i].video_dev->minor == minor) {
3007 btv = &bttvs[i];
3008 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3009 break;
3011 if (bttvs[i].vbi_dev &&
3012 bttvs[i].vbi_dev->minor == minor) {
3013 btv = &bttvs[i];
3014 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3015 break;
3018 if (NULL == btv)
3019 return -ENODEV;
3021 dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
3022 btv->c.nr,v4l2_type_names[type]);
3024 /* allocate per filehandle data */
3025 fh = kmalloc(sizeof(*fh),GFP_KERNEL);
3026 if (NULL == fh)
3027 return -ENOMEM;
3028 file->private_data = fh;
3029 *fh = btv->init;
3030 fh->type = type;
3031 fh->ov.setup_ok = 0;
3032 v4l2_prio_open(&btv->prio,&fh->prio);
3034 videobuf_queue_init(&fh->cap, &bttv_video_qops,
3035 btv->c.pci, &btv->s_lock,
3036 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3037 V4L2_FIELD_INTERLACED,
3038 sizeof(struct bttv_buffer),
3039 fh);
3040 videobuf_queue_init(&fh->vbi, &bttv_vbi_qops,
3041 btv->c.pci, &btv->s_lock,
3042 V4L2_BUF_TYPE_VBI_CAPTURE,
3043 V4L2_FIELD_SEQ_TB,
3044 sizeof(struct bttv_buffer),
3045 fh);
3046 i2c_vidiocschan(btv);
3048 btv->users++;
3049 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)
3050 bttv_vbi_setlines(fh,btv,16);
3051 bttv_field_count(btv);
3052 return 0;
3055 static int bttv_release(struct inode *inode, struct file *file)
3057 struct bttv_fh *fh = file->private_data;
3058 struct bttv *btv = fh->btv;
3060 /* turn off overlay */
3061 if (check_btres(fh, RESOURCE_OVERLAY))
3062 bttv_switch_overlay(btv,fh,NULL);
3064 /* stop video capture */
3065 if (check_btres(fh, RESOURCE_VIDEO)) {
3066 videobuf_streamoff(&fh->cap);
3067 free_btres(btv,fh,RESOURCE_VIDEO);
3069 if (fh->cap.read_buf) {
3070 buffer_release(&fh->cap,fh->cap.read_buf);
3071 kfree(fh->cap.read_buf);
3074 /* stop vbi capture */
3075 if (check_btres(fh, RESOURCE_VBI)) {
3076 if (fh->vbi.streaming)
3077 videobuf_streamoff(&fh->vbi);
3078 if (fh->vbi.reading)
3079 videobuf_read_stop(&fh->vbi);
3080 free_btres(btv,fh,RESOURCE_VBI);
3083 /* free stuff */
3084 videobuf_mmap_free(&fh->cap);
3085 videobuf_mmap_free(&fh->vbi);
3086 v4l2_prio_close(&btv->prio,&fh->prio);
3087 file->private_data = NULL;
3088 kfree(fh);
3090 btv->users--;
3091 bttv_field_count(btv);
3092 return 0;
3095 static int
3096 bttv_mmap(struct file *file, struct vm_area_struct *vma)
3098 struct bttv_fh *fh = file->private_data;
3100 dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
3101 fh->btv->c.nr, v4l2_type_names[fh->type],
3102 vma->vm_start, vma->vm_end - vma->vm_start);
3103 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3106 static struct file_operations bttv_fops =
3108 .owner = THIS_MODULE,
3109 .open = bttv_open,
3110 .release = bttv_release,
3111 .ioctl = bttv_ioctl,
3112 .compat_ioctl = v4l_compat_ioctl32,
3113 .llseek = no_llseek,
3114 .read = bttv_read,
3115 .mmap = bttv_mmap,
3116 .poll = bttv_poll,
3119 static struct video_device bttv_video_template =
3121 .name = "UNSET",
3122 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|
3123 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
3124 .hardware = VID_HARDWARE_BT848,
3125 .fops = &bttv_fops,
3126 .minor = -1,
3129 static struct video_device bttv_vbi_template =
3131 .name = "bt848/878 vbi",
3132 .type = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
3133 .hardware = VID_HARDWARE_BT848,
3134 .fops = &bttv_fops,
3135 .minor = -1,
3138 /* ----------------------------------------------------------------------- */
3139 /* radio interface */
3141 static int radio_open(struct inode *inode, struct file *file)
3143 int minor = iminor(inode);
3144 struct bttv *btv = NULL;
3145 unsigned int i;
3147 dprintk("bttv: open minor=%d\n",minor);
3149 for (i = 0; i < bttv_num; i++) {
3150 if (bttvs[i].radio_dev->minor == minor) {
3151 btv = &bttvs[i];
3152 break;
3155 if (NULL == btv)
3156 return -ENODEV;
3158 dprintk("bttv%d: open called (radio)\n",btv->c.nr);
3159 mutex_lock(&btv->lock);
3161 btv->radio_user++;
3163 file->private_data = btv;
3165 bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
3166 audio_mux(btv,AUDIO_RADIO);
3168 mutex_unlock(&btv->lock);
3169 return 0;
3172 static int radio_release(struct inode *inode, struct file *file)
3174 struct bttv *btv = file->private_data;
3175 struct rds_command cmd;
3177 btv->radio_user--;
3179 bttv_call_i2c_clients(btv, RDS_CMD_CLOSE, &cmd);
3181 return 0;
3184 static int radio_do_ioctl(struct inode *inode, struct file *file,
3185 unsigned int cmd, void *arg)
3187 struct bttv *btv = file->private_data;
3189 switch (cmd) {
3190 case VIDIOCGCAP:
3192 struct video_capability *cap = arg;
3194 memset(cap,0,sizeof(*cap));
3195 strcpy(cap->name,btv->radio_dev->name);
3196 cap->type = VID_TYPE_TUNER;
3197 cap->channels = 1;
3198 cap->audios = 1;
3199 return 0;
3202 case VIDIOCGTUNER:
3204 struct video_tuner *v = arg;
3206 if(v->tuner)
3207 return -EINVAL;
3208 memset(v,0,sizeof(*v));
3209 strcpy(v->name, "Radio");
3210 bttv_call_i2c_clients(btv,cmd,v);
3211 return 0;
3213 case VIDIOCSTUNER:
3214 /* nothing to do */
3215 return 0;
3217 case BTTV_VERSION:
3218 case VIDIOCGFREQ:
3219 case VIDIOCSFREQ:
3220 case VIDIOCGAUDIO:
3221 case VIDIOCSAUDIO:
3222 case VIDIOC_LOG_STATUS:
3223 return bttv_common_ioctls(btv,cmd,arg);
3225 default:
3226 return -ENOIOCTLCMD;
3228 return 0;
3231 static int radio_ioctl(struct inode *inode, struct file *file,
3232 unsigned int cmd, unsigned long arg)
3234 return video_usercopy(inode, file, cmd, arg, radio_do_ioctl);
3237 static ssize_t radio_read(struct file *file, char __user *data,
3238 size_t count, loff_t *ppos)
3240 struct bttv *btv = file->private_data;
3241 struct rds_command cmd;
3242 cmd.block_count = count/3;
3243 cmd.buffer = data;
3244 cmd.instance = file;
3245 cmd.result = -ENODEV;
3247 bttv_call_i2c_clients(btv, RDS_CMD_READ, &cmd);
3249 return cmd.result;
3252 static unsigned int radio_poll(struct file *file, poll_table *wait)
3254 struct bttv *btv = file->private_data;
3255 struct rds_command cmd;
3256 cmd.instance = file;
3257 cmd.event_list = wait;
3258 cmd.result = -ENODEV;
3259 bttv_call_i2c_clients(btv, RDS_CMD_POLL, &cmd);
3261 return cmd.result;
3264 static struct file_operations radio_fops =
3266 .owner = THIS_MODULE,
3267 .open = radio_open,
3268 .read = radio_read,
3269 .release = radio_release,
3270 .ioctl = radio_ioctl,
3271 .llseek = no_llseek,
3272 .poll = radio_poll,
3275 static struct video_device radio_template =
3277 .name = "bt848/878 radio",
3278 .type = VID_TYPE_TUNER,
3279 .hardware = VID_HARDWARE_BT848,
3280 .fops = &radio_fops,
3281 .minor = -1,
3284 /* ----------------------------------------------------------------------- */
3285 /* some debug code */
3287 static int bttv_risc_decode(u32 risc)
3289 static char *instr[16] = {
3290 [ BT848_RISC_WRITE >> 28 ] = "write",
3291 [ BT848_RISC_SKIP >> 28 ] = "skip",
3292 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3293 [ BT848_RISC_JUMP >> 28 ] = "jump",
3294 [ BT848_RISC_SYNC >> 28 ] = "sync",
3295 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3296 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3297 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3299 static int incr[16] = {
3300 [ BT848_RISC_WRITE >> 28 ] = 2,
3301 [ BT848_RISC_JUMP >> 28 ] = 2,
3302 [ BT848_RISC_SYNC >> 28 ] = 2,
3303 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3304 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3305 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3307 static char *bits[] = {
3308 "be0", "be1", "be2", "be3/resync",
3309 "set0", "set1", "set2", "set3",
3310 "clr0", "clr1", "clr2", "clr3",
3311 "irq", "res", "eol", "sol",
3313 int i;
3315 printk("0x%08x [ %s", risc,
3316 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3317 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3318 if (risc & (1 << (i + 12)))
3319 printk(" %s",bits[i]);
3320 printk(" count=%d ]\n", risc & 0xfff);
3321 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3324 static void bttv_risc_disasm(struct bttv *btv,
3325 struct btcx_riscmem *risc)
3327 unsigned int i,j,n;
3329 printk("%s: risc disasm: %p [dma=0x%08lx]\n",
3330 btv->c.name, risc->cpu, (unsigned long)risc->dma);
3331 for (i = 0; i < (risc->size >> 2); i += n) {
3332 printk("%s: 0x%lx: ", btv->c.name,
3333 (unsigned long)(risc->dma + (i<<2)));
3334 n = bttv_risc_decode(risc->cpu[i]);
3335 for (j = 1; j < n; j++)
3336 printk("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3337 btv->c.name, (unsigned long)(risc->dma + ((i+j)<<2)),
3338 risc->cpu[i+j], j);
3339 if (0 == risc->cpu[i])
3340 break;
3344 static void bttv_print_riscaddr(struct bttv *btv)
3346 printk(" main: %08Lx\n",
3347 (unsigned long long)btv->main.dma);
3348 printk(" vbi : o=%08Lx e=%08Lx\n",
3349 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3350 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3351 printk(" cap : o=%08Lx e=%08Lx\n",
3352 btv->curr.top ? (unsigned long long)btv->curr.top->top.dma : 0,
3353 btv->curr.bottom ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3354 printk(" scr : o=%08Lx e=%08Lx\n",
3355 btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3356 btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3357 bttv_risc_disasm(btv, &btv->main);
3360 /* ----------------------------------------------------------------------- */
3361 /* irq handler */
3363 static char *irq_name[] = {
3364 "FMTCHG", // format change detected (525 vs. 625)
3365 "VSYNC", // vertical sync (new field)
3366 "HSYNC", // horizontal sync
3367 "OFLOW", // chroma/luma AGC overflow
3368 "HLOCK", // horizontal lock changed
3369 "VPRES", // video presence changed
3370 "6", "7",
3371 "I2CDONE", // hw irc operation finished
3372 "GPINT", // gpio port triggered irq
3373 "10",
3374 "RISCI", // risc instruction triggered irq
3375 "FBUS", // pixel data fifo dropped data (high pci bus latencies)
3376 "FTRGT", // pixel data fifo overrun
3377 "FDSR", // fifo data stream resyncronisation
3378 "PPERR", // parity error (data transfer)
3379 "RIPERR", // parity error (read risc instructions)
3380 "PABORT", // pci abort
3381 "OCERR", // risc instruction error
3382 "SCERR", // syncronisation error
3385 static void bttv_print_irqbits(u32 print, u32 mark)
3387 unsigned int i;
3389 printk("bits:");
3390 for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3391 if (print & (1 << i))
3392 printk(" %s",irq_name[i]);
3393 if (mark & (1 << i))
3394 printk("*");
3398 static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3400 printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3401 btv->c.nr,
3402 (unsigned long)btv->main.dma,
3403 (unsigned long)btv->main.cpu[RISC_SLOT_O_VBI+1],
3404 (unsigned long)btv->main.cpu[RISC_SLOT_O_FIELD+1],
3405 (unsigned long)rc);
3407 if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3408 printk("bttv%d: Oh, there (temporarely?) is no input signal. "
3409 "Ok, then this is harmless, don't worry ;)\n",
3410 btv->c.nr);
3411 return;
3413 printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
3414 btv->c.nr);
3415 printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
3416 btv->c.nr);
3417 dump_stack();
3420 static int
3421 bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3423 struct bttv_buffer *item;
3425 memset(set,0,sizeof(*set));
3427 /* capture request ? */
3428 if (!list_empty(&btv->capture)) {
3429 set->frame_irq = 1;
3430 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3431 if (V4L2_FIELD_HAS_TOP(item->vb.field))
3432 set->top = item;
3433 if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3434 set->bottom = item;
3436 /* capture request for other field ? */
3437 if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3438 (item->vb.queue.next != &btv->capture)) {
3439 item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3440 if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3441 if (NULL == set->top &&
3442 V4L2_FIELD_TOP == item->vb.field) {
3443 set->top = item;
3445 if (NULL == set->bottom &&
3446 V4L2_FIELD_BOTTOM == item->vb.field) {
3447 set->bottom = item;
3449 if (NULL != set->top && NULL != set->bottom)
3450 set->top_irq = 2;
3455 /* screen overlay ? */
3456 if (NULL != btv->screen) {
3457 if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3458 if (NULL == set->top && NULL == set->bottom) {
3459 set->top = btv->screen;
3460 set->bottom = btv->screen;
3462 } else {
3463 if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3464 NULL == set->top) {
3465 set->top = btv->screen;
3467 if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3468 NULL == set->bottom) {
3469 set->bottom = btv->screen;
3474 dprintk("bttv%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3475 btv->c.nr,set->top, set->bottom,
3476 btv->screen,set->frame_irq,set->top_irq);
3477 return 0;
3480 static void
3481 bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3482 struct bttv_buffer_set *curr, unsigned int state)
3484 struct timeval ts;
3486 do_gettimeofday(&ts);
3488 if (wakeup->top == wakeup->bottom) {
3489 if (NULL != wakeup->top && curr->top != wakeup->top) {
3490 if (irq_debug > 1)
3491 printk("bttv%d: wakeup: both=%p\n",btv->c.nr,wakeup->top);
3492 wakeup->top->vb.ts = ts;
3493 wakeup->top->vb.field_count = btv->field_count;
3494 wakeup->top->vb.state = state;
3495 wake_up(&wakeup->top->vb.done);
3497 } else {
3498 if (NULL != wakeup->top && curr->top != wakeup->top) {
3499 if (irq_debug > 1)
3500 printk("bttv%d: wakeup: top=%p\n",btv->c.nr,wakeup->top);
3501 wakeup->top->vb.ts = ts;
3502 wakeup->top->vb.field_count = btv->field_count;
3503 wakeup->top->vb.state = state;
3504 wake_up(&wakeup->top->vb.done);
3506 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3507 if (irq_debug > 1)
3508 printk("bttv%d: wakeup: bottom=%p\n",btv->c.nr,wakeup->bottom);
3509 wakeup->bottom->vb.ts = ts;
3510 wakeup->bottom->vb.field_count = btv->field_count;
3511 wakeup->bottom->vb.state = state;
3512 wake_up(&wakeup->bottom->vb.done);
3517 static void
3518 bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3519 unsigned int state)
3521 struct timeval ts;
3523 if (NULL == wakeup)
3524 return;
3526 do_gettimeofday(&ts);
3527 wakeup->vb.ts = ts;
3528 wakeup->vb.field_count = btv->field_count;
3529 wakeup->vb.state = state;
3530 wake_up(&wakeup->vb.done);
3533 static void bttv_irq_timeout(unsigned long data)
3535 struct bttv *btv = (struct bttv *)data;
3536 struct bttv_buffer_set old,new;
3537 struct bttv_buffer *ovbi;
3538 struct bttv_buffer *item;
3539 unsigned long flags;
3541 if (bttv_verbose) {
3542 printk(KERN_INFO "bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3543 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3544 btread(BT848_RISC_COUNT));
3545 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3546 printk("\n");
3549 spin_lock_irqsave(&btv->s_lock,flags);
3551 /* deactivate stuff */
3552 memset(&new,0,sizeof(new));
3553 old = btv->curr;
3554 ovbi = btv->cvbi;
3555 btv->curr = new;
3556 btv->cvbi = NULL;
3557 btv->loop_irq = 0;
3558 bttv_buffer_activate_video(btv, &new);
3559 bttv_buffer_activate_vbi(btv, NULL);
3560 bttv_set_dma(btv, 0);
3562 /* wake up */
3563 bttv_irq_wakeup_video(btv, &old, &new, STATE_ERROR);
3564 bttv_irq_wakeup_vbi(btv, ovbi, STATE_ERROR);
3566 /* cancel all outstanding capture / vbi requests */
3567 while (!list_empty(&btv->capture)) {
3568 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3569 list_del(&item->vb.queue);
3570 item->vb.state = STATE_ERROR;
3571 wake_up(&item->vb.done);
3573 while (!list_empty(&btv->vcapture)) {
3574 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3575 list_del(&item->vb.queue);
3576 item->vb.state = STATE_ERROR;
3577 wake_up(&item->vb.done);
3580 btv->errors++;
3581 spin_unlock_irqrestore(&btv->s_lock,flags);
3584 static void
3585 bttv_irq_wakeup_top(struct bttv *btv)
3587 struct bttv_buffer *wakeup = btv->curr.top;
3589 if (NULL == wakeup)
3590 return;
3592 spin_lock(&btv->s_lock);
3593 btv->curr.top_irq = 0;
3594 btv->curr.top = NULL;
3595 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3597 do_gettimeofday(&wakeup->vb.ts);
3598 wakeup->vb.field_count = btv->field_count;
3599 wakeup->vb.state = STATE_DONE;
3600 wake_up(&wakeup->vb.done);
3601 spin_unlock(&btv->s_lock);
3604 static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3606 if (rc < risc->dma)
3607 return 0;
3608 if (rc > risc->dma + risc->size)
3609 return 0;
3610 return 1;
3613 static void
3614 bttv_irq_switch_video(struct bttv *btv)
3616 struct bttv_buffer_set new;
3617 struct bttv_buffer_set old;
3618 dma_addr_t rc;
3620 spin_lock(&btv->s_lock);
3622 /* new buffer set */
3623 bttv_irq_next_video(btv, &new);
3624 rc = btread(BT848_RISC_COUNT);
3625 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3626 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3627 btv->framedrop++;
3628 if (debug_latency)
3629 bttv_irq_debug_low_latency(btv, rc);
3630 spin_unlock(&btv->s_lock);
3631 return;
3634 /* switch over */
3635 old = btv->curr;
3636 btv->curr = new;
3637 btv->loop_irq &= ~1;
3638 bttv_buffer_activate_video(btv, &new);
3639 bttv_set_dma(btv, 0);
3641 /* switch input */
3642 if (UNSET != btv->new_input) {
3643 video_mux(btv,btv->new_input);
3644 btv->new_input = UNSET;
3647 /* wake up finished buffers */
3648 bttv_irq_wakeup_video(btv, &old, &new, STATE_DONE);
3649 spin_unlock(&btv->s_lock);
3652 static void
3653 bttv_irq_switch_vbi(struct bttv *btv)
3655 struct bttv_buffer *new = NULL;
3656 struct bttv_buffer *old;
3657 u32 rc;
3659 spin_lock(&btv->s_lock);
3661 if (!list_empty(&btv->vcapture))
3662 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3663 old = btv->cvbi;
3665 rc = btread(BT848_RISC_COUNT);
3666 if (NULL != old && (is_active(&old->top, rc) ||
3667 is_active(&old->bottom, rc))) {
3668 btv->framedrop++;
3669 if (debug_latency)
3670 bttv_irq_debug_low_latency(btv, rc);
3671 spin_unlock(&btv->s_lock);
3672 return;
3675 /* switch */
3676 btv->cvbi = new;
3677 btv->loop_irq &= ~4;
3678 bttv_buffer_activate_vbi(btv, new);
3679 bttv_set_dma(btv, 0);
3681 bttv_irq_wakeup_vbi(btv, old, STATE_DONE);
3682 spin_unlock(&btv->s_lock);
3685 static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs)
3687 u32 stat,astat;
3688 u32 dstat;
3689 int count;
3690 struct bttv *btv;
3691 int handled = 0;
3693 btv=(struct bttv *)dev_id;
3695 if (btv->custom_irq)
3696 handled = btv->custom_irq(btv);
3698 count=0;
3699 while (1) {
3700 /* get/clear interrupt status bits */
3701 stat=btread(BT848_INT_STAT);
3702 astat=stat&btread(BT848_INT_MASK);
3703 if (!astat)
3704 break;
3705 handled = 1;
3706 btwrite(stat,BT848_INT_STAT);
3708 /* get device status bits */
3709 dstat=btread(BT848_DSTATUS);
3711 if (irq_debug) {
3712 printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d "
3713 "riscs=%x, riscc=%08x, ",
3714 btv->c.nr, count, btv->field_count,
3715 stat>>28, btread(BT848_RISC_COUNT));
3716 bttv_print_irqbits(stat,astat);
3717 if (stat & BT848_INT_HLOCK)
3718 printk(" HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
3719 ? "yes" : "no");
3720 if (stat & BT848_INT_VPRES)
3721 printk(" PRES => %s", (dstat & BT848_DSTATUS_PRES)
3722 ? "yes" : "no");
3723 if (stat & BT848_INT_FMTCHG)
3724 printk(" NUML => %s", (dstat & BT848_DSTATUS_NUML)
3725 ? "625" : "525");
3726 printk("\n");
3729 if (astat&BT848_INT_VSYNC)
3730 btv->field_count++;
3732 if ((astat & BT848_INT_GPINT) && btv->remote) {
3733 wake_up(&btv->gpioq);
3734 bttv_input_irq(btv);
3737 if (astat & BT848_INT_I2CDONE) {
3738 btv->i2c_done = stat;
3739 wake_up(&btv->i2c_queue);
3742 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
3743 bttv_irq_switch_vbi(btv);
3745 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
3746 bttv_irq_wakeup_top(btv);
3748 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
3749 bttv_irq_switch_video(btv);
3751 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
3752 audio_mux(btv, -1);
3754 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
3755 printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->c.nr,
3756 (astat & BT848_INT_SCERR) ? "SCERR" : "",
3757 (astat & BT848_INT_OCERR) ? "OCERR" : "",
3758 btread(BT848_RISC_COUNT));
3759 bttv_print_irqbits(stat,astat);
3760 printk("\n");
3761 if (bttv_debug)
3762 bttv_print_riscaddr(btv);
3764 if (fdsr && astat & BT848_INT_FDSR) {
3765 printk(KERN_INFO "bttv%d: FDSR @ %08x\n",
3766 btv->c.nr,btread(BT848_RISC_COUNT));
3767 if (bttv_debug)
3768 bttv_print_riscaddr(btv);
3771 count++;
3772 if (count > 4) {
3774 if (count > 8 || !(astat & BT848_INT_GPINT)) {
3775 btwrite(0, BT848_INT_MASK);
3777 printk(KERN_ERR
3778 "bttv%d: IRQ lockup, cleared int mask [", btv->c.nr);
3779 } else {
3780 printk(KERN_ERR
3781 "bttv%d: IRQ lockup, clearing GPINT from int mask [", btv->c.nr);
3783 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
3784 BT848_INT_MASK);
3787 bttv_print_irqbits(stat,astat);
3789 printk("]\n");
3792 btv->irq_total++;
3793 if (handled)
3794 btv->irq_me++;
3795 return IRQ_RETVAL(handled);
3799 /* ----------------------------------------------------------------------- */
3800 /* initialitation */
3802 static struct video_device *vdev_init(struct bttv *btv,
3803 struct video_device *template,
3804 char *type)
3806 struct video_device *vfd;
3808 vfd = video_device_alloc();
3809 if (NULL == vfd)
3810 return NULL;
3811 *vfd = *template;
3812 vfd->minor = -1;
3813 vfd->dev = &btv->c.pci->dev;
3814 vfd->release = video_device_release;
3815 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
3816 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
3817 type, bttv_tvcards[btv->c.type].name);
3818 return vfd;
3821 static void bttv_unregister_video(struct bttv *btv)
3823 if (btv->video_dev) {
3824 if (-1 != btv->video_dev->minor)
3825 video_unregister_device(btv->video_dev);
3826 else
3827 video_device_release(btv->video_dev);
3828 btv->video_dev = NULL;
3830 if (btv->vbi_dev) {
3831 if (-1 != btv->vbi_dev->minor)
3832 video_unregister_device(btv->vbi_dev);
3833 else
3834 video_device_release(btv->vbi_dev);
3835 btv->vbi_dev = NULL;
3837 if (btv->radio_dev) {
3838 if (-1 != btv->radio_dev->minor)
3839 video_unregister_device(btv->radio_dev);
3840 else
3841 video_device_release(btv->radio_dev);
3842 btv->radio_dev = NULL;
3846 /* register video4linux devices */
3847 static int __devinit bttv_register_video(struct bttv *btv)
3849 if (no_overlay <= 0) {
3850 bttv_video_template.type |= VID_TYPE_OVERLAY;
3851 } else {
3852 printk("bttv: Overlay support disabled.\n");
3855 /* video */
3856 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
3857 if (NULL == btv->video_dev)
3858 goto err;
3859 if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0)
3860 goto err;
3861 printk(KERN_INFO "bttv%d: registered device video%d\n",
3862 btv->c.nr,btv->video_dev->minor & 0x1f);
3863 video_device_create_file(btv->video_dev, &class_device_attr_card);
3865 /* vbi */
3866 btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
3867 if (NULL == btv->vbi_dev)
3868 goto err;
3869 if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0)
3870 goto err;
3871 printk(KERN_INFO "bttv%d: registered device vbi%d\n",
3872 btv->c.nr,btv->vbi_dev->minor & 0x1f);
3874 if (!btv->has_radio)
3875 return 0;
3876 /* radio */
3877 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
3878 if (NULL == btv->radio_dev)
3879 goto err;
3880 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0)
3881 goto err;
3882 printk(KERN_INFO "bttv%d: registered device radio%d\n",
3883 btv->c.nr,btv->radio_dev->minor & 0x1f);
3885 /* all done */
3886 return 0;
3888 err:
3889 bttv_unregister_video(btv);
3890 return -1;
3894 /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
3895 /* response on cards with no firmware is not enabled by OF */
3896 static void pci_set_command(struct pci_dev *dev)
3898 #if defined(__powerpc__)
3899 unsigned int cmd;
3901 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
3902 cmd = (cmd | PCI_COMMAND_MEMORY );
3903 pci_write_config_dword(dev, PCI_COMMAND, cmd);
3904 #endif
3907 static int __devinit bttv_probe(struct pci_dev *dev,
3908 const struct pci_device_id *pci_id)
3910 int result;
3911 unsigned char lat;
3912 struct bttv *btv;
3914 if (bttv_num == BTTV_MAX)
3915 return -ENOMEM;
3916 printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
3917 btv=&bttvs[bttv_num];
3918 memset(btv,0,sizeof(*btv));
3919 btv->c.nr = bttv_num;
3920 sprintf(btv->c.name,"bttv%d",btv->c.nr);
3922 /* initialize structs / fill in defaults */
3923 mutex_init(&btv->lock);
3924 mutex_init(&btv->reslock);
3925 spin_lock_init(&btv->s_lock);
3926 spin_lock_init(&btv->gpio_lock);
3927 init_waitqueue_head(&btv->gpioq);
3928 init_waitqueue_head(&btv->i2c_queue);
3929 INIT_LIST_HEAD(&btv->c.subs);
3930 INIT_LIST_HEAD(&btv->capture);
3931 INIT_LIST_HEAD(&btv->vcapture);
3932 v4l2_prio_init(&btv->prio);
3934 init_timer(&btv->timeout);
3935 btv->timeout.function = bttv_irq_timeout;
3936 btv->timeout.data = (unsigned long)btv;
3938 btv->i2c_rc = -1;
3939 btv->tuner_type = UNSET;
3940 btv->new_input = UNSET;
3941 btv->has_radio=radio[btv->c.nr];
3943 /* pci stuff (init, get irq/mmio, ... */
3944 btv->c.pci = dev;
3945 btv->id = dev->device;
3946 if (pci_enable_device(dev)) {
3947 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
3948 btv->c.nr);
3949 return -EIO;
3951 if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
3952 printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
3953 btv->c.nr);
3954 return -EIO;
3956 if (!request_mem_region(pci_resource_start(dev,0),
3957 pci_resource_len(dev,0),
3958 btv->c.name)) {
3959 printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n",
3960 btv->c.nr, pci_resource_start(dev,0));
3961 return -EBUSY;
3963 pci_set_master(dev);
3964 pci_set_command(dev);
3965 pci_set_drvdata(dev,btv);
3967 pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
3968 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
3969 printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ",
3970 bttv_num,btv->id, btv->revision, pci_name(dev));
3971 printk("irq: %d, latency: %d, mmio: 0x%lx\n",
3972 btv->c.pci->irq, lat, pci_resource_start(dev,0));
3973 schedule();
3975 btv->bt848_mmio=ioremap(pci_resource_start(dev,0), 0x1000);
3976 if (NULL == ioremap(pci_resource_start(dev,0), 0x1000)) {
3977 printk("bttv%d: ioremap() failed\n", btv->c.nr);
3978 result = -EIO;
3979 goto fail1;
3982 /* identify card */
3983 bttv_idcard(btv);
3985 /* disable irqs, register irq handler */
3986 btwrite(0, BT848_INT_MASK);
3987 result = request_irq(btv->c.pci->irq, bttv_irq,
3988 SA_SHIRQ | SA_INTERRUPT,btv->c.name,(void *)btv);
3989 if (result < 0) {
3990 printk(KERN_ERR "bttv%d: can't get IRQ %d\n",
3991 bttv_num,btv->c.pci->irq);
3992 goto fail1;
3995 if (0 != bttv_handle_chipset(btv)) {
3996 result = -EIO;
3997 goto fail2;
4000 /* init options from insmod args */
4001 btv->opt_combfilter = combfilter;
4002 btv->opt_lumafilter = lumafilter;
4003 btv->opt_automute = automute;
4004 btv->opt_chroma_agc = chroma_agc;
4005 btv->opt_adc_crush = adc_crush;
4006 btv->opt_vcr_hack = vcr_hack;
4007 btv->opt_whitecrush_upper = whitecrush_upper;
4008 btv->opt_whitecrush_lower = whitecrush_lower;
4009 btv->opt_uv_ratio = uv_ratio;
4010 btv->opt_full_luma_range = full_luma_range;
4011 btv->opt_coring = coring;
4013 /* fill struct bttv with some useful defaults */
4014 btv->init.btv = btv;
4015 btv->init.ov.w.width = 320;
4016 btv->init.ov.w.height = 240;
4017 btv->init.fmt = format_by_palette(VIDEO_PALETTE_RGB24);
4018 btv->init.width = 320;
4019 btv->init.height = 240;
4020 btv->init.lines = 16;
4021 btv->input = 0;
4023 /* initialize hardware */
4024 if (bttv_gpio)
4025 bttv_gpio_tracking(btv,"pre-init");
4027 bttv_risc_init_main(btv);
4028 init_bt848(btv);
4030 /* gpio */
4031 btwrite(0x00, BT848_GPIO_REG_INP);
4032 btwrite(0x00, BT848_GPIO_OUT_EN);
4033 if (bttv_verbose)
4034 bttv_gpio_tracking(btv,"init");
4036 /* needs to be done before i2c is registered */
4037 bttv_init_card1(btv);
4039 /* register i2c + gpio */
4040 init_bttv_i2c(btv);
4042 /* some card-specific stuff (needs working i2c) */
4043 bttv_init_card2(btv);
4044 init_irqreg(btv);
4046 /* register video4linux + input */
4047 if (!bttv_tvcards[btv->c.type].no_video) {
4048 bttv_register_video(btv);
4049 bt848_bright(btv,32768);
4050 bt848_contrast(btv,32768);
4051 bt848_hue(btv,32768);
4052 bt848_sat(btv,32768);
4053 audio_mux(btv,AUDIO_MUTE);
4054 set_input(btv,0);
4057 /* add subdevices */
4058 if (bttv_tvcards[btv->c.type].has_dvb)
4059 bttv_sub_add_device(&btv->c, "dvb");
4061 bttv_input_init(btv);
4063 /* everything is fine */
4064 bttv_num++;
4065 return 0;
4067 fail2:
4068 free_irq(btv->c.pci->irq,btv);
4070 fail1:
4071 if (btv->bt848_mmio)
4072 iounmap(btv->bt848_mmio);
4073 release_mem_region(pci_resource_start(btv->c.pci,0),
4074 pci_resource_len(btv->c.pci,0));
4075 pci_set_drvdata(dev,NULL);
4076 return result;
4079 static void __devexit bttv_remove(struct pci_dev *pci_dev)
4081 struct bttv *btv = pci_get_drvdata(pci_dev);
4083 if (bttv_verbose)
4084 printk("bttv%d: unloading\n",btv->c.nr);
4086 /* shutdown everything (DMA+IRQs) */
4087 btand(~15, BT848_GPIO_DMA_CTL);
4088 btwrite(0, BT848_INT_MASK);
4089 btwrite(~0x0, BT848_INT_STAT);
4090 btwrite(0x0, BT848_GPIO_OUT_EN);
4091 if (bttv_gpio)
4092 bttv_gpio_tracking(btv,"cleanup");
4094 /* tell gpio modules we are leaving ... */
4095 btv->shutdown=1;
4096 wake_up(&btv->gpioq);
4097 bttv_input_fini(btv);
4098 bttv_sub_del_devices(&btv->c);
4100 /* unregister i2c_bus + input */
4101 fini_bttv_i2c(btv);
4103 /* unregister video4linux */
4104 bttv_unregister_video(btv);
4106 /* free allocated memory */
4107 btcx_riscmem_free(btv->c.pci,&btv->main);
4109 /* free ressources */
4110 free_irq(btv->c.pci->irq,btv);
4111 iounmap(btv->bt848_mmio);
4112 release_mem_region(pci_resource_start(btv->c.pci,0),
4113 pci_resource_len(btv->c.pci,0));
4115 pci_set_drvdata(pci_dev, NULL);
4116 return;
4119 static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4121 struct bttv *btv = pci_get_drvdata(pci_dev);
4122 struct bttv_buffer_set idle;
4123 unsigned long flags;
4125 dprintk("bttv%d: suspend %d\n", btv->c.nr, state.event);
4127 /* stop dma + irqs */
4128 spin_lock_irqsave(&btv->s_lock,flags);
4129 memset(&idle, 0, sizeof(idle));
4130 btv->state.video = btv->curr;
4131 btv->state.vbi = btv->cvbi;
4132 btv->state.loop_irq = btv->loop_irq;
4133 btv->curr = idle;
4134 btv->loop_irq = 0;
4135 bttv_buffer_activate_video(btv, &idle);
4136 bttv_buffer_activate_vbi(btv, NULL);
4137 bttv_set_dma(btv, 0);
4138 btwrite(0, BT848_INT_MASK);
4139 spin_unlock_irqrestore(&btv->s_lock,flags);
4141 /* save bt878 state */
4142 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4143 btv->state.gpio_data = gpio_read();
4145 /* save pci state */
4146 pci_save_state(pci_dev);
4147 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4148 pci_disable_device(pci_dev);
4149 btv->state.disabled = 1;
4151 return 0;
4154 static int bttv_resume(struct pci_dev *pci_dev)
4156 struct bttv *btv = pci_get_drvdata(pci_dev);
4157 unsigned long flags;
4158 int err;
4160 dprintk("bttv%d: resume\n", btv->c.nr);
4162 /* restore pci state */
4163 if (btv->state.disabled) {
4164 err=pci_enable_device(pci_dev);
4165 if (err) {
4166 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4167 btv->c.nr);
4168 return err;
4170 btv->state.disabled = 0;
4172 err=pci_set_power_state(pci_dev, PCI_D0);
4173 if (err) {
4174 pci_disable_device(pci_dev);
4175 printk(KERN_WARNING "bttv%d: Can't enable device.\n",
4176 btv->c.nr);
4177 btv->state.disabled = 1;
4178 return err;
4181 pci_restore_state(pci_dev);
4183 /* restore bt878 state */
4184 bttv_reinit_bt848(btv);
4185 gpio_inout(0xffffff, btv->state.gpio_enable);
4186 gpio_write(btv->state.gpio_data);
4188 /* restart dma */
4189 spin_lock_irqsave(&btv->s_lock,flags);
4190 btv->curr = btv->state.video;
4191 btv->cvbi = btv->state.vbi;
4192 btv->loop_irq = btv->state.loop_irq;
4193 bttv_buffer_activate_video(btv, &btv->curr);
4194 bttv_buffer_activate_vbi(btv, btv->cvbi);
4195 bttv_set_dma(btv, 0);
4196 spin_unlock_irqrestore(&btv->s_lock,flags);
4197 return 0;
4200 static struct pci_device_id bttv_pci_tbl[] = {
4201 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848,
4202 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4203 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849,
4204 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4205 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878,
4206 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4207 {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879,
4208 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
4209 {0,}
4212 MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4214 static struct pci_driver bttv_pci_driver = {
4215 .name = "bttv",
4216 .id_table = bttv_pci_tbl,
4217 .probe = bttv_probe,
4218 .remove = __devexit_p(bttv_remove),
4219 .suspend = bttv_suspend,
4220 .resume = bttv_resume,
4223 static int bttv_init_module(void)
4225 bttv_num = 0;
4227 printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
4228 (BTTV_VERSION_CODE >> 16) & 0xff,
4229 (BTTV_VERSION_CODE >> 8) & 0xff,
4230 BTTV_VERSION_CODE & 0xff);
4231 #ifdef SNAPSHOT
4232 printk(KERN_INFO "bttv: snapshot date %04d-%02d-%02d\n",
4233 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
4234 #endif
4235 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4236 gbuffers = 2;
4237 if (gbufsize < 0 || gbufsize > BTTV_MAX_FBUF)
4238 gbufsize = BTTV_MAX_FBUF;
4239 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4240 if (bttv_verbose)
4241 printk(KERN_INFO "bttv: using %d buffers with %dk (%d pages) each for capture\n",
4242 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4244 bttv_check_chipset();
4246 bus_register(&bttv_sub_bus_type);
4247 return pci_register_driver(&bttv_pci_driver);
4250 static void bttv_cleanup_module(void)
4252 pci_unregister_driver(&bttv_pci_driver);
4253 bus_unregister(&bttv_sub_bus_type);
4254 return;
4257 module_init(bttv_init_module);
4258 module_exit(bttv_cleanup_module);
4261 * Local variables:
4262 * c-basic-offset: 8
4263 * End: