Subversion Repositories shark

Rev

Rev 695 | Rev 701 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
170 giacomo 1
/*
2
    bttv - Bt848 frame grabber driver
428 giacomo 3
 
4
    Copyright (C) 1996,97,98 Ralph  Metzler <rjkm@thp.uni-koeln.de>
5
                           & Marcus Metzler <mocm@thp.uni-koeln.de>
6
    (c) 1999-2002 Gerd Knorr <kraxel@bytesex.org>
7
 
8
    some v4l2 code lines are taken from Justin's bttv2 driver which is
9
    (c) 2000 Justin Schoeman <justin@suntiger.ee.up.ac.za>
10
 
170 giacomo 11
    This program is free software; you can redistribute it and/or modify
12
    it under the terms of the GNU General Public License as published by
13
    the Free Software Foundation; either version 2 of the License, or
14
    (at your option) any later version.
428 giacomo 15
 
170 giacomo 16
    This program is distributed in the hope that it will be useful,
17
    but WITHOUT ANY WARRANTY; without even the implied warranty of
18
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
    GNU General Public License for more details.
428 giacomo 20
 
170 giacomo 21
    You should have received a copy of the GNU General Public License
22
    along with this program; if not, write to the Free Software
23
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
*/
25
 
428 giacomo 26
#include <linuxcomp.h>
170 giacomo 27
 
428 giacomo 28
#include <linux/init.h>
29
#include <linux/module.h>
30
#include <linux/delay.h>
31
#include <linux/errno.h>
32
#include <linux/fs.h>
33
#include <linux/kernel.h>
34
#include <linux/sched.h>
35
#include <linux/interrupt.h>
36
#include <linux/kdev_t.h>
170 giacomo 37
 
428 giacomo 38
#include <asm/io.h>
39
#include <asm/byteorder.h>
170 giacomo 40
 
428 giacomo 41
#include "drivers/bttvp.h"
170 giacomo 42
 
428 giacomo 43
unsigned int bttv_num;                  /* number of Bt848s in use */
44
struct bttv bttvs[BTTV_MAX];
170 giacomo 45
 
614 giacomo 46
unsigned int bttv_debug = 0;
428 giacomo 47
unsigned int bttv_verbose = 1;
614 giacomo 48
unsigned int bttv_gpio = 0;
170 giacomo 49
 
428 giacomo 50
/* config variables */
51
#ifdef __BIG_ENDIAN
170 giacomo 52
static unsigned int bigendian=1;
53
#else
54
static unsigned int bigendian=0;
55
#endif
56
static unsigned int radio[BTTV_MAX];
57
static unsigned int irq_debug = 0;
428 giacomo 58
static unsigned int gbuffers = 8;
59
static unsigned int gbufsize = 0x208000;
170 giacomo 60
 
541 giacomo 61
static int video_nr = -1;
62
static int radio_nr = -1;
516 giacomo 63
//static int vbi_nr = -1;
170 giacomo 64
 
428 giacomo 65
static unsigned int fdsr = 0;
170 giacomo 66
 
428 giacomo 67
/* options */
68
static unsigned int combfilter  = 0;
69
static unsigned int lumafilter  = 0;
70
static unsigned int automute    = 1;
71
static unsigned int chroma_agc  = 0;
72
static unsigned int adc_crush   = 1;
73
static unsigned int vcr_hack    = 0;
74
static unsigned int irq_iswitch = 0;
170 giacomo 75
 
428 giacomo 76
/* API features (turn on/off stuff for testing) */
77
static unsigned int sloppy     = 0;
78
static unsigned int v4l2       = 1;
170 giacomo 79
 
696 giacomo 80
static volatile unsigned int grab_task = -1;
170 giacomo 81
 
428 giacomo 82
/* insmod args */
83
MODULE_PARM(radio,"1-" __stringify(BTTV_MAX) "i");
84
MODULE_PARM_DESC(radio,"The TV card supports radio, default is 0 (no)");
85
MODULE_PARM(bigendian,"i");
86
MODULE_PARM_DESC(bigendian,"byte order of the framebuffer, default is native endian");
87
MODULE_PARM(bttv_verbose,"i");
88
MODULE_PARM_DESC(bttv_verbose,"verbose startup messages, default is 1 (yes)");
89
MODULE_PARM(bttv_gpio,"i");
90
MODULE_PARM_DESC(bttv_gpio,"log gpio changes, default is 0 (no)");
91
MODULE_PARM(bttv_debug,"i");
92
MODULE_PARM_DESC(bttv_debug,"debug messages, default is 0 (no)");
93
MODULE_PARM(irq_debug,"i");
94
MODULE_PARM_DESC(irq_debug,"irq handler debug messages, default is 0 (no)");
95
MODULE_PARM(gbuffers,"i");
96
MODULE_PARM_DESC(gbuffers,"number of capture buffers. range 2-32, default 8");
97
MODULE_PARM(gbufsize,"i");
98
MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 0x208000");
170 giacomo 99
 
428 giacomo 100
MODULE_PARM(video_nr,"i");
101
MODULE_PARM(radio_nr,"i");
102
MODULE_PARM(vbi_nr,"i");
170 giacomo 103
 
428 giacomo 104
MODULE_PARM(fdsr,"i");
170 giacomo 105
 
428 giacomo 106
MODULE_PARM(combfilter,"i");
107
MODULE_PARM(lumafilter,"i");
108
MODULE_PARM(automute,"i");
109
MODULE_PARM_DESC(automute,"mute audio on bad/missing video signal, default is 1 (yes)");
110
MODULE_PARM(chroma_agc,"i");
111
MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)");
112
MODULE_PARM(adc_crush,"i");
113
MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)");
114
MODULE_PARM(vcr_hack,"i");
115
MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)");
116
MODULE_PARM(irq_iswitch,"i");
117
MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler");
170 giacomo 118
 
428 giacomo 119
MODULE_PARM(sloppy,"i");
120
MODULE_PARM(v4l2,"i");
170 giacomo 121
 
428 giacomo 122
MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards");
123
MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr");
124
MODULE_LICENSE("GPL");
170 giacomo 125
 
428 giacomo 126
/* kernel args */
127
#ifndef MODULE
128
static int __init p_radio(char *str) { return bttv_parse(str,BTTV_MAX,radio); }
129
__setup("bttv.radio=", p_radio);
130
#endif
131
 
132
/* ----------------------------------------------------------------------- */
133
/* sysfs                                                                   */
516 giacomo 134
/*
428 giacomo 135
static ssize_t show_card(struct class_device *cd, char *buf)
170 giacomo 136
{
428 giacomo 137
        struct video_device *vfd = to_video_device(cd);
138
        struct bttv *btv = dev_get_drvdata(vfd->dev);
463 giacomo 139
        return sprintf26(buf, "%d\n", btv ? btv->type : UNSET);
170 giacomo 140
}
516 giacomo 141
*/
142
//static CLASS_DEVICE_ATTR(card, S_IRUGO, show_card, NULL);
170 giacomo 143
 
428 giacomo 144
/* ----------------------------------------------------------------------- */
145
/* static data                                                             */
146
 
147
/* special timing tables from conexant... */
148
static u8 SRAM_Table[][60] =
170 giacomo 149
{
428 giacomo 150
        /* PAL digital input over GPIO[7:0] */
151
        {
152
                45, // 45 bytes following
153
                0x36,0x11,0x01,0x00,0x90,0x02,0x05,0x10,0x04,0x16,
154
                0x12,0x05,0x11,0x00,0x04,0x12,0xC0,0x00,0x31,0x00,
155
                0x06,0x51,0x08,0x03,0x89,0x08,0x07,0xC0,0x44,0x00,
156
                0x81,0x01,0x01,0xA9,0x0D,0x02,0x02,0x50,0x03,0x37,
157
                0x37,0x00,0xAF,0x21,0x00
158
        },
159
        /* NTSC digital input over GPIO[7:0] */
160
        {
161
                51, // 51 bytes following
162
                0x0C,0xC0,0x00,0x00,0x90,0x02,0x03,0x10,0x03,0x06,
163
                0x10,0x04,0x12,0x12,0x05,0x02,0x13,0x04,0x19,0x00,
164
                0x04,0x39,0x00,0x06,0x59,0x08,0x03,0x83,0x08,0x07,
165
                0x03,0x50,0x00,0xC0,0x40,0x00,0x86,0x01,0x01,0xA6,
166
                0x0D,0x02,0x03,0x11,0x01,0x05,0x37,0x00,0xAC,0x21,
167
                0x00,
168
        },
169
        // TGB_NTSC392 // quartzsight
170
        // This table has been modified to be used for Fusion Rev D
171
        {
172
                0x2A, // size of table = 42
173
                0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
174
                0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
175
                0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
176
                0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
177
                0x20, 0x00
178
        }
179
};
170 giacomo 180
 
428 giacomo 181
const struct bttv_tvnorm bttv_tvnorms[] = {
182
        /* PAL-BDGHI */
183
        /* max. active video is actually 922, but 924 is divisible by 4 and 3! */
184
        /* actually, max active PAL with HSCALE=0 is 948, NTSC is 768 - nil */
185
        {
186
                .v4l2_id        = V4L2_STD_PAL,
187
                .name           = "PAL",
188
                .Fsc            = 35468950,
189
                .swidth         = 924,
190
                .sheight        = 576,
191
                .totalwidth     = 1135,
192
                .adelay         = 0x7f,
193
                .bdelay         = 0x72,
194
                .iform          = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
195
                .scaledtwidth   = 1135,
196
                .hdelayx1       = 186,
197
                .hactivex1      = 924,
198
                .vdelay         = 0x20,
199
                .vbipack        = 255,
200
                .sram           = 0,
201
        },{
202
                .v4l2_id        = V4L2_STD_NTSC_M,
203
                .name           = "NTSC",
204
                .Fsc            = 28636363,
205
                .swidth         = 768,
206
                .sheight        = 480,
207
                .totalwidth     = 910,
208
                .adelay         = 0x68,
209
                .bdelay         = 0x5d,
210
                .iform          = (BT848_IFORM_NTSC|BT848_IFORM_XT0),
211
                .scaledtwidth   = 910,
212
                .hdelayx1       = 128,
213
                .hactivex1      = 910,
214
                .vdelay         = 0x1a,
215
                .vbipack        = 144,
216
                .sram           = 1,
217
        },{
218
                .v4l2_id        = V4L2_STD_SECAM,
219
                .name           = "SECAM",
220
                .Fsc            = 35468950,
221
                .swidth         = 924,
222
                .sheight        = 576,
223
                .totalwidth     = 1135,
224
                .adelay         = 0x7f,
225
                .bdelay         = 0xb0,
226
                .iform          = (BT848_IFORM_SECAM|BT848_IFORM_XT1),
227
                .scaledtwidth   = 1135,
228
                .hdelayx1       = 186,
229
                .hactivex1      = 922,
230
                .vdelay         = 0x20,
231
                .vbipack        = 255,
232
                .sram           = 0, /* like PAL, correct? */
233
        },{
234
                .v4l2_id        = V4L2_STD_PAL_Nc,
235
                .name           = "PAL-Nc",
236
                .Fsc            = 28636363,
237
                .swidth         = 640,
238
                .sheight        = 576,
239
                .totalwidth     = 910,
240
                .adelay         = 0x68,
241
                .bdelay         = 0x5d,
242
                .iform          = (BT848_IFORM_PAL_NC|BT848_IFORM_XT0),
243
                .scaledtwidth   = 780,
244
                .hdelayx1       = 130,
245
                .hactivex1      = 734,
246
                .vdelay         = 0x1a,
247
                .vbipack        = 144,
248
                .sram           = -1,
249
        },{
250
                .v4l2_id        = V4L2_STD_PAL_M,
251
                .name           = "PAL-M",
252
                .Fsc            = 28636363,
253
                .swidth         = 640,
254
                .sheight        = 480,
255
                .totalwidth     = 910,
256
                .adelay         = 0x68,
257
                .bdelay         = 0x5d,
258
                .iform          = (BT848_IFORM_PAL_M|BT848_IFORM_XT0),
259
                .scaledtwidth   = 780,
260
                .hdelayx1       = 135,
261
                .hactivex1      = 754,
262
                .vdelay         = 0x1a,
263
                .vbipack        = 144,
264
                .sram           = -1,
265
        },{
266
                .v4l2_id        = V4L2_STD_PAL_N,
267
                .name           = "PAL-N",
268
                .Fsc            = 35468950,
269
                .swidth         = 768,
270
                .sheight        = 576,
271
                .totalwidth     = 1135,
272
                .adelay         = 0x7f,
273
                .bdelay         = 0x72,
274
                .iform          = (BT848_IFORM_PAL_N|BT848_IFORM_XT1),
275
                .scaledtwidth   = 944,
276
                .hdelayx1       = 186,
277
                .hactivex1      = 922,
278
                .vdelay         = 0x20,
279
                .vbipack        = 144,
280
                .sram           = -1,
281
        },{
282
                .v4l2_id        = V4L2_STD_NTSC_M_JP,
283
                .name           = "NTSC-JP",
284
                .Fsc            = 28636363,
285
                .swidth         = 640,
286
                .sheight        = 480,
287
                .totalwidth     = 910,
288
                .adelay         = 0x68,
289
                .bdelay         = 0x5d,
290
                .iform          = (BT848_IFORM_NTSC_J|BT848_IFORM_XT0),
291
                .scaledtwidth   = 780,
292
                .hdelayx1       = 135,
293
                .hactivex1      = 754,
294
                .vdelay         = 0x16,
295
                .vbipack        = 144,
296
                .sram           = -1,
297
        },{
298
                /* that one hopefully works with the strange timing
299
                 * which video recorders produce when playing a NTSC
300
                 * tape on a PAL TV ... */
301
                .v4l2_id        = V4L2_STD_PAL_60,
302
                .name           = "PAL-60",
303
                .Fsc            = 35468950,
304
                .swidth         = 924,
305
                .sheight        = 480,
306
                .totalwidth     = 1135,
307
                .adelay         = 0x7f,
308
                .bdelay         = 0x72,
309
                .iform          = (BT848_IFORM_PAL_BDGHI|BT848_IFORM_XT1),
310
                .scaledtwidth   = 1135,
311
                .hdelayx1       = 186,
312
                .hactivex1      = 924,
313
                .vdelay         = 0x1a,
314
                .vbipack        = 255,
315
                .vtotal         = 524,
316
                .sram           = -1,
317
        }
318
};
319
const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
170 giacomo 320
 
428 giacomo 321
/* ----------------------------------------------------------------------- */
322
/* bttv format list
323
   packed pixel formats must come first */
324
const struct bttv_format bttv_formats[] = {
325
        {
326
                .name     = "8 bpp, gray",
327
                .palette  = VIDEO_PALETTE_GREY,
328
                .fourcc   = V4L2_PIX_FMT_GREY,
329
                .btformat = BT848_COLOR_FMT_Y8,
330
                .depth    = 8,
331
                .flags    = FORMAT_FLAGS_PACKED,
332
        },{
333
                .name     = "8 bpp, dithered color",
334
                .palette  = VIDEO_PALETTE_HI240,
335
                .fourcc   = V4L2_PIX_FMT_HI240,
336
                .btformat = BT848_COLOR_FMT_RGB8,
337
                .depth    = 8,
338
                .flags    = FORMAT_FLAGS_PACKED | FORMAT_FLAGS_DITHER,
339
        },{
340
                .name     = "15 bpp RGB, le",
341
                .palette  = VIDEO_PALETTE_RGB555,
342
                .fourcc   = V4L2_PIX_FMT_RGB555,
343
                .btformat = BT848_COLOR_FMT_RGB15,
344
                .depth    = 16,
345
                .flags    = FORMAT_FLAGS_PACKED,
346
        },{
347
                .name     = "15 bpp RGB, be",
348
                .palette  = -1,
349
                .fourcc   = V4L2_PIX_FMT_RGB555X,
350
                .btformat = BT848_COLOR_FMT_RGB15,
351
                .btswap   = 0x03, /* byteswap */
352
                .depth    = 16,
353
                .flags    = FORMAT_FLAGS_PACKED,
354
        },{
355
                .name     = "16 bpp RGB, le",
356
                .palette  = VIDEO_PALETTE_RGB565,
357
                .fourcc   = V4L2_PIX_FMT_RGB565,
358
                .btformat = BT848_COLOR_FMT_RGB16,
359
                .depth    = 16,
360
                .flags    = FORMAT_FLAGS_PACKED,
361
        },{
362
                .name     = "16 bpp RGB, be",
363
                .palette  = -1,
364
                .fourcc   = V4L2_PIX_FMT_RGB565X,
365
                .btformat = BT848_COLOR_FMT_RGB16,
366
                .btswap   = 0x03, /* byteswap */
367
                .depth    = 16,
368
                .flags    = FORMAT_FLAGS_PACKED,
369
        },{
370
                .name     = "24 bpp RGB, le",
371
                .palette  = VIDEO_PALETTE_RGB24,
372
                .fourcc   = V4L2_PIX_FMT_BGR24,
373
                .btformat = BT848_COLOR_FMT_RGB24,
374
                .depth    = 24,
375
                .flags    = FORMAT_FLAGS_PACKED,
376
        },{
377
                .name     = "32 bpp RGB, le",
378
                .palette  = VIDEO_PALETTE_RGB32,
379
                .fourcc   = V4L2_PIX_FMT_BGR32,
380
                .btformat = BT848_COLOR_FMT_RGB32,
381
                .depth    = 32,
382
                .flags    = FORMAT_FLAGS_PACKED,
383
        },{
384
                .name     = "32 bpp RGB, be",
385
                .palette  = -1,
386
                .fourcc   = V4L2_PIX_FMT_RGB32,
387
                .btformat = BT848_COLOR_FMT_RGB32,
388
                .btswap   = 0x0f, /* byte+word swap */
389
                .depth    = 32,
390
                .flags    = FORMAT_FLAGS_PACKED,
391
        },{
392
                .name     = "4:2:2, packed, YUYV",
393
                .palette  = VIDEO_PALETTE_YUV422,
394
                .fourcc   = V4L2_PIX_FMT_YUYV,
395
                .btformat = BT848_COLOR_FMT_YUY2,
396
                .depth    = 16,
397
                .flags    = FORMAT_FLAGS_PACKED,
398
        },{
399
                .name     = "4:2:2, packed, YUYV",
400
                .palette  = VIDEO_PALETTE_YUYV,
401
                .fourcc   = V4L2_PIX_FMT_YUYV,
402
                .btformat = BT848_COLOR_FMT_YUY2,
403
                .depth    = 16,
404
                .flags    = FORMAT_FLAGS_PACKED,
405
        },{
406
                .name     = "4:2:2, packed, UYVY",
407
                .palette  = VIDEO_PALETTE_UYVY,
408
                .fourcc   = V4L2_PIX_FMT_UYVY,
409
                .btformat = BT848_COLOR_FMT_YUY2,
410
                .btswap   = 0x03, /* byteswap */
411
                .depth    = 16,
412
                .flags    = FORMAT_FLAGS_PACKED,
413
        },{
414
                .name     = "4:2:2, planar, Y-Cb-Cr",
415
                .palette  = VIDEO_PALETTE_YUV422P,
416
                .fourcc   = V4L2_PIX_FMT_YUV422P,
417
                .btformat = BT848_COLOR_FMT_YCrCb422,
418
                .depth    = 16,
419
                .flags    = FORMAT_FLAGS_PLANAR,
420
                .hshift   = 1,
421
                .vshift   = 0,
422
        },{
423
                .name     = "4:2:0, planar, Y-Cb-Cr",
424
                .palette  = VIDEO_PALETTE_YUV420P,
425
                .fourcc   = V4L2_PIX_FMT_YUV420,
426
                .btformat = BT848_COLOR_FMT_YCrCb422,
427
                .depth    = 12,
428
                .flags    = FORMAT_FLAGS_PLANAR,
429
                .hshift   = 1,
430
                .vshift   = 1,
431
        },{
432
                .name     = "4:2:0, planar, Y-Cr-Cb",
433
                .palette  = -1,
434
                .fourcc   = V4L2_PIX_FMT_YVU420,
435
                .btformat = BT848_COLOR_FMT_YCrCb422,
436
                .depth    = 12,
437
                .flags    = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
438
                .hshift   = 1,
439
                .vshift   = 1,
440
        },{
441
                .name     = "4:1:1, planar, Y-Cb-Cr",
442
                .palette  = VIDEO_PALETTE_YUV411P,
443
                .fourcc   = V4L2_PIX_FMT_YUV411P,
444
                .btformat = BT848_COLOR_FMT_YCrCb411,
445
                .depth    = 12,
446
                .flags    = FORMAT_FLAGS_PLANAR,
447
                .hshift   = 2,
448
                .vshift   = 0,
449
        },{
450
                .name     = "4:1:0, planar, Y-Cb-Cr",
451
                .palette  = VIDEO_PALETTE_YUV410P,
452
                .fourcc   = V4L2_PIX_FMT_YUV410,
453
                .btformat = BT848_COLOR_FMT_YCrCb411,
454
                .depth    = 9,
455
                .flags    = FORMAT_FLAGS_PLANAR,
456
                .hshift   = 2,
457
                .vshift   = 2,
458
        },{
459
                .name     = "4:1:0, planar, Y-Cr-Cb",
460
                .palette  = -1,
461
                .fourcc   = V4L2_PIX_FMT_YVU410,
462
                .btformat = BT848_COLOR_FMT_YCrCb411,
463
                .depth    = 9,
464
                .flags    = FORMAT_FLAGS_PLANAR | FORMAT_FLAGS_CrCb,
465
                .hshift   = 2,
466
                .vshift   = 2,
467
        },{
468
                .name     = "raw scanlines",
469
                .palette  = VIDEO_PALETTE_RAW,
470
                .fourcc   = -1,
471
                .btformat = BT848_COLOR_FMT_RAW,
472
                .depth    = 8,
473
                .flags    = FORMAT_FLAGS_RAW,
474
        }
475
};
476
const unsigned int BTTV_FORMATS = ARRAY_SIZE(bttv_formats);
170 giacomo 477
 
428 giacomo 478
/* ----------------------------------------------------------------------- */
479
 
480
#define V4L2_CID_PRIVATE_CHROMA_AGC  (V4L2_CID_PRIVATE_BASE + 0)
481
#define V4L2_CID_PRIVATE_COMBFILTER  (V4L2_CID_PRIVATE_BASE + 1)
482
#define V4L2_CID_PRIVATE_AUTOMUTE    (V4L2_CID_PRIVATE_BASE + 2)
483
#define V4L2_CID_PRIVATE_LUMAFILTER  (V4L2_CID_PRIVATE_BASE + 3)
484
#define V4L2_CID_PRIVATE_AGC_CRUSH   (V4L2_CID_PRIVATE_BASE + 4)
485
#define V4L2_CID_PRIVATE_VCR_HACK    (V4L2_CID_PRIVATE_BASE + 5)
486
#define V4L2_CID_PRIVATE_LASTP1      (V4L2_CID_PRIVATE_BASE + 6)
487
 
488
static const struct v4l2_queryctrl no_ctl = {
489
        .name  = "42",
490
        .flags = V4L2_CTRL_FLAG_DISABLED,
491
};
492
static const struct v4l2_queryctrl bttv_ctls[] = {
493
        /* --- video --- */
494
        {
495
                .id            = V4L2_CID_BRIGHTNESS,
496
                .name          = "Brightness",
497
                .minimum       = 0,
498
                .maximum       = 65535,
499
                .step          = 256,
500
                .default_value = 32768,
501
                .type          = V4L2_CTRL_TYPE_INTEGER,
502
        },{
503
                .id            = V4L2_CID_CONTRAST,
504
                .name          = "Contrast",
505
                .minimum       = 0,
506
                .maximum       = 65535,
507
                .step          = 128,
508
                .default_value = 32768,
509
                .type          = V4L2_CTRL_TYPE_INTEGER,
510
        },{
511
                .id            = V4L2_CID_SATURATION,
512
                .name          = "Saturation",
513
                .minimum       = 0,
514
                .maximum       = 65535,
515
                .step          = 128,
516
                .default_value = 32768,
517
                .type          = V4L2_CTRL_TYPE_INTEGER,
518
        },{
519
                .id            = V4L2_CID_HUE,
520
                .name          = "Hue",
521
                .minimum       = 0,
522
                .maximum       = 65535,
523
                .step          = 256,
524
                .default_value = 32768,
525
                .type          = V4L2_CTRL_TYPE_INTEGER,
526
        },
527
        /* --- audio --- */
528
        {
529
                .id            = V4L2_CID_AUDIO_MUTE,
530
                .name          = "Mute",
531
                .minimum       = 0,
532
                .maximum       = 1,
533
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
534
        },{
535
                .id            = V4L2_CID_AUDIO_VOLUME,
536
                .name          = "Volume",
537
                .minimum       = 0,
538
                .maximum       = 65535,
539
                .step          = 65535/100,
540
                .default_value = 65535,
541
                .type          = V4L2_CTRL_TYPE_INTEGER,
542
        },{
543
                .id            = V4L2_CID_AUDIO_BALANCE,
544
                .name          = "Balance",
545
                .minimum       = 0,
546
                .maximum       = 65535,
547
                .step          = 65535/100,
548
                .default_value = 32768,
549
                .type          = V4L2_CTRL_TYPE_INTEGER,
550
        },{
551
                .id            = V4L2_CID_AUDIO_BASS,
552
                .name          = "Bass",
553
                .minimum       = 0,
554
                .maximum       = 65535,
555
                .step          = 65535/100,
556
                .default_value = 32768,
557
                .type          = V4L2_CTRL_TYPE_INTEGER,
558
        },{
559
                .id            = V4L2_CID_AUDIO_TREBLE,
560
                .name          = "Treble",
561
                .minimum       = 0,
562
                .maximum       = 65535,
563
                .step          = 65535/100,
564
                .default_value = 32768,
565
                .type          = V4L2_CTRL_TYPE_INTEGER,
566
        },
567
        /* --- private --- */
568
        {
569
                .id            = V4L2_CID_PRIVATE_CHROMA_AGC,
570
                .name          = "chroma agc",
571
                .minimum       = 0,
572
                .maximum       = 1,
573
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
574
        },{
575
                .id            = V4L2_CID_PRIVATE_COMBFILTER,
576
                .name          = "combfilter",
577
                .minimum       = 0,
578
                .maximum       = 1,
579
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
580
        },{
581
                .id            = V4L2_CID_PRIVATE_AUTOMUTE,
582
                .name          = "automute",
583
                .minimum       = 0,
584
                .maximum       = 1,
585
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
586
        },{
587
                .id            = V4L2_CID_PRIVATE_LUMAFILTER,
588
                .name          = "luma decimation filter",
589
                .minimum       = 0,
590
                .maximum       = 1,
591
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
592
        },{
593
                .id            = V4L2_CID_PRIVATE_AGC_CRUSH,
594
                .name          = "agc crush",
595
                .minimum       = 0,
596
                .maximum       = 1,
597
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
598
        },{
599
                .id            = V4L2_CID_PRIVATE_VCR_HACK,
600
                .name          = "vcr hack",
601
                .minimum       = 0,
602
                .maximum       = 1,
603
                .type          = V4L2_CTRL_TYPE_BOOLEAN,
604
        }
605
};
606
const int BTTV_CTLS = ARRAY_SIZE(bttv_ctls);
607
 
608
/* ----------------------------------------------------------------------- */
609
/* resource management                                                     */
610
 
611
static
612
int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit)
170 giacomo 613
{
428 giacomo 614
        if (fh->resources & bit)
615
                /* have it already allocated */
616
                return 1;
170 giacomo 617
 
428 giacomo 618
        /* is it free? */
480 giacomo 619
        //down(&btv->reslock);
428 giacomo 620
        if (btv->resources & bit) {
621
                /* no, someone else uses it */
480 giacomo 622
                //up(&btv->reslock);
428 giacomo 623
                return 0;
624
        }
625
        /* it's free, grab it */
626
        fh->resources  |= bit;
627
        btv->resources |= bit;
480 giacomo 628
        //up(&btv->reslock);
428 giacomo 629
        return 1;
630
}
170 giacomo 631
 
428 giacomo 632
static
633
int check_btres(struct bttv_fh *fh, int bit)
634
{
635
        return (fh->resources & bit);
170 giacomo 636
}
637
 
428 giacomo 638
static
639
int locked_btres(struct bttv *btv, int bit)
170 giacomo 640
{
428 giacomo 641
        return (btv->resources & bit);
170 giacomo 642
}
643
 
428 giacomo 644
static
645
void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
170 giacomo 646
{
428 giacomo 647
#if 1 /* DEBUG */
648
        if ((fh->resources & bits) != bits) {
649
                /* trying to free ressources not allocated by us ... */
650
                printk("bttv: BUG! (btres)\n");
651
        }
652
#endif
480 giacomo 653
        //down(&btv->reslock);
428 giacomo 654
        fh->resources  &= ~bits;
655
        btv->resources &= ~bits;
480 giacomo 656
        //up(&btv->reslock);
170 giacomo 657
}
658
 
428 giacomo 659
/* ----------------------------------------------------------------------- */
660
/* If Bt848a or Bt849, use PLL for PAL/SECAM and crystal for NTSC          */
170 giacomo 661
 
662
/* Frequency = (F_input / PLL_X) * PLL_I.PLL_F/PLL_C
663
   PLL_X = Reference pre-divider (0=1, 1=2)
664
   PLL_C = Post divider (0=6, 1=4)
665
   PLL_I = Integer input
666
   PLL_F = Fractional input
667
 
668
   F_input = 28.636363 MHz:
669
   PAL (CLKx2 = 35.46895 MHz): PLL_X = 1, PLL_I = 0x0E, PLL_F = 0xDCF9, PLL_C = 0
670
*/
671
 
672
static void set_pll_freq(struct bttv *btv, unsigned int fin, unsigned int fout)
673
{
674
        unsigned char fl, fh, fi;
675
 
676
        /* prevent overflows */
677
        fin/=4;
678
        fout/=4;
679
 
680
        fout*=12;
681
        fi=fout/fin;
682
 
683
        fout=(fout%fin)*256;
684
        fh=fout/fin;
685
 
686
        fout=(fout%fin)*256;
687
        fl=fout/fin;
688
 
689
        btwrite(fl, BT848_PLL_F_LO);
690
        btwrite(fh, BT848_PLL_F_HI);
691
        btwrite(fi|BT848_PLL_X, BT848_PLL_XCI);
692
}
693
 
428 giacomo 694
static void set_pll(struct bttv *btv)
170 giacomo 695
{
696
        int i;
697
 
698
        if (!btv->pll.pll_crystal)
428 giacomo 699
                return;
170 giacomo 700
 
428 giacomo 701
        if (btv->pll.pll_ofreq == btv->pll.pll_current) {
702
                dprintk("bttv%d: PLL: no change required\n",btv->nr);
703
                return;
704
        }
705
 
170 giacomo 706
        if (btv->pll.pll_ifreq == btv->pll.pll_ofreq) {
707
                /* no PLL needed */
428 giacomo 708
                if (btv->pll.pll_current == 0)
709
                        return;
710
                vprintk(KERN_INFO "bttv%d: PLL can sleep, using XTAL (%d).\n",
711
                        btv->nr,btv->pll.pll_ifreq);
170 giacomo 712
                btwrite(0x00,BT848_TGCTRL);
713
                btwrite(0x00,BT848_PLL_XCI);
714
                btv->pll.pll_current = 0;
428 giacomo 715
                return;
170 giacomo 716
        }
717
 
428 giacomo 718
        vprintk(KERN_INFO "bttv%d: PLL: %d => %d ",btv->nr,
719
                btv->pll.pll_ifreq, btv->pll.pll_ofreq);
170 giacomo 720
        set_pll_freq(btv, btv->pll.pll_ifreq, btv->pll.pll_ofreq);
721
 
428 giacomo 722
        for (i=0; i<10; i++) {
723
                /*  Let other people run while the PLL stabilizes */
724
                vprintk(".");
491 giacomo 725
                //current->state = TASK_INTERRUPTIBLE;
726
                //schedule_timeout(HZ/10);
428 giacomo 727
 
728
                if (btread(BT848_DSTATUS) & BT848_DSTATUS_PLOCK) {
729
                        btwrite(0,BT848_DSTATUS);
730
                } else {
170 giacomo 731
                        btwrite(0x08,BT848_TGCTRL);
732
                        btv->pll.pll_current = btv->pll.pll_ofreq;
428 giacomo 733
                        vprintk(" ok\n");
734
                        return;
170 giacomo 735
                }
736
        }
428 giacomo 737
        btv->pll.pll_current = -1;
738
        vprintk("failed\n");
739
        return;
170 giacomo 740
}
741
 
428 giacomo 742
/* used to switch between the bt848's analog/digital video capture modes */
743
void bt848A_set_timing(struct bttv *btv)
170 giacomo 744
{
428 giacomo 745
        int i, len;
746
        int table_idx = bttv_tvnorms[btv->tvnorm].sram;
747
        int fsc       = bttv_tvnorms[btv->tvnorm].Fsc;
748
 
749
        if (UNSET == bttv_tvcards[btv->type].muxsel[btv->input]) {
750
                dprintk("bttv%d: load digital timing table (table_idx=%d)\n",
751
                        btv->nr,table_idx);
752
 
753
                /* timing change...reset timing generator address */
754
                btwrite(0x00, BT848_TGCTRL);
755
                btwrite(0x02, BT848_TGCTRL);
756
                btwrite(0x00, BT848_TGCTRL);
757
 
758
                len=SRAM_Table[table_idx][0];
759
                for(i = 1; i <= len; i++)
760
                        btwrite(SRAM_Table[table_idx][i],BT848_TGLB);
761
                btv->pll.pll_ofreq = 27000000;
762
 
763
                set_pll(btv);
764
                btwrite(0x11, BT848_TGCTRL);
765
                btwrite(0x41, BT848_DVSIF);
766
        } else {
767
                btv->pll.pll_ofreq = fsc;
768
                set_pll(btv);
769
                btwrite(0x0, BT848_DVSIF);
770
        }
771
}
772
 
773
/* ----------------------------------------------------------------------- */
774
 
775
static void bt848_bright(struct bttv *btv, int bright)
776
{
777
        int value;
778
 
779
        btv->bright = bright;
780
 
781
        /* We want -128 to 127 we get 0-65535 */
782
        value = (bright >> 8) - 128;
783
        btwrite(value & 0xff, BT848_BRIGHT);
784
}
785
 
786
static void bt848_hue(struct bttv *btv, int hue)
787
{
788
        int value;
789
 
790
        btv->hue = hue;
791
 
792
        /* -128 to 127 */
793
        value = (hue >> 8) - 128;
794
        btwrite(value & 0xff, BT848_HUE);
795
}
796
 
797
static void bt848_contrast(struct bttv *btv, int cont)
798
{
799
        int value,hibit;
800
 
801
        btv->contrast = cont;
802
 
803
        /* 0-511 */
804
        value = (cont  >> 7);
805
        hibit = (value >> 6) & 4;
806
        btwrite(value & 0xff, BT848_CONTRAST_LO);
807
        btaor(hibit, ~4, BT848_E_CONTROL);
808
        btaor(hibit, ~4, BT848_O_CONTROL);
809
}
810
 
811
static void bt848_sat(struct bttv *btv, int color)
812
{
813
        int val_u,val_v,hibits;
814
 
815
        btv->saturation = color;
816
 
817
        /* 0-511 for the color */
818
        val_u   = color >> 7;
819
        val_v   = ((color>>7)*180L)/254;
820
        hibits  = (val_u >> 7) & 2;
821
        hibits |= (val_v >> 8) & 1;
822
        btwrite(val_u & 0xff, BT848_SAT_U_LO);
823
        btwrite(val_v & 0xff, BT848_SAT_V_LO);
824
        btaor(hibits, ~3, BT848_E_CONTROL);
825
        btaor(hibits, ~3, BT848_O_CONTROL);
826
}
827
 
828
/* ----------------------------------------------------------------------- */
829
 
830
static int
831
video_mux(struct bttv *btv, unsigned int input)
832
{
833
        int mux,mask2;
834
 
835
        if (input >= bttv_tvcards[btv->type].video_inputs)
836
                return -EINVAL;
837
 
170 giacomo 838
        /* needed by RemoteVideo MX */
428 giacomo 839
        mask2 = bttv_tvcards[btv->type].gpiomask2;
840
        if (mask2)
841
                btaor(mask2,~mask2,BT848_GPIO_OUT_EN);
170 giacomo 842
 
428 giacomo 843
        if (input == btv->svhs)  {
170 giacomo 844
                btor(BT848_CONTROL_COMP, BT848_E_CONTROL);
845
                btor(BT848_CONTROL_COMP, BT848_O_CONTROL);
428 giacomo 846
        } else {
170 giacomo 847
                btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
848
                btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
849
        }
428 giacomo 850
        mux = bttv_tvcards[btv->type].muxsel[input] & 3;
851
        btaor(mux<<5, ~(3<<5), BT848_IFORM);
852
        dprintk(KERN_DEBUG "bttv%d: video mux: input=%d mux=%d\n",
853
                btv->nr,input,mux);
170 giacomo 854
 
428 giacomo 855
        /* card specific hook */
856
        if(bttv_tvcards[btv->type].muxsel_hook)
857
                bttv_tvcards[btv->type].muxsel_hook (btv, input);
858
        return 0;
859
}
170 giacomo 860
 
428 giacomo 861
static char *audio_modes[] = {
862
        "audio: tuner", "audio: radio", "audio: extern",
863
        "audio: intern", "audio: off"
864
};
170 giacomo 865
 
428 giacomo 866
static int
867
audio_mux(struct bttv *btv, int mode)
868
{
869
        int val,mux,i2c_mux,signal;
870
 
871
        btaor(bttv_tvcards[btv->type].gpiomask,
872
              ~bttv_tvcards[btv->type].gpiomask,BT848_GPIO_OUT_EN);
873
        signal = btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC;
170 giacomo 874
 
428 giacomo 875
        switch (mode) {
876
        case AUDIO_MUTE:
877
                btv->audio |= AUDIO_MUTE;
878
                break;
879
        case AUDIO_UNMUTE:
880
                btv->audio &= ~AUDIO_MUTE;
881
                break;
882
        case AUDIO_TUNER:
883
        case AUDIO_RADIO:
884
        case AUDIO_EXTERN:
885
        case AUDIO_INTERN:
886
                btv->audio &= AUDIO_MUTE;
887
                btv->audio |= mode;
888
        }
889
        i2c_mux = mux = (btv->audio & AUDIO_MUTE) ? AUDIO_OFF : btv->audio;
890
        if (btv->opt_automute && !signal && !btv->radio_user)
891
                mux = AUDIO_OFF;
892
#if 0
893
        printk("bttv%d: amux: mode=%d audio=%d signal=%s mux=%d/%d irq=%s\n",
894
               btv->nr, mode, btv->audio, signal ? "yes" : "no",
895
               mux, i2c_mux, in_interrupt() ? "yes" : "no");
896
#endif
897
 
898
        val = bttv_tvcards[btv->type].audiomux[mux];
899
        btaor(val,~bttv_tvcards[btv->type].gpiomask, BT848_GPIO_DATA);
170 giacomo 900
        if (bttv_gpio)
428 giacomo 901
                bttv_gpio_tracking(btv,audio_modes[mux]);
902
        if (!in_interrupt())
903
                bttv_call_i2c_clients(btv,AUDC_SET_INPUT,&(i2c_mux));
904
        return 0;
905
}
170 giacomo 906
 
428 giacomo 907
static void
908
i2c_vidiocschan(struct bttv *btv)
909
{
910
        struct video_channel c;
911
 
912
        memset(&c,0,sizeof(c));
913
        c.norm    = btv->tvnorm;
914
        c.channel = btv->input;
915
        bttv_call_i2c_clients(btv,VIDIOCSCHAN,&c);
916
        if (btv->type == BTTV_VOODOOTV_FM)
917
                bttv_tda9880_setnorm(btv,c.norm);
170 giacomo 918
}
919
 
428 giacomo 920
static int
921
set_tvnorm(struct bttv *btv, unsigned int norm)
170 giacomo 922
{
428 giacomo 923
        const struct bttv_tvnorm *tvnorm;
170 giacomo 924
 
428 giacomo 925
        if (norm < 0 || norm >= BTTV_TVNORMS)
926
                return -EINVAL;
170 giacomo 927
 
428 giacomo 928
        btv->tvnorm = norm;
929
        tvnorm = &bttv_tvnorms[norm];
930
 
931
        btwrite(tvnorm->adelay, BT848_ADELAY);
932
        btwrite(tvnorm->bdelay, BT848_BDELAY);
933
        btaor(tvnorm->iform,~(BT848_IFORM_NORM|BT848_IFORM_XTBOTH),
934
              BT848_IFORM);
935
        btwrite(tvnorm->vbipack, BT848_VBI_PACK_SIZE);
936
        btwrite(1, BT848_VBI_PACK_DEL);
937
        bt848A_set_timing(btv);
938
 
939
        switch (btv->type) {
940
        case BTTV_VOODOOTV_FM:
941
                bttv_tda9880_setnorm(btv,norm);
942
                break;
170 giacomo 943
#if 0
428 giacomo 944
        case BTTV_OSPREY540:
945
                osprey_540_set_norm(btv,norm);
946
                break;
170 giacomo 947
#endif
428 giacomo 948
        }
949
        return 0;
950
}
170 giacomo 951
 
428 giacomo 952
static void
953
set_input(struct bttv *btv, unsigned int input)
170 giacomo 954
{
428 giacomo 955
        unsigned long flags;
956
 
957
        btv->input = input;
958
        if (irq_iswitch) {
959
                spin_lock_irqsave(&btv->s_lock,flags);
960
                if (btv->curr.irqflags) {
961
                        /* active capture -> delayed input switch */
962
                        btv->new_input = input;
963
                } else {
964
                        video_mux(btv,input);
965
                }
966
                spin_unlock_irqrestore(&btv->s_lock,flags);
967
        } else {
968
                video_mux(btv,input);
170 giacomo 969
        }
428 giacomo 970
        audio_mux(btv,(input == bttv_tvcards[btv->type].tuner ?
971
                       AUDIO_TUNER : AUDIO_EXTERN));
972
        set_tvnorm(btv,btv->tvnorm);
973
}
170 giacomo 974
 
428 giacomo 975
static void init_bt848(struct bttv *btv)
976
{
977
        int val;
978
 
979
        btwrite(0, BT848_SRESET);
980
        btwrite(0x00, BT848_CAP_CTL);
981
        btwrite(BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
982
        btwrite(BT848_IFORM_XTAUTO | BT848_IFORM_AUTO, BT848_IFORM);
983
 
984
        /* set planar and packed mode trigger points and         */
985
        /* set rising edge of inverted GPINTR pin as irq trigger */
986
        btwrite(BT848_GPIO_DMA_CTL_PKTP_32|
987
                BT848_GPIO_DMA_CTL_PLTP1_16|
988
                BT848_GPIO_DMA_CTL_PLTP23_16|
989
                BT848_GPIO_DMA_CTL_GPINTC|
990
                BT848_GPIO_DMA_CTL_GPINTI,
991
                BT848_GPIO_DMA_CTL);
992
 
993
        val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
994
        btwrite(val, BT848_E_SCLOOP);
995
        btwrite(val, BT848_O_SCLOOP);
996
 
997
        btwrite(0x20, BT848_E_VSCALE_HI);
998
        btwrite(0x20, BT848_O_VSCALE_HI);
999
        btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1000
                BT848_ADC);
1001
 
1002
        if (btv->opt_lumafilter) {
1003
                btwrite(0, BT848_E_CONTROL);
1004
                btwrite(0, BT848_O_CONTROL);
1005
        } else {
1006
                btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1007
                btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL);
170 giacomo 1008
        }
541 giacomo 1009
 
428 giacomo 1010
        btwrite(0xfffffUL, BT848_INT_STAT);
1011
        btwrite((btv->triton1)  |
1012
                BT848_INT_GPINT |
1013
                BT848_INT_SCERR |
1014
                (fdsr ? BT848_INT_FDSR : 0) |
1015
                BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES|
1016
                BT848_INT_FMTCHG|BT848_INT_HLOCK,
1017
                BT848_INT_MASK);
537 giacomo 1018
 
541 giacomo 1019
 
170 giacomo 1020
}
1021
 
428 giacomo 1022
extern void bttv_reinit_bt848(struct bttv *btv)
1023
{
1024
        unsigned long flags;
170 giacomo 1025
 
428 giacomo 1026
        if (bttv_verbose)
1027
                printk(KERN_INFO "bttv%d: reset, reinitialize\n",btv->nr);
1028
        spin_lock_irqsave(&btv->s_lock,flags);
1029
        btv->errors=0;
1030
        bttv_set_dma(btv,0,0);
1031
        spin_unlock_irqrestore(&btv->s_lock,flags);
170 giacomo 1032
 
428 giacomo 1033
        init_bt848(btv);
1034
        btv->pll.pll_current = -1;
1035
        set_input(btv,btv->input);
1036
}
1037
 
1038
static int get_control(struct bttv *btv, struct v4l2_control *c)
170 giacomo 1039
{
428 giacomo 1040
        struct video_audio va;
1041
        int i;
1042
 
1043
        for (i = 0; i < BTTV_CTLS; i++)
1044
                if (bttv_ctls[i].id == c->id)
1045
                        break;
1046
        if (i == BTTV_CTLS)
1047
                return -EINVAL;
1048
        if (i >= 4 && i <= 8) {
1049
                memset(&va,0,sizeof(va));
1050
                bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1051
                if (btv->audio_hook)
1052
                        btv->audio_hook(btv,&va,0);
1053
        }
1054
        switch (c->id) {
1055
        case V4L2_CID_BRIGHTNESS:
1056
                c->value = btv->bright;
1057
                break;
1058
        case V4L2_CID_HUE:
1059
                c->value = btv->hue;
1060
                break;
1061
        case V4L2_CID_CONTRAST:
1062
                c->value = btv->contrast;
1063
                break;
1064
        case V4L2_CID_SATURATION:
1065
                c->value = btv->saturation;
1066
                break;
170 giacomo 1067
 
428 giacomo 1068
        case V4L2_CID_AUDIO_MUTE:
1069
                c->value = (VIDEO_AUDIO_MUTE & va.flags) ? 1 : 0;
1070
                break;
1071
        case V4L2_CID_AUDIO_VOLUME:
1072
                c->value = va.volume;
1073
                break;
1074
        case V4L2_CID_AUDIO_BALANCE:
1075
                c->value = va.balance;
1076
                break;
1077
        case V4L2_CID_AUDIO_BASS:
1078
                c->value = va.bass;
1079
                break;
1080
        case V4L2_CID_AUDIO_TREBLE:
1081
                c->value = va.treble;
1082
                break;
170 giacomo 1083
 
428 giacomo 1084
        case V4L2_CID_PRIVATE_CHROMA_AGC:
1085
                c->value = btv->opt_chroma_agc;
1086
                break;
1087
        case V4L2_CID_PRIVATE_COMBFILTER:
1088
                c->value = btv->opt_combfilter;
1089
                break;
1090
        case V4L2_CID_PRIVATE_LUMAFILTER:
1091
                c->value = btv->opt_lumafilter;
1092
                break;
1093
        case V4L2_CID_PRIVATE_AUTOMUTE:
1094
                c->value = btv->opt_automute;
1095
                break;
1096
        case V4L2_CID_PRIVATE_AGC_CRUSH:
1097
                c->value = btv->opt_adc_crush;
1098
                break;
1099
        case V4L2_CID_PRIVATE_VCR_HACK:
1100
                c->value = btv->opt_vcr_hack;
1101
                break;
1102
        default:
1103
                return -EINVAL;
170 giacomo 1104
        }
1105
        return 0;
1106
}
1107
 
428 giacomo 1108
static int set_control(struct bttv *btv, struct v4l2_control *c)
170 giacomo 1109
{
428 giacomo 1110
        struct video_audio va;
1111
        int i,val;
170 giacomo 1112
 
428 giacomo 1113
        for (i = 0; i < BTTV_CTLS; i++)
1114
                if (bttv_ctls[i].id == c->id)
1115
                        break;
1116
        if (i == BTTV_CTLS)
1117
                return -EINVAL;
1118
        if (i >= 4 && i <= 8) {
1119
                memset(&va,0,sizeof(va));
1120
                bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1121
                if (btv->audio_hook)
1122
                        btv->audio_hook(btv,&va,0);
170 giacomo 1123
        }
428 giacomo 1124
        switch (c->id) {
1125
        case V4L2_CID_BRIGHTNESS:
1126
                bt848_bright(btv,c->value);
1127
                break;
1128
        case V4L2_CID_HUE:
1129
                bt848_hue(btv,c->value);
1130
                break;
1131
        case V4L2_CID_CONTRAST:
1132
                bt848_contrast(btv,c->value);
1133
                break;
1134
        case V4L2_CID_SATURATION:
1135
                bt848_sat(btv,c->value);
1136
                break;
1137
        case V4L2_CID_AUDIO_MUTE:
1138
                if (c->value) {
1139
                        va.flags |= VIDEO_AUDIO_MUTE;
1140
                        audio_mux(btv, AUDIO_MUTE);
1141
                } else {
1142
                        va.flags &= ~VIDEO_AUDIO_MUTE;
1143
                        audio_mux(btv, AUDIO_UNMUTE);
170 giacomo 1144
                }
428 giacomo 1145
                break;
170 giacomo 1146
 
428 giacomo 1147
        case V4L2_CID_AUDIO_VOLUME:
1148
                va.volume = c->value;
1149
                break;
1150
        case V4L2_CID_AUDIO_BALANCE:
1151
                va.balance = c->value;
1152
                break;
1153
        case V4L2_CID_AUDIO_BASS:
1154
                va.bass = c->value;
1155
                break;
1156
        case V4L2_CID_AUDIO_TREBLE:
1157
                va.treble = c->value;
1158
                break;
170 giacomo 1159
 
428 giacomo 1160
        case V4L2_CID_PRIVATE_CHROMA_AGC:
1161
                btv->opt_chroma_agc = c->value;
1162
                val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0;
1163
                btwrite(val, BT848_E_SCLOOP);
1164
                btwrite(val, BT848_O_SCLOOP);
1165
                break;
1166
        case V4L2_CID_PRIVATE_COMBFILTER:
1167
                btv->opt_combfilter = c->value;
1168
                break;
1169
        case V4L2_CID_PRIVATE_LUMAFILTER:
1170
                btv->opt_lumafilter = c->value;
1171
                if (btv->opt_lumafilter) {
1172
                        btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL);
1173
                        btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL);
1174
                } else {
1175
                        btor(BT848_CONTROL_LDEC, BT848_E_CONTROL);
1176
                        btor(BT848_CONTROL_LDEC, BT848_O_CONTROL);
170 giacomo 1177
                }
428 giacomo 1178
                break;
1179
        case V4L2_CID_PRIVATE_AUTOMUTE:
1180
                btv->opt_automute = c->value;
1181
                break;
1182
        case V4L2_CID_PRIVATE_AGC_CRUSH:
1183
                btv->opt_adc_crush = c->value;
1184
                btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0),
1185
                        BT848_ADC);
1186
                break;
1187
        case V4L2_CID_PRIVATE_VCR_HACK:
1188
                btv->opt_vcr_hack = c->value;
1189
                break;
1190
        default:
1191
                return -EINVAL;
170 giacomo 1192
        }
428 giacomo 1193
        if (i >= 4 && i <= 8) {
1194
                bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
1195
                if (btv->audio_hook)
1196
                        btv->audio_hook(btv,&va,1);
1197
        }
170 giacomo 1198
        return 0;
1199
}
428 giacomo 1200
 
1201
/* ----------------------------------------------------------------------- */
1202
 
1203
void bttv_gpio_tracking(struct bttv *btv, char *comment)
170 giacomo 1204
{
428 giacomo 1205
        unsigned int outbits, data;
1206
        outbits = btread(BT848_GPIO_OUT_EN);
1207
        data    = btread(BT848_GPIO_DATA);
1208
        printk(KERN_DEBUG "bttv%d: gpio: en=%08x, out=%08x in=%08x [%s]\n",
1209
               btv->nr,outbits,data & outbits, data & ~outbits, comment);
1210
}
170 giacomo 1211
 
428 giacomo 1212
void bttv_field_count(struct bttv *btv)
1213
{
1214
        int need_count = 0;
170 giacomo 1215
 
428 giacomo 1216
        if (btv->users)
1217
                need_count++;
170 giacomo 1218
 
428 giacomo 1219
        if (need_count) {
1220
                /* start field counter */
1221
                btor(BT848_INT_VSYNC,BT848_INT_MASK);
1222
        } else {
1223
                /* stop field counter */
1224
                btand(~BT848_INT_VSYNC,BT848_INT_MASK);
1225
                btv->field_count = 0;
170 giacomo 1226
        }
1227
}
1228
 
428 giacomo 1229
static const struct bttv_format*
1230
format_by_palette(int palette)
170 giacomo 1231
{
428 giacomo 1232
        unsigned int i;
170 giacomo 1233
 
428 giacomo 1234
        for (i = 0; i < BTTV_FORMATS; i++) {
1235
                if (-1 == bttv_formats[i].palette)
1236
                        continue;
1237
                if (bttv_formats[i].palette == palette)
1238
                        return bttv_formats+i;
1239
        }
1240
        return NULL;
1241
}
170 giacomo 1242
 
428 giacomo 1243
static const struct bttv_format*
1244
format_by_fourcc(int fourcc)
1245
{
1246
        unsigned int i;
170 giacomo 1247
 
428 giacomo 1248
        for (i = 0; i < BTTV_FORMATS; i++) {
1249
                if (-1 == bttv_formats[i].fourcc)
1250
                        continue;
1251
                if (bttv_formats[i].fourcc == fourcc)
1252
                        return bttv_formats+i;
1253
        }
1254
        return NULL;
170 giacomo 1255
}
1256
 
428 giacomo 1257
/* ----------------------------------------------------------------------- */
1258
/* misc helpers                                                            */
1259
 
1260
static int
1261
bttv_switch_overlay(struct bttv *btv, struct bttv_fh *fh,
1262
                    struct bttv_buffer *new)
170 giacomo 1263
{
428 giacomo 1264
        struct bttv_buffer *old;
1265
        unsigned long flags;
1266
        int retval = 0;
170 giacomo 1267
 
607 giacomo 1268
        dprintk("switch_overlay: enter [new=%x]\n",(int)new);
428 giacomo 1269
        if (new)
1270
                new->vb.state = STATE_DONE;
1271
        spin_lock_irqsave(&btv->s_lock,flags);
1272
        old = btv->screen;
1273
        btv->screen = new;
1274
        bttv_set_dma(btv, 0x03, 1);
1275
        spin_unlock_irqrestore(&btv->s_lock,flags);
1276
        if (NULL == new)
1277
                free_btres(btv,fh,RESOURCE_OVERLAY);
1278
        if (NULL != old) {
607 giacomo 1279
                dprintk("switch_overlay: old=%x state is %d\n",(int)old,old->vb.state);
608 giacomo 1280
                bttv_dma_free(btv, old);
428 giacomo 1281
                kfree(old);
1282
        }
1283
        dprintk("switch_overlay: done\n");
1284
        return retval;
1285
}
170 giacomo 1286
 
428 giacomo 1287
/* ----------------------------------------------------------------------- */
1288
/* video4linux (1) interface                                               */
170 giacomo 1289
 
428 giacomo 1290
static int bttv_prepare_buffer(struct bttv *btv, struct bttv_buffer *buf,
1291
                               const struct bttv_format *fmt,
1292
                               unsigned int width, unsigned int height,
1293
                               enum v4l2_field field)
1294
{
1295
        int redo_dma_risc = 0;
1296
        int rc;
1297
 
1298
        /* check settings */
1299
        if (NULL == fmt)
1300
                return -EINVAL;
1301
        if (fmt->btformat == BT848_COLOR_FMT_RAW) {
1302
                width  = RAW_BPL;
1303
                height = RAW_LINES*2;
1304
                if (width*height > buf->vb.bsize)
1305
                        return -EINVAL;
1306
                buf->vb.size = buf->vb.bsize;
1307
        } else {
1308
                if (width  < 48 ||
1309
                    height < 32 ||
1310
                    width  > bttv_tvnorms[btv->tvnorm].swidth ||
1311
                    height > bttv_tvnorms[btv->tvnorm].sheight)
1312
                        return -EINVAL;
1313
                buf->vb.size = (width * height * fmt->depth) >> 3;
1314
                if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
1315
                        return -EINVAL;
170 giacomo 1316
        }
1317
 
428 giacomo 1318
        /* alloc + fill struct bttv_buffer (if changed) */
1319
        if (buf->vb.width != width || buf->vb.height != height ||
1320
            buf->vb.field != field ||
1321
            buf->tvnorm != btv->tvnorm || buf->fmt != fmt) {
1322
                buf->vb.width  = width;
1323
                buf->vb.height = height;
1324
                buf->vb.field  = field;
1325
                buf->tvnorm    = btv->tvnorm;
1326
                buf->fmt       = fmt;
1327
                redo_dma_risc = 1;
170 giacomo 1328
        }
1329
 
428 giacomo 1330
        /* alloc risc memory */
1331
        if (STATE_NEEDS_INIT == buf->vb.state) {
1332
                redo_dma_risc = 1;
1333
                if (0 != (rc = videobuf_iolock(btv->dev,&buf->vb,&btv->fbuf)))
1334
                        goto fail;
1335
        }
170 giacomo 1336
 
428 giacomo 1337
        if (redo_dma_risc)
1338
                if (0 != (rc = bttv_buffer_risc(btv,buf)))
1339
                        goto fail;
1340
 
1341
        buf->vb.state = STATE_PREPARED;
1342
        return 0;
1343
 
1344
 fail:
1345
        bttv_dma_free(btv,buf);
1346
        return rc;
170 giacomo 1347
}
1348
 
428 giacomo 1349
static int
1350
buffer_setup(struct file *file, unsigned int *count, unsigned int *size)
170 giacomo 1351
{
428 giacomo 1352
        struct bttv_fh *fh = file->private_data;
1353
 
1354
        *size = fh->fmt->depth*fh->width*fh->height >> 3;
1355
        if (0 == *count)
1356
                *count = gbuffers;
1357
        while (*size * *count > gbuffers * gbufsize)
1358
                (*count)--;
1359
        return 0;
1360
}
170 giacomo 1361
 
428 giacomo 1362
static int
1363
buffer_prepare(struct file *file, struct videobuf_buffer *vb,
1364
               enum v4l2_field field)
1365
{
1366
        struct bttv_buffer *buf = (struct bttv_buffer*)vb;
1367
        struct bttv_fh *fh = file->private_data;
170 giacomo 1368
 
428 giacomo 1369
        return bttv_prepare_buffer(fh->btv, buf, fh->fmt,
1370
                                   fh->width, fh->height, field);
170 giacomo 1371
}
1372
 
428 giacomo 1373
static void
1374
buffer_queue(struct file *file, struct videobuf_buffer *vb)
170 giacomo 1375
{
428 giacomo 1376
        struct bttv_buffer *buf = (struct bttv_buffer*)vb;
1377
        struct bttv_fh *fh = file->private_data;
170 giacomo 1378
 
428 giacomo 1379
        buf->vb.state = STATE_QUEUED;
1380
        list_add_tail(&buf->vb.queue,&fh->btv->capture);
1381
        bttv_set_dma(fh->btv, 0x03, 1);
1382
}
170 giacomo 1383
 
428 giacomo 1384
static void buffer_release(struct file *file, struct videobuf_buffer *vb)
1385
{
1386
        struct bttv_buffer *buf = (struct bttv_buffer*)vb;
1387
        struct bttv_fh *fh = file->private_data;
170 giacomo 1388
 
428 giacomo 1389
        bttv_dma_free(fh->btv,buf);
170 giacomo 1390
}
1391
 
428 giacomo 1392
static struct videobuf_queue_ops bttv_video_qops = {
1393
        .buf_setup    = buffer_setup,
1394
        .buf_prepare  = buffer_prepare,
1395
        .buf_queue    = buffer_queue,
1396
        .buf_release  = buffer_release,
170 giacomo 1397
};
1398
 
516 giacomo 1399
/*
428 giacomo 1400
static const char *v4l1_ioctls[] = {
1401
        "?", "CGAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT",
1402
        "CCAPTURE", "GWIN", "SWIN", "GFBUF", "SFBUF", "KEY", "GFREQ",
1403
        "SFREQ", "GAUDIO", "SAUDIO", "SYNC", "MCAPTURE", "GMBUF", "GUNIT",
1404
        "GCAPTURE", "SCAPTURE", "SPLAYMODE", "SWRITEMODE", "GPLAYINFO",
1405
        "SMICROCODE", "GVBIFMT", "SVBIFMT" };
516 giacomo 1406
*/
428 giacomo 1407
#define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
1408
 
1409
int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
170 giacomo 1410
{
428 giacomo 1411
        switch (cmd) {
1412
        case BTTV_VERSION:
1413
                return BTTV_VERSION_CODE;
170 giacomo 1414
 
428 giacomo 1415
        /* ***  v4l1  *** ************************************************ */
1416
        case VIDIOCGFREQ:
1417
        {
1418
                unsigned long *freq = arg;
1419
                *freq = btv->freq;
1420
                return 0;
170 giacomo 1421
        }
428 giacomo 1422
        case VIDIOCSFREQ:
1423
        {
1424
                unsigned long *freq = arg;
480 giacomo 1425
                //down(&btv->lock);
428 giacomo 1426
                btv->freq=*freq;
1427
                bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq);
1428
                if (btv->has_matchbox && btv->radio_user)
1429
                        tea5757_set_freq(btv,*freq);
480 giacomo 1430
                //up(&btv->lock);
428 giacomo 1431
                return 0;
170 giacomo 1432
        }
1433
 
428 giacomo 1434
        case VIDIOCGTUNER:
1435
        {
1436
                struct video_tuner *v = arg;
1437
 
1438
                if (UNSET == bttv_tvcards[btv->type].tuner)
1439
                        return -EINVAL;
1440
                if (v->tuner) /* Only tuner 0 */
1441
                        return -EINVAL;
1442
                strcpy(v->name, "Television");
1443
                v->rangelow  = 0;
1444
                v->rangehigh = 0x7FFFFFFF;
1445
                v->flags     = VIDEO_TUNER_PAL|VIDEO_TUNER_NTSC|VIDEO_TUNER_SECAM;
1446
                v->mode      = btv->tvnorm;
1447
                v->signal    = (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC) ? 0xFFFF : 0;
1448
                bttv_call_i2c_clients(btv,cmd,v);
1449
                return 0;
1450
        }
1451
        case VIDIOCSTUNER:
1452
        {
1453
                struct video_tuner *v = arg;
170 giacomo 1454
 
428 giacomo 1455
                if (v->tuner) /* Only tuner 0 */
1456
                        return -EINVAL;
1457
                if (v->mode >= BTTV_TVNORMS)
1458
                        return -EINVAL;
170 giacomo 1459
 
480 giacomo 1460
                //down(&btv->lock);
428 giacomo 1461
                set_tvnorm(btv,v->mode);
1462
                bttv_call_i2c_clients(btv,cmd,v);
480 giacomo 1463
                //up(&btv->lock);
428 giacomo 1464
                return 0;
1465
        }
1466
 
1467
        case VIDIOCGCHAN:
1468
        {
1469
                struct video_channel *v = arg;
1470
                unsigned int channel = v->channel;
170 giacomo 1471
 
428 giacomo 1472
                if (channel >= bttv_tvcards[btv->type].video_inputs)
1473
                        return -EINVAL;
1474
                v->tuners=0;
1475
                v->flags = VIDEO_VC_AUDIO;
1476
                v->type = VIDEO_TYPE_CAMERA;
1477
                v->norm = btv->tvnorm;
1478
                if (channel == bttv_tvcards[btv->type].tuner)  {
1479
                        strcpy(v->name,"Television");
1480
                        v->flags|=VIDEO_VC_TUNER;
1481
                        v->type=VIDEO_TYPE_TV;
1482
                        v->tuners=1;
1483
                } else if (channel == btv->svhs) {
1484
                        strcpy(v->name,"S-Video");
1485
                } else {
463 giacomo 1486
                        sprintf26(v->name,"Composite%d",channel);
428 giacomo 1487
                }
1488
                return 0;
1489
        }
1490
        case VIDIOCSCHAN:
1491
        {
1492
                struct video_channel *v = arg;
1493
                unsigned int channel = v->channel;
170 giacomo 1494
 
428 giacomo 1495
                if (channel >= bttv_tvcards[btv->type].video_inputs)
1496
                        return -EINVAL;
1497
                if (v->norm >= BTTV_TVNORMS)
1498
                        return -EINVAL;
480 giacomo 1499
                //down(&btv->lock);
428 giacomo 1500
                if (channel == btv->input &&
1501
                    v->norm == btv->tvnorm) {
1502
                        /* nothing to do */
480 giacomo 1503
                        //up(&btv->lock);
428 giacomo 1504
                        return 0;
1505
                }
170 giacomo 1506
 
428 giacomo 1507
                btv->tvnorm = v->norm;
1508
                set_input(btv,v->channel);
480 giacomo 1509
                //up(&btv->lock);
428 giacomo 1510
                return 0;
1511
        }
170 giacomo 1512
 
428 giacomo 1513
        case VIDIOCGAUDIO:
1514
        {
1515
                struct video_audio *v = arg;
170 giacomo 1516
 
428 giacomo 1517
                memset(v,0,sizeof(*v));
1518
                strcpy(v->name,"Television");
1519
                v->flags |= VIDEO_AUDIO_MUTABLE;
1520
                v->mode  = VIDEO_SOUND_MONO;
170 giacomo 1521
 
480 giacomo 1522
                //down(&btv->lock);
428 giacomo 1523
                bttv_call_i2c_clients(btv,cmd,v);
170 giacomo 1524
 
428 giacomo 1525
                /* card specific hooks */
1526
                if (btv->audio_hook)
1527
                        btv->audio_hook(btv,v,0);
170 giacomo 1528
 
480 giacomo 1529
                //up(&btv->lock);
428 giacomo 1530
                return 0;
1531
        }
1532
        case VIDIOCSAUDIO:
1533
        {
1534
                struct video_audio *v = arg;
1535
                unsigned int audio = v->audio;
170 giacomo 1536
 
428 giacomo 1537
                if (audio >= bttv_tvcards[btv->type].audio_inputs)
1538
                        return -EINVAL;
170 giacomo 1539
 
480 giacomo 1540
                //down(&btv->lock);
428 giacomo 1541
                audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : AUDIO_UNMUTE);
1542
                bttv_call_i2c_clients(btv,cmd,v);
170 giacomo 1543
 
428 giacomo 1544
                /* card specific hooks */
1545
                if (btv->audio_hook)
1546
                        btv->audio_hook(btv,v,1);
1547
 
480 giacomo 1548
                //up(&btv->lock);
428 giacomo 1549
                return 0;
1550
        }
170 giacomo 1551
 
428 giacomo 1552
        /* ***  v4l2  *** ************************************************ */
1553
        case VIDIOC_ENUMSTD:
1554
        {
1555
                struct v4l2_standard *e = arg;
1556
                unsigned int index = e->index;
1557
 
1558
                if (index >= BTTV_TVNORMS)
1559
                        return -EINVAL;
516 giacomo 1560
                //v4l2_video_std_construct(e, bttv_tvnorms[e->index].v4l2_id,
1561
                //                       bttv_tvnorms[e->index].name);
428 giacomo 1562
                e->index = index;
1563
                return 0;
1564
        }
1565
        case VIDIOC_G_STD:
1566
        {
1567
                v4l2_std_id *id = arg;
1568
                *id = bttv_tvnorms[btv->tvnorm].v4l2_id;
1569
                return 0;
1570
        }
1571
        case VIDIOC_S_STD:
1572
        {
1573
                v4l2_std_id *id = arg;
1574
                unsigned int i;
170 giacomo 1575
 
428 giacomo 1576
                for (i = 0; i < BTTV_TVNORMS; i++)
1577
                        if (*id & bttv_tvnorms[i].v4l2_id)
1578
                                break;
1579
                if (i == BTTV_TVNORMS)
1580
                        return -EINVAL;
170 giacomo 1581
 
480 giacomo 1582
                //down(&btv->lock);
428 giacomo 1583
                set_tvnorm(btv,i);
1584
                i2c_vidiocschan(btv);
480 giacomo 1585
                //up(&btv->lock);
428 giacomo 1586
                return 0;
1587
        }
1588
        case VIDIOC_QUERYSTD:
1589
        {
1590
                v4l2_std_id *id = arg;
1591
 
1592
                if (btread(BT848_DSTATUS) & BT848_DSTATUS_NUML)
1593
                        *id = V4L2_STD_625_50;
1594
                else
1595
                        *id = V4L2_STD_525_60;
1596
                return 0;
1597
        }
170 giacomo 1598
 
428 giacomo 1599
        case VIDIOC_ENUMINPUT:
1600
        {
1601
                struct v4l2_input *i = arg;
1602
                unsigned int n;
1603
 
1604
                n = i->index;
1605
                if (n >= bttv_tvcards[btv->type].video_inputs)
1606
                        return -EINVAL;
1607
                memset(i,0,sizeof(*i));
1608
                i->index    = n;
1609
                i->type     = V4L2_INPUT_TYPE_CAMERA;
1610
                i->audioset = 1;
1611
                if (i->index == bttv_tvcards[btv->type].tuner) {
463 giacomo 1612
                        sprintf26(i->name, "Television");
428 giacomo 1613
                        i->type  = V4L2_INPUT_TYPE_TUNER;
1614
                        i->tuner = 0;
1615
                } else if (i->index == btv->svhs) {
463 giacomo 1616
                        sprintf26(i->name, "S-Video");
428 giacomo 1617
                } else {
463 giacomo 1618
                        sprintf26(i->name,"Composite%d",i->index);
428 giacomo 1619
                }
1620
                if (i->index == btv->input) {
1621
                        __u32 dstatus = btread(BT848_DSTATUS);
1622
                        if (0 == (dstatus & BT848_DSTATUS_PRES))
1623
                                i->status |= V4L2_IN_ST_NO_SIGNAL;
1624
                        if (0 == (dstatus & BT848_DSTATUS_HLOC))
1625
                                i->status |= V4L2_IN_ST_NO_H_LOCK;
1626
                }
1627
                for (n = 0; n < BTTV_TVNORMS; n++)
1628
                        i->std |= bttv_tvnorms[n].v4l2_id;
1629
                return 0;
1630
        }
1631
        case VIDIOC_G_INPUT:
1632
        {
1633
                int *i = arg;
1634
                *i = btv->input;
1635
                return 0;
1636
        }
1637
        case VIDIOC_S_INPUT:
1638
        {
1639
                unsigned int *i = arg;
1640
 
1641
                if (*i > bttv_tvcards[btv->type].video_inputs)
1642
                        return -EINVAL;
480 giacomo 1643
                //down(&btv->lock);
428 giacomo 1644
                set_input(btv,*i);
1645
                i2c_vidiocschan(btv);
480 giacomo 1646
                //up(&btv->lock);
428 giacomo 1647
                return 0;
1648
        }
1649
 
1650
        case VIDIOC_G_TUNER:
1651
        {
1652
                struct v4l2_tuner *t = arg;
170 giacomo 1653
 
428 giacomo 1654
                if (UNSET == bttv_tvcards[btv->type].tuner)
1655
                        return -EINVAL;
1656
                if (0 != t->index)
1657
                        return -EINVAL;
480 giacomo 1658
                //down(&btv->lock);
428 giacomo 1659
                memset(t,0,sizeof(*t));
1660
                strcpy(t->name, "Television");
1661
                t->type       = V4L2_TUNER_ANALOG_TV;
1662
                t->rangehigh  = 0xffffffffUL;
1663
                t->capability = V4L2_TUNER_CAP_NORM;
1664
                t->rxsubchans = V4L2_TUNER_SUB_MONO;
1665
                if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
1666
                        t->signal = 0xffff;
1667
                {
1668
                        /* Hmmm ... */
1669
                        struct video_audio va;
1670
                        memset(&va, 0, sizeof(struct video_audio));
1671
                        bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1672
                        if (btv->audio_hook)
1673
                                btv->audio_hook(btv,&va,0);
1674
                        if(va.mode & VIDEO_SOUND_STEREO) {
1675
                                t->audmode     = V4L2_TUNER_MODE_STEREO;
1676
                                t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
1677
                        }
1678
                        if(va.mode & VIDEO_SOUND_LANG1) {
1679
                                t->audmode    = V4L2_TUNER_MODE_LANG1;
1680
                                t->rxsubchans = V4L2_TUNER_SUB_LANG1
1681
                                        | V4L2_TUNER_SUB_LANG2;
1682
                        }
1683
                }
1684
                /* FIXME: fill capability+audmode */
480 giacomo 1685
                //up(&btv->lock);
428 giacomo 1686
                return 0;
1687
        }
1688
        case VIDIOC_S_TUNER:
1689
        {
1690
                struct v4l2_tuner *t = arg;
170 giacomo 1691
 
428 giacomo 1692
                if (UNSET == bttv_tvcards[btv->type].tuner)
1693
                        return -EINVAL;
1694
                if (0 != t->index)
1695
                        return -EINVAL;
480 giacomo 1696
                //down(&btv->lock);
428 giacomo 1697
                {
1698
                        struct video_audio va;
1699
                        memset(&va, 0, sizeof(struct video_audio));
1700
                        bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
1701
                        if (t->audmode == V4L2_TUNER_MODE_MONO)
1702
                                va.mode = VIDEO_SOUND_MONO;
1703
                        else if (t->audmode == V4L2_TUNER_MODE_STEREO)
1704
                                va.mode = VIDEO_SOUND_STEREO;
1705
                        else if (t->audmode == V4L2_TUNER_MODE_LANG1)
1706
                                va.mode = VIDEO_SOUND_LANG1;
1707
                        else if (t->audmode == V4L2_TUNER_MODE_LANG2)
1708
                                va.mode = VIDEO_SOUND_LANG2;
1709
                        bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
1710
                        if (btv->audio_hook)
1711
                                btv->audio_hook(btv,&va,1);
1712
                }
480 giacomo 1713
                //up(&btv->lock);
428 giacomo 1714
                return 0;
1715
        }
1716
 
1717
        case VIDIOC_G_FREQUENCY:
1718
        {
1719
                struct v4l2_frequency *f = arg;
1720
 
1721
                memset(f,0,sizeof(*f));
1722
                f->type = V4L2_TUNER_ANALOG_TV;
1723
                f->frequency = btv->freq;
1724
                return 0;
1725
        }
1726
        case VIDIOC_S_FREQUENCY:
1727
        {
1728
                struct v4l2_frequency *f = arg;
1729
 
1730
                if (unlikely(f->tuner != 0))
1731
                        return -EINVAL;
1732
                if (unlikely(f->type != V4L2_TUNER_ANALOG_TV))
1733
                        return -EINVAL;
480 giacomo 1734
                //down(&btv->lock);
428 giacomo 1735
                btv->freq = f->frequency;
1736
                bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq);
1737
                if (btv->has_matchbox && btv->radio_user)
1738
                        tea5757_set_freq(btv,btv->freq);
480 giacomo 1739
                //up(&btv->lock);
428 giacomo 1740
                return 0;
1741
        }
1742
 
1743
        default:
1744
                return -ENOIOCTLCMD;
1745
 
1746
        }
1747
        return 0;
170 giacomo 1748
}
1749
 
428 giacomo 1750
static int verify_window(const struct bttv_tvnorm *tvn,
1751
                         struct v4l2_window *win, int fixup)
170 giacomo 1752
{
428 giacomo 1753
        enum v4l2_field field;
1754
        int maxw, maxh;
170 giacomo 1755
 
428 giacomo 1756
        if (win->w.width  < 48 || win->w.height < 32)
1757
                return -EINVAL;
1758
        if (win->clipcount > 2048)
1759
                return -EINVAL;
170 giacomo 1760
 
428 giacomo 1761
        field = win->field;
1762
        maxw  = tvn->swidth;
1763
        maxh  = tvn->sheight;
170 giacomo 1764
 
428 giacomo 1765
        if (V4L2_FIELD_ANY == field) {
1766
                field = (win->w.height > maxh/2)
1767
                        ? V4L2_FIELD_INTERLACED
1768
                        : V4L2_FIELD_TOP;
1769
        }
1770
        switch (field) {
1771
        case V4L2_FIELD_TOP:
1772
        case V4L2_FIELD_BOTTOM:
1773
                maxh = maxh / 2;
1774
                break;
1775
        case V4L2_FIELD_INTERLACED:
1776
                break;
1777
        default:
1778
                return -EINVAL;
1779
        }
170 giacomo 1780
 
428 giacomo 1781
        if (!fixup && (win->w.width > maxw || win->w.height > maxh))
1782
                return -EINVAL;
170 giacomo 1783
 
428 giacomo 1784
        if (win->w.width > maxw)
1785
                win->w.width = maxw;
1786
        if (win->w.height > maxh)
1787
                win->w.height = maxh;
1788
        win->field = field;
1789
        return 0;
170 giacomo 1790
}
1791
 
428 giacomo 1792
static int setup_window(struct bttv_fh *fh, struct bttv *btv,
1793
                        struct v4l2_window *win, int fixup)
170 giacomo 1794
{
428 giacomo 1795
        struct v4l2_clip *clips = NULL;
1796
        int n,size,retval = 0;
170 giacomo 1797
 
428 giacomo 1798
        if (NULL == fh->ovfmt)
1799
                return -EINVAL;
1800
        retval = verify_window(&bttv_tvnorms[btv->tvnorm],win,fixup);
1801
        if (0 != retval)
1802
                return retval;
257 giacomo 1803
 
428 giacomo 1804
        /* copy clips  --  luckily v4l1 + v4l2 are binary
1805
           compatible here ...*/
1806
        n = win->clipcount;
1807
        size = sizeof(*clips)*(n+4);
1808
        clips = kmalloc(size,GFP_KERNEL);
1809
        if (NULL == clips)
1810
                return -ENOMEM;
1811
        if (n > 0) {
1812
                if (copy_from_user(clips,win->clips,sizeof(struct v4l2_clip)*n)) {
1813
                        kfree(clips);
1814
                        return -EFAULT;
1815
                }
1816
        }
541 giacomo 1817
 
428 giacomo 1818
        /* clip against screen */
1819
        if (NULL != btv->fbuf.base)
1820
                n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height,
1821
                                      &win->w, clips, n);
1822
        btcx_sort_clips(clips,n);
1823
 
1824
        /* 4-byte alignments */
1825
        switch (fh->ovfmt->depth) {
1826
        case 8:
1827
        case 24:
1828
                btcx_align(&win->w, clips, n, 3);
1829
                break;
1830
        case 16:
1831
                btcx_align(&win->w, clips, n, 1);
1832
                break;
1833
        case 32:
1834
                /* no alignment fixups needed */
1835
                break;
1836
        default:
1837
                BUG();
1838
        }
179 giacomo 1839
 
480 giacomo 1840
        //down(&fh->cap.lock);
428 giacomo 1841
        if (fh->ov.clips)
1842
                kfree(fh->ov.clips);
1843
        fh->ov.clips    = clips;
1844
        fh->ov.nclips   = n;
1845
 
1846
        fh->ov.w        = win->w;
1847
        fh->ov.field    = win->field;
1848
        fh->ov.setup_ok = 1;
1849
        btv->init.ov.w.width   = win->w.width;
1850
        btv->init.ov.w.height  = win->w.height;
1851
        btv->init.ov.field     = win->field;
1852
 
1853
        /* update overlay if needed */
1854
        retval = 0;
1855
        if (check_btres(fh, RESOURCE_OVERLAY)) {
1856
                struct bttv_buffer *new;
1857
 
1858
                new = videobuf_alloc(sizeof(*new));
1859
                bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
1860
                retval = bttv_switch_overlay(btv,fh,new);
1861
        }
541 giacomo 1862
 
480 giacomo 1863
        //up(&fh->cap.lock);
428 giacomo 1864
        return retval;
170 giacomo 1865
}
1866
 
428 giacomo 1867
/* ----------------------------------------------------------------------- */
170 giacomo 1868
 
428 giacomo 1869
static struct videobuf_queue* bttv_queue(struct bttv_fh *fh)
170 giacomo 1870
{
428 giacomo 1871
        struct videobuf_queue* q = NULL;
1872
 
1873
        switch (fh->type) {
1874
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1875
                q = &fh->cap;
1876
                break;
1877
        case V4L2_BUF_TYPE_VBI_CAPTURE:
1878
                q = &fh->vbi;
1879
                break;
1880
        default:
1881
                BUG();
1882
        }
1883
        return q;
170 giacomo 1884
}
1885
 
428 giacomo 1886
static int bttv_resource(struct bttv_fh *fh)
170 giacomo 1887
{
428 giacomo 1888
        int res = 0;
1889
 
1890
        switch (fh->type) {
1891
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1892
                res = RESOURCE_VIDEO;
1893
                break;
1894
        case V4L2_BUF_TYPE_VBI_CAPTURE:
1895
                res = RESOURCE_VBI;
1896
                break;
1897
        default:
1898
                BUG();
1899
        }
1900
        return res;
170 giacomo 1901
}
1902
 
428 giacomo 1903
static int bttv_switch_type(struct bttv_fh *fh, enum v4l2_buf_type type)
170 giacomo 1904
{
428 giacomo 1905
        struct videobuf_queue *q = bttv_queue(fh);
1906
        int res = bttv_resource(fh);
170 giacomo 1907
 
428 giacomo 1908
        if (check_btres(fh,res))
1909
                return -EBUSY;
1910
        if (videobuf_queue_is_busy(q))
1911
                return -EBUSY;
1912
        fh->type = type;
1913
        return 0;
170 giacomo 1914
}
1915
 
428 giacomo 1916
static int bttv_g_fmt(struct bttv_fh *fh, struct v4l2_format *f)
170 giacomo 1917
{
428 giacomo 1918
        switch (f->type) {
1919
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1920
                memset(&f->fmt.pix,0,sizeof(struct v4l2_pix_format));
1921
                f->fmt.pix.width        = fh->width;
1922
                f->fmt.pix.height       = fh->height;
1923
                f->fmt.pix.field        = fh->cap.field;
1924
                f->fmt.pix.pixelformat  = fh->fmt->fourcc;
1925
                f->fmt.pix.bytesperline =
1926
                        (f->fmt.pix.width * fh->fmt->depth) >> 3;
1927
                f->fmt.pix.sizeimage =
1928
                        f->fmt.pix.height * f->fmt.pix.bytesperline;
1929
                return 0;
1930
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
1931
                memset(&f->fmt.win,0,sizeof(struct v4l2_window));
1932
                f->fmt.win.w     = fh->ov.w;
1933
                f->fmt.win.field = fh->ov.field;
1934
                return 0;
1935
        case V4L2_BUF_TYPE_VBI_CAPTURE:
516 giacomo 1936
                //bttv_vbi_get_fmt(fh,f);
428 giacomo 1937
                return 0;
1938
        default:
1939
                return -EINVAL;
1940
        }
1941
}
170 giacomo 1942
 
428 giacomo 1943
static int bttv_try_fmt(struct bttv_fh *fh, struct bttv *btv,
1944
                        struct v4l2_format *f)
1945
{
1946
        switch (f->type) {
1947
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1948
        {
1949
                const struct bttv_format *fmt;
1950
                enum v4l2_field field;
1951
                unsigned int maxw,maxh;
1952
 
1953
                fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1954
                if (NULL == fmt)
1955
                        return -EINVAL;
1956
 
1957
                /* fixup format */
1958
                maxw  = bttv_tvnorms[btv->tvnorm].swidth;
1959
                maxh  = bttv_tvnorms[btv->tvnorm].sheight;
1960
                field = f->fmt.pix.field;
1961
                if (V4L2_FIELD_ANY == field)
1962
                        field = (f->fmt.pix.height > maxh/2)
1963
                                ? V4L2_FIELD_INTERLACED
1964
                                : V4L2_FIELD_BOTTOM;
1965
                if (V4L2_FIELD_SEQ_BT == field)
1966
                        field = V4L2_FIELD_SEQ_TB;
1967
                switch (field) {
1968
                case V4L2_FIELD_TOP:
1969
                case V4L2_FIELD_BOTTOM:
1970
                case V4L2_FIELD_ALTERNATE:
1971
                        maxh = maxh/2;
1972
                        break;
1973
                case V4L2_FIELD_INTERLACED:
1974
                        break;
1975
                case V4L2_FIELD_SEQ_TB:
1976
                        if (fmt->flags & FORMAT_FLAGS_PLANAR)
1977
                                return -EINVAL;
1978
                        break;
1979
                default:
1980
                        return -EINVAL;
1981
                }
1982
 
1983
                /* update data for the application */
1984
                f->fmt.pix.field = field;
1985
                if (f->fmt.pix.width  < 48)
1986
                        f->fmt.pix.width  = 48;
1987
                if (f->fmt.pix.height < 32)
1988
                        f->fmt.pix.height = 32;
1989
                if (f->fmt.pix.width  > maxw)
1990
                        f->fmt.pix.width = maxw;
1991
                if (f->fmt.pix.height > maxh)
1992
                        f->fmt.pix.height = maxh;
1993
                f->fmt.pix.bytesperline =
1994
                        (f->fmt.pix.width * fmt->depth) >> 3;
1995
                f->fmt.pix.sizeimage =
1996
                        f->fmt.pix.height * f->fmt.pix.bytesperline;
1997
 
1998
                return 0;
1999
        }
2000
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2001
                return verify_window(&bttv_tvnorms[btv->tvnorm],
2002
                                     &f->fmt.win, 1);
2003
        case V4L2_BUF_TYPE_VBI_CAPTURE:
516 giacomo 2004
                //bttv_vbi_try_fmt(fh,f);
428 giacomo 2005
                return 0;
2006
        default:
2007
                return -EINVAL;
2008
        }
170 giacomo 2009
}
2010
 
428 giacomo 2011
static int bttv_s_fmt(struct bttv_fh *fh, struct bttv *btv,
2012
                      struct v4l2_format *f)
170 giacomo 2013
{
428 giacomo 2014
        int retval;
2015
 
2016
        switch (f->type) {
2017
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2018
        {
2019
                const struct bttv_format *fmt;
170 giacomo 2020
 
428 giacomo 2021
                retval = bttv_switch_type(fh,f->type);
2022
                if (0 != retval)
2023
                        return retval;
2024
                retval = bttv_try_fmt(fh,btv,f);
2025
                if (0 != retval)
2026
                        return retval;
2027
                fmt = format_by_fourcc(f->fmt.pix.pixelformat);
2028
 
2029
                /* update our state informations */
480 giacomo 2030
                //down(&fh->cap.lock);
428 giacomo 2031
                fh->fmt              = fmt;
2032
                fh->cap.field        = f->fmt.pix.field;
2033
                fh->cap.last         = V4L2_FIELD_NONE;
2034
                fh->width            = f->fmt.pix.width;
2035
                fh->height           = f->fmt.pix.height;
2036
                btv->init.fmt        = fmt;
2037
                btv->init.width      = f->fmt.pix.width;
2038
                btv->init.height     = f->fmt.pix.height;
480 giacomo 2039
                //up(&fh->cap.lock);
428 giacomo 2040
 
2041
                return 0;
2042
        }
2043
        case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2044
                return setup_window(fh, btv, &f->fmt.win, 1);
2045
        case V4L2_BUF_TYPE_VBI_CAPTURE:
2046
                retval = bttv_switch_type(fh,f->type);
2047
                if (0 != retval)
2048
                        return retval;
2049
                if (locked_btres(fh->btv, RESOURCE_VBI))
2050
                        return -EBUSY;
516 giacomo 2051
                //bttv_vbi_try_fmt(fh,f);
2052
                //bttv_vbi_setlines(fh,btv,f->fmt.vbi.count[0]);
2053
                //bttv_vbi_get_fmt(fh,f);
428 giacomo 2054
                return 0;
2055
        default:
2056
                return -EINVAL;
2057
        }
170 giacomo 2058
}
2059
 
516 giacomo 2060
int bttv_do_ioctl(struct inode *inode, struct file *file,
428 giacomo 2061
                         unsigned int cmd, void *arg)
170 giacomo 2062
{
428 giacomo 2063
        struct bttv_fh *fh  = file->private_data;
2064
        struct bttv    *btv = fh->btv;
2065
        unsigned long flags;
2066
        int retval = 0;
170 giacomo 2067
 
428 giacomo 2068
        if (bttv_debug > 1) {
2069
                switch (_IOC_TYPE(cmd)) {
2070
                case 'v':
516 giacomo 2071
                        //printk("bttv%d: ioctl 0x%x (v4l1, VIDIOC%s)\n",
2072
                        //       btv->nr, cmd, (_IOC_NR(cmd) < V4L1_IOCTLS) ?
2073
                        //       v4l1_ioctls[_IOC_NR(cmd)] : "???");
428 giacomo 2074
                        break;
2075
                case 'V':
516 giacomo 2076
                        //printk("bttv%d: ioctl 0x%x (v4l2, %s)\n",
2077
                        //       btv->nr, cmd,  v4l2_ioctl_names[_IOC_NR(cmd)]);
428 giacomo 2078
                        break;
2079
                default:
2080
                        printk("bttv%d: ioctl 0x%x ()\n",
2081
                               btv->nr, cmd);
2082
                }
2083
        }
2084
        if (btv->errors)
2085
                bttv_reinit_bt848(btv);
170 giacomo 2086
 
428 giacomo 2087
#ifdef VIDIOC_G_PRIORITY
170 giacomo 2088
        switch (cmd) {
428 giacomo 2089
        case VIDIOCSFREQ:
2090
        case VIDIOCSTUNER:
2091
        case VIDIOCSCHAN:
2092
        case VIDIOC_S_CTRL:
2093
        case VIDIOC_S_STD:
2094
        case VIDIOC_S_INPUT:
2095
        case VIDIOC_S_TUNER:
2096
        case VIDIOC_S_FREQUENCY:
2097
                retval = v4l2_prio_check(&btv->prio,&fh->prio);
2098
                if (0 != retval)
2099
                        return retval;
2100
        };
2101
#endif
605 giacomo 2102
 
428 giacomo 2103
        switch (cmd) {
2104
 
2105
        /* ***  v4l1  *** ************************************************ */
170 giacomo 2106
        case VIDIOCGCAP:
2107
        {
428 giacomo 2108
                struct video_capability *cap = arg;
2109
 
2110
                memset(cap,0,sizeof(*cap));
2111
                strcpy(cap->name,btv->video_dev->name);
2112
                if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2113
                        /* vbi */
2114
                        cap->type = VID_TYPE_TUNER|VID_TYPE_TELETEXT;
2115
                } else {
2116
                        /* others */
2117
                        cap->type = VID_TYPE_CAPTURE|
2118
                                VID_TYPE_TUNER|
2119
                                VID_TYPE_OVERLAY|
2120
                                VID_TYPE_CLIPPING|
2121
                                VID_TYPE_SCALES;
2122
                        cap->channels  = bttv_tvcards[btv->type].video_inputs;
2123
                        cap->audios    = bttv_tvcards[btv->type].audio_inputs;
2124
                        cap->maxwidth  = bttv_tvnorms[btv->tvnorm].swidth;
2125
                        cap->maxheight = bttv_tvnorms[btv->tvnorm].sheight;
2126
                        cap->minwidth  = 48;
2127
                        cap->minheight = 32;
2128
                }
2129
                return 0;
170 giacomo 2130
        }
428 giacomo 2131
 
2132
        case VIDIOCGPICT:
170 giacomo 2133
        {
428 giacomo 2134
                struct video_picture *pic = arg;
2135
 
2136
                memset(pic,0,sizeof(*pic));
2137
                pic->brightness = btv->bright;
2138
                pic->contrast   = btv->contrast;
2139
                pic->hue        = btv->hue;
2140
                pic->colour     = btv->saturation;
2141
                if (fh->fmt) {
2142
                        pic->depth   = fh->fmt->depth;
2143
                        pic->palette = fh->fmt->palette;
2144
                }
170 giacomo 2145
                return 0;
2146
        }
428 giacomo 2147
        case VIDIOCSPICT:
170 giacomo 2148
        {
428 giacomo 2149
                struct video_picture *pic = arg;
2150
                const struct bttv_format *fmt;
170 giacomo 2151
 
428 giacomo 2152
                fmt = format_by_palette(pic->palette);
2153
                if (NULL == fmt)
170 giacomo 2154
                        return -EINVAL;
480 giacomo 2155
                //down(&fh->cap.lock);
428 giacomo 2156
                if (fmt->depth != pic->depth && !sloppy) {
2157
                        retval = -EINVAL;
2158
                        goto fh_unlock_and_return;
2159
                }
2160
                fh->ovfmt   = fmt;
2161
                fh->fmt     = fmt;
2162
                btv->init.ovfmt   = fmt;
2163
                btv->init.fmt     = fmt;
2164
                if (bigendian) {
2165
                        /* dirty hack time:  swap bytes for overlay if the
2166
                           display adaptor is big endian (insmod option) */
2167
                        if (fmt->palette == VIDEO_PALETTE_RGB555 ||
2168
                            fmt->palette == VIDEO_PALETTE_RGB565 ||
2169
                            fmt->palette == VIDEO_PALETTE_RGB32) {
2170
                                fh->ovfmt = fmt+1;
2171
                        }
2172
                }
2173
                bt848_bright(btv,pic->brightness);
2174
                bt848_contrast(btv,pic->contrast);
2175
                bt848_hue(btv,pic->hue);
2176
                bt848_sat(btv,pic->colour);
480 giacomo 2177
                //up(&fh->cap.lock);
428 giacomo 2178
                return 0;
2179
        }
170 giacomo 2180
 
428 giacomo 2181
        case VIDIOCGWIN:
2182
        {
2183
                struct video_window *win = arg;
2184
 
2185
                memset(win,0,sizeof(*win));
2186
                win->x      = fh->ov.w.left;
2187
                win->y      = fh->ov.w.top;
2188
                win->width  = fh->ov.w.width;
2189
                win->height = fh->ov.w.height;
170 giacomo 2190
                return 0;
2191
        }
428 giacomo 2192
        case VIDIOCSWIN:
170 giacomo 2193
        {
428 giacomo 2194
                struct video_window *win = arg;
2195
                struct v4l2_window w2;
2196
 
2197
                w2.field = V4L2_FIELD_ANY;
2198
                w2.w.left    = win->x;
2199
                w2.w.top     = win->y;
2200
                w2.w.width   = win->width;
2201
                w2.w.height  = win->height;
2202
                w2.clipcount = win->clipcount;
2203
                w2.clips     = (struct v4l2_clip*)win->clips;
2204
                retval = setup_window(fh, btv, &w2, 0);
2205
                if (0 == retval) {
2206
                        /* on v4l1 this ioctl affects the read() size too */
2207
                        fh->width  = fh->ov.w.width;
2208
                        fh->height = fh->ov.w.height;
2209
                        btv->init.width  = fh->ov.w.width;
2210
                        btv->init.height = fh->ov.w.height;
2211
                }
2212
                return retval;
2213
        }
2214
 
2215
        case VIDIOCGFBUF:
2216
        {
2217
                struct video_buffer *fbuf = arg;
2218
 
2219
                fbuf->base          = btv->fbuf.base;
2220
                fbuf->width         = btv->fbuf.fmt.width;
2221
                fbuf->height        = btv->fbuf.fmt.height;
2222
                fbuf->bytesperline  = btv->fbuf.fmt.bytesperline;
2223
                if (fh->ovfmt)
2224
                        fbuf->depth = fh->ovfmt->depth;
170 giacomo 2225
                return 0;
2226
        }
428 giacomo 2227
        case VIDIOCSFBUF:
170 giacomo 2228
        {
428 giacomo 2229
                struct video_buffer *fbuf = arg;
2230
                const struct bttv_format *fmt;
2231
                unsigned long end;
2232
 
2233
                end = (unsigned long)fbuf->base +
2234
                        fbuf->height * fbuf->bytesperline;
480 giacomo 2235
                //down(&fh->cap.lock);
428 giacomo 2236
                retval = -EINVAL;
2237
                if (sloppy) {
2238
                        /* also set the default palette -- for backward
2239
                           compatibility with older versions */
2240
                        switch (fbuf->depth) {
2241
                        case 8:
2242
                                fmt = format_by_palette(VIDEO_PALETTE_HI240);
2243
                                break;
2244
                        case 16:
2245
                                fmt = format_by_palette(VIDEO_PALETTE_RGB565);
2246
                                break;
2247
                        case 24:
2248
                                fmt = format_by_palette(VIDEO_PALETTE_RGB24);
2249
                                break;
2250
                        case 32:
2251
                                fmt = format_by_palette(VIDEO_PALETTE_RGB32);
2252
                                break;
2253
                        case 15:
2254
                                fbuf->depth = 16;
2255
                                fmt = format_by_palette(VIDEO_PALETTE_RGB555);
2256
                                break;
2257
                        default:
2258
                                fmt = NULL;
2259
                                break;
2260
                        }
2261
                        if (NULL == fmt)
2262
                                goto fh_unlock_and_return;
2263
                        fh->ovfmt = fmt;
2264
                        fh->fmt   = fmt;
2265
                        btv->init.ovfmt = fmt;
2266
                        btv->init.fmt   = fmt;
2267
                } else {
2268
                        if (15 == fbuf->depth)
2269
                                fbuf->depth = 16;
2270
                        if (fbuf->depth !=  8 && fbuf->depth != 16 &&
2271
                            fbuf->depth != 24 && fbuf->depth != 32)
2272
                                goto fh_unlock_and_return;
170 giacomo 2273
                }
428 giacomo 2274
                btv->fbuf.base             = fbuf->base;
2275
                btv->fbuf.fmt.width        = fbuf->width;
2276
                btv->fbuf.fmt.height       = fbuf->height;
2277
                if (fbuf->bytesperline)
2278
                        btv->fbuf.fmt.bytesperline = fbuf->bytesperline;
2279
                else
2280
                        btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fbuf->depth/8;
480 giacomo 2281
                //up(&fh->cap.lock);
170 giacomo 2282
                return 0;
2283
        }
428 giacomo 2284
 
2285
        case VIDIOCCAPTURE:
2286
        case VIDIOC_OVERLAY:
170 giacomo 2287
        {
428 giacomo 2288
                struct bttv_buffer *new;
2289
                int *on = arg;
2290
 
2291
                if (*on) {
2292
                        /* verify args */
2293
                        if (NULL == btv->fbuf.base)
2294
                                return -EINVAL;
2295
                        if (!fh->ov.setup_ok) {
623 giacomo 2296
                                //dprintk("bttv%d: overlay: !setup_ok\n",btv->nr);
428 giacomo 2297
                                return -EINVAL;
2298
                        }
2299
                }
2300
 
2301
                if (!check_alloc_btres(btv,fh,RESOURCE_OVERLAY))
2302
                        return -EBUSY;
2303
 
480 giacomo 2304
                //down(&fh->cap.lock);
428 giacomo 2305
                if (*on) {
2306
                        fh->ov.tvnorm = btv->tvnorm;
2307
                        new = videobuf_alloc(sizeof(*new));
2308
                        bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
2309
                } else {
2310
                        new = NULL;
2311
                }
2312
 
2313
                /* switch over */
2314
                retval = bttv_switch_overlay(btv,fh,new);
480 giacomo 2315
                //up(&fh->cap.lock);
428 giacomo 2316
                return retval;
2317
        }
2318
 
2319
        case VIDIOCGMBUF:
2320
        {
2321
                struct video_mbuf *mbuf = arg;
2322
                unsigned int i;
2323
 
480 giacomo 2324
                //down(&fh->cap.lock);
428 giacomo 2325
                retval = videobuf_mmap_setup(file,&fh->cap,gbuffers,gbufsize,
2326
                                             V4L2_MEMORY_MMAP);
2327
                if (retval < 0)
2328
                        goto fh_unlock_and_return;
2329
                memset(mbuf,0,sizeof(*mbuf));
2330
                mbuf->frames = gbuffers;
2331
                mbuf->size   = gbuffers * gbufsize;
2332
                for (i = 0; i < gbuffers; i++)
2333
                        mbuf->offsets[i] = i * gbufsize;
480 giacomo 2334
                //up(&fh->cap.lock);
170 giacomo 2335
                return 0;
2336
        }
428 giacomo 2337
        case VIDIOCMCAPTURE:
170 giacomo 2338
        {
428 giacomo 2339
                struct video_mmap *vm = arg;
2340
                struct bttv_buffer *buf;
2341
                enum v4l2_field field;
2342
 
2343
                if (vm->frame >= VIDEO_MAX_FRAME)
170 giacomo 2344
                        return -EINVAL;
428 giacomo 2345
 
480 giacomo 2346
                //down(&fh->cap.lock);
428 giacomo 2347
                retval = -EINVAL;
2348
                buf = (struct bttv_buffer *)fh->cap.bufs[vm->frame];
2349
                if (NULL == buf)
2350
                        goto fh_unlock_and_return;
606 giacomo 2351
 
428 giacomo 2352
                if (0 == buf->vb.baddr)
2353
                        goto fh_unlock_and_return;
541 giacomo 2354
 
428 giacomo 2355
                if (buf->vb.state == STATE_QUEUED ||
2356
                    buf->vb.state == STATE_ACTIVE)
2357
                        goto fh_unlock_and_return;
2358
 
2359
                field = (vm->height > bttv_tvnorms[btv->tvnorm].sheight/2)
2360
                        ? V4L2_FIELD_INTERLACED
2361
                        : V4L2_FIELD_BOTTOM;
2362
                retval = bttv_prepare_buffer(btv,buf,
2363
                                             format_by_palette(vm->format),
2364
                                             vm->width,vm->height,field);
2365
                if (0 != retval)
2366
                        goto fh_unlock_and_return;
2367
                spin_lock_irqsave(&btv->s_lock,flags);
2368
                buffer_queue(file,&buf->vb);
2369
                spin_unlock_irqrestore(&btv->s_lock,flags);
480 giacomo 2370
                //up(&fh->cap.lock);
170 giacomo 2371
                return 0;
2372
        }
428 giacomo 2373
        case VIDIOCSYNC:
170 giacomo 2374
        {
2375
 
695 giacomo 2376
                /* S.Ha.R.K. Version: Active wait until complete */
170 giacomo 2377
 
696 giacomo 2378
                int pid = (int)(arg);
695 giacomo 2379
 
696 giacomo 2380
                if (pid != -1) grab_task = pid;
695 giacomo 2381
 
696 giacomo 2382
                return grab_task;
695 giacomo 2383
 
170 giacomo 2384
        }
428 giacomo 2385
 
2386
        case VIDIOCGVBIFMT:
170 giacomo 2387
        {
428 giacomo 2388
                struct vbi_format *fmt = (void *) arg;
2389
                struct v4l2_format fmt2;
2390
 
2391
                if (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE) {
2392
                        retval = bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2393
                        if (0 != retval)
2394
                                return retval;
2395
                }
516 giacomo 2396
                //bttv_vbi_get_fmt(fh, &fmt2);
428 giacomo 2397
 
2398
                memset(fmt,0,sizeof(*fmt));
2399
                fmt->sampling_rate    = fmt2.fmt.vbi.sampling_rate;
2400
                fmt->samples_per_line = fmt2.fmt.vbi.samples_per_line;
2401
                fmt->sample_format    = VIDEO_PALETTE_RAW;
2402
                fmt->start[0]         = fmt2.fmt.vbi.start[0];
2403
                fmt->count[0]         = fmt2.fmt.vbi.count[0];
2404
                fmt->start[1]         = fmt2.fmt.vbi.start[1];
2405
                fmt->count[1]         = fmt2.fmt.vbi.count[1];
2406
                if (fmt2.fmt.vbi.flags & VBI_UNSYNC)
2407
                        fmt->flags   |= V4L2_VBI_UNSYNC;
2408
                if (fmt2.fmt.vbi.flags & VBI_INTERLACED)
2409
                        fmt->flags   |= V4L2_VBI_INTERLACED;
170 giacomo 2410
                return 0;
2411
        }
428 giacomo 2412
        case VIDIOCSVBIFMT:
170 giacomo 2413
        {
428 giacomo 2414
                struct vbi_format *fmt = (void *) arg;
2415
                struct v4l2_format fmt2;
2416
 
2417
                retval = bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2418
                if (0 != retval)
2419
                        return retval;
516 giacomo 2420
                //bttv_vbi_get_fmt(fh, &fmt2);
428 giacomo 2421
 
2422
                if (fmt->sampling_rate    != fmt2.fmt.vbi.sampling_rate     ||
2423
                    fmt->samples_per_line != fmt2.fmt.vbi.samples_per_line  ||
2424
                    fmt->sample_format    != VIDEO_PALETTE_RAW              ||
2425
                    fmt->start[0]         != fmt2.fmt.vbi.start[0]          ||
2426
                    fmt->start[1]         != fmt2.fmt.vbi.start[1]          ||
2427
                    fmt->count[0]         != fmt->count[1]                  ||
2428
                    fmt->count[0]         <  1                              ||
2429
                    fmt->count[0]         >  32 /* VBI_MAXLINES */)
170 giacomo 2430
                        return -EINVAL;
428 giacomo 2431
 
516 giacomo 2432
                //bttv_vbi_setlines(fh,btv,fmt->count[0]);
170 giacomo 2433
                return 0;
2434
        }
428 giacomo 2435
 
2436
        case BTTV_VERSION:
2437
        case VIDIOCGFREQ:
2438
        case VIDIOCSFREQ:
2439
        case VIDIOCGTUNER:
2440
        case VIDIOCSTUNER:
2441
        case VIDIOCGCHAN:
2442
        case VIDIOCSCHAN:
2443
        case VIDIOCGAUDIO:
2444
        case VIDIOCSAUDIO:
2445
                return bttv_common_ioctls(btv,cmd,arg);
2446
 
2447
        /* ***  v4l2  *** ************************************************ */
2448
        case VIDIOC_QUERYCAP:
170 giacomo 2449
        {
428 giacomo 2450
                struct v4l2_capability *cap = arg;
2451
 
2452
                if (0 == v4l2)
2453
                        return -EINVAL;
2454
                strcpy(cap->driver,"bttv");
516 giacomo 2455
                strncpy(cap->card,btv->video_dev->name,sizeof(cap->card));
463 giacomo 2456
                sprintf26(cap->bus_info,"PCI:%s",pci_name(btv->dev));
428 giacomo 2457
                cap->version = BTTV_VERSION_CODE;
2458
                cap->capabilities =
2459
                        V4L2_CAP_VIDEO_CAPTURE |
2460
                        V4L2_CAP_VIDEO_OVERLAY |
2461
                        V4L2_CAP_VBI_CAPTURE |
2462
                        V4L2_CAP_TUNER |
2463
                        V4L2_CAP_READWRITE |
2464
                        V4L2_CAP_STREAMING;
170 giacomo 2465
                return 0;
2466
        }
428 giacomo 2467
 
2468
        case VIDIOC_ENUM_FMT:
170 giacomo 2469
        {
428 giacomo 2470
                struct v4l2_fmtdesc *f = arg;
2471
                enum v4l2_buf_type type;
2472
                unsigned int i;
2473
                int index;
2474
 
2475
                type  = f->type;
2476
                if (V4L2_BUF_TYPE_VBI_CAPTURE == type) {
2477
                        /* vbi */
2478
                        index = f->index;
2479
                        if (0 != index)
2480
                                return -EINVAL;
2481
                        memset(f,0,sizeof(*f));
2482
                        f->index       = index;
2483
                        f->type        = type;
2484
                        f->pixelformat = V4L2_PIX_FMT_GREY;
2485
                        strcpy(f->description,"vbi data");
2486
                        return 0;
2487
                }
2488
 
2489
                /* video capture + overlay */
2490
                index = -1;
2491
                for (i = 0; i < BTTV_FORMATS; i++) {
2492
                        if (bttv_formats[i].fourcc != -1)
2493
                                index++;
2494
                        if ((unsigned int)index == f->index)
2495
                                break;
2496
                }
2497
                if (BTTV_FORMATS == i)
170 giacomo 2498
                        return -EINVAL;
2499
 
428 giacomo 2500
                switch (f->type) {
2501
                case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2502
                        break;
2503
                case V4L2_BUF_TYPE_VIDEO_OVERLAY:
2504
                        if (!(bttv_formats[i].flags & FORMAT_FLAGS_PACKED))
2505
                                return -EINVAL;
2506
                        break;
2507
                default:
2508
                        return -EINVAL;
170 giacomo 2509
                }
428 giacomo 2510
                memset(f,0,sizeof(*f));
2511
                f->index       = index;
2512
                f->type        = type;
2513
                f->pixelformat = bttv_formats[i].fourcc;
516 giacomo 2514
                strncpy(f->description,bttv_formats[i].name,sizeof(f->description));
428 giacomo 2515
                return 0;
170 giacomo 2516
        }
428 giacomo 2517
 
2518
        case VIDIOC_TRY_FMT:
170 giacomo 2519
        {
428 giacomo 2520
                struct v4l2_format *f = arg;
2521
                return bttv_try_fmt(fh,btv,f);
170 giacomo 2522
        }
428 giacomo 2523
        case VIDIOC_G_FMT:
170 giacomo 2524
        {
428 giacomo 2525
                struct v4l2_format *f = arg;
2526
                return bttv_g_fmt(fh,f);
170 giacomo 2527
        }
428 giacomo 2528
        case VIDIOC_S_FMT:
170 giacomo 2529
        {
428 giacomo 2530
                struct v4l2_format *f = arg;
2531
                return bttv_s_fmt(fh,btv,f);
2532
        }
2533
 
2534
        case VIDIOC_G_FBUF:
2535
        {
2536
                struct v4l2_framebuffer *fb = arg;
2537
 
2538
                *fb = btv->fbuf;
2539
                fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2540
                if (fh->ovfmt)
2541
                        fb->fmt.pixelformat  = fh->ovfmt->fourcc;
170 giacomo 2542
                return 0;
2543
        }
428 giacomo 2544
        case VIDIOC_S_FBUF:
170 giacomo 2545
        {
428 giacomo 2546
                struct v4l2_framebuffer *fb = arg;
2547
                const struct bttv_format *fmt;
170 giacomo 2548
 
428 giacomo 2549
                /* check args */
2550
                fmt = format_by_fourcc(fb->fmt.pixelformat);
2551
                if (NULL == fmt)
2552
                        return -EINVAL;
2553
                if (0 == (fmt->flags & FORMAT_FLAGS_PACKED))
2554
                        return -EINVAL;
2555
 
480 giacomo 2556
                //down(&fh->cap.lock);
428 giacomo 2557
                retval = -EINVAL;
2558
                if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2559
                        if (fb->fmt.width > bttv_tvnorms[btv->tvnorm].swidth)
2560
                                goto fh_unlock_and_return;
2561
                        if (fb->fmt.height > bttv_tvnorms[btv->tvnorm].sheight)
2562
                                goto fh_unlock_and_return;
2563
                }
2564
 
2565
                /* ok, accept it */
2566
                btv->fbuf.base       = fb->base;
2567
                btv->fbuf.fmt.width  = fb->fmt.width;
2568
                btv->fbuf.fmt.height = fb->fmt.height;
2569
                if (0 != fb->fmt.bytesperline)
2570
                        btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline;
2571
                else
2572
                        btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8;
2573
 
2574
                retval = 0;
2575
                fh->ovfmt = fmt;
2576
                btv->init.ovfmt = fmt;
2577
                if (fb->flags & V4L2_FBUF_FLAG_OVERLAY) {
2578
                        fh->ov.w.left   = 0;
2579
                        fh->ov.w.top    = 0;
2580
                        fh->ov.w.width  = fb->fmt.width;
2581
                        fh->ov.w.height = fb->fmt.height;
2582
                        btv->init.ov.w.width  = fb->fmt.width;
2583
                        btv->init.ov.w.height = fb->fmt.height;
2584
                        if (fh->ov.clips)
2585
                                kfree(fh->ov.clips);
2586
                        fh->ov.clips = NULL;
2587
                        fh->ov.nclips = 0;
2588
 
2589
                        if (check_btres(fh, RESOURCE_OVERLAY)) {
2590
                                struct bttv_buffer *new;
2591
 
2592
                                new = videobuf_alloc(sizeof(*new));
2593
                                bttv_overlay_risc(btv,&fh->ov,fh->ovfmt,new);
2594
                                retval = bttv_switch_overlay(btv,fh,new);
2595
                        }
2596
                }
480 giacomo 2597
                //up(&fh->cap.lock);
428 giacomo 2598
                return retval;
170 giacomo 2599
        }
2600
 
428 giacomo 2601
        case VIDIOC_REQBUFS:
2602
                return videobuf_reqbufs(file,bttv_queue(fh),arg);
2603
 
2604
        case VIDIOC_QUERYBUF:
2605
                return videobuf_querybuf(bttv_queue(fh),arg);
2606
 
2607
        case VIDIOC_QBUF:
2608
                return videobuf_qbuf(file,bttv_queue(fh),arg);
2609
 
2610
        case VIDIOC_DQBUF:
2611
                return videobuf_dqbuf(file,bttv_queue(fh),arg);
2612
 
2613
        case VIDIOC_STREAMON:
170 giacomo 2614
        {
428 giacomo 2615
                int res = bttv_resource(fh);
2616
 
2617
                if (!check_alloc_btres(btv,fh,res))
2618
                        return -EBUSY;
2619
                return videobuf_streamon(file,bttv_queue(fh));
170 giacomo 2620
        }
428 giacomo 2621
        case VIDIOC_STREAMOFF:
170 giacomo 2622
        {
428 giacomo 2623
                int res = bttv_resource(fh);
2624
 
2625
                retval = videobuf_streamoff(file,bttv_queue(fh));
2626
                if (retval < 0)
2627
                        return retval;
2628
                free_btres(btv,fh,res);
170 giacomo 2629
                return 0;
2630
        }
428 giacomo 2631
 
2632
        case VIDIOC_QUERYCTRL:
170 giacomo 2633
        {
428 giacomo 2634
                struct v4l2_queryctrl *c = arg;
2635
                int i;
2636
 
2637
                if ((c->id <  V4L2_CID_BASE ||
2638
                     c->id >= V4L2_CID_LASTP1) &&
2639
                    (c->id <  V4L2_CID_PRIVATE_BASE ||
2640
                     c->id >= V4L2_CID_PRIVATE_LASTP1))
2641
                        return -EINVAL;
2642
                for (i = 0; i < BTTV_CTLS; i++)
2643
                        if (bttv_ctls[i].id == c->id)
2644
                                break;
2645
                if (i == BTTV_CTLS) {
2646
                        *c = no_ctl;
2647
                        return 0;
2648
                }
2649
                *c = bttv_ctls[i];
2650
                if (i >= 4 && i <= 8) {
2651
                        struct video_audio va;
2652
                        memset(&va,0,sizeof(va));
2653
                        bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
2654
                        if (btv->audio_hook)
2655
                                btv->audio_hook(btv,&va,0);
2656
                        switch (bttv_ctls[i].id) {
2657
                        case V4L2_CID_AUDIO_VOLUME:
2658
                                if (!(va.flags & VIDEO_AUDIO_VOLUME))
2659
                                        *c = no_ctl;
2660
                                break;
2661
                        case V4L2_CID_AUDIO_BALANCE:
2662
                                if (!(va.flags & VIDEO_AUDIO_BALANCE))
2663
                                        *c = no_ctl;
2664
                                break;
2665
                        case V4L2_CID_AUDIO_BASS:
2666
                                if (!(va.flags & VIDEO_AUDIO_BASS))
2667
                                        *c = no_ctl;
2668
                                break;
2669
                        case V4L2_CID_AUDIO_TREBLE:
2670
                                if (!(va.flags & VIDEO_AUDIO_TREBLE))
2671
                                        *c = no_ctl;
2672
                                break;
2673
                        }
2674
                }
170 giacomo 2675
                return 0;
2676
        }
428 giacomo 2677
        case VIDIOC_G_CTRL:
2678
                return get_control(btv,arg);
2679
        case VIDIOC_S_CTRL:
2680
                return set_control(btv,arg);
2681
        case VIDIOC_G_PARM:
170 giacomo 2682
        {
428 giacomo 2683
                struct v4l2_streamparm *parm = arg;
2684
                struct v4l2_standard s;
2685
                if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2686
                        return -EINVAL;
2687
                memset(parm,0,sizeof(*parm));
516 giacomo 2688
                //v4l2_video_std_construct(&s, bttv_tvnorms[btv->tvnorm].v4l2_id,
2689
                //                       bttv_tvnorms[btv->tvnorm].name);
428 giacomo 2690
                parm->parm.capture.timeperframe = s.frameperiod;
170 giacomo 2691
                return 0;
2692
        }
2693
 
428 giacomo 2694
#ifdef VIDIOC_G_PRIORITY
2695
        case VIDIOC_G_PRIORITY:
170 giacomo 2696
        {
428 giacomo 2697
                enum v4l2_priority *p = arg;
170 giacomo 2698
 
428 giacomo 2699
                *p = v4l2_prio_max(&btv->prio);
170 giacomo 2700
                return 0;
2701
        }
428 giacomo 2702
        case VIDIOC_S_PRIORITY:
170 giacomo 2703
        {
428 giacomo 2704
                enum v4l2_priority *prio = arg;
2705
 
2706
                return v4l2_prio_change(&btv->prio, &fh->prio, *prio);
170 giacomo 2707
        }
428 giacomo 2708
#endif
170 giacomo 2709
 
428 giacomo 2710
 
2711
        case VIDIOC_ENUMSTD:
2712
        case VIDIOC_G_STD:
2713
        case VIDIOC_S_STD:
2714
        case VIDIOC_ENUMINPUT:
2715
        case VIDIOC_G_INPUT:
2716
        case VIDIOC_S_INPUT:
2717
        case VIDIOC_G_TUNER:
2718
        case VIDIOC_S_TUNER:
2719
        case VIDIOC_G_FREQUENCY:
2720
        case VIDIOC_S_FREQUENCY:
2721
                return bttv_common_ioctls(btv,cmd,arg);
2722
 
170 giacomo 2723
        default:
428 giacomo 2724
                return -ENOIOCTLCMD;
170 giacomo 2725
        }
2726
        return 0;
428 giacomo 2727
 
2728
 fh_unlock_and_return:
480 giacomo 2729
        //up(&fh->cap.lock);
428 giacomo 2730
        return retval;
170 giacomo 2731
}
2732
 
516 giacomo 2733
int bttv_ioctl(struct inode *inode, struct file *file,
428 giacomo 2734
                      unsigned int cmd, unsigned long arg)
170 giacomo 2735
{
428 giacomo 2736
        struct bttv_fh *fh  = file->private_data;
2737
 
2738
        switch (cmd) {
2739
        case BTTV_VBISIZE:
2740
                bttv_switch_type(fh,V4L2_BUF_TYPE_VBI_CAPTURE);
2741
                return fh->lines * 2 * 2048;
2742
        default:
541 giacomo 2743
                return bttv_do_ioctl(inode, file, cmd, (void *)arg);
2744
                        //video_usercopy(inode, file, cmd, arg, bttv_do_ioctl);
170 giacomo 2745
        }
428 giacomo 2746
}
170 giacomo 2747
 
516 giacomo 2748
ssize_t bttv_read(struct file *file, char *data,
428 giacomo 2749
                         size_t count, loff_t *ppos)
2750
{
2751
        struct bttv_fh *fh = file->private_data;
2752
        int retval = 0;
170 giacomo 2753
 
428 giacomo 2754
        if (fh->btv->errors)
2755
                bttv_reinit_bt848(fh->btv);
516 giacomo 2756
        //dprintk("bttv%d: read count=%d type=%s\n",
2757
        //      fh->btv->nr,(int)count,v4l2_type_names[fh->type]);
170 giacomo 2758
 
428 giacomo 2759
        switch (fh->type) {
2760
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
2761
                if (locked_btres(fh->btv,RESOURCE_VIDEO))
2762
                        return -EBUSY;
2763
                retval = videobuf_read_one(file, &fh->cap, data, count, ppos);
2764
                break;
2765
        case V4L2_BUF_TYPE_VBI_CAPTURE:
2766
                if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
2767
                        return -EBUSY;
2768
                retval = videobuf_read_stream(file, &fh->vbi, data, count, ppos, 1);
2769
                break;
2770
        default:
2771
                BUG();
170 giacomo 2772
        }
428 giacomo 2773
        return retval;
2774
}
170 giacomo 2775
 
491 giacomo 2776
/*
428 giacomo 2777
static unsigned int bttv_poll(struct file *file, poll_table *wait)
2778
{
2779
        struct bttv_fh *fh = file->private_data;
2780
        struct bttv_buffer *buf;
2781
        enum v4l2_field field;
2782
 
2783
        if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
2784
                if (!check_alloc_btres(fh->btv,fh,RESOURCE_VBI))
2785
                        return -EBUSY;
2786
                return videobuf_poll_stream(file, &fh->vbi, wait);
2787
        }
2788
 
2789
        if (check_btres(fh,RESOURCE_VIDEO)) {
2790
                if (list_empty(&fh->cap.stream))
2791
                        return POLLERR;
2792
                buf = list_entry(fh->cap.stream.next,struct bttv_buffer,vb.stream);
170 giacomo 2793
        } else {
480 giacomo 2794
                //down(&fh->cap.lock);
428 giacomo 2795
                if (NULL == fh->cap.read_buf) {
2796
                        if (locked_btres(fh->btv,RESOURCE_VIDEO)) {
480 giacomo 2797
                                //up(&fh->cap.lock);
428 giacomo 2798
                                return POLLERR;
2799
                        }
2800
                        fh->cap.read_buf = videobuf_alloc(fh->cap.msize);
2801
                        if (NULL == fh->cap.read_buf) {
480 giacomo 2802
                                //up(&fh->cap.lock);
428 giacomo 2803
                                return POLLERR;
2804
                        }
2805
                        fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
2806
                        field = videobuf_next_field(&fh->cap);
2807
                        if (0 != fh->cap.ops->buf_prepare(file,fh->cap.read_buf,field)) {
480 giacomo 2808
                                //up(&fh->cap.lock);
428 giacomo 2809
                                return POLLERR;
2810
                        }
2811
                        fh->cap.ops->buf_queue(file,fh->cap.read_buf);
2812
                        fh->cap.read_off = 0;
2813
                }
480 giacomo 2814
                //up(&fh->cap.lock);
428 giacomo 2815
                buf = (struct bttv_buffer*)fh->cap.read_buf;
170 giacomo 2816
        }
428 giacomo 2817
 
491 giacomo 2818
        //poll_wait(file, &buf->vb.done, wait);
428 giacomo 2819
        if (buf->vb.state == STATE_DONE ||
2820
            buf->vb.state == STATE_ERROR)
2821
                return POLLIN|POLLRDNORM;
2822
        return 0;
2823
}
491 giacomo 2824
*/
170 giacomo 2825
 
516 giacomo 2826
int bttv_open(struct inode *inode, struct file *file)
428 giacomo 2827
{
2828
        int minor = iminor(inode);
2829
        struct bttv *btv = NULL;
2830
        struct bttv_fh *fh;
2831
        enum v4l2_buf_type type = 0;
2832
        unsigned int i;
170 giacomo 2833
 
428 giacomo 2834
        dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
170 giacomo 2835
 
428 giacomo 2836
        for (i = 0; i < bttv_num; i++) {
2837
                if (bttvs[i].video_dev->minor == minor) {
2838
                        btv = &bttvs[i];
2839
                        type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2840
                        break;
2841
                }
2842
                if (bttvs[i].vbi_dev->minor == minor) {
2843
                        btv = &bttvs[i];
2844
                        type = V4L2_BUF_TYPE_VBI_CAPTURE;
2845
                        break;
2846
                }
170 giacomo 2847
        }
428 giacomo 2848
        if (NULL == btv)
2849
                return -ENODEV;
170 giacomo 2850
 
516 giacomo 2851
        //dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
2852
        //      btv->nr,v4l2_type_names[type]);
428 giacomo 2853
 
2854
        /* allocate per filehandle data */
2855
        fh = kmalloc(sizeof(*fh),GFP_KERNEL);
2856
        if (NULL == fh)
2857
                return -ENOMEM;
2858
        file->private_data = fh;
2859
        *fh = btv->init;
2860
        fh->type = type;
2861
        fh->ov.setup_ok = 0;
2862
#ifdef VIDIOC_G_PRIORITY
2863
        v4l2_prio_open(&btv->prio,&fh->prio);
2864
#endif
516 giacomo 2865
 
428 giacomo 2866
        videobuf_queue_init(&fh->cap, &bttv_video_qops,
2867
                            btv->dev, &btv->s_lock,
2868
                            V4L2_BUF_TYPE_VIDEO_CAPTURE,
2869
                            V4L2_FIELD_INTERLACED,
2870
                            sizeof(struct bttv_buffer));
516 giacomo 2871
        /*
428 giacomo 2872
        videobuf_queue_init(&fh->vbi, &bttv_vbi_qops,
2873
                            btv->dev, &btv->s_lock,
2874
                            V4L2_BUF_TYPE_VBI_CAPTURE,
2875
                            V4L2_FIELD_SEQ_TB,
2876
                            sizeof(struct bttv_buffer));
516 giacomo 2877
        */
428 giacomo 2878
        i2c_vidiocschan(btv);
2879
 
2880
        btv->users++;
516 giacomo 2881
        //if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)
2882
                //bttv_vbi_setlines(fh,btv,16);
621 giacomo 2883
        //bttv_field_count(btv);
428 giacomo 2884
        return 0;
2885
}
2886
 
516 giacomo 2887
int bttv_release(struct inode *inode, struct file *file)
428 giacomo 2888
{
2889
        struct bttv_fh *fh = file->private_data;
2890
        struct bttv *btv = fh->btv;
2891
 
2892
        /* turn off overlay */
2893
        if (check_btres(fh, RESOURCE_OVERLAY))
2894
                bttv_switch_overlay(btv,fh,NULL);
2895
 
2896
        /* stop video capture */
2897
        if (check_btres(fh, RESOURCE_VIDEO)) {
2898
                videobuf_streamoff(file,&fh->cap);
2899
                free_btres(btv,fh,RESOURCE_VIDEO);
170 giacomo 2900
        }
428 giacomo 2901
        if (fh->cap.read_buf) {
2902
                buffer_release(file,fh->cap.read_buf);
2903
                kfree(fh->cap.read_buf);
2904
        }
170 giacomo 2905
 
428 giacomo 2906
        /* stop vbi capture */
2907
        if (check_btres(fh, RESOURCE_VBI)) {
2908
                if (fh->vbi.streaming)
2909
                        videobuf_streamoff(file,&fh->vbi);
2910
                if (fh->vbi.reading)
2911
                        videobuf_read_stop(file,&fh->vbi);
2912
                free_btres(btv,fh,RESOURCE_VBI);
170 giacomo 2913
        }
2914
 
428 giacomo 2915
#ifdef VIDIOC_G_PRIORITY
2916
        v4l2_prio_close(&btv->prio,&fh->prio);
2917
#endif
2918
        file->private_data = NULL;
2919
        kfree(fh);
2920
 
2921
        btv->users--;
621 giacomo 2922
        //bttv_field_count(btv);
428 giacomo 2923
        return 0;
170 giacomo 2924
}
2925
 
516 giacomo 2926
int
428 giacomo 2927
bttv_mmap(struct file *file, struct vm_area_struct *vma)
170 giacomo 2928
{
428 giacomo 2929
        struct bttv_fh *fh = file->private_data;
170 giacomo 2930
 
516 giacomo 2931
        //dprintk("bttv%d: mmap type=%s 0x%lx+%ld\n",
2932
        //      fh->btv->nr, v4l2_type_names[fh->type],
2933
        //      vma->vm_start, vma->vm_end - vma->vm_start);
428 giacomo 2934
        return videobuf_mmap_mapper(vma,bttv_queue(fh));
2935
}
541 giacomo 2936
 
428 giacomo 2937
static struct file_operations bttv_fops =
2938
{
2939
        .owner    = THIS_MODULE,
2940
        .open     = bttv_open,
2941
        .release  = bttv_release,
2942
        .ioctl    = bttv_ioctl,
2943
        .llseek   = no_llseek,
2944
        .read     = bttv_read,
2945
        .mmap     = bttv_mmap,
2946
};
541 giacomo 2947
 
2948
 
428 giacomo 2949
static struct video_device bttv_video_template =
2950
{
2951
        .name     = "UNSET",
2952
        .type     = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY|
2953
                    VID_TYPE_CLIPPING|VID_TYPE_SCALES,
2954
        .hardware = VID_HARDWARE_BT848,
2955
        .fops     = &bttv_fops,
2956
        .minor    = -1,
2957
};
541 giacomo 2958
/*
428 giacomo 2959
struct video_device bttv_vbi_template =
2960
{
2961
        .name     = "bt848/878 vbi",
2962
        .type     = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
2963
        .hardware = VID_HARDWARE_BT848,
2964
        .fops     = &bttv_fops,
2965
        .minor    = -1,
2966
};
516 giacomo 2967
*/
428 giacomo 2968
/* ----------------------------------------------------------------------- */
2969
/* radio interface                                                         */
170 giacomo 2970
 
516 giacomo 2971
int radio_open(struct inode *inode, struct file *file)
428 giacomo 2972
{
2973
        int minor = iminor(inode);
2974
        struct bttv *btv = NULL;
2975
        unsigned int i;
170 giacomo 2976
 
428 giacomo 2977
        dprintk("bttv: open minor=%d\n",minor);
170 giacomo 2978
 
428 giacomo 2979
        for (i = 0; i < bttv_num; i++) {
2980
                if (bttvs[i].radio_dev->minor == minor) {
2981
                        btv = &bttvs[i];
2982
                        break;
2983
                }
2984
        }
2985
        if (NULL == btv)
2986
                return -ENODEV;
170 giacomo 2987
 
428 giacomo 2988
        dprintk("bttv%d: open called (radio)\n",btv->nr);
480 giacomo 2989
        //down(&btv->lock);
428 giacomo 2990
        if (btv->radio_user) {
480 giacomo 2991
                //up(&btv->lock);
428 giacomo 2992
                return -EBUSY;
2993
        }
2994
        btv->radio_user++;
2995
        file->private_data = btv;
170 giacomo 2996
 
428 giacomo 2997
        i2c_vidiocschan(btv);
2998
        bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
2999
        audio_mux(btv,AUDIO_RADIO);
3000
 
480 giacomo 3001
        //up(&btv->lock);
428 giacomo 3002
        return 0;
3003
}
3004
 
516 giacomo 3005
int radio_release(struct inode *inode, struct file *file)
428 giacomo 3006
{
3007
        struct bttv    *btv = file->private_data;
3008
 
3009
        btv->radio_user--;
3010
        return 0;
3011
}
3012
 
516 giacomo 3013
int radio_do_ioctl(struct inode *inode, struct file *file,
428 giacomo 3014
                          unsigned int cmd, void *arg)
3015
{
3016
        struct bttv    *btv = file->private_data;
3017
 
3018
        switch (cmd) {
3019
        case VIDIOCGCAP:
3020
        {
3021
                struct video_capability *cap = arg;
3022
 
3023
                memset(cap,0,sizeof(*cap));
3024
                strcpy(cap->name,btv->radio_dev->name);
3025
                cap->type = VID_TYPE_TUNER;
3026
                cap->channels = 1;
3027
                cap->audios = 1;
3028
                return 0;
170 giacomo 3029
        }
428 giacomo 3030
 
3031
        case VIDIOCGTUNER:
3032
        {
3033
                struct video_tuner *v = arg;
3034
 
3035
                if(v->tuner)
3036
                        return -EINVAL;
3037
                memset(v,0,sizeof(*v));
3038
                strcpy(v->name, "Radio");
3039
                /* japan:          76.0 MHz -  89.9 MHz
3040
                   western europe: 87.5 MHz - 108.0 MHz
3041
                   russia:         65.0 MHz - 108.0 MHz */
3042
                v->rangelow=(int)(65*16);
3043
                v->rangehigh=(int)(108*16);
3044
                bttv_call_i2c_clients(btv,cmd,v);
3045
                return 0;
3046
        }
3047
        case VIDIOCSTUNER:
3048
                /* nothing to do */
3049
                return 0;
170 giacomo 3050
 
428 giacomo 3051
        case BTTV_VERSION:
3052
        case VIDIOCGFREQ:
3053
        case VIDIOCSFREQ:
3054
        case VIDIOCGAUDIO:
3055
        case VIDIOCSAUDIO:
3056
                return bttv_common_ioctls(btv,cmd,arg);
170 giacomo 3057
 
428 giacomo 3058
        default:
3059
                return -ENOIOCTLCMD;
3060
        }
3061
        return 0;
3062
}
170 giacomo 3063
 
516 giacomo 3064
int radio_ioctl(struct inode *inode, struct file *file,
428 giacomo 3065
                       unsigned int cmd, unsigned long arg)
3066
{
516 giacomo 3067
        return 0;//video_usercopy(inode, file, cmd, arg, radio_do_ioctl);
428 giacomo 3068
}
541 giacomo 3069
 
428 giacomo 3070
static struct file_operations radio_fops =
3071
{
3072
        .owner    = THIS_MODULE,
3073
        .open     = radio_open,
3074
        .release  = radio_release,
3075
        .ioctl    = radio_ioctl,
3076
        .llseek   = no_llseek,
3077
};
541 giacomo 3078
 
3079
 
428 giacomo 3080
static struct video_device radio_template =
3081
{
3082
        .name     = "bt848/878 radio",
3083
        .type     = VID_TYPE_TUNER,
3084
        .hardware = VID_HARDWARE_BT848,
3085
        .fops     = &radio_fops,
3086
        .minor    = -1,
3087
};
541 giacomo 3088
 
428 giacomo 3089
/* ----------------------------------------------------------------------- */
3090
/* irq handler                                                             */
170 giacomo 3091
 
428 giacomo 3092
static char *irq_name[] = { "FMTCHG", "VSYNC", "HSYNC", "OFLOW", "HLOCK",
3093
                            "VPRES", "6", "7", "I2CDONE", "GPINT", "10",
3094
                            "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
3095
                            "RIPERR", "PABORT", "OCERR", "SCERR" };
170 giacomo 3096
 
428 giacomo 3097
static void bttv_print_irqbits(u32 print, u32 mark)
3098
{
3099
        unsigned int i;
3100
 
3101
        printk("bits:");
3102
        for (i = 0; i < ARRAY_SIZE(irq_name); i++) {
3103
                if (print & (1 << i))
3104
                        printk(" %s",irq_name[i]);
3105
                if (mark & (1 << i))
3106
                        printk("*");
170 giacomo 3107
        }
428 giacomo 3108
}
170 giacomo 3109
 
428 giacomo 3110
static void bttv_print_riscaddr(struct bttv *btv)
3111
{
3112
        printk("  main: %08Lx\n",
3113
               (unsigned long long)btv->main.dma);
3114
        printk("  vbi : o=%08Lx e=%08Lx\n",
3115
               btv->curr.vbi ? (unsigned long long)btv->curr.vbi->top.dma : 0,
3116
               btv->curr.vbi ? (unsigned long long)btv->curr.vbi->bottom.dma : 0);
3117
        printk("  cap : o=%08Lx e=%08Lx\n",
3118
               btv->curr.top    ? (unsigned long long)btv->curr.top->top.dma : 0,
3119
               btv->curr.bottom ? (unsigned long long)btv->curr.bottom->bottom.dma : 0);
3120
        printk("  scr : o=%08Lx e=%08Lx\n",
3121
               btv->screen ? (unsigned long long)btv->screen->top.dma  : 0,
3122
               btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
3123
}
170 giacomo 3124
 
428 giacomo 3125
static int
3126
bttv_irq_next_set(struct bttv *btv, struct bttv_buffer_set *set)
3127
{
3128
        struct bttv_buffer *item;
170 giacomo 3129
 
428 giacomo 3130
        memset(set,0,sizeof(*set));
170 giacomo 3131
 
428 giacomo 3132
        if (!list_empty(&btv->vcapture)) {
3133
                set->irqflags = 1;
3134
                set->vbi = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3135
        }
170 giacomo 3136
 
428 giacomo 3137
        if (!list_empty(&btv->capture)) {
3138
                set->irqflags = 1;
3139
                item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3140
                if (V4L2_FIELD_HAS_TOP(item->vb.field))
3141
                        set->top    = item;
3142
                if (V4L2_FIELD_HAS_BOTTOM(item->vb.field))
3143
                        set->bottom = item;
170 giacomo 3144
 
428 giacomo 3145
                if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
3146
                    (item->vb.queue.next != &btv->capture)) {
3147
                        item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
3148
                        if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
3149
                                if (NULL == set->top &&
3150
                                    V4L2_FIELD_TOP == item->vb.field) {
3151
                                        set->top = item;
3152
                                }
3153
                                if (NULL == set->bottom &&
3154
                                    V4L2_FIELD_BOTTOM == item->vb.field) {
3155
                                        set->bottom = item;
3156
                                }
3157
                                if (NULL != set->top  &&  NULL != set->bottom)
3158
                                        set->topirq = 2;
3159
                        }
3160
                }
3161
        }
170 giacomo 3162
 
428 giacomo 3163
        if (NULL != btv->screen) {
3164
                if (V4L2_FIELD_HAS_BOTH(btv->screen->vb.field)) {
3165
                        if (NULL == set->top && NULL == set->bottom) {
3166
                                set->top    = btv->screen;
3167
                                set->bottom = btv->screen;
3168
                        }
3169
                } else {
3170
                        if (V4L2_FIELD_TOP == btv->screen->vb.field &&
3171
                            NULL == set->top) {
3172
                                set->top = btv->screen;
3173
                        }
3174
                        if (V4L2_FIELD_BOTTOM == btv->screen->vb.field &&
3175
                            NULL == set->bottom) {
3176
                                set->bottom = btv->screen;
3177
                        }
3178
                }
3179
        }
607 giacomo 3180
 
3181
        dprintk("bttv%d: next set: top=%x bottom=%x vbi=%x "
3182
                "[screen=%x,irq=%d,%d]\n",
3183
                btv->nr,(int)set->top, (int)set->bottom, (int)set->vbi,
3184
                (int)btv->screen,set->irqflags,set->topirq);
170 giacomo 3185
        return 0;
3186
}
3187
 
428 giacomo 3188
static void
3189
bttv_irq_wakeup_set(struct bttv *btv, struct bttv_buffer_set *wakeup,
3190
                    struct bttv_buffer_set *curr, unsigned int state)
3191
{
3192
        struct timeval ts;
170 giacomo 3193
 
516 giacomo 3194
        //do_gettimeofday(&ts);
170 giacomo 3195
 
428 giacomo 3196
        if (NULL != wakeup->vbi) {
3197
                wakeup->vbi->vb.ts = ts;
3198
                wakeup->vbi->vb.field_count = btv->field_count;
3199
                wakeup->vbi->vb.state = state;
491 giacomo 3200
                //wake_up(&wakeup->vbi->vb.done);
428 giacomo 3201
        }
3202
        if (wakeup->top == wakeup->bottom) {
3203
                if (NULL != wakeup->top && curr->top != wakeup->top) {
3204
                        if (irq_debug > 1)
607 giacomo 3205
                                printk("bttv%d: wakeup: both=%x\n",btv->nr,(int)wakeup->top);
428 giacomo 3206
                        wakeup->top->vb.ts = ts;
3207
                        wakeup->top->vb.field_count = btv->field_count;
3208
                        wakeup->top->vb.state = state;
491 giacomo 3209
                        //wake_up(&wakeup->top->vb.done);
428 giacomo 3210
                }
3211
        } else {
3212
                if (NULL != wakeup->top && curr->top != wakeup->top) {
3213
                        if (irq_debug > 1)
607 giacomo 3214
                                printk("bttv%d: wakeup: top=%x\n",btv->nr,(int)wakeup->top);
428 giacomo 3215
                        wakeup->top->vb.ts = ts;
3216
                        wakeup->top->vb.field_count = btv->field_count;
3217
                        wakeup->top->vb.state = state;
491 giacomo 3218
                        //wake_up(&wakeup->top->vb.done);
428 giacomo 3219
                }
3220
                if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) {
3221
                        if (irq_debug > 1)
607 giacomo 3222
                                printk("bttv%d: wakeup: bottom=%x\n",btv->nr,(int)wakeup->bottom);
428 giacomo 3223
                        wakeup->bottom->vb.ts = ts;
3224
                        wakeup->bottom->vb.field_count = btv->field_count;
3225
                        wakeup->bottom->vb.state = state;
3226
                }
3227
        }
3228
}
3229
 
3230
static void bttv_irq_timeout(unsigned long data)
170 giacomo 3231
{
428 giacomo 3232
        struct bttv *btv = (struct bttv *)data;
3233
        struct bttv_buffer_set old,new;
3234
        struct bttv_buffer *item;
3235
 
3236
        if (bttv_verbose) {
3237
                printk(KERN_INFO "bttv%d: timeout: risc=%08x, ",
3238
                       btv->nr,btread(BT848_RISC_COUNT));
3239
                bttv_print_irqbits(btread(BT848_INT_STAT),0);
3240
                printk("\n");
3241
        }
3242
 
3243
        spin_lock(&btv->s_lock);
3244
 
3245
        /* deactivate stuff */
3246
        memset(&new,0,sizeof(new));
3247
        old = btv->curr;
3248
        btv->curr = new;
3249
        bttv_buffer_set_activate(btv, &new);
3250
        bttv_set_dma(btv, 0, 0);
3251
 
3252
        /* wake up */
3253
        bttv_irq_wakeup_set(btv, &old, &new, STATE_ERROR);
3254
 
3255
        /* cancel all outstanding capture / vbi requests */
3256
        while (!list_empty(&btv->capture)) {
3257
                item = list_entry(btv->capture.next, struct bttv_buffer, vb.queue);
3258
                list_del(&item->vb.queue);
3259
                item->vb.state = STATE_ERROR;
491 giacomo 3260
                //wake_up(&item->vb.done);
428 giacomo 3261
        }
3262
        while (!list_empty(&btv->vcapture)) {
3263
                item = list_entry(btv->vcapture.next, struct bttv_buffer, vb.queue);
3264
                list_del(&item->vb.queue);
3265
                item->vb.state = STATE_ERROR;
491 giacomo 3266
                //wake_up(&item->vb.done);
428 giacomo 3267
        }
3268
 
3269
        btv->errors++;
3270
        spin_unlock(&btv->s_lock);     
3271
}
3272
 
3273
static void
3274
bttv_irq_wakeup_top(struct bttv *btv)
3275
{
3276
        struct bttv_buffer *wakeup = btv->curr.top;
3277
 
3278
        if (NULL == wakeup)
3279
                return;
3280
 
3281
        spin_lock(&btv->s_lock);
3282
        btv->curr.topirq = 0;
3283
        btv->curr.top = NULL;
3284
        bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
3285
 
516 giacomo 3286
        //do_gettimeofday(&wakeup->vb.ts);
428 giacomo 3287
        wakeup->vb.field_count = btv->field_count;
3288
        wakeup->vb.state = STATE_DONE;
491 giacomo 3289
        //wake_up(&wakeup->vb.done);
428 giacomo 3290
        spin_unlock(&btv->s_lock);
3291
}
3292
 
3293
static void
3294
bttv_irq_switch_fields(struct bttv *btv)
3295
{
3296
        struct bttv_buffer_set new;
3297
        struct bttv_buffer_set old;
3298
        dma_addr_t rc;
3299
 
3300
        spin_lock(&btv->s_lock);
3301
 
3302
        /* new buffer set */
3303
        bttv_irq_next_set(btv, &new);
3304
        rc = btread(BT848_RISC_COUNT);
3305
        if (rc < btv->main.dma || rc > btv->main.dma + 0x100) {
3306
                if (1 /* irq_debug */)
3307
                        printk("bttv%d: skipped frame. no signal? high irq latency?\n",
3308
                               btv->nr);
3309
                spin_unlock(&btv->s_lock);
3310
                return;
3311
        }
3312
 
3313
        /* switch over */
3314
        old = btv->curr;
3315
        btv->curr = new;
3316
        bttv_buffer_set_activate(btv, &new);
3317
        bttv_set_dma(btv, 0, new.irqflags);
3318
 
3319
        /* switch input */
3320
        if (UNSET != btv->new_input) {
516 giacomo 3321
                //video_mux(btv,btv->new_input);
428 giacomo 3322
                btv->new_input = UNSET;
3323
        }
3324
 
3325
        /* wake up finished buffers */
3326
        bttv_irq_wakeup_set(btv, &old, &new, STATE_DONE);
3327
        spin_unlock(&btv->s_lock);
3328
}
3329
 
3330
static irqreturn_t bttv_irq(int irq, void *dev_id, struct pt_regs * regs)
3331
{
170 giacomo 3332
        u32 stat,astat;
3333
        u32 dstat;
3334
        int count;
428 giacomo 3335
        struct bttv *btv;
3336
        int handled = 0;
170 giacomo 3337
 
428 giacomo 3338
        btv=(struct bttv *)dev_id;
170 giacomo 3339
        count=0;
428 giacomo 3340
        while (1) {
170 giacomo 3341
                /* get/clear interrupt status bits */
3342
                stat=btread(BT848_INT_STAT);
3343
                astat=stat&btread(BT848_INT_MASK);
428 giacomo 3344
                if (!astat)
3345
                        break;
3346
                handled = 1;
170 giacomo 3347
                btwrite(stat,BT848_INT_STAT);
3348
 
3349
                /* get device status bits */
3350
                dstat=btread(BT848_DSTATUS);
3351
 
3352
                if (irq_debug) {
428 giacomo 3353
                        printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d "
3354
                               "riscs=%x, riscc=%08x, ",
3355
                               btv->nr, count, btv->field_count,
3356
                               stat>>28, btread(BT848_RISC_COUNT));
3357
                        bttv_print_irqbits(stat,astat);
170 giacomo 3358
                        if (stat & BT848_INT_HLOCK)
428 giacomo 3359
                                printk("   HLOC => %s", (dstat & BT848_DSTATUS_HLOC)
170 giacomo 3360
                                       ? "yes" : "no");
3361
                        if (stat & BT848_INT_VPRES)
428 giacomo 3362
                                printk("   PRES => %s", (dstat & BT848_DSTATUS_PRES)
170 giacomo 3363
                                       ? "yes" : "no");
3364
                        if (stat & BT848_INT_FMTCHG)
428 giacomo 3365
                                printk("   NUML => %s", (dstat & BT848_DSTATUS_NUML)
170 giacomo 3366
                                       ? "625" : "525");
428 giacomo 3367
                        printk("\n");
170 giacomo 3368
                }
3369
 
696 giacomo 3370
                if (astat&BT848_INT_VSYNC)
428 giacomo 3371
                        btv->field_count++;
170 giacomo 3372
 
428 giacomo 3373
                if (astat & BT848_INT_GPINT) {
3374
#ifdef CONFIG_VIDEO_IR
3375
                        if (btv->remote)
3376
                                bttv_input_irq(btv);
3377
#endif
491 giacomo 3378
                        //wake_up(&btv->gpioq);
170 giacomo 3379
                }
3380
 
428 giacomo 3381
                if ((astat & BT848_INT_RISCI)  &&  (stat & (2<<28)))
3382
                        bttv_irq_wakeup_top(btv);
170 giacomo 3383
 
696 giacomo 3384
                if ((astat & BT848_INT_RISCI)  &&  (stat & (1<<28))) {
3385
                        task_activate(grab_task);
428 giacomo 3386
                        bttv_irq_switch_fields(btv);
696 giacomo 3387
                }
428 giacomo 3388
 
3389
                if ((astat & BT848_INT_HLOCK)  &&  btv->opt_automute)
3390
                        audio_mux(btv, -1);
3391
 
3392
                if (astat & (BT848_INT_SCERR|BT848_INT_OCERR)) {
3393
                        printk(KERN_INFO "bttv%d: %s%s @ %08x,",btv->nr,
3394
                               (astat & BT848_INT_SCERR) ? "SCERR" : "",
3395
                               (astat & BT848_INT_OCERR) ? "OCERR" : "",
3396
                               btread(BT848_RISC_COUNT));
3397
                        bttv_print_irqbits(stat,astat);
3398
                        printk("\n");
3399
                        if (bttv_debug)
3400
                                bttv_print_riscaddr(btv);
170 giacomo 3401
                }
428 giacomo 3402
                if (fdsr && astat & BT848_INT_FDSR) {
3403
                        printk(KERN_INFO "bttv%d: FDSR @ %08x\n",
3404
                               btv->nr,btread(BT848_RISC_COUNT));
3405
                        if (bttv_debug)
3406
                                bttv_print_riscaddr(btv);
3407
                }
170 giacomo 3408
 
3409
                count++;
428 giacomo 3410
                if (count > 4) {
170 giacomo 3411
                        btwrite(0, BT848_INT_MASK);
428 giacomo 3412
                        printk(KERN_ERR
3413
                               "bttv%d: IRQ lockup, cleared int mask [", btv->nr);
3414
                        bttv_print_irqbits(stat,astat);
3415
                        printk("]\n");
170 giacomo 3416
                }
3417
        }
428 giacomo 3418
        return IRQ_RETVAL(handled);
3419
}
170 giacomo 3420
 
257 giacomo 3421
 
428 giacomo 3422
/* ----------------------------------------------------------------------- */
3423
/* initialitation                                                          */
541 giacomo 3424
 
428 giacomo 3425
static struct video_device *vdev_init(struct bttv *btv,
3426
                                      struct video_device *template,
3427
                                      char *type)
3428
{
3429
        struct video_device *vfd;
3430
 
3431
        vfd = video_device_alloc();
3432
        if (NULL == vfd)
3433
                return NULL;
3434
        *vfd = *template;
3435
        vfd->minor   = -1;
3436
        vfd->dev     = &btv->dev->dev;
3437
        vfd->release = video_device_release;
463 giacomo 3438
        snprintf26(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
428 giacomo 3439
                 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
3440
                 type, bttv_tvcards[btv->type].name);
3441
        return vfd;
3442
}
3443
 
541 giacomo 3444
void bttv_unregister_video(struct bttv *btv)
428 giacomo 3445
{
3446
        if (btv->video_dev) {
3447
                if (-1 != btv->video_dev->minor)
3448
                        video_unregister_device(btv->video_dev);
3449
                else
3450
                        video_device_release(btv->video_dev);
3451
                btv->video_dev = NULL;
3452
        }
541 giacomo 3453
        /*
428 giacomo 3454
        if (btv->vbi_dev) {
3455
                if (-1 != btv->vbi_dev->minor)
3456
                        video_unregister_device(btv->vbi_dev);
3457
                else
3458
                        video_device_release(btv->vbi_dev);
3459
                btv->vbi_dev = NULL;
3460
        }
541 giacomo 3461
        */
428 giacomo 3462
        if (btv->radio_dev) {
3463
                if (-1 != btv->radio_dev->minor)
3464
                        video_unregister_device(btv->radio_dev);
3465
                else
3466
                        video_device_release(btv->radio_dev);
3467
                btv->radio_dev = NULL;
3468
        }
3469
}
541 giacomo 3470
 
428 giacomo 3471
/* register video4linux devices */
541 giacomo 3472
 
3473
int __devinit bttv_register_video(struct bttv *btv)
428 giacomo 3474
{
3475
        btv->video_dev = vdev_init(btv, &bttv_video_template, "video");
3476
        if (NULL == btv->video_dev)
3477
                goto err;
3478
        if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0)
3479
                goto err;
3480
        printk(KERN_INFO "bttv%d: registered device video%d\n",
3481
               btv->nr,btv->video_dev->minor & 0x1f);
541 giacomo 3482
        /*
428 giacomo 3483
        video_device_create_file(btv->video_dev, &class_device_attr_card);
3484
        btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
3485
        if (NULL == btv->vbi_dev)
3486
                goto err;
3487
        if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0)
3488
                goto err;
3489
        printk(KERN_INFO "bttv%d: registered device vbi%d\n",
3490
               btv->nr,btv->vbi_dev->minor & 0x1f);
541 giacomo 3491
        */
428 giacomo 3492
        if (!btv->has_radio)
3493
                return 0;
3494
        btv->radio_dev = vdev_init(btv, &radio_template, "radio");
3495
        if (NULL == btv->radio_dev)
3496
                goto err;
3497
        if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0)
3498
                goto err;
3499
        printk(KERN_INFO "bttv%d: registered device radio%d\n",
3500
               btv->nr,btv->radio_dev->minor & 0x1f);
3501
 
3502
        return 0;
3503
 
3504
 err:
3505
        bttv_unregister_video(btv);
3506
        return -1;
3507
}
3508
 
3509
/* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
3510
/* response on cards with no firmware is not enabled by OF */
3511
static void pci_set_command(struct pci_dev *dev)
3512
{
3513
#if defined(__powerpc__)
3514
        unsigned int cmd;
170 giacomo 3515
 
428 giacomo 3516
        pci_read_config_dword(dev, PCI_COMMAND, &cmd);
3517
        cmd = (cmd | PCI_COMMAND_MEMORY );
3518
        pci_write_config_dword(dev, PCI_COMMAND, cmd);
3519
#endif
170 giacomo 3520
}
3521
 
428 giacomo 3522
static int __devinit bttv_probe(struct pci_dev *dev,
3523
                                const struct pci_device_id *pci_id)
170 giacomo 3524
{
428 giacomo 3525
        int result;
170 giacomo 3526
        unsigned char lat;
428 giacomo 3527
        struct bttv *btv;
3528
 
170 giacomo 3529
        if (bttv_num == BTTV_MAX)
3530
                return -ENOMEM;
3531
        printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
428 giacomo 3532
        btv=&bttvs[bttv_num];
3533
        memset(btv,0,sizeof(*btv));
3534
        btv->nr  = bttv_num;
463 giacomo 3535
        sprintf26(btv->name,"bttv%d",btv->nr);
170 giacomo 3536
 
428 giacomo 3537
        /* initialize structs / fill in defaults */
516 giacomo 3538
        //init_MUTEX(&btv->lock);
3539
        //init_MUTEX(&btv->reslock);
428 giacomo 3540
        btv->s_lock = SPIN_LOCK_UNLOCKED;
491 giacomo 3541
        //init_waitqueue_head(&btv->gpioq);
428 giacomo 3542
        INIT_LIST_HEAD(&btv->capture);
3543
        INIT_LIST_HEAD(&btv->vcapture);
3544
#ifdef VIDIOC_G_PRIORITY
3545
        v4l2_prio_init(&btv->prio);
3546
#endif
274 giacomo 3547
 
428 giacomo 3548
        init_timer(&btv->timeout);
3549
        btv->timeout.function = bttv_irq_timeout;
3550
        btv->timeout.data     = (unsigned long)btv;
3551
 
3552
        btv->i2c_rc = -1;
3553
        btv->tuner_type  = UNSET;
3554
        btv->pinnacle_id = UNSET;
3555
        btv->new_input   = UNSET;
3556
        btv->has_radio=radio[btv->nr];
3557
 
3558
        /* pci stuff (init, get irq/mmio, ... */
3559
        btv->dev = dev;
3560
        btv->id  = dev->device;
537 giacomo 3561
 
428 giacomo 3562
        if (pci_enable_device(dev)) {
3563
                printk(KERN_WARNING "bttv%d: Can't enable device.\n",
3564
                       btv->nr);
3565
                return -EIO;
3566
        }
537 giacomo 3567
 
428 giacomo 3568
        if (pci_set_dma_mask(dev, 0xffffffff)) {
3569
                printk(KERN_WARNING "bttv%d: No suitable DMA available.\n",
3570
                       btv->nr);
3571
                return -EIO;
3572
        }
3573
        if (!request_mem_region(pci_resource_start(dev,0),
3574
                                pci_resource_len(dev,0),
3575
                                btv->name)) {
3576
                printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n",
3577
                       btv->nr, pci_resource_start(dev,0));
3578
                return -EBUSY;
3579
        }
537 giacomo 3580
 
428 giacomo 3581
        pci_set_master(dev);
3582
        pci_set_command(dev);
3583
        pci_set_drvdata(dev,btv);
3584
        if (!pci_dma_supported(dev,0xffffffff)) {
3585
                printk("bttv%d: Oops: no 32bit PCI DMA ???\n", btv->nr);
3586
                result = -EIO;
3587
                goto fail1;
3588
        }
170 giacomo 3589
 
428 giacomo 3590
        pci_read_config_byte(dev, PCI_CLASS_REVISION, &btv->revision);
3591
        pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
3592
        printk(KERN_INFO "bttv%d: Bt%d (rev %d) at %s, ",
3593
               bttv_num,btv->id, btv->revision, pci_name(dev));
3594
        printk("irq: %d, latency: %d, mmio: 0x%lx\n",
3595
               btv->dev->irq, lat, pci_resource_start(dev,0));
537 giacomo 3596
 
3597
        udelay(1000);
3598
 
428 giacomo 3599
        btv->bt848_mmio=ioremap(pci_resource_start(dev,0), 0x1000);
3600
        if (NULL == ioremap(pci_resource_start(dev,0), 0x1000)) {
3601
                printk("bttv%d: ioremap() failed\n", btv->nr);
3602
                result = -EIO;
3603
                goto fail1;
170 giacomo 3604
        }
3605
 
428 giacomo 3606
        /* identify card */
170 giacomo 3607
        bttv_idcard(btv);
3608
 
428 giacomo 3609
        /* disable irqs, register irq handler */
170 giacomo 3610
        btwrite(0, BT848_INT_MASK);
428 giacomo 3611
        result = request_irq(btv->dev->irq, bttv_irq,
3612
                             SA_SHIRQ | SA_INTERRUPT,btv->name,(void *)btv);
3613
        if (result < 0) {
3614
                printk(KERN_ERR "bttv%d: can't get IRQ %d\n",
3615
                       bttv_num,btv->dev->irq);
3616
                goto fail1;
3617
        }
170 giacomo 3618
 
428 giacomo 3619
        if (0 != bttv_handle_chipset(btv)) {
3620
                result = -EIO;
3621
                goto fail2;
3622
        }
3623
 
3624
        /* init options from insmod args */
3625
        btv->opt_combfilter = combfilter;
3626
        btv->opt_lumafilter = lumafilter;
3627
        btv->opt_automute   = automute;
3628
        btv->opt_chroma_agc = chroma_agc;
3629
        btv->opt_adc_crush  = adc_crush;
3630
        btv->opt_vcr_hack   = vcr_hack;
170 giacomo 3631
 
428 giacomo 3632
        /* fill struct bttv with some useful defaults */
3633
        btv->init.btv         = btv;
3634
        btv->init.ov.w.width  = 320;
3635
        btv->init.ov.w.height = 240;
3636
        btv->init.fmt         = format_by_palette(VIDEO_PALETTE_RGB24);
3637
        btv->init.width       = 320;
3638
        btv->init.height      = 240;
3639
        btv->init.lines       = 16;
3640
        btv->input = 0;
3641
 
3642
        /* initialize hardware */
3643
        if (bttv_gpio)
3644
                bttv_gpio_tracking(btv,"pre-init");
3645
 
3646
        bttv_risc_init_main(btv);
3647
        if (!bttv_tvcards[btv->type].no_video)
3648
                init_bt848(btv);
3649
 
3650
        /* gpio */
3651
        btwrite(0x00, BT848_GPIO_REG_INP);
3652
        btwrite(0x00, BT848_GPIO_OUT_EN);
3653
        if (bttv_gpio)
3654
                bttv_gpio_tracking(btv,"init");
3655
 
3656
        /* needs to be done before i2c is registered */
3657
        bttv_init_card1(btv);
3658
 
3659
        /* register i2c */
3660
        init_bttv_i2c(btv);
3661
 
3662
        /* some card-specific stuff (needs working i2c) */
3663
        bttv_init_card2(btv);
3664
 
3665
        /* register video4linux + input */
3666
        if (!bttv_tvcards[btv->type].no_video) {
541 giacomo 3667
                bttv_register_video(btv);
428 giacomo 3668
#ifdef CONFIG_VIDEO_IR
3669
                bttv_input_init(btv);
3670
#endif
3671
 
3672
                bt848_bright(btv,32768);
3673
                bt848_contrast(btv,32768);
3674
                bt848_hue(btv,32768);
3675
                bt848_sat(btv,32768);
3676
                audio_mux(btv,AUDIO_MUTE);
3677
                set_input(btv,0);
3678
        }
3679
 
3680
        /* everything is fine */
170 giacomo 3681
        bttv_num++;
3682
        return 0;
3683
 
428 giacomo 3684
 fail2:
3685
        free_irq(btv->dev->irq,btv);
3686
 
3687
 fail1:
3688
        if (btv->bt848_mmio)
3689
                iounmap(btv->bt848_mmio);
3690
        release_mem_region(pci_resource_start(btv->dev,0),
3691
                           pci_resource_len(btv->dev,0));
3692
        pci_set_drvdata(dev,NULL);
3693
        return result;
170 giacomo 3694
}
3695
 
428 giacomo 3696
static void __devexit bttv_remove(struct pci_dev *pci_dev)
170 giacomo 3697
{
428 giacomo 3698
        struct bttv *btv = pci_get_drvdata(pci_dev);
170 giacomo 3699
 
428 giacomo 3700
        if (bttv_verbose)
3701
                printk("bttv%d: unloading\n",btv->nr);
170 giacomo 3702
 
428 giacomo 3703
        /* shutdown everything (DMA+IRQs) */
3704
        btand(~15, BT848_GPIO_DMA_CTL);
3705
        btwrite(0, BT848_INT_MASK);
3706
        btwrite(~0x0, BT848_INT_STAT);
3707
        btwrite(0x0, BT848_GPIO_OUT_EN);
3708
        if (bttv_gpio)
3709
                bttv_gpio_tracking(btv,"cleanup");
170 giacomo 3710
 
428 giacomo 3711
        /* tell gpio modules we are leaving ... */
3712
        btv->shutdown=1;
491 giacomo 3713
        //wake_up(&btv->gpioq);
428 giacomo 3714
 
3715
        /* unregister i2c_bus + input */
3716
        fini_bttv_i2c(btv);
3717
#ifdef CONFIG_VIDEO_IR
3718
        bttv_input_fini(btv);
3719
#endif
3720
 
3721
        /* unregister video4linux */
516 giacomo 3722
        //bttv_unregister_video(btv);
428 giacomo 3723
 
3724
        /* free allocated memory */
3725
        btcx_riscmem_free(btv->dev,&btv->main);
3726
 
3727
        /* free ressources */
3728
        free_irq(btv->dev->irq,btv);
3729
        iounmap(btv->bt848_mmio);
3730
        release_mem_region(pci_resource_start(btv->dev,0),
3731
                           pci_resource_len(btv->dev,0));
3732
 
3733
        pci_set_drvdata(pci_dev, NULL);
3734
        return;
3735
}
3736
 
3737
static struct pci_device_id bttv_pci_tbl[] = {
3738
        {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848,
3739
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3740
        {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849,
3741
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3742
        {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT878,
3743
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3744
        {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT879,
3745
         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3746
        {0,}
3747
};
3748
 
3749
MODULE_DEVICE_TABLE(pci, bttv_pci_tbl);
3750
 
3751
static struct pci_driver bttv_pci_driver = {
3752
        .name     = "bttv",
3753
        .id_table = bttv_pci_tbl,
3754
        .probe    = bttv_probe,
3755
        .remove   = __devexit_p(bttv_remove),
3756
};
3757
 
463 giacomo 3758
int bttv_init_module(void)
428 giacomo 3759
{
3760
        int rc;
170 giacomo 3761
        bttv_num = 0;
3762
 
428 giacomo 3763
        printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
3764
               (BTTV_VERSION_CODE >> 16) & 0xff,
3765
               (BTTV_VERSION_CODE >> 8) & 0xff,
3766
               BTTV_VERSION_CODE & 0xff);
3767
        if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
170 giacomo 3768
                gbuffers = 2;
3769
        if (gbufsize < 0 || gbufsize > BTTV_MAX_FBUF)
3770
                gbufsize = BTTV_MAX_FBUF;
428 giacomo 3771
        gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
170 giacomo 3772
        if (bttv_verbose)
428 giacomo 3773
                printk(KERN_INFO "bttv: using %d buffers with %dk (%d pages) each for capture\n",
3774
                       gbuffers, gbufsize >> 10, gbufsize >> PAGE_SHIFT);
170 giacomo 3775
 
428 giacomo 3776
        bttv_check_chipset();
170 giacomo 3777
 
428 giacomo 3778
        rc = pci_module_init(&bttv_pci_driver);
3779
        if (-ENODEV == rc) {
3780
                /* plenty of people trying to use bttv for the cx2388x ... */
3781
                if (NULL != pci_find_device(0x14f1, 0x8800, NULL))
3782
                        printk("bttv doesn't support your Conexant 2388x card.\n");
3783
        }
3784
        return rc;
3785
}
170 giacomo 3786
 
618 giacomo 3787
void bttv_cleanup_module(void)
428 giacomo 3788
{
3789
        pci_unregister_driver(&bttv_pci_driver);
3790
        return;
3791
}
195 giacomo 3792
 
428 giacomo 3793
module_init(bttv_init_module);
3794
module_exit(bttv_cleanup_module);
195 giacomo 3795
 
428 giacomo 3796
/*
3797
 * Local variables:
3798
 * c-basic-offset: 8
3799
 * End:
3800
 */