V4L/DVB (4068): Removed all references to kernel stuff from videodev.h and videodev2.h
[linux-2.6.git] / drivers / media / video / zoran_card.c
1 /*
2  * Zoran zr36057/zr36067 PCI controller driver, for the
3  * Pinnacle/Miro DC10/DC10+/DC30/DC30+, Iomega Buz, Linux
4  * Media Labs LML33/LML33R10.
5  *
6  * This part handles card-specific data and detection
7  *
8  * Copyright (C) 2000 Serguei Miridonov <mirsev@cicese.mx>
9  *
10  * Currently maintained by:
11  *   Ronald Bultje    <rbultje@ronald.bitfreak.net>
12  *   Laurent Pinchart <laurent.pinchart@skynet.be>
13  *   Mailinglist      <mjpeg-users@lists.sf.net>
14  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28  */
29
30 #include <linux/delay.h>
31
32 #include <linux/config.h>
33 #include <linux/types.h>
34 #include <linux/kernel.h>
35 #include <linux/module.h>
36 #include <linux/init.h>
37 #include <linux/vmalloc.h>
38
39 #include <linux/proc_fs.h>
40 #include <linux/i2c.h>
41 #include <linux/i2c-algo-bit.h>
42 #include <linux/videodev.h>
43 #include <media/v4l2-common.h>
44 #include <linux/spinlock.h>
45 #include <linux/sem.h>
46 #include <linux/kmod.h>
47 #include <linux/wait.h>
48
49 #include <linux/pci.h>
50 #include <linux/interrupt.h>
51 #include <linux/video_decoder.h>
52 #include <linux/video_encoder.h>
53 #include <linux/mutex.h>
54
55 #include <asm/io.h>
56
57 #include "videocodec.h"
58 #include "zoran.h"
59 #include "zoran_card.h"
60 #include "zoran_device.h"
61 #include "zoran_procfs.h"
62
63 #define I2C_NAME(x) (x)->name
64
65 extern const struct zoran_format zoran_formats[];
66
67 static int card[BUZ_MAX] = { -1, -1, -1, -1 };
68 module_param_array(card, int, NULL, 0);
69 MODULE_PARM_DESC(card, "The type of card");
70
71 static int encoder[BUZ_MAX] = { -1, -1, -1, -1 };
72 module_param_array(encoder, int, NULL, 0);
73 MODULE_PARM_DESC(encoder, "i2c TV encoder");
74
75 static int decoder[BUZ_MAX] = { -1, -1, -1, -1 };
76 module_param_array(decoder, int, NULL, 0);
77 MODULE_PARM_DESC(decoder, "i2c TV decoder");
78
79 /*
80    The video mem address of the video card.
81    The driver has a little database for some videocards
82    to determine it from there. If your video card is not in there
83    you have either to give it to the driver as a parameter
84    or set in in a VIDIOCSFBUF ioctl
85  */
86
87 static unsigned long vidmem = 0;        /* Video memory base address */
88 module_param(vidmem, ulong, 0);
89
90 /*
91    Default input and video norm at startup of the driver.
92 */
93
94 static int default_input = 0;   /* 0=Composite, 1=S-Video */
95 module_param(default_input, int, 0);
96 MODULE_PARM_DESC(default_input,
97                  "Default input (0=Composite, 1=S-Video, 2=Internal)");
98
99 static int default_mux = 1;     /* 6 Eyes input selection */
100 module_param(default_mux, int, 0);
101 MODULE_PARM_DESC(default_mux,
102                  "Default 6 Eyes mux setting (Input selection)");
103
104 static int default_norm = 0;    /* 0=PAL, 1=NTSC 2=SECAM */
105 module_param(default_norm, int, 0);
106 MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
107
108 static int video_nr = -1;       /* /dev/videoN, -1 for autodetect */
109 module_param(video_nr, int, 0);
110 MODULE_PARM_DESC(video_nr, "video device number");
111
112 /*
113    Number and size of grab buffers for Video 4 Linux
114    The vast majority of applications should not need more than 2,
115    the very popular BTTV driver actually does ONLY have 2.
116    Time sensitive applications might need more, the maximum
117    is VIDEO_MAX_FRAME (defined in <linux/videodev.h>).
118
119    The size is set so that the maximum possible request
120    can be satisfied. Decrease  it, if bigphys_area alloc'd
121    memory is low. If you don't have the bigphys_area patch,
122    set it to 128 KB. Will you allow only to grab small
123    images with V4L, but that's better than nothing.
124
125    v4l_bufsize has to be given in KB !
126
127 */
128
129 int v4l_nbufs = 2;
130 int v4l_bufsize = 128;          /* Everybody should be able to work with this setting */
131 module_param(v4l_nbufs, int, 0);
132 MODULE_PARM_DESC(v4l_nbufs, "Maximum number of V4L buffers to use");
133 module_param(v4l_bufsize, int, 0);
134 MODULE_PARM_DESC(v4l_bufsize, "Maximum size per V4L buffer (in kB)");
135
136 int jpg_nbufs = 32;
137 int jpg_bufsize = 512;          /* max size for 100% quality full-PAL frame */
138 module_param(jpg_nbufs, int, 0);
139 MODULE_PARM_DESC(jpg_nbufs, "Maximum number of JPG buffers to use");
140 module_param(jpg_bufsize, int, 0);
141 MODULE_PARM_DESC(jpg_bufsize, "Maximum size per JPG buffer (in kB)");
142
143 int pass_through = 0;           /* 1=Pass through TV signal when device is not used */
144                                 /* 0=Show color bar when device is not used (LML33: only if lml33dpath=1) */
145 module_param(pass_through, int, 0);
146 MODULE_PARM_DESC(pass_through,
147                  "Pass TV signal through to TV-out when idling");
148
149 static int debug = 1;
150 int *zr_debug = &debug;
151 module_param(debug, int, 0);
152 MODULE_PARM_DESC(debug, "Debug level (0-4)");
153
154 MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
155 MODULE_AUTHOR("Serguei Miridonov");
156 MODULE_LICENSE("GPL");
157
158 static struct pci_device_id zr36067_pci_tbl[] = {
159         {PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057,
160          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
161         {0}
162 };
163 MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
164
165 #define dprintk(num, format, args...) \
166         do { \
167                 if (*zr_debug >= num) \
168                         printk(format, ##args); \
169         } while (0)
170
171 int zoran_num;                  /* number of Buzs in use */
172 struct zoran zoran[BUZ_MAX];
173
174 /* videocodec bus functions ZR36060 */
175 static u32
176 zr36060_read (struct videocodec *codec,
177               u16                reg)
178 {
179         struct zoran *zr = (struct zoran *) codec->master_data->data;
180         __u32 data;
181
182         if (post_office_wait(zr)
183             || post_office_write(zr, 0, 1, reg >> 8)
184             || post_office_write(zr, 0, 2, reg & 0xff)) {
185                 return -1;
186         }
187
188         data = post_office_read(zr, 0, 3) & 0xff;
189         return data;
190 }
191
192 static void
193 zr36060_write (struct videocodec *codec,
194                u16                reg,
195                u32                val)
196 {
197         struct zoran *zr = (struct zoran *) codec->master_data->data;
198
199         if (post_office_wait(zr)
200             || post_office_write(zr, 0, 1, reg >> 8)
201             || post_office_write(zr, 0, 2, reg & 0xff)) {
202                 return;
203         }
204
205         post_office_write(zr, 0, 3, val & 0xff);
206 }
207
208 /* videocodec bus functions ZR36050 */
209 static u32
210 zr36050_read (struct videocodec *codec,
211               u16                reg)
212 {
213         struct zoran *zr = (struct zoran *) codec->master_data->data;
214         __u32 data;
215
216         if (post_office_wait(zr)
217             || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
218                 return -1;
219         }
220
221         data = post_office_read(zr, 0, reg & 0x03) & 0xff;      // reg. LOWBYTES + read
222         return data;
223 }
224
225 static void
226 zr36050_write (struct videocodec *codec,
227                u16                reg,
228                u32                val)
229 {
230         struct zoran *zr = (struct zoran *) codec->master_data->data;
231
232         if (post_office_wait(zr)
233             || post_office_write(zr, 1, 0, reg >> 2)) { // reg. HIGHBYTES
234                 return;
235         }
236
237         post_office_write(zr, 0, reg & 0x03, val & 0xff);       // reg. LOWBYTES + wr. data
238 }
239
240 /* videocodec bus functions ZR36016 */
241 static u32
242 zr36016_read (struct videocodec *codec,
243               u16                reg)
244 {
245         struct zoran *zr = (struct zoran *) codec->master_data->data;
246         __u32 data;
247
248         if (post_office_wait(zr)) {
249                 return -1;
250         }
251
252         data = post_office_read(zr, 2, reg & 0x03) & 0xff;      // read
253         return data;
254 }
255
256 /* hack for in zoran_device.c */
257 void
258 zr36016_write (struct videocodec *codec,
259                u16                reg,
260                u32                val)
261 {
262         struct zoran *zr = (struct zoran *) codec->master_data->data;
263
264         if (post_office_wait(zr)) {
265                 return;
266         }
267
268         post_office_write(zr, 2, reg & 0x03, val & 0x0ff);      // wr. data
269 }
270
271 /*
272  * Board specific information
273  */
274
275 static void
276 dc10_init (struct zoran *zr)
277 {
278         dprintk(3, KERN_DEBUG "%s: dc10_init()\n", ZR_DEVNAME(zr));
279
280         /* Pixel clock selection */
281         GPIO(zr, 4, 0);
282         GPIO(zr, 5, 1);
283         /* Enable the video bus sync signals */
284         GPIO(zr, 7, 0);
285 }
286
287 static void
288 dc10plus_init (struct zoran *zr)
289 {
290         dprintk(3, KERN_DEBUG "%s: dc10plus_init()\n", ZR_DEVNAME(zr));
291 }
292
293 static void
294 buz_init (struct zoran *zr)
295 {
296         dprintk(3, KERN_DEBUG "%s: buz_init()\n", ZR_DEVNAME(zr));
297
298         /* some stuff from Iomega */
299         pci_write_config_dword(zr->pci_dev, 0xfc, 0x90680f15);
300         pci_write_config_dword(zr->pci_dev, 0x0c, 0x00012020);
301         pci_write_config_dword(zr->pci_dev, 0xe8, 0xc0200000);
302 }
303
304 static void
305 lml33_init (struct zoran *zr)
306 {
307         dprintk(3, KERN_DEBUG "%s: lml33_init()\n", ZR_DEVNAME(zr));
308
309         GPIO(zr, 2, 1);         // Set Composite input/output
310 }
311
312 static void
313 avs6eyes_init (struct zoran *zr)
314 {
315         // AverMedia 6-Eyes original driver by Christer Weinigel
316
317         // Lifted straight from Christer's old driver and
318         // modified slightly by Martin Samuelsson.
319
320         int mux = default_mux; /* 1 = BT866, 7 = VID1 */
321
322         GPIO(zr, 4, 1); /* Bt866 SLEEP on */
323         udelay(2);
324
325         GPIO(zr, 0, 1); /* ZR36060 /RESET on */
326         GPIO(zr, 1, 0); /* ZR36060 /SLEEP on */
327         GPIO(zr, 2, mux & 1);   /* MUX S0 */
328         GPIO(zr, 3, 0); /* /FRAME on */
329         GPIO(zr, 4, 0); /* Bt866 SLEEP off */
330         GPIO(zr, 5, mux & 2);   /* MUX S1 */
331         GPIO(zr, 6, 0); /* ? */
332         GPIO(zr, 7, mux & 4);   /* MUX S2 */
333
334 }
335
336 static char *
337 i2cid_to_modulename (u16 i2c_id)
338 {
339         char *name = NULL;
340
341         switch (i2c_id) {
342         case I2C_DRIVERID_SAA7110:
343                 name = "saa7110";
344                 break;
345         case I2C_DRIVERID_SAA7111A:
346                 name = "saa7111";
347                 break;
348         case I2C_DRIVERID_SAA7114:
349                 name = "saa7114";
350                 break;
351         case I2C_DRIVERID_SAA7185B:
352                 name = "saa7185";
353                 break;
354         case I2C_DRIVERID_ADV7170:
355                 name = "adv7170";
356                 break;
357         case I2C_DRIVERID_ADV7175:
358                 name = "adv7175";
359                 break;
360         case I2C_DRIVERID_BT819:
361                 name = "bt819";
362                 break;
363         case I2C_DRIVERID_BT856:
364                 name = "bt856";
365                 break;
366         case I2C_DRIVERID_VPX3220:
367                 name = "vpx3220";
368                 break;
369 /*      case I2C_DRIVERID_VPX3224:
370                 name = "vpx3224";
371                 break;
372         case I2C_DRIVERID_MSE3000:
373                 name = "mse3000";
374                 break;*/
375         default:
376                 break;
377         }
378
379         return name;
380 }
381
382 static char *
383 codecid_to_modulename (u16 codecid)
384 {
385         char *name = NULL;
386
387         switch (codecid) {
388         case CODEC_TYPE_ZR36060:
389                 name = "zr36060";
390                 break;
391         case CODEC_TYPE_ZR36050:
392                 name = "zr36050";
393                 break;
394         case CODEC_TYPE_ZR36016:
395                 name = "zr36016";
396                 break;
397         default:
398                 break;
399         }
400
401         return name;
402 }
403
404 // struct tvnorm {
405 //      u16 Wt, Wa, HStart, HSyncStart, Ht, Ha, VStart;
406 // };
407
408 static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
409 static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
410 static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
411 static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
412
413 static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
414 static struct tvnorm f60ccir601_lml33 = { 858, 720, 57+34, 788, 525, 480, 16 };
415
416 /* The DC10 (57/16/50) uses VActive as HSync, so HStart must be 0 */
417 static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
418 static struct tvnorm f60sqpixel_dc10 = { 780, 640, 0, 716, 525, 480, 12 };
419
420 /* FIXME: I cannot swap U and V in saa7114, so i do one
421  * pixel left shift in zoran (75 -> 74)
422  * (Maxim Yevtyushkin <max@linuxmedialabs.com>) */
423 static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
424 static struct tvnorm f60ccir601_lm33r10 = { 858, 720, 56+54, 788, 525, 480, 16 };
425
426 /* FIXME: The ks0127 seem incapable of swapping U and V, too, which is why I
427  * copy Maxim's left shift hack for the 6 Eyes.
428  *
429  * Christer's driver used the unshifted norms, though...
430  * /Sam  */
431 static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
432 static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
433
434 static struct card_info zoran_cards[NUM_CARDS] __devinitdata = {
435         {
436                 .type = DC10_old,
437                 .name = "DC10(old)",
438                 .i2c_decoder = I2C_DRIVERID_VPX3220,
439                 /*.i2c_encoder = I2C_DRIVERID_MSE3000,*/
440                 .video_codec = CODEC_TYPE_ZR36050,
441                 .video_vfe = CODEC_TYPE_ZR36016,
442
443                 .inputs = 3,
444                 .input = {
445                         { 1, "Composite" },
446                         { 2, "S-Video" },
447                         { 0, "Internal/comp" }
448                 },
449                 .norms = 3,
450                 .tvn = {
451                         &f50sqpixel_dc10,
452                         &f60sqpixel_dc10,
453                         &f50sqpixel_dc10
454                 },
455                 .jpeg_int = 0,
456                 .vsync_int = ZR36057_ISR_GIRQ1,
457                 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
458                 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
459                 .gpcs = { -1, 0 },
460                 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
461                 .gws_not_connected = 0,
462                 .input_mux = 0,
463                 .init = &dc10_init,
464         }, {
465                 .type = DC10_new,
466                 .name = "DC10(new)",
467                 .i2c_decoder = I2C_DRIVERID_SAA7110,
468                 .i2c_encoder = I2C_DRIVERID_ADV7175,
469                 .video_codec = CODEC_TYPE_ZR36060,
470
471                 .inputs = 3,
472                 .input = {
473                                 { 0, "Composite" },
474                                 { 7, "S-Video" },
475                                 { 5, "Internal/comp" }
476                         },
477                 .norms = 3,
478                 .tvn = {
479                                 &f50sqpixel,
480                                 &f60sqpixel,
481                                 &f50sqpixel},
482                 .jpeg_int = ZR36057_ISR_GIRQ0,
483                 .vsync_int = ZR36057_ISR_GIRQ1,
484                 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
485                 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
486                 .gpcs = { -1, 1},
487                 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
488                 .gws_not_connected = 0,
489                 .input_mux = 0,
490                 .init = &dc10plus_init,
491         }, {
492                 .type = DC10plus,
493                 .name = "DC10plus",
494                 .vendor_id = PCI_VENDOR_ID_MIRO,
495                 .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
496                 .i2c_decoder = I2C_DRIVERID_SAA7110,
497                 .i2c_encoder = I2C_DRIVERID_ADV7175,
498                 .video_codec = CODEC_TYPE_ZR36060,
499
500                 .inputs = 3,
501                 .input = {
502                         { 0, "Composite" },
503                         { 7, "S-Video" },
504                         { 5, "Internal/comp" }
505                 },
506                 .norms = 3,
507                 .tvn = {
508                         &f50sqpixel,
509                         &f60sqpixel,
510                         &f50sqpixel
511                 },
512                 .jpeg_int = ZR36057_ISR_GIRQ0,
513                 .vsync_int = ZR36057_ISR_GIRQ1,
514                 .gpio = { 3, 0, 6, 1, 2, -1, 4, 5 },
515                 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
516                 .gpcs = { -1, 1 },
517                 .vfe_pol = { 1, 1, 1, 1, 0, 0, 0, 0 },
518                 .gws_not_connected = 0,
519                 .input_mux = 0,
520                 .init = &dc10plus_init,
521         }, {
522                 .type = DC30,
523                 .name = "DC30",
524                 .i2c_decoder = I2C_DRIVERID_VPX3220,
525                 .i2c_encoder = I2C_DRIVERID_ADV7175,
526                 .video_codec = CODEC_TYPE_ZR36050,
527                 .video_vfe = CODEC_TYPE_ZR36016,
528
529                 .inputs = 3,
530                 .input = {
531                         { 1, "Composite" },
532                         { 2, "S-Video" },
533                         { 0, "Internal/comp" }
534                 },
535                 .norms = 3,
536                 .tvn = {
537                         &f50sqpixel_dc10,
538                         &f60sqpixel_dc10,
539                         &f50sqpixel_dc10
540                 },
541                 .jpeg_int = 0,
542                 .vsync_int = ZR36057_ISR_GIRQ1,
543                 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
544                 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
545                 .gpcs = { -1, 0 },
546                 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
547                 .gws_not_connected = 0,
548                 .input_mux = 0,
549                 .init = &dc10_init,
550         }, {
551                 .type = DC30plus,
552                 .name = "DC30plus",
553                 .vendor_id = PCI_VENDOR_ID_MIRO,
554                 .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
555                 .i2c_decoder = I2C_DRIVERID_VPX3220,
556                 .i2c_encoder = I2C_DRIVERID_ADV7175,
557                 .video_codec = CODEC_TYPE_ZR36050,
558                 .video_vfe = CODEC_TYPE_ZR36016,
559
560                 .inputs = 3,
561                 .input = {
562                         { 1, "Composite" },
563                         { 2, "S-Video" },
564                         { 0, "Internal/comp" }
565                 },
566                 .norms = 3,
567                 .tvn = {
568                         &f50sqpixel_dc10,
569                         &f60sqpixel_dc10,
570                         &f50sqpixel_dc10
571                 },
572                 .jpeg_int = 0,
573                 .vsync_int = ZR36057_ISR_GIRQ1,
574                 .gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },
575                 .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },
576                 .gpcs = { -1, 0 },
577                 .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
578                 .gws_not_connected = 0,
579                 .input_mux = 0,
580                 .init = &dc10_init,
581         }, {
582                 .type = LML33,
583                 .name = "LML33",
584                 .i2c_decoder = I2C_DRIVERID_BT819,
585                 .i2c_encoder = I2C_DRIVERID_BT856,
586                 .video_codec = CODEC_TYPE_ZR36060,
587
588                 .inputs = 2,
589                 .input = {
590                         { 0, "Composite" },
591                         { 7, "S-Video" }
592                 },
593                 .norms = 2,
594                 .tvn = {
595                         &f50ccir601_lml33,
596                         &f60ccir601_lml33,
597                         NULL
598                 },
599                 .jpeg_int = ZR36057_ISR_GIRQ1,
600                 .vsync_int = ZR36057_ISR_GIRQ0,
601                 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
602                 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
603                 .gpcs = { 3, 1 },
604                 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
605                 .gws_not_connected = 1,
606                 .input_mux = 0,
607                 .init = &lml33_init,
608         }, {
609                 .type = LML33R10,
610                 .name = "LML33R10",
611                 .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
612                 .device_id = PCI_DEVICE_ID_LML_33R10,
613                 .i2c_decoder = I2C_DRIVERID_SAA7114,
614                 .i2c_encoder = I2C_DRIVERID_ADV7170,
615                 .video_codec = CODEC_TYPE_ZR36060,
616
617                 .inputs = 2,
618                 .input = {
619                         { 0, "Composite" },
620                         { 7, "S-Video" }
621                 },
622                 .norms = 2,
623                 .tvn = {
624                         &f50ccir601_lm33r10,
625                         &f60ccir601_lm33r10,
626                         NULL
627                 },
628                 .jpeg_int = ZR36057_ISR_GIRQ1,
629                 .vsync_int = ZR36057_ISR_GIRQ0,
630                 .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },
631                 .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },
632                 .gpcs = { 3, 1 },
633                 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
634                 .gws_not_connected = 1,
635                 .input_mux = 0,
636                 .init = &lml33_init,
637         }, {
638                 .type = BUZ,
639                 .name = "Buz",
640                 .vendor_id = PCI_VENDOR_ID_IOMEGA,
641                 .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
642                 .i2c_decoder = I2C_DRIVERID_SAA7111A,
643                 .i2c_encoder = I2C_DRIVERID_SAA7185B,
644                 .video_codec = CODEC_TYPE_ZR36060,
645
646                 .inputs = 2,
647                 .input = {
648                         { 3, "Composite" },
649                         { 7, "S-Video" }
650                 },
651                 .norms = 3,
652                 .tvn = {
653                         &f50ccir601,
654                         &f60ccir601,
655                         &f50ccir601
656                 },
657                 .jpeg_int = ZR36057_ISR_GIRQ1,
658                 .vsync_int = ZR36057_ISR_GIRQ0,
659                 .gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },
660                 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },
661                 .gpcs = { 3, 1 },
662                 .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },
663                 .gws_not_connected = 1,
664                 .input_mux = 0,
665                 .init = &buz_init,
666         }, {
667                 .type = AVS6EYES,
668                 .name = "6-Eyes",
669                 /* AverMedia chose not to brand the 6-Eyes. Thus it
670                    can't be autodetected, and requires card=x. */
671                 .vendor_id = -1,
672                 .device_id = -1,
673                 .i2c_decoder = I2C_DRIVERID_KS0127,
674                 .i2c_encoder = I2C_DRIVERID_BT866,
675                 .video_codec = CODEC_TYPE_ZR36060,
676
677                 .inputs = 10,
678                 .input = {
679                         { 0, "Composite 1" },
680                         { 1, "Composite 2" },
681                         { 2, "Composite 3" },
682                         { 4, "Composite 4" },
683                         { 5, "Composite 5" },
684                         { 6, "Composite 6" },
685                         { 8, "S-Video 1" },
686                         { 9, "S-Video 2" },
687                         {10, "S-Video 3" },
688                         {15, "YCbCr" }
689                 },
690                 .norms = 2,
691                 .tvn = {
692                         &f50ccir601_avs6eyes,
693                         &f60ccir601_avs6eyes,
694                         NULL
695                 },
696                 .jpeg_int = ZR36057_ISR_GIRQ1,
697                 .vsync_int = ZR36057_ISR_GIRQ0,
698                 .gpio = { 1, 0, 3, -1, -1, -1, -1, -1 },// Validity unknown /Sam
699                 .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, // Validity unknown /Sam
700                 .gpcs = { 3, 1 },                       // Validity unknown /Sam
701                 .vfe_pol = { 1, 0, 0, 0, 0, 1, 0, 0 },  // Validity unknown /Sam
702                 .gws_not_connected = 1,
703                 .input_mux = 1,
704                 .init = &avs6eyes_init,
705         }
706
707 };
708
709 /*
710  * I2C functions
711  */
712 /* software I2C functions */
713 static int
714 zoran_i2c_getsda (void *data)
715 {
716         struct zoran *zr = (struct zoran *) data;
717
718         return (btread(ZR36057_I2CBR) >> 1) & 1;
719 }
720
721 static int
722 zoran_i2c_getscl (void *data)
723 {
724         struct zoran *zr = (struct zoran *) data;
725
726         return btread(ZR36057_I2CBR) & 1;
727 }
728
729 static void
730 zoran_i2c_setsda (void *data,
731                   int   state)
732 {
733         struct zoran *zr = (struct zoran *) data;
734
735         if (state)
736                 zr->i2cbr |= 2;
737         else
738                 zr->i2cbr &= ~2;
739         btwrite(zr->i2cbr, ZR36057_I2CBR);
740 }
741
742 static void
743 zoran_i2c_setscl (void *data,
744                   int   state)
745 {
746         struct zoran *zr = (struct zoran *) data;
747
748         if (state)
749                 zr->i2cbr |= 1;
750         else
751                 zr->i2cbr &= ~1;
752         btwrite(zr->i2cbr, ZR36057_I2CBR);
753 }
754
755 static int
756 zoran_i2c_client_register (struct i2c_client *client)
757 {
758         struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
759         int res = 0;
760
761         dprintk(2,
762                 KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
763                 ZR_DEVNAME(zr), client->driver->id);
764
765         mutex_lock(&zr->resource_lock);
766
767         if (zr->user > 0) {
768                 /* we're already busy, so we keep a reference to
769                  * them... Could do a lot of stuff here, but this
770                  * is easiest. (Did I ever mention I'm a lazy ass?)
771                  */
772                 res = -EBUSY;
773                 goto clientreg_unlock_and_return;
774         }
775
776         if (client->driver->id == zr->card.i2c_decoder)
777                 zr->decoder = client;
778         else if (client->driver->id == zr->card.i2c_encoder)
779                 zr->encoder = client;
780         else {
781                 res = -ENODEV;
782                 goto clientreg_unlock_and_return;
783         }
784
785 clientreg_unlock_and_return:
786         mutex_unlock(&zr->resource_lock);
787
788         return res;
789 }
790
791 static int
792 zoran_i2c_client_unregister (struct i2c_client *client)
793 {
794         struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
795         int res = 0;
796
797         dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
798
799         mutex_lock(&zr->resource_lock);
800
801         if (zr->user > 0) {
802                 res = -EBUSY;
803                 goto clientunreg_unlock_and_return;
804         }
805
806         /* try to locate it */
807         if (client == zr->encoder) {
808                 zr->encoder = NULL;
809         } else if (client == zr->decoder) {
810                 zr->decoder = NULL;
811                 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
812         }
813 clientunreg_unlock_and_return:
814         mutex_unlock(&zr->resource_lock);
815         return res;
816 }
817
818 static struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
819         .setsda = zoran_i2c_setsda,
820         .setscl = zoran_i2c_setscl,
821         .getsda = zoran_i2c_getsda,
822         .getscl = zoran_i2c_getscl,
823         .udelay = 10,
824         .mdelay = 0,
825         .timeout = 100,
826 };
827
828 static struct i2c_adapter zoran_i2c_adapter_template = {
829         .name = "zr36057",
830         .id = I2C_HW_B_ZR36067,
831         .algo = NULL,
832         .client_register = zoran_i2c_client_register,
833         .client_unregister = zoran_i2c_client_unregister,
834 };
835
836 static int
837 zoran_register_i2c (struct zoran *zr)
838 {
839         memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
840                sizeof(struct i2c_algo_bit_data));
841         zr->i2c_algo.data = zr;
842         memcpy(&zr->i2c_adapter, &zoran_i2c_adapter_template,
843                sizeof(struct i2c_adapter));
844         strncpy(I2C_NAME(&zr->i2c_adapter), ZR_DEVNAME(zr),
845                 sizeof(I2C_NAME(&zr->i2c_adapter)) - 1);
846         i2c_set_adapdata(&zr->i2c_adapter, zr);
847         zr->i2c_adapter.algo_data = &zr->i2c_algo;
848         return i2c_bit_add_bus(&zr->i2c_adapter);
849 }
850
851 static void
852 zoran_unregister_i2c (struct zoran *zr)
853 {
854         i2c_bit_del_bus((&zr->i2c_adapter));
855 }
856
857 /* Check a zoran_params struct for correctness, insert default params */
858
859 int
860 zoran_check_jpg_settings (struct zoran              *zr,
861                           struct zoran_jpg_settings *settings)
862 {
863         int err = 0, err0 = 0;
864
865         dprintk(4,
866                 KERN_DEBUG
867                 "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",
868                 ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,
869                 settings->VerDcm, settings->TmpDcm);
870         dprintk(4,
871                 KERN_DEBUG
872                 "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",
873                 ZR_DEVNAME(zr), settings->img_x, settings->img_y,
874                 settings->img_width, settings->img_height);
875         /* Check decimation, set default values for decimation = 1, 2, 4 */
876         switch (settings->decimation) {
877         case 1:
878
879                 settings->HorDcm = 1;
880                 settings->VerDcm = 1;
881                 settings->TmpDcm = 1;
882                 settings->field_per_buff = 2;
883                 settings->img_x = 0;
884                 settings->img_y = 0;
885                 settings->img_width = BUZ_MAX_WIDTH;
886                 settings->img_height = BUZ_MAX_HEIGHT / 2;
887                 break;
888         case 2:
889
890                 settings->HorDcm = 2;
891                 settings->VerDcm = 1;
892                 settings->TmpDcm = 2;
893                 settings->field_per_buff = 1;
894                 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
895                 settings->img_y = 0;
896                 settings->img_width =
897                     (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
898                 settings->img_height = BUZ_MAX_HEIGHT / 2;
899                 break;
900         case 4:
901
902                 if (zr->card.type == DC10_new) {
903                         dprintk(1,
904                                 KERN_DEBUG
905                                 "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",
906                                 ZR_DEVNAME(zr));
907                         err0++;
908                         break;
909                 }
910
911                 settings->HorDcm = 4;
912                 settings->VerDcm = 2;
913                 settings->TmpDcm = 2;
914                 settings->field_per_buff = 1;
915                 settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;
916                 settings->img_y = 0;
917                 settings->img_width =
918                     (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;
919                 settings->img_height = BUZ_MAX_HEIGHT / 2;
920                 break;
921         case 0:
922
923                 /* We have to check the data the user has set */
924
925                 if (settings->HorDcm != 1 && settings->HorDcm != 2 &&
926                     (zr->card.type == DC10_new || settings->HorDcm != 4))
927                         err0++;
928                 if (settings->VerDcm != 1 && settings->VerDcm != 2)
929                         err0++;
930                 if (settings->TmpDcm != 1 && settings->TmpDcm != 2)
931                         err0++;
932                 if (settings->field_per_buff != 1 &&
933                     settings->field_per_buff != 2)
934                         err0++;
935                 if (settings->img_x < 0)
936                         err0++;
937                 if (settings->img_y < 0)
938                         err0++;
939                 if (settings->img_width < 0)
940                         err0++;
941                 if (settings->img_height < 0)
942                         err0++;
943                 if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)
944                         err0++;
945                 if (settings->img_y + settings->img_height >
946                     BUZ_MAX_HEIGHT / 2)
947                         err0++;
948                 if (settings->HorDcm && settings->VerDcm) {
949                         if (settings->img_width %
950                             (16 * settings->HorDcm) != 0)
951                                 err0++;
952                         if (settings->img_height %
953                             (8 * settings->VerDcm) != 0)
954                                 err0++;
955                 }
956
957                 if (err0) {
958                         dprintk(1,
959                                 KERN_ERR
960                                 "%s: check_jpg_settings() - error in params for decimation = 0\n",
961                                 ZR_DEVNAME(zr));
962                         err++;
963                 }
964                 break;
965         default:
966                 dprintk(1,
967                         KERN_ERR
968                         "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",
969                         ZR_DEVNAME(zr), settings->decimation);
970                 err++;
971                 break;
972         }
973
974         if (settings->jpg_comp.quality > 100)
975                 settings->jpg_comp.quality = 100;
976         if (settings->jpg_comp.quality < 5)
977                 settings->jpg_comp.quality = 5;
978         if (settings->jpg_comp.APPn < 0)
979                 settings->jpg_comp.APPn = 0;
980         if (settings->jpg_comp.APPn > 15)
981                 settings->jpg_comp.APPn = 15;
982         if (settings->jpg_comp.APP_len < 0)
983                 settings->jpg_comp.APP_len = 0;
984         if (settings->jpg_comp.APP_len > 60)
985                 settings->jpg_comp.APP_len = 60;
986         if (settings->jpg_comp.COM_len < 0)
987                 settings->jpg_comp.COM_len = 0;
988         if (settings->jpg_comp.COM_len > 60)
989                 settings->jpg_comp.COM_len = 60;
990         if (err)
991                 return -EINVAL;
992         return 0;
993 }
994
995 void
996 zoran_open_init_params (struct zoran *zr)
997 {
998         int i;
999
1000         /* User must explicitly set a window */
1001         zr->overlay_settings.is_set = 0;
1002         zr->overlay_mask = NULL;
1003         zr->overlay_active = ZORAN_FREE;
1004
1005         zr->v4l_memgrab_active = 0;
1006         zr->v4l_overlay_active = 0;
1007         zr->v4l_grab_frame = NO_GRAB_ACTIVE;
1008         zr->v4l_grab_seq = 0;
1009         zr->v4l_settings.width = 192;
1010         zr->v4l_settings.height = 144;
1011         zr->v4l_settings.format = &zoran_formats[4];    /* YUY2 - YUV-4:2:2 packed */
1012         zr->v4l_settings.bytesperline =
1013             zr->v4l_settings.width *
1014             ((zr->v4l_settings.format->depth + 7) / 8);
1015
1016         /* DMA ring stuff for V4L */
1017         zr->v4l_pend_tail = 0;
1018         zr->v4l_pend_head = 0;
1019         zr->v4l_sync_tail = 0;
1020         zr->v4l_buffers.active = ZORAN_FREE;
1021         for (i = 0; i < VIDEO_MAX_FRAME; i++) {
1022                 zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER;       /* nothing going on */
1023         }
1024         zr->v4l_buffers.allocated = 0;
1025
1026         for (i = 0; i < BUZ_MAX_FRAME; i++) {
1027                 zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER;       /* nothing going on */
1028         }
1029         zr->jpg_buffers.active = ZORAN_FREE;
1030         zr->jpg_buffers.allocated = 0;
1031         /* Set necessary params and call zoran_check_jpg_settings to set the defaults */
1032         zr->jpg_settings.decimation = 1;
1033         zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */
1034         if (zr->card.type != BUZ)
1035                 zr->jpg_settings.odd_even = 1;
1036         else
1037                 zr->jpg_settings.odd_even = 0;
1038         zr->jpg_settings.jpg_comp.APPn = 0;
1039         zr->jpg_settings.jpg_comp.APP_len = 0;  /* No APPn marker */
1040         memset(zr->jpg_settings.jpg_comp.APP_data, 0,
1041                sizeof(zr->jpg_settings.jpg_comp.APP_data));
1042         zr->jpg_settings.jpg_comp.COM_len = 0;  /* No COM marker */
1043         memset(zr->jpg_settings.jpg_comp.COM_data, 0,
1044                sizeof(zr->jpg_settings.jpg_comp.COM_data));
1045         zr->jpg_settings.jpg_comp.jpeg_markers =
1046             JPEG_MARKER_DHT | JPEG_MARKER_DQT;
1047         i = zoran_check_jpg_settings(zr, &zr->jpg_settings);
1048         if (i)
1049                 dprintk(1,
1050                         KERN_ERR
1051                         "%s: zoran_open_init_params() internal error\n",
1052                         ZR_DEVNAME(zr));
1053
1054         clear_interrupt_counters(zr);
1055         zr->testing = 0;
1056 }
1057
1058 static void __devinit
1059 test_interrupts (struct zoran *zr)
1060 {
1061         DEFINE_WAIT(wait);
1062         int timeout, icr;
1063
1064         clear_interrupt_counters(zr);
1065
1066         zr->testing = 1;
1067         icr = btread(ZR36057_ICR);
1068         btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);
1069         prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);
1070         timeout = schedule_timeout(HZ);
1071         finish_wait(&zr->test_q, &wait);
1072         btwrite(0, ZR36057_ICR);
1073         btwrite(0x78000000, ZR36057_ISR);
1074         zr->testing = 0;
1075         dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));
1076         if (timeout) {
1077                 dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);
1078         }
1079         if (*zr_debug > 1)
1080                 print_interrupts(zr);
1081         btwrite(icr, ZR36057_ICR);
1082 }
1083
1084 static int __devinit
1085 zr36057_init (struct zoran *zr)
1086 {
1087         int j, err;
1088         int two = 2;
1089         int zero = 0;
1090
1091         dprintk(1,
1092                 KERN_INFO
1093                 "%s: zr36057_init() - initializing card[%d], zr=%p\n",
1094                 ZR_DEVNAME(zr), zr->id, zr);
1095
1096         /* default setup of all parameters which will persist between opens */
1097         zr->user = 0;
1098
1099         init_waitqueue_head(&zr->v4l_capq);
1100         init_waitqueue_head(&zr->jpg_capq);
1101         init_waitqueue_head(&zr->test_q);
1102         zr->jpg_buffers.allocated = 0;
1103         zr->v4l_buffers.allocated = 0;
1104
1105         zr->buffer.base = (void *) vidmem;
1106         zr->buffer.width = 0;
1107         zr->buffer.height = 0;
1108         zr->buffer.depth = 0;
1109         zr->buffer.bytesperline = 0;
1110
1111         /* Avoid nonsense settings from user for default input/norm */
1112         if (default_norm < VIDEO_MODE_PAL &&
1113             default_norm > VIDEO_MODE_SECAM)
1114                 default_norm = VIDEO_MODE_PAL;
1115         zr->norm = default_norm;
1116         if (!(zr->timing = zr->card.tvn[zr->norm])) {
1117                 dprintk(1,
1118                         KERN_WARNING
1119                         "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",
1120                         ZR_DEVNAME(zr));
1121                 zr->norm = VIDEO_MODE_PAL;
1122                 zr->timing = zr->card.tvn[zr->norm];
1123         }
1124
1125         zr->input = default_input = (default_input ? 1 : 0);
1126
1127         /* Should the following be reset at every open ? */
1128         zr->hue = 32768;
1129         zr->contrast = 32768;
1130         zr->saturation = 32768;
1131         zr->brightness = 32768;
1132
1133         /* default setup (will be repeated at every open) */
1134         zoran_open_init_params(zr);
1135
1136         /* allocate memory *before* doing anything to the hardware
1137          * in case allocation fails */
1138         zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
1139         zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
1140         if (!zr->stat_com || !zr->video_dev) {
1141                 dprintk(1,
1142                         KERN_ERR
1143                         "%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
1144                         ZR_DEVNAME(zr));
1145                 err = -ENOMEM;
1146                 goto exit_free;
1147         }
1148         for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
1149                 zr->stat_com[j] = 1;    /* mark as unavailable to zr36057 */
1150         }
1151
1152         /*
1153          *   Now add the template and register the device unit.
1154          */
1155         memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
1156         strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
1157         err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr);
1158         if (err < 0)
1159                 goto exit_unregister;
1160
1161         zoran_init_hardware(zr);
1162         if (*zr_debug > 2)
1163                 detect_guest_activity(zr);
1164         test_interrupts(zr);
1165         if (!pass_through) {
1166                 decoder_command(zr, DECODER_ENABLE_OUTPUT, &zero);
1167                 encoder_command(zr, ENCODER_SET_INPUT, &two);
1168         }
1169
1170         zr->zoran_proc = NULL;
1171         zr->initialized = 1;
1172         return 0;
1173
1174 exit_unregister:
1175         zoran_unregister_i2c(zr);
1176 exit_free:
1177         kfree(zr->stat_com);
1178         kfree(zr->video_dev);
1179         return err;
1180 }
1181
1182 static void
1183 zoran_release (struct zoran *zr)
1184 {
1185         if (!zr->initialized)
1186                 return;
1187         /* unregister videocodec bus */
1188         if (zr->codec) {
1189                 struct videocodec_master *master = zr->codec->master_data;
1190
1191                 videocodec_detach(zr->codec);
1192                 kfree(master);
1193         }
1194         if (zr->vfe) {
1195                 struct videocodec_master *master = zr->vfe->master_data;
1196
1197                 videocodec_detach(zr->vfe);
1198                 kfree(master);
1199         }
1200
1201         /* unregister i2c bus */
1202         zoran_unregister_i2c(zr);
1203         /* disable PCI bus-mastering */
1204         zoran_set_pci_master(zr, 0);
1205         /* put chip into reset */
1206         btwrite(0, ZR36057_SPGPPCR);
1207         free_irq(zr->pci_dev->irq, zr);
1208         /* unmap and free memory */
1209         kfree(zr->stat_com);
1210         zoran_proc_cleanup(zr);
1211         iounmap(zr->zr36057_mem);
1212         pci_disable_device(zr->pci_dev);
1213         video_unregister_device(zr->video_dev);
1214 }
1215
1216 void
1217 zoran_vdev_release (struct video_device *vdev)
1218 {
1219         kfree(vdev);
1220 }
1221
1222 static struct videocodec_master * __devinit
1223 zoran_setup_videocodec (struct zoran *zr,
1224                         int           type)
1225 {
1226         struct videocodec_master *m = NULL;
1227
1228         m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1229         if (!m) {
1230                 dprintk(1,
1231                         KERN_ERR
1232                         "%s: zoran_setup_videocodec() - no memory\n",
1233                         ZR_DEVNAME(zr));
1234                 return m;
1235         }
1236
1237         m->magic = 0L; /* magic not used */
1238         m->type = VID_HARDWARE_ZR36067;
1239         m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1240         strncpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1241         m->data = zr;
1242
1243         switch (type)
1244         {
1245         case CODEC_TYPE_ZR36060:
1246                 m->readreg = zr36060_read;
1247                 m->writereg = zr36060_write;
1248                 m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1249                 break;
1250         case CODEC_TYPE_ZR36050:
1251                 m->readreg = zr36050_read;
1252                 m->writereg = zr36050_write;
1253                 m->flags |= CODEC_FLAG_JPEG;
1254                 break;
1255         case CODEC_TYPE_ZR36016:
1256                 m->readreg = zr36016_read;
1257                 m->writereg = zr36016_write;
1258                 m->flags |= CODEC_FLAG_VFE;
1259                 break;
1260         }
1261
1262         return m;
1263 }
1264
1265 /*
1266  *   Scan for a Buz card (actually for the PCI contoler ZR36057),
1267  *   request the irq and map the io memory
1268  */
1269 static int __devinit
1270 find_zr36057 (void)
1271 {
1272         unsigned char latency, need_latency;
1273         struct zoran *zr;
1274         struct pci_dev *dev = NULL;
1275         int result;
1276         struct videocodec_master *master_vfe = NULL;
1277         struct videocodec_master *master_codec = NULL;
1278         int card_num;
1279         char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
1280
1281         zoran_num = 0;
1282         while (zoran_num < BUZ_MAX &&
1283                (dev =
1284                 pci_find_device(PCI_VENDOR_ID_ZORAN,
1285                                 PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
1286                 card_num = card[zoran_num];
1287                 zr = &zoran[zoran_num];
1288                 memset(zr, 0, sizeof(struct zoran));    // Just in case if previous cycle failed
1289                 zr->pci_dev = dev;
1290                 //zr->zr36057_mem = NULL;
1291                 zr->id = zoran_num;
1292                 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1293                 spin_lock_init(&zr->spinlock);
1294                 mutex_init(&zr->resource_lock);
1295                 if (pci_enable_device(dev))
1296                         continue;
1297                 zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
1298                 pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
1299                                      &zr->revision);
1300                 if (zr->revision < 2) {
1301                         dprintk(1,
1302                                 KERN_INFO
1303                                 "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
1304                                 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1305                                 zr->zr36057_adr);
1306
1307                         if (card_num == -1) {
1308                                 dprintk(1,
1309                                         KERN_ERR
1310                                         "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
1311                                         ZR_DEVNAME(zr));
1312                                 continue;
1313                         }
1314                 } else {
1315                         int i;
1316                         unsigned short ss_vendor, ss_device;
1317
1318                         ss_vendor = zr->pci_dev->subsystem_vendor;
1319                         ss_device = zr->pci_dev->subsystem_device;
1320                         dprintk(1,
1321                                 KERN_INFO
1322                                 "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
1323                                 ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
1324                                 zr->zr36057_adr);
1325                         dprintk(1,
1326                                 KERN_INFO
1327                                 "%s: subsystem vendor=0x%04x id=0x%04x\n",
1328                                 ZR_DEVNAME(zr), ss_vendor, ss_device);
1329                         if (card_num == -1) {
1330                                 dprintk(3,
1331                                         KERN_DEBUG
1332                                         "%s: find_zr36057() - trying to autodetect card type\n",
1333                                         ZR_DEVNAME(zr));
1334                                 for (i=0;i<NUM_CARDS;i++) {
1335                                         if (ss_vendor == zoran_cards[i].vendor_id &&
1336                                             ss_device == zoran_cards[i].device_id) {
1337                                                 dprintk(3,
1338                                                         KERN_DEBUG
1339                                                         "%s: find_zr36057() - card %s detected\n",
1340                                                         ZR_DEVNAME(zr),
1341                                                         zoran_cards[i].name);
1342                                                 card_num = i;
1343                                                 break;
1344                                         }
1345                                 }
1346                                 if (i == NUM_CARDS) {
1347                                         dprintk(1,
1348                                                 KERN_ERR
1349                                                 "%s: find_zr36057() - unknown card\n",
1350                                                 ZR_DEVNAME(zr));
1351                                         continue;
1352                                 }
1353                         }
1354                 }
1355
1356                 if (card_num < 0 || card_num >= NUM_CARDS) {
1357                         dprintk(2,
1358                                 KERN_ERR
1359                                 "%s: find_zr36057() - invalid cardnum %d\n",
1360                                 ZR_DEVNAME(zr), card_num);
1361                         continue;
1362                 }
1363
1364                 /* even though we make this a non pointer and thus
1365                  * theoretically allow for making changes to this struct
1366                  * on a per-individual card basis at runtime, this is
1367                  * strongly discouraged. This structure is intended to
1368                  * keep general card information, no settings or anything */
1369                 zr->card = zoran_cards[card_num];
1370                 snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1371                          "%s[%u]", zr->card.name, zr->id);
1372
1373                 zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
1374                 if (!zr->zr36057_mem) {
1375                         dprintk(1,
1376                                 KERN_ERR
1377                                 "%s: find_zr36057() - ioremap failed\n",
1378                                 ZR_DEVNAME(zr));
1379                         continue;
1380                 }
1381
1382                 result = request_irq(zr->pci_dev->irq,
1383                                      zoran_irq,
1384                                      SA_SHIRQ | SA_INTERRUPT,
1385                                      ZR_DEVNAME(zr),
1386                                      (void *) zr);
1387                 if (result < 0) {
1388                         if (result == -EINVAL) {
1389                                 dprintk(1,
1390                                         KERN_ERR
1391                                         "%s: find_zr36057() - bad irq number or handler\n",
1392                                         ZR_DEVNAME(zr));
1393                         } else if (result == -EBUSY) {
1394                                 dprintk(1,
1395                                         KERN_ERR
1396                                         "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
1397                                         ZR_DEVNAME(zr), zr->pci_dev->irq);
1398                         } else {
1399                                 dprintk(1,
1400                                         KERN_ERR
1401                                         "%s: find_zr36057() - can't assign irq, error code %d\n",
1402                                         ZR_DEVNAME(zr), result);
1403                         }
1404                         goto zr_unmap;
1405                 }
1406
1407                 /* set PCI latency timer */
1408                 pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1409                                      &latency);
1410                 need_latency = zr->revision > 1 ? 32 : 48;
1411                 if (latency != need_latency) {
1412                         dprintk(2,
1413                                 KERN_INFO
1414                                 "%s: Changing PCI latency from %d to %d.\n",
1415                                 ZR_DEVNAME(zr), latency, need_latency);
1416                         pci_write_config_byte(zr->pci_dev,
1417                                               PCI_LATENCY_TIMER,
1418                                               need_latency);
1419                 }
1420
1421                 zr36057_restart(zr);
1422                 /* i2c */
1423                 dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1424                         ZR_DEVNAME(zr));
1425
1426                 /* i2c decoder */
1427                 if (decoder[zr->id] != -1) {
1428                         i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
1429                         zr->card.i2c_decoder = decoder[zr->id];
1430                 } else if (zr->card.i2c_decoder != 0) {
1431                         i2c_dec_name =
1432                                 i2cid_to_modulename(zr->card.i2c_decoder);
1433                 } else {
1434                         i2c_dec_name = NULL;
1435                 }
1436
1437                 if (i2c_dec_name) {
1438                         if ((result = request_module(i2c_dec_name)) < 0) {
1439                                 dprintk(1,
1440                                         KERN_ERR
1441                                         "%s: failed to load module %s: %d\n",
1442                                         ZR_DEVNAME(zr), i2c_dec_name, result);
1443                         }
1444                 }
1445
1446                 /* i2c encoder */
1447                 if (encoder[zr->id] != -1) {
1448                         i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
1449                         zr->card.i2c_encoder = encoder[zr->id];
1450                 } else if (zr->card.i2c_encoder != 0) {
1451                         i2c_enc_name =
1452                                 i2cid_to_modulename(zr->card.i2c_encoder);
1453                 } else {
1454                         i2c_enc_name = NULL;
1455                 }
1456
1457                 if (i2c_enc_name) {
1458                         if ((result = request_module(i2c_enc_name)) < 0) {
1459                                 dprintk(1,
1460                                         KERN_ERR
1461                                         "%s: failed to load module %s: %d\n",
1462                                         ZR_DEVNAME(zr), i2c_enc_name, result);
1463                         }
1464                 }
1465
1466                 if (zoran_register_i2c(zr) < 0) {
1467                         dprintk(1,
1468                                 KERN_ERR
1469                                 "%s: find_zr36057() - can't initialize i2c bus\n",
1470                                 ZR_DEVNAME(zr));
1471                         goto zr_free_irq;
1472                 }
1473
1474                 dprintk(2,
1475                         KERN_INFO "%s: Initializing videocodec bus...\n",
1476                         ZR_DEVNAME(zr));
1477
1478                 if (zr->card.video_codec != 0 &&
1479                     (codec_name =
1480                      codecid_to_modulename(zr->card.video_codec)) != NULL) {
1481                         if ((result = request_module(codec_name)) < 0) {
1482                                 dprintk(1,
1483                                         KERN_ERR
1484                                         "%s: failed to load modules %s: %d\n",
1485                                         ZR_DEVNAME(zr), codec_name, result);
1486                         }
1487                 }
1488                 if (zr->card.video_vfe != 0 &&
1489                     (vfe_name =
1490                      codecid_to_modulename(zr->card.video_vfe)) != NULL) {
1491                         if ((result = request_module(vfe_name)) < 0) {
1492                                 dprintk(1,
1493                                         KERN_ERR
1494                                         "%s: failed to load modules %s: %d\n",
1495                                         ZR_DEVNAME(zr), vfe_name, result);
1496                         }
1497                 }
1498
1499                 /* reset JPEG codec */
1500                 jpeg_codec_sleep(zr, 1);
1501                 jpeg_codec_reset(zr);
1502                 /* video bus enabled */
1503                 /* display codec revision */
1504                 if (zr->card.video_codec != 0) {
1505                         master_codec = zoran_setup_videocodec(zr,
1506                                                               zr->card.video_codec);
1507                         if (!master_codec)
1508                                 goto zr_unreg_i2c;
1509                         zr->codec = videocodec_attach(master_codec);
1510                         if (!zr->codec) {
1511                                 dprintk(1,
1512                                         KERN_ERR
1513                                         "%s: find_zr36057() - no codec found\n",
1514                                         ZR_DEVNAME(zr));
1515                                 goto zr_free_codec;
1516                         }
1517                         if (zr->codec->type != zr->card.video_codec) {
1518                                 dprintk(1,
1519                                         KERN_ERR
1520                                         "%s: find_zr36057() - wrong codec\n",
1521                                         ZR_DEVNAME(zr));
1522                                 goto zr_detach_codec;
1523                         }
1524                 }
1525                 if (zr->card.video_vfe != 0) {
1526                         master_vfe = zoran_setup_videocodec(zr,
1527                                                             zr->card.video_vfe);
1528                         if (!master_vfe)
1529                                 goto zr_detach_codec;
1530                         zr->vfe = videocodec_attach(master_vfe);
1531                         if (!zr->vfe) {
1532                                 dprintk(1,
1533                                         KERN_ERR
1534                                         "%s: find_zr36057() - no VFE found\n",
1535                                         ZR_DEVNAME(zr));
1536                                 goto zr_free_vfe;
1537                         }
1538                         if (zr->vfe->type != zr->card.video_vfe) {
1539                                 dprintk(1,
1540                                         KERN_ERR
1541                                         "%s: find_zr36057() = wrong VFE\n",
1542                                         ZR_DEVNAME(zr));
1543                                 goto zr_detach_vfe;
1544                         }
1545                 }
1546
1547                 zoran_num++;
1548                 continue;
1549
1550                 // Init errors
1551               zr_detach_vfe:
1552                 videocodec_detach(zr->vfe);
1553               zr_free_vfe:
1554                 kfree(master_vfe);
1555               zr_detach_codec:
1556                 videocodec_detach(zr->codec);
1557               zr_free_codec:
1558                 kfree(master_codec);
1559               zr_unreg_i2c:
1560                 zoran_unregister_i2c(zr);
1561               zr_free_irq:
1562                 btwrite(0, ZR36057_SPGPPCR);
1563                 free_irq(zr->pci_dev->irq, zr);
1564               zr_unmap:
1565                 iounmap(zr->zr36057_mem);
1566                 continue;
1567         }
1568         if (zoran_num == 0) {
1569                 dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
1570         }
1571         return zoran_num;
1572 }
1573
1574 static int __init
1575 init_dc10_cards (void)
1576 {
1577         int i;
1578
1579         memset(zoran, 0, sizeof(zoran));
1580         printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
1581                MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
1582
1583         /* Look for cards */
1584         if (find_zr36057() < 0) {
1585                 return -EIO;
1586         }
1587         if (zoran_num == 0)
1588                 return -ENODEV;
1589         dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
1590                 zoran_num);
1591         /* check the parameters we have been given, adjust if necessary */
1592         if (v4l_nbufs < 2)
1593                 v4l_nbufs = 2;
1594         if (v4l_nbufs > VIDEO_MAX_FRAME)
1595                 v4l_nbufs = VIDEO_MAX_FRAME;
1596         /* The user specfies the in KB, we want them in byte
1597          * (and page aligned) */
1598         v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1599         if (v4l_bufsize < 32768)
1600                 v4l_bufsize = 32768;
1601         /* 2 MB is arbitrary but sufficient for the maximum possible images */
1602         if (v4l_bufsize > 2048 * 1024)
1603                 v4l_bufsize = 2048 * 1024;
1604         if (jpg_nbufs < 4)
1605                 jpg_nbufs = 4;
1606         if (jpg_nbufs > BUZ_MAX_FRAME)
1607                 jpg_nbufs = BUZ_MAX_FRAME;
1608         jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1609         if (jpg_bufsize < 8192)
1610                 jpg_bufsize = 8192;
1611         if (jpg_bufsize > (512 * 1024))
1612                 jpg_bufsize = 512 * 1024;
1613         /* Use parameter for vidmem or try to find a video card */
1614         if (vidmem) {
1615                 dprintk(1,
1616                         KERN_INFO
1617                         "%s: Using supplied video memory base address @ 0x%lx\n",
1618                         ZORAN_NAME, vidmem);
1619         }
1620
1621         /* random nonsense */
1622         dprintk(5, KERN_DEBUG "Jotti is een held!\n");
1623
1624         /* some mainboards might not do PCI-PCI data transfer well */
1625         if (pci_pci_problems & PCIPCI_FAIL) {
1626                 dprintk(1,
1627                         KERN_WARNING
1628                         "%s: chipset may not support reliable PCI-PCI DMA\n",
1629                         ZORAN_NAME);
1630         }
1631
1632         /* take care of Natoma chipset and a revision 1 zr36057 */
1633         for (i = 0; i < zoran_num; i++) {
1634                 struct zoran *zr = &zoran[i];
1635
1636                 if (pci_pci_problems & PCIPCI_NATOMA && zr->revision <= 1) {
1637                         zr->jpg_buffers.need_contiguous = 1;
1638                         dprintk(1,
1639                                 KERN_INFO
1640                                 "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1641                                 ZR_DEVNAME(zr));
1642                 }
1643
1644                 if (zr36057_init(zr) < 0) {
1645                         for (i = 0; i < zoran_num; i++)
1646                                 zoran_release(&zoran[i]);
1647                         return -EIO;
1648                 }
1649                 zoran_proc_init(zr);
1650         }
1651
1652         return 0;
1653 }
1654
1655 static void __exit
1656 unload_dc10_cards (void)
1657 {
1658         int i;
1659
1660         for (i = 0; i < zoran_num; i++)
1661                 zoran_release(&zoran[i]);
1662 }
1663
1664 module_init(init_dc10_cards);
1665 module_exit(unload_dc10_cards);