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
61extern const struct zoran_format zoran_formats[];
62
63static int card[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
64module_param_array(card, int, NULL, 0444);
65MODULE_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
75static unsigned long vidmem;	/* default = 0 - Video memory base address */
76module_param(vidmem, ulong, 0444);
77MODULE_PARM_DESC(vidmem, "Default video memory base address");
78
79/*
80   Default input and video norm at startup of the driver.
81*/
82
83static unsigned int default_input;	/* default 0 = Composite, 1 = S-Video */
84module_param(default_input, uint, 0444);
85MODULE_PARM_DESC(default_input,
86		 "Default input (0=Composite, 1=S-Video, 2=Internal)");
87
88static int default_mux = 1;	/* 6 Eyes input selection */
89module_param(default_mux, int, 0644);
90MODULE_PARM_DESC(default_mux,
91		 "Default 6 Eyes mux setting (Input selection)");
92
93static int default_norm;	/* default 0 = PAL, 1 = NTSC 2 = SECAM */
94module_param(default_norm, int, 0444);
95MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
96
97/* /dev/videoN, -1 for autodetect */
98static int video_nr[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
99module_param_array(video_nr, int, NULL, 0444);
100MODULE_PARM_DESC(video_nr, "Video device number (-1=Auto)");
101
102int v4l_nbufs = 4;
103int v4l_bufsize = 864;		/* Everybody should be able to work with this setting */
104module_param(v4l_nbufs, int, 0644);
105MODULE_PARM_DESC(v4l_nbufs, "Maximum number of V4L buffers to use");
106module_param(v4l_bufsize, int, 0644);
107MODULE_PARM_DESC(v4l_bufsize, "Maximum size per V4L buffer (in kB)");
108
109int jpg_nbufs = 32;
110int jpg_bufsize = 512;		/* max size for 100% quality full-PAL frame */
111module_param(jpg_nbufs, int, 0644);
112MODULE_PARM_DESC(jpg_nbufs, "Maximum number of JPG buffers to use");
113module_param(jpg_bufsize, int, 0644);
114MODULE_PARM_DESC(jpg_bufsize, "Maximum size per JPG buffer (in kB)");
115
116int 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) */
118module_param(pass_through, int, 0644);
119MODULE_PARM_DESC(pass_through,
120		 "Pass TV signal through to TV-out when idling");
121
122int zr36067_debug = 1;
123module_param_named(debug, zr36067_debug, int, 0644);
124MODULE_PARM_DESC(debug, "Debug level (0-5)");
125
126#define ZORAN_VERSION "0.10.1"
127
128MODULE_DESCRIPTION("Zoran-36057/36067 JPEG codec driver");
129MODULE_AUTHOR("Serguei Miridonov");
130MODULE_LICENSE("GPL");
131MODULE_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
137static 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};
145MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
146
147static unsigned int zoran_num;		/* number of cards found */
148
149/* videocodec bus functions ZR36060 */
150static u32
151zr36060_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
167static void
168zr36060_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 */
184static u32
185zr36050_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
200static void
201zr36050_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 */
216static u32
217zr36016_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 */
232void
233zr36016_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
250static void
251dc10_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
262static void
263dc10plus_init (struct zoran *zr)
264{
265	dprintk(3, KERN_DEBUG "%s: %s\n", ZR_DEVNAME(zr), __func__);
266}
267
268static void
269buz_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
279static void
280lml33_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
287static void
288avs6eyes_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
311static char *
312codecid_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
335static struct tvnorm f50sqpixel = { 944, 768, 83, 880, 625, 576, 16 };
336static struct tvnorm f60sqpixel = { 780, 640, 51, 716, 525, 480, 12 };
337static struct tvnorm f50ccir601 = { 864, 720, 75, 804, 625, 576, 18 };
338static struct tvnorm f60ccir601 = { 858, 720, 57, 788, 525, 480, 16 };
339
340static struct tvnorm f50ccir601_lml33 = { 864, 720, 75+34, 804, 625, 576, 18 };
341static 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 */
344static struct tvnorm f50sqpixel_dc10 = { 944, 768, 0, 880, 625, 576, 0 };
345static 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>) */
350static struct tvnorm f50ccir601_lm33r10 = { 864, 720, 74+54, 804, 625, 576, 18 };
351static 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  */
358static struct tvnorm f50ccir601_avs6eyes = { 864, 720, 74, 804, 625, 576, 18 };
359static struct tvnorm f60ccir601_avs6eyes = { 858, 720, 56, 788, 525, 480, 16 };
360
361static const unsigned short vpx3220_addrs[] = { 0x43, 0x47, I2C_CLIENT_END };
362static const unsigned short saa7110_addrs[] = { 0x4e, 0x4f, I2C_CLIENT_END };
363static const unsigned short saa7111_addrs[] = { 0x25, 0x24, I2C_CLIENT_END };
364static const unsigned short saa7114_addrs[] = { 0x21, 0x20, I2C_CLIENT_END };
365static const unsigned short adv717x_addrs[] = { 0x6a, 0x6b, 0x2a, 0x2b, I2C_CLIENT_END };
366static const unsigned short ks0127_addrs[] = { 0x6c, 0x6d, I2C_CLIENT_END };
367static const unsigned short saa7185_addrs[] = { 0x44, I2C_CLIENT_END };
368static const unsigned short bt819_addrs[] = { 0x45, I2C_CLIENT_END };
369static const unsigned short bt856_addrs[] = { 0x44, I2C_CLIENT_END };
370static const unsigned short bt866_addrs[] = { 0x44, I2C_CLIENT_END };
371
372static 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 */
657static int
658zoran_i2c_getsda (void *data)
659{
660	struct zoran *zr = (struct zoran *) data;
661
662	return (btread(ZR36057_I2CBR) >> 1) & 1;
663}
664
665static int
666zoran_i2c_getscl (void *data)
667{
668	struct zoran *zr = (struct zoran *) data;
669
670	return btread(ZR36057_I2CBR) & 1;
671}
672
673static void
674zoran_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
686static void
687zoran_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
699static 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
708static int
709zoran_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
722static void
723zoran_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
730int
731zoran_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
890void
891zoran_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
951static void __devinit
952test_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
977static int __devinit
978zr36057_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	err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
1059	if (err < 0)
1060		goto exit_free;
1061	video_set_drvdata(zr->video_dev, zr);
1062
1063	zoran_init_hardware(zr);
1064	if (zr36067_debug > 2)
1065		detect_guest_activity(zr);
1066	test_interrupts(zr);
1067	if (!pass_through) {
1068		decoder_call(zr, video, s_stream, 0);
1069		encoder_call(zr, video, s_routing, 2, 0, 0);
1070	}
1071
1072	zr->zoran_proc = NULL;
1073	zr->initialized = 1;
1074	return 0;
1075
1076exit_free:
1077	kfree(zr->stat_com);
1078	kfree(zr->video_dev);
1079	return err;
1080}
1081
1082static void __devexit zoran_remove(struct pci_dev *pdev)
1083{
1084	struct v4l2_device *v4l2_dev = dev_get_drvdata(&pdev->dev);
1085	struct zoran *zr = to_zoran(v4l2_dev);
1086
1087	if (!zr->initialized)
1088		goto exit_free;
1089
1090	/* unregister videocodec bus */
1091	if (zr->codec) {
1092		struct videocodec_master *master = zr->codec->master_data;
1093
1094		videocodec_detach(zr->codec);
1095		kfree(master);
1096	}
1097	if (zr->vfe) {
1098		struct videocodec_master *master = zr->vfe->master_data;
1099
1100		videocodec_detach(zr->vfe);
1101		kfree(master);
1102	}
1103
1104	/* unregister i2c bus */
1105	zoran_unregister_i2c(zr);
1106	/* disable PCI bus-mastering */
1107	zoran_set_pci_master(zr, 0);
1108	/* put chip into reset */
1109	btwrite(0, ZR36057_SPGPPCR);
1110	free_irq(zr->pci_dev->irq, zr);
1111	/* unmap and free memory */
1112	kfree(zr->stat_com);
1113	zoran_proc_cleanup(zr);
1114	iounmap(zr->zr36057_mem);
1115	pci_disable_device(zr->pci_dev);
1116	video_unregister_device(zr->video_dev);
1117exit_free:
1118	v4l2_device_unregister(&zr->v4l2_dev);
1119	kfree(zr);
1120}
1121
1122void
1123zoran_vdev_release (struct video_device *vdev)
1124{
1125	kfree(vdev);
1126}
1127
1128static struct videocodec_master * __devinit
1129zoran_setup_videocodec (struct zoran *zr,
1130			int           type)
1131{
1132	struct videocodec_master *m = NULL;
1133
1134	m = kmalloc(sizeof(struct videocodec_master), GFP_KERNEL);
1135	if (!m) {
1136		dprintk(1, KERN_ERR "%s: %s - no memory\n",
1137			ZR_DEVNAME(zr), __func__);
1138		return m;
1139	}
1140
1141	/* magic and type are unused for master struct. Makes sense only at
1142	   codec structs.
1143	   In the past, .type were initialized to the old V4L1 .hardware
1144	   value, as VID_HARDWARE_ZR36067
1145	 */
1146	m->magic = 0L;
1147	m->type = 0;
1148
1149	m->flags = CODEC_FLAG_ENCODER | CODEC_FLAG_DECODER;
1150	strlcpy(m->name, ZR_DEVNAME(zr), sizeof(m->name));
1151	m->data = zr;
1152
1153	switch (type)
1154	{
1155	case CODEC_TYPE_ZR36060:
1156		m->readreg = zr36060_read;
1157		m->writereg = zr36060_write;
1158		m->flags |= CODEC_FLAG_JPEG | CODEC_FLAG_VFE;
1159		break;
1160	case CODEC_TYPE_ZR36050:
1161		m->readreg = zr36050_read;
1162		m->writereg = zr36050_write;
1163		m->flags |= CODEC_FLAG_JPEG;
1164		break;
1165	case CODEC_TYPE_ZR36016:
1166		m->readreg = zr36016_read;
1167		m->writereg = zr36016_write;
1168		m->flags |= CODEC_FLAG_VFE;
1169		break;
1170	}
1171
1172	return m;
1173}
1174
1175static void zoran_subdev_notify(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
1176{
1177	struct zoran *zr = to_zoran(sd->v4l2_dev);
1178
1179	/* Bt819 needs to reset its FIFO buffer using #FRST pin and
1180	   LML33 card uses GPIO(7) for that. */
1181	if (cmd == BT819_FIFO_RESET_LOW)
1182		GPIO(zr, 7, 0);
1183	else if (cmd == BT819_FIFO_RESET_HIGH)
1184		GPIO(zr, 7, 1);
1185}
1186
1187/*
1188 *   Scan for a Buz card (actually for the PCI controller ZR36057),
1189 *   request the irq and map the io memory
1190 */
1191static int __devinit zoran_probe(struct pci_dev *pdev,
1192				 const struct pci_device_id *ent)
1193{
1194	unsigned char latency, need_latency;
1195	struct zoran *zr;
1196	int result;
1197	struct videocodec_master *master_vfe = NULL;
1198	struct videocodec_master *master_codec = NULL;
1199	int card_num;
1200	char *codec_name, *vfe_name;
1201	unsigned int nr;
1202
1203
1204	nr = zoran_num++;
1205	if (nr >= BUZ_MAX) {
1206		dprintk(1, KERN_ERR "%s: driver limited to %d card(s) maximum\n",
1207			ZORAN_NAME, BUZ_MAX);
1208		return -ENOENT;
1209	}
1210
1211	zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
1212	if (!zr) {
1213		dprintk(1, KERN_ERR "%s: %s - kzalloc failed\n",
1214			ZORAN_NAME, __func__);
1215		return -ENOMEM;
1216	}
1217	zr->v4l2_dev.notify = zoran_subdev_notify;
1218	if (v4l2_device_register(&pdev->dev, &zr->v4l2_dev))
1219		goto zr_free_mem;
1220	zr->pci_dev = pdev;
1221	zr->id = nr;
1222	snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
1223	spin_lock_init(&zr->spinlock);
1224	mutex_init(&zr->resource_lock);
1225	mutex_init(&zr->other_lock);
1226	if (pci_enable_device(pdev))
1227		goto zr_unreg;
1228	zr->revision = zr->pci_dev->revision;
1229
1230	dprintk(1,
1231		KERN_INFO
1232		"%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
1233		ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
1234		zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
1235	if (zr->revision >= 2) {
1236		dprintk(1,
1237			KERN_INFO
1238			"%s: Subsystem vendor=0x%04x id=0x%04x\n",
1239			ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
1240			zr->pci_dev->subsystem_device);
1241	}
1242
1243	/* Use auto-detected card type? */
1244	if (card[nr] == -1) {
1245		if (zr->revision < 2) {
1246			dprintk(1,
1247				KERN_ERR
1248				"%s: No card type specified, please use the card=X module parameter\n",
1249				ZR_DEVNAME(zr));
1250			dprintk(1,
1251				KERN_ERR
1252				"%s: It is not possible to auto-detect ZR36057 based cards\n",
1253				ZR_DEVNAME(zr));
1254			goto zr_unreg;
1255		}
1256
1257		card_num = ent->driver_data;
1258		if (card_num >= NUM_CARDS) {
1259			dprintk(1,
1260				KERN_ERR
1261				"%s: Unknown card, try specifying card=X module parameter\n",
1262				ZR_DEVNAME(zr));
1263			goto zr_unreg;
1264		}
1265		dprintk(3,
1266			KERN_DEBUG
1267			"%s: %s() - card %s detected\n",
1268			ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
1269	} else {
1270		card_num = card[nr];
1271		if (card_num >= NUM_CARDS || card_num < 0) {
1272			dprintk(1,
1273				KERN_ERR
1274				"%s: User specified card type %d out of range (0 .. %d)\n",
1275				ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
1276			goto zr_unreg;
1277		}
1278	}
1279
1280	/* even though we make this a non pointer and thus
1281	 * theoretically allow for making changes to this struct
1282	 * on a per-individual card basis at runtime, this is
1283	 * strongly discouraged. This structure is intended to
1284	 * keep general card information, no settings or anything */
1285	zr->card = zoran_cards[card_num];
1286	snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
1287		 "%s[%u]", zr->card.name, zr->id);
1288
1289	zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
1290	if (!zr->zr36057_mem) {
1291		dprintk(1, KERN_ERR "%s: %s() - ioremap failed\n",
1292			ZR_DEVNAME(zr), __func__);
1293		goto zr_unreg;
1294	}
1295
1296	result = request_irq(zr->pci_dev->irq, zoran_irq,
1297			     IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
1298	if (result < 0) {
1299		if (result == -EINVAL) {
1300			dprintk(1,
1301				KERN_ERR
1302				"%s: %s - bad irq number or handler\n",
1303				ZR_DEVNAME(zr), __func__);
1304		} else if (result == -EBUSY) {
1305			dprintk(1,
1306				KERN_ERR
1307				"%s: %s - IRQ %d busy, change your PnP config in BIOS\n",
1308				ZR_DEVNAME(zr), __func__, zr->pci_dev->irq);
1309		} else {
1310			dprintk(1,
1311				KERN_ERR
1312				"%s: %s - can't assign irq, error code %d\n",
1313				ZR_DEVNAME(zr), __func__, result);
1314		}
1315		goto zr_unmap;
1316	}
1317
1318	/* set PCI latency timer */
1319	pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1320			     &latency);
1321	need_latency = zr->revision > 1 ? 32 : 48;
1322	if (latency != need_latency) {
1323		dprintk(2, KERN_INFO "%s: Changing PCI latency from %d to %d\n",
1324			ZR_DEVNAME(zr), latency, need_latency);
1325		pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
1326				      need_latency);
1327	}
1328
1329	zr36057_restart(zr);
1330	/* i2c */
1331	dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
1332		ZR_DEVNAME(zr));
1333
1334	if (zoran_register_i2c(zr) < 0) {
1335		dprintk(1, KERN_ERR "%s: %s - can't initialize i2c bus\n",
1336			ZR_DEVNAME(zr), __func__);
1337		goto zr_free_irq;
1338	}
1339
1340	zr->decoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
1341		&zr->i2c_adapter, zr->card.i2c_decoder,
1342		0, zr->card.addrs_decoder);
1343
1344	if (zr->card.i2c_encoder)
1345		zr->encoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
1346			&zr->i2c_adapter, zr->card.i2c_encoder,
1347			0, zr->card.addrs_encoder);
1348
1349	dprintk(2,
1350		KERN_INFO "%s: Initializing videocodec bus...\n",
1351		ZR_DEVNAME(zr));
1352
1353	if (zr->card.video_codec) {
1354		codec_name = codecid_to_modulename(zr->card.video_codec);
1355		if (codec_name) {
1356			result = request_module(codec_name);
1357			if (result) {
1358				dprintk(1,
1359					KERN_ERR
1360					"%s: failed to load modules %s: %d\n",
1361					ZR_DEVNAME(zr), codec_name, result);
1362			}
1363		}
1364	}
1365	if (zr->card.video_vfe) {
1366		vfe_name = codecid_to_modulename(zr->card.video_vfe);
1367		if (vfe_name) {
1368			result = request_module(vfe_name);
1369			if (result < 0) {
1370				dprintk(1,
1371					KERN_ERR
1372					"%s: failed to load modules %s: %d\n",
1373					ZR_DEVNAME(zr), vfe_name, result);
1374			}
1375		}
1376	}
1377
1378	/* reset JPEG codec */
1379	jpeg_codec_sleep(zr, 1);
1380	jpeg_codec_reset(zr);
1381	/* video bus enabled */
1382	/* display codec revision */
1383	if (zr->card.video_codec != 0) {
1384		master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
1385		if (!master_codec)
1386			goto zr_unreg_i2c;
1387		zr->codec = videocodec_attach(master_codec);
1388		if (!zr->codec) {
1389			dprintk(1, KERN_ERR "%s: %s - no codec found\n",
1390				ZR_DEVNAME(zr), __func__);
1391			goto zr_free_codec;
1392		}
1393		if (zr->codec->type != zr->card.video_codec) {
1394			dprintk(1, KERN_ERR "%s: %s - wrong codec\n",
1395				ZR_DEVNAME(zr), __func__);
1396			goto zr_detach_codec;
1397		}
1398	}
1399	if (zr->card.video_vfe != 0) {
1400		master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
1401		if (!master_vfe)
1402			goto zr_detach_codec;
1403		zr->vfe = videocodec_attach(master_vfe);
1404		if (!zr->vfe) {
1405			dprintk(1, KERN_ERR "%s: %s - no VFE found\n",
1406				ZR_DEVNAME(zr), __func__);
1407			goto zr_free_vfe;
1408		}
1409		if (zr->vfe->type != zr->card.video_vfe) {
1410			dprintk(1, KERN_ERR "%s: %s = wrong VFE\n",
1411				ZR_DEVNAME(zr), __func__);
1412			goto zr_detach_vfe;
1413		}
1414	}
1415
1416	/* take care of Natoma chipset and a revision 1 zr36057 */
1417	if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
1418		zr->jpg_buffers.need_contiguous = 1;
1419		dprintk(1, KERN_INFO
1420			"%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
1421			ZR_DEVNAME(zr));
1422	}
1423
1424	if (zr36057_init(zr) < 0)
1425		goto zr_detach_vfe;
1426
1427	zoran_proc_init(zr);
1428
1429	return 0;
1430
1431zr_detach_vfe:
1432	videocodec_detach(zr->vfe);
1433zr_free_vfe:
1434	kfree(master_vfe);
1435zr_detach_codec:
1436	videocodec_detach(zr->codec);
1437zr_free_codec:
1438	kfree(master_codec);
1439zr_unreg_i2c:
1440	zoran_unregister_i2c(zr);
1441zr_free_irq:
1442	btwrite(0, ZR36057_SPGPPCR);
1443	free_irq(zr->pci_dev->irq, zr);
1444zr_unmap:
1445	iounmap(zr->zr36057_mem);
1446zr_unreg:
1447	v4l2_device_unregister(&zr->v4l2_dev);
1448zr_free_mem:
1449	kfree(zr);
1450
1451	return -ENODEV;
1452}
1453
1454static struct pci_driver zoran_driver = {
1455	.name = "zr36067",
1456	.id_table = zr36067_pci_tbl,
1457	.probe = zoran_probe,
1458	.remove = __devexit_p(zoran_remove),
1459};
1460
1461static int __init zoran_init(void)
1462{
1463	int res;
1464
1465	printk(KERN_INFO "Zoran MJPEG board driver version %s\n",
1466	       ZORAN_VERSION);
1467
1468	/* check the parameters we have been given, adjust if necessary */
1469	if (v4l_nbufs < 2)
1470		v4l_nbufs = 2;
1471	if (v4l_nbufs > VIDEO_MAX_FRAME)
1472		v4l_nbufs = VIDEO_MAX_FRAME;
1473	/* The user specfies the in KB, we want them in byte
1474	 * (and page aligned) */
1475	v4l_bufsize = PAGE_ALIGN(v4l_bufsize * 1024);
1476	if (v4l_bufsize < 32768)
1477		v4l_bufsize = 32768;
1478	/* 2 MB is arbitrary but sufficient for the maximum possible images */
1479	if (v4l_bufsize > 2048 * 1024)
1480		v4l_bufsize = 2048 * 1024;
1481	if (jpg_nbufs < 4)
1482		jpg_nbufs = 4;
1483	if (jpg_nbufs > BUZ_MAX_FRAME)
1484		jpg_nbufs = BUZ_MAX_FRAME;
1485	jpg_bufsize = PAGE_ALIGN(jpg_bufsize * 1024);
1486	if (jpg_bufsize < 8192)
1487		jpg_bufsize = 8192;
1488	if (jpg_bufsize > (512 * 1024))
1489		jpg_bufsize = 512 * 1024;
1490	/* Use parameter for vidmem or try to find a video card */
1491	if (vidmem) {
1492		dprintk(1,
1493			KERN_INFO
1494			"%s: Using supplied video memory base address @ 0x%lx\n",
1495			ZORAN_NAME, vidmem);
1496	}
1497
1498	/* some mainboards might not do PCI-PCI data transfer well */
1499	if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL|PCIPCI_ALIMAGIK)) {
1500		dprintk(1,
1501			KERN_WARNING
1502			"%s: chipset does not support reliable PCI-PCI DMA\n",
1503			ZORAN_NAME);
1504	}
1505
1506	res = pci_register_driver(&zoran_driver);
1507	if (res) {
1508		dprintk(1,
1509			KERN_ERR
1510			"%s: Unable to register ZR36057 driver\n",
1511			ZORAN_NAME);
1512		return res;
1513	}
1514
1515	return 0;
1516}
1517
1518static void __exit zoran_exit(void)
1519{
1520	pci_unregister_driver(&zoran_driver);
1521}
1522
1523module_init(zoran_init);
1524module_exit(zoran_exit);
1525