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