Subversion Repositories shark

Rev

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