1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
38
39#include <linux/init.h>
40#include <linux/module.h>
41#include <linux/delay.h>
42#include <linux/slab.h>
43#include <linux/errno.h>
44#include <linux/fs.h>
45#include <linux/kernel.h>
46#include <linux/sched.h>
47#include <linux/interrupt.h>
48#include <linux/kdev_t.h>
49#include "bttvp.h"
50#include <media/v4l2-common.h>
51#include <media/v4l2-ioctl.h>
52#include <media/v4l2-event.h>
53#include <media/tvaudio.h>
54#include <media/msp3400.h>
55
56#include <linux/dma-mapping.h>
57
58#include <asm/io.h>
59#include <asm/byteorder.h>
60
61#include <media/saa6588.h>
62
63#define BTTV_VERSION "0.9.19"
64
65unsigned int bttv_num;
66struct bttv *bttvs[BTTV_MAX];
67
68unsigned int bttv_debug;
69unsigned int bttv_verbose = 1;
70unsigned int bttv_gpio;
71
72
73#ifdef __BIG_ENDIAN
74static unsigned int bigendian=1;
75#else
76static unsigned int bigendian;
77#endif
78static unsigned int radio[BTTV_MAX];
79static unsigned int irq_debug;
80static unsigned int gbuffers = 8;
81static unsigned int gbufsize = 0x208000;
82static unsigned int reset_crop = 1;
83
84static int video_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
85static int radio_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
86static int vbi_nr[BTTV_MAX] = { [0 ... (BTTV_MAX-1)] = -1 };
87static int debug_latency;
88static int disable_ir;
89
90static unsigned int fdsr;
91
92
93static unsigned int combfilter;
94static unsigned int lumafilter;
95static unsigned int automute = 1;
96static unsigned int chroma_agc;
97static unsigned int agc_crush = 1;
98static unsigned int whitecrush_upper = 0xCF;
99static unsigned int whitecrush_lower = 0x7F;
100static unsigned int vcr_hack;
101static unsigned int irq_iswitch;
102static unsigned int uv_ratio = 50;
103static unsigned int full_luma_range;
104static unsigned int coring;
105
106
107static unsigned int v4l2 = 1;
108
109
110module_param(bttv_verbose, int, 0644);
111module_param(bttv_gpio, int, 0644);
112module_param(bttv_debug, int, 0644);
113module_param(irq_debug, int, 0644);
114module_param(debug_latency, int, 0644);
115module_param(disable_ir, int, 0444);
116
117module_param(fdsr, int, 0444);
118module_param(gbuffers, int, 0444);
119module_param(gbufsize, int, 0444);
120module_param(reset_crop, int, 0444);
121
122module_param(v4l2, int, 0644);
123module_param(bigendian, int, 0644);
124module_param(irq_iswitch, int, 0644);
125module_param(combfilter, int, 0444);
126module_param(lumafilter, int, 0444);
127module_param(automute, int, 0444);
128module_param(chroma_agc, int, 0444);
129module_param(agc_crush, int, 0444);
130module_param(whitecrush_upper, int, 0444);
131module_param(whitecrush_lower, int, 0444);
132module_param(vcr_hack, int, 0444);
133module_param(uv_ratio, int, 0444);
134module_param(full_luma_range, int, 0444);
135module_param(coring, int, 0444);
136
137module_param_array(radio, int, NULL, 0444);
138module_param_array(video_nr, int, NULL, 0444);
139module_param_array(radio_nr, int, NULL, 0444);
140module_param_array(vbi_nr, int, NULL, 0444);
141
142MODULE_PARM_DESC(radio, "The TV card supports radio, default is 0 (no)");
143MODULE_PARM_DESC(bigendian, "byte order of the framebuffer, default is native endian");
144MODULE_PARM_DESC(bttv_verbose, "verbose startup messages, default is 1 (yes)");
145MODULE_PARM_DESC(bttv_gpio, "log gpio changes, default is 0 (no)");
146MODULE_PARM_DESC(bttv_debug, "debug messages, default is 0 (no)");
147MODULE_PARM_DESC(irq_debug, "irq handler debug messages, default is 0 (no)");
148MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
149MODULE_PARM_DESC(gbuffers, "number of capture buffers. range 2-32, default 8");
150MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 0x208000");
151MODULE_PARM_DESC(reset_crop, "reset cropping parameters at open(), default "
152 "is 1 (yes) for compatibility with older applications");
153MODULE_PARM_DESC(automute, "mute audio on bad/missing video signal, default is 1 (yes)");
154MODULE_PARM_DESC(chroma_agc, "enables the AGC of chroma signal, default is 0 (no)");
155MODULE_PARM_DESC(agc_crush, "enables the luminance AGC crush, default is 1 (yes)");
156MODULE_PARM_DESC(whitecrush_upper, "sets the white crush upper value, default is 207");
157MODULE_PARM_DESC(whitecrush_lower, "sets the white crush lower value, default is 127");
158MODULE_PARM_DESC(vcr_hack, "enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
159MODULE_PARM_DESC(irq_iswitch, "switch inputs in irq handler");
160MODULE_PARM_DESC(uv_ratio, "ratio between u and v gains, default is 50");
161MODULE_PARM_DESC(full_luma_range, "use the full luma range, default is 0 (no)");
162MODULE_PARM_DESC(coring, "set the luma coring level, default is 0 (no)");
163MODULE_PARM_DESC(video_nr, "video device numbers");
164MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
165MODULE_PARM_DESC(radio_nr, "radio device numbers");
166
167MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
168MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
169MODULE_LICENSE("GPL");
170MODULE_VERSION(BTTV_VERSION);
171
172#define V4L2_CID_PRIVATE_COMBFILTER (V4L2_CID_USER_BTTV_BASE + 0)
173#define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_USER_BTTV_BASE + 1)
174#define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_USER_BTTV_BASE + 2)
175#define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_USER_BTTV_BASE + 3)
176#define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_USER_BTTV_BASE + 4)
177#define V4L2_CID_PRIVATE_WHITECRUSH_LOWER (V4L2_CID_USER_BTTV_BASE + 5)
178#define V4L2_CID_PRIVATE_WHITECRUSH_UPPER (V4L2_CID_USER_BTTV_BASE + 6)
179#define V4L2_CID_PRIVATE_UV_RATIO (V4L2_CID_USER_BTTV_BASE + 7)
180#define V4L2_CID_PRIVATE_FULL_LUMA_RANGE (V4L2_CID_USER_BTTV_BASE + 8)
181#define V4L2_CID_PRIVATE_CORING (V4L2_CID_USER_BTTV_BASE + 9)
182
183
184
185
186static ssize_t show_card(struct device *cd,
187 struct device_attribute *attr, char *buf)
188{
189 struct video_device *vfd = container_of(cd, struct video_device, dev);
190 struct bttv *btv = video_get_drvdata(vfd);
191 return sprintf(buf, "%d\n", btv ? btv->c.type : UNSET);
192}
193static DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
194
195
196
197#if defined(CONFIG_MODULES) && defined(MODULE)
198static void request_module_async(struct work_struct *work)
199{
200 request_module("dvb-bt8xx");
201}
202
203static void request_modules(struct bttv *dev)
204{
205 INIT_WORK(&dev->request_module_wk, request_module_async);
206 schedule_work(&dev->request_module_wk);
207}
208
209static void flush_request_modules(struct bttv *dev)
210{
211 flush_work(&dev->request_module_wk);
212}
213#else
214#define request_modules(dev)
215#define flush_request_modules(dev) do {} while(0)
216#endif
217
218
219
220
221
222
223static u8 SRAM_Table[][60] =
224{
225
226 {
227 45,
228 0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
229 0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
230 0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
231 0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
232 0x37,0x00,0xAF,0x21,0x00
233 },
234
235 {
236 51,
237 0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
238 0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
239 0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
240 0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
241 0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
242 0x00,
243 },
244
245
246 {
247 0x2A,
248 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
249 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
250 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
251 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
252 0x20, 0x00
253 }
254};
255
256
257
258
259
260
261
262
263
264
265
266
267
268#define CROPCAP(minhdelayx1, hdelayx1, swidth, totalwidth, sqwidth, \
269 vdelay, sheight, extraheight, videostart0) \
270 .cropcap.bounds.left = minhdelayx1, \
271 \
272 \
273 .cropcap.bounds.top = (videostart0) * 2 - (vdelay) + MIN_VDELAY, \
274 \
275 .cropcap.bounds.width = (totalwidth) - (minhdelayx1) - 4, \
276 .cropcap.bounds.height = (sheight) + (extraheight) + (vdelay) - \
277 MIN_VDELAY, \
278 .cropcap.defrect.left = hdelayx1, \
279 .cropcap.defrect.top = (videostart0) * 2, \
280 .cropcap.defrect.width = swidth, \
281 .cropcap.defrect.height = sheight, \
282 .cropcap.pixelaspect.numerator = totalwidth, \
283 .cropcap.pixelaspect.denominator = sqwidth,
284
285const struct bttv_tvnorm bttv_tvnorms[] = {
286
287
288
289 {
290 .v4l2_id = V4L2_STD_PAL,
291 .name = "PAL",
292 .Fsc = 35468950,
293 .swidth = 924,
294 .sheight = 576,
295 .totalwidth = 1135,
296 .adelay = 0x7f,
297 .bdelay = 0x72,
298 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
299 .scaledtwidth = 1135,
300 .hdelayx1 = 186,
301 .hactivex1 = 924,
302 .vdelay = 0x20,
303 .vbipack = 255,
304 .sram = 0,
305
306
307
308 .vbistart = { 7, 320 },
309 CROPCAP( 68,
310 186,
311
312
313
314 924,
315 1135,
316 944,
317 0x20,
318 576,
319
320
321 2,
322 23)
323 },{
324 .v4l2_id = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
325 .name = "NTSC",
326 .Fsc = 28636363,
327 .swidth = 768,
328 .sheight = 480,
329 .totalwidth = 910,
330 .adelay = 0x68,
331 .bdelay = 0x5d,
332 .iform = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
333 .scaledtwidth = 910,
334 .hdelayx1 = 128,
335 .hactivex1 = 910,
336 .vdelay = 0x1a,
337 .vbipack = 144,
338 .sram = 1,
339 .vbistart = { 10, 273 },
340 CROPCAP( 68,
341 128,
342
343 768,
344 910,
345 780,
346 0x1a,
347 480,
348 0,
349 23)
350 },{
351 .v4l2_id = V4L2_STD_SECAM,
352 .name = "SECAM",
353 .Fsc = 35468950,
354 .swidth = 924,
355 .sheight = 576,
356 .totalwidth = 1135,
357 .adelay = 0x7f,
358 .bdelay = 0xb0,
359 .iform = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
360 .scaledtwidth = 1135,
361 .hdelayx1 = 186,
362 .hactivex1 = 922,
363 .vdelay = 0x20,
364 .vbipack = 255,
365 .sram = 0,
366 .vbistart = { 7, 320 },
367 CROPCAP( 68,
368 186,
369 924,
370 1135,
371 944,
372 0x20,
373 576,
374 0,
375 23)
376 },{
377 .v4l2_id = V4L2_STD_PAL_Nc,
378 .name = "PAL-Nc",
379 .Fsc = 28636363,
380 .swidth = 640,
381 .sheight = 576,
382 .totalwidth = 910,
383 .adelay = 0x68,
384 .bdelay = 0x5d,
385 .iform = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
386 .scaledtwidth = 780,
387 .hdelayx1 = 130,
388 .hactivex1 = 734,
389 .vdelay = 0x1a,
390 .vbipack = 144,
391 .sram = -1,
392 .vbistart = { 7, 320 },
393 CROPCAP( 68,
394 130,
395 (640 * 910 + 780 / 2) / 780,
396 910,
397 780,
398 0x1a,
399 576,
400 0,
401 23)
402 },{
403 .v4l2_id = V4L2_STD_PAL_M,
404 .name = "PAL-M",
405 .Fsc = 28636363,
406 .swidth = 640,
407 .sheight = 480,
408 .totalwidth = 910,
409 .adelay = 0x68,
410 .bdelay = 0x5d,
411 .iform = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
412 .scaledtwidth = 780,
413 .hdelayx1 = 135,
414 .hactivex1 = 754,
415 .vdelay = 0x1a,
416 .vbipack = 144,
417 .sram = -1,
418 .vbistart = { 10, 273 },
419 CROPCAP( 68,
420 135,
421 (640 * 910 + 780 / 2) / 780,
422 910,
423 780,
424 0x1a,
425 480,
426 0,
427 23)
428 },{
429 .v4l2_id = V4L2_STD_PAL_N,
430 .name = "PAL-N",
431 .Fsc = 35468950,
432 .swidth = 768,
433 .sheight = 576,
434 .totalwidth = 1135,
435 .adelay = 0x7f,
436 .bdelay = 0x72,
437 .iform = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
438 .scaledtwidth = 944,
439 .hdelayx1 = 186,
440 .hactivex1 = 922,
441 .vdelay = 0x20,
442 .vbipack = 144,
443 .sram = -1,
444 .vbistart = { 7, 320 },
445 CROPCAP( 68,
446 186,
447 (768 * 1135 + 944 / 2) / 944,
448 1135,
449 944,
450 0x20,
451 576,
452 0,
453 23)
454 },{
455 .v4l2_id = V4L2_STD_NTSC_M_JP,
456 .name = "NTSC-JP",
457 .Fsc = 28636363,
458 .swidth = 640,
459 .sheight = 480,
460 .totalwidth = 910,
461 .adelay = 0x68,
462 .bdelay = 0x5d,
463 .iform = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
464 .scaledtwidth = 780,
465 .hdelayx1 = 135,
466 .hactivex1 = 754,
467 .vdelay = 0x16,
468 .vbipack = 144,
469 .sram = -1,
470 .vbistart = { 10, 273 },
471 CROPCAP( 68,
472 135,
473 (640 * 910 + 780 / 2) / 780,
474 910,
475 780,
476 0x16,
477 480,
478 0,
479 23)
480 },{
481
482
483
484 .v4l2_id = V4L2_STD_PAL_60,
485 .name = "PAL-60",
486 .Fsc = 35468950,
487 .swidth = 924,
488 .sheight = 480,
489 .totalwidth = 1135,
490 .adelay = 0x7f,
491 .bdelay = 0x72,
492 .iform = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
493 .scaledtwidth = 1135,
494 .hdelayx1 = 186,
495 .hactivex1 = 924,
496 .vdelay = 0x1a,
497 .vbipack = 255,
498 .vtotal = 524,
499 .sram = -1,
500 .vbistart = { 10, 273 },
501 CROPCAP( 68,
502 186,
503 924,
504 1135,
505 944,
506 0x1a,
507 480,
508 0,
509 23)
510 }
511};
512static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
513
514
515
516
517static const struct bttv_format formats[] = {
518 {
519 .name = "8 bpp, gray",
520 .fourcc = V4L2_PIX_FMT_GREY,
521 .btformat = BT848_COLOR_FMT_Y8,
522 .depth = 8,
523 .flags = FORMAT_FLAGS_PACKED,
524 },{
525 .name = "8 bpp, dithered color",
526 .fourcc = V4L2_PIX_FMT_HI240,
527 .btformat = BT848_COLOR_FMT_RGB8,
528 .depth = 8,
529 .flags = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
530 },{
531 .name = "15 bpp RGB, le",
532 .fourcc = V4L2_PIX_FMT_RGB555,
533 .btformat = BT848_COLOR_FMT_RGB15,
534 .depth = 16,
535 .flags = FORMAT_FLAGS_PACKED,
536 },{
537 .name = "15 bpp RGB, be",
538 .fourcc = V4L2_PIX_FMT_RGB555X,
539 .btformat = BT848_COLOR_FMT_RGB15,
540 .btswap = 0x03,
541 .depth = 16,
542 .flags = FORMAT_FLAGS_PACKED,
543 },{
544 .name = "16 bpp RGB, le",
545 .fourcc = V4L2_PIX_FMT_RGB565,
546 .btformat = BT848_COLOR_FMT_RGB16,
547 .depth = 16,
548 .flags = FORMAT_FLAGS_PACKED,
549 },{
550 .name = "16 bpp RGB, be",
551 .fourcc = V4L2_PIX_FMT_RGB565X,
552 .btformat = BT848_COLOR_FMT_RGB16,
553 .btswap = 0x03,
554 .depth = 16,
555 .flags = FORMAT_FLAGS_PACKED,
556 },{
557 .name = "24 bpp RGB, le",
558 .fourcc = V4L2_PIX_FMT_BGR24,
559 .btformat = BT848_COLOR_FMT_RGB24,
560 .depth = 24,
561 .flags = FORMAT_FLAGS_PACKED,
562 },{
563 .name = "32 bpp RGB, le",
564 .fourcc = V4L2_PIX_FMT_BGR32,
565 .btformat = BT848_COLOR_FMT_RGB32,
566 .depth = 32,
567 .flags = FORMAT_FLAGS_PACKED,
568 },{
569 .name = "32 bpp RGB, be",
570 .fourcc = V4L2_PIX_FMT_RGB32,
571 .btformat = BT848_COLOR_FMT_RGB32,
572 .btswap = 0x0f,
573 .depth = 32,
574 .flags = FORMAT_FLAGS_PACKED,
575 },{
576 .name = "4:2:2, packed, YUYV",
577 .fourcc = V4L2_PIX_FMT_YUYV,
578 .btformat = BT848_COLOR_FMT_YUY2,
579 .depth = 16,
580 .flags = FORMAT_FLAGS_PACKED,
581 },{
582 .name = "4:2:2, packed, UYVY",
583 .fourcc = V4L2_PIX_FMT_UYVY,
584 .btformat = BT848_COLOR_FMT_YUY2,
585 .btswap = 0x03,
586 .depth = 16,
587 .flags = FORMAT_FLAGS_PACKED,
588 },{
589 .name = "4:2:2, planar, Y-Cb-Cr",
590 .fourcc = V4L2_PIX_FMT_YUV422P,
591 .btformat = BT848_COLOR_FMT_YCrCb422,
592 .depth = 16,
593 .flags = FORMAT_FLAGS_PLANAR,
594 .hshift = 1,
595 .vshift = 0,
596 },{
597 .name = "4:2:0, planar, Y-Cb-Cr",
598 .fourcc = V4L2_PIX_FMT_YUV420,
599 .btformat = BT848_COLOR_FMT_YCrCb422,
600 .depth = 12,
601 .flags = FORMAT_FLAGS_PLANAR,
602 .hshift = 1,
603 .vshift = 1,
604 },{
605 .name = "4:2:0, planar, Y-Cr-Cb",
606 .fourcc = V4L2_PIX_FMT_YVU420,
607 .btformat = BT848_COLOR_FMT_YCrCb422,
608 .depth = 12,
609 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
610 .hshift = 1,
611 .vshift = 1,
612 },{
613 .name = "4:1:1, planar, Y-Cb-Cr",
614 .fourcc = V4L2_PIX_FMT_YUV411P,
615 .btformat = BT848_COLOR_FMT_YCrCb411,
616 .depth = 12,
617 .flags = FORMAT_FLAGS_PLANAR,
618 .hshift = 2,
619 .vshift = 0,
620 },{
621 .name = "4:1:0, planar, Y-Cb-Cr",
622 .fourcc = V4L2_PIX_FMT_YUV410,
623 .btformat = BT848_COLOR_FMT_YCrCb411,
624 .depth = 9,
625 .flags = FORMAT_FLAGS_PLANAR,
626 .hshift = 2,
627 .vshift = 2,
628 },{
629 .name = "4:1:0, planar, Y-Cr-Cb",
630 .fourcc = V4L2_PIX_FMT_YVU410,
631 .btformat = BT848_COLOR_FMT_YCrCb411,
632 .depth = 9,
633 .flags = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
634 .hshift = 2,
635 .vshift = 2,
636 },{
637 .name = "raw scanlines",
638 .fourcc = -1,
639 .btformat = BT848_COLOR_FMT_RAW,
640 .depth = 8,
641 .flags = FORMAT_FLAGS_RAW,
642 }
643};
644static const unsigned int FORMATS = ARRAY_SIZE(formats);
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677#define VBI_RESOURCES (RESOURCE_VBI)
678#define VIDEO_RESOURCES (RESOURCE_VIDEO_READ | \
679 RESOURCE_VIDEO_STREAM | \
680 RESOURCE_OVERLAY)
681
682static
683int check_alloc_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bit)
684{
685 int xbits;
686
687 if (fh->resources & bit)
688
689 return 1;
690
691 xbits = bit;
692 if (bit & (RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM))
693 xbits |= RESOURCE_VIDEO_READ | RESOURCE_VIDEO_STREAM;
694
695
696 if (btv->resources & xbits) {
697
698 goto fail;
699 }
700
701 if ((bit & VIDEO_RESOURCES)
702 && 0 == (btv->resources & VIDEO_RESOURCES)) {
703
704 __s32 top = btv->crop[!!fh->do_crop].rect.top;
705
706 if (btv->vbi_end > top)
707 goto fail;
708
709
710
711 btv->crop_start = top;
712 } else if (bit & VBI_RESOURCES) {
713 __s32 end = fh->vbi_fmt.end;
714
715 if (end > btv->crop_start)
716 goto fail;
717
718
719 btv->vbi_end = end;
720 }
721
722
723 fh->resources |= bit;
724 btv->resources |= bit;
725 return 1;
726
727 fail:
728 return 0;
729}
730
731static
732int check_btres(struct bttv_fh *fh, int bit)
733{
734 return (fh->resources & bit);
735}
736
737static
738int locked_btres(struct bttv *btv, int bit)
739{
740 return (btv->resources & bit);
741}
742
743
744static void
745disclaim_vbi_lines(struct bttv *btv)
746{
747 btv->vbi_end = 0;
748}
749
750
751static void
752disclaim_video_lines(struct bttv *btv)
753{
754 const struct bttv_tvnorm *tvnorm;
755 u8 crop;
756
757 tvnorm = &bttv_tvnorms[btv->tvnorm];
758 btv->crop_start = tvnorm->cropcap.bounds.top
759 + tvnorm->cropcap.bounds.height;
760
761
762
763
764
765 crop = btread(BT848_E_CROP) | 0xc0;
766 btwrite(crop, BT848_E_CROP);
767 btwrite(0xfe, BT848_E_VDELAY_LO);
768 btwrite(crop, BT848_O_CROP);
769 btwrite(0xfe, BT848_O_VDELAY_LO);
770}
771
772static
773void free_btres_lock(struct bttv *btv, struct bttv_fh *fh, int bits)
774{
775 if ((fh->resources & bits) != bits) {
776
777 pr_err("BUG! (btres)\n");
778 }
779 fh->resources &= ~bits;
780 btv->resources &= ~bits;
781
782 bits = btv->resources;
783
784 if (0 == (bits & VIDEO_RESOURCES))
785 disclaim_video_lines(btv);
786
787 if (0 == (bits & VBI_RESOURCES))
788 disclaim_vbi_lines(btv);
789}
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
805{
806 unsigned char fl, fh, fi;
807
808
809 fin/=4;
810 fout/=4;
811
812 fout*=12;
813 fi=fout/fin;
814
815 fout=(fout%fin)*256;
816 fh=fout/fin;
817
818 fout=(fout%fin)*256;
819 fl=fout/fin;
820
821 btwrite(fl, BT848_PLL_F_LO);
822 btwrite(fh, BT848_PLL_F_HI);
823 btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
824}
825
826static void set_pll(struct bttv *btv)
827{
828 int i;
829
830 if (!btv->pll.pll_crystal)
831 return;
832
833 if (btv->pll.pll_ofreq == btv->pll.pll_current) {
834 dprintk("%d: PLL: no change required\n", btv->c.nr);
835 return;
836 }
837
838 if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
839
840 if (btv->pll.pll_current == 0)
841 return;
842 if (bttv_verbose)
843 pr_info("%d: PLL can sleep, using XTAL (%d)\n",
844 btv->c.nr, btv->pll.pll_ifreq);
845 btwrite(0x00,BT848_TGCTRL);
846 btwrite(0x00,BT848_PLL_XCI);
847 btv->pll.pll_current = 0;
848 return;
849 }
850
851 if (bttv_verbose)
852 pr_info("%d: Setting PLL: %d => %d (needs up to 100ms)\n",
853 btv->c.nr,
854 btv->pll.pll_ifreq, btv->pll.pll_ofreq);
855 set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
856
857 for (i=0; i<10; i++) {
858
859 msleep(10);
860
861 if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
862 btwrite(0,BT848_DSTATUS);
863 } else {
864 btwrite(0x08,BT848_TGCTRL);
865 btv->pll.pll_current = btv->pll.pll_ofreq;
866 if (bttv_verbose)
867 pr_info("PLL set ok\n");
868 return;
869 }
870 }
871 btv->pll.pll_current = -1;
872 if (bttv_verbose)
873 pr_info("Setting PLL failed\n");
874 return;
875}
876
877
878static void bt848A_set_timing(struct bttv *btv)
879{
880 int i, len;
881 int table_idx = bttv_tvnorms[btv->tvnorm].sram;
882 int fsc = bttv_tvnorms[btv->tvnorm].Fsc;
883
884 if (btv->input == btv->dig) {
885 dprintk("%d: load digital timing table (table_idx=%d)\n",
886 btv->c.nr,table_idx);
887
888
889 btwrite(0x00, BT848_TGCTRL);
890 btwrite(0x02, BT848_TGCTRL);
891 btwrite(0x00, BT848_TGCTRL);
892
893 len=SRAM_Table[table_idx][0];
894 for(i = 1; i <= len; i++)
895 btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
896 btv->pll.pll_ofreq = 27000000;
897
898 set_pll(btv);
899 btwrite(0x11, BT848_TGCTRL);
900 btwrite(0x41, BT848_DVSIF);
901 } else {
902 btv->pll.pll_ofreq = fsc;
903 set_pll(btv);
904 btwrite(0x0, BT848_DVSIF);
905 }
906}
907
908
909
910static void bt848_bright(struct bttv *btv, int bright)
911{
912 int value;
913
914
915 btv->bright = bright;
916
917
918 value = (bright >> 8) - 128;
919 btwrite(value & 0xff, BT848_BRIGHT);
920}
921
922static void bt848_hue(struct bttv *btv, int hue)
923{
924 int value;
925
926 btv->hue = hue;
927
928
929 value = (hue >> 8) - 128;
930 btwrite(value & 0xff, BT848_HUE);
931}
932
933static void bt848_contrast(struct bttv *btv, int cont)
934{
935 int value,hibit;
936
937 btv->contrast = cont;
938
939
940 value = (cont >> 7);
941 hibit = (value >> 6) & 4;
942 btwrite(value & 0xff, BT848_CONTRAST_LO);
943 btaor(hibit, ~4, BT848_E_CONTROL);
944 btaor(hibit, ~4, BT848_O_CONTROL);
945}
946
947static void bt848_sat(struct bttv *btv, int color)
948{
949 int val_u,val_v,hibits;
950
951 btv->saturation = color;
952
953
954 val_u = ((color * btv->opt_uv_ratio) / 50) >> 7;
955 val_v = (((color * (100 - btv->opt_uv_ratio) / 50) >>7)*180L)/254;
956 hibits = (val_u >> 7) & 2;
957 hibits |= (val_v >> 8) & 1;
958 btwrite(val_u & 0xff, BT848_SAT_U_LO);
959 btwrite(val_v & 0xff, BT848_SAT_V_LO);
960 btaor(hibits, ~3, BT848_E_CONTROL);
961 btaor(hibits, ~3, BT848_O_CONTROL);
962}
963
964
965
966static int
967video_mux(struct bttv *btv, unsigned int input)
968{
969 int mux,mask2;
970
971 if (input >= bttv_tvcards[btv->c.type].video_inputs)
972 return -EINVAL;
973
974
975 mask2 = bttv_tvcards[btv->c.type].gpiomask2;
976 if (mask2)
977 gpio_inout(mask2,mask2);
978
979 if (input == btv->svhs) {
980 btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
981 btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
982 } else {
983 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
984 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
985 }
986 mux = bttv_muxsel(btv, input);
987 btaor(mux<<5, ~(3<<5), BT848_IFORM);
988 dprintk("%d: video mux: input=%d mux=%d\n", btv->c.nr, input, mux);
989
990
991 if(bttv_tvcards[btv->c.type].muxsel_hook)
992 bttv_tvcards[btv->c.type].muxsel_hook (btv, input);
993 return 0;
994}
995
996static char *audio_modes[] = {
997 "audio: tuner", "audio: radio", "audio: extern",
998 "audio: intern", "audio: mute"
999};
1000
1001static void
1002audio_mux_gpio(struct bttv *btv, int input, int mute)
1003{
1004 int gpio_val, signal, mute_gpio;
1005
1006 gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
1007 bttv_tvcards[btv->c.type].gpiomask);
1008 signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
1009
1010
1011 mute_gpio = mute || (btv->opt_automute && (!signal || !btv->users)
1012 && !btv->has_radio_tuner);
1013
1014 if (mute_gpio)
1015 gpio_val = bttv_tvcards[btv->c.type].gpiomute;
1016 else
1017 gpio_val = bttv_tvcards[btv->c.type].gpiomux[input];
1018
1019 switch (btv->c.type) {
1020 case BTTV_BOARD_VOODOOTV_FM:
1021 case BTTV_BOARD_VOODOOTV_200:
1022 gpio_val = bttv_tda9880_setnorm(btv, gpio_val);
1023 break;
1024
1025 default:
1026 gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpio_val);
1027 }
1028
1029 if (bttv_gpio)
1030 bttv_gpio_tracking(btv, audio_modes[mute_gpio ? 4 : input]);
1031}
1032
1033static int
1034audio_mute(struct bttv *btv, int mute)
1035{
1036 struct v4l2_ctrl *ctrl;
1037
1038 audio_mux_gpio(btv, btv->audio_input, mute);
1039
1040 if (btv->sd_msp34xx) {
1041 ctrl = v4l2_ctrl_find(btv->sd_msp34xx->ctrl_handler, V4L2_CID_AUDIO_MUTE);
1042 if (ctrl)
1043 v4l2_ctrl_s_ctrl(ctrl, mute);
1044 }
1045 if (btv->sd_tvaudio) {
1046 ctrl = v4l2_ctrl_find(btv->sd_tvaudio->ctrl_handler, V4L2_CID_AUDIO_MUTE);
1047 if (ctrl)
1048 v4l2_ctrl_s_ctrl(ctrl, mute);
1049 }
1050 if (btv->sd_tda7432) {
1051 ctrl = v4l2_ctrl_find(btv->sd_tda7432->ctrl_handler, V4L2_CID_AUDIO_MUTE);
1052 if (ctrl)
1053 v4l2_ctrl_s_ctrl(ctrl, mute);
1054 }
1055 return 0;
1056}
1057
1058static int
1059audio_input(struct bttv *btv, int input)
1060{
1061 audio_mux_gpio(btv, input, btv->mute);
1062
1063 if (btv->sd_msp34xx) {
1064 u32 in;
1065
1066
1067
1068
1069
1070
1071 switch (input) {
1072 case TVAUDIO_INPUT_RADIO:
1073
1074 if (btv->radio_uses_msp_demodulator) {
1075 in = MSP_INPUT_DEFAULT;
1076 break;
1077 }
1078 in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1079 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1080 break;
1081 case TVAUDIO_INPUT_EXTERN:
1082 in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
1083 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1084 break;
1085 case TVAUDIO_INPUT_INTERN:
1086
1087
1088
1089
1090
1091 in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
1092 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
1093 break;
1094 case TVAUDIO_INPUT_TUNER:
1095 default:
1096
1097
1098
1099 if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
1100 in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
1101 MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
1102 else
1103 in = MSP_INPUT_DEFAULT;
1104 break;
1105 }
1106 v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing,
1107 in, MSP_OUTPUT_DEFAULT, 0);
1108 }
1109 if (btv->sd_tvaudio) {
1110 v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing,
1111 input, 0, 0);
1112 }
1113 return 0;
1114}
1115
1116static void
1117bttv_crop_calc_limits(struct bttv_crop *c)
1118{
1119
1120
1121
1122 if (1) {
1123
1124
1125 c->min_scaled_width = 48;
1126 c->min_scaled_height = 32;
1127 } else {
1128 c->min_scaled_width =
1129 (max_t(unsigned int, 48, c->rect.width >> 4) + 3) & ~3;
1130 c->min_scaled_height =
1131 max_t(unsigned int, 32, c->rect.height >> 4);
1132 }
1133
1134 c->max_scaled_width = c->rect.width & ~3;
1135 c->max_scaled_height = c->rect.height;
1136}
1137
1138static void
1139bttv_crop_reset(struct bttv_crop *c, unsigned int norm)
1140{
1141 c->rect = bttv_tvnorms[norm].cropcap.defrect;
1142 bttv_crop_calc_limits(c);
1143}
1144
1145
1146static int
1147set_tvnorm(struct bttv *btv, unsigned int norm)
1148{
1149 const struct bttv_tvnorm *tvnorm;
1150 v4l2_std_id id;
1151
1152 BUG_ON(norm >= BTTV_TVNORMS);
1153 BUG_ON(btv->tvnorm >= BTTV_TVNORMS);
1154
1155 tvnorm = &bttv_tvnorms[norm];
1156
1157 if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
1158 sizeof (tvnorm->cropcap))) {
1159 bttv_crop_reset(&btv->crop[0], norm);
1160 btv->crop[1] = btv->crop[0];
1161
1162 if (0 == (btv->resources & VIDEO_RESOURCES)) {
1163 btv->crop_start = tvnorm->cropcap.bounds.top
1164 + tvnorm->cropcap.bounds.height;
1165 }
1166 }
1167
1168 btv->tvnorm = norm;
1169
1170 btwrite(tvnorm->adelay, BT848_ADELAY);
1171 btwrite(tvnorm->bdelay, BT848_BDELAY);
1172 btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
1173 BT848_IFORM);
1174 btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
1175 btwrite(1, BT848_VBI_PACK_DEL);
1176 bt848A_set_timing(btv);
1177
1178 switch (btv->c.type) {
1179 case BTTV_BOARD_VOODOOTV_FM:
1180 case BTTV_BOARD_VOODOOTV_200:
1181 bttv_tda9880_setnorm(btv, gpio_read());
1182 break;
1183 }
1184 id = tvnorm->v4l2_id;
1185 bttv_call_all(btv, video, s_std, id);
1186
1187 return 0;
1188}
1189
1190
1191static void
1192set_input(struct bttv *btv, unsigned int input, unsigned int norm)
1193{
1194 unsigned long flags;
1195
1196 btv->input = input;
1197 if (irq_iswitch) {
1198 spin_lock_irqsave(&btv->s_lock,flags);
1199 if (btv->curr.frame_irq) {
1200
1201 btv->new_input = input;
1202 } else {
1203 video_mux(btv,input);
1204 }
1205 spin_unlock_irqrestore(&btv->s_lock,flags);
1206 } else {
1207 video_mux(btv,input);
1208 }
1209 btv->audio_input = (btv->tuner_type != TUNER_ABSENT && input == 0) ?
1210 TVAUDIO_INPUT_TUNER : TVAUDIO_INPUT_EXTERN;
1211 audio_input(btv, btv->audio_input);
1212 set_tvnorm(btv, norm);
1213}
1214
1215static void init_irqreg(struct bttv *btv)
1216{
1217
1218 btwrite(0xfffffUL, BT848_INT_STAT);
1219
1220 if (bttv_tvcards[btv->c.type].no_video) {
1221
1222 btwrite(BT848_INT_I2CDONE,
1223 BT848_INT_MASK);
1224 } else {
1225
1226 btwrite((btv->triton1) |
1227 (btv->gpioirq ? BT848_INT_GPINT : 0) |
1228 BT848_INT_SCERR |
1229 (fdsr ? BT848_INT_FDSR : 0) |
1230 BT848_INT_RISCI | BT848_INT_OCERR |
1231 BT848_INT_FMTCHG|BT848_INT_HLOCK|
1232 BT848_INT_I2CDONE,
1233 BT848_INT_MASK);
1234 }
1235}
1236
1237static void init_bt848(struct bttv *btv)
1238{
1239 if (bttv_tvcards[btv->c.type].no_video) {
1240
1241 init_irqreg(btv);
1242 return;
1243 }
1244
1245 btwrite(0x00, BT848_CAP_CTL);
1246 btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
1247 btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
1248
1249
1250
1251 btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
1252 BT848_GPIO_DMA_CTL_PLTP1_16|
1253 BT848_GPIO_DMA_CTL_PLTP23_16|
1254 BT848_GPIO_DMA_CTL_GPINTC|
1255 BT848_GPIO_DMA_CTL_GPINTI,
1256 BT848_GPIO_DMA_CTL);
1257
1258 btwrite(0x20, BT848_E_VSCALE_HI);
1259 btwrite(0x20, BT848_O_VSCALE_HI);
1260
1261 v4l2_ctrl_handler_setup(&btv->ctrl_handler);
1262
1263
1264 init_irqreg(btv);
1265}
1266
1267static void bttv_reinit_bt848(struct bttv *btv)
1268{
1269 unsigned long flags;
1270
1271 if (bttv_verbose)
1272 pr_info("%d: reset, reinitialize\n", btv->c.nr);
1273 spin_lock_irqsave(&btv->s_lock,flags);
1274 btv->errors=0;
1275 bttv_set_dma(btv,0);
1276 spin_unlock_irqrestore(&btv->s_lock,flags);
1277
1278 init_bt848(btv);
1279 btv->pll.pll_current = -1;
1280 set_input(btv, btv->input, btv->tvnorm);
1281}
1282
1283static int bttv_s_ctrl(struct v4l2_ctrl *c)
1284{
1285 struct bttv *btv = container_of(c->handler, struct bttv, ctrl_handler);
1286 int val;
1287
1288 switch (c->id) {
1289 case V4L2_CID_BRIGHTNESS:
1290 bt848_bright(btv, c->val);
1291 break;
1292 case V4L2_CID_HUE:
1293 bt848_hue(btv, c->val);
1294 break;
1295 case V4L2_CID_CONTRAST:
1296 bt848_contrast(btv, c->val);
1297 break;
1298 case V4L2_CID_SATURATION:
1299 bt848_sat(btv, c->val);
1300 break;
1301 case V4L2_CID_COLOR_KILLER:
1302 if (c->val) {
1303 btor(BT848_SCLOOP_CKILL, BT848_E_SCLOOP);
1304 btor(BT848_SCLOOP_CKILL, BT848_O_SCLOOP);
1305 } else {
1306 btand(~BT848_SCLOOP_CKILL, BT848_E_SCLOOP);
1307 btand(~BT848_SCLOOP_CKILL, BT848_O_SCLOOP);
1308 }
1309 break;
1310 case V4L2_CID_AUDIO_MUTE:
1311 audio_mute(btv, c->val);
1312 btv->mute = c->val;
1313 break;
1314 case V4L2_CID_AUDIO_VOLUME:
1315 btv->volume_gpio(btv, c->val);
1316 break;
1317
1318 case V4L2_CID_CHROMA_AGC:
1319 val = c->val ? BT848_SCLOOP_CAGC : 0;
1320 btwrite(val, BT848_E_SCLOOP);
1321 btwrite(val, BT848_O_SCLOOP);
1322 break;
1323 case V4L2_CID_PRIVATE_COMBFILTER:
1324 btv->opt_combfilter = c->val;
1325 break;
1326 case V4L2_CID_PRIVATE_LUMAFILTER:
1327 if (c->val) {
1328 btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1329 btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1330 } else {
1331 btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1332 btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
1333 }
1334 break;
1335 case V4L2_CID_PRIVATE_AUTOMUTE:
1336 btv->opt_automute = c->val;
1337 break;
1338 case V4L2_CID_PRIVATE_AGC_CRUSH:
1339 btwrite(BT848_ADC_RESERVED |
1340 (c->val ? BT848_ADC_CRUSH : 0),
1341 BT848_ADC);
1342 break;
1343 case V4L2_CID_PRIVATE_VCR_HACK:
1344 btv->opt_vcr_hack = c->val;
1345 break;
1346 case V4L2_CID_PRIVATE_WHITECRUSH_UPPER:
1347 btwrite(c->val, BT848_WC_UP);
1348 break;
1349 case V4L2_CID_PRIVATE_WHITECRUSH_LOWER:
1350 btwrite(c->val, BT848_WC_DOWN);
1351 break;
1352 case V4L2_CID_PRIVATE_UV_RATIO:
1353 btv->opt_uv_ratio = c->val;
1354 bt848_sat(btv, btv->saturation);
1355 break;
1356 case V4L2_CID_PRIVATE_FULL_LUMA_RANGE:
1357 btaor((c->val << 7), ~BT848_OFORM_RANGE, BT848_OFORM);
1358 break;
1359 case V4L2_CID_PRIVATE_CORING:
1360 btaor((c->val << 5), ~BT848_OFORM_CORE32, BT848_OFORM);
1361 break;
1362 default:
1363 return -EINVAL;
1364 }
1365 return 0;
1366}
1367
1368
1369
1370static const struct v4l2_ctrl_ops bttv_ctrl_ops = {
1371 .s_ctrl = bttv_s_ctrl,
1372};
1373
1374static struct v4l2_ctrl_config bttv_ctrl_combfilter = {
1375 .ops = &bttv_ctrl_ops,
1376 .id = V4L2_CID_PRIVATE_COMBFILTER,
1377 .name = "Comb Filter",
1378 .type = V4L2_CTRL_TYPE_BOOLEAN,
1379 .min = 0,
1380 .max = 1,
1381 .step = 1,
1382 .def = 1,
1383};
1384
1385static struct v4l2_ctrl_config bttv_ctrl_automute = {
1386 .ops = &bttv_ctrl_ops,
1387 .id = V4L2_CID_PRIVATE_AUTOMUTE,
1388 .name = "Auto Mute",
1389 .type = V4L2_CTRL_TYPE_BOOLEAN,
1390 .min = 0,
1391 .max = 1,
1392 .step = 1,
1393 .def = 1,
1394};
1395
1396static struct v4l2_ctrl_config bttv_ctrl_lumafilter = {
1397 .ops = &bttv_ctrl_ops,
1398 .id = V4L2_CID_PRIVATE_LUMAFILTER,
1399 .name = "Luma Decimation Filter",
1400 .type = V4L2_CTRL_TYPE_BOOLEAN,
1401 .min = 0,
1402 .max = 1,
1403 .step = 1,
1404 .def = 1,
1405};
1406
1407static struct v4l2_ctrl_config bttv_ctrl_agc_crush = {
1408 .ops = &bttv_ctrl_ops,
1409 .id = V4L2_CID_PRIVATE_AGC_CRUSH,
1410 .name = "AGC Crush",
1411 .type = V4L2_CTRL_TYPE_BOOLEAN,
1412 .min = 0,
1413 .max = 1,
1414 .step = 1,
1415 .def = 1,
1416};
1417
1418static struct v4l2_ctrl_config bttv_ctrl_vcr_hack = {
1419 .ops = &bttv_ctrl_ops,
1420 .id = V4L2_CID_PRIVATE_VCR_HACK,
1421 .name = "VCR Hack",
1422 .type = V4L2_CTRL_TYPE_BOOLEAN,
1423 .min = 0,
1424 .max = 1,
1425 .step = 1,
1426 .def = 1,
1427};
1428
1429static struct v4l2_ctrl_config bttv_ctrl_whitecrush_lower = {
1430 .ops = &bttv_ctrl_ops,
1431 .id = V4L2_CID_PRIVATE_WHITECRUSH_LOWER,
1432 .name = "Whitecrush Lower",
1433 .type = V4L2_CTRL_TYPE_INTEGER,
1434 .min = 0,
1435 .max = 255,
1436 .step = 1,
1437 .def = 0x7f,
1438};
1439
1440static struct v4l2_ctrl_config bttv_ctrl_whitecrush_upper = {
1441 .ops = &bttv_ctrl_ops,
1442 .id = V4L2_CID_PRIVATE_WHITECRUSH_UPPER,
1443 .name = "Whitecrush Upper",
1444 .type = V4L2_CTRL_TYPE_INTEGER,
1445 .min = 0,
1446 .max = 255,
1447 .step = 1,
1448 .def = 0xcf,
1449};
1450
1451static struct v4l2_ctrl_config bttv_ctrl_uv_ratio = {
1452 .ops = &bttv_ctrl_ops,
1453 .id = V4L2_CID_PRIVATE_UV_RATIO,
1454 .name = "UV Ratio",
1455 .type = V4L2_CTRL_TYPE_INTEGER,
1456 .min = 0,
1457 .max = 100,
1458 .step = 1,
1459 .def = 50,
1460};
1461
1462static struct v4l2_ctrl_config bttv_ctrl_full_luma = {
1463 .ops = &bttv_ctrl_ops,
1464 .id = V4L2_CID_PRIVATE_FULL_LUMA_RANGE,
1465 .name = "Full Luma Range",
1466 .type = V4L2_CTRL_TYPE_BOOLEAN,
1467 .min = 0,
1468 .max = 1,
1469 .step = 1,
1470};
1471
1472static struct v4l2_ctrl_config bttv_ctrl_coring = {
1473 .ops = &bttv_ctrl_ops,
1474 .id = V4L2_CID_PRIVATE_CORING,
1475 .name = "Coring",
1476 .type = V4L2_CTRL_TYPE_INTEGER,
1477 .min = 0,
1478 .max = 3,
1479 .step = 1,
1480};
1481
1482
1483
1484
1485void bttv_gpio_tracking(struct bttv *btv, char *comment)
1486{
1487 unsigned int outbits, data;
1488 outbits = btread(BT848_GPIO_OUT_EN);
1489 data = btread(BT848_GPIO_DATA);
1490 pr_debug("%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1491 btv->c.nr, outbits, data & outbits, data & ~outbits, comment);
1492}
1493
1494static void bttv_field_count(struct bttv *btv)
1495{
1496 int need_count = 0;
1497
1498 if (btv->users)
1499 need_count++;
1500
1501 if (need_count) {
1502
1503 btor(BT848_INT_VSYNC,BT848_INT_MASK);
1504 } else {
1505
1506 btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1507 btv->field_count = 0;
1508 }
1509}
1510
1511static const struct bttv_format*
1512format_by_fourcc(int fourcc)
1513{
1514 unsigned int i;
1515
1516 for (i = 0; i < FORMATS; i++) {
1517 if (-1 == formats[i].fourcc)
1518 continue;
1519 if (formats[i].fourcc == fourcc)
1520 return formats+i;
1521 }
1522 return NULL;
1523}
1524
1525
1526
1527
1528static int
1529bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1530 struct bttv_buffer *new)
1531{
1532 struct bttv_buffer *old;
1533 unsigned long flags;
1534
1535 dprintk("switch_overlay: enter [new=%p]\n", new);
1536 if (new)
1537 new->vb.state = VIDEOBUF_DONE;
1538 spin_lock_irqsave(&btv->s_lock,flags);
1539 old = btv->screen;
1540 btv->screen = new;
1541 btv->loop_irq |= 1;
1542 bttv_set_dma(btv, 0x03);
1543 spin_unlock_irqrestore(&btv->s_lock,flags);
1544 if (NULL != old) {
1545 dprintk("switch_overlay: old=%p state is %d\n",
1546 old, old->vb.state);
1547 bttv_dma_free(&fh->cap,btv, old);
1548 kfree(old);
1549 }
1550 if (NULL == new)
1551 free_btres_lock(btv,fh,RESOURCE_OVERLAY);
1552 dprintk("switch_overlay: done\n");
1553 return 0;
1554}
1555
1556
1557
1558
1559static int bttv_prepare_buffer(struct videobuf_queue *q,struct bttv *btv,
1560 struct bttv_buffer *buf,
1561 const struct bttv_format *fmt,
1562 unsigned int width, unsigned int height,
1563 enum v4l2_field field)
1564{
1565 struct bttv_fh *fh = q->priv_data;
1566 int redo_dma_risc = 0;
1567 struct bttv_crop c;
1568 int norm;
1569 int rc;
1570
1571
1572 if (NULL == fmt)
1573 return -EINVAL;
1574 if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1575 width = RAW_BPL;
1576 height = RAW_LINES*2;
1577 if (width*height > buf->vb.bsize)
1578 return -EINVAL;
1579 buf->vb.size = buf->vb.bsize;
1580
1581
1582
1583
1584 norm = btv->tvnorm;
1585
1586
1587
1588 if (btv->vbi_end > bttv_tvnorms[norm].cropcap.defrect.top) {
1589 return -EINVAL;
1590 }
1591
1592 c.rect = bttv_tvnorms[norm].cropcap.defrect;
1593 } else {
1594 norm = btv->tvnorm;
1595 c = btv->crop[!!fh->do_crop];
1596
1597 if (width < c.min_scaled_width ||
1598 width > c.max_scaled_width ||
1599 height < c.min_scaled_height)
1600 return -EINVAL;
1601
1602 switch (field) {
1603 case V4L2_FIELD_TOP:
1604 case V4L2_FIELD_BOTTOM:
1605 case V4L2_FIELD_ALTERNATE:
1606
1607
1608 if (height * 2 > c.max_scaled_height)
1609 return -EINVAL;
1610 break;
1611
1612 default:
1613 if (height > c.max_scaled_height)
1614 return -EINVAL;
1615 break;
1616 }
1617
1618 buf->vb.size = (width * height * fmt->depth) >> 3;
1619 if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
1620 return -EINVAL;
1621 }
1622
1623
1624 if (buf->vb.width != width || buf->vb.height != height ||
1625 buf->vb.field != field ||
1626 buf->tvnorm != norm || buf->fmt != fmt ||
1627 buf->crop.top != c.rect.top ||
1628 buf->crop.left != c.rect.left ||
1629 buf->crop.width != c.rect.width ||
1630 buf->crop.height != c.rect.height) {
1631 buf->vb.width = width;
1632 buf->vb.height = height;
1633 buf->vb.field = field;
1634 buf->tvnorm = norm;
1635 buf->fmt = fmt;
1636 buf->crop = c.rect;
1637 redo_dma_risc = 1;
1638 }
1639
1640
1641 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1642 redo_dma_risc = 1;
1643 if (0 != (rc = videobuf_iolock(q,&buf->vb,&btv->fbuf)))
1644 goto fail;
1645 }
1646
1647 if (redo_dma_risc)
1648 if (0 != (rc = bttv_buffer_risc(btv,buf)))
1649 goto fail;
1650
1651 buf->vb.state = VIDEOBUF_PREPARED;
1652 return 0;
1653
1654 fail:
1655 bttv_dma_free(q,btv,buf);
1656 return rc;
1657}
1658
1659static int
1660buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1661{
1662 struct bttv_fh *fh = q->priv_data;
1663
1664 *size = fh->fmt->depth*fh->width*fh->height >> 3;
1665 if (0 == *count)
1666 *count = gbuffers;
1667 if (*size * *count > gbuffers * gbufsize)
1668 *count = (gbuffers * gbufsize) / *size;
1669 return 0;
1670}
1671
1672static int
1673buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
1674 enum v4l2_field field)
1675{
1676 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1677 struct bttv_fh *fh = q->priv_data;
1678
1679 return bttv_prepare_buffer(q,fh->btv, buf, fh->fmt,
1680 fh->width, fh->height, field);
1681}
1682
1683static void
1684buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1685{
1686 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1687 struct bttv_fh *fh = q->priv_data;
1688 struct bttv *btv = fh->btv;
1689
1690 buf->vb.state = VIDEOBUF_QUEUED;
1691 list_add_tail(&buf->vb.queue,&btv->capture);
1692 if (!btv->curr.frame_irq) {
1693 btv->loop_irq |= 1;
1694 bttv_set_dma(btv, 0x03);
1695 }
1696}
1697
1698static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1699{
1700 struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
1701 struct bttv_fh *fh = q->priv_data;
1702
1703 bttv_dma_free(q,fh->btv,buf);
1704}
1705
1706static struct videobuf_queue_ops bttv_video_qops = {
1707 .buf_setup = buffer_setup,
1708 .buf_prepare = buffer_prepare,
1709 .buf_queue = buffer_queue,
1710 .buf_release = buffer_release,
1711};
1712
1713static void radio_enable(struct bttv *btv)
1714{
1715
1716 if (!btv->has_radio_tuner) {
1717 btv->has_radio_tuner = 1;
1718 bttv_call_all(btv, tuner, s_radio);
1719 btv->audio_input = TVAUDIO_INPUT_RADIO;
1720 audio_input(btv, btv->audio_input);
1721 }
1722}
1723
1724static int bttv_s_std(struct file *file, void *priv, v4l2_std_id id)
1725{
1726 struct bttv_fh *fh = priv;
1727 struct bttv *btv = fh->btv;
1728 unsigned int i;
1729 int err = 0;
1730
1731 for (i = 0; i < BTTV_TVNORMS; i++)
1732 if (id & bttv_tvnorms[i].v4l2_id)
1733 break;
1734 if (i == BTTV_TVNORMS) {
1735 err = -EINVAL;
1736 goto err;
1737 }
1738
1739 btv->std = id;
1740 set_tvnorm(btv, i);
1741
1742err:
1743
1744 return err;
1745}
1746
1747static int bttv_g_std(struct file *file, void *priv, v4l2_std_id *id)
1748{
1749 struct bttv_fh *fh = priv;
1750 struct bttv *btv = fh->btv;
1751
1752 *id = btv->std;
1753 return 0;
1754}
1755
1756static int bttv_querystd(struct file *file, void *f, v4l2_std_id *id)
1757{
1758 struct bttv_fh *fh = f;
1759 struct bttv *btv = fh->btv;
1760
1761 if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1762 *id &= V4L2_STD_625_50;
1763 else
1764 *id &= V4L2_STD_525_60;
1765 return 0;
1766}
1767
1768static int bttv_enum_input(struct file *file, void *priv,
1769 struct v4l2_input *i)
1770{
1771 struct bttv_fh *fh = priv;
1772 struct bttv *btv = fh->btv;
1773 int rc = 0;
1774
1775 if (i->index >= bttv_tvcards[btv->c.type].video_inputs) {
1776 rc = -EINVAL;
1777 goto err;
1778 }
1779
1780 i->type = V4L2_INPUT_TYPE_CAMERA;
1781 i->audioset = 0;
1782
1783 if (btv->tuner_type != TUNER_ABSENT && i->index == 0) {
1784 sprintf(i->name, "Television");
1785 i->type = V4L2_INPUT_TYPE_TUNER;
1786 i->tuner = 0;
1787 } else if (i->index == btv->svhs) {
1788 sprintf(i->name, "S-Video");
1789 } else {
1790 sprintf(i->name, "Composite%d", i->index);
1791 }
1792
1793 if (i->index == btv->input) {
1794 __u32 dstatus = btread(BT848_DSTATUS);
1795 if (0 == (dstatus & BT848_DSTATUS_PRES))
1796 i->status |= V4L2_IN_ST_NO_SIGNAL;
1797 if (0 == (dstatus & BT848_DSTATUS_HLOC))
1798 i->status |= V4L2_IN_ST_NO_H_LOCK;
1799 }
1800
1801 i->std = BTTV_NORMS;
1802
1803err:
1804
1805 return rc;
1806}
1807
1808static int bttv_g_input(struct file *file, void *priv, unsigned int *i)
1809{
1810 struct bttv_fh *fh = priv;
1811 struct bttv *btv = fh->btv;
1812
1813 *i = btv->input;
1814
1815 return 0;
1816}
1817
1818static int bttv_s_input(struct file *file, void *priv, unsigned int i)
1819{
1820 struct bttv_fh *fh = priv;
1821 struct bttv *btv = fh->btv;
1822
1823 if (i >= bttv_tvcards[btv->c.type].video_inputs)
1824 return -EINVAL;
1825
1826 set_input(btv, i, btv->tvnorm);
1827 return 0;
1828}
1829
1830static int bttv_s_tuner(struct file *file, void *priv,
1831 const struct v4l2_tuner *t)
1832{
1833 struct bttv_fh *fh = priv;
1834 struct bttv *btv = fh->btv;
1835
1836 if (t->index)
1837 return -EINVAL;
1838
1839 bttv_call_all(btv, tuner, s_tuner, t);
1840
1841 if (btv->audio_mode_gpio) {
1842 struct v4l2_tuner copy = *t;
1843
1844 btv->audio_mode_gpio(btv, ©, 1);
1845 }
1846 return 0;
1847}
1848
1849static int bttv_g_frequency(struct file *file, void *priv,
1850 struct v4l2_frequency *f)
1851{
1852 struct bttv_fh *fh = priv;
1853 struct bttv *btv = fh->btv;
1854
1855 if (f->tuner)
1856 return -EINVAL;
1857
1858 if (f->type == V4L2_TUNER_RADIO)
1859 radio_enable(btv);
1860 f->frequency = f->type == V4L2_TUNER_RADIO ?
1861 btv->radio_freq : btv->tv_freq;
1862
1863 return 0;
1864}
1865
1866static void bttv_set_frequency(struct bttv *btv, const struct v4l2_frequency *f)
1867{
1868 struct v4l2_frequency new_freq = *f;
1869
1870 bttv_call_all(btv, tuner, s_frequency, f);
1871
1872
1873 bttv_call_all(btv, tuner, g_frequency, &new_freq);
1874 if (new_freq.type == V4L2_TUNER_RADIO) {
1875 radio_enable(btv);
1876 btv->radio_freq = new_freq.frequency;
1877 if (btv->has_matchbox)
1878 tea5757_set_freq(btv, btv->radio_freq);
1879 } else {
1880 btv->tv_freq = new_freq.frequency;
1881 }
1882}
1883
1884static int bttv_s_frequency(struct file *file, void *priv,
1885 const struct v4l2_frequency *f)
1886{
1887 struct bttv_fh *fh = priv;
1888 struct bttv *btv = fh->btv;
1889
1890 if (f->tuner)
1891 return -EINVAL;
1892
1893 bttv_set_frequency(btv, f);
1894 return 0;
1895}
1896
1897static int bttv_log_status(struct file *file, void *f)
1898{
1899 struct video_device *vdev = video_devdata(file);
1900 struct bttv_fh *fh = f;
1901 struct bttv *btv = fh->btv;
1902
1903 v4l2_ctrl_handler_log_status(vdev->ctrl_handler, btv->c.v4l2_dev.name);
1904 bttv_call_all(btv, core, log_status);
1905 return 0;
1906}
1907
1908#ifdef CONFIG_VIDEO_ADV_DEBUG
1909static int bttv_g_register(struct file *file, void *f,
1910 struct v4l2_dbg_register *reg)
1911{
1912 struct bttv_fh *fh = f;
1913 struct bttv *btv = fh->btv;
1914
1915
1916 reg->reg &= 0xfff;
1917 reg->val = btread(reg->reg);
1918 reg->size = 1;
1919
1920 return 0;
1921}
1922
1923static int bttv_s_register(struct file *file, void *f,
1924 const struct v4l2_dbg_register *reg)
1925{
1926 struct bttv_fh *fh = f;
1927 struct bttv *btv = fh->btv;
1928
1929
1930 btwrite(reg->val, reg->reg & 0xfff);
1931
1932 return 0;
1933}
1934#endif
1935
1936
1937
1938
1939static void
1940bttv_crop_adjust (struct bttv_crop * c,
1941 const struct v4l2_rect * b,
1942 __s32 width,
1943 __s32 height,
1944 enum v4l2_field field)
1945{
1946 __s32 frame_height = height << !V4L2_FIELD_HAS_BOTH(field);
1947 __s32 max_left;
1948 __s32 max_top;
1949
1950 if (width < c->min_scaled_width) {
1951
1952 c->rect.width = width * 16;
1953 } else if (width > c->max_scaled_width) {
1954
1955 c->rect.width = width;
1956
1957 max_left = b->left + b->width - width;
1958 max_left = min(max_left, (__s32) MAX_HDELAY);
1959 if (c->rect.left > max_left)
1960 c->rect.left = max_left;
1961 }
1962
1963 if (height < c->min_scaled_height) {
1964
1965 c->rect.height = height * 16;
1966 } else if (frame_height > c->max_scaled_height) {
1967
1968
1969 c->rect.height = (frame_height + 1) & ~1;
1970
1971 max_top = b->top + b->height - c->rect.height;
1972 if (c->rect.top > max_top)
1973 c->rect.top = max_top;
1974 }
1975
1976 bttv_crop_calc_limits(c);
1977}
1978
1979
1980
1981
1982
1983
1984
1985
1986static int
1987limit_scaled_size_lock (struct bttv_fh * fh,
1988 __s32 * width,
1989 __s32 * height,
1990 enum v4l2_field field,
1991 unsigned int width_mask,
1992 unsigned int width_bias,
1993 int adjust_size,
1994 int adjust_crop)
1995{
1996 struct bttv *btv = fh->btv;
1997 const struct v4l2_rect *b;
1998 struct bttv_crop *c;
1999 __s32 min_width;
2000 __s32 min_height;
2001 __s32 max_width;
2002 __s32 max_height;
2003 int rc;
2004
2005 BUG_ON((int) width_mask >= 0 ||
2006 width_bias >= (unsigned int) -width_mask);
2007
2008
2009
2010
2011 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2012
2013
2014 c = &btv->crop[!!fh->do_crop];
2015
2016 if (fh->do_crop
2017 && adjust_size
2018 && adjust_crop
2019 && !locked_btres(btv, VIDEO_RESOURCES)) {
2020 min_width = 48;
2021 min_height = 32;
2022
2023
2024
2025
2026 max_width = min_t(unsigned int, b->width, MAX_HACTIVE);
2027 max_height = b->height;
2028
2029
2030
2031
2032 if (btv->vbi_end > b->top) {
2033 max_height -= btv->vbi_end - b->top;
2034 rc = -EBUSY;
2035 if (min_height > max_height)
2036 goto fail;
2037 }
2038 } else {
2039 rc = -EBUSY;
2040 if (btv->vbi_end > c->rect.top)
2041 goto fail;
2042
2043 min_width = c->min_scaled_width;
2044 min_height = c->min_scaled_height;
2045 max_width = c->max_scaled_width;
2046 max_height = c->max_scaled_height;
2047
2048 adjust_crop = 0;
2049 }
2050
2051 min_width = (min_width - width_mask - 1) & width_mask;
2052 max_width = max_width & width_mask;
2053
2054
2055 min_height = min_height;
2056
2057 max_height >>= !V4L2_FIELD_HAS_BOTH(field);
2058
2059 if (adjust_size) {
2060 *width = clamp(*width, min_width, max_width);
2061 *height = clamp(*height, min_height, max_height);
2062
2063
2064 *width = (*width + width_bias) & width_mask;
2065
2066 if (adjust_crop) {
2067 bttv_crop_adjust(c, b, *width, *height, field);
2068
2069 if (btv->vbi_end > c->rect.top) {
2070
2071 c->rect.top = btv->vbi_end;
2072 }
2073 }
2074 } else {
2075 rc = -EINVAL;
2076 if (*width < min_width ||
2077 *height < min_height ||
2078 *width > max_width ||
2079 *height > max_height ||
2080 0 != (*width & ~width_mask))
2081 goto fail;
2082 }
2083
2084 rc = 0;
2085
2086 fail:
2087
2088 return rc;
2089}
2090
2091
2092
2093
2094
2095
2096
2097
2098static int
2099verify_window_lock(struct bttv_fh *fh, struct v4l2_window *win,
2100 int adjust_size, int adjust_crop)
2101{
2102 enum v4l2_field field;
2103 unsigned int width_mask;
2104 int rc;
2105
2106 if (win->w.width < 48)
2107 win->w.width = 48;
2108 if (win->w.height < 32)
2109 win->w.height = 32;
2110 if (win->clipcount > 2048)
2111 win->clipcount = 2048;
2112
2113 win->chromakey = 0;
2114 win->global_alpha = 0;
2115 field = win->field;
2116
2117 switch (field) {
2118 case V4L2_FIELD_TOP:
2119 case V4L2_FIELD_BOTTOM:
2120 case V4L2_FIELD_INTERLACED:
2121 break;
2122 default:
2123 field = V4L2_FIELD_ANY;
2124 break;
2125 }
2126 if (V4L2_FIELD_ANY == field) {
2127 __s32 height2;
2128
2129 height2 = fh->btv->crop[!!fh->do_crop].rect.height >> 1;
2130 field = (win->w.height > height2)
2131 ? V4L2_FIELD_INTERLACED
2132 : V4L2_FIELD_TOP;
2133 }
2134 win->field = field;
2135
2136 if (NULL == fh->ovfmt)
2137 return -EINVAL;
2138
2139 width_mask = ~0;
2140 switch (fh->ovfmt->depth) {
2141 case 8:
2142 case 24:
2143 width_mask = ~3;
2144 break;
2145 case 16:
2146 width_mask = ~1;
2147 break;
2148 case 32:
2149 break;
2150 default:
2151 BUG();
2152 }
2153
2154 win->w.width -= win->w.left & ~width_mask;
2155 win->w.left = (win->w.left - width_mask - 1) & width_mask;
2156
2157 rc = limit_scaled_size_lock(fh, &win->w.width, &win->w.height,
2158 field, width_mask,
2159 0,
2160 adjust_size, adjust_crop);
2161 if (0 != rc)
2162 return rc;
2163 return 0;
2164}
2165
2166static int setup_window_lock(struct bttv_fh *fh, struct bttv *btv,
2167 struct v4l2_window *win, int fixup)
2168{
2169 struct v4l2_clip *clips = NULL;
2170 int n,size,retval = 0;
2171
2172 if (NULL == fh->ovfmt)
2173 return -EINVAL;
2174 if (!(fh->ovfmt->flags & FORMAT_FLAGS_PACKED))
2175 return -EINVAL;
2176 retval = verify_window_lock(fh, win,
2177 fixup,
2178 fixup);
2179 if (0 != retval)
2180 return retval;
2181
2182
2183
2184 n = win->clipcount;
2185 size = sizeof(*clips)*(n+4);
2186 clips = kmalloc(size,GFP_KERNEL);
2187 if (NULL == clips)
2188 return -ENOMEM;
2189 if (n > 0) {
2190 if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
2191 kfree(clips);
2192 return -EFAULT;
2193 }
2194 }
2195
2196
2197 if (NULL != btv->fbuf.base)
2198 n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
2199 &win->w, clips, n);
2200 btcx_sort_clips(clips,n);
2201
2202
2203 switch (fh->ovfmt->depth) {
2204 case 8:
2205 case 24:
2206 btcx_align(&win->w, clips, n, 3);
2207 break;
2208 case 16:
2209 btcx_align(&win->w, clips, n, 1);
2210 break;
2211 case 32:
2212
2213 break;
2214 default:
2215 BUG();
2216 }
2217
2218 kfree(fh->ov.clips);
2219 fh->ov.clips = clips;
2220 fh->ov.nclips = n;
2221
2222 fh->ov.w = win->w;
2223 fh->ov.field = win->field;
2224 fh->ov.setup_ok = 1;
2225
2226 btv->init.ov.w.width = win->w.width;
2227 btv->init.ov.w.height = win->w.height;
2228 btv->init.ov.field = win->field;
2229
2230
2231 retval = 0;
2232 if (check_btres(fh, RESOURCE_OVERLAY)) {
2233 struct bttv_buffer *new;
2234
2235 new = videobuf_sg_alloc(sizeof(*new));
2236 new->crop = btv->crop[!!fh->do_crop].rect;
2237 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2238 retval = bttv_switch_overlay(btv,fh,new);
2239 }
2240 return retval;
2241}
2242
2243
2244
2245static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
2246{
2247 struct videobuf_queue* q = NULL;
2248
2249 switch (fh->type) {
2250 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2251 q = &fh->cap;
2252 break;
2253 case V4L2_BUF_TYPE_VBI_CAPTURE:
2254 q = &fh->vbi;
2255 break;
2256 default:
2257 BUG();
2258 }
2259 return q;
2260}
2261
2262static int bttv_resource(struct bttv_fh *fh)
2263{
2264 int res = 0;
2265
2266 switch (fh->type) {
2267 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2268 res = RESOURCE_VIDEO_STREAM;
2269 break;
2270 case V4L2_BUF_TYPE_VBI_CAPTURE:
2271 res = RESOURCE_VBI;
2272 break;
2273 default:
2274 BUG();
2275 }
2276 return res;
2277}
2278
2279static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
2280{
2281 struct videobuf_queue *q = bttv_queue(fh);
2282 int res = bttv_resource(fh);
2283
2284 if (check_btres(fh,res))
2285 return -EBUSY;
2286 if (videobuf_queue_is_busy(q))
2287 return -EBUSY;
2288 fh->type = type;
2289 return 0;
2290}
2291
2292static void
2293pix_format_set_size (struct v4l2_pix_format * f,
2294 const struct bttv_format * fmt,
2295 unsigned int width,
2296 unsigned int height)
2297{
2298 f->width = width;
2299 f->height = height;
2300
2301 if (fmt->flags & FORMAT_FLAGS_PLANAR) {
2302 f->bytesperline = width;
2303 f->sizeimage = (width * height * fmt->depth) >> 3;
2304 } else {
2305 f->bytesperline = (width * fmt->depth) >> 3;
2306 f->sizeimage = height * f->bytesperline;
2307 }
2308}
2309
2310static int bttv_g_fmt_vid_cap(struct file *file, void *priv,
2311 struct v4l2_format *f)
2312{
2313 struct bttv_fh *fh = priv;
2314
2315 pix_format_set_size(&f->fmt.pix, fh->fmt,
2316 fh->width, fh->height);
2317 f->fmt.pix.field = fh->cap.field;
2318 f->fmt.pix.pixelformat = fh->fmt->fourcc;
2319 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
2320
2321 return 0;
2322}
2323
2324static int bttv_g_fmt_vid_overlay(struct file *file, void *priv,
2325 struct v4l2_format *f)
2326{
2327 struct bttv_fh *fh = priv;
2328
2329 f->fmt.win.w = fh->ov.w;
2330 f->fmt.win.field = fh->ov.field;
2331
2332 return 0;
2333}
2334
2335static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
2336 struct v4l2_format *f)
2337{
2338 const struct bttv_format *fmt;
2339 struct bttv_fh *fh = priv;
2340 struct bttv *btv = fh->btv;
2341 enum v4l2_field field;
2342 __s32 width, height;
2343 __s32 height2;
2344 int rc;
2345
2346 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2347 if (NULL == fmt)
2348 return -EINVAL;
2349
2350 field = f->fmt.pix.field;
2351
2352 switch (field) {
2353 case V4L2_FIELD_TOP:
2354 case V4L2_FIELD_BOTTOM:
2355 case V4L2_FIELD_ALTERNATE:
2356 case V4L2_FIELD_INTERLACED:
2357 break;
2358 case V4L2_FIELD_SEQ_BT:
2359 case V4L2_FIELD_SEQ_TB:
2360 if (!(fmt->flags & FORMAT_FLAGS_PLANAR)) {
2361 field = V4L2_FIELD_SEQ_TB;
2362 break;
2363 }
2364
2365 default:
2366 height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
2367 field = (f->fmt.pix.height > height2)
2368 ? V4L2_FIELD_INTERLACED
2369 : V4L2_FIELD_BOTTOM;
2370 break;
2371 }
2372
2373 width = f->fmt.pix.width;
2374 height = f->fmt.pix.height;
2375
2376 rc = limit_scaled_size_lock(fh, &width, &height, field,
2377 ~3,
2378 2,
2379 1,
2380 0);
2381 if (0 != rc)
2382 return rc;
2383
2384
2385 f->fmt.pix.field = field;
2386 pix_format_set_size(&f->fmt.pix, fmt, width, height);
2387 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
2388
2389 return 0;
2390}
2391
2392static int bttv_try_fmt_vid_overlay(struct file *file, void *priv,
2393 struct v4l2_format *f)
2394{
2395 struct bttv_fh *fh = priv;
2396
2397 verify_window_lock(fh, &f->fmt.win,
2398 1,
2399 0);
2400 return 0;
2401}
2402
2403static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
2404 struct v4l2_format *f)
2405{
2406 int retval;
2407 const struct bttv_format *fmt;
2408 struct bttv_fh *fh = priv;
2409 struct bttv *btv = fh->btv;
2410 __s32 width, height;
2411 enum v4l2_field field;
2412
2413 retval = bttv_switch_type(fh, f->type);
2414 if (0 != retval)
2415 return retval;
2416
2417 retval = bttv_try_fmt_vid_cap(file, priv, f);
2418 if (0 != retval)
2419 return retval;
2420
2421 width = f->fmt.pix.width;
2422 height = f->fmt.pix.height;
2423 field = f->fmt.pix.field;
2424
2425 retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field,
2426 ~3,
2427 2,
2428 1,
2429 1);
2430 if (0 != retval)
2431 return retval;
2432
2433 f->fmt.pix.field = field;
2434
2435 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2436
2437
2438 fh->fmt = fmt;
2439 fh->cap.field = f->fmt.pix.field;
2440 fh->cap.last = V4L2_FIELD_NONE;
2441 fh->width = f->fmt.pix.width;
2442 fh->height = f->fmt.pix.height;
2443 btv->init.fmt = fmt;
2444 btv->init.width = f->fmt.pix.width;
2445 btv->init.height = f->fmt.pix.height;
2446
2447 return 0;
2448}
2449
2450static int bttv_s_fmt_vid_overlay(struct file *file, void *priv,
2451 struct v4l2_format *f)
2452{
2453 struct bttv_fh *fh = priv;
2454 struct bttv *btv = fh->btv;
2455
2456 if (no_overlay > 0) {
2457 pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2458 return -EINVAL;
2459 }
2460
2461 return setup_window_lock(fh, btv, &f->fmt.win, 1);
2462}
2463
2464static int bttv_querycap(struct file *file, void *priv,
2465 struct v4l2_capability *cap)
2466{
2467 struct video_device *vdev = video_devdata(file);
2468 struct bttv_fh *fh = priv;
2469 struct bttv *btv = fh->btv;
2470
2471 if (0 == v4l2)
2472 return -EINVAL;
2473
2474 strlcpy(cap->driver, "bttv", sizeof(cap->driver));
2475 strlcpy(cap->card, btv->video_dev->name, sizeof(cap->card));
2476 snprintf(cap->bus_info, sizeof(cap->bus_info),
2477 "PCI:%s", pci_name(btv->c.pci));
2478 cap->capabilities =
2479 V4L2_CAP_VIDEO_CAPTURE |
2480 V4L2_CAP_READWRITE |
2481 V4L2_CAP_STREAMING |
2482 V4L2_CAP_DEVICE_CAPS;
2483 if (no_overlay <= 0)
2484 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
2485 if (btv->vbi_dev)
2486 cap->capabilities |= V4L2_CAP_VBI_CAPTURE;
2487 if (btv->radio_dev)
2488 cap->capabilities |= V4L2_CAP_RADIO;
2489
2490
2491
2492
2493
2494 if (btv->has_saa6588)
2495 cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
2496 if (btv->tuner_type != TUNER_ABSENT)
2497 cap->capabilities |= V4L2_CAP_TUNER;
2498 if (vdev->vfl_type == VFL_TYPE_GRABBER)
2499 cap->device_caps = cap->capabilities &
2500 (V4L2_CAP_VIDEO_CAPTURE |
2501 V4L2_CAP_READWRITE |
2502 V4L2_CAP_STREAMING |
2503 V4L2_CAP_VIDEO_OVERLAY |
2504 V4L2_CAP_TUNER);
2505 else if (vdev->vfl_type == VFL_TYPE_VBI)
2506 cap->device_caps = cap->capabilities &
2507 (V4L2_CAP_VBI_CAPTURE |
2508 V4L2_CAP_READWRITE |
2509 V4L2_CAP_STREAMING |
2510 V4L2_CAP_TUNER);
2511 else {
2512 cap->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
2513 if (btv->has_saa6588)
2514 cap->device_caps |= V4L2_CAP_READWRITE |
2515 V4L2_CAP_RDS_CAPTURE;
2516 }
2517 return 0;
2518}
2519
2520static int bttv_enum_fmt_cap_ovr(struct v4l2_fmtdesc *f)
2521{
2522 int index = -1, i;
2523
2524 for (i = 0; i < FORMATS; i++) {
2525 if (formats[i].fourcc != -1)
2526 index++;
2527 if ((unsigned int)index == f->index)
2528 break;
2529 }
2530 if (FORMATS == i)
2531 return -EINVAL;
2532
2533 f->pixelformat = formats[i].fourcc;
2534 strlcpy(f->description, formats[i].name, sizeof(f->description));
2535
2536 return i;
2537}
2538
2539static int bttv_enum_fmt_vid_cap(struct file *file, void *priv,
2540 struct v4l2_fmtdesc *f)
2541{
2542 int rc = bttv_enum_fmt_cap_ovr(f);
2543
2544 if (rc < 0)
2545 return rc;
2546
2547 return 0;
2548}
2549
2550static int bttv_enum_fmt_vid_overlay(struct file *file, void *priv,
2551 struct v4l2_fmtdesc *f)
2552{
2553 int rc;
2554
2555 if (no_overlay > 0) {
2556 pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2557 return -EINVAL;
2558 }
2559
2560 rc = bttv_enum_fmt_cap_ovr(f);
2561
2562 if (rc < 0)
2563 return rc;
2564
2565 if (!(formats[rc].flags & FORMAT_FLAGS_PACKED))
2566 return -EINVAL;
2567
2568 return 0;
2569}
2570
2571static int bttv_g_fbuf(struct file *file, void *f,
2572 struct v4l2_framebuffer *fb)
2573{
2574 struct bttv_fh *fh = f;
2575 struct bttv *btv = fh->btv;
2576
2577 *fb = btv->fbuf;
2578 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2579 fb->flags = V4L2_FBUF_FLAG_PRIMARY;
2580 if (fh->ovfmt)
2581 fb->fmt.pixelformat = fh->ovfmt->fourcc;
2582 return 0;
2583}
2584
2585static int bttv_overlay(struct file *file, void *f, unsigned int on)
2586{
2587 struct bttv_fh *fh = f;
2588 struct bttv *btv = fh->btv;
2589 struct bttv_buffer *new;
2590 int retval = 0;
2591
2592 if (on) {
2593
2594 if (unlikely(!btv->fbuf.base)) {
2595 return -EINVAL;
2596 }
2597 if (unlikely(!fh->ov.setup_ok)) {
2598 dprintk("%d: overlay: !setup_ok\n", btv->c.nr);
2599 retval = -EINVAL;
2600 }
2601 if (retval)
2602 return retval;
2603 }
2604
2605 if (!check_alloc_btres_lock(btv, fh, RESOURCE_OVERLAY))
2606 return -EBUSY;
2607
2608 if (on) {
2609 fh->ov.tvnorm = btv->tvnorm;
2610 new = videobuf_sg_alloc(sizeof(*new));
2611 new->crop = btv->crop[!!fh->do_crop].rect;
2612 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2613 } else {
2614 new = NULL;
2615 }
2616
2617
2618 retval = bttv_switch_overlay(btv, fh, new);
2619 return retval;
2620}
2621
2622static int bttv_s_fbuf(struct file *file, void *f,
2623 const struct v4l2_framebuffer *fb)
2624{
2625 struct bttv_fh *fh = f;
2626 struct bttv *btv = fh->btv;
2627 const struct bttv_format *fmt;
2628 int retval;
2629
2630 if (!capable(CAP_SYS_ADMIN) &&
2631 !capable(CAP_SYS_RAWIO))
2632 return -EPERM;
2633
2634
2635 fmt = format_by_fourcc(fb->fmt.pixelformat);
2636 if (NULL == fmt)
2637 return -EINVAL;
2638 if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2639 return -EINVAL;
2640
2641 retval = -EINVAL;
2642 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2643 __s32 width = fb->fmt.width;
2644 __s32 height = fb->fmt.height;
2645
2646 retval = limit_scaled_size_lock(fh, &width, &height,
2647 V4L2_FIELD_INTERLACED,
2648 ~3,
2649 2,
2650 0,
2651 0);
2652 if (0 != retval)
2653 return retval;
2654 }
2655
2656
2657 btv->fbuf.base = fb->base;
2658 btv->fbuf.fmt.width = fb->fmt.width;
2659 btv->fbuf.fmt.height = fb->fmt.height;
2660 if (0 != fb->fmt.bytesperline)
2661 btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2662 else
2663 btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2664
2665 retval = 0;
2666 fh->ovfmt = fmt;
2667 btv->init.ovfmt = fmt;
2668 if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2669 fh->ov.w.left = 0;
2670 fh->ov.w.top = 0;
2671 fh->ov.w.width = fb->fmt.width;
2672 fh->ov.w.height = fb->fmt.height;
2673 btv->init.ov.w.width = fb->fmt.width;
2674 btv->init.ov.w.height = fb->fmt.height;
2675 kfree(fh->ov.clips);
2676 fh->ov.clips = NULL;
2677 fh->ov.nclips = 0;
2678
2679 if (check_btres(fh, RESOURCE_OVERLAY)) {
2680 struct bttv_buffer *new;
2681
2682 new = videobuf_sg_alloc(sizeof(*new));
2683 new->crop = btv->crop[!!fh->do_crop].rect;
2684 bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2685 retval = bttv_switch_overlay(btv, fh, new);
2686 }
2687 }
2688 return retval;
2689}
2690
2691static int bttv_reqbufs(struct file *file, void *priv,
2692 struct v4l2_requestbuffers *p)
2693{
2694 struct bttv_fh *fh = priv;
2695 return videobuf_reqbufs(bttv_queue(fh), p);
2696}
2697
2698static int bttv_querybuf(struct file *file, void *priv,
2699 struct v4l2_buffer *b)
2700{
2701 struct bttv_fh *fh = priv;
2702 return videobuf_querybuf(bttv_queue(fh), b);
2703}
2704
2705static int bttv_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2706{
2707 struct bttv_fh *fh = priv;
2708 struct bttv *btv = fh->btv;
2709 int res = bttv_resource(fh);
2710
2711 if (!check_alloc_btres_lock(btv, fh, res))
2712 return -EBUSY;
2713
2714 return videobuf_qbuf(bttv_queue(fh), b);
2715}
2716
2717static int bttv_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2718{
2719 struct bttv_fh *fh = priv;
2720 return videobuf_dqbuf(bttv_queue(fh), b,
2721 file->f_flags & O_NONBLOCK);
2722}
2723
2724static int bttv_streamon(struct file *file, void *priv,
2725 enum v4l2_buf_type type)
2726{
2727 struct bttv_fh *fh = priv;
2728 struct bttv *btv = fh->btv;
2729 int res = bttv_resource(fh);
2730
2731 if (!check_alloc_btres_lock(btv, fh, res))
2732 return -EBUSY;
2733 return videobuf_streamon(bttv_queue(fh));
2734}
2735
2736
2737static int bttv_streamoff(struct file *file, void *priv,
2738 enum v4l2_buf_type type)
2739{
2740 struct bttv_fh *fh = priv;
2741 struct bttv *btv = fh->btv;
2742 int retval;
2743 int res = bttv_resource(fh);
2744
2745
2746 retval = videobuf_streamoff(bttv_queue(fh));
2747 if (retval < 0)
2748 return retval;
2749 free_btres_lock(btv, fh, res);
2750 return 0;
2751}
2752
2753static int bttv_g_parm(struct file *file, void *f,
2754 struct v4l2_streamparm *parm)
2755{
2756 struct bttv_fh *fh = f;
2757 struct bttv *btv = fh->btv;
2758
2759 if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2760 return -EINVAL;
2761 parm->parm.capture.readbuffers = gbuffers;
2762 v4l2_video_std_frame_period(bttv_tvnorms[btv->tvnorm].v4l2_id,
2763 &parm->parm.capture.timeperframe);
2764
2765 return 0;
2766}
2767
2768static int bttv_g_tuner(struct file *file, void *priv,
2769 struct v4l2_tuner *t)
2770{
2771 struct bttv_fh *fh = priv;
2772 struct bttv *btv = fh->btv;
2773
2774 if (0 != t->index)
2775 return -EINVAL;
2776
2777 t->rxsubchans = V4L2_TUNER_SUB_MONO;
2778 t->capability = V4L2_TUNER_CAP_NORM;
2779 bttv_call_all(btv, tuner, g_tuner, t);
2780 strcpy(t->name, "Television");
2781 t->type = V4L2_TUNER_ANALOG_TV;
2782 if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
2783 t->signal = 0xffff;
2784
2785 if (btv->audio_mode_gpio)
2786 btv->audio_mode_gpio(btv, t, 0);
2787
2788 return 0;
2789}
2790
2791static int bttv_cropcap(struct file *file, void *priv,
2792 struct v4l2_cropcap *cap)
2793{
2794 struct bttv_fh *fh = priv;
2795 struct bttv *btv = fh->btv;
2796
2797 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2798 cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2799 return -EINVAL;
2800
2801 *cap = bttv_tvnorms[btv->tvnorm].cropcap;
2802
2803 return 0;
2804}
2805
2806static int bttv_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
2807{
2808 struct bttv_fh *fh = f;
2809 struct bttv *btv = fh->btv;
2810
2811 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2812 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2813 return -EINVAL;
2814
2815
2816
2817
2818
2819 crop->c = btv->crop[!!fh->do_crop].rect;
2820
2821 return 0;
2822}
2823
2824static int bttv_s_crop(struct file *file, void *f, const struct v4l2_crop *crop)
2825{
2826 struct bttv_fh *fh = f;
2827 struct bttv *btv = fh->btv;
2828 const struct v4l2_rect *b;
2829 int retval;
2830 struct bttv_crop c;
2831 __s32 b_left;
2832 __s32 b_top;
2833 __s32 b_right;
2834 __s32 b_bottom;
2835
2836 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
2837 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
2838 return -EINVAL;
2839
2840
2841
2842
2843 retval = -EBUSY;
2844
2845 if (locked_btres(fh->btv, VIDEO_RESOURCES)) {
2846 return retval;
2847 }
2848
2849 b = &bttv_tvnorms[btv->tvnorm].cropcap.bounds;
2850
2851 b_left = b->left;
2852 b_right = b_left + b->width;
2853 b_bottom = b->top + b->height;
2854
2855 b_top = max(b->top, btv->vbi_end);
2856 if (b_top + 32 >= b_bottom) {
2857 return retval;
2858 }
2859
2860
2861 c.rect.left = clamp_t(s32, crop->c.left, b_left, b_right - 48);
2862 c.rect.left = min(c.rect.left, (__s32) MAX_HDELAY);
2863
2864 c.rect.width = clamp_t(s32, crop->c.width,
2865 48, b_right - c.rect.left);
2866
2867 c.rect.top = clamp_t(s32, crop->c.top, b_top, b_bottom - 32);
2868
2869 c.rect.top = (c.rect.top + 1) & ~1;
2870
2871 c.rect.height = clamp_t(s32, crop->c.height,
2872 32, b_bottom - c.rect.top);
2873 c.rect.height = (c.rect.height + 1) & ~1;
2874
2875 bttv_crop_calc_limits(&c);
2876
2877 btv->crop[1] = c;
2878
2879 fh->do_crop = 1;
2880
2881 if (fh->width < c.min_scaled_width) {
2882 fh->width = c.min_scaled_width;
2883 btv->init.width = c.min_scaled_width;
2884 } else if (fh->width > c.max_scaled_width) {
2885 fh->width = c.max_scaled_width;
2886 btv->init.width = c.max_scaled_width;
2887 }
2888
2889 if (fh->height < c.min_scaled_height) {
2890 fh->height = c.min_scaled_height;
2891 btv->init.height = c.min_scaled_height;
2892 } else if (fh->height > c.max_scaled_height) {
2893 fh->height = c.max_scaled_height;
2894 btv->init.height = c.max_scaled_height;
2895 }
2896
2897 return 0;
2898}
2899
2900static ssize_t bttv_read(struct file *file, char __user *data,
2901 size_t count, loff_t *ppos)
2902{
2903 struct bttv_fh *fh = file->private_data;
2904 int retval = 0;
2905
2906 if (fh->btv->errors)
2907 bttv_reinit_bt848(fh->btv);
2908 dprintk("%d: read count=%d type=%s\n",
2909 fh->btv->c.nr, (int)count, v4l2_type_names[fh->type]);
2910
2911 switch (fh->type) {
2912 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2913 if (!check_alloc_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ)) {
2914
2915
2916 return -EBUSY;
2917 }
2918 retval = videobuf_read_one(&fh->cap, data, count, ppos,
2919 file->f_flags & O_NONBLOCK);
2920 free_btres_lock(fh->btv, fh, RESOURCE_VIDEO_READ);
2921 break;
2922 case V4L2_BUF_TYPE_VBI_CAPTURE:
2923 if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
2924 return -EBUSY;
2925 retval = videobuf_read_stream(&fh->vbi, data, count, ppos, 1,
2926 file->f_flags & O_NONBLOCK);
2927 break;
2928 default:
2929 BUG();
2930 }
2931 return retval;
2932}
2933
2934static unsigned int bttv_poll(struct file *file, poll_table *wait)
2935{
2936 struct bttv_fh *fh = file->private_data;
2937 struct bttv_buffer *buf;
2938 enum v4l2_field field;
2939 unsigned int rc = 0;
2940 unsigned long req_events = poll_requested_events(wait);
2941
2942 if (v4l2_event_pending(&fh->fh))
2943 rc = POLLPRI;
2944 else if (req_events & POLLPRI)
2945 poll_wait(file, &fh->fh.wait, wait);
2946
2947 if (!(req_events & (POLLIN | POLLRDNORM)))
2948 return rc;
2949
2950 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2951 if (!check_alloc_btres_lock(fh->btv,fh,RESOURCE_VBI))
2952 return rc | POLLERR;
2953 return rc | videobuf_poll_stream(file, &fh->vbi, wait);
2954 }
2955
2956 if (check_btres(fh,RESOURCE_VIDEO_STREAM)) {
2957
2958 if (list_empty(&fh->cap.stream))
2959 return rc | POLLERR;
2960 buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
2961 } else {
2962
2963 if (NULL == fh->cap.read_buf) {
2964
2965 if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM))
2966 return rc | POLLERR;
2967 fh->cap.read_buf = videobuf_sg_alloc(fh->cap.msize);
2968 if (NULL == fh->cap.read_buf)
2969 return rc | POLLERR;
2970 fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
2971 field = videobuf_next_field(&fh->cap);
2972 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,field)) {
2973 kfree (fh->cap.read_buf);
2974 fh->cap.read_buf = NULL;
2975 return rc | POLLERR;
2976 }
2977 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
2978 fh->cap.read_off = 0;
2979 }
2980 buf = (struct bttv_buffer*)fh->cap.read_buf;
2981 }
2982
2983 poll_wait(file, &buf->vb.done, wait);
2984 if (buf->vb.state == VIDEOBUF_DONE ||
2985 buf->vb.state == VIDEOBUF_ERROR)
2986 rc = rc | POLLIN|POLLRDNORM;
2987 return rc;
2988}
2989
2990static int bttv_open(struct file *file)
2991{
2992 struct video_device *vdev = video_devdata(file);
2993 struct bttv *btv = video_drvdata(file);
2994 struct bttv_fh *fh;
2995 enum v4l2_buf_type type = 0;
2996
2997 dprintk("open dev=%s\n", video_device_node_name(vdev));
2998
2999 if (vdev->vfl_type == VFL_TYPE_GRABBER) {
3000 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
3001 } else if (vdev->vfl_type == VFL_TYPE_VBI) {
3002 type = V4L2_BUF_TYPE_VBI_CAPTURE;
3003 } else {
3004 WARN_ON(1);
3005 return -ENODEV;
3006 }
3007
3008 dprintk("%d: open called (type=%s)\n",
3009 btv->c.nr, v4l2_type_names[type]);
3010
3011
3012 fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3013 if (unlikely(!fh))
3014 return -ENOMEM;
3015 btv->users++;
3016 file->private_data = fh;
3017
3018 *fh = btv->init;
3019 v4l2_fh_init(&fh->fh, vdev);
3020
3021 fh->type = type;
3022 fh->ov.setup_ok = 0;
3023
3024 videobuf_queue_sg_init(&fh->cap, &bttv_video_qops,
3025 &btv->c.pci->dev, &btv->s_lock,
3026 V4L2_BUF_TYPE_VIDEO_CAPTURE,
3027 V4L2_FIELD_INTERLACED,
3028 sizeof(struct bttv_buffer),
3029 fh, &btv->lock);
3030 videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops,
3031 &btv->c.pci->dev, &btv->s_lock,
3032 V4L2_BUF_TYPE_VBI_CAPTURE,
3033 V4L2_FIELD_SEQ_TB,
3034 sizeof(struct bttv_buffer),
3035 fh, &btv->lock);
3036 set_tvnorm(btv,btv->tvnorm);
3037 set_input(btv, btv->input, btv->tvnorm);
3038 audio_mute(btv, btv->mute);
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049 fh->do_crop = !reset_crop;
3050
3051
3052
3053
3054 bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
3055
3056 bttv_field_count(btv);
3057 v4l2_fh_add(&fh->fh);
3058 return 0;
3059}
3060
3061static int bttv_release(struct file *file)
3062{
3063 struct bttv_fh *fh = file->private_data;
3064 struct bttv *btv = fh->btv;
3065
3066
3067 if (check_btres(fh, RESOURCE_OVERLAY))
3068 bttv_switch_overlay(btv,fh,NULL);
3069
3070
3071 if (check_btres(fh, RESOURCE_VIDEO_STREAM)) {
3072 videobuf_streamoff(&fh->cap);
3073 free_btres_lock(btv,fh,RESOURCE_VIDEO_STREAM);
3074 }
3075 if (fh->cap.read_buf) {
3076 buffer_release(&fh->cap,fh->cap.read_buf);
3077 kfree(fh->cap.read_buf);
3078 }
3079 if (check_btres(fh, RESOURCE_VIDEO_READ)) {
3080 free_btres_lock(btv, fh, RESOURCE_VIDEO_READ);
3081 }
3082
3083
3084 if (check_btres(fh, RESOURCE_VBI)) {
3085 videobuf_stop(&fh->vbi);
3086 free_btres_lock(btv,fh,RESOURCE_VBI);
3087 }
3088
3089
3090
3091 videobuf_mmap_free(&fh->cap);
3092 videobuf_mmap_free(&fh->vbi);
3093 file->private_data = NULL;
3094
3095 btv->users--;
3096 bttv_field_count(btv);
3097
3098 if (!btv->users)
3099 audio_mute(btv, btv->mute);
3100
3101 v4l2_fh_del(&fh->fh);
3102 v4l2_fh_exit(&fh->fh);
3103 kfree(fh);
3104 return 0;
3105}
3106
3107static int
3108bttv_mmap(struct file *file, struct vm_area_struct *vma)
3109{
3110 struct bttv_fh *fh = file->private_data;
3111
3112 dprintk("%d: mmap type=%s 0x%lx+%ld\n",
3113 fh->btv->c.nr, v4l2_type_names[fh->type],
3114 vma->vm_start, vma->vm_end - vma->vm_start);
3115 return videobuf_mmap_mapper(bttv_queue(fh),vma);
3116}
3117
3118static const struct v4l2_file_operations bttv_fops =
3119{
3120 .owner = THIS_MODULE,
3121 .open = bttv_open,
3122 .release = bttv_release,
3123 .unlocked_ioctl = video_ioctl2,
3124 .read = bttv_read,
3125 .mmap = bttv_mmap,
3126 .poll = bttv_poll,
3127};
3128
3129static const struct v4l2_ioctl_ops bttv_ioctl_ops = {
3130 .vidioc_querycap = bttv_querycap,
3131 .vidioc_enum_fmt_vid_cap = bttv_enum_fmt_vid_cap,
3132 .vidioc_g_fmt_vid_cap = bttv_g_fmt_vid_cap,
3133 .vidioc_try_fmt_vid_cap = bttv_try_fmt_vid_cap,
3134 .vidioc_s_fmt_vid_cap = bttv_s_fmt_vid_cap,
3135 .vidioc_enum_fmt_vid_overlay = bttv_enum_fmt_vid_overlay,
3136 .vidioc_g_fmt_vid_overlay = bttv_g_fmt_vid_overlay,
3137 .vidioc_try_fmt_vid_overlay = bttv_try_fmt_vid_overlay,
3138 .vidioc_s_fmt_vid_overlay = bttv_s_fmt_vid_overlay,
3139 .vidioc_g_fmt_vbi_cap = bttv_g_fmt_vbi_cap,
3140 .vidioc_try_fmt_vbi_cap = bttv_try_fmt_vbi_cap,
3141 .vidioc_s_fmt_vbi_cap = bttv_s_fmt_vbi_cap,
3142 .vidioc_cropcap = bttv_cropcap,
3143 .vidioc_reqbufs = bttv_reqbufs,
3144 .vidioc_querybuf = bttv_querybuf,
3145 .vidioc_qbuf = bttv_qbuf,
3146 .vidioc_dqbuf = bttv_dqbuf,
3147 .vidioc_s_std = bttv_s_std,
3148 .vidioc_g_std = bttv_g_std,
3149 .vidioc_enum_input = bttv_enum_input,
3150 .vidioc_g_input = bttv_g_input,
3151 .vidioc_s_input = bttv_s_input,
3152 .vidioc_streamon = bttv_streamon,
3153 .vidioc_streamoff = bttv_streamoff,
3154 .vidioc_g_tuner = bttv_g_tuner,
3155 .vidioc_s_tuner = bttv_s_tuner,
3156 .vidioc_g_crop = bttv_g_crop,
3157 .vidioc_s_crop = bttv_s_crop,
3158 .vidioc_g_fbuf = bttv_g_fbuf,
3159 .vidioc_s_fbuf = bttv_s_fbuf,
3160 .vidioc_overlay = bttv_overlay,
3161 .vidioc_g_parm = bttv_g_parm,
3162 .vidioc_g_frequency = bttv_g_frequency,
3163 .vidioc_s_frequency = bttv_s_frequency,
3164 .vidioc_log_status = bttv_log_status,
3165 .vidioc_querystd = bttv_querystd,
3166 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
3167 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
3168#ifdef CONFIG_VIDEO_ADV_DEBUG
3169 .vidioc_g_register = bttv_g_register,
3170 .vidioc_s_register = bttv_s_register,
3171#endif
3172};
3173
3174static struct video_device bttv_video_template = {
3175 .fops = &bttv_fops,
3176 .ioctl_ops = &bttv_ioctl_ops,
3177 .tvnorms = BTTV_NORMS,
3178};
3179
3180
3181
3182
3183static int radio_open(struct file *file)
3184{
3185 struct video_device *vdev = video_devdata(file);
3186 struct bttv *btv = video_drvdata(file);
3187 struct bttv_fh *fh;
3188
3189 dprintk("open dev=%s\n", video_device_node_name(vdev));
3190
3191 dprintk("%d: open called (radio)\n", btv->c.nr);
3192
3193
3194 fh = kmalloc(sizeof(*fh), GFP_KERNEL);
3195 if (unlikely(!fh))
3196 return -ENOMEM;
3197 file->private_data = fh;
3198 *fh = btv->init;
3199 v4l2_fh_init(&fh->fh, vdev);
3200
3201 btv->radio_user++;
3202 audio_mute(btv, btv->mute);
3203
3204 v4l2_fh_add(&fh->fh);
3205
3206 return 0;
3207}
3208
3209static int radio_release(struct file *file)
3210{
3211 struct bttv_fh *fh = file->private_data;
3212 struct bttv *btv = fh->btv;
3213 struct saa6588_command cmd;
3214
3215 file->private_data = NULL;
3216 v4l2_fh_del(&fh->fh);
3217 v4l2_fh_exit(&fh->fh);
3218 kfree(fh);
3219
3220 btv->radio_user--;
3221
3222 bttv_call_all(btv, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
3223
3224 if (btv->radio_user == 0)
3225 btv->has_radio_tuner = 0;
3226 return 0;
3227}
3228
3229static int radio_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
3230{
3231 struct bttv_fh *fh = priv;
3232 struct bttv *btv = fh->btv;
3233
3234 if (0 != t->index)
3235 return -EINVAL;
3236 strcpy(t->name, "Radio");
3237 t->type = V4L2_TUNER_RADIO;
3238 radio_enable(btv);
3239
3240 bttv_call_all(btv, tuner, g_tuner, t);
3241
3242 if (btv->audio_mode_gpio)
3243 btv->audio_mode_gpio(btv, t, 0);
3244
3245 return 0;
3246}
3247
3248static int radio_s_tuner(struct file *file, void *priv,
3249 const struct v4l2_tuner *t)
3250{
3251 struct bttv_fh *fh = priv;
3252 struct bttv *btv = fh->btv;
3253
3254 if (0 != t->index)
3255 return -EINVAL;
3256
3257 radio_enable(btv);
3258 bttv_call_all(btv, tuner, s_tuner, t);
3259 return 0;
3260}
3261
3262static ssize_t radio_read(struct file *file, char __user *data,
3263 size_t count, loff_t *ppos)
3264{
3265 struct bttv_fh *fh = file->private_data;
3266 struct bttv *btv = fh->btv;
3267 struct saa6588_command cmd;
3268
3269 cmd.block_count = count / 3;
3270 cmd.nonblocking = file->f_flags & O_NONBLOCK;
3271 cmd.buffer = data;
3272 cmd.instance = file;
3273 cmd.result = -ENODEV;
3274 radio_enable(btv);
3275
3276 bttv_call_all(btv, core, ioctl, SAA6588_CMD_READ, &cmd);
3277
3278 return cmd.result;
3279}
3280
3281static unsigned int radio_poll(struct file *file, poll_table *wait)
3282{
3283 struct bttv_fh *fh = file->private_data;
3284 struct bttv *btv = fh->btv;
3285 unsigned long req_events = poll_requested_events(wait);
3286 struct saa6588_command cmd;
3287 unsigned int res = 0;
3288
3289 if (v4l2_event_pending(&fh->fh))
3290 res = POLLPRI;
3291 else if (req_events & POLLPRI)
3292 poll_wait(file, &fh->fh.wait, wait);
3293 radio_enable(btv);
3294 cmd.instance = file;
3295 cmd.event_list = wait;
3296 cmd.result = res;
3297 bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd);
3298
3299 return cmd.result;
3300}
3301
3302static const struct v4l2_file_operations radio_fops =
3303{
3304 .owner = THIS_MODULE,
3305 .open = radio_open,
3306 .read = radio_read,
3307 .release = radio_release,
3308 .unlocked_ioctl = video_ioctl2,
3309 .poll = radio_poll,
3310};
3311
3312static const struct v4l2_ioctl_ops radio_ioctl_ops = {
3313 .vidioc_querycap = bttv_querycap,
3314 .vidioc_log_status = bttv_log_status,
3315 .vidioc_g_tuner = radio_g_tuner,
3316 .vidioc_s_tuner = radio_s_tuner,
3317 .vidioc_g_frequency = bttv_g_frequency,
3318 .vidioc_s_frequency = bttv_s_frequency,
3319 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
3320 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
3321};
3322
3323static struct video_device radio_template = {
3324 .fops = &radio_fops,
3325 .ioctl_ops = &radio_ioctl_ops,
3326};
3327
3328
3329
3330
3331static int bttv_risc_decode(u32 risc)
3332{
3333 static char *instr[16] = {
3334 [ BT848_RISC_WRITE >> 28 ] = "write",
3335 [ BT848_RISC_SKIP >> 28 ] = "skip",
3336 [ BT848_RISC_WRITEC >> 28 ] = "writec",
3337 [ BT848_RISC_JUMP >> 28 ] = "jump",
3338 [ BT848_RISC_SYNC >> 28 ] = "sync",
3339 [ BT848_RISC_WRITE123 >> 28 ] = "write123",
3340 [ BT848_RISC_SKIP123 >> 28 ] = "skip123",
3341 [ BT848_RISC_WRITE1S23 >> 28 ] = "write1s23",
3342 };
3343 static int incr[16] = {
3344 [ BT848_RISC_WRITE >> 28 ] = 2,
3345 [ BT848_RISC_JUMP >> 28 ] = 2,
3346 [ BT848_RISC_SYNC >> 28 ] = 2,
3347 [ BT848_RISC_WRITE123 >> 28 ] = 5,
3348 [ BT848_RISC_SKIP123 >> 28 ] = 2,
3349 [ BT848_RISC_WRITE1S23 >> 28 ] = 3,
3350 };
3351 static char *bits[] = {
3352 "be0", "be1", "be2", "be3/resync",
3353 "set0", "set1", "set2", "set3",
3354 "clr0", "clr1", "clr2", "clr3",
3355 "irq", "res", "eol", "sol",
3356 };
3357 int i;
3358
3359 pr_cont("0x%08x [ %s", risc,
3360 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
3361 for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
3362 if (risc & (1 << (i + 12)))
3363 pr_cont(" %s", bits[i]);
3364 pr_cont(" count=%d ]\n", risc & 0xfff);
3365 return incr[risc >> 28] ? incr[risc >> 28] : 1;
3366}
3367
3368static void bttv_risc_disasm(struct bttv *btv,
3369 struct btcx_riscmem *risc)
3370{
3371 unsigned int i,j,n;
3372
3373 pr_info("%s: risc disasm: %p [dma=0x%08lx]\n",
3374 btv->c.v4l2_dev.name, risc->cpu, (unsigned long)risc->dma);
3375 for (i = 0; i < (risc->size >> 2); i += n) {
3376 pr_info("%s: 0x%lx: ",
3377 btv->c.v4l2_dev.name,
3378 (unsigned long)(risc->dma + (i<<2)));
3379 n = bttv_risc_decode(le32_to_cpu(risc->cpu[i]));
3380 for (j = 1; j < n; j++)
3381 pr_info("%s: 0x%lx: 0x%08x [ arg #%d ]\n",
3382 btv->c.v4l2_dev.name,
3383 (unsigned long)(risc->dma + ((i+j)<<2)),
3384 risc->cpu[i+j], j);
3385 if (0 == risc->cpu[i])
3386 break;
3387 }
3388}
3389
3390static void bttv_print_riscaddr(struct bttv *btv)
3391{
3392 pr_info(" main: %08llx\n", (unsigned long long)btv->main.dma);
3393 pr_info(" vbi : o=%08llx e=%08llx\n",
3394 btv->cvbi ? (unsigned long long)btv->cvbi->top.dma : 0,
3395 btv->cvbi ? (unsigned long long)btv->cvbi->bottom.dma : 0);
3396 pr_info(" cap : o=%08llx e=%08llx\n",
3397 btv->curr.top
3398 ? (unsigned long long)btv->curr.top->top.dma : 0,
3399 btv->curr.bottom
3400 ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3401 pr_info(" scr : o=%08llx e=%08llx\n",
3402 btv->screen ? (unsigned long long)btv->screen->top.dma : 0,
3403 btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3404 bttv_risc_disasm(btv, &btv->main);
3405}
3406
3407
3408
3409
3410static char *irq_name[] = {
3411 "FMTCHG",
3412 "VSYNC",
3413 "HSYNC",
3414 "OFLOW",
3415 "HLOCK",
3416 "VPRES",
3417 "6", "7",
3418 "I2CDONE",
3419 "GPINT",
3420 "10",
3421 "RISCI",
3422 "FBUS",
3423 "FTRGT",
3424 "FDSR",
3425 "PPERR",
3426 "RIPERR",
3427 "PABORT",
3428 "OCERR",
3429 "SCERR",
3430};
3431
3432static void bttv_print_irqbits(u32 print, u32 mark)
3433{
3434 unsigned int i;
3435
3436 pr_cont("bits:");
3437 for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3438 if (print & (1 << i))
3439 pr_cont(" %s", irq_name[i]);
3440 if (mark & (1 << i))
3441 pr_cont("*");
3442 }
3443}
3444
3445static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
3446{
3447 pr_warn("%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
3448 btv->c.nr,
3449 (unsigned long)btv->main.dma,
3450 (unsigned long)le32_to_cpu(btv->main.cpu[RISC_SLOT_O_VBI+1]),
3451 (unsigned long)le32_to_cpu(btv->main.cpu[RISC_SLOT_O_FIELD+1]),
3452 (unsigned long)rc);
3453
3454 if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
3455 pr_notice("%d: Oh, there (temporarily?) is no input signal. "
3456 "Ok, then this is harmless, don't worry ;)\n",
3457 btv->c.nr);
3458 return;
3459 }
3460 pr_notice("%d: Uhm. Looks like we have unusual high IRQ latencies\n",
3461 btv->c.nr);
3462 pr_notice("%d: Lets try to catch the culpit red-handed ...\n",
3463 btv->c.nr);
3464 dump_stack();
3465}
3466
3467static int
3468bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
3469{
3470 struct bttv_buffer *item;
3471
3472 memset(set,0,sizeof(*set));
3473
3474
3475 if (!list_empty(&btv->capture)) {
3476 set->frame_irq = 1;
3477 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3478 if (V4L2_FIELD_HAS_TOP(item->vb.field))
3479 set->top = item;
3480 if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3481 set->bottom = item;
3482
3483
3484 if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3485 (item->vb.queue.next != &btv->capture)) {
3486 item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514 if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3515 if (NULL == set->bottom &&
3516 V4L2_FIELD_BOTTOM == item->vb.field) {
3517 set->bottom = item;
3518 }
3519 if (NULL != set->top && NULL != set->bottom)
3520 set->top_irq = 2;
3521 }
3522 }
3523 }
3524
3525
3526 if (NULL != btv->screen) {
3527 if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3528 if (NULL == set->top && NULL == set->bottom) {
3529 set->top = btv->screen;
3530 set->bottom = btv->screen;
3531 }
3532 } else {
3533 if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3534 NULL == set->top) {
3535 set->top = btv->screen;
3536 }
3537 if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3538 NULL == set->bottom) {
3539 set->bottom = btv->screen;
3540 }
3541 }
3542 }
3543
3544 dprintk("%d: next set: top=%p bottom=%p [screen=%p,irq=%d,%d]\n",
3545 btv->c.nr, set->top, set->bottom,
3546 btv->screen, set->frame_irq, set->top_irq);
3547 return 0;
3548}
3549
3550static void
3551bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
3552 struct bttv_buffer_set *curr, unsigned int state)
3553{
3554 struct timeval ts;
3555
3556 v4l2_get_timestamp(&ts);
3557
3558 if (wakeup->top == wakeup->bottom) {
3559 if (NULL != wakeup->top && curr->top != wakeup->top) {
3560 if (irq_debug > 1)
3561 pr_debug("%d: wakeup: both=%p\n",
3562 btv->c.nr, wakeup->top);
3563 wakeup->top->vb.ts = ts;
3564 wakeup->top->vb.field_count = btv->field_count;
3565 wakeup->top->vb.state = state;
3566 wake_up(&wakeup->top->vb.done);
3567 }
3568 } else {
3569 if (NULL != wakeup->top && curr->top != wakeup->top) {
3570 if (irq_debug > 1)
3571 pr_debug("%d: wakeup: top=%p\n",
3572 btv->c.nr, wakeup->top);
3573 wakeup->top->vb.ts = ts;
3574 wakeup->top->vb.field_count = btv->field_count;
3575 wakeup->top->vb.state = state;
3576 wake_up(&wakeup->top->vb.done);
3577 }
3578 if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3579 if (irq_debug > 1)
3580 pr_debug("%d: wakeup: bottom=%p\n",
3581 btv->c.nr, wakeup->bottom);
3582 wakeup->bottom->vb.ts = ts;
3583 wakeup->bottom->vb.field_count = btv->field_count;
3584 wakeup->bottom->vb.state = state;
3585 wake_up(&wakeup->bottom->vb.done);
3586 }
3587 }
3588}
3589
3590static void
3591bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
3592 unsigned int state)
3593{
3594 struct timeval ts;
3595
3596 if (NULL == wakeup)
3597 return;
3598
3599 v4l2_get_timestamp(&ts);
3600 wakeup->vb.ts = ts;
3601 wakeup->vb.field_count = btv->field_count;
3602 wakeup->vb.state = state;
3603 wake_up(&wakeup->vb.done);
3604}
3605
3606static void bttv_irq_timeout(unsigned long data)
3607{
3608 struct bttv *btv = (struct bttv *)data;
3609 struct bttv_buffer_set old,new;
3610 struct bttv_buffer *ovbi;
3611 struct bttv_buffer *item;
3612 unsigned long flags;
3613
3614 if (bttv_verbose) {
3615 pr_info("%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
3616 btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
3617 btread(BT848_RISC_COUNT));
3618 bttv_print_irqbits(btread(BT848_INT_STAT),0);
3619 pr_cont("\n");
3620 }
3621
3622 spin_lock_irqsave(&btv->s_lock,flags);
3623
3624
3625 memset(&new,0,sizeof(new));
3626 old = btv->curr;
3627 ovbi = btv->cvbi;
3628 btv->curr = new;
3629 btv->cvbi = NULL;
3630 btv->loop_irq = 0;
3631 bttv_buffer_activate_video(btv, &new);
3632 bttv_buffer_activate_vbi(btv, NULL);
3633 bttv_set_dma(btv, 0);
3634
3635
3636 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_ERROR);
3637 bttv_irq_wakeup_vbi(btv, ovbi, VIDEOBUF_ERROR);
3638
3639
3640 while (!list_empty(&btv->capture)) {
3641 item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3642 list_del(&item->vb.queue);
3643 item->vb.state = VIDEOBUF_ERROR;
3644 wake_up(&item->vb.done);
3645 }
3646 while (!list_empty(&btv->vcapture)) {
3647 item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3648 list_del(&item->vb.queue);
3649 item->vb.state = VIDEOBUF_ERROR;
3650 wake_up(&item->vb.done);
3651 }
3652
3653 btv->errors++;
3654 spin_unlock_irqrestore(&btv->s_lock,flags);
3655}
3656
3657static void
3658bttv_irq_wakeup_top(struct bttv *btv)
3659{
3660 struct bttv_buffer *wakeup = btv->curr.top;
3661
3662 if (NULL == wakeup)
3663 return;
3664
3665 spin_lock(&btv->s_lock);
3666 btv->curr.top_irq = 0;
3667 btv->curr.top = NULL;
3668 bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3669
3670 v4l2_get_timestamp(&wakeup->vb.ts);
3671 wakeup->vb.field_count = btv->field_count;
3672 wakeup->vb.state = VIDEOBUF_DONE;
3673 wake_up(&wakeup->vb.done);
3674 spin_unlock(&btv->s_lock);
3675}
3676
3677static inline int is_active(struct btcx_riscmem *risc, u32 rc)
3678{
3679 if (rc < risc->dma)
3680 return 0;
3681 if (rc > risc->dma + risc->size)
3682 return 0;
3683 return 1;
3684}
3685
3686static void
3687bttv_irq_switch_video(struct bttv *btv)
3688{
3689 struct bttv_buffer_set new;
3690 struct bttv_buffer_set old;
3691 dma_addr_t rc;
3692
3693 spin_lock(&btv->s_lock);
3694
3695
3696 bttv_irq_next_video(btv, &new);
3697 rc = btread(BT848_RISC_COUNT);
3698 if ((btv->curr.top && is_active(&btv->curr.top->top, rc)) ||
3699 (btv->curr.bottom && is_active(&btv->curr.bottom->bottom, rc))) {
3700 btv->framedrop++;
3701 if (debug_latency)
3702 bttv_irq_debug_low_latency(btv, rc);
3703 spin_unlock(&btv->s_lock);
3704 return;
3705 }
3706
3707
3708 old = btv->curr;
3709 btv->curr = new;
3710 btv->loop_irq &= ~1;
3711 bttv_buffer_activate_video(btv, &new);
3712 bttv_set_dma(btv, 0);
3713
3714
3715 if (UNSET != btv->new_input) {
3716 video_mux(btv,btv->new_input);
3717 btv->new_input = UNSET;
3718 }
3719
3720
3721 bttv_irq_wakeup_video(btv, &old, &new, VIDEOBUF_DONE);
3722 spin_unlock(&btv->s_lock);
3723}
3724
3725static void
3726bttv_irq_switch_vbi(struct bttv *btv)
3727{
3728 struct bttv_buffer *new = NULL;
3729 struct bttv_buffer *old;
3730 u32 rc;
3731
3732 spin_lock(&btv->s_lock);
3733
3734 if (!list_empty(&btv->vcapture))
3735 new = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3736 old = btv->cvbi;
3737
3738 rc = btread(BT848_RISC_COUNT);
3739 if (NULL != old && (is_active(&old->top, rc) ||
3740 is_active(&old->bottom, rc))) {
3741 btv->framedrop++;
3742 if (debug_latency)
3743 bttv_irq_debug_low_latency(btv, rc);
3744 spin_unlock(&btv->s_lock);
3745 return;
3746 }
3747
3748
3749 btv->cvbi = new;
3750 btv->loop_irq &= ~4;
3751 bttv_buffer_activate_vbi(btv, new);
3752 bttv_set_dma(btv, 0);
3753
3754 bttv_irq_wakeup_vbi(btv, old, VIDEOBUF_DONE);
3755 spin_unlock(&btv->s_lock);
3756}
3757
3758static irqreturn_t bttv_irq(int irq, void *dev_id)
3759{
3760 u32 stat,astat;
3761 u32 dstat;
3762 int count;
3763 struct bttv *btv;
3764 int handled = 0;
3765
3766 btv=(struct bttv *)dev_id;
3767
3768 count=0;
3769 while (1) {
3770
3771 stat=btread(BT848_INT_STAT);
3772 astat=stat&btread(BT848_INT_MASK);
3773 if (!astat)
3774 break;
3775 handled = 1;
3776 btwrite(stat,BT848_INT_STAT);
3777
3778
3779 dstat=btread(BT848_DSTATUS);
3780
3781 if (irq_debug) {
3782 pr_debug("%d: irq loop=%d fc=%d riscs=%x, riscc=%08x, ",
3783 btv->c.nr, count, btv->field_count,
3784 stat>>28, btread(BT848_RISC_COUNT));
3785 bttv_print_irqbits(stat,astat);
3786 if (stat & BT848_INT_HLOCK)
3787 pr_cont(" HLOC => %s",
3788 dstat & BT848_DSTATUS_HLOC
3789 ? "yes" : "no");
3790 if (stat & BT848_INT_VPRES)
3791 pr_cont(" PRES => %s",
3792 dstat & BT848_DSTATUS_PRES
3793 ? "yes" : "no");
3794 if (stat & BT848_INT_FMTCHG)
3795 pr_cont(" NUML => %s",
3796 dstat & BT848_DSTATUS_NUML
3797 ? "625" : "525");
3798 pr_cont("\n");
3799 }
3800
3801 if (astat&BT848_INT_VSYNC)
3802 btv->field_count++;
3803
3804 if ((astat & BT848_INT_GPINT) && btv->remote) {
3805 bttv_input_irq(btv);
3806 }
3807
3808 if (astat & BT848_INT_I2CDONE) {
3809 btv->i2c_done = stat;
3810 wake_up(&btv->i2c_queue);
3811 }
3812
3813 if ((astat & BT848_INT_RISCI) && (stat & (4<<28)))
3814 bttv_irq_switch_vbi(btv);
3815
3816 if ((astat & BT848_INT_RISCI) && (stat & (2<<28)))
3817 bttv_irq_wakeup_top(btv);
3818
3819 if ((astat & BT848_INT_RISCI) && (stat & (1<<28)))
3820 bttv_irq_switch_video(btv);
3821
3822 if ((astat & BT848_INT_HLOCK) && btv->opt_automute)
3823
3824 audio_mux_gpio(btv, btv->audio_input, btv->mute);
3825
3826 if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
3827 pr_info("%d: %s%s @ %08x,",
3828 btv->c.nr,
3829 (astat & BT848_INT_SCERR) ? "SCERR" : "",
3830 (astat & BT848_INT_OCERR) ? "OCERR" : "",
3831 btread(BT848_RISC_COUNT));
3832 bttv_print_irqbits(stat,astat);
3833 pr_cont("\n");
3834 if (bttv_debug)
3835 bttv_print_riscaddr(btv);
3836 }
3837 if (fdsr && astat & BT848_INT_FDSR) {
3838 pr_info("%d: FDSR @ %08x\n",
3839 btv->c.nr, btread(BT848_RISC_COUNT));
3840 if (bttv_debug)
3841 bttv_print_riscaddr(btv);
3842 }
3843
3844 count++;
3845 if (count > 4) {
3846
3847 if (count > 8 || !(astat & BT848_INT_GPINT)) {
3848 btwrite(0, BT848_INT_MASK);
3849
3850 pr_err("%d: IRQ lockup, cleared int mask [",
3851 btv->c.nr);
3852 } else {
3853 pr_err("%d: IRQ lockup, clearing GPINT from int mask [",
3854 btv->c.nr);
3855
3856 btwrite(btread(BT848_INT_MASK) & (-1 ^ BT848_INT_GPINT),
3857 BT848_INT_MASK);
3858 }
3859
3860 bttv_print_irqbits(stat,astat);
3861
3862 pr_cont("]\n");
3863 }
3864 }
3865 btv->irq_total++;
3866 if (handled)
3867 btv->irq_me++;
3868 return IRQ_RETVAL(handled);
3869}
3870
3871
3872
3873
3874
3875static struct video_device *vdev_init(struct bttv *btv,
3876 const struct video_device *template,
3877 const char *type_name)
3878{
3879 struct video_device *vfd;
3880
3881 vfd = video_device_alloc();
3882 if (NULL == vfd)
3883 return NULL;
3884 *vfd = *template;
3885 vfd->v4l2_dev = &btv->c.v4l2_dev;
3886 vfd->release = video_device_release;
3887 vfd->debug = bttv_debug;
3888 video_set_drvdata(vfd, btv);
3889 snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
3890 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
3891 type_name, bttv_tvcards[btv->c.type].name);
3892 if (btv->tuner_type == TUNER_ABSENT) {
3893 v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
3894 v4l2_disable_ioctl(vfd, VIDIOC_S_FREQUENCY);
3895 v4l2_disable_ioctl(vfd, VIDIOC_G_TUNER);
3896 v4l2_disable_ioctl(vfd, VIDIOC_S_TUNER);
3897 }
3898 return vfd;
3899}
3900
3901static void bttv_unregister_video(struct bttv *btv)
3902{
3903 if (btv->video_dev) {
3904 if (video_is_registered(btv->video_dev))
3905 video_unregister_device(btv->video_dev);
3906 else
3907 video_device_release(btv->video_dev);
3908 btv->video_dev = NULL;
3909 }
3910 if (btv->vbi_dev) {
3911 if (video_is_registered(btv->vbi_dev))
3912 video_unregister_device(btv->vbi_dev);
3913 else
3914 video_device_release(btv->vbi_dev);
3915 btv->vbi_dev = NULL;
3916 }
3917 if (btv->radio_dev) {
3918 if (video_is_registered(btv->radio_dev))
3919 video_unregister_device(btv->radio_dev);
3920 else
3921 video_device_release(btv->radio_dev);
3922 btv->radio_dev = NULL;
3923 }
3924}
3925
3926
3927static int bttv_register_video(struct bttv *btv)
3928{
3929 if (no_overlay > 0)
3930 pr_notice("Overlay support disabled\n");
3931
3932
3933 btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
3934
3935 if (NULL == btv->video_dev)
3936 goto err;
3937 if (video_register_device(btv->video_dev, VFL_TYPE_GRABBER,
3938 video_nr[btv->c.nr]) < 0)
3939 goto err;
3940 pr_info("%d: registered device %s\n",
3941 btv->c.nr, video_device_node_name(btv->video_dev));
3942 if (device_create_file(&btv->video_dev->dev,
3943 &dev_attr_card)<0) {
3944 pr_err("%d: device_create_file 'card' failed\n", btv->c.nr);
3945 goto err;
3946 }
3947
3948
3949 btv->vbi_dev = vdev_init(btv, &bttv_video_template, "vbi");
3950
3951 if (NULL == btv->vbi_dev)
3952 goto err;
3953 if (video_register_device(btv->vbi_dev, VFL_TYPE_VBI,
3954 vbi_nr[btv->c.nr]) < 0)
3955 goto err;
3956 pr_info("%d: registered device %s\n",
3957 btv->c.nr, video_device_node_name(btv->vbi_dev));
3958
3959 if (!btv->has_radio)
3960 return 0;
3961
3962 btv->radio_dev = vdev_init(btv, &radio_template, "radio");
3963 if (NULL == btv->radio_dev)
3964 goto err;
3965 btv->radio_dev->ctrl_handler = &btv->radio_ctrl_handler;
3966 if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,
3967 radio_nr[btv->c.nr]) < 0)
3968 goto err;
3969 pr_info("%d: registered device %s\n",
3970 btv->c.nr, video_device_node_name(btv->radio_dev));
3971
3972
3973 return 0;
3974
3975 err:
3976 bttv_unregister_video(btv);
3977 return -1;
3978}
3979
3980
3981
3982
3983static void pci_set_command(struct pci_dev *dev)
3984{
3985#if defined(__powerpc__)
3986 unsigned int cmd;
3987
3988 pci_read_config_dword(dev, PCI_COMMAND, &cmd);
3989 cmd = (cmd | PCI_COMMAND_MEMORY );
3990 pci_write_config_dword(dev, PCI_COMMAND, cmd);
3991#endif
3992}
3993
3994static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
3995{
3996 struct v4l2_frequency init_freq = {
3997 .tuner = 0,
3998 .type = V4L2_TUNER_ANALOG_TV,
3999 .frequency = 980,
4000 };
4001 int result;
4002 unsigned char lat;
4003 struct bttv *btv;
4004 struct v4l2_ctrl_handler *hdl;
4005
4006 if (bttv_num == BTTV_MAX)
4007 return -ENOMEM;
4008 pr_info("Bt8xx card found (%d)\n", bttv_num);
4009 bttvs[bttv_num] = btv = kzalloc(sizeof(*btv), GFP_KERNEL);
4010 if (btv == NULL) {
4011 pr_err("out of memory\n");
4012 return -ENOMEM;
4013 }
4014 btv->c.nr = bttv_num;
4015 snprintf(btv->c.v4l2_dev.name, sizeof(btv->c.v4l2_dev.name),
4016 "bttv%d", btv->c.nr);
4017
4018
4019 mutex_init(&btv->lock);
4020 spin_lock_init(&btv->s_lock);
4021 spin_lock_init(&btv->gpio_lock);
4022 init_waitqueue_head(&btv->i2c_queue);
4023 INIT_LIST_HEAD(&btv->c.subs);
4024 INIT_LIST_HEAD(&btv->capture);
4025 INIT_LIST_HEAD(&btv->vcapture);
4026
4027 init_timer(&btv->timeout);
4028 btv->timeout.function = bttv_irq_timeout;
4029 btv->timeout.data = (unsigned long)btv;
4030
4031 btv->i2c_rc = -1;
4032 btv->tuner_type = UNSET;
4033 btv->new_input = UNSET;
4034 btv->has_radio=radio[btv->c.nr];
4035
4036
4037 btv->c.pci = dev;
4038 btv->id = dev->device;
4039 if (pci_enable_device(dev)) {
4040 pr_warn("%d: Can't enable device\n", btv->c.nr);
4041 return -EIO;
4042 }
4043 if (pci_set_dma_mask(dev, DMA_BIT_MASK(32))) {
4044 pr_warn("%d: No suitable DMA available\n", btv->c.nr);
4045 return -EIO;
4046 }
4047 if (!request_mem_region(pci_resource_start(dev,0),
4048 pci_resource_len(dev,0),
4049 btv->c.v4l2_dev.name)) {
4050 pr_warn("%d: can't request iomem (0x%llx)\n",
4051 btv->c.nr,
4052 (unsigned long long)pci_resource_start(dev, 0));
4053 return -EBUSY;
4054 }
4055 pci_set_master(dev);
4056 pci_set_command(dev);
4057
4058 result = v4l2_device_register(&dev->dev, &btv->c.v4l2_dev);
4059 if (result < 0) {
4060 pr_warn("%d: v4l2_device_register() failed\n", btv->c.nr);
4061 goto fail0;
4062 }
4063 hdl = &btv->ctrl_handler;
4064 v4l2_ctrl_handler_init(hdl, 20);
4065 btv->c.v4l2_dev.ctrl_handler = hdl;
4066 v4l2_ctrl_handler_init(&btv->radio_ctrl_handler, 6);
4067
4068 btv->revision = dev->revision;
4069 pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
4070 pr_info("%d: Bt%d (rev %d) at %s, irq: %d, latency: %d, mmio: 0x%llx\n",
4071 bttv_num, btv->id, btv->revision, pci_name(dev),
4072 btv->c.pci->irq, lat,
4073 (unsigned long long)pci_resource_start(dev, 0));
4074 schedule();
4075
4076 btv->bt848_mmio = ioremap(pci_resource_start(dev, 0), 0x1000);
4077 if (NULL == btv->bt848_mmio) {
4078 pr_err("%d: ioremap() failed\n", btv->c.nr);
4079 result = -EIO;
4080 goto fail1;
4081 }
4082
4083
4084 bttv_idcard(btv);
4085
4086
4087 btwrite(0, BT848_INT_MASK);
4088 result = request_irq(btv->c.pci->irq, bttv_irq,
4089 IRQF_SHARED, btv->c.v4l2_dev.name, (void *)btv);
4090 if (result < 0) {
4091 pr_err("%d: can't get IRQ %d\n",
4092 bttv_num, btv->c.pci->irq);
4093 goto fail1;
4094 }
4095
4096 if (0 != bttv_handle_chipset(btv)) {
4097 result = -EIO;
4098 goto fail2;
4099 }
4100
4101
4102 btv->opt_combfilter = combfilter;
4103 bttv_ctrl_combfilter.def = combfilter;
4104 bttv_ctrl_lumafilter.def = lumafilter;
4105 btv->opt_automute = automute;
4106 bttv_ctrl_automute.def = automute;
4107 bttv_ctrl_agc_crush.def = agc_crush;
4108 btv->opt_vcr_hack = vcr_hack;
4109 bttv_ctrl_vcr_hack.def = vcr_hack;
4110 bttv_ctrl_whitecrush_upper.def = whitecrush_upper;
4111 bttv_ctrl_whitecrush_lower.def = whitecrush_lower;
4112 btv->opt_uv_ratio = uv_ratio;
4113 bttv_ctrl_uv_ratio.def = uv_ratio;
4114 bttv_ctrl_full_luma.def = full_luma_range;
4115 bttv_ctrl_coring.def = coring;
4116
4117
4118 btv->init.btv = btv;
4119 btv->init.ov.w.width = 320;
4120 btv->init.ov.w.height = 240;
4121 btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
4122 btv->init.width = 320;
4123 btv->init.height = 240;
4124 btv->init.ov.w.width = 320;
4125 btv->init.ov.w.height = 240;
4126 btv->init.ov.field = V4L2_FIELD_INTERLACED;
4127 btv->input = 0;
4128
4129 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4130 V4L2_CID_BRIGHTNESS, 0, 0xff00, 0x100, 32768);
4131 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4132 V4L2_CID_CONTRAST, 0, 0xff80, 0x80, 0x6c00);
4133 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4134 V4L2_CID_SATURATION, 0, 0xff80, 0x80, 32768);
4135 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4136 V4L2_CID_COLOR_KILLER, 0, 1, 1, 0);
4137 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4138 V4L2_CID_HUE, 0, 0xff00, 0x100, 32768);
4139 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4140 V4L2_CID_CHROMA_AGC, 0, 1, 1, !!chroma_agc);
4141 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4142 V4L2_CID_AUDIO_MUTE, 0, 1, 1, 0);
4143 if (btv->volume_gpio)
4144 v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
4145 V4L2_CID_AUDIO_VOLUME, 0, 0xff00, 0x100, 0xff00);
4146 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_combfilter, NULL);
4147 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_automute, NULL);
4148 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_lumafilter, NULL);
4149 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_agc_crush, NULL);
4150 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_vcr_hack, NULL);
4151 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_whitecrush_lower, NULL);
4152 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_whitecrush_upper, NULL);
4153 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_uv_ratio, NULL);
4154 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_full_luma, NULL);
4155 v4l2_ctrl_new_custom(hdl, &bttv_ctrl_coring, NULL);
4156
4157
4158 if (bttv_gpio)
4159 bttv_gpio_tracking(btv,"pre-init");
4160
4161 bttv_risc_init_main(btv);
4162 init_bt848(btv);
4163
4164
4165 btwrite(0x00, BT848_GPIO_REG_INP);
4166 btwrite(0x00, BT848_GPIO_OUT_EN);
4167 if (bttv_verbose)
4168 bttv_gpio_tracking(btv,"init");
4169
4170
4171 bttv_init_card1(btv);
4172
4173
4174 init_bttv_i2c(btv);
4175
4176
4177 bttv_init_card2(btv);
4178 bttv_init_tuner(btv);
4179 if (btv->tuner_type != TUNER_ABSENT) {
4180 bttv_set_frequency(btv, &init_freq);
4181 btv->radio_freq = 90500 * 16;
4182 }
4183 btv->std = V4L2_STD_PAL;
4184 init_irqreg(btv);
4185 if (!bttv_tvcards[btv->c.type].no_video)
4186 v4l2_ctrl_handler_setup(hdl);
4187 if (hdl->error) {
4188 result = hdl->error;
4189 goto fail2;
4190 }
4191
4192 audio_mute(btv, 1);
4193
4194
4195 if (!bttv_tvcards[btv->c.type].no_video) {
4196 v4l2_ctrl_add_handler(&btv->radio_ctrl_handler, hdl,
4197 v4l2_ctrl_radio_filter);
4198 if (btv->radio_ctrl_handler.error) {
4199 result = btv->radio_ctrl_handler.error;
4200 goto fail2;
4201 }
4202 set_input(btv, 0, btv->tvnorm);
4203 bttv_crop_reset(&btv->crop[0], btv->tvnorm);
4204 btv->crop[1] = btv->crop[0];
4205 disclaim_vbi_lines(btv);
4206 disclaim_video_lines(btv);
4207 bttv_register_video(btv);
4208 }
4209
4210
4211 if (bttv_tvcards[btv->c.type].has_dvb) {
4212 bttv_sub_add_device(&btv->c, "dvb");
4213 request_modules(btv);
4214 }
4215
4216 if (!disable_ir) {
4217 init_bttv_i2c_ir(btv);
4218 bttv_input_init(btv);
4219 }
4220
4221
4222 bttv_num++;
4223 return 0;
4224
4225fail2:
4226 free_irq(btv->c.pci->irq,btv);
4227
4228fail1:
4229 v4l2_ctrl_handler_free(&btv->ctrl_handler);
4230 v4l2_ctrl_handler_free(&btv->radio_ctrl_handler);
4231 v4l2_device_unregister(&btv->c.v4l2_dev);
4232
4233fail0:
4234 if (btv->bt848_mmio)
4235 iounmap(btv->bt848_mmio);
4236 release_mem_region(pci_resource_start(btv->c.pci,0),
4237 pci_resource_len(btv->c.pci,0));
4238 return result;
4239}
4240
4241static void bttv_remove(struct pci_dev *pci_dev)
4242{
4243 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4244 struct bttv *btv = to_bttv(v4l2_dev);
4245
4246 if (bttv_verbose)
4247 pr_info("%d: unloading\n", btv->c.nr);
4248
4249 if (bttv_tvcards[btv->c.type].has_dvb)
4250 flush_request_modules(btv);
4251
4252
4253 btand(~15, BT848_GPIO_DMA_CTL);
4254 btwrite(0, BT848_INT_MASK);
4255 btwrite(~0x0, BT848_INT_STAT);
4256 btwrite(0x0, BT848_GPIO_OUT_EN);
4257 if (bttv_gpio)
4258 bttv_gpio_tracking(btv,"cleanup");
4259
4260
4261 btv->shutdown=1;
4262 bttv_input_fini(btv);
4263 bttv_sub_del_devices(&btv->c);
4264
4265
4266 fini_bttv_i2c(btv);
4267
4268
4269 bttv_unregister_video(btv);
4270
4271
4272 v4l2_ctrl_handler_free(&btv->ctrl_handler);
4273 v4l2_ctrl_handler_free(&btv->radio_ctrl_handler);
4274 btcx_riscmem_free(btv->c.pci,&btv->main);
4275
4276
4277 free_irq(btv->c.pci->irq,btv);
4278 iounmap(btv->bt848_mmio);
4279 release_mem_region(pci_resource_start(btv->c.pci,0),
4280 pci_resource_len(btv->c.pci,0));
4281
4282 v4l2_device_unregister(&btv->c.v4l2_dev);
4283 bttvs[btv->c.nr] = NULL;
4284 kfree(btv);
4285
4286 return;
4287}
4288
4289#ifdef CONFIG_PM
4290static int bttv_suspend(struct pci_dev *pci_dev, pm_message_t state)
4291{
4292 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4293 struct bttv *btv = to_bttv(v4l2_dev);
4294 struct bttv_buffer_set idle;
4295 unsigned long flags;
4296
4297 dprintk("%d: suspend %d\n", btv->c.nr, state.event);
4298
4299
4300 spin_lock_irqsave(&btv->s_lock,flags);
4301 memset(&idle, 0, sizeof(idle));
4302 btv->state.video = btv->curr;
4303 btv->state.vbi = btv->cvbi;
4304 btv->state.loop_irq = btv->loop_irq;
4305 btv->curr = idle;
4306 btv->loop_irq = 0;
4307 bttv_buffer_activate_video(btv, &idle);
4308 bttv_buffer_activate_vbi(btv, NULL);
4309 bttv_set_dma(btv, 0);
4310 btwrite(0, BT848_INT_MASK);
4311 spin_unlock_irqrestore(&btv->s_lock,flags);
4312
4313
4314 btv->state.gpio_enable = btread(BT848_GPIO_OUT_EN);
4315 btv->state.gpio_data = gpio_read();
4316
4317
4318 pci_save_state(pci_dev);
4319 if (0 != pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state))) {
4320 pci_disable_device(pci_dev);
4321 btv->state.disabled = 1;
4322 }
4323 return 0;
4324}
4325
4326static int bttv_resume(struct pci_dev *pci_dev)
4327{
4328 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
4329 struct bttv *btv = to_bttv(v4l2_dev);
4330 unsigned long flags;
4331 int err;
4332
4333 dprintk("%d: resume\n", btv->c.nr);
4334
4335
4336 if (btv->state.disabled) {
4337 err=pci_enable_device(pci_dev);
4338 if (err) {
4339 pr_warn("%d: Can't enable device\n", btv->c.nr);
4340 return err;
4341 }
4342 btv->state.disabled = 0;
4343 }
4344 err=pci_set_power_state(pci_dev, PCI_D0);
4345 if (err) {
4346 pci_disable_device(pci_dev);
4347 pr_warn("%d: Can't enable device\n", btv->c.nr);
4348 btv->state.disabled = 1;
4349 return err;
4350 }
4351
4352 pci_restore_state(pci_dev);
4353
4354
4355 bttv_reinit_bt848(btv);
4356 gpio_inout(0xffffff, btv->state.gpio_enable);
4357 gpio_write(btv->state.gpio_data);
4358
4359
4360 spin_lock_irqsave(&btv->s_lock,flags);
4361 btv->curr = btv->state.video;
4362 btv->cvbi = btv->state.vbi;
4363 btv->loop_irq = btv->state.loop_irq;
4364 bttv_buffer_activate_video(btv, &btv->curr);
4365 bttv_buffer_activate_vbi(btv, btv->cvbi);
4366 bttv_set_dma(btv, 0);
4367 spin_unlock_irqrestore(&btv->s_lock,flags);
4368 return 0;
4369}
4370#endif
4371
4372static struct pci_device_id bttv_pci_tbl[] = {
4373 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT848), 0},
4374 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT849), 0},
4375 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT878), 0},
4376 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_BT879), 0},
4377 {PCI_VDEVICE(BROOKTREE, PCI_DEVICE_ID_FUSION879), 0},
4378 {0,}
4379};
4380
4381MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
4382
4383static struct pci_driver bttv_pci_driver = {
4384 .name = "bttv",
4385 .id_table = bttv_pci_tbl,
4386 .probe = bttv_probe,
4387 .remove = bttv_remove,
4388#ifdef CONFIG_PM
4389 .suspend = bttv_suspend,
4390 .resume = bttv_resume,
4391#endif
4392};
4393
4394static int __init bttv_init_module(void)
4395{
4396 int ret;
4397
4398 bttv_num = 0;
4399
4400 pr_info("driver version %s loaded\n", BTTV_VERSION);
4401 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
4402 gbuffers = 2;
4403 if (gbufsize > BTTV_MAX_FBUF)
4404 gbufsize = BTTV_MAX_FBUF;
4405 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
4406 if (bttv_verbose)
4407 pr_info("using %d buffers with %dk (%d pages) each for capture\n",
4408 gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
4409
4410 bttv_check_chipset();
4411
4412 ret = bus_register(&bttv_sub_bus_type);
4413 if (ret < 0) {
4414 pr_warn("bus_register error: %d\n", ret);
4415 return ret;
4416 }
4417 ret = pci_register_driver(&bttv_pci_driver);
4418 if (ret < 0)
4419 bus_unregister(&bttv_sub_bus_type);
4420
4421 return ret;
4422}
4423
4424static void __exit bttv_cleanup_module(void)
4425{
4426 pci_unregister_driver(&bttv_pci_driver);
4427 bus_unregister(&bttv_sub_bus_type);
4428}
4429
4430module_init(bttv_init_module);
4431module_exit(bttv_cleanup_module);
4432
4433
4434
4435
4436
4437
4438