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